ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCA1NzU2MDNmLi45NDU1MjkwIDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMiwyNSArMTIsNTggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiLAorICAgIGphdmFfbGliczogWyJ1cGRhdGFibGUtbWVkaWEiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgZmlyc3Q6IHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwcm9jZXNzIHJ1bnMgb25seSB3aXRoIHRoZSBwcmltYXJ5IEFCSS4KKyAgICAgICAgICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwbHVnaW5zCisgICAgICAgICAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmZsYWNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXBlZzJleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgYm90aDogeworICAgICAgICAgICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgLy8gTWVkaWFQbGF5ZXIyCisgICAgICAgICAgICAgICAgImxpYm1lZGlhMl9qbmkiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuY2VydGlmaWNhdGUiLAorfQorCiBhcGV4IHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKK30KKworYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiLAogICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWwotICAgICAgICAvLyBFeHRyYWN0b3IgcGx1Z2lucwotICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCi0gICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1pZGlleHRyYWN0b3IiLAotICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAotICAgICAgICAibGlibXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCi0gICAgICAgIC8vIE1lZGlhUGxheWVyMgotICAgICAgICAibGlibWVkaWEyX2puaSIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICBdLAotICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogIm1hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKIH0KIAogYXBleF9rZXkgewpAQCAtMzgsMyArNzEsMTkgQEAKICAgICBwdWJsaWNfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEuYXZicHVia2V5IiwKICAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnBlbSIsCiB9CisKK2FwZXhfa2V5IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5rZXkiLAorICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSIsCisgICAgcHJpdmF0ZV9rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuY2VydGlmaWNhdGUiLAorICAgIGNlcnRpZmljYXRlOiAiY29tLmFuZHJvaWQubWVkaWEiLAorfQorCithbmRyb2lkX2FwcF9jZXJ0aWZpY2F0ZSB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuY2VydGlmaWNhdGUiLAorICAgIGNlcnRpZmljYXRlOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCit9CmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjc0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpAQCAtMCwwICsxLDUxIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlKS2dJQkFBS0NBZ0VBdkI2bE9FRU9SNThLTWNGbGF5RVpqc1h1UGdjZkhpL09QeGN2ZnBpR0xDcE9jSzNsCitPUENoV1V2RFJjSUhNQjdCTytDc2Z4czBIZ3NIdnZaZk55b05JbTk5V2NqRmJib2lPN1dyQkJBcklzelByMTRYCitjZlkyTnh6VDlMQmorRXFBbmJkTCs0T1FXMS9ucExITkUwcXREY3hMNzFpcGJqU3VLTmI1OEU5cUdMMEt3dmtTCitmd3d1ZVdqKytiZy9pejdkcTBtejdpS3BueFlzY05tNFJoSmpxY0cyVXNtZzRFamhyOGg1VW1PVW1USmJPYkMvCit2ekNsWFFxZWV1elM4TlR0R1ZnUS9DSTlnQzJXTjl1cHEycC8yVDdQNFUzbzNDV3ZCeXRVb0xLUjBVeUM4M2V5CitTOFhKZ09hNDJ1V1IzVC9lSk9JMVpTNEg2U3JnMW8yWEM4WWI4RXByRkkvTk02LysvNURYL0ZnRGltc3NsQVA2CitRcTQrcFN0ZTl2L0ZqV0dxeTdRQlFhZWZGUkdSdVM2M3hIY1NaaFhDOUoyQ0ZkbnhvOCs2NVFUOHI0eWZRRWVpCitBeC8wUTk0eUI3VklMMXBJSnhIRW9uS2p0ZDNpS2RGRUtRekFESjNlZHNtdEh5YkVSZEpLQ3hjbTlRSXJEQ3NDCis0WVZUOW5YME9vQzlSRDVkNUVWRDdXNUk2ZUVuUnU2aWdyS0lLZ1VWcHBlWUZRTlpEK28rZWlOSmE0eW9nZ1JsCitoOHNUMC94TEtqTVJ4QVE3ZmFmaTFqK0xCMk83VWdKbUlEREFuaWRxOEFvejdoM3BOaTEzOXJOV3JqTmZ3aHVzCituTWNadkw5ZFRWdjI2SldlRVNIUC96QWZBWDdqMXJma0R3UjAyb2NSTHF1d0VVczErVUhBMjdXaTFiTUNBd0VBCitBUUtDQWdBTzNQVDgzdGI3L2FyV2g0czF6YVd4VEI0b3RITlc5VHY4YkI2S2lBNkJ5czNyeFRHSk1DbnZYamNOCitlZWtMZWtLV01vZ3VlcjNCYWVtd3d0Si9EMGwrWVFTc1pWcUQ4dUxsaU5MOFBUTExTeGRWcWI5OGQ1R05CVEFSCis4eVhTNWtBSE5nWkExd0krMWZMOVpqYm53VXl1L0djN2YrdlRFMEozWTVUWDBjNTJLZW1Cd2lBZC9aNW1aVTlQCis5Nmk5bmJmeDRwN2V2OHBiRVd0dGR5WkNFdzNneWJkWUR5b3d6bEZXakNaWnhoaGxpajcrN2VJWWZ3Vnh0bmNUCitDMGNYVkJ0dmx5K3dYQnd6MW1ZNS81Y0dQaUhmemtDcWNuZGxmV3k0eWttamNMaG9xdnpsczUxWXMwWGFjMkJECittMFBORVZEQjVVV0d1djVSQTl4RDEyZ0p2QnRVM0Q3Z2dNdzZDNVJjWEpUK2pTWW1TRnREMmtsV2krSXQ4QS9OCitIdjQyc29Lc2t0NkpxWUFXRTFjdkozUEVxSDlBU0VKTnEyUjBaL1BtdU0wMDBVSnl6VTlLSWQzU053alhBMVhjCitLbjloUmdhNHVmOWVsSFRqa1REdDc5LzgrWHY3aGplcjlzRi9TL25wN2cwNHJVaklXa3VGa0MvN05LMnRRU2gxCittbGpWMXNEOVNGNERQZlZLNzVMd0pKYVFVbEk3VHRHZDVLSjdGelp3dmIrdzhPRHJwVzNoa3Q2RmNJNkt3RS9hCitRVDFUMlo5RGtuWEpTWU5kV0dyajZ2TUhzWU1peXo4SWRBSFNDck9CNmVYQ1F4cGl0Ym42VzcxUmF3N2Y5VWFaCitWREs1QWhUVTQ5M2hrR2oxbm80Y0p3ZWNYSW5NaWdnL2M0eXdrMkliaDZJVjhPMG5rUUtDQVFFQTIrZFFRMElGCit2dlZnbVEyV3hIQkQ3TTJtYk95ZjQzWUJZNkthNm9QQk5HUFZwWkU4WDhMb1RhdlFMVitTZ0NrSDhUNmdZN1hTCis1TDRaZTBKRnhmdWEwbzFybTYrTDJYck94NUYvQTJZNDBZY1BjbEVpazVoMXdvU3dIL0oxaUhHaUVoWThOcWV1Cis5R0N2alFvamtnWHgvUm4zTnorbHB2WjMyOU8zSDg1UldXR0YwbDYwUndMT2tpZzBad1ViNjE5dDhhZmZtR0lsCitzeGREdjJuZnk3T3RKWDhpR0R1YTdLZjY0ZHZWV1FLS3RBQ1drQVJybGtjV1gzdW9FU3hrcFNEeHVlK3o3bmRICitvN3VITGZNOFR4K1JuK1F2WVd1Ulc1VFBMYkVETWJJWXJYNjVJU3Qyci9UN3YvMDRYZEFDOFlwQ1FSeXRscVBJCitmcERtMTVodHlIQml6UUtDQVFFQTJ2KzVvdFJvWTU2SmR1SVNhVkdsc0ovSWJ2S3pEQUl5V21NMTRFcFJDUjVFCitsdStNcFRjUkFpRlFBYkhHWHIxdE1sVEZkVkZEMDkwV0F6SUthS3RBREZWTFhvYklIZUdzcG5SQ3E1T3BWcDlXCitSdkx0VndMeGZsSEFjMnlOOS9MTnRuQnFIVWd0K1MwMUxCUEVseWJkR0hRUlR0cUFLWGhrcDMxc00yMU8zNEdvCitQcmkvSXhndXBXeHlrTWFXNDRLaWcxQ3I1REt2Yzhjd1VzR3V5RGRKbThvQlFlTlBUTVdxU25YdHFvVFdTYVlnCisya3hpTVRGb2tya1NYZ3VmYjh3bmc2T1h0L1FlbHl3cmhHM2hBc2xkUE8zR2RLaWREU3hoV1pTZ3BVWFhGZEFYCit5NEdPMEljUkpCRi9XSnRZVFl0UitsODRuUUEyLzFZZTR1akZsVDBhZndLQ0FRRUFtWHJYcFNtMmN2STJDbnpXCitocUpJZGtXT2E2VzNibjFWT09JcnQ1UmZ5NTRHWm5sNHB1bVZVMmlnY3BxcTJISkt6ZERGQnZMSGo4a3laYm42CitrdFVwMk56Rmh6SzlxL3V2eU5BKzB2T01vb2plZWc0dzBNenZHK1dhTzZIdzhGdEhIOUtQRWlKMDFMR0t0U2luCitiT3BqWENDOFQ3NUhjc0hCSkJlZlR6Nmp2bnQzZUQyTEc2alUzbVBiTnkvMHJaRzhYWmFxVTJQbEpoc051TkkvCitWYUJCTDlPTXkxY0dxVGdRdllTK1lsS0kxbHMydXF1ckg0YmNFYVp2eGhTeTVpR1pOUW9kRGtvSUlUbm9mbVN1Cis2aGFCZ0JRMkVZdVBOMWtrUktLd05RWTFmUm5lUWsxZ21DeW5iUGRpV08rdXJrQ3VQMTJ4dGxyM3U0YU01MXJHCisvTWViM1FLQ0FRRUExMlN4Wm05WGhMT0hMSUJKNzRBNFlMR201MGlaeFhQYnBuN3huSG83bmFaQmU5cDhFSHRLCitwVGV5Z3hnZ3JVbk9QclNWeVQ5MllNaVFQL0JWd0lDK2ErTHdVRFpzV01kL2tlL0RLeEgrZVk0Wnc0cG0yUyt4Cis2YlhxZlJ3RnZocjNMVHIvZzNGY2xqbGFsTkdVaDczWHM1ZGs5cE45Zmt4RlkxNitydzRSaDA3MDlVdXI0bzZFCitRbnVaYXIrSDVKaTEwa1hqNm52WGlSNGVieWJFQzNRbFY2Nms4ZkxxS2U0NEFTaGY2MWpma214czM0aEZBM0UvCitFeUFuNm91djhydHZHZEFyQnVoNXRlSGhvMHlYQkxDY25iS1hnR0hlcGZoQ2YyTHBaZVI5R1owajZpcXhGblBoCis3Z0d2cUt5UmV5Tk9LOXkveDl0UVBHNnR6aXQzT2NOeGJRS0NBUUVBdURoZURPU2tYUG9wWE12TEFLT0hCSWRaCityYlE3b0ZUREh0NTlnYnVjTTdVOC9sMll0YXh1S09RRkJMbnpRYS9hbUlra3J0a2xZd09zejhFMjRkN05tMzl3Cit5a0xId1gwWHJtakFtNk00WEttRHY2NmEra1NuU1Y2TEViS1pkanZYUDAyRFYrdEdlWjVWc25OdkpEcXV4TXNECitmdlJUc3BCOGo4Q3BVOTZzemVreGwvdENSaHFiZHcvNGtWVFNqNUJGKytPYVJSY0pyQXlqMUIycWYxeW5BWkUxCitnVXZWUGtFWWE5MTR6Y3J4ZzlYSVhUNE03eXFCN2k4S0plZ090T3RjV2pKN3VUaVArNjM4QXZ5Z0pMTUpuU3JWCisrSGpGWldHNlA5YnRabUxIU0VCUnZ3R09BaWxwMHFlalhvODY2bDBmbW5sR3k3ZWhLejh1M1B6dm5sUFlqUT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNDIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjliNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMueDUwOS5wZW0KQEAgLTAsMCArMSwzNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGM2pDQ0E4YWdBd0lCQWdJSkFJTTcySnBENHY2WE1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFaU1DQUdBMVVFCitBd3daWTI5dExtRnVaSEp2YVdRdWJXVmthV0V1YzNkamIyUmxZekFnRncweE9UQXlNVEV3TWpFeE1URmFHQTgwCitOelUzTURFd056QXlNVEV4TVZvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5CitibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCV2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3CitEZ1lEVlFRTERBZEJibVJ5YjJsa01TSXdJQVlEVlFRRERCbGpiMjB1WVc1a2NtOXBaQzV0WldScFlTNXpkMk52CitaR1ZqTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFzcVhFMEFJV3BMVzlUZ3EyCituUUdwaDdLWjZMMlE5b3h2aXFDVkh4SWFQcWZoTTJTd1RieWNBRElRZXFycmxSeGhkZFZrakx1TVVrSmE3bWV2CitmRVJtZ3BpT2ZuUElsR0s2UFRzMmdsakNrc2taaEYzYmdmZXl1SHQwdHNZTytVYU44TVZvWkQ3L1FkaUU0NncyCitPTURDbEcxVXFnaXFPQmhMVEVOL2NIWE9iblVpaVZYVVlxTjhhWVpmNkw2RnMzeVFpMlpaZ2ZieFRWRmV3cWR2CithTExPcUNZblZZWFpIK1p4YlhFU0EwTStXWEtnUktzWVRqMkdZczNla28xckZpNFk2dUhWTHg0NXlhb1Q1dS9pCitTeFBFa29jeU1DS3ZHSld1NFhsU09kM0VqU09NYXFDT1lWeUdMeGRsblFXUVU3UFpEcUJTSjBTeXNXZ3BGSHBCCitJMTVjMmpoUmRYT0NmUTladERmUFprRTBhMkE4a0pEQW9GMW16VHA2SXZCQVdVc2w1bkhQdzVDV2tGcE5hZC9oCit0cXFHQ1NjV2JpS1p1dnJRNC9SUU5tM2YxSytteFg5VHJqRmlncHFOTzZkNHBHQW8xZmE2c0hSM3hXUHcvbXlxCitoNVpKalZuWFU1WXE2NFM0eFdPc3NmanBPZzdSZk51dnp1azNvazNNWXMxbWJ4M3ZoWk9qNWttMWYzcXJnWDljCittWGpZbnlYRDBqSkJtNHVBSldYTGRLOVBsWnZsWGJ6dE1DellqODMySW80cEZMQ3RTeGt6WDc1dDFlbTM2TnYwCittTnA2TnRTU3k2U0ZTcThsN0lzWFYyRk55VWl5SFd4Uy9VUW04cFlnNVE1ZFdIdkVFRjc4UDZsVjB3UmE2RlFsCitCQlNncHFUQUkwOTJLSWpERHRCN0dRQ2dWNUVDQXdFQUFhTlRNRkV3SFFZRFZSME9CQllFRkFGSWRGVERFRGZ0Citld1NTQVM3RmEzT1o1VFh6TUI4R0ExVWRJd1FZTUJhQUZBRklkRlRERURmdGV3U1NBUzdGYTNPWjVUWHpNQThHCitBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFDNWUzelh5dGhKQ0dtejFGbUFWCis4WS9VSStHbGc2RzB4L2swNFdhUkcwRFBMTGpsSjFGMExNMS9JUmVCU2dYY1lBTDBDQWdQeWNmL3JHUE9nTUZtCit0UXhZeWpCVXhLZGpwSXFVNURKb1YxZmVhbkd2ZUlScHRvMVlSS05nSHV6RzlyWkdSNEFnUG50Nlg0WXhscTA0CitsSTdRcFdhZFhlMW15QVJKaGozbmlTTlk5KzJ3RUlua3g0WnVDTzFMdElHcW5iZGM4alE4WW9WcUlFNU40a3VNCitjY3lQWWdzZEFCdG9wYmpOOTJydWV1OHNmRjhSNlJPeSt0TmdiNk9qcEFBZXZ0bkJmWjJMWHFmT2JLaXJIQ0srCitrNnc0V1NCMVVVb1ozWGd6OHNKdFhnb2t2WWVJbmtOOHRIdVRhZ0hZVTJWUVRjQTByZEJHTU4vMU9sakpwV2xOCiswVVVxNGZBWVU2Y040bEh4cjJMTTlJZjRXdkF6ZExBV3ZhSVpyRHFhVTRpL3pZVDlsNnJSNGxDMktXM0VIV292CituUFhmZ0VKSjhBUDFpUkdpYnZldzNpM1NCNlhUV0ZRWVRVSUJlSmZEei9LRFhRYWJQK3l6WFdJU2RaQ1VNVXB4CitmK1JhcXNiNU1vS2FKZFZnblNMMG1CdW5qQ3lKRHp6ZzM0SjdvR3g2L0Jud29pT3J3TE40UWF6NVU4amJyUFN4CitwOUxmbGVDY083WmRlRThHS3F4MFgxVDRkN3RyYWR0bXhPUzhJd3I0bmlza2tIR1Jrem96dlZ2dXlHS21vTjJrCisxNjJWZmpxK2RkajdxRXBTaDNCUzZoSFUrdmxNYkM5TDB0ckd4UHhGRUFIRHJ3dTBLd0dOZHVUa2l1LzNqdmZCCitKVGdIOFA5bUQxbG9ZeFJkbyt2ZXQ4ZVEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEueDUwOS5wZW0gYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCkBAIC0wLDAgKzEsMzMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRnpEQ0NBN1NnQXdJQkFnSUpBTzA1REJCdXNhYUxNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ib3hDekFKQmdOVgorQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCVworYVdWM01SQXdEZ1lEVlFRS0RBZEJibVJ5YjJsa01SQXdEZ1lEVlFRTERBZEJibVJ5YjJsa01Sb3dHQVlEVlFRRAorREJGamIyMHVZVzVrY205cFpDNXRaV1JwWVRBZ0Z3MHhPVEF4TWpVeE56RTNNVGRhR0E4ME56VTJNVEl5TVRFMworTVRjeE4xb3dlakVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGakFVQmdOVgorQkFjTURVMXZkVzUwWVdsdUlGWnBaWGN4RURBT0JnTlZCQW9NQjBGdVpISnZhV1F4RURBT0JnTlZCQXNNQjBGdQorWkhKdmFXUXhHakFZQmdOVkJBTU1FV052YlM1aGJtUnliMmxrTG0xbFpHbGhNSUlDSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBbU5rVnhVYnAvYkxiZUdidktxWVh6d0J5Y1NEcG1PaGgvLy9sTkdZUQorL0FNVUQwcTZFYVp6VTJiZDRhTDByT0dxZm9ZbGhLZDBrTVZtTVVtZmRFOU9EQWZLeGxlRWVFYVJsMkdKUzhhOQorQUJpNzcwbDNHSGJCMnhNSTJzRVdlT0Q5eHNQRkY2K0J5UFptb1V1TmhNcjRwVWJYc0RwRTNoOGxqcmdYSHRJZworYmg3b2ZidmRkcnV3QlYwbFMxazlPWjlqUFZHaEVLa0puaGdRYTY3Y3dnZGppekFNYkkwRGN6OWd0TU1hd3NEagorWjJhUWQxcit2eGdoMS9Ya0kvTk1tWENuRzJFUnl0WGNKZUM1UzRnRXRIZlRUUG9QMEZ1VmdTQjZ5NmRhbE11WgorRjBOQlp3OE12Z2R5M1FKaXAwdU5hMzZKNjNDTVpLVEpXYlRkbEZwUEwyaGswUGdhWXZqZThDNVh0azUyODJ3VAorZE1vY2M4bjJ6SVhiemJuU1hHdmpjTlppYjNQZnU1NVlVblg2ZVRxWjFCeGxKMEZIWkFzQzRxdUZGV1h4WUJZRAorTENSb05ORkV0SURRcHV2dUhGMkR1SE5EVUxwQVFqeTJ5Nis3ZW90MEtFc1ZvRG1aNEg4QnB1QVZWdTJTeFlOYgorZ1lmbFI5U21NMHRtWWVBY1JUNDhxM3hyb2NHeUVITXF2Z1FSVXBQZnZjdC84bDh4VmNEek9JL3NKVkRxbVl6TQordTBDajNma1N5cEdESk9NRi9lc0ZTbVZ2b0kwMXRTN2thTlM1dnZ0S1lpYi8veHFLUkM5ZjBkQ3NHZkZMbnVVSworbzRLWWJZV1l3TXlKcUVkLzUvWnZYeUtJUEFFZUpMMTc0TDkrd1RrYzNjUXBvQndKTjR0KzJFNU1uaE9FcTZkbworNUwwQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIak5LL0daa28xUmRacCs4aWF2V1hMNXh6OXdNQjhHQTFVZAorSXdRWU1CYUFGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVMQlFBRGdnSUJBQ21QUU1rc3VMck5WMXZiSTQ0UzFmNzBJMEZIZEJ4Y2hGR0IzOXp1TGJjbgorU3NZb20vTFB0WUppRDBEbDRiQjRlYitabnhrUVAyWGVQNnB5Y21VSDJqMUVXZXhGd3ZkVXZsZmU4UXord0FlYworYXA0QXhpWDRaMktlMml2WW90SVpGVUhkWk9Ma1gyMGpzOFdleDFtelk0M01MUW41QVBsOWdLMVZaVHhEZ2dlUgorRU9iSDFTK0pWakd3UXFZWmoyZTZnTlpIMzRRMjVOUTY5OFJMODVHRGtZdFNJU0FpZkp0YUpzVS9CM3ZLbTgySQorazl4TWlDb29DSDZiUmRHSEcxanplNFNScGlkanhFbThjeGtpYVFhZ2ZjdVhlQ0x6aVhKcjNxQU1LWWlFWTZicAorMCtiQXFDdDNTOE9yck4zUlFaZlFybmx3aXRzTTFqSkovK0MrV29EZzRlWTVBRnJYREx2TmVLaDFxTy9mOHh2KworZkNYa1FQY1ZWcGhMZlJIOW94TnJTZ09XQlA1L3FJREg0czFZVUw5bHVHVDZIKzA4ZGx1ZTNSa2J6RGJCcXNRdQorN2ZRL0JicklHL0d1VktneUVNK2E3Qzlndjd6Yzg2WWx1ZVZZSkV5eEtpZG5uN1J4T3F5REJxeXlmWEEzenZtZQorUnJvN3hJck1IUEw3TnUzQVdqd2pYemJwL3cweit0RUZQc2ZWQitPT0hLc1dQY1VHMEhVVEpHa3llTy91SFJqTgorcVBFa2tmN0JISFVPNFYyZ2pPSWRDc0VMeEt3SGY3dnNaVE9rNDBFVjc1MWZaN0ZESE1yMWVkZFFrZ0g0ZXFBYgorREI3OXVQK1NMZlVvKzQybjRxNmVNbW9xdzhkNzZiQlhSb1VoSW8vTXM0c2ViaFYwc1J0QVM2N09RaW9jOVVVZworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmNlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDEKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwIGIvYXBleC90ZXN0aW5nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxY2VkNwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBtYW5pZmVzdDogInRlc3RfbWFuaWZlc3QuanNvbiIsCisgICAgZmlsZV9jb250ZXh0czogImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworYXBleCB7CisgICAgbmFtZTogInRlc3RfY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIl0sCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQpkaWZmIC0tZ2l0IGEvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3QuanNvbiBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgInZlcnNpb24iOiAyCit9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU2NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMgorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCAyNGIzOTE4Li4yMTU4OGQ0IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtNDMsNiArNDMsNyBAQAogICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIiwKICAgICAgICAgImNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAiLAorICAgICAgICAiY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAiLAogICAgICAgICAiY2FtZXJhMi9TdWJtaXRJbmZvLmNwcCIsCiAgICAgICAgICJDYW1lcmFCYXNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFVdGlscy5jcHAiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZTE0M2UwNS4uOTJmZTg0YiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MDksNiArNDA4LDc5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdGFnc1JlbW92ZWQpIHsKKyAgICB1aW50MzJfdCB0YWdDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3NUb1JlbW92ZTsKKworICAgIGlmICh0YWdzUmVtb3ZlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdlRhZ3MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgaWYgKChudWxscHRyID09IHZUYWdzLmdldCgpKSB8fCAoMCA+PSB2VGFncy0+Z2V0VGFnQ291bnQoKSkpIHsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBjYWNoZSA9CisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZS5nZXQoKSkgeworICAgICAgICAgICAgY2FjaGUtPmdldFZlbmRvclRhZ0Rlc2NyaXB0b3IodmVuZG9ySWQsICZ2VGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG51bGxwdHIgIT0gdlRhZ3MuZ2V0KCkpICYmICh2VGFncy0+Z2V0VGFnQ291bnQoKSA+IDApKSB7CisgICAgICAgIHRhZ0NvdW50ID0gdlRhZ3MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHVpbnQzMl90ICp2ZW5kb3JUYWdzID0gbmV3IHVpbnQzMl90W3RhZ0NvdW50XTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gdmVuZG9yVGFncykgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICB2VGFncy0+Z2V0VGFnQXJyYXkodmVuZG9yVGFncyk7CisKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnQ291bnQpOworICAgICAgICB0YWdzVG9SZW1vdmUuaW5zZXJ0KHRhZ3NUb1JlbW92ZS5iZWdpbigpLCB2ZW5kb3JUYWdzLCB2ZW5kb3JUYWdzICsgdGFnQ291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSB2ZW5kb3JUYWdzOworICAgICAgICB0YWdDb3VudCA9IDA7CisgICAgfQorCisgICAgYXV0byB0YWdzTmVlZGluZ1Blcm1pc3Npb24gPSBnZXRfY2FtZXJhX21ldGFkYXRhX3Blcm1pc3Npb25fbmVlZGVkKCZ0YWdDb3VudCk7CisgICAgaWYgKHRhZ0NvdW50ID4gMCkgeworICAgICAgICB0YWdzVG9SZW1vdmUucmVzZXJ2ZSh0YWdzVG9SZW1vdmUuY2FwYWNpdHkoKSArIHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuZW5kKCksIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICB0YWdzTmVlZGluZ1Blcm1pc3Npb24gKyB0YWdDb3VudCk7CisgICAgfQorCisgICAgdGFnc1JlbW92ZWQtPnJlc2VydmUodGFnc1RvUmVtb3ZlLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICBpZiAoZXhpc3RzKGl0KSkgeworICAgICAgICAgICAgYXV0byByYyA9IGVyYXNlKGl0KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGVyYXNlIHRhZzogJXgiLCBfX2Z1bmNfXywgaXQpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5wdXNoX2JhY2soaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBhdmFpbGFibGUgY2hhcmFjdGVyc3RpY3MgYWNjb3JkaW5nbHkKKyAgICBpZiAoZXhpc3RzKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjdXJyZW50S2V5czsKKworICAgICAgICBzdGQ6OnNvcnQodGFnc1JlbW92ZWQtPmJlZ2luKCksIHRhZ3NSZW1vdmVkLT5lbmQoKSk7CisgICAgICAgIGF1dG8ga2V5cyA9IGZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIGN1cnJlbnRLZXlzLnJlc2VydmUoa2V5cy5jb3VudCk7CisgICAgICAgIGN1cnJlbnRLZXlzLmluc2VydChjdXJyZW50S2V5cy5lbmQoKSwga2V5cy5kYXRhLmkzMiwga2V5cy5kYXRhLmkzMiArIGtleXMuY291bnQpOworICAgICAgICBzdGQ6OnNvcnQoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld0tleXMoa2V5cy5jb3VudCk7CisgICAgICAgIGF1dG8gZW5kID0gc3RkOjpzZXRfZGlmZmVyZW5jZShjdXJyZW50S2V5cy5iZWdpbigpLCBjdXJyZW50S2V5cy5lbmQoKSwgdGFnc1JlbW92ZWQtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgdGFnc1JlbW92ZWQtPmVuZCgpLCBuZXdLZXlzLmJlZ2luKCkpOworICAgICAgICBuZXdLZXlzLnJlc2l6ZShlbmQgLSBuZXdLZXlzLmJlZ2luKCkpOworCisgICAgICAgIHVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBuZXdLZXlzLmRhdGEoKSwgbmV3S2V5cy5zaXplKCkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogdm9pZCBDYW1lcmFNZXRhZGF0YTo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKG1CdWZmZXIsIGZkLCB2ZXJib3NpdHksIGluZGVudGF0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCBhODZjYzg3Li5kNzEzZDJkIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC0zMTUsNiArMzE1LDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFNlY3Rpb25JbmRleCh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworfQorCiB2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKIAogICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CkBAIC00MDcsNiArNDExLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpIHsKKyAgICByZXR1cm4gbVZlbmRvck1hcDsKK30KKwogaW50IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VGFnQ291bnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgaWQpIGNvbnN0IHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBhdXRvIGRlc2MgPSBtVmVuZG9yTWFwLmZpbmQoaWQpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCmluZGV4IDljMGYyOGIuLjBlOTY5YzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApAQCAtMTYwLDYgKzE2MiwyOCBAQAogICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7Ci0gICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOworICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBzZXQgb2YgbmV3IGZvcmVncm91bmQgdXNlciBJRHMuCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgorICAgICAqCisgICAgICogbmV3U3RhdGUgaXMgYSBiaXRmaWVsZCBjb25zaXN0aW5nIG9mIERFVklDRV9TVEFURV8qIHZhbHVlcyBjb21iaW5lZCB0b2dldGhlci4gVmFsaWQgc3RhdGUKKyAgICAgKiBjb21iaW5hdGlvbnMgYXJlIGRldmljZS1zcGVjaWZpYy4gQXQgZGV2aWNlIHN0YXJ0dXAsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGV2aWNlCisgICAgICogc3RhdGUgaXMgTk9STUFMIHVudGlsIG90aGVyd2lzZSBub3RpZmllZC4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShsb25nIG5ld1N0YXRlKTsKKworICAgIC8vIEJpdGZpZWxkIGNvbnN0YW50cyBmb3Igbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UKKyAgICAvLyBBbGwgYml0cyA+PSAzMiBhcmUgZm9yIGN1c3RvbSB2ZW5kb3Igc3RhdGVzCisgICAgLy8gV3JpdHRlbiBhcyBpbnRzIHNpbmNlIEFJREwgZG9lcyBub3Qgc3VwcG9ydCBsb25nIGNvbnN0YW50cy4KKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX05PUk1BTCA9IDA7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQgPSAxOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCA9IDI7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9GT0xERUQgPSA0OworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfTEFTVF9GUkFNRVdPUktfQklUID0gMHg4MDAwMDAwMDsgLy8gMSA8PCAzMTsKKwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCA0Y2VkMDhjLi40OWRmZGU4IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFNZXRhZGF0YU5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TZXNzaW9uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIudXRpbHMuU3VibWl0SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIApAQCAtODMsNiArODQsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKKyAgICAvKioKKyAgICAgICogQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhcyBjYW1lcmEgZGV2aWNlCisgICAgICAqIHN1cHBvcnQuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzZXNzaW9uQ29uZmlndXJhdGlvbiBTcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gdG8gYmUgdmVyaWZpZWQuCisgICAgICAqIEByZXR1cm4gdHJ1ZSAgLSBpbiBjYXNlIHRoZSBzdHJlYW0gY29tYmluYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAgKiAgICAgICAgIGZhbHNlIC0gaW4gY2FzZSB0aGVyZSBpcyBubyBkZXZpY2Ugc3VwcG9ydC4KKyAgICAgICovCisgICAgYm9vbGVhbiBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGluIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXM7CisKKy8qKiBAaGlkZSAqLworcGFyY2VsYWJsZSBTZXNzaW9uQ29uZmlndXJhdGlvbiBjcHBfaGVhZGVyICJjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggZmViMDRjMi4uNGU5YjI3ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTE2NywxNCArMTY3LDI0IEBACiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwgaW50IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxJZCwKICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCwgYm9vbCBpc1NoYXJlZCkgewogICAgIG1HYnBzLnB1c2hfYmFjayhnYnApOwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzdXJmYWNlU2V0SUQ7CiAgICAgbUlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZDsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsSWQ7CiB9CiAKK091dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgZ2JwcywKKyAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKKyAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAorICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsgfQorCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXNzaW9uQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludCBvcGVyYXRpbmdNb2RlID0gMDsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm9wZXJhdGluZ01vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG9wZXJhdGluZyBtb2RlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRXaWR0aCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRXaWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgd2lkdGggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEhlaWdodCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRIZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGhlaWdodCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0Rm9ybWF0ID0gLTE7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRGb3JtYXQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGZvcm1hdCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0U3RyZWFtczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm91dHB1dFN0cmVhbXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG91dHB1dCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbU9wZXJhdGluZ01vZGUgPSBvcGVyYXRpbmdNb2RlOworICAgIG1JbnB1dFdpZHRoID0gaW5wdXRXaWR0aDsKKyAgICBtSW5wdXRIZWlnaHQgPSBpbnB1dEhlaWdodDsKKyAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IG91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1PcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dFdpZHRoKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEhlaWdodCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRGb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtT3V0cHV0U3RyZWFtcyk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0VxdWFsKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5zaXplKCkgPCBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zW2ldIDwgb3RoZXJPdXRwdXRTdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjA2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjk1YzRmMzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY1LDggKzY1LDE1IEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCk7CiAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLmQ5NmY0MDMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyNSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5tayBiL2NhbWVyYS9uZGsvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZGRmMS4uMDAwMDAwMAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNYW5hZ2VyLmNwcCAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYU1ldGFkYXRhLmNwcCAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhRGV2aWNlLmNwcCAgICAgICAgICAgIFwKLSAgICBOZGtDYXB0dXJlUmVxdWVzdC5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYURldmljZS5jcHAgICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYTJuZGsKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLUQgRVhQT1JUPSdfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpJwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoTE9DQUxfUEFUSCkvbGliY2FtZXJhMm5kay5tYXAudHh0Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJndWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJtZWRpYW5kawotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGZkOTUyOTYuLmFiNzk2ZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEVYUE9SVApAQCAtNzgsMTEgKzgwLDM3IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKworICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAorICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CiAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTEwNyw2ICsxMzUsMjggQEAKIH0KIAogRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjk4NjA4ZGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC05Niw3ICsxMDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzExNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjEsOCArMTI5LDIyIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgcGh5c2ljYWxJZCAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgcGh5c2ljYWxJZCwgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UsIHBoeXNpY2FsSWQpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEzNCw3ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBhZGQgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpAQCAtMTQ3LDcgKzE2OSw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoKHdpbmRvdyA9PSBudWxscHRyKSB8fCAob3V0ID09IG51bGxwdHIpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTU5LDcgKzE4MSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChvdXQtPm1XaW5kb3cgPT0gd2luZG93KSB7CisgICAgaWYgKGFyZVdpbmRvd1R5cGVzRXF1YWwob3V0LT5tV2luZG93LCB3aW5kb3cpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0aGUgc2FtZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA2MGI0NzYzLi44NzQyZDljIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyLDkgKzIyLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+Ci0jaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZWxzZQorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphY2FtOwogCiBFWFBPUlQKIEFDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKSB7CkBAIC0xMDcsNyArMTEzLDE0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZ3IsIGNhbWVyYUlkLCBjaGFycyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gbWdyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsIGNoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHNwQ2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmc3BDaGFycyk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNwQ2hhcnMtPmluY1N0cm9uZygodm9pZCopIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisgICAgKmNoYXJzID0gc3BDaGFycy5nZXQoKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KIAogRVhQT1JUCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDY1ZGU4MWYuLjlhMzllZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC01NywxMyArNTcsMzIgQEAKICAgICAgICAgQUxPR0UoIiVzOiBzcmMgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgQUNhbWVyYU1ldGFkYXRhKiBjb3B5ID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqc3JjKTsKKyAgICBjb3B5LT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfY29weSk7CisgICAgcmV0dXJuIGNvcHk7CiB9CiAKIEVYUE9SVAogdm9pZCBBQ2FtZXJhTWV0YWRhdGFfZnJlZShBQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBkZWxldGUgbWV0YWRhdGE7CisgICAgICAgIG1ldGFkYXRhLT5kZWNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfZnJlZSk7CiAgICAgfQogfQorCitFWFBPUlQKK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG51bVBoeXNpY2FsQ2FtZXJhcyA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBudW1QaHlzaWNhbENhbWVyYXMgJXAsIHBoeXNpY2FsQ2FtZXJhSWRzICVwIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1QaHlzaWNhbENhbWVyYXMsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RhdGljTWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IHN0YXRpY01ldGFkYXRhIGlzIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YS0+aXNMb2dpY2FsTXVsdGlDYW1lcmEobnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IGFjMTg1NmIuLmM2NGRlM2UgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGlucHV0IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxdWVzdC0+c2V0dGluZ3M7CisgICAgcmVxdWVzdC0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxdWVzdC0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGY2MGU1ZmQuLmQ2ZjE0MTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6fkFDYW1lcmFDYXB0dXJlU2Vzc2lvbigpIHsKICAgICBBTE9HVigifkFDYW1lcmFDYXB0dXJlU2Vzc2lvbjogJXAgbm90aWZ5IGRldmljZSBlbmQgb2YgbGlmZSIsIHRoaXMpOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiAhPSBudWxscHRyICYmICFkZXYtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgICAgICB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIG1DbG9zZWRCeUFwcCA9IHRydWU7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgIH0KQEAgLTczLDcgKzczLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnN0b3BSZXBlYXRpbmcoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTkxLDcgKzkxLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmFib3J0Q2FwdHVyZXMoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTEwNyw0OSArMTA3LDggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1jYW1lcmFfc3RhdHVzX3QKLUFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldDsKLSAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICAgICAgcmV0ID0gZGV2LT5jYXB0dXJlTG9ja2VkKHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CkBAIC0xNjgsNyArMTI3LDcgQEAKIEFDYW1lcmFEZXZpY2UqCiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTgyLDkgKzE0MSw5IEBACiAgICAgbUlzQ2xvc2VkID0gdHJ1ZTsKIH0KIAotc3A8Q2FtZXJhRGV2aWNlPgorc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2VTcCgpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IGRldmljZS0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HVygiRGV2aWNlIGlzIGNsb3NlZCBidXQgc2Vzc2lvbiAlZCBpcyBub3Qgbm90aWZpZWQiLCBtSWQpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBhMjA2OGU3Li4wOGE5MjI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0xNywxNSArMTcsMjIgQEAKICNkZWZpbmUgX0FDQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKIAogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCIKKyNlbHNlCiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7Ci0gICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKSA6Ci0gICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCkge307CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDExICs0NywxMyBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjksNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtODIsMTMgKzkxLDE1IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgYWJvcnRDYXB0dXJlcygpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlKAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIApAQCAtOTcsMTggKzEwOCwxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJmOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMiCisjZWxzZQorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaW5jIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT5zZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgICAgICB0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICB9CisgICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGZmYWJmN2IuLmQ4YTU3NjUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKICNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCiAvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7CkBAIC0zOSw2ICs0MCw3IEBACiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOwpAQCAtNTAsMTEgKzUyLDExIEBACiBDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKICAgICAgICAgY29uc3QgY2hhciogaWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgogICAgICAgICBtQ2FtZXJhSWQoaWQpLAogICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCi0gICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbUNoYXJzKGNoYXJzKSwKICAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKQEAgLTE5MCwxMDYgKzE5Miw2IEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgewotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKLSAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7Ci0gICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKLSAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgewotICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOwotICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOwotICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKLSAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOwotICAgIH0KLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOwotICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOwotCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKLSAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgewotICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKLSAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgaWYgKG1JZGxlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwotICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7Ci0gICAgfQotICAgIG1JZGxlID0gZmFsc2U7Ci0gICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLSAgICByZXR1cm4gQUNBTUVSQV9PSzsKLX0KLQogY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKQEAgLTMyNSw4ICsyMjcsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTQzNiw3ICszMzksNyBAQAogICAgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXEtPnNldHRpbmdzOworICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxLT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXE7CiB9CkBAIC02NDAsOCArNTQzLDkgQEAKICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CisgICAgICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sCisgICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sIHBoeXNpY2FsSWQxNiwKICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELCBvdXRDb25maWcubUlzU2hhcmVkKSkpOwogICAgIH0KICAgICBhdXRvIGFkZFNldCA9IG91dHB1dFNldDsKQEAgLTgyOSw3ICs3MzMsNyBAQAogICAgIGlmIChlcnJvckNvZGUgPT0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIpIHsKICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICAgICAgICAgIGNiaC5tT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgYXV0byBvdXRwdXRQYWlySXQgPSBtQ29uZmlndXJlZE91dHB1dHMuZmluZChzdHJlYW1JZCk7CiAgICAgICAgIGlmIChvdXRwdXRQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBzdHJlYW0gaWQgJWQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKQEAgLTg0Niw3ICs3NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg1OCw3ICs3NjIsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKICAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOwogICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CiAgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCkBAIC04NjgsNyArNzcyLDcgQEAKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCk7CiAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg5MCw2ICs3OTQsNyBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CkBAIC05NjAsNiArODY1LDcgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgpAQCAtOTc3LDYgKzg4Myw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKQEAgLTEwNDgsNiArOTU1LDY0IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKQEAgLTExNTgsMTIgKzExMjMsMzQgQEAKIH0KIAogQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCi0gICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAotICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCi0gICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwgbUNhbGxiYWNrcyhmaWxsQ2IoY2JzKSkge30KKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CiAKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKApAQCAtMTE4MCw5ICsxMTY3LDkgQEAKICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgIC8vIHNlbmQgc2VxIGFib3J0ZWQgY2FsbGJhY2sKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFBYm9ydCwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOwogICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMzAsOSArMTIxNyw5IEBACiAgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKICAgICAgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKIApAQCAtMTM4OSw3ICsxMzc2LDcgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTEzOTgsNyArMTM4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwpAQCAtMTQxMyw3ICsxNDAwLDYgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7Ci0gICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTQ0OSw5ICsxNDM1LDYgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPwotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNDYxLDEzICsxNDQ0LDI3IEBACiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhwaHlzaWNhbFJlc3VsdEluZm9zLCBmcmFtZU51bWJlcikpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlUmVzdWx0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KIApAQCAtMTUxMyw1ICsxNTEwLDUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0KK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDEzNjkxNDguLmQwZjM2M2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDEsMTQgKzQyLDI1IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTEwOCwxOSArMTIwLDIyIEBACiAgICAgY2FtZXJhX3N0YXR1c190IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKIAogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKICAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOwpAQCAtMTU2LDcgKzE3MSw3IEBACiAgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKICAgICBjb25zdCBTdHJpbmc4IG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAogICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCiAgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOwogICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOwogCkBAIC0xOTEsNiArMjA2LDcgQEAKICAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKICAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZApAQCAtMjA2LDYgKzIyMiw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKQEAgLTI0NCwxOSArMjYxLDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOwogCi0gICAgICAgIHN0YXRpYyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBmaWxsQ2IoCi0gICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmNiczsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geyBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyIH07CiAgICAgICAgIH0KLQogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CiAgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiBtUmVxdWVzdHM7CiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYWxsYmFja3M7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgfTsKICAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCiAgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CkBAIC0yODYsNiArMzMwLDcgQEAKIAogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMjk0LDggKzMzOSw4IEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKICAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6Ci0gICAgICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIGNoYXJzLCB0aGlzKSkge30KIAogICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CiAKQEAgLTMzMSw3ICszNzYsNyBAQAogICAgIH0KIAogICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYURldmljZT4gbURldmljZTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM1MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKKyAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOworICAgIH0KKworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOworICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKKyAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgfQorCisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gZmFsc2U7CisgICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYzU5ZDBlNy4uN2Q2ZWNhYyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNiw5ICsyNiwxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYW1lcmFJZEtleSAgID0gIkNhbWVyYUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYWxsYmFja0ZwS2V5ID0gIkNhbGxiYWNrRnAiOwpAQCAtMzQ1LDYgKzM0Niw3IEBACiAgICAgfQogfQogCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8qKgpAQCAtNDAyLDcgKzQwNCw3IEBACiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFN0ciwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwpAQCAtNDM3LDE4ICs0MzksMTYgQEAKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgewotICAgIEFDYW1lcmFNZXRhZGF0YSogcmF3Q2hhcnM7Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZjaGFycyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSAlcy4gZXJyICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCByZXQpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMocmF3Q2hhcnMpOwotICAgIHJhd0NoYXJzID0gbnVsbHB0cjsKIAotICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKGNoYXJzKSk7CisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBjaGFycyk7CiAKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgaWYgKGNzID09IG51bGxwdHIpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggY2M0MmY3Ny4uNTViZmE3ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLyoqCiAgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCkBAIC0xNzIsNiArMTczLDcgQEAKICAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOwogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMTgwLDEzICsxODIsMTMgQEAKICAqLwogc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKICAgICBBQ2FtZXJhTWFuYWdlcigpIDoKLSAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQogICAgIH5BQ2FtZXJhTWFuYWdlcigpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOwogCiAgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBBQ2FtZXJhTWV0YWRhdGEgKipjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CiAgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOwpAQCAtMTk2LDcgKzE5OCw3IEBACiAgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKICAgICB9OwogICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CiB9OwogCiAjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZmMwMGEyZC4uMzU5ZWFlZCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTMyLDYgKzMyLDE0IEBACiAgICAgaWYgKG1UeXBlID09IEFDTV9DSEFSQUNURVJJU1RJQ1MpIHsKICAgICAgICAgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOwogICAgICAgICBmaWx0ZXJTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgfQogICAgIC8vIFRPRE86IGZpbHRlciByZXF1ZXN0L3Jlc3VsdCBrZXlzCiB9CkBAIC00Niw2ICs1NCw3IEBACiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6CiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkE6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgpAQCAtNzUsMTEgKzg0LDEyOCBAQAogICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOwogICAgICAgICBpZiAoaXNOZGtTdXBwb3J0ZWRDYXBhYmlsaXR5KGNhcGFiaWxpdHkpKSB7CiAgICAgICAgICAgICBjYXBhYmlsaXRpZXMucHVzaChjYXBhYmlsaXR5KTsKKworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKKyAgICAgICAgICAgICAgICBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIG1EYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTsKIH0KIAordm9pZAorQUNhbWVyYU1ldGFkYXRhOjpkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgYXV0byByZXQgPSBnZXRDb25zdEVudHJ5KEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTLCAmZW50cnkpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IEdldCBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyBrZXkgZmFpbGVkLiByZXQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QqIGlkcyA9IGVudHJ5LmRhdGEudTg7CisgICAgc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKGlkc1tpXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgIT0gaSkgeworICAgICAgICAgICAgICAgIG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkVmFsdWVzLnB1c2hfYmFjayhTdHJpbmc4KChjb25zdCBjaGFyICopaWRzK3N0YXJ0KSk7CisgICAgICAgICAgICAgICAgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhtU3RhdGljUGh5c2ljYWxDYW1lcmFJZFZhbHVlcy5iYWNrKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSBpKzE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBMb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2Ugb25seSBoYXMgJXp1IHBoeXNpY2FsIGNhbWVyYXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSk7CisgICAgfQorfQorCit2b2lkCitBQ2FtZXJhTWV0YWRhdGE6OmZpbHRlckR1cmF0aW9ucyh1aW50MzJfdCB0YWcpIHsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0RVUkFUSU9OX09GRlNFVCA9IDM7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0gbURhdGEuZmluZCh0YWcpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAwIHx8IGVudHJ5LmNvdW50ICUgNCB8fCBlbnRyeS50eXBlICE9IFRZUEVfSU5UNjQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtYWxmb3JtZWQgZHVyYXRpb24ga2V5ICVkISBjb3VudCAlenUsIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGFnLCBlbnRyeS5jb3VudCwgZW50cnkudHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmVjdG9yPGludDY0X3Q+IGZpbHRlcmVkRHVyYXRpb25zOworICAgIGZpbHRlcmVkRHVyYXRpb25zLnNldENhcGFjaXR5KGVudHJ5LmNvdW50ICogMik7CisKKyAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDY0X3QgZm9ybWF0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50NjRfdCB3aWR0aCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOworCisgICAgICAgIC8vIExlYXZlIHRoZSB1bmZpbHRlcmVkIGZvcm1hdCBpbiBzbyBhcHBzIGRlcGVuZGluZyBvbiBwcmV2aW91cyB3cm9uZworICAgICAgICAvLyBmaWx0ZXIgYmVoYXZpb3IgY29udGludWUgdG8gd29yaworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisKKyAgICAgICAgLy8gVHJhbnNsYXRlIEhBTCBmb3JtYXRzIHRvIE5ESyBmb3JtYXQKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9KUEVHOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWTE2KSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEgxNjsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtvd24gdGFnIDB4JXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRGF0YS51cGRhdGUodGFnLCBmaWx0ZXJlZER1cmF0aW9ucyk7Cit9CiAKIHZvaWQKIEFDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKSB7CkBAIC0xNDUsNiArMjcxLDU3IEBACiAgICAgICAgIGZpbHRlcmVkRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKICAgICB9CiAgICAgbURhdGEudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3MpOworCisgICAgZW50cnkgPSBtRGF0YS5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIFZlY3RvcjxpbnQzMl90PiBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzOworICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoZW50cnkuY291bnQpOworCisgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBpZiAoaXNJbnB1dCA9PSBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUKSB7CisgICAgICAgICAgICAvLyBIaWRlIGlucHV0IHN0cmVhbXMKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRyYW5zbGF0ZSBIQUwgZm9ybWF0cyB0byBOREsgZm9ybWF0CisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0hFSUM7CisgICAgICAgIH0KKworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOworICAgIH0KKyAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncyk7CisKKyAgICBlbnRyeSA9IG1EYXRhLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIFZlY3RvcjxpbnQzMl90PiBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3M7CisgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBpZiAoaXNJbnB1dCA9PSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgLy8gSGlkZSBpbnB1dCBzdHJlYW1zCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOworICAgIH0KKyAgICBtRGF0YS51cGRhdGUoQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MpOwogfQogCiBib29sCkBAIC0yMzksNiArNDE2LDI3IEBACiAgICAgcmV0dXJuIG1EYXRhOwogfQogCitib29sCitBQ2FtZXJhTWV0YWRhdGE6OmlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3QgeworICAgIGlmIChtVHlwZSAhPSBBQ01fQ0hBUkFDVEVSSVNUSUNTKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGJlIGNhbGxlZCBmb3IgYSBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dCBjb3VudDogJXAsIHBoeXNpY2FsQ2FtZXJhSWRzOiAlcCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjb3VudCwgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPj0gMikgeworICAgICAgICAqY291bnQgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpOworICAgICAgICAqcGh5c2ljYWxDYW1lcmFJZHMgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuZGF0YSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIFRPRE86IHNvbWUgb2Yga2V5IGJlbG93IHNob3VsZCBiZSBoaWRkZW4gZnJvbSB1c2VyCiAvLyBleDogQUNBTUVSQV9SRVFVRVNUX0lEIGFuZCBBQ0FNRVJBX1JFUFJPQ0VTU19FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SCiAvKkBPfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpAQCAtMzYwLDcgKzU1OCwxMCBAQAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9ISVNUT0dSQU1fQ09VTlQsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX1NIQVJQTkVTU19NQVBfVkFMVUUsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fU0hBUlBORVNTX01BUF9TSVpFLAorICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTiwKICAgICBBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTLAorICAgIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCwKKyAgICBBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQsCiB9KTsKIAogLyp+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDBmZDdlZmEuLjNkODk1Y2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTE3LDEyICsxNywxOSBAQAogI2RlZmluZSBfQUNBTUVSQV9NRVRBREFUQV9ICiAKICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+Cit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKKyNlbHNlCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oPgogCkBAIC01OCwxMyArNjUsMTggQEAKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0VGFncygvKm91dCovaW50MzJfdCogbnVtVGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKSBjb25zdDsKIAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICBib29sIGlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIGNvbnN0OworCisgIHByaXZhdGU6CisKICAgICBib29sIGlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShjb25zdCBpbnQzMl90IGNhcGFiaWxpdHkpOwogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZlbmRvclRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHN0YXRpYyBib29sIGlzQ2FwdHVyZVJlcXVlc3RUYWcoY29uc3QgdWludDMyX3QgdGFnKTsKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKLQotICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICB2b2lkIGZpbHRlckR1cmF0aW9ucyh1aW50MzJfdCB0YWcpOyAvLyB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cworICAgIHZvaWQgZGVyaXZlUGh5c2ljYWxDYW1lcmFJZHMoKTsgLy8gRGVyaXZlIGFycmF5IG9mIHBoeXNpY2FsIGlkcy4KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIElOVEVSTkFMX1QsIHR5cGVuYW1lIE5ES19UPgogICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IE5ES19UKiBkYXRhKSB7CkBAIC05Niw3ICsxMDgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gIHByaXZhdGU6CiAgICAgLy8gZ3VhcmQgYWNjZXNzIG9mIHB1YmxpYyBBUElzOiBnZXQvdXBkYXRlL2dldFRhZ3MKICAgICBtdXRhYmxlIE11dGV4ICAgIG1Mb2NrOwogICAgIENhbWVyYU1ldGFkYXRhICAgbURhdGE7CkBAIC0xMDQsNiArMTE1LDkgQEAKICAgICBjb25zdCBBQ0FNRVJBX01FVEFEQVRBX1RZUEUgbVR5cGU7CiAKICAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzU3lzdGVtVGFnczsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXM7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCmluZGV4IDA2YjJjYzMuLjVjODJhYjcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKQEAgLTIxLDggKzIxLDExIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaCIKKyNlbHNlCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7Ci0gICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBTmF0aXZlV2luZG93KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CiAKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtMzcsOCArNDAsOSBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKKyAgICBBQ2FtZXJhV2luZG93VHlwZSogbVdpbmRvdzsKIH07CisjZW5kaWYKIAogc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXRzIHsKICAgICBzdGQ6OnNldDxBQ2FtZXJhT3V0cHV0VGFyZ2V0PiBtT3V0cHV0czsKQEAgLTU1LDcgKzU5LDcgQEAKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiAgICAgfQogCi0gICAgQUNhbWVyYU1ldGFkYXRhKiAgICAgIHNldHRpbmdzOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gICBzZXR0aW5nczsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0cyogdGFyZ2V0czsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgY29udGV4dDsKIH07CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKaW5kZXggNWUwZGI2MC4uZDEzYTgxOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaApAQCAtMzUsMTAgKzM1LDEwIEBACiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICkBAIC0yNDYsNyArMjQ2LDcgQEAKICAqLwogdHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0KSgKICAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CiAKIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIHsKICAgICAvLy8gb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dC4KQEAgLTY0Myw2ICs2NDMsMTAzIEBACiAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGZpbmFsIGNhcHR1cmUgcmVzdWx0IGNhbGxiYWNrIHdpdGggbG9naWNhbCBtdWx0aS1jYW1lcmEgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGZpbmFsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0LCB3aXRoCisgKiBhZGRlZCBhYmlsaXR5IHRvIHJldHVybiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIHdpdGhpbiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICoKKyAqIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElkIGFuZCByZXN1bHQgbWV0YWRhdGEKKyAqIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMsIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUgcmVxdWVzdCBjb250YWlucyB0YXJnZXRzIGZvci4KKyAqIElmIHRoZSBjYXB0dXJlIHJlcXVlc3QgZG9lc24ndCBjb250YWluIHRhcmdldHMgc3BlY2lmaWMgdG8gYW55IHBoeXNpY2FsIGNhbWVyYSwgb3IgdGhlIGN1cnJlbnQKKyAqIGNhbWVyYSBkZXZpY2UgaXNuJ3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgcGh5c2ljYWxSZXN1bHRDb3VudCB3aWxsIGJlIDAuCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzfS4KKyAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIG9mIGludGVyZXN0LgorICogQHBhcmFtIHJlcXVlc3QgVGhlIGNhcHR1cmUgcmVxdWVzdCBvZiBpbnRlcmVzdC4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHJlc3VsdCBUaGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcmVwb3J0ZWQgYnkgY2FtZXJhIGRldmljZS4gVGhlIG1lbW9yeSBpcyBtYW5hZ2VkIGJ5CisgKiAgICAgICAgICAgICAgICBjYW1lcmEgZnJhbWV3b3JrLiBEbyBub3QgYWNjZXNzIHRoaXMgcG9pbnRlciBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRDb3VudCBUaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEKKyAqIEBwYXJhbSBwaHlzaWNhbENhbWVyYUlkcyBUaGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElEcyBvbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIHJlc3VsdCBtZXRhZGF0YSBhcmUgcmVwb3J0ZWQuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRzIFRoZSBhcnJheSBvZiBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSByZXBvcnRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2VzLgorICovCit0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0KSgKKyAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogcmVzdWx0LAorICAgICAgICBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MsCisgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBhbiBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkIGNhbGxiYWNrIGlzCisgKiB1c2VkLCBpbnN0ZWFkIG9mIG9uQ2FwdHVyZUNvbXBsZXRlZCwgdG8gc3VwcG9ydCBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyB7CisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVQcm9ncmVzc2VkOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiBhbiBpbWFnZSBjYXB0dXJlIGhhcyBmdWxseSBjb21wbGV0ZWQgYW5kIGFsbCB0aGUKKyAgICAgKiByZXN1bHQgbWV0YWRhdGEgaXMgYXZhaWxhYmxlLiBGb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhpcyBjYWxsYmFjaworICAgICAqIGFsc28gcmV0dXJucyB0aGUgcmVzdWx0IG1ldGFkYXRhIGZvciBhbGwgcGh5c2ljYWwgY2FtZXJhcyBiZWluZworICAgICAqIGV4cGxpY2l0bHkgcmVxdWVzdGVkIG9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBjYWxsYmFjayB3aWxsIGFsd2F5cyBmaXJlIGFmdGVyIHRoZSBsYXN0IHtAbGluayBvbkNhcHR1cmVQcm9ncmVzc2VkfTsKKyAgICAgKiBpbiBvdGhlciB3b3Jkcywgbm8gbW9yZSBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBkZWxpdmVyZWQgb25jZSB0aGUgY29tcGxldGVkIHJlc3VsdAorICAgICAqIGlzIGF2YWlsYWJsZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgcGVyZm9ybWFuY2UtaW50ZW5zaXZlIHVzZS1jYXNlcyB3aGVyZSBsYXRlbmN5IGlzIGEgZmFjdG9yLCBjb25zaWRlcgorICAgICAqIHVzaW5nIHtAbGluayBvbkNhcHR1cmVQcm9ncmVzc2VkfSBpbnN0ZWFkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG1hdGNoIHdoYXQgYXBwbGljYXRpb24gaGFzCisgICAgICogc3VibWl0dGVkLCBidXQgdGhlIGNvbnRlbnRzIHRoZSBBQ2FwdHVyZVJlcXVlc3Qgd2lsbCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIHN1Ym1pdHRlZC48L3A+CisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkICAgICAgICBvbkNhcHR1cmVGYWlsZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7Cit9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3M7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZSwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgbG9naWNhbCBtdWx0aS1jYW1lcmEgd2hlcmUgdGhlIGNhcHR1cmUgY2FsbGJhY2tzIHN1cHBvcnRzIHJlc3VsdCBtZXRhZGF0YSBmb3IKKyAqIHBoeXNpY2FsIGNhbWVyYXMuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciBsb2dpY2FsIG11bHRpLWNhbWVyYSB3aGVyZSB0aGUgY2FwdHVyZSBjYWxsYmFja3Mgc3VwcG9ydHMgcmVzdWx0IG1ldGFkYXRhIGZvcgorICogcGh5c2ljYWwgY2FtZXJhcy4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggN2MxM2IzNC4uMjZhZjRmOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC0zNCwxMCArMzQsMTAgQEAKICAqLwogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0RFVklDRV9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0RFVklDRV9ICkBAIC0zNDUsNyArMzQ1LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEZyZWUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0LgpAQCAtNjk0LDcgKzY5NCw3IEBACiAgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBBZGQgYSBuYXRpdmUgd2luZG93IHRvIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCkBAIC03MTIsNyArNzEyLDcgQEAKICAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAotICAgICAgICBBTmF0aXZlV2luZG93ICphbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlICphbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmVtb3ZlIGEgbmF0aXZlIHdpbmRvdyBmcm9tIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCkBAIC03MjgsNyArNzI4LDcgQEAKICAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQ3JlYXRlIGEgbmV3IGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gc2ltaWxhciB0byB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uIFRoaXMKQEAgLTc2NSw2ICs3NjUsMzYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ3JlYXRlIGEgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG9iamVjdCB1c2VkIGZvciBzdHJlYW1pbmcgZnJvbSBhIHBoeXNpY2FsCisgKiBjYW1lcmEgYXMgcGFydCBvZiBhIGxvZ2ljYWwgY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5UaGUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IGlzIHVzZWQgaW4ge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGR9IG1ldGhvZCB0byBhZGQKKyAqIGFuIG91dHB1dCB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyLiBVc2UKKyAqIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZX0gdG8gZnJlZSB0aGUgb2JqZWN0IGFuZCBpdHMgbWVtb3J5IGFmdGVyIGFwcGxpY2F0aW9uIG5vIGxvbmdlcgorICogbmVlZHMgdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9LjwvcD4KKyAqCisgKiBAcGFyYW0gYW53IHRoZSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fQorICogQHBhcmFtIHBoeXNpY2FsSWQgdGhlIElkIG9mIHRoZSBwaHlzaWNhbCBjYW1lcmEgdGhpcyBvdXRwdXQgaXMgYXNzb2NpYXRlZAorICogICAgICAgICAgICAgICAgICB3aXRoLgorICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlCisgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY29udGFpbmVyIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gdGhlIG91dHB1dCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudywgcGh5c2ljYWxJZCBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CisgKgorICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUoCisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKaW5kZXggNjExZTI3MC4uOWJiZmI4MyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaApAQCAtMjMzLDYgKzIzMywyOCBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBjYW1lcmEgaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKgorICogPHA+IENoZWNrIHdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgYmFzZWQgb24gaXRzCisgKiBzdGF0aWMgbWV0YWRhdGEuIElmIGl0IGlzLCBhbHNvIHJldHVybnMgaXRzIHBoeXNpY2FsIHN1YiBjYW1lcmEgSWRzLjwvcD4KKyAqCisgKiBAcGFyYW0gc3RhdGljTWV0YWRhdGEgdGhlIHN0YXRpYyBtZXRhZGF0YSBvZiB0aGUgY2FtZXJhIGJlaW5nIGNoZWNrZWQuCisgKiBAcGFyYW0gbnVtUGh5c2ljYWxDYW1lcmFzIHJldHVybnMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmFzLgorICogQHBhcmFtIHBoeXNpY2FsQ2FtZXJhSWRzIHJldHVybnMgdGhlIGFycmF5IG9mIHBoeXNpY2FsIGNhbWVyYSBJZHMgYmFja2luZyB0aGlzIGxvZ2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdGF0aWNNZXRhZGF0YSBvYmplY3QuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKiBjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NRVRBREFUQV9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAppbmRleCBhOWFmNzdlLi5iMjAwYWJmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKQEAgLTcxLDYgKzcxLDggQEAKICAgICBBQ0FNRVJBX0RFUFRILAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkEsCiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04sCisgICAgQUNBTUVSQV9IRUlDLAorICAgIEFDQU1FUkFfSEVJQ19JTkZPLAogICAgIEFDQU1FUkFfU0VDVElPTl9DT1VOVCwKIAogICAgIEFDQU1FUkFfVkVORE9SID0gMHg4MDAwCkBAIC0xMTIsNiArMTE0LDggQEAKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9IRUlDX1NUQVJUICAgICAgICAgICAgID0gQUNBTUVSQV9IRUlDICAgICAgICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0hFSUNfSU5GT19TVEFSVCAgICAgICAgPSBBQ0FNRVJBX0hFSUNfSU5GTyAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTE5MTIsNiArMTkxNiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX0NPT1JESU5BVEVTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGVbM10KICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCwKQEAgLTE5MjcsNiArMTkzMiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAxLApAQCAtMTk0Miw2ICsxOTQ4LDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIGZvciBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19HUFNfVElNRVNUQU1QID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDY0CiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAyLApAQCAtMTk4Niw2ICsxOTkzLDEwIEBACiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkZvciBFWFRFUk5BTCBjYW1lcmFzIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gd2lsbCBhbHdheXMgYmUgc2V0IHRvIDAgYW5kIHRoZSBmYWNpbmcgd2lsbAogICAgICAqIGFsc28gYmUgc2V0IHRvIEVYVEVSTkFMLiBUaGUgYWJvdmUgY29kZSBpcyBub3QgcmVsZXZhbnQgaW4gc3VjaCBjYXNlLjwvcD4KKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUsIGluIHdoaWNoCisgICAgICogY2FzZSB0aGUgcm90YXRpb24gaXMgcmVmbGVjdGVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPiwgYW5kIG5vdCBieQorICAgICAqIHJvdGF0aW5nIHRoZSBpbWFnZSBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0yMDAzLDcgKzIwMTQsOCBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLjwvcD4KKyAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLiBUaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHF1YWxpdHkKKyAgICAgKiBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyA0LApAQCAtMjAxOSw2ICsyMDMxLDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBxdWFsaXR5IG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19USFVNQk5BSUxfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDUsCkBAIC0yMDU1LDYgKzIwNjgsMTAgQEAKICAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbAogICAgICAqICAgc2l6ZS48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhlIHRhZyBpcyBhbHNvIHVzZWQgYXMgdGh1bWJuYWlsIHNpemUgZm9yIEhFSUMgaW1hZ2UgZm9ybWF0IGNhcHR1cmUsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICogdGhlIHRodW1ibmFpbCByb3RhdGlvbiBpcyByZWZsZWN0ZWQgYnkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LCBhbmQgbm90IGJ5CisgICAgICogcm90YXRpbmcgdGhlIHRodW1ibmFpbCBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfSlBFR19PUklFTlRBVElPTgogICAgICAqLwpAQCAtMjA4OCw2ICsyMTA1LDcgQEAKICAgICAgKiBhbmQgdmljZSB2ZXJzYS48L2xpPgogICAgICAqIDxsaT5BbGwgbm9uLTxjb2RlPigwLCAwKTwvY29kZT4gc2l6ZXMgd2lsbCBoYXZlIG5vbi16ZXJvIHdpZHRocyBhbmQgaGVpZ2h0cy48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhpcyBsaXN0IGlzIGFsc28gdXNlZCBhcyBzdXBwb3J0ZWQgdGh1bWJuYWlsIHNpemVzIGZvciBIRUlDIGltYWdlIGZvcm1hdCBjYXB0dXJlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwogICAgICAqLwpAQCAtMjc4Myw3ICsyODAxLDcgQEAKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LCBvciB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMzI1MSw2ICszMjY5LDcgQEAKICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH08L2xpPgogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI4OCw2ICszMzA3LDgxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfQ1JPUFBJTkdfVFlQRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdCBjb250YWlucworICAgICAqIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1XSwgd2hpY2ggbWFwcyB0bworICAgICAqICh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4gVGhlIGFycmF5IGNhbiBiZQorICAgICAqIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIHBzZXVkbyBjb2RlOjwvcD4KKyAgICAgKiA8cD5zdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICogaW50MzJfdCBmb3JtYXQ7CisgICAgICogaW50MzJfdCB3aWR0aDsKKyAgICAgKiBpbnQzMl90IGhlaWdodDsKKyAgICAgKiBpbnQzMl90IGlzSW5wdXQ7IH07PC9wPgorICAgICAqIDxwPnZvaWQgZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICogICAgIGludDMyX3QgKmFycmF5LCBzaXplX3QgY291bnQsIGludDMyX3QgdXNlY2FzZUlkLAorICAgICAqICAgICBWZWN0b3IgJmx0OyBTdHJlYW1Db25maWd1cmF0aW9uICZndDsgKiBzY3MpIHsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OzwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPmZvciAoc2l6ZV90IGkgPSAwOyBpICZsdDsgY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICogICAgIGludDMyX3Qgd2lkdGggPSBhcnJheVtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaGVpZ2h0ID0gYXJyYXlbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBmb3JtYXQgPSBhcnJheVtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGlzSW5wdXQgPSBhcnJheVtpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPSBhcnJheVtpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICogICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmYW1wOyAoMSAmbHQ7Jmx0OyB1c2VjYXNlSWQpKSB7CisgICAgICogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICogICAgICAgICBzY3MtJmd0O2FkZChzYyk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIDxwPn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgbWFwcGluZ3Mgb2YgaW1hZ2UgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIGNhbWVyYSBkZXZpY2UgZm9yIGlucHV0IHN0cmVhbXMsIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHJlY29tbWVuZGVkIHN1YnNldCBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBtYXBwaW5ncyBmb3VuZCBpbgorICAgICAqIGFuZHJvaWQuc2NhbGVyLmF2YWlsYWJsZUlucHV0T3V0cHV0Rm9ybWF0c01hcC4gVGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFwcGx5IGhlcmUgYXMgd2VsbC4KKyAgICAgKiBUaGUgbGlzdCBob3dldmVyIGRvZXNuJ3QgbmVlZCB0byBjb250YWluIGFsbCBhdmFpbGFibGUgYW5kIHN1cHBvcnRlZCBtYXBwaW5ncy4gSW5zdGVhZCBvZgorICAgICAqIHRoaXMgZGV2ZWxvcGVycyBtdXN0IGxpc3Qgb25seSByZWNvbW1lbmRlZCBhbmQgZWZmaWNpZW50IGVudHJpZXMuCisgICAgICogSWYgc2V0LCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFpFUk9fU0hVVFRFUl9MQUcgcmVjb21tZW5kZWQgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbiBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTM0NDgsNiArMzU0Miw4IEBACiAgICAgICogPHA+U29tZSBkZXZpY2VzIG1heSBjaG9vc2UgdG8gcHJvdmlkZSBhIHNlY29uZCBzZXQgb2YgY2FsaWJyYXRpb24KICAgICAgKiBpbmZvcm1hdGlvbiBmb3IgaW1wcm92ZWQgcXVhbGl0eSwgaW5jbHVkaW5nCiAgICAgICogQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBtYXRyaWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCkBAIC0zNDc3LDYgKzM1NzMsOCBAQAogICAgICAqIDxwPklmIHRoaXMga2V5IGlzIHByZXNlbnQsIHRoZW4gQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLCBhbmQKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIgd2lsbCBhbHNvIGJlIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgpAQCAtMzUwNCw2ICszNjAyLDggQEAKICAgICAgKiBjb2xvcnNwYWNlKSBpbnRvIHRoaXMgY2FtZXJhIGRldmljZSdzIG5hdGl2ZSBzZW5zb3IgY29sb3IKICAgICAgKiBzcGFjZSB1bmRlciB0aGUgZmlyc3QgcmVmZXJlbmNlIGlsbHVtaW5hbnQKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1MzEsNiArMzYzMSw4IEBACiAgICAgICogKEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMikuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzU1OSw2ICszNjYxLDggQEAKICAgICAgKiBhbmQgdGhlIENJRSBYWVogY29sb3JzcGFjZSB3aGVuIGNhbGN1bGF0aW5nIHRoaXMgdHJhbnNmb3JtIHdpbGwKICAgICAgKiBtYXRjaCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNTg5LDYgKzM2OTMsOCBAQAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzYxNSw2ICszNzIxLDggQEAKICAgICAgKiB0aGlzIG1hdHJpeCBpcyBjaG9zZW4gc28gdGhhdCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoaXMgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpbiB0aGUgcmVmZXJlbmNlIHNlbnNvciBjb2xvcnNwYWNlIGlzIG1hcHBlZCB0byBENTAgaW4gdGhlCiAgICAgICogQ0lFIFhZWiBjb2xvcnNwYWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzY0Myw2ICszNzUxLDggQEAKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzY3NSw2ICszNzg1LDcgQEAKICAgICAgKiBsZXZlbCB2YWx1ZXMuIEZvciByYXcgY2FwdHVyZSBpbiBwYXJ0aWN1bGFyLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgKiBwaXhlbHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgdG8gY2FsY3VsYXRlIGJsYWNrCiAgICAgICogbGV2ZWwgdmFsdWVzIGZvciBlYWNoIGZyYW1lLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSBkZXZpY2UsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVApAQCAtMzc2OSw2ICszODgwLDggQEAKICAgICAgKiB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHByb3ZpZGVkIGNvbG9yIHRyYW5zZm9ybXMgd2hlbgogICAgICAqIHByb2Nlc3NpbmcgcmF3IHNlbnNvciBkYXRhLjwvcD4KICAgICAgKiA8cD5UaGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpcyBSLCBHLCBCOyB3aGVyZSBSIGlzIGluIHRoZSBsb3dlc3QgaW5kZXguPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5UID0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRpb25hbFszXQogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxOCwKQEAgLTM3OTksNiArMzkxMiw4IEBACiAgICAgICogdGhhdCBjaGFubmVsLjwvcD4KICAgICAgKiA8cD5BIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5vaXNlIG1vZGVsIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICAgKiBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIE5vaXNlUHJvZmlsZSB0YWcuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCB0aGVyZSBpcyBvbmx5IG9uZSBjb2xvciBjaGFubmVsLiBTbyB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzCisgICAgICogd2lsbCBvbmx5IGNvbnRhaW4gb25lIFMgYW5kIG9uZSBPLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKICAgICAgKi8KQEAgLTM4NDQsNiArMzk1OSw4IEBACiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCiAgICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfR1JFRU5fU1BMSVQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMjIsCkBAIC0zOTk2LDYgKzQxMTMsNyBAQAogICAgICAqIGxheW91dCBrZXkgKHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCksIGkuZS4gdGhlCiAgICAgICogbnRoIHZhbHVlIGdpdmVuIGNvcnJlc3BvbmRzIHRvIHRoZSBibGFjayBsZXZlbCBvZmZzZXQgZm9yIHRoZSBudGgKICAgICAgKiBjb2xvciBjaGFubmVsIGxpc3RlZCBpbiB0aGUgQ0ZBLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzIGF2YWlsYWJsZSBvciB0aGUKICAgICAgKiBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uPC9wPgogICAgICAqCkBAIC00MDk4LDcgKzQyMTYsOCBAQAogICAgIC8qKgogICAgICAqIDxwPlRoZSBhcnJhbmdlbWVudCBvZiBjb2xvciBmaWx0ZXJzIG9uIHNlbnNvcjsKICAgICAgKiByZXByZXNlbnRzIHRoZSBjb2xvcnMgaW4gdGhlIHRvcC1sZWZ0IDJ4MiBzZWN0aW9uIG9mCi0gICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlci48L3A+CisgICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlciwgZm9yIGEgQmF5ZXIgY2FtZXJhLCBvciB0aGUKKyAgICAgKiBsaWdodCBzcGVjdHJ1bSBpdCBjYXB0dXJlcyBmb3IgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QpPC9wPgogICAgICAqCkBAIC00NTY3LDEzICs0Njg2LDEzIEBACiAgICAgICogKHgseSkgz7UgKDAgLi4uIE4tMSwgMCAuLi4gTS0xKSBpcyB0aGUgdmFsdWUgb2YgdGhlIHNoYWRpbmcgbWFwIGF0CiAgICAgICogcGl4ZWwgKCAoKFctMSkvKE4tMSkpICogeCwgKChILTEpLyhNLTEpKSAqIHkpIGZvciB0aGUgZm91ciBjb2xvciBjaGFubmVscy4KICAgICAgKiBUaGUgbWFwIGlzIGFzc3VtZWQgdG8gYmUgYmlsaW5lYXJseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiB0aGUgc2FtcGxlIHBvaW50cy48L3A+Ci0gICAgICogPHA+VGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMgdGhlIGdyZWVuCi0gICAgICogY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KKyAgICAgKiA8cD5Gb3IgYSBCYXllciBjYW1lcmEsIHRoZSBjaGFubmVsIG9yZGVyIGlzIFtSLCBHZXZlbiwgR29kZCwgQl0sIHdoZXJlIEdldmVuIGlzCisgICAgICogdGhlIGdyZWVuIGNoYW5uZWwgZm9yIHRoZSBldmVuIHJvd3Mgb2YgYSBCYXllciBwYXR0ZXJuLCBhbmQgR29kZCBpcyB0aGUgb2RkIHJvd3MuCiAgICAgICogVGhlIHNoYWRpbmcgbWFwIGlzIHN0b3JlZCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIGZvcm1hdCwgYW5kIGl0cyBzaXplCiAgICAgICogaXMgcHJvdmlkZWQgaW4gdGhlIGNhbWVyYSBzdGF0aWMgbWV0YWRhdGEgYnkgQUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHNoYWRpbmcgbWFwIHdpbGwgZ2VuZXJhbGx5IGhhdmUgb24gdGhlIG9yZGVyIG9mIDMwLTQwIHJvd3MgYW5kIGNvbHVtbnMsCiAgICAgICogYW5kIHdpbGwgYmUgc21hbGxlciB0aGFuIDY0eDY0LjwvcD4KLSAgICAgKiA8cD5BcyBhbiBleGFtcGxlLCBnaXZlbiBhIHZlcnkgc21hbGwgbWFwIGRlZmluZWQgYXM6PC9wPgorICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZm9yIGEgQmF5ZXIgY2FtZXJhIGRlZmluZWQgYXM6PC9wPgogICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSA9IFsgNCwgMyBdCiAgICAgICogQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAgPQogICAgICAqIFsgMS4zLCAxLjIsIDEuMTUsIDEuMiwgIDEuMiwgMS4yLCAxLjE1LCAxLjIsCkBAIC00NTkzLDYgKzQ3MTIsMTcgQEAKICAgICAgKiBpbWFnZSBvZiBhIGdyYXkgd2FsbCAodXNpbmcgYmljdWJpYyBpbnRlcnBvbGF0aW9uIGZvciB2aXN1YWwgcXVhbGl0eSkKICAgICAgKiBhcyBjYXB0dXJlZCBieSB0aGUgc2Vuc29yIGdpdmVzOjwvcD4KICAgICAgKiA8cD48aW1nIGFsdD0iSW1hZ2Ugb2YgYSB1bmlmb3JtIHdoaXRlIHdhbGwgKGludmVyc2Ugc2hhZGluZyBtYXApIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcC9pbnZfc2hhZGluZy5wbmciIC8+PC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLiBBbiBleGFtcGxlCisgICAgICogc2hhZGluZyBtYXAgZm9yIHN1Y2ggYSBjYW1lcmEgaXMgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CisgICAgICogWyAxLjMsIDEuMywgMS4zLCAxLjMsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAgIDEuMSwgMS4xLCAxLjEsIDEuMSwgIDEuMywgMS4zLCAxLjMsIDEuMywKKyAgICAgKiAgIDEuMiwgMS4yLCAxLjIsIDEuMiwgIDEuMSwgMS4xLCAxLjEsIDEuMSwKKyAgICAgKiAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgMS4zLCAxLjMsIDEuMywgMS4zLCAgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4zLCAxLjMsIDEuMywgMS4zIF0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBSQVcgaW1hZ2UgZGF0YSBtaWdodCBiZSBzdWJqZWN0IHRvIGxlbnMgc2hhZGluZwogICAgICAqIGNvcnJlY3Rpb24gbm90IHJlcG9ydGVkIG9uIHRoaXMgbWFwLiBRdWVyeQogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQgdG8gc2VlIGlmIFJBVyBpbWFnZSBkYXRhIGhhcyBzdWJqZWN0CkBAIC00OTM2LDggKzUwNjYsOCBAQAogICAgICAqIG9mIHBvaW50cyBjYW4gYmUgbGVzcyB0aGFuIG1heCAodGhhdCBpcywgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYWx3YXlzIHByb3ZpZGUgYSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBwb2ludHMgZXF1aXZhbGVudCB0bwogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTKS48L3A+Ci0gICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIG9ubHkgcmVkIGNoYW5uZWwgaXMgdXNlZC4gR3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMKLSAgICAgKiBhcmUgaWdub3JlZC48L3A+CisgICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIGFsbCB0aHJlZSBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mCisgICAgICogY29udHJvbCBwb2ludHMuPC9wPgogICAgICAqIDxwPkEgZmV3IGV4YW1wbGVzLCBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBncmFwaGljYWwgbWFwcGluZ3M7IHRoZXNlCiAgICAgICogb25seSBzcGVjaWZ5IHRoZSByZWQgY2hhbm5lbCBhbmQgdGhlIHByZWNpc2lvbiBpcyBsaW1pdGVkIHRvIDQKICAgICAgKiBkaWdpdHMsIGZvciBjb25jaXNlbmVzcy48L3A+CkBAIC01NDExLDkgKzU1NDEsMTIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+T3B0aW9uYWwgc3Vic2V0IG9mIHRoZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdAorICAgICAqIGNvbnRhaW5zIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPkZvciBkYXRhIHJlcHJlc2VudGF0aW9uIHBsZWFzZSByZWZlciB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlM8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNV0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA1LAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhdmFpbGFibGUgZHluYW1pYyBkZXB0aCBkYXRhc3BhY2Ugc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG91dHB1dC9pbnB1dCBzdHJlYW0pLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGVzZSBhcmUgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgdXNlIHdpdGgKKyAgICAgKiBkYXRhU3BhY2UgRFlOQU1JQ19ERVBUSC4gVGhlIGNvbmZpZ3VyYXRpb25zIGFyZQorICAgICAqIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPk9ubHkgZGV2aWNlcyB0aGF0IHN1cHBvcnQgZGVwdGggb3V0cHV0IGZvciBhdCBsZWFzdAorICAgICAqIHRoZSBIQUxfUElYRUxfRk9STUFUX1kxNiBkZW5zZSBkZXB0aCBtYXAgYWxvbmcgd2l0aAorICAgICAqIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiB3aXRoIHRoZSBzYW1lIHNpemUgb3Igc2l6ZSB3aXRoCisgICAgICogdGhlIHNhbWUgYXNwZWN0IHJhdGlvIGNhbiBoYXZlIGR5bmFtaWMgZGVwdGggZGF0YXNwYWNlCisgICAgICogc3RyZWFtIGNvbmZpZ3VyYXRpb24uIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGFsc28KKyAgICAgKiBuZWVkcyB0byBiZSBzZXQgdG8gRkFMU0UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRQorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNiwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5UaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBvZiBhIHN0cmVhbSAob2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCwgc2l6ZSkKKyAgICAgKiBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBpbnB1dCBvciBvdXRwdXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9IC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA3LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPkFsbCBkeW5hbWljIGRlcHRoIG91dHB1dCBzdHJlYW1zIG1heSBoYXZlIGEgbm9uemVybyBzdGFsbAorICAgICAqIGR1cmF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgOCwKICAgICBBQ0FNRVJBX0RFUFRIX0VORCwKIAogICAgIC8qKgorICAgICAqIDxwPlN0cmluZyBjb250YWluaW5nIHRoZSBpZHMgb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBhIGxvZ2ljYWwgY2FtZXJhLCB0aGlzIGlzIGNvbmNhdGVuYXRpb24gb2YgYWxsIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgKiBUaGUgbnVsbCB0ZXJtaW5hdG9yIGZvciBwaHlzaWNhbCBjYW1lcmEgSUQgbXVzdCBiZSBwcmVzZXJ2ZWQgc28gdGhhdCB0aGUgd2hvbGUgc3RyaW5nCisgICAgICogY2FuIGJlIHRva2VuaXplZCB1c2luZyAnXDAnIHRvIGdlbmVyYXRlIGxpc3Qgb2YgcGh5c2ljYWwgY2FtZXJhIElEcy48L3A+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIG9mIHRoZSBsb2dpY2FsIGNhbWVyYSBhcmUgIjIiIGFuZCAiMyIsIHRoZQorICAgICAqIHZhbHVlIG9mIHRoaXMgdGFnIHdpbGwgYmUgWycyJywgJ1wwJywgJzMnLCAnXDAnXS48L3A+CisgICAgICogPHA+VGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmEgSURzIG11c3QgYmUgbm8gbGVzcyB0aGFuIDIuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTID0gICAgICAgICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQsCisgICAgLyoqCiAgICAgICogPHA+VGhlIGFjY3VyYWN5IG9mIGZyYW1lIHRpbWVzdGFtcCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBwaHlzaWNhbCBjYW1lcmFzPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KTwvcD4KQEAgLTU0MzQsNiArNTY3NiwzMiBAQAogICAgICAqLwogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRSA9ICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xvZ2ljYWxfbXVsdGlfY2FtZXJhX3NlbnNvcl9zeW5jX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQgKyAxLAorICAgIC8qKgorICAgICAqIDxwPlN0cmluZyBjb250YWluaW5nIHRoZSBJRCBvZiB0aGUgdW5kZXJseWluZyBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGU8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIElEIG9mIHRoZSBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIHRoYXQncyBiYWNraW5nIHRoZSBsb2dpY2FsIGNhbWVyYS4gQWxsIGNhbWVyYQorICAgICAqIHN0cmVhbXMgYW5kIG1ldGFkYXRhIHRoYXQgYXJlIG5vdCBwaHlzaWNhbCBjYW1lcmEgc3BlY2lmaWMgd2lsbCBiZSBvcmlnaW5hdGluZyBmcm9tIHRoaXMKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqIDxwPkZvciBhIGxvZ2ljYWwgY2FtZXJhIG1hZGUgdXAgb2YgcGh5c2ljYWwgY2FtZXJhcyB3aGVyZSBlYWNoIGNhbWVyYSdzIGxlbnNlcyBoYXZlCisgICAgICogZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcywgdGhlIGNhbWVyYSBkZXZpY2UgbWF5IGNob29zZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmFzIHdoZW4gYXBwbGljYXRpb24gY2hhbmdlcyBGT0NBTF9MRU5HVEggb3IgU0NBTEVSX0NST1BfUkVHSU9OLgorICAgICAqIEF0IHRoZSB0aW1lIG9mIGxlbnMgc3dpdGNoLCB0aGlzIHJlc3VsdCBtZXRhZGF0YSByZWZsZWN0cyB0aGUgbmV3IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEKKyAgICAgKiBJRC48L3A+CisgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgdGhlIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS4KKyAgICAgKiBXaGVuIGF2YWlsYWJsZSwgdGhpcyBtdXN0IGJlIG9uZSBvZiB2YWxpZCBwaHlzaWNhbCBJRHMgYmFja2luZyB0aGlzIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgICAqIElmIHRoaXMga2V5IGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoZSBjYW1lcmEgZGV2aWNlIGltcGxlbWVudGF0aW9uCisgICAgICogbWF5IHN0aWxsIHN3aXRjaCBiZXR3ZWVuIGRpZmZlcmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhcyBiYXNlZCBvbiB1c2UgY2FzZSwgYnV0IHRoZQorICAgICAqIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpbmZvcm1hdGlvbiB3b24ndCBiZSBhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCA9ICAgICAgICAgICAvLyBieXRlCisgICAgICAgICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NUQVJUICsgMiwKICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0VORCwKIAogICAgIC8qKgpAQCAtNTQ1Nyw4ICs1NzI1LDggQEAKICAgICAgKiB3aWxsIG5vdCBzbG93IGRvd24gY2FwdHVyZSByYXRlIHdoZW4gYXBwbHlpbmcgY29ycmVjdGlvbi4gRkFTVCBtYXkgYmUgdGhlIHNhbWUgYXMgT0ZGIGlmCiAgICAgICogYW55IGNvcnJlY3Rpb24gYXQgYWxsIHdvdWxkIHNsb3cgZG93biBjYXB0dXJlIHJhdGUuICBFdmVyeSBvdXRwdXQgc3RyZWFtIHdpbGwgaGF2ZSBhCiAgICAgICogc2ltaWxhciBhbW91bnQgb2YgZW5oYW5jZW1lbnQgYXBwbGllZC48L3A+Ci0gICAgICogPHA+VGhlIGNvcnJlY3Rpb24gb25seSBhcHBsaWVzIHRvIHByb2Nlc3NlZCBvdXRwdXRzIHN1Y2ggYXMgWVVWLCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcyBub3QKLSAgICAgKiBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KKyAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIFk4LCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcworICAgICAqIG5vdCBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgd2lsbCBiZSBvbiBieSBkZWZhdWx0IG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoaXMgY29udHJvbC4gQXBwbGljYXRpb25zCiAgICAgICogZGlzYWJsaW5nIGRpc3RvcnRpb24gY29ycmVjdGlvbiBuZWVkIHRvIHBheSBleHRyYSBhdHRlbnRpb24gd2l0aCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YKICAgICAgKiBtZXRlcmluZyByZWdpb25zLCBjcm9wIHJlZ2lvbiwgYW5kIGZhY2UgcmVjdGFuZ2xlcy4gV2hlbiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgT0ZGLApAQCAtNTUxMSw2ICs1Nzc5LDgwIEBACiAgICAgICAgICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVCArIDEsCiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fRU5ELAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBIRUlDIChJU08vSUVDIDIzMDA4LTEyKSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cworICAgICAqIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGNvbmZpZ3VyYXRpb25zIGFyZSBsaXN0ZWQgYXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gdHVwbGVzLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBIRUlDIGltYWdlIGZvcm1hdCwgaXQgd2lsbCBzdXBwb3J0IGlkZW50aWNhbCBzZXQgb2Ygc3RyZWFtCisgICAgICogY29tYmluYXRpb25zIGludm9sdmluZyBIRUlDIGltYWdlIGZvcm1hdCwgY29tcGFyZWQgdG8gdGhlIGNvbWJpbmF0aW9ucyBpbnZvbHZpbmcgSlBFRworICAgICAqIGltYWdlIGZvcm1hdCBhcyByZXF1aXJlZCBieSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgbGV2ZWwgYW5kIGNhcGFiaWxpdGllcy48L3A+CisgICAgICogPHA+QWxsIHRoZSBzdGF0aWMsIGNvbnRyb2wsIGFuZCBkeW5hbWljIG1ldGFkYXRhIHRhZ3MgcmVsYXRlZCB0byBKUEVHIGFwcGx5IHRvIEhFSUMgZm9ybWF0cy4KKyAgICAgKiBDb25maWd1cmluZyBKUEVHIGFuZCBIRUlDIHN0cmVhbXMgYXQgdGhlIHNhbWUgdGltZSBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIGNvbmZpZ3VyYXRpb24gdHVwbGVzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHdpbGwgY29udGFpbgorICAgICAqIEFJTUFHRV9GT1JNQVRfSEVJQyBmb3JtYXQgYXMgT1VUUFVUIG9ubHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAgICAgICAgIC8vIGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2hlaWNfYXZhaWxhYmxlX2hlaWNfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBIRUlDIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgZnJhbWUgZHVyYXRpb24gd2hlbiBvbmx5IHRoYXQKKyAgICAgKiBzdHJlYW0gaXMgYWN0aXZlLCB3aXRoIGFsbCBwcm9jZXNzaW5nICh0eXBpY2FsbHkgaW4gYW5kcm9pZC4qLm1vZGUpCisgICAgICogc2V0IHRvIGVpdGhlciBPRkYgb3IgRkFTVC48L3A+CisgICAgICogPHA+V2hlbiBtdWx0aXBsZSBzdHJlYW1zIGFyZSB1c2VkIGluIGEgcmVxdWVzdCwgdGhlIG1pbmltdW0gZnJhbWUKKyAgICAgKiBkdXJhdGlvbiB3aWxsIGJlIG1heChpbmRpdmlkdWFsIHN0cmVhbSBtaW4gZHVyYXRpb25zKS48L3A+CisgICAgICogPHA+U2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMgZm9yIG1vcmUgZGV0YWlscyBhYm91dAorICAgICAqIGNhbGN1bGF0aW5nIHRoZSBtYXggZnJhbWUgcmF0ZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMgPSAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgMSwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtYXhpbXVtIHN0YWxsIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogb3V0cHV0IGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBIRUlDIHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BIHN0YWxsIGR1cmF0aW9uIGlzIGhvdyBtdWNoIGV4dHJhIHRpbWUgd291bGQgZ2V0IGFkZGVkCisgICAgICogdG8gdGhlIG5vcm1hbCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIHJlcGVhdGluZyByZXF1ZXN0CisgICAgICogdGhhdCBoYXMgc3RyZWFtcyB3aXRoIG5vbi16ZXJvIHN0YWxsLjwvcD4KKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9ucyBzaW1pbGFybHkgdG8KKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TIGZvciBIRUlDCisgICAgICogc3RyZWFtcy48L3A+CisgICAgICogPHA+QWxsIEhFSUMgb3V0cHV0IHN0cmVhbSBmb3JtYXRzIG1heSBoYXZlIGEgbm9uemVybyBzdGFsbAorICAgICAqIGR1cmF0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMgPSAgICAgICAgICAgICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCArIDIsCisgICAgQUNBTUVSQV9IRUlDX0VORCwKKwogfSBhY2FtZXJhX21ldGFkYXRhX3RhZ190OwogCiAvKioKQEAgLTcwMDUsNiArNzM0NywxMCBAQAogICAgICAqIDxwPklmIHRoaXMgaXMgc3VwcG9ydGVkLCBhbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwIHdpbGwKICAgICAgKiBhZGRpdGlvbmFsbHkgcmV0dXJuIGEgbWluIGZyYW1lIGR1cmF0aW9uIHRoYXQgaXMgZ3JlYXRlciB0aGFuCiAgICAgICogemVybyBmb3IgZWFjaCBzdXBwb3J0ZWQgc2l6ZS1mb3JtYXQgY29tYmluYXRpb24uPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdGhlIHVuZGVybHlpbmcgYWN0aXZlCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHN3aXRjaGVzLCBleHBvc3VyZVRpbWUsIHNlbnNpdGl2aXR5LCBhbmQgbGVucyBwcm9wZXJ0aWVzIG1heSBjaGFuZ2UKKyAgICAgKiBldmVuIGlmIEFFL0FGIGlzIGxvY2tlZC4gSG93ZXZlciwgdGhlIG92ZXJhbGwgYXV0byBleHBvc3VyZSBhbmQgYXV0byBmb2N1cyBleHBlcmllbmNlCisgICAgICogZm9yIHVzZXJzIHdpbGwgYmUgY29uc2lzdGVudC4gUmVmZXIgdG8gTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSBmb3IgZGV0YWlscy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQkxBQ0tfTEVWRUxfTE9DSwogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX0xPQ0sKQEAgLTcwNjAsNiArNzQwNiwxMCBAQAogICAgICAqIHdpbGwgYWNjdXJhdGVseSByZXBvcnQgdGhlIHZhbHVlcyBhcHBsaWVkIGJ5IEFXQiBpbiB0aGUgcmVzdWx0LjwvcD4KICAgICAgKiA8cD5BIGdpdmVuIGNhbWVyYSBkZXZpY2UgbWF5IGFsc28gc3VwcG9ydCBhZGRpdGlvbmFsIHBvc3QtcHJvY2Vzc2luZwogICAgICAqIGNvbnRyb2xzLCBidXQgdGhpcyBjYXBhYmlsaXR5IG9ubHkgY292ZXJzIHRoZSBhYm92ZSBsaXN0IG9mIGNvbnRyb2xzLjwvcD4KKyAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5LCB3aGVuIHVuZGVybHlpbmcgYWN0aXZlCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHN3aXRjaGVzLCB0b25lbWFwLCB3aGl0ZSBiYWxhbmNlLCBhbmQgc2hhZGluZyBtYXAgbWF5IGNoYW5nZSBldmVuIGlmCisgICAgICogYXdiIGlzIGxvY2tlZC4gSG93ZXZlciwgdGhlIG92ZXJhbGwgcG9zdC1wcm9jZXNzaW5nIGV4cGVyaWVuY2UgZm9yIHVzZXJzIHdpbGwgYmUKKyAgICAgKiBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9BQkVSUkFUSU9OX01PREVTCkBAIC03MTQzLDcgKzc0OTMsNyBAQAogICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZC4gIEFsc28gdGhlCiAgICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlIHdoZXJlCiAgICAgICogdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQorICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+CiAgICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKQEAgLTcxNzcsOCArNzUyNyw4IEBACiAgICAgICogPGxpPlRoZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QXMgb2YgQW5kcm9pZCBQLCB0aGUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BIExJTUlURUQgY2FtZXJhIHdpdGggb25seSB0aGUgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0Ci0gICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZSBERVBUSDE2Ci0gICAgICogICBmb3JtYXQuPC9saT4KKyAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgWTgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZQorICAgICAqICAgREVQVEgxNiBmb3JtYXQuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkdlbmVyYWxseSwgZGVwdGggb3V0cHV0IG9wZXJhdGVzIGF0IGEgc2xvd2VyIGZyYW1lIHJhdGUgdGhhbiBzdGFuZGFyZCBjb2xvciBjYXB0dXJlLAogICAgICAqIHNvIHRoZSBERVBUSDE2IGFuZCBERVBUSF9QT0lOVF9DTE9VRCBmb3JtYXRzIHdpbGwgY29tbW9ubHkgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uIHRoYXQKQEAgLTcyMDksOCArNzU1OSwxNCBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgPSAxMCwKIAogICAgIC8qKgotICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMgdGhhdCBhcmUKLSAgICAgKiBhbHNvIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzLiBJbgorICAgICAqIEFQSSBsZXZlbCAyOCwgdGhlIHBoeXNpY2FsIGNhbWVyYXMgbXVzdCBhbHNvIGJlIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBTdGFydGluZyBmcm9tIEFQSQorICAgICAqIGxldmVsIDI5LCBzb21lIG9yIGFsbCBwaHlzaWNhbCBjYW1lcmFzIG1heSBub3QgYmUgaW5kZXBlbmRlbnRseSBleHBvc2VkIHRvIHRoZQorICAgICAqIGFwcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBCdXQgdGhlIGFwcGxpY2F0aW9uCisgICAgICogY2FuIHN0aWxsIHF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmFzJyBjaGFyYWN0ZXJpc3RpY3MgYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2E+LjwvcD4KICAgICAgKiA8cD5DYW1lcmEgYXBwbGljYXRpb24gc2hvdWxkbid0IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBhdCBtb3N0IDEgcmVhciBjYW1lcmEgYW5kIDEgZnJvbnQKICAgICAgKiBjYW1lcmEgaW4gdGhlIHN5c3RlbS4gRm9yIGFuIGFwcGxpY2F0aW9uIHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBmcm9udCBhbmQgYmFjayBjYW1lcmFzLAogICAgICAqIHRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgZmlyc3QgcmVhciBjYW1lcmEgYW5kIHRoZSBmaXJzdCBmcm9udApAQCAtNzIzMyw3ICs3NTg5LDcgQEAKICAgICAgKiA8L2xpPgogICAgICAqIDxsaT5UaGUgU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSBvZiB0aGUgbG9naWNhbCBkZXZpY2UgYW5kIHBoeXNpY2FsIGRldmljZXMgbXVzdCBiZQogICAgICAqICAgdGhlIHNhbWUuPC9saT4KLSAgICAgKiA8bGk+VGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIGRldmljZS48L2xpPgorICAgICAqIDxsaT5UaGUgbG9naWNhbCBjYW1lcmEgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciBkZXZpY2UuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkJvdGggdGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBhbmQgaXRzIHVuZGVybHlpbmcgcGh5c2ljYWwgZGV2aWNlcyBzdXBwb3J0IHRoZQogICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIHJlcXVpcmVkIGZvciB0aGVpciBkZXZpY2UgbGV2ZWxzLjwvcD4KQEAgLTcyNTMsMjIgKzc2MDksMTA4IEBACiAgICAgICogPHA+VXNpbmcgcGh5c2ljYWwgc3RyZWFtcyBpbiBwbGFjZSBvZiBhIGxvZ2ljYWwgc3RyZWFtIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCB3aWxsCiAgICAgICogbm90IHNsb3cgZG93biB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgY2FwdHVyZSwgYXMgbG9uZyBhcyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbgogICAgICAqIG9mIHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBzdHJlYW1zIGFyZSB0aGUgc2FtZS48L3A+CisgICAgICogPHA+QSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UncyBkeW5hbWljIG1ldGFkYXRhIG1heSBjb250YWluCisgICAgICogQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgY3VycmVudAorICAgICAqIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgSWQuIEFuIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaXMgdGhlIHBoeXNpY2FsIGNhbWVyYSBmcm9tIHdoaWNoCisgICAgICogdGhlIGxvZ2ljYWwgY2FtZXJhJ3MgbWFpbiBpbWFnZSBkYXRhIG91dHB1dHMgKFlVViBvciBSQVcpIGFuZCBtZXRhZGF0YSBjb21lIGZyb20uCisgICAgICogSW4gYWRkaXRpb24sIHRoaXMgc2VydmVzIGFzIGFuIGluZGljYXRpb24gd2hpY2ggcGh5c2ljYWwgY2FtZXJhIGlzIHVzZWQgdG8gb3V0cHV0IHRvCisgICAgICogYSBSQVcgc3RyZWFtLCBvciBpbiBjYXNlIG9ubHkgcGh5c2ljYWwgY2FtZXJhcyBzdXBwb3J0IFJBVywgd2hpY2ggcGh5c2ljYWwgUkFXIHN0cmVhbQorICAgICAqIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVxdWVzdC48L3A+CisgICAgICogPHA+TG9naWNhbCBjYW1lcmEncyBzdGF0aWMgbWV0YWRhdGEgdGFncyBiZWxvdyBkZXNjcmliZSB0aGUgZGVmYXVsdCBhY3RpdmUgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmEuIEFuIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaXMgZGVmYXVsdCBpZiBpdCdzIHVzZWQgd2hlbiBhcHBsaWNhdGlvbiBkaXJlY3RseQorICAgICAqIHVzZXMgcmVxdWVzdHMgYnVpbHQgZnJvbSBhIHRlbXBsYXRlLiBBbGwgdGVtcGxhdGVzIHdpbGwgZGVmYXVsdCB0byB0aGUgc2FtZSBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19TRU5TSVRJVklUWV9SQU5HRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19NQVhfRlJBTUVfRFVSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkU8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfTUFYX0FOQUxPR19TRU5TSVRJVklUWTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUzwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfRElTVE9SVElPTjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5UbyBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgY2FwdHVyZSByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgdGFncworICAgICAqIHJlcXVpcmVkIGZvciBiYXNpYyBjYW1lcmEgZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZQorICAgICAqIGxvZ2ljYWwgY2FtZXJhIGNhcGFiaWx0aXR5LiBPdGhlciByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgdGFncywgb24gdGhlIG90aGVyCisgICAgICogaGFuZCwgd2lsbCBiZSBiYXNlZCBvbiBjdXJyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEuIEZvciBleGFtcGxlLCB0aGUgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmFzJyBzZW5zb3Igc2Vuc2l0aXZpdHkgYW5kIGxlbnMgY2FwYWJpbGl0eSBjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyLgorICAgICAqIFNvIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG1hbnVhbGx5IGNvbnRyb2xzIHNlbnNvciBleHBvc3VyZSB0aW1lL2dhaW4sIG9yIGRvZXMgbWFudWFsCisgICAgICogZm9jdXMgY29udHJvbCwgaXQgbXVzdCBjaGVja3MgdGhlIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSdzIGV4cG9zdXJlLCBnYWluLAorICAgICAqIGFuZCBmb2N1cyBkaXN0YW5jZSByYW5nZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lECiAgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVECisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEgICAgICA9IDExLAogCiAgICAgLyoqCiAgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKLSAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogYW5kIGZvciBZVVZfNDIwXzg4OCBzdHJlYW0sIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIDxwPkEgTU9OT0NIUk9NRSBjYW1lcmEgbXVzdCBzdXBwb3J0IHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yCisgICAgICogaXRzIGRldmljZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLiBBZGRpdGlvbmFsbHksIGlmIHRoZSBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBzdXBwb3J0cyBZOCBmb3JtYXQsIGFsbCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyByZWxhdGVkIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSBhcHBseQorICAgICAqIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBhcyB3ZWxsLiBUaGVyZSBhcmUgbm8KKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyB3aXRoIHJlZ2FyZCB0bworICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBmb3IgQmF5ZXIgY2FtZXJhIGRldmljZXMuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGUgU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UIG9mIGEgTU9OT0NIUk9NRQorICAgICAqIGNhbWVyYSB3aWxsIGJlIGVpdGhlciBNT05PIG9yIE5JUi48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGltYWdlIGRhdGEgaW50byBhIHJlZ2lvbiBvZiBtZW1vcnkKKyAgICAgKiBpbmFjY2Vzc2libGUgdG8gQW5kcm9pZCB1c2Vyc3BhY2Ugb3IgdGhlIEFuZHJvaWQga2VybmVsLCBhbmQgb25seSBhY2Nlc3NpYmxlIHRvCisgICAgICogdHJ1c3RlZCBleGVjdXRpb24gZW52aXJvbm1lbnRzIChURUUpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQSAgICAgICAgID0gMTMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKIApAQCAtNzI5NCw2ICs3NzM2LDY3IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdDsKIAorLy8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IG11c3Qgb25seSBpbmNsdWRlIG5vbi1zdGFsbGluZyBwcm9jZXNzZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaWtlIFlVVl80MjBfODg4LCBJTVBMRU1FTlRBVElPTl9ERUZJTkVELCBldGMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gcmVjb3JkIG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgdGhhdCBtYXRjaCB0aGUgYWR2ZXJ0aXNlZAorICAgICAqIHN1cHBvcnRlZCBtZWRpYSBwcm9maWxlcyA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwiPkNhbWNvcmRlclByb2ZpbGU8L2E+IHdpdGgKKyAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGZvcm1hdC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPlZpZGVvIHNuYXBzaG90IG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXQgbGVhc3QgYXMgYmlnIGFzCisgICAgICogdGhlIG1heGltdW0gUkVDT1JEIHJlc29sdXRpb25zIGFuZCBvbmx5IHdpdGggZm9ybWF0IEJMT0IgKyBEQVRBU1BBQ0VfSkZJRgorICAgICAqIGZvcm1hdC9kYXRhc3BhY2UgY29tYmluYXRpb24gKEpQRUcpLiBBZGRpdGlvbmFsbHkgdGhlIGNvbmZpZ3VyYXRpb25zIHNob3VsZG4ndCBjYXVzZQorICAgICAqIHByZXZpZXcgZ2xpdGNoZXMgYW5kIGFsc28gYmUgYWJsZSB0byBydW4gYXQgMzAgZnBzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZJREVPX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzbmFwc2hvdCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSB3aXRoCisgICAgICogc2l6ZSBjbG9zZSB0byBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIHdpdGggQkxPQiArIERBVEFTUEFDRV9KRklGCisgICAgICogZm9ybWF0L2RhdGFzcGFjZSBjb21iaW5hdGlvbiAoSlBFRykuIFRha2luZyBpbnRvIGFjY291bnQgcmVzdHJpY3Rpb25zIG9uIGFzcGVjdAorICAgICAqIHJhdGlvLCBhbGlnbm1lbnQgZXRjLiB0aGUgYXJlYSBvZiB0aGUgbWF4aW11bSBzdWdnZXN0ZWQgc2l6ZSBzaG91bGRu4oCZdCBiZSBsZXNzIHRoYW4KKyAgICAgKiA5NyUgb2YgdGhlIHNlbnNvciBhcnJheSBzaXplIGFyZWEuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzLAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCByZWNvbW1lbmRlZCBpbnB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGJlIGFkdmVydGlzZWQgd2l0aAorICAgICAqIFpTTCBhbG9uZyB3aXRoIG90aGVyIHByb2Nlc3NlZCBhbmQvb3Igc3RhbGxpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfWlNMICAgPSAweDQsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIHJhdyBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGluY2x1ZGUgUkFXIGJhc2VkCisgICAgICogb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkFXICAgPSAweDUsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BVQkxJQ19FTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NiwKKworICAgIC8qKgorICAgICAqIDxwPlZlbmRvciBkZWZpbmVkIHVzZSBjYXNlcy4gVGhlc2UgZGVwZW5kIG9uIHRoZSB2ZW5kb3IgaW1wbGVtZW50YXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVkVORE9SX1NUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE4LAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3JlZmVyZW5jZV9pbGx1bWluYW50MSB7CkBAIC03NDcwLDYgKzc5NzMsMjEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9SR0IgICAgICAgICAgICAgICAgID0gNCwKIAorICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBkb2Vzbid0IGhhdmUgYW55IEJheWVyIGNvbG9yIGZpbHRlci4KKyAgICAgKiBTdWNoIHNlbnNvciBjYXB0dXJlcyB2aXNpYmxlIGxpZ2h0IGluIG1vbm9jaHJvbWUuIFRoZSBleGFjdCB3ZWlnaHRpbmcgYW5kCisgICAgICogd2F2ZWxlbmd0aHMgY2FwdHVyZWQgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBvbmx5IGluY2x1ZGVzIHRoZSB2aXNpYmxlCisgICAgICogZnJlcXVlbmNpZXMuIFRoaXMgdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9NT05PICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBoYXMgYSBuZWFyIGluZnJhcmVkIGZpbHRlciBjYXB0dXJpbmcgbGlnaHQgd2l0aCB3YXZlbGVuZ3RoIGJldHdlZW4KKyAgICAgKiByb3VnaGx5IDc1MG5tIGFuZCAxNDAwbm0sIGFuZCB0aGUgc2FtZSBmaWx0ZXIgY292ZXJzIHRoZSB3aG9sZSBzZW5zb3IgYXJyYXkuIFRoaXMKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX05JUiAgICAgICAgICAgICAgICAgPSA2LAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9pbmZvX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90OwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UKQEAgLTc4OTgsNiArODQxNiwxNiBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90OwogCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZSB7CkBAIC03OTQxLDYgKzg0NjksMTYgQEAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGlzdG9ydGlvbl9jb3JyZWN0aW9uX21vZGVfdDsKIAogCisvLyBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKworCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKKyNkZWZpbmUgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorCisvKioKKyAqIEBhZGR0b2dyb3VwIENhbWVyYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka0NhbWVyYVdpbmRvd1R5cGUuaAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93IHR5cGUgdXNlZCBieSBOREsgYW5kIHRoZSBWTkRLIHZhcmlhbnRzIG9mIHRoZQorICogY2FtZXJhMiBOREsuIFRoaXMgZW5hYmxlcyB1cyB0byBzaGFyZSB0aGUgYXBpIGRlZmluaXRpb24gaGVhZGVycyBhbmQgYXZvaWQKKyAqIGNvZGUgZHVwbGljYXRpb24gKHNpbmNlIHRoZSBWTkRLIHZhcmlhbnQgZG9lc24ndCB1c2UgQU5hdGl2ZVdpbmRvdyB1bmxpa2UgdGhlCisgKiBOREsgdmFyaWFudCkuCisgKi8KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KK3R5cGVkZWYgbmF0aXZlX2hhbmRsZV90IEFDYW1lcmFXaW5kb3dUeXBlOworI2Vsc2UKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KK3R5cGVkZWYgQU5hdGl2ZVdpbmRvdyBBQ2FtZXJhV2luZG93VHlwZTsKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNTM0MGU3Ni4uMTM2OTg5YSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtMzUsOSArMzUsOSBAQAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0gKICNkZWZpbmUgX05ES19DQVBUVVJFX1JFUVVFU1RfSApAQCAtMTAxLDcgKzEwMSw3IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0CiAgKi8KLWNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBTmF0aXZlV2luZG93KiB3aW5kb3csCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywKICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dCBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CmluZGV4IGEyOWU5NmQuLjVhMDAwMjIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CisrKyBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CkBAIC0yLDkgKzIsMTEgQEAKICAgZ2xvYmFsOgogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9hYm9ydENhcHR1cmVzOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fZ2V0RGV2aWNlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3Q7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CkBAIC0yNCw2ICsyNiw3IEBACiAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWU7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldEFsbFRhZ3M7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnk7CisgICAgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZTsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldDsKQEAgLTQ4LDYgKzUxLDcgQEAKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobVdpbmRvdyA9PSBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8YW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI+IG1TaGFyZWRXaW5kb3dzOworICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKKyAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOworfTsKKworCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYWZjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMCwwICsxLDE1OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFEZXZpY2VWZW5kb3IiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRXJyb3JDb2RlS2V5ICAgICAgPSAiRXJyb3JDb2RlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhbGxiYWNrRnBLZXkgICAgID0gIkNhbGxiYWNrIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1Nlc3Npb25TcEtleSAgICAgID0gIlNlc3Npb25TcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQW53S2V5ICAgICAgICAgICAgPSAiQW53IjsKKworLyoqCisgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KKyAqLworQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgorICAgICAgICBtQ2FtZXJhSWQoaWQpLAorICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCisgICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKKyAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCisgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKKyAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAorICAgICAgICBtSWRsZSh0cnVlKSwKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uKG51bGxwdHIpIHsKKyAgICBtQ2xvc2luZyA9IGZhbHNlOworICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBkZXZpY2UgY2FsbGJhY2tzIHRvIGFwcAorICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLWRldi1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMSkgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHBhcnRpYWwgcmVzdWx0IGNvdW50IiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBzaGFkaW5nIG1hcCBzaXplIiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IDA7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IGVudHJ5LmRhdGEuaTMyWzFdOworICAgIH0KK30KKworLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCitDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgICAgIGlmICghaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgZGlzY29ubmVjdExvY2tlZChzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtc2cuY2xlYXIoKTsKKyAgICBzcDxBTWVzc2FnZT4gY2xlYW51cE1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsZWFuVXBTZXNzaW9ucywgbUhhbmRsZXIpOworICAgIGNsZWFudXBNc2ctPnBvc3QoKTsKK30KKworLy8gVE9ETzogY2FjaGVkIGNyZWF0ZWQgcmVxdWVzdD8KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdSZXF1ZXN0OworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICBbJnN0YXR1cywgJnJhd1JlcXVlc3RdKGF1dG8gcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SICYmIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdSZXF1ZXN0KSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRlZmF1bHQgcmVxdWVzdCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG91dFJlcSA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBvdXRSZXEtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShyYXdSZXF1ZXN0LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgb3V0UmVxLT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgICpyZXF1ZXN0ID0gb3V0UmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBjdXJyZW50U2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgY3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBuZXcgc2Vzc2lvbgorICAgIHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiRmFpbCB0byBjcmVhdGUgbmV3IHNlc3Npb24uIGNhbm5vdCBjb25maWd1cmUgc3RyZWFtcyIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbmV3U2Vzc2lvbiA9IG5ldyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBtTmV4dFNlc3Npb25JZCsrLCBvdXRwdXRzLCBjYWxsYmFja3MsIHRoaXMpOworCisgICAgLy8gc2V0IG5ldyBzZXNzaW9uIGFzIGN1cnJlbnQgc2Vzc2lvbgorICAgIG5ld1Nlc3Npb24tPmluY1N0cm9uZygodm9pZCAqKSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uKTsKKyAgICBtQ3VycmVudFNlc3Npb24gPSBuZXdTZXNzaW9uOworICAgIG1GbHVzaGluZyA9IGZhbHNlOworICAgICpzZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OmFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LAorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSkgeworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IGFDYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFfbWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhX21ldGFkYXRhLCAmaENhbWVyYU1ldGFkYXRhKTsKKyAgICBtZXRhZGF0YUNvcHkudW5sb2NrKGNhbWVyYV9tZXRhZGF0YSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUoMSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YShzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghb3V0cHV0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIG91dHB1dCBjb25maWd1cmF0aW9uIGlzIG5vdCBzaGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChrdlBhaXIuc2Vjb25kLmZpcnN0LCBvdXRwdXQtPm1XaW5kb3cpKSB7CisgICAgICAgICAgICBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBJbnZhbGlkIG91dHB1dCBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ1c7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnID0gb3V0Q29uZmlnVy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICBvdXRDb25maWcucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQtPm1Sb3RhdGlvbik7CisgICAgb3V0Q29uZmlnLndpbmRvd0dyb3VwSWQgPSAtMTsgLy8gbmRrIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlciBPdXRwdXRDb25maWd1cmF0aW9uIGJ1ZmZlciBzaGFyaW5nLgorICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIG91dENvbmZpZy5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBpbnQgaSA9IDE7CisgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzW2krK10gPSBhbnc7CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRDb25maWcpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIHVwZGF0aW5nIE91dHB1dENvbmZpZ3VyYXRpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbW90ZVJldCkgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgb3BlcmF0aW9uIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgb3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGFkZCBzaGFyZWQgb3V0cHV0IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6YWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+ICZvdXRSZXEpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLmlkID0gbUNhbWVyYUlkOworICAgIC8vIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIGNvcHkgdGhlIG1ldGFkYXRhIGhlcmUgPworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhTWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhTWV0YWRhdGEsICZoQ2FtZXJhTWV0YWRhdGEpOworICAgIG1ldGFkYXRhQ29weS51bmxvY2soY2FtZXJhTWV0YWRhdGEpOworICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5zaXplKCkpKSB7CisgICAgICAgICAgICAvLyBUaGUgbWV0YWRhdGEgZmllbGQgb2YgdGhlIHVuaW9uIHdvdWxkJ3ZlIGJlZW4gZGVzdHJ1Y3R1ZWQsIHNvIG5vIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIHJlLXNpemUgaXQuCisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGbXEgd3JpdGUgY2FwdHVyZSByZXN1bHQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiKTsKKyAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN0cmVhbUlkeExpc3Q7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN1cmZhY2VJZHhMaXN0OworICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dHB1dFRhcmdldC5tV2luZG93OworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHJlcS0+bVN1cmZhY2VMaXN0LnB1c2hfYmFjayhhbncpOworICAgICAgICAvLyBsb29rdXAgc3RyZWFtL3N1cmZhY2UgSUQKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyJiBvdXRDb25maWcgPSBrdlBhaXIuc2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRDb25maWcubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgICAgIGZvciAoaW50IHN1cmZhY2VJZCA9IDA7IHN1cmZhY2VJZCA8IChpbnQpIHdpbmRvd0hhbmRsZXMuc2l6ZSgpOyBzdXJmYWNlSWQrKykgeworICAgICAgICAgICAgICAgIC8vIElmIHR3byBuYXRpdmUgaGFuZGxlcyBhcmUgZXF1aXZhbGVudCwgc28gYXJlIHRoZWlyIHN1cmZhY2VzLgorICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3N1cmZhY2VJZF0uZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbncpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5jb25maWd1cmVkIG91dHB1dCB0YXJnZXQgJXAgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIGFudyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMucmVzaXplKHJlcXVlc3RTdHJlYW1JZHhMaXN0LnNpemUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHNbaV0uc3RyZWFtSWQgPSByZXF1ZXN0U3RyZWFtSWR4TGlzdFtpXTsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLndpbmRvd0lkID0gcmVxdWVzdFN1cmZhY2VJZHhMaXN0W2ldOworICAgIH0KKyAgICBvdXRSZXEgPSByZXE7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0FDYXB0dXJlUmVxdWVzdCoKK0NhbWVyYURldmljZTo6YWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpIHsKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIHBSZXF1ZXN0ID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOworICAgIENhbWVyYU1ldGFkYXRhIGNsb25lOworICAgIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YSgpLCAmY2xvbmUpOworICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gcmVxLT5tU3VyZmFjZUxpc3RbaV07CisgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQgb3V0cHV0VGFyZ2V0KGFudyk7CisgICAgICAgIHBSZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cy5pbnNlcnQob3V0cHV0VGFyZ2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHBSZXF1ZXN0OworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0KiByZXEpIHsKKyAgICBpZiAocmVxID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKKyAgICBkZWxldGUgcmVxOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6Om5vdGlmeVNlc3Npb25FbmRPZkxpZmVMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CisgICAgaWYgKGlzQ2xvc2VkKCkpIHsKKyAgICAgICAgLy8gRGV2aWNlIGlzIGNsb3NpbmcgYWxyZWFkeS4gZG8gbm90aGluZworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgb3RoZXIgc2Vlc2lvbiBvciBkZXZpY2UgaXMgY2xvc2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKworICAgIC8vIFNob3VsZCBub3QgaGFwcGVuCisgICAgaWYgKCFzZXNzaW9uLT5tSXNDbG9zZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiB1bmNsb3NlZCBzZXNzaW9uICVwIHJlYWNoZXMgZW5kIG9mIGxpZmUhIiwgc2Vzc2lvbik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBObyBuZXcgc2Vzc2lvbiwgdW5jb25maWd1cmUgbm93CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZSBzdHJlYW0gZmFpbGVkLiBEZXZpY2UgbWlnaHQgc3RpbGwgYmUgY29uZmlndXJlZCEgcmV0ICVkIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZGlzY29ubmVjdExvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgaWYgKG1DbG9zaW5nLmV4Y2hhbmdlKHRydWUpKSB7CisgICAgICAgIC8vIEFscmVhZHkgY2xvc2luZywganVzdCByZXR1cm4KKyAgICAgICAgQUxPR1coIkNhbWVyYSBkZXZpY2UgJXMgaXMgYWxyZWFkeSBjbG9zaW5nLiIsIGdldElkKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SZW1vdGUgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoaWxlIGRpc2Nvbm5lY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVJlbW90ZSA9IG51bGxwdHI7CisKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzdG9wUmVwZWF0aW5nTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBtUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZsYXN0RnJhbWVOdW1iZXJdKFN0YXR1cyBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNhbmNlbCBhY3RpdmUgcmVwZWF0aW5nIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgYWJvcnQgY2FwdHVyZXMgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQorICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KKyAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgorICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmcpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBpcyBhbHJlYWR5IGFib3J0aW5nIGNhcHR1cmVzIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIG1GbHVzaGluZyA9IHRydWU7CisKKyAgICAvLyBTZW5kIG9uQWN0aXZlIGNhbGxiYWNrIHRvIGd1YXJhbnRlZSB0aGVyZSBpcyBhbHdheXMgYWN0aXZlLT5yZWFkeSB0cmFuc2l0aW9uCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgLy8gSWYgZGV2aWNlIGlzIGFscmVhZHkgaWRsaW5nLCBzZW5kIGNhbGxiYWNrIGFuZCBleGl0IGVhcmx5CisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5mbHVzaChbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oYXV0byBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IEFib3J0IGNhcHR1cmVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKG1SZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OndhaXRVbnRpbElkbGVMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiV2FpdCB1bnRpbCBjYW1lcmEgJXMgaWRsZSBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3b24ndCBnbyB0byBpZGxlIHdoZW4gdGhlcmUgaXMgcmVwZWF0aW5nIHJlcXVlc3QhIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+d2FpdFVudGlsSWRsZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIHdhaXRVbnRpbElkbGUgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycykgeworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciBlbXB0eU91dHB1dDsKKyAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyKSB7CisgICAgICAgIG91dHB1dHMgPSAmZW1wdHlPdXRwdXQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG91dHB1dFNldDsKKyAgICBmb3IgKGF1dG8gb3V0Q29uZmlnIDogb3V0cHV0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRDb25maWcubVdpbmRvdzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgb3V0Q29uZmlnSW5zZXJ0VzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnSW5zZXJ0ID0gb3V0Q29uZmlnSW5zZXJ0Vy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0Q29uZmlnLm1Sb3RhdGlvbik7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dHcm91cElkID0gLTE7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRDb25maWcubVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzWzBdID0gYW53OworICAgICAgICBvdXRDb25maWdJbnNlcnQucGh5c2ljYWxDYW1lcmFJZCA9IG91dENvbmZpZy5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB3cmFwKGFudyk7CisgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYW53LCBvdXRDb25maWdJbnNlcnRXKSk7CisgICAgfQorICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IGFkZFNldCA9IG91dHB1dFNldDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkZWxldGVMaXN0OworCisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHN0cmVhbXMgbmVlZCB0byBiZSBjcmVhdGVkLCB3aGljaCB0byBiZSBkZWxldGVkCisgICAgZm9yIChhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgYXV0byYgb3V0cHV0UGFpciA9IGt2UGFpci5zZWNvbmQ7CisgICAgICAgIGlmIChvdXRwdXRTZXQuY291bnQob3V0cHV0UGFpcikpIHsKKyAgICAgICAgICAgIGRlbGV0ZUxpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsgLy8gTmVlZCB0byBkZWxldGUgYSBubyBsb25nZXIgbmVlZGVkIHN0cmVhbQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkU2V0LmVyYXNlKG91dHB1dFBhaXIpOyAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgYWxyZWFkeSBleGlzdGluZyBzdHJlYW0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd2FpdCB1bnRpbCBpZGxlIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBTZW5kIG9uUmVhZHkgdG8gcHJldmlvdXMgc2Vzc2lvbgorICAgIC8vIEN1cnJlbnRTZXNzaW9uIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBjb25maWd1cmVTdHJlYW1Mb2NrZWQsIHNvIGhlcmUKKyAgICAvLyBtQ3VycmVudFNlc3Npb24gaXMgdGhlIHNlc3Npb24gdG8gYmUgcmVwbGFjZWQgYnkgYSBuZXcgc2Vzc2lvbgorICAgIGlmICghbUlkbGUgJiYgbUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1CdXN5U2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICAgICAgICAgIEFMT0dFKCJDdXJyZW50IHNlc3Npb24gIT0gYnVzeSBzZXNzaW9uIik7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBtQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgbUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IHRydWU7CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmJlZ2luQ29uZmlndXJlKCk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgYmVnaW4gY29uZmlndXJlIGZhaWxlZCIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgIH0KKworICAgIC8vIGRlbGV0ZSB0by1iZS1kZWxldGVkIHN0cmVhbXMKKyAgICBmb3IgKGF1dG8gc3RyZWFtSWQgOiBkZWxldGVMaXN0KSB7CisgICAgICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCByZW1vdGVSZXQgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIHJlbW92ZSBzdHJlYW0gJWQiLCBnZXRJZCgpLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5lcmFzZShzdHJlYW1JZCk7CisgICAgfQorCisgICAgLy8gYWRkIG5ldyBzdHJlYW1zCisgICAgZm9yIChhdXRvIG91dHB1dFBhaXIgOiBhZGRTZXQpIHsKKyAgICAgICAgaW50IHN0cmVhbUlkOworICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRQYWlyLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzdHJlYW1JZF0oU3RhdHVzIHMsIGF1dG8gc3RyZWFtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW1faWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBjcmVhdGUgc3RyZWFtIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIG91dHB1dFBhaXIpKTsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBwYXJhbXM7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxQYXJhbXM7CisgICAgaWYgKChzZXNzaW9uUGFyYW1ldGVycyAhPSBudWxscHRyKSAmJiAoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzICE9IG51bGxwdHIpKSB7CisgICAgICAgIHBhcmFtcy5hcHBlbmQoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSk7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpwYXJhbXNfbWV0YWRhdGEgPSBwYXJhbXMuZ2V0QW5kTG9jaygpOworICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbChwYXJhbXNfbWV0YWRhdGEsICZoaWRsUGFyYW1zKTsKKyAgICAgICAgcGFyYW1zLnVubG9jayhwYXJhbXNfbWV0YWRhdGEpOworICAgIH0KKyAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFLCBoaWRsUGFyYW1zKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yOiBlbmRDb25maWd1cmUgZmFpbGVkICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgbVJlbW90ZSA9IHJlbW90ZTsKK30KKworYm9vbAorQ2FtZXJhRGV2aWNlOjpzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpIHsKKyAgICAgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgIEFMT0dFKCJtUmVtb3RlIG11c3Qgbm90IGJlIG51bGwgd2hpbGUgdHJ5aW5nIHRvIGZldGNoIG1ldGFkYXRhIHF1ZXVlcyIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+ICZyZXFRdWV1ZSA9IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU7CisgICAgICAgIGF1dG8gcmV0ID0KKyAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgICAgICBbJnJlcVF1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihtcURlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcVF1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVxUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmcmVzUXVldWUgPSBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgbVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVzdWx0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVtcHR5IGZtcSBmcm9tIGNhbWVyYXNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKSBjb25zdCB7CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBpZiAobUluRXJyb3IpIHsvLyB0cmlnZ2VyZWQgYnkgb25EZXZpY2VFcnJvcgorICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBtRXJyb3I7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcikgeworICAgIG1JbkVycm9yID0gdHJ1ZTsKKyAgICBtRXJyb3IgPSBlcnJvcjsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcikgeworICAgIEFMT0dWKCJ1cGRhdGVUcmFja2VyIGZyYW1lICUiIFBSSWQ2NCAiIGlzRXJyb3IgJWQiLCBmcmFtZU51bWJlciwgaXNFcnJvcik7CisgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgICAgbUZ1dHVyZUVycm9yU2V0Lmluc2VydChmcmFtZU51bWJlcik7CisgICAgfSBlbHNlIGlmIChmcmFtZU51bWJlciA8PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lIG51bWJlciAlIiBQUklkNjQgIiBkZWNyZWFzZWQhIGN1cnJlbnQgZm4gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtQ29tcGxldGVkRnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgb3V0IG9mIG9yZGVyLiBFeHBlY3QgJSIgUFJJZDY0ICIgYnV0IGdldCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhc3NlcnQgYXMgaW4gamF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAgICB9CisgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIH0KKyAgICB1cGRhdGUoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpGcmFtZU51bWJlclRyYWNrZXI6OnVwZGF0ZSgpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlRXJyb3JTZXQuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZUVycm9yU2V0LmVuZCgpOykgeworICAgICAgICBpbnQ2NF90IGVycm9yRnJhbWVOdW1iZXIgPSAqaXQ7CisgICAgICAgIGlmIChlcnJvckZyYW1lTnVtYmVyID09IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlcisrOworICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgaWYgKGVycm9yRnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZGVhbCB3aXRoIGl0IGFueXdheQorICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRkIGZyYW1lIG51bWJlciBwYXNzZWQgdGhyb3VnaCBjdXJyZW50IGZyYW1lIG51bWJlciEiKTsKKyAgICAgICAgICAgIC8vIGVyYXNlIHRoZSBvbGQgZXJyb3Igc2luY2UgaXQncyBubyBsb25nZXIgdXNlZnVsCisgICAgICAgICAgICBpdCA9IG1GdXR1cmVFcnJvclNldC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3JtYWwgcmVxdWVzdHMgaGFzbid0IGNhdGNoZWQgdXAgZXJyb3IgZnJhbWVzLCBqdXN0IGJyZWFrCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiVXBkYXRlIGNvbXBsZXRlIGZyYW1lICUiIFBSSWQ2NCwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpvbkNhcHR1cmVFcnJvckxvY2tlZCgKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgaW50IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYXV0byBpdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ID09IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGNhcHR1cmUgc2VxdWVuY2UgaW5kZXggJWQgbm90IGZvdW5kISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisKKyAgICAvLyBIYW5kbGUgYnVmZmVyIGVycm9yCisgICAgaWYgKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVIpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKSBhbncpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBIYW5kbGUgb3RoZXIgY2FwdHVyZSBmYWlsdXJlcworICAgICAgICAvLyBGaXJlIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUgcmVnaXN0ZXJlZAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkVycm9yID0gY2JoLm1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlKG5ldyBDYW1lcmFDYXB0dXJlRmFpbHVyZSgpKTsKKyAgICAgICAgZmFpbHVyZS0+ZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgLy8gVE9ETzogcmVmaW5lIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgZmx1c2gKKyAgICAgICAgZmFpbHVyZS0+cmVhc29uICAgICAgPSBDQVBUVVJFX0ZBSUxVUkVfUkVBU09OX0VSUk9SOworICAgICAgICBmYWlsdXJlLT5zZXF1ZW5jZUlkICA9IHNlcXVlbmNlSWQ7CisgICAgICAgIGZhaWx1cmUtPndhc0ltYWdlQ2FwdHVyZWQgPSAoZXJyb3JDb2RlID09IEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCBmYWlsdXJlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKKyAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBDaGVjayB0aGUgY29tbW9uIHBhcnQgb2YgYWxsIG1lc3NhZ2UKKyAgICB2b2lkKiBjb250ZXh0OworICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2sgb25EaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkRpc2Nvbm5lY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbkRpc2Nvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkRpc2Nvbm5lY3RlZCkoY29udGV4dCwgZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXY7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKikgJmRldik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IGRldiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBkZXZpY2UgcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrIG9uRXJyb3I7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkVycm9yKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG9uRXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrRXJyb3JDb2RlS2V5LCAmZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGVycm9yIGNvZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25FcnJvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkVycm9yKShjb250ZXh0LCBkZXYsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Nlc3Npb25TcEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXNzaW9uIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24oc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVTZXNzaW9uKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMucHVzaChzZXNzaW9uKTsKKyAgICAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0U3AgPSBudWxscHRyOworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwID0gc3RhdGljX2Nhc3Q8Q2FwdHVyZVJlcXVlc3QqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrIG9uU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHN0YXRlIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TdGF0ZSkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtUaW1lU3RhbXBLZXksICZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBwaHlzaWNhbFJlc3VsdEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0LT5tUGh5c2ljYWxSZXN1bHRJbmZvOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QUNhbWVyYU1ldGFkYXRhPj4gcGh5c2ljYWxNZXRhZGF0YUNvcHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbFJlc3VsdC0+bUZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHkucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVGYWlsdXJlKj4oZmFpbHVyZVNwLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG9uU2VxRW5kOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUVuZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxRW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUVuZCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25TZXFBYm9ydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFBYm9ydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxQWJvcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxQWJvcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBvbkJ1ZmZlckxvc3Q7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgYnVmZmVyIGxvc3QgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25CdWZmZXJMb3N0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKikgJmFudyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbmF0aXZlX2hhbmRsZV90ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhsY2JzKTsKKworICAgIGlmIChsY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIsCisgICAgICAgICAgICBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVzdWx0RXh0cmFzLmJ1cnN0SWQpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW1lcmEgaXMgZGlzY29ubmVjdGVkLCBjbG9zZSB0aGUgc2Vzc2lvbiBhbmQgZXhwZWN0IG5vIG1vcmUgY2FsbGJhY2tzCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRGlzY29ubmVjdGVkLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBlcnJvciBmcm9tIGNhbWVyYSBkZXZpY2U6ICVkIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhpcyBzd2l0Y2ggc2luY2UgdGhpcyBibG9jayBtaWdodCBiZSBlbmNvdW50ZXJlZCB3aXRoCisgICAgICAgICAgICAvLyBtb3JlIHRoYW4ganVzdCAyIHN0YXRlcy4gVGhlIGRlZmF1bHQgZmFsbHRocm91Z2ggY291bGQgaGF2ZSB1cworICAgICAgICAgICAgLy8gaGFuZGxpbmcgbW9yZSB1bm1hdGNoZWQgZXJyb3IgY2FzZXMuCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRXJyb3IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRXJyb3IpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrRXJyb3JDb2RlS2V5LCBlcnJvclZhbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgZGV2LT5vbkNhcHR1cmVFcnJvckxvY2tlZChlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBBTE9HVigiQ2FtZXJhIGlzIG5vdyBpZGxlIik7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUlkbGUpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBpbiBpZGxlIHN0YXRlLiBQb3NzaWJseSBvdGhlciB0aHJlYWQgZGlkIHdhaXRVbnRpbElkbGUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgib25EZXZpY2VJZGxlIHNlbmRpbmcgc3RhdGUgY2IiKTsKKyAgICAgICAgaWYgKGRldi0+bUJ1c3lTZXNzaW9uICE9IGRldi0+bUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgc3AgZmlyc3Qgc28gdGhlIHNlc3Npb24gZGVzdHJ1Y3RvciBjYW4KKyAgICAgICAgLy8gb25seSBoYXBwZW4gb24gaGFuZGxlciB0aHJlYWQgKHdoZXJlIHdlIGRvbid0IGhvbGQgZGV2aWNlL3Nlc3Npb24gbG9jaykKKyAgICAgICAgZGV2LT5tQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgZGV2LT5tSWRsZSA9IHRydWU7CisgICAgZGV2LT5tRmx1c2hpbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYm9vbCAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IGRldi0+bVBhcnRpYWxSZXN1bHRDb3VudCk7CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBBTE9HVigiU2VxSWQgJWQgZnJhbWUgJSIgUFJJZDY0ICIgcmVzdWx0IGFycml2ZS4iLCBzZXF1ZW5jZUlkLCBmcmFtZU51bWJlcik7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgfQorCisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSkgeworICAgICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIGVhcmx5IHJldHVybiB0byBhdm9pZCBjYWxsYmFjayBzZW50IHRvIGNsb3NlZCBkZXZpY2VzCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5OworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocmVzdWx0TWV0YWRhdGEsCisgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwgJm1ldGFkYXRhQ29weSk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLCBkZXYtPm1TaGFkaW5nTWFwU2l6ZSwgLypkYXRhX2NvdW50Ki8yKTsKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsICZmcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IGxvY2FsUGh5c2ljYWxSZXN1bHQ7CisgICAgICAgIGxvY2FsUGh5c2ljYWxSZXN1bHQucmVzaXplKHBoeXNpY2FsUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsQ2FtZXJhSWQgPSBwaHlzaWNhbFJlc3VsdEluZm9zW2ldLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgJmxvY2FsUGh5c2ljYWxSZXN1bHRbaV0ucGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEgY291bGRuJ3QgYmUgY29udmVydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8obG9jYWxQaHlzaWNhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKAorICAgICAgICAgICAgICAgIGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sgPyBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0IDoga1doYXRDYXB0dXJlUmVzdWx0LAorICAgICAgICAgICAgICAgIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgcmVzdWx0KTsKKyAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlUHJvZ3Jlc3NlZCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCBwaHlzaWNhbFJlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICB9CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICBkZXYtPmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgIHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKworICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICBpZiAoc3RvcHBlZFNlcXVlbmNlSWQgPT0gcmVwZWF0aW5nU2VxdWVuY2VJZCkgeworICAgICAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIH0KKworICAgIGRldi0+Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6OnJlYWRPbmVSZXN1bHRNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIGZtcVNpemVPck1ldGFkYXRhLCBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIHsKKyAgICBpZiAobWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyIHx8IG1ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGJvb2wgY29udmVydGVkOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKGZtcVNpemVPck1ldGFkYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5yZXNpemUoZm1xU2l6ZU9yTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBib29sIHJlYWQgPSBtZXRhZGF0YVF1ZXVlLT5yZWFkKAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5kYXRhKCksIGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2xvbmUgaGVyZSA/CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoaENhbWVyYU1ldGFkYXRhLCBtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChmbXFTaXplT3JNZXRhZGF0YS5tZXRhZGF0YSgpLCBtZXRhZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1VOS05PV047Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTcxNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0FDQU1FUkFfREVWSUNFX0gKKyNkZWZpbmUgX0FDQU1FUkFfREVWSUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEZtcVNpemVPck1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKK3VzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIHV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyOwordXNpbmcgdXRpbHM6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgdXRpbHM6Ok91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyOworCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHsgfTsKKworLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsIHsKKyAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsTWV0YWRhdGE7Cit9OworCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBpbmZvLAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcikgOgorICAgICAgICBtUGh5c2ljYWxSZXN1bHRJbmZvKGluZm8pLCBtRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIpIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCitjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpOworICAgIH5DYW1lcmFEZXZpY2UoKTsKKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFJZC5jX3N0cigpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0OworCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOworCisgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKKyAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgSUNhbWVyYURldmljZUNhbGxiYWNrIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgU2VydmljZUNhbGxiYWNrKENhbWVyYURldmljZSogZGV2aWNlKSA6IG1EZXZpY2UoZGV2aWNlKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlRXJyb3IoRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcih1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgb3ZlcnJpZGU7CisgICAgICBwcml2YXRlOgorICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmVhZE9uZVJlc3VsdE1ldGFkYXRhKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLCBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpOworICAgICAgICBjb25zdCB3cDxDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CisgICAgfTsKKyAgICBpbmxpbmUgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBnZXRTZXJ2aWNlQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtU2VydmljZUNhbGxiYWNrOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgdm9pZCBzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSk7CisKKyAgICBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgaW5saW5lIEFDYW1lcmFEZXZpY2UqIGdldFdyYXBwZXIoKSBjb25zdCB7IHJldHVybiBtV3JhcHBlcjsgfTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CisKKyAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKKyAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbik7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorCisgICAgY2FtZXJhX3N0YXR1c190IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CisKKyAgICB2b2lkIGFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICAvLyBTaW5jZSB0aGlzIHdyaXRlcyB0byBJQ2FtZXJhRGV2aWNlVXNlcidzIGZtcSwgY2xpZW50cyBtdXN0IHRha2UgY2FyZSB0aGF0OgorICAgIC8vICAgYSkgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc2VyaWFsbHkuCisgICAgLy8gICBiKSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhY2NvcmRhbmNlIHdpdGggSUNhbWVyYURldmljZVVzZXIuc3VibWl0UmVxdWVzdExpc3QsCisgICAgLy8gICAgICBvdGhlcndpc2UsIHRoZSB3cm9uZyBjYXB0dXJlIHJlcXVlc3QgbWlnaHQgaGF2ZSB0aGUgd3Jvbmcgc2V0dGluZ3MKKyAgICAvLyAgICAgIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOworCisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOworICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CisKKyAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKKyAgICAvLyBBbHdheXMgZ3JhYiBkZXZpY2UgbG9jayBiZWZvcmUgZ3JhYmJpbmcgc2Vzc2lvbiBsb2NrCisgICAgdm9pZCBsb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpIGNvbnN0IHsgbURldmljZUxvY2subG9jaygpOyB9OworICAgIHZvaWQgdW5sb2NrRGV2aWNlKCkgY29uc3QgeyBtRGV2aWNlTG9jay51bmxvY2soKTsgfTsKKworICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQorICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKworICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCisgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKKyAgICBjb25zdCBoaWRsX3N0cmluZyBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKKyAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAorICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOworICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOworCisgICAgLy8gc3RyZWFtIGlkIC0+IHBhaXIgb2YgKEFDYW1lcmFXaW5kb3dUeXBlKiBmcm9tIGFwcGxpY2F0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uIHVzZWQgZm9yCisgICAgLy8gY2FtZXJhIHNlcnZpY2UpCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBtQ29uZmlndXJlZE91dHB1dHM7CisKKyAgICAvLyBUT0RPOiBtYXliZSBhIGJvb2wgd2lsbCBzdWZmaWNlIGZvciBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICBzdGQ6OmF0b21pY19ib29sIG1DbG9zaW5nOworICAgIGlubGluZSBib29sIGlzQ2xvc2VkKCkgeyByZXR1cm4gbUNsb3Npbmc7IH0KKworICAgIGJvb2wgbUluRXJyb3IgPSBmYWxzZTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgbUVycm9yID0gQUNBTUVSQV9PSzsKKyAgICB2b2lkIG9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICBib29sIG1JZGxlID0gdHJ1ZTsKKyAgICAvLyBUaGlzIHdpbGwgYXZvaWQgYSBidXN5IHNlc3Npb24gYmVpbmcgZGVsZXRlZCBiZWZvcmUgaXQncyBiYWNrIHRvIGlkbGUgc3RhdGUKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1CdXN5U2Vzc2lvbjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBtUmVtb3RlOworCisgICAgLy8gTG9vcGVyIHRocmVhZCB0byBoYW5kbGUgY2FsbGJhY2sgdG8gYXBwCisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyOworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICAvLyBEZXZpY2Ugc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0T25EaXNjb25uZWN0ZWQsICAgLy8gb25EaXNjb25uZWN0ZWQKKyAgICAgICAga1doYXRPbkVycm9yLCAgICAgICAgICAvLyBvbkVycm9yCisgICAgICAgIC8vIFNlc3Npb24gc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKKyAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Vycm9yQ29kZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXNzaW9uU3BLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKKyAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICB9OworICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKKyAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5PX0ZSQU1FU19DQVBUVVJFRCA9IC0xOworICAgIGNsYXNzIEZyYW1lTnVtYmVyVHJhY2tlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIC8vIFRPRE86IENhbGxlZCBpbiBvblJlc3VsdFJlY2VpdmVkIGFuZCBvbkNhcHR1cmVFcnJvckxvY2tlZAorICAgICAgICB2b2lkIHVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKTsKKyAgICAgICAgaW5saW5lIGludDY0X3QgZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKSB7IHJldHVybiBtQ29tcGxldGVkRnJhbWVOdW1iZXI7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlKCk7CisgICAgICAgIHZvaWQgdXBkYXRlQ29tcGxldGVkRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgaW50NjRfdCBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBOT19GUkFNRVNfQ0FQVFVSRUQ7CisgICAgICAgIExpc3Q8aW50NjRfdD4gbVNraXBwZWRGcmFtZU51bWJlcnM7CisgICAgICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1GdXR1cmVFcnJvclNldDsKKyAgICB9OworICAgIEZyYW1lTnVtYmVyVHJhY2tlciBtRnJhbWVOdW1iZXJUcmFja2VyOworCisgICAgdm9pZCBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKworICAgIC8vIE1pc2MgdmFyaWFibGVzCisgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFEZXZpY2Ugb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKKyAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorCisgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykKK3sKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKKyAgICBzdGQ6OnZlY3RvcjxmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiByZXF1ZXN0c1Y7CisgICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIGFmdGVyIHN1Ym1pdFJlcXVlc3RMaXN0IGlzIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUgbWlnaHQgaGF2ZSByZW1vdmVkIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgLy8gbWV0YWRhdGEuIFRoZXJlZm9yZSB3ZSBzaW1wbHkgYWRkIHRoZSBtZXRhZGF0YSB0byBpdHMgd3JhcHBlciBjbGFzcywKKyAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyLgorICAgICAgICBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBjYXB0dXJlIHJlcXVlc3QgdG8gaW50ZXJuYWwgZm9ybWF0IGZhaWx1cmUhIHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2sodXRpbHM6OmNvbnZlcnRUb0hpZGwocmVxLmdldCgpKSk7CisgICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKyAgICB9CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdWJtaXRJbmZvIGluZm87CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5mb10oYXV0byBzLCBhdXRvICZzdWJtaXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc3VibWl0SW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGZvciBzdWJtaXRSZXF1ZXN0TGlzdCBjYWxsOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSBpbmZvLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGluZm8ubGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKKy8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIHZlbmRvciBhdmFpbGFibGUgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZCBieQorICogZGVmYXVsdCBIQUwgaW1wbGVtZW50YXRpb24gY29kZSBhcyB3ZWxsLgorICovCitjbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKTsKK307CisKK3N0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gJnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpIHsKKyAgICBpbnQgdGFnQ291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgdGFnQ291bnQgKz0gdnRzW3NdLnRhZ3Muc2l6ZSgpOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3IgdGFnIHNlY3Rpb25zIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiB0YWdBcnJheTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhZ0FycmF5LnJlc2l6ZSh0YWdDb3VudCkgIT0gdGFnQ291bnQsCisgICAgICAgICAgICAiJXM6IHRvbyBtYW55ICgldSkgdmVuZG9yIHRhZ3MgZGVmaW5lZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKworICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1TZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKyAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKKyAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuZW1wbGFjZSh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVzYy0+bVNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOworICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworCisgICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKKyAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7CisgICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOworICAgIH0KKworICAgICpkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbCYKK0NhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCogaW5zdGFuY2UgPSBzSW5zdGFuY2U7CisgICAgaWYgKGluc3RhbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FtZXJhTWFuYWdlckdsb2JhbCgpOworICAgICAgICBzSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuICppbnN0YW5jZTsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbDo6fkNhbWVyYU1hbmFnZXJHbG9iYWwoKSB7CisgICAgLy8gY2xlYXIgc0luc3RhbmNlIHNvIG5leHQgZ2V0SW5zdGFuY2UgY2FsbCBrbm93cyB0byBjcmVhdGUgYSBuZXcgb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzTG9jayk7CisgICAgc0luc3RhbmNlID0gbnVsbHB0cjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIpOworICAgIH0KKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c2V0dXBWZW5kb3JUYWdzKCkgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBwcm92aWRlcklkc0FuZFZ0czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhbJnN0YXR1cywgJnByb3ZpZGVySWRzQW5kVnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZJZHNBbmRWdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkc0FuZFZ0cyA9IElkc0FuZFZ0czsgfSk7CisKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBWZW5kb3JUYWdTZWN0aW9ucyAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENvbnZlcnQgZWFjaCBwcm92aWRlcnMgVmVuZG9yVGFnU2VjdGlvbnMgaW50byBhIFZlbmRvclRhZ0Rlc2NyaXB0b3IgYW5kCisgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZQorICAgIGZvciAoYXV0byAmcHJvdmlkZXJJZEFuZFZ0cyA6IHByb3ZpZGVySWRzQW5kVnRzKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGlmIChIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHByb3ZpZGVySWRBbmRWdHMudmVuZG9yVGFnU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZW5kb3JUYWdEZXNjcmlwdG9yKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IGZyb20gSGlkbDogVmVuZG9yVGFnRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVySWRBbmRWdHMucHJvdmlkZXJJZCwgdmVuZG9yVGFnRGVzY3JpcHRvcik7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncworICAgICAgICBpZiAoIXNldHVwVmVuZG9yVGFncygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGMgOiBjYW1lcmFTdGF0dXNlcykgeworICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKSB7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICAodm9pZCkgd2hvOworICAgIEFMT0dFKCJDYW1lcmEgc2VydmljZSBiaW5kZXJEaWVkISIpOworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKGNtLT5tTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgICAgICAgIH0KKyAgICAgICAgY20tPm1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyByZS1jb25uZWN0IGNhbGwgaGVyZT8KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6cmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIGF1dG8gcGFpciA9IG1DYWxsYmFja3MuaW5zZXJ0KGNiKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgY2FsbGJhY2tzIGlmIGNhbGxiYWNrIGlzIG5ld2x5IHJlZ2lzdGVyZWQKKyAgICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2IgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlIDogY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2FsbGJhY2stPmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4qIGNhbWVyYUlkcykgeworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgZm9yKGF1dG8mIGRldmljZVN0YXR1cyA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgaWYgKGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQgfHwKKyAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFJZHMtPnB1c2hfYmFjayhkZXZpY2VTdGF0dXMuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6aXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoa0NhbWVyYUlkS2V5LCAmY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIElEISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1c0FuZElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgc3RhdHVzIGNoYW5nZS4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKHN0YXR1c0FuZElkKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWRMb2NrZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIGhpZGxfc3RyaW5nIGNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQ7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0FuZElkLmRldmljZVN0YXR1czsKKyAgICBpZiAoIXZhbGlkU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG9sZFN0YXR1cyA9IGZpcnN0U3RhdHVzID8KKyAgICAgICAgICAgIHN0YXR1cyA6IC8vIGZpcnN0IHN0YXR1cworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF07CisKKyAgICBpZiAoIWZpcnN0U3RhdHVzICYmCisgICAgICAgICAgICBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID09IGlzU3RhdHVzQXZhaWxhYmxlKG9sZFN0YXR1cykpIHsKKyAgICAgICAgLy8gTm8gc3RhdHVzIHVwZGF0ZS4gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBzdGF0dXM7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiRnAgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICBjYi5tQXZhaWxhYmxlIDogY2IubVVuYXZhaWxhYmxlOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8qKgorICogQUNhbWVyYU1hbmdlciBJbXBsZW1lbnRhdGlvbgorICovCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gaWRMaXN0OworICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhSWRMaXN0KCZpZExpc3QpOworCisgICAgaW50IG51bUNhbWVyYXMgPSBpZExpc3Quc2l6ZSgpOworICAgIEFDYW1lcmFJZExpc3QgKm91dCA9IG5ldyBBQ2FtZXJhSWRMaXN0OworICAgIGlmICghb3V0KSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgb3V0LT5udW1DYW1lcmFzID0gbnVtQ2FtZXJhczsKKyAgICBvdXQtPmNhbWVyYUlkcyA9IG5ldyBjb25zdCBjaGFyKltudW1DYW1lcmFzXTsKKyAgICBpZiAoIW91dC0+Y2FtZXJhSWRzKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlkTGlzdFtpXS5jX3N0cigpOworICAgICAgICBzaXplX3QgZHN0U2l6ZSA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciogZHN0ID0gbmV3IGNoYXJbZHN0U2l6ZV07CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgc3RybGNweShkc3QsIHNyYywgZHN0U2l6ZSk7CisgICAgICAgIG91dC0+Y2FtZXJhSWRzW2ldID0gZHN0OworICAgIH0KKyAgICAqY2FtZXJhSWRMaXN0ID0gb3V0OworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitBQ2FtZXJhTWFuYWdlcjo6ZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgeworICAgIGlmIChjYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkczsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgY2FtZXJhSWRMaXN0OworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+ICpjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3TWV0YWRhdGE7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0KKyAgICAgICAgY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJhd01ldGFkYXRhXSAoYXV0byBzICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgIHJhd01ldGFkYXRhLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fQ0hBUkFDVEVSSVNUSUNTKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6b3BlbkNhbWVyYSgKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKHJhd0NoYXJzKSk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworCisgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCisgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFRPRE86IENvbnZlcnQgc2VydmljZVJldCB0byBjYW1lcmFfc3RhdHVzX3QKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGRldmljZVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCEgcmVtb3RlIGRldmljZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgZGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UoZGV2aWNlUmVtb3RlKTsKKyAgICBkZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgKm91dERldmljZSA9IGRldmljZTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworQUNhbWVyYU1hbmFnZXI6On5BQ2FtZXJhTWFuYWdlcigpIHsKKworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxMzY1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BQ0FNRVJBX01BTkFHRVJfSAorI2RlZmluZSBfQUNBTUVSQV9NQU5BR0VSX0gKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIElCYXNlID0gYW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLyoqCisgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCisgKiBpbnN0YW5jZXMuIENyZWF0ZWQgd2hlbiBmaXJzdCBBQ2FtZXJhTWFuYWdlciBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2hlbgorICogYWxsIEFDYW1lcmFNYW5hZ2VyIGluc3RhbmNlcyBhcmUgZGVsZXRlZC4KKyAqCisgKiBUT0RPOiBtYXliZSBDYW1lcmFNYW5hZ2VyR2xvYmFsIGlzIGJldHRlciBzdWl0ZWQgaW4gbGliY2FtZXJhY2xpZW50PworICovCitjbGFzcyBDYW1lcmFNYW5hZ2VyR2xvYmFsIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYU1hbmFnZXJHbG9iYWwmIGdldEluc3RhbmNlKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGdldENhbWVyYVNlcnZpY2UoKTsKKworICAgIHZvaWQgcmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY2FtZXJhIElEcyB0aGF0IHN1cHBvcnQgY2FtZXJhMgorICAgICAqLworICAgIHZvaWQgZ2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiAqY2FtZXJhSWRzKTsKKworICBwcml2YXRlOgorICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAga0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBNdXRleCAgICAgICAgICAgICAgbUxvY2s7CisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBEZWF0aE5vdGlmaWVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobyk7CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOworCisgICAgY2xhc3MgQ2FtZXJhU2VydmljZUxpc3RlbmVyIGZpbmFsIDogcHVibGljIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKKyAgICAvLyBXcmFwcGVyIG9mIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyBzbyB3ZSBjYW4gc3RvcmUgaXQgaW4gc3RkOjpzZXQKKyAgICBzdHJ1Y3QgQ2FsbGJhY2sgeworICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CisgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCisgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUNvbnRleHQoY2FsbGJhY2stPmNvbnRleHQpIHt9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0ID09IG90aGVyLm1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOworICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtQXZhaWxhYmxlOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtVW5hdmFpbGFibGU7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgIH07CisgICAgc3RkOjpzZXQ8Q2FsbGJhY2s+IG1DYWxsYmFja3M7CisKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2sKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QUxvb3Blcj4gICAgICAgICBtQ2JMb29wZXI7IC8vIExvb3BlciB0aHJlYWQgd2hlcmUgY2FsbGJhY2tzIGFjdHVhbGx5IGhhcHBlbiBvbgorCisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIGJvb2wgc2V0dXBWZW5kb3JUYWdzKCk7CisKKyAgICAvLyBVdGlscyBmb3Igc3RhdHVzCisgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgorICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCisgICAgc3RydWN0IENhbWVyYUlkQ29tcGFyYXRvciB7CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBoaWRsX3N0cmluZyYgYSwgY29uc3QgaGlkbF9zdHJpbmcmIGIpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgYm9vbCBhSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGEuY19zdHIoKSwgJmFVaW50KTsKKyAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLmNfc3RyKCksICZiVWludCk7CisKKyAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhVWludCA8IGJVaW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW1wbGUgc3RyaW5nIGNvbXBhcmUgaWYgYm90aCBpZCBhcmUgbm90IHVpbnQKKyAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXAgY2FtZXJhX2lkIC0+IHN0YXR1cworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBDYW1lcmFEZXZpY2VTdGF0dXMsIENhbWVyYUlkQ29tcGFyYXRvcj4gbURldmljZVN0YXR1c01hcDsKKworICAgIC8vIEZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisgICAgc3RhdGljIE11dGV4IHNMb2NrOworICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBzSW5zdGFuY2U7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCgpIHt9OworICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhTWFuYWdlciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKKyAgICBBQ2FtZXJhTWFuYWdlcigpIDoKKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQorICAgIH07CisgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKK307CisKKyNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKK307CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZDQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYVZlbmRvclV0aWxzIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0Citjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCkgeworICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgaENhcHR1cmVSZXF1ZXN0OworICAgIGhDYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgIGhDYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkczsKKyAgICByZXR1cm4gaENhcHR1cmVSZXF1ZXN0OworfQorCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pIHsKKyAgICBIUm90YXRpb24gaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMDsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhSb3RhdGlvbjsKK30KKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpidWZmZXIgPSAoY2FtZXJhX21ldGFkYXRhX3QqKShtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICpyYXdNZXRhZGF0YSA9IGJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBjYWxsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlJFQ09SRDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6Ok1BTlVBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpQUkVWSUVXOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDQU1FUkFfT0s7CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9NQVhfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0FCTEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9QRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChuaDEtPm51bUZkcyAhPTAgfHwgbmgyLT5udW1GZHMgIT0wKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHdpbmRvdyBuYXRpdmUgaGFuZGxlcyBiZWluZyBjb21wYXJlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPnZlcnNpb24gIT0gbmgyLT52ZXJzaW9uIHx8IG5oMS0+bnVtRmRzICE9IG5oMi0+bnVtRmRzIHx8CisgICAgICAgIG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBuaDEtPm51bUludHMgPCBuaDItPm51bUludHM7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZiAobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIG5oMS0+ZGF0YVtpXSA8IG5oMi0+ZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obmgxLCBuaDIpICYmICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZXMxW2ldLCBoYW5kbGVzMltpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVzMS5zaXplKCkgPCBoYW5kbGVzMi5zaXplKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUxID0gaGFuZGxlczFbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMiA9IGhhbmRsZXMyW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlMSwgaGFuZGxlMikpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGhhbmRsZTEsIGhhbmRsZTIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTAwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisKKyNpZm5kZWYgQ0FNRVJBX05ES19WRU5ET1JfSAorI2RlZmluZSBDQU1FUkFfTkRLX1ZFTkRPUl9ICisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFJvdGF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhhdCBDYXB0dXJlUmVxdWVzdCBjYW4gYmUgc3RvcmVkIGJ5IHNwPD4KK3N0cnVjdCBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBtQ2FwdHVyZVJlcXVlc3Q7CisgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CisgIC8vUGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlLCBzaW5jZSB0aGUgY2FwdHVyZSByZXF1ZXN0CisgIC8vbWlnaHQgbm90IGNvbnRhaW4gaXQuIFRoYXQncyBzaW5jZSwgZm1xIG1pZ2h0IGhhdmUgY29uc3VtZWQgaXQuCisgIGhpZGxfdmVjPFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzOworfTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuIGFuZCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGUgbmF0aXZlX2hhbmRsZV90IGNhbiBiZSBjb21wYXJlZCB3aXRoICBpdHMgY29udGVudHMgaW5zdGVhZAorLy8gb2YganVzdCByYXcgcG9pbnRlciBjb21wYXJpc29ucy4KK3N0cnVjdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1XaW5kb3cgPSBudWxscHRyOworCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcihuYXRpdmVfaGFuZGxlX3QgKm5oKSA6IG1XaW5kb3cobmgpIHsgfQorCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworfTsKKworLy8gV3JhcHBlciBhcm91bmQgT3V0cHV0Q29uZmlndXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgc2luY2UgSElETAorLy8gT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBhbmQgbWFya2VkIGZpbmFsLiBUaGVyZWZvcmUsIG9wZXJhdG9yCisvLyBvdmVybG9hZHMgb3V0c2lkZSB0aGUgY2xhc3MsIHdpbGwgbm90IGdldCBwaWNrZWQgYnkgY2xhbmcgd2hpbGUgdHJ5aW5nIHRvCisvLyBzdG9yZSBPdXRwdXRDb25maWd1cmF0aW9uIGluIG1hcHMvc2V0cy4KK3N0cnVjdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKworICAgIG9wZXJhdG9yIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIDogbU91dHB1dENvbmZpZ3VyYXRpb24oKG91dHB1dENvbmZpZ3VyYXRpb24pKSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gc2VsZi5yb3RhdGlvbiA9PSBvdGhlci5yb3RhdGlvbiAmJiBzZWxmLndpbmRvd0dyb3VwSWQgPT0gb3RoZXIud2luZG93R3JvdXBJZCAmJgorICAgICAgICAgICAgICAgIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5waHlzaWNhbENhbWVyYUlkICYmIHNlbGYud2lkdGggPT0gb3RoZXIud2lkdGggJiYKKyAgICAgICAgICAgICAgICBzZWxmLmhlaWdodCA9PSBvdGhlci5oZWlnaHQgJiYgc2VsZi5pc0RlZmVycmVkID09IG90aGVyLmlzRGVmZXJyZWQgJiYKKyAgICAgICAgICAgICAgICBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgaWYgKHNlbGYud2luZG93R3JvdXBJZCAhPSBvdGhlci53aW5kb3dHcm91cElkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aW5kb3dHcm91cElkIDwgb3RoZXIud2luZG93R3JvdXBJZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLndpZHRoICE9IG90aGVyLndpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aWR0aCA8IG90aGVyLndpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaGVpZ2h0ICE9IG90aGVyLmhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVpZ2h0IDwgb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucm90YXRpb24gIT0gb3RoZXIucm90YXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VsZi5yb3RhdGlvbikgPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3RoZXIucm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaXNEZWZlcnJlZCAhPSBvdGhlci5pc0RlZmVycmVkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pc0RlZmVycmVkIDwgb3RoZXIuaXNEZWZlcnJlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgIT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA8IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIpICYmICEoKnRoaXMgPCBvdGhlcik7CisgICAgfQorfTsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCk7CisKK0hSb3RhdGlvbiBjb252ZXJ0VG9IaWRsKGludCByb3RhdGlvbik7CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSk7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCk7CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cyk7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDQU1FUkFfTkRLX1ZFTkRPUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMDhiMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUltYWdlUmVhZGVyVmVuZG9yVGVzdCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUVycm9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGludCBrRHVtbXlGZW5jZUZkID0gLTE7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRVcyA9IDEwMCAqIDEwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRSZXRyeSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihjb25zdCBjaGFyKiBpZCwgQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIG1JbWdSZWFkZXJBbncobnVsbHB0ciksIG1DYW1lcmFJZChpZCksIG1DYW1lcmFNYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgIH07CisgICAgaW50IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMpIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGluaXRpYWxpemUgY2FtZXJhIGJlZm9yZSBpbWFnZSByZWFkZXIgZ2V0IGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSXNDYW1lcmFSZWFkeSkgeworICAgICAgICAgICAgQUxPR0UoImluaXRDYW1lcmEgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmV0OworICAgICAgICBtSW1nUmVhZGVyQW53ID0gaW1nUmVhZGVyQW53OworCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmEobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1EZXZpY2VDYiwgJm1EZXZpY2UpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBjYW1lcmEsIHJldD0lZCwgbURldmljZT0lcC4iLCByZXQsIG1EZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlKCZtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIHNlc3Npb25PdXRwdXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uUGh5c2ljYWxPdXRwdXRfY3JlYXRlKHBoeXNpY2FsU3RyZWFtLmFudywKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTdHJlYW0ucGh5c2ljYWxDYW1lcmFJZCwgJnNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQobU91dHB1dHMsIHNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHRyYU91dHB1dHMucHVzaF9iYWNrKHNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgYXQgbW9zdCBvbmUgcGh5c2ljYWwgc3RyZWFtIHBlciBwaHlzaWNhbCBjYW1lcmEuCisgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KG1EZXZpY2UsIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXRUYXJnZXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LCAmb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXFFeHRyYU91dHB1dHMucHVzaF9iYWNrKG91dHB1dFRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IHRydWU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIG91dHB1dFRhcmdldCA6IG1SZXFFeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIG1SZXFFeHRyYU91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBleHRyYU91dHB1dCA6IG1FeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKGV4dHJhT3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtT3V0cHV0cykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUobU91dHB1dHMpOworICAgICAgICAgICAgbU91dHB1dHMgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIGRldmljZQorICAgICAgICBpZiAobURldmljZSkgeworICAgICAgICAgICAgQUNhbWVyYURldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgICAgIG1EZXZpY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaW50IHRha2VQaWN0dXJlKCkgeworICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CisgICAgfQorCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZShtU2Vzc2lvbiwgJm1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAxLCAmbVN0aWxsUmVxdWVzdCwgJnNlcUlkKTsKKyAgICB9CisKKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzKGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZWQgY2FwdHVyZSBjYWxsYWJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZXZpY2VFcnJvcn07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7CisgICAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgICAgLy8gQ2FtZXJhIGRldmljZQorICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2UgPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgc2Vzc2lvbgorICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogbU91dHB1dHMgPSBudWxscHRyOworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhcHR1cmVTZXNzaW9uT3V0cHV0Kj4gbUV4dHJhT3V0cHV0czsKKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhbWVyYU91dHB1dFRhcmdldCo+IG1SZXFFeHRyYU91dHB1dHM7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlcjsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhICopIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYUlkczsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIG1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqLCBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cykgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocGh5c2ljYWxSZXN1bHRDb3VudCwgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbENhbWVyYUlkc1tpXSAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbFJlc3VsdHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZChjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBmcmFtZU51bWJlciBhbmQgc2Vuc29yVGltZXN0YW1wIGV4aXN0IGluIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbnRyeS5jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdHNbaV0sIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUCwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworfTsKKworY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzeW5jKQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVXNhZ2UodXNhZ2UpLAorICAgICAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSwKKyAgICAgICAgICBtQXN5bmMoYXN5bmMpIHt9CisKKyAgICB+SW1hZ2VSZWFkZXJUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbmF0aXZlX2hhbmRsZV90X3JlbGVhc2Ugb24gaW1hZ2VSZWFkZXJBbncKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBpbml0SW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyICE9IG51bGxwdHIgfHwgbUltZ1JlYWRlckFudyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlLWluaXRhbGl6ZSBpbWFnZSByZWFkZXIsIG1JbWdSZWFkZXI9JXAsIG1JbWdSZWFkZXJBbnc9JXAiLCBtSW1nUmVhZGVyLAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbVVzYWdlLCBtTWF4SW1hZ2VzLCAmbUltZ1JlYWRlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LCBtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW1hZ2UgYXZhaWxhYmxlIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyRGV0YWNoZWRDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBidWZmZXIgZGV0YWNoaW5nIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKG1JbWdSZWFkZXIsICZtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBuYXRpdmVfaGFuZGxlX3QgZnJvbSBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlckFudz0lcC4iLCByZXQsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorCisgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlZEltYWdlQ291bnQ7CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgICAgIEFJbWFnZSogb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIEFJbWFnZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGdvZXMgb3V0IG9mCisgICAgICAgIC8vIHNjb3BlLgorICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFt0aGlzXShBSW1hZ2UqIGltZykgeworICAgICAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGVBc3luYyhpbWcsIGtEdW1teUZlbmNlRmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlKGltZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgIGludCBvdXRGZW5jZUZkID0gMDsKKyAgICAgICAgICAgIC8vIFZlcml0eSB0aGF0IG91dEZlbmNlRmQncyB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgYnkKKyAgICAgICAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMuCisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKHJlYWRlciwgJm91dEltYWdlLCAmb3V0RmVuY2VGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShyZWFkZXIsICZvdXRJbWFnZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIG91dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZvdXRCdWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxkIHRvIGdldCBoYXJkd2FyZSBidWZmZXIsIHJldD0lZCwgb3V0QnVmZmVyPSVwLiIsIHJldCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVsZWFzZSBBSGFyZHdhcmVCdWZmZXIsIHNpbmNlIHdlIGRvbid0IGFjcXVpcmUgYWRkaXRpb25hbAorICAgICAgICAvLyByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIG91dERlc2M7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShvdXRCdWZmZXIsICZvdXREZXNjKTsKKyAgICAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgICAgIGludDMyX3QgYnVmZmVyV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBidWZmZXJIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLmhlaWdodCk7CisKKyAgICAgICAgQUltYWdlX2dldFdpZHRoKG91dEltYWdlLCAmaW1hZ2VXaWR0aCk7CisgICAgICAgIEFJbWFnZV9nZXRIZWlnaHQob3V0SW1hZ2UsICZpbWFnZUhlaWdodCk7CisgICAgICAgIGlmIChpbWFnZVdpZHRoICE9IG1XaWR0aCB8fCBpbWFnZUhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzU2NSB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNiB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWTgpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIG91dHB1dCBidWZmZXIgZGltZW5zaW9uIGZvciBjZXJ0YWluIGZvcm1hdHMuIERvbid0IGRvIHRoaXMgZm9yIGJsb2IgYmFzZWQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMuCisgICAgICAgICAgICBpZiAoYnVmZmVyV2lkdGggIT0gbVdpZHRoIHx8IGJ1ZmZlckhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvdXREZXNjLnVzYWdlICYgbVVzYWdlKSAhPSBtVXNhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgdXNhZ2U6IGFjdHVhbCAoJSIgUFJJdTY0ICIpLCBleHBlY3RlZCAoJSIgUFJJdTY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG91dERlc2MudXNhZ2UsIG1Vc2FnZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltZy5nZXQoKSwgMCwgJmRhdGEsICZkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTikgeworICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIENQVV9SRUFEX09GVEVOIHVzYWdlIGJpdHMsIHdlIGNhbiBsb2NrIHRoZSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9MT0NLX0lNQUdFIHx8IGRhdGEgIT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgaW5jcmVhc2UgbUFjcXVpcmVkSW1hZ2VDb3VudCBpZiBhbGwgY2hlY2tzIHBhc3MuCisgICAgICAgIG1BY3F1aXJlZEltYWdlQ291bnQrKzsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+KG9iaik7CisgICAgICAgIHRoaXotPkhhbmRsZUltYWdlQXZhaWxhYmxlKHJlYWRlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBvbkJ1ZmZlclJlbW92ZWQodm9pZCogLypvYmoqLywgQUltYWdlUmVhZGVyKiAvKnJlYWRlciovLCBBSGFyZHdhcmVCdWZmZXIqIC8qYnVmZmVyKi8pIHsKKyAgICAgICAgLy8gTm8tb3AsIGp1c3QgdG8gY2hlY2sgdGhlIGxpc3RlbmVyIGNhbiBiZSBzZXQgcHJvcGVybHkuCisgICAgfQorCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Gb3JtYXQ7CisgICAgdWludDY0X3QgbVVzYWdlOworICAgIGludDMyX3QgbU1heEltYWdlczsKKyAgICBib29sIG1Bc3luYzsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIGludCBtQWNxdWlyZWRJbWFnZUNvdW50ezB9OworCisgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOworCisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbVJlYWRlckF2YWlsYWJsZUNie3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbVJlYWRlckRldGFjaGVkQ2J7dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKK307CisKKworY2xhc3MgQUltYWdlUmVhZGVyVmVuZG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSByaWdvcm91cyB0ZXN0cyBmb3IgdmVuZG9yIHRhZ3MKKyAgICAgICAgQVNTRVJUX05FKFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKSwgbnVsbHB0cik7CisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzIDwgMSkgeworICAgICAgICAgICAgQUxPR1coIkRldmljZSBoYXMgbm8gY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdGFrZVBpY3R1cmVzKGNvbnN0IGNoYXIqIGlkLCB1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5pbml0SW1hZ2VSZWFkZXIoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihpZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZS5nZXROYXRpdmVXaW5kb3coKSwge30pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBoZWxwZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlKCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdGFrZSBwaWN0dXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQgJiYKKyAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKKyAgICB9CisKKyAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKKyAgICAgICAgZm9yIChhdXRvJiByZWFkZXJVc2FnZSA6CisgICAgICAgICAgICAge0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn0pIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyTWF4SW1hZ2VzIDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJBc3luYyA6IHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwaWN0dXJlQ291bnQgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFrZVBpY3R1cmVzKGlkLCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUZXN0IHRha2VQaWN0dXJlcyBmYWlsZWQgZm9yIHRlc3QgY2FzZSB1c2FnZT0lIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYW1lcmEgbWFuYWdlcgorICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisKKyAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLCBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IGNhcCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gZm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krM10gPT0gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsxXSA9PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzJdID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKGNvbnN0IGNoYXIgKipjYW1lcmFJZCwKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSoqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KiBjYW5kaWRhdGVQaHlzaWNhbElkcykgeworICAgICAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSBsb2dpY2FsIGNhbWVyYQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSwgc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICBBU1NFUlRfTkUoKnN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgaWYgKCFpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoKnN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkpIHsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZSgqc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICpzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHJldHVybmVkIHBoeXNpY2FsIGNhbWVyYSBJZHMgYXJlIHZhbGlkCisgICAgICAgICAgICBzaXplX3QgcGh5c2ljYWxDYW1lcmFJZENudCA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiBwaHlzaWNhbENhbWVyYUlkcyA9IG51bGxwdHI7CisgICAgICAgICAgICBib29sIGlzTG9naWNhbENhbWVyYSA9IEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYSgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYUlkQ250LCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNMb2dpY2FsQ2FtZXJhKTsKKyAgICAgICAgICAgIEFTU0VSVF9HRShwaHlzaWNhbENhbWVyYUlkQ250LCAyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGh5c2ljYWxDYW1lcmFJZENudCAmJiBjYW5kaWRhdGVQaHlzaWNhbElkcy0+c2l6ZSgpIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0dUKHN0cmxlbihwaHlzaWNhbENhbWVyYUlkc1tqXSksIDApOworICAgICAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBwaHlzaWNhbENhbWVyYUlkc1tqXSwgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1NpemVTdXBwb3J0ZWRGb3JGb3JtYXQocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwga1Rlc3RJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICpjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqY2FtZXJhSWQgPSBudWxscHRyOworICAgICAgICByZXR1cm47CisgICAgfQorfTsKKworVEVTVF9GKEFJbWFnZVJlYWRlclZlbmRvclRlc3QsIENyZWF0ZVdpbmRvd05hdGl2ZUhhbmRsZSkgeworICAgIC8vIFdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGNhbWVyYS4KKyAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1swXTsKKyAgICBBU1NFUlRfVFJVRShjYW1lcmFJZCAhPSBudWxscHRyKTsKKworICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgY2FtZXJhSWQsICZzdGF0aWNNZXRhZGF0YSk7CisgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgQVNTRVJUX05FKHN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgIGJvb2wgaXNCQyA9IGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JBQ0tXQVJEX0NPTVBBVElCTEUpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworCisgICAgaWYgKCFpc0JDKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBCQUNLV0FSRF9DT01QQVRJQkxFLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUodGVzdFRha2VQaWN0dXJlc05hdGl2ZShjYW1lcmFJZCkpOworfQorCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7CisgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOworICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKCZjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGlmIChjYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIENvdWxkbid0IGZpbmQgbG9naWNhbCBjYW1lcmEgdG8gdGVzdAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGVzdCBzdHJlYW1pbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhCisgICAgdWludDY0X3QgcmVhZGVyVXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU47CisgICAgaW50MzJfdCByZWFkZXJNYXhJbWFnZXMgPSA4OworICAgIGJvb2wgcmVhZGVyQXN5bmMgPSBmYWxzZTsKKyAgICBjb25zdCBpbnQgcGljdHVyZUNvdW50ID0gNjsKKyAgICBzdGQ6OnZlY3RvcjxJbWFnZVJlYWRlclRlc3RDYXNlKj4gdGVzdENhc2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRlc3RDYXNlID0gbmV3IEltYWdlUmVhZGVyVGVzdENhc2UoCisgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jKTsKKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlLT5pbml0SW1hZ2VSZWFkZXIoKSwgMCk7CisgICAgICAgIHRlc3RDYXNlcy5wdXNoX2JhY2sodGVzdENhc2UpOworICAgIH0KKworICAgIENhbWVyYUhlbHBlciBjYW1lcmFIZWxwZXIoY2FtZXJhSWQsIG1DYW1lcmFNYW5hZ2VyKTsKKyAgICBzdGQ6OnZlY3RvcjxDYW1lcmFIZWxwZXI6OlBoeXNpY2FsSW1nUmVhZGVySW5mbz4gcGh5c2ljYWxJbWdSZWFkZXJJbmZvOworICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzBdLCB0ZXN0Q2FzZXNbMV0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLnB1c2hfYmFjayh7cGh5c2ljYWxDYW1lcmFJZHNbMV0sIHRlc3RDYXNlc1syXS0+Z2V0TmF0aXZlV2luZG93KCl9KTsKKworICAgIGludCByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZXNbMF0tPmdldE5hdGl2ZVdpbmRvdygpLCBwaHlzaWNhbEltZ1JlYWRlckluZm8pOworICAgIEFTU0VSVF9FUShyZXQsIDApOworCisgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgaXMgbm90IHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24uIEl0J3MgZWl0aGVyIGR1ZSB0byBjYW1lcmEgb24gIgorICAgICAgICAgICAgICAiYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgY2FtZXJhIG9uICIKKyAgICAgICAgICAgICAgImJvYXJkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZUxvZ2ljYWxDYW1lcmFQaWN0dXJlKCk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworICAgIH0KKworICAgIC8vIFNsZWVwIHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgIGlmICh0ZXN0Q2FzZXNbMF0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMF0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMV0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMl0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpKTsKKworICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDY1OTQ4NGYuLmU1YzE2MzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw4IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCiAJQ2FtZXJhQmluZGVyVGVzdHMuY3BwIFwKLQlDYW1lcmFaU0xUZXN0cy5jcHAKKwlDYW1lcmFaU0xUZXN0cy5jcHAgXAorCUNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmxvZyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCAxZGU3MDEzLi44NTM0YjI4IDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDYgKzU3LDggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VEZWZhdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7CiAKICNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKICAgICBBU1NFUlRfVFJVRSgoeCkgIT0gbnVsbHB0cikKQEAgLTQ3Niw3ICs0ODAsOCBAQAogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoZ2JQcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL2ZhbHNlKSk7CiAKLSAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCk7CisgICAgICAgIFN0cmluZzE2IG5vUGh5c2ljYWxJZDsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCwgbm9QaHlzaWNhbElkKTsKIAogICAgICAgICAvLyBDYW4gd2UgY29uZmlndXJlPwogICAgICAgICByZXMgPSBkZXZpY2UtPmJlZ2luQ29uZmlndXJlKCk7CkBAIC00OTAsNiArNDk1LDE5IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKKyAgICAgICAgLy8gU2Vzc2lvbiBjb25maWd1cmF0aW9uIG11c3QgYWxzbyBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBjYXNlCisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uID0geyAvKmlucHV0V2lkdGgqLyAwLCAvKmlucHV0SGVpZ2h0Ki8wLAorICAgICAgICAgICAgICAgIC8qaW5wdXRGb3JtYXQqLyAtMSwgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERX07CisgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmFkZE91dHB1dENvbmZpZ3VyYXRpb24ob3V0cHV0KTsKKyAgICAgICAgYm9vbCBxdWVyeVN0YXR1czsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25Db25maWd1cmF0aW9uLCAmcXVlcnlTdGF0dXMpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgKHJlcy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PSBJQ2FtZXJhU2VydmljZURlZmF1bHQ6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSkKKyAgICAgICAgICAgICAgICA8PCByZXM7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShxdWVyeVN0YXR1cyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBDYW4gd2UgbWFrZSByZXF1ZXN0cz8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVxdWVzdFRlbXBsYXRlOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KC8qcHJldmlldyB0ZW1wbGF0ZSovMSwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKKworY2xhc3MgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorCisgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbigpIDogbnVtQ2FtZXJhcygwKXt9CisgICAgLy9HdGVzdCBpbnRlcmZhY2UKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgaW50MzJfdCBudW1DYW1lcmFzOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKK307CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6U2V0VXAoKSB7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyByYzsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgbUNhbWVyYVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZT4oYmluZGVyKTsKKyAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkNBTUVSQV9UWVBFX0FMTCwgJm51bUNhbWVyYXMpOworICAgIEVYUEVDVF9UUlVFKHJjLmlzT2soKSk7Cit9CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6VGVhckRvd24oKSB7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworLy8gUmV2b2tpbmcgYW5kIGFjcXVpcmluZyBwZXJtaXNzaW9ucyBhdXRvbWF0aWNhbGx5IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4KKy8vIFRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHJlbW92YWwgb2YgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nCisvLyBhIGNhbWVyYSBwZXJtaXNzaW9uLgorVEVTVF9GKENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24sIFRlc3RDYW1lcmFQZXJtaXNzaW9uKSB7CisgICAgZm9yIChpbnQzMl90IGNhbWVyYUlkID0gMDsgY2FtZXJhSWQgPCBudW1DYW1lcmFzOyBjYW1lcmFJZCsrKSB7CisKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWRTdHIgPSBTdHJpbmcxNihTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpKTsKKyAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBhdXRvIHJjID0gbUNhbWVyYVNlcnZpY2UtPnN1cHBvcnRzQ2FtZXJhQXBpKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMiwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdGFnc05lZWRpbmdQZXJtaXNzaW9uOworICAgICAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsICZtZXRhZGF0YSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHJjLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtZXRhZGF0YS5pc0VtcHR5KCkpOworICAgICAgICBFWFBFQ1RfRVEobWV0YWRhdGEucmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lELAorICAgICAgICAgICAgICAgICAgICAmdGFnc05lZWRpbmdQZXJtaXNzaW9uKSwgTk9fRVJST1IpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIEVYUEVDVF9UUlVFKDAgPCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBhdmFpbGFibGVLZXlzOworICAgICAgICBhdmFpbGFibGVLZXlzLnJlc2VydmUoYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKyAgICAgICAgYXZhaWxhYmxlS2V5cy5pbnNlcnQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmRhdGEuaTMyICsgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IHRhZ3NOZWVkaW5nUGVybWlzc2lvbikgeworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG1ldGFkYXRhLmV4aXN0cyhrZXkpKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVLZXlzLmVuZCgpLCBrZXkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXQgPT0gYXZhaWxhYmxlS2V5cy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBiNzM5NTFmLi5jMzYxNjkwIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTg2LDYgKzg2LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OklORk9fRk9STUFUX0NIQU5HRUQ7CiB1c2luZyBhbmRyb2lkOjpJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ7CiB1c2luZyBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTjsKK3VzaW5nIGFuZHJvaWQ6Ok5BTUVfTk9UX0ZPVU5EOwogdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpVTktOT1dOX0VSUk9SOwogCkBAIC0xMDIsNyArMTAzLDcgQEAKIHN0YXRpYyBib29sIGdNb25vdG9uaWNUaW1lID0gZmFsc2U7ICAgICAvLyB1c2Ugc3lzdGVtIG1vbm90b25pYyB0aW1lIGZvciB0aW1lc3RhbXBzCiBzdGF0aWMgYm9vbCBnUGVyc2lzdGVudFN1cmZhY2UgPSBmYWxzZTsgLy8gdXNlIHBlcnNpc3RlbnQgc3VyZmFjZQogc3RhdGljIGVudW0gewotICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUworICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfV0VCTSwgRk9STUFUXzNHUFAsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCiB9IGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OyAgICAgICAgICAgLy8gZGF0YSBmb3JtYXQgZm9yIG91dHB1dAogc3RhdGljIEFTdHJpbmcgZ0NvZGVjTmFtZSA9ICIiOyAgICAgICAgIC8vIGNvZGVjIG5hbWUgb3ZlcnJpZGUKIHN0YXRpYyBib29sIGdTaXplU3BlY2lmaWVkID0gZmFsc2U7ICAgICAvLyB3YXMgc2l6ZSBleHBsaWNpdGx5IHJlcXVlc3RlZD8KQEAgLTE5MSw3ICsxOTIsNyBAQAogICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBkaXNwbGF5RnBzKTsKICAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zZXROYW1lKCJzY3JlZW5yZWNvcmRfbG9vcGVyIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogICAgIEFMT0dWKCJDcmVhdGluZyBjb2RlYyIpOwpAQCAtMjY0LDEwICsyNjUsMTAgQEAKIAogICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKICAgICAvLyBjYXNlIGlzICJhbGwgb2YgaXQiLgotICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCk7CisgICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGRpc3BsYXkuCi0gICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8uaCAvIChmbG9hdCkgbWFpbkRweUluZm8udzsKKyAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydEggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0VzsKIAogCiAgICAgLy8gU2V0IHRoZSB3YXkgd2UgbWFwIHRoZSBvdXRwdXQgb250byB0aGUgZGlzcGxheSBzdXJmYWNlICh3aGljaCB3aWxsCkBAIC0zNDQsMjIgKzM0NSw2IEBACiB9CiAKIC8qCi0gKiBTZXQgdGhlIG1haW4gZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSBhY3R1YWwgd2lkdGggYW5kIGhlaWdodAotICovCi1zdGF0aWMgc3RhdHVzX3QgZ2V0QWN0dWFsRGlzcGxheVNpemUoY29uc3Qgc3A8SUJpbmRlcj4mIG1haW5EcHksIERpc3BsYXlJbmZvKiBtYWluRHB5SW5mbykgewotICAgIFJlY3Qgdmlld3BvcnQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5Vmlld3BvcnQobWFpbkRweSwgJnZpZXdwb3J0KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBnZXQgZGlzcGxheSB2aWV3cG9ydFxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1haW5EcHlJbmZvLT53ID0gdmlld3BvcnQud2lkdGgoKTsKLSAgICBtYWluRHB5SW5mby0+aCA9IHZpZXdwb3J0LmhlaWdodCgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKgogICogUnVucyB0aGUgTWVkaWFDb2RlYyBlbmNvZGVyLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIE1lZGlhTXV4ZXIuICBUaGUKICAqIGlucHV0IGZyYW1lcyBhcmUgY29taW5nIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhcyBmYXN0IGFzIFN1cmZhY2VGbGluZ2VyCiAgKiB3YW50cyB0byBzZW5kIHRoZW0uCkBAIC00MjksMjIgKzQxNCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2VmdWwgc3R1ZmYgaXMgaGFyZCB0byBnZXQgYXQgd2l0aG91dCBhIERhbHZpayBWTS4KICAgICAgICAgICAgICAgICAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5SW5mbyhtYWluKSBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTYwOSw4ICs1ODYsMTIgQEAKICAgICBzZWxmLT5zdGFydFRocmVhZFBvb2woKTsKIAogICAgIC8vIEdldCBtYWluIGRpc3BsYXkgcGFyYW1ldGVycy4KLSAgICBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKTsKKyAgICBjb25zdCBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgIGlmIChtYWluRHB5ID09IG51bGxwdHIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogbm8gZGlzcGxheVxuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKICAgICBEaXNwbGF5SW5mbyBtYWluRHB5SW5mbzsKICAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKG1haW5EcHksICZtYWluRHB5SW5mbyk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtNjE4LDI1ICs1OTksMTkgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgcHJpbnRmKCJNYWluIGRpc3BsYXkgaXMgJWR4JWQgQCUuMmZmcHMgKG9yaWVudGF0aW9uPSV1KVxuIiwKLSAgICAgICAgICAgICAgICBtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oLCBtYWluRHB5SW5mby5mcHMsCisgICAgICAgICAgICAgICAgbWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgsIG1haW5EcHlJbmZvLmZwcywKICAgICAgICAgICAgICAgICBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIC8vIEVuY29kZXIgY2FuJ3QgdGFrZSBvZGQgbnVtYmVyIGFzIGNvbmZpZwogICAgIGlmIChnVmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udyk7CisgICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRXKTsKICAgICB9CiAgICAgaWYgKGdWaWRlb0hlaWdodCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLmgpOworICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydEgpOwogICAgIH0KIAogICAgIC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIGVuY29kZXIuCkBAIC03MTQsNyArNjg5LDkgQEAKICAgICBzcDxNZWRpYU11eGVyPiBtdXhlciA9IE5VTEw7CiAgICAgRklMRSogcmF3RnAgPSBOVUxMOwogICAgIHN3aXRjaCAoZ091dHB1dEZvcm1hdCkgewotICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6IHsKKyAgICAgICAgY2FzZSBGT1JNQVRfTVA0OgorICAgICAgICBjYXNlIEZPUk1BVF9XRUJNOgorICAgICAgICBjYXNlIEZPUk1BVF8zR1BQOiB7CiAgICAgICAgICAgICAvLyBDb25maWd1cmUgbXV4ZXIuICBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBDU0QgYmxvYiBmcm9tIHRoZSBlbmNvZGVyCiAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgY2FuIHN0YXJ0IGl0LgogICAgICAgICAgICAgZXJyID0gdW5saW5rKGZpbGVOYW1lKTsKQEAgLTcyNyw3ICs3MDQsMTMgQEAKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBjb3VsZG4ndCBvcGVuIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfTVA0KSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgaWYgKGdSb3RhdGUpIHsKICAgICAgICAgICAgICAgICBtdXhlci0+c2V0T3JpZW50YXRpb25IaW50KDkwKTsgIC8vIFRPRE86IGRvZXMgdGhpcyBkbyBhbnl0aGluZz8KQEAgLTEwNDcsNiArMTAzMCwxMCBAQAogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiaDI2NCIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0gyNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJ3ZWJtIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfV0VCTTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIjNncHAiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF8zR1BQOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZnJhbWVzIikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfRlJBTUVTOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAicmF3LWZyYW1lcyIpID09IDApIHsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA3YTEwMzAyLi42ZWIyZTlmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNyBAQAogICAgICAgICBTaW5lU291cmNlLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYm1lZGlhZXh0cmFjdG9yIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgXAogICAgICAgICBsaWJoaWRsYmFzZSBcCiAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHJlY29yZC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICByZWNvcmR2aWRlby5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtODcsNyArODcsNyBAQAogICAgICAgICBhdWRpb2xvb3AuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJ1aSBsaWJndWkgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscyBsaWJtZWRpYWV4dHJhY3RvcgorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliY3V0aWxzIGxpYmMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGliY3V0aWxzIGxpYmMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IDk4MGQxZDIuLmU1YTQzMzcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogICAgIENIRUNLKCFzdGF0ZUJ5VHJhY2suaXNFbXB0eSgpKTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNDExLDEwICs0MTEsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAppbmRleCA2MzBkZTI1Li4yY2Y2OTU1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcApAQCAtMzEwLDcgKzMxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgYm9vbCByZW5kZXJTdXJmYWNlLApAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgZmlsdGVyU3RhdGUtPm1TaWduYWxsZWRJbnB1dEVPUyA9IGZhbHNlOwogICAgIGZpbHRlclN0YXRlLT5tU2F3T3V0cHV0RU9TID0gZmFsc2U7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTY0Myw3ICs2NDMsNyBAQAogICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCwgJnN0YXJ0VGltZVJlbmRlcik7CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTczNyw3ICs3MzcsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgYW5kcm9pZDo6c3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgYW5kcm9pZDo6c3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKQEAgLTc0OCwxMCArNzQ4LDEyIEBACiAgICAgICAgIGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCkpOwogCi0gICAgICAgIGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgICAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgICAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCA0NGIwMDE1Li45NWExNmYzIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yOCw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IDAzMTE2NzcuLmJmMzZiZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtNDcsOSArNDYsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KQEAgLTc4LDYgKzc5LDcgQEAKIHN0YXRpYyBib29sIGdQbGF5YmFja0F1ZGlvOwogc3RhdGljIGJvb2wgZ1dyaXRlTVA0Owogc3RhdGljIGJvb2wgZ0Rpc3BsYXlIaXN0b2dyYW07CitzdGF0aWMgYm9vbCBnVmVyYm9zZSA9IGZhbHNlOwogc3RhdGljIGJvb2wgc2hvd1Byb2dyZXNzID0gdHJ1ZTsKIHN0YXRpYyBTdHJpbmc4IGdXcml0ZU1QNEZpbGVuYW1lOwogc3RhdGljIFN0cmluZzggZ0NvbXBvbmVudE5hbWVPdmVycmlkZTsKQEAgLTE1OSw2ICsxNjEsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAic2FtcGxlIGZvcm1hdDogJXNcbiIsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCiAgICAgICAgIENIRUNLX0VRKAogICAgICAgICAgICAgICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKW1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAxLApAQCAtMjE4LDExICsyMjUsMTUgQEAKICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UocmF3U291cmNlKTsKICAgICAgICAgcmF3U291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKKyAgICAgICAgZXJyID0gcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKIAotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisgICAgICAgICAgICB3aGlsZSAoIXBsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHN0YXJ0IHBsYXliYWNrIGVycj0lZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOwogICAgICAgICB9CiAKICAgICAgICAgZGVsZXRlIHBsYXllcjsKQEAgLTM0OCw3ICszNTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZXNVcy5wdXNoKGRlbGF5RGVjb2RlVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWxkIHNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBudW1GcmFtZXMsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CiAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3OSwxMiArNTkzLDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKKwogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICB9CkBAIC02MTUsNyArNjI5LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbChpc3QpIGNvbXBvbmVudHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1tIG1heC1udW1iZXItb2YtZnJhbWVzLXRvLWRlY29kZSBpbiBlYWNoIHBhc3NcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1iIGJ1ZyB0byByZXByb2R1Y2VcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1wKHJvZmlsZXMpIGR1bXAgZGVjb2RlciBwcm9maWxlcyBzdXBwb3J0ZWRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1pKG5mbykgZHVtcCBjb2RlYyBpbmZvIChwcm9maWxlcyBhbmQgY29sb3IgZm9ybWF0cyBzdXBwb3J0ZWQsIGRldGFpbHMpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdChodW1ibmFpbCkgZXh0cmFjdCB2aWRlbyB0aHVtYm5haWwgb3IgYWxidW0gYXJ0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwpAQCAtNjMwLDU1ICs2NDQsMTM0IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLVQgYWxsb2NhdGUgYnVmZmVycyBmcm9tIGEgc3VyZmFjZSB0ZXh0dXJlXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtZCh1bXApIG91dHB1dF9maWxlbmFtZSAocmF3IHN0cmVhbSBkYXRhIHRvIGEgZmlsZSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1EKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChkZWNvZGVkIFBDTSBkYXRhIHRvIGEgZmlsZSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC12IGJlIG1vcmUgdmVyYm9zZVxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBDb2RlY1Byb2ZpbGVzKGJvb2wgcXVlcnlEZWNvZGVycykgewotICAgIGNvbnN0IGNoYXIgKmtNaW1lVHlwZXNbXSA9IHsKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQwotICAgIH07Ci0KLSAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiZGVjb2RlciIgOiAiZW5jb2RlciI7Ci0gICAgcHJpbnRmKCIlcyBwcm9maWxlczpcbiIsIGNvZGVjVHlwZSk7CitzdGF0aWMgdm9pZCBkdW1wQ29kZWNEZXRhaWxzKGJvb2wgcXVlcnlEZWNvZGVycykgeworICAgIGNvbnN0IGNoYXIgKmNvZGVjVHlwZSA9IHF1ZXJ5RGVjb2RlcnM/ICJEZWNvZGVyIiA6ICJFbmNvZGVyIjsKKyAgICBwcmludGYoIlxuJXMgaW5mb3MgYnkgbWVkaWEgdHlwZXM6XG4iCisgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgY29kZWNUeXBlKTsKIAogICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIHNpemVfdCBudW1Db2RlY3MgPSBsaXN0LT5jb3VudENvZGVjcygpOwogCi0gICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7ICsraykgewotICAgICAgICBwcmludGYoInR5cGUgJyVzJzpcbiIsIGtNaW1lVHlwZXNba10pOworICAgIC8vIGdhdGhlciBhbGwgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGJ5IGNvZGVjIGNsYXNzLCBhbmQgbGluayB0byBjb2RlY3MgdGhhdCBzdXBwb3J0IHRoZW0KKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+Pj4gYWxsTWVkaWFUeXBlczsKKyAgICBmb3IgKHNpemVfdCBjb2RlY19peCA9IDA7IGNvZGVjX2l4IDwgbnVtQ29kZWNzOyArK2NvZGVjX2l4KSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGNvZGVjX2l4KTsKKyAgICAgICAgaWYgKGluZm8tPmlzRW5jb2RlcigpID09ICFxdWVyeURlY29kZXJzKSB7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gc3VwcG9ydGVkTWVkaWFUeXBlczsKKyAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJnN1cHBvcnRlZE1lZGlhVHlwZXMpOworICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWRNZWRpYVR5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHByaW50Zigid2FybmluZzogJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbWVkaWEgdHlwZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlIDogc3VwcG9ydGVkTWVkaWFUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsTWVkaWFUeXBlcy5pbmRleE9mS2V5KG1lZGlhVHlwZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxNZWRpYVR5cGVzLmFkZChtZWRpYVR5cGUsIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFsbE1lZGlhVHlwZXMuZWRpdFZhbHVlRm9yKG1lZGlhVHlwZSkuYWRkKGluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbnVtQ29kZWNzOyArK2luZGV4KSB7Ci0gICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7Ci0gICAgICAgICAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPmlzRW5jb2RlcigpICE9ICFxdWVyeURlY29kZXJzKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKGtNaW1lVHlwZXNba10pOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIGJvb2w+IHZpc2l0ZWRDb2RlY3M7CisgICAgZm9yIChzaXplX3QgdHlwZV9peCA9IDA7IHR5cGVfaXggPCBhbGxNZWRpYVR5cGVzLnNpemUoKTsgKyt0eXBlX2l4KSB7CisgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSA9IGFsbE1lZGlhVHlwZXMua2V5QXQodHlwZV9peCk7CisgICAgICAgIHByaW50ZigiXG5NZWRpYSB0eXBlICclcyc6XG4iLCBtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8gOiBhbGxNZWRpYVR5cGVzLnZhbHVlQXQodHlwZV9peCkpIHsKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWVkaWFUeXBlLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50Zigid2FybmluZzogJXMgZG9lcyBub3QgaGF2ZSBjYXBhYmlsaXRpZXMgZm9yIHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSwgbWVkaWFUeXBlLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIgICVzICclcycgc3VwcG9ydHMgIiwKKyAgICAgICAgICAgIHByaW50ZigiICAlcyBcIiVzXCIgc3VwcG9ydHNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZSwgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOwogCi0gICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKLSAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIk5PVEhJTkcuXG4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF1dG8gcHJpbnRMaXN0ID0gW10oY29uc3QgY2hhciAqdHlwZSwgY29uc3QgVmVjdG9yPEFTdHJpbmc+ICZ2YWx1ZXMpeworICAgICAgICAgICAgICAgIHByaW50ZigiICAgICVzOiBbIiwgdHlwZSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB2YWx1ZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAgICVzJXMiLCB2YWx1ZXNbal0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID09IHZhbHVlcy5zaXplKCkgLSAxID8gIiAiIDogIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCJdXG4iKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmICh2aXNpdGVkQ29kZWNzLmluZGV4T2ZLZXkoaW5mby0+Z2V0Q29kZWNOYW1lKCkpIDwgMCkgeworICAgICAgICAgICAgICAgIHZpc2l0ZWRDb2RlY3MuYWRkKGluZm8tPmdldENvZGVjTmFtZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBhbGlhc2VzOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRBbGlhc2VzKCZhbGlhc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcXVvdGUgYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLmluc2VydCgiXCIiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLmFwcGVuZCgnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50TGlzdCgiYWxpYXNlcyIsIGFsaWFzZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dHJzID0gaW5mby0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiZW5jb2RlcjogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigidmVuZG9yOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3IpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoInNvZnR3YXJlLW9ubHk6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiaHctYWNjZWxlcmF0ZWQ6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQpKSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50TGlzdChBU3RyaW5nUHJpbnRmKCJhdHRyaWJ1dGVzOiAlI3giLCBhdHRycykuY19zdHIoKSwgbGlzdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgb3duZXI6IFwiJXNcIlxuIiwgaW5mby0+Z2V0T3duZXJOYW1lKCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIHJhbms6ICV1XG4iLCBpbmZvLT5nZXRSYW5rKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICBhbGlhc2VzLCBhdHRyaWJ1dGVzLCBvd25lciwgcmFuazogc2VlIGFib3ZlXG4iKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0gcHJvZmlsZUxldmVsc1tqXTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnBsIDogcHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuaWNlUHJvZmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9BVURJT19BQUMpICAgPyBhc1N0cmluZ19BQUNPYmplY3QocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUcyKSA/IGFzU3RyaW5nX01QRUcyUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSDI2MykgID8gYXNTdHJpbmdfSDI2M1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUc0KSA/IGFzU3RyaW5nX01QRUc0UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVZDKSAgID8gYXNTdHJpbmdfQVZDUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAgID8gYXNTdHJpbmdfVlA4UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSEVWQykgID8gYXNTdHJpbmdfSEVWQ1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOSkgICA/IGFzU3RyaW5nX1ZQOVByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWMSkgICA/IGFzU3RyaW5nX0FWMVByb2ZpbGUocGwubVByb2ZpbGUpIDoiPz8iOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuaWNlTGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzIpID8gYXNTdHJpbmdfTVBFRzJMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0gyNjMpICA/IGFzU3RyaW5nX0gyNjNMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUc0KSA/IGFzU3RyaW5nX01QRUc0TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVkMpICAgPyBhc1N0cmluZ19BVkNMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgICA/IGFzU3RyaW5nX1ZQOExldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSEVWQykgID8gYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOSkgICA/IGFzU3RyaW5nX1ZQOUxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVYxKSAgID8gYXNTdHJpbmdfQVYxTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAiPz8iOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyV1LyV1IiwgaiA+IDAgPyAiLCAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUsIHByb2ZpbGVMZXZlbC5tTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCIlIDV1LyUgNXUgKCVzLyVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwubVByb2ZpbGUsIHBsLm1MZXZlbCwgbmljZVByb2ZpbGUsIG5pY2VMZXZlbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludExpc3QoInByb2ZpbGUvbGV2ZWxzIiwgbGlzdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNvbG9yczsKKyAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9ycyk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2xvciA6IGNvbG9ycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCIlI3ggKCVzKSIsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nX0NvbG9yRm9ybWF0KChpbnQzMl90KWNvbG9yKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludExpc3QoImNvbG9ycyIsIGxpc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGYoIiAgICBkZXRhaWxzOiAlc1xuIiwgY2Fwcy0+Z2V0RGV0YWlscygpLT5kZWJ1Z1N0cmluZyg2KS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTY4OCw3ICs3ODEsNyBAQAogCiAgICAgYm9vbCBhdWRpb09ubHkgPSBmYWxzZTsKICAgICBib29sIGxpc3RDb21wb25lbnRzID0gZmFsc2U7Ci0gICAgYm9vbCBkdW1wUHJvZmlsZXMgPSBmYWxzZTsKKyAgICBib29sIGR1bXBDb2RlY0luZm8gPSBmYWxzZTsKICAgICBib29sIGV4dHJhY3RUaHVtYm5haWwgPSBmYWxzZTsKICAgICBib29sIHNlZWtUZXN0ID0gZmFsc2U7CiAgICAgYm9vbCB1c2VTdXJmYWNlQWxsb2MgPSBmYWxzZTsKQEAgLTcwNSwxMCArNzk4LDEwIEBACiAgICAgZ1dyaXRlTVA0ID0gZmFsc2U7CiAgICAgZ0Rpc3BsYXlIaXN0b2dyYW0gPSBmYWxzZTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXI7CiAKICAgICBpbnQgcmVzOwotICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoYXFuOmxtOmI6cHRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2aGFxbjpsbTpiOml0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKICAgICAgICAgc3dpdGNoIChyZXMpIHsKICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgewpAQCAtNzc4LDkgKzg3MSw5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVtcFByb2ZpbGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkdW1wQ29kZWNJbmZvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtODMyLDYgKzkyNSwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnVmVyYm9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTE1LDkgKzEwMTQsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoZHVtcFByb2ZpbGVzKSB7Ci0gICAgICAgIGR1bXBDb2RlY1Byb2ZpbGVzKHRydWUgLyogcXVlcnlEZWNvZGVycyAqLyk7Ci0gICAgICAgIGR1bXBDb2RlY1Byb2ZpbGVzKGZhbHNlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOworICAgIGlmIChkdW1wQ29kZWNJbmZvKSB7CisgICAgICAgIGR1bXBDb2RlY0RldGFpbHModHJ1ZSAvKiBxdWVyeURlY29kZXJzICovKTsKKyAgICAgICAgZHVtcENvZGVjRGV0YWlscyhmYWxzZSAvKiBxdWVyeURlY29kZXJzICovKTsKICAgICB9CiAKICAgICBpZiAobGlzdENvbXBvbmVudHMpIHsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiMDE5OWQ4Li4zNWJkYmMwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTMxOCwxMCArMzE4LDEyIEBACiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pKTsKKyAgICBjb25zdCBzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICBEaXNwbGF5SW5mbyBpbmZvOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCmluZGV4IGY3MzQ5MDUuLmFlYzU5NTkgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApAQCAtNzksMTIgKzc5LDEyIEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICByZXR1cm4gb25Db25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHJldHVybiBvblNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogfQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKICAgICAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmkpOwpAQCAtMTM5LDMzICsxMzksMzMgQEAKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSwgbWltZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWYsIG1pbWVUeXBlKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHJldHVybiBvbkNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHJldHVybiBvbkluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmRlY3J5cHQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgcmV0dXJuIG9uRGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICByZXR1cm4gb25GaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAogc3NpemVfdCBEcm1FbmdpbmVCYXNlOjpwcmVhZCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIG9uUHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA0NGY5OGRkLi5hNmQzM2IwIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zOSw3ICszOSw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKAotICAgICAgICBjb25zdCBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgeworICAgICAgICBjb25zdCBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgaWYgKDAgPT0gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTksNyArOTksNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKERlY3J5cHRIYW5kbGUqIGhhbmRsZSkgeworc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUpIHsKICAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQxNCw3ICs0MTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJjb25zdW1lUmlnaHRzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC00MzEsNyArNDMxLDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02MDMsNyArNjAzLDcgQEAKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjIxLDcgKzYyMSw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbWltZT0lcyIsIG1pbWU/IG1pbWU6ICJOVUxMIik7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02NzMsNyArNjczLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GT1JfU1RSRUFNSU5HLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJkZWNyeXB0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC03NzAsNyArNzcwLDcgQEAKIH0KIAogc3NpemVfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTExMjgsMTYgKzExMjgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGFjdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGJvb2wgcmVzZXJ2ZSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMTQ4LDE2ICsxMTQ4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBwbGF5YmFja1N0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTEzMjksMTMgKzEzMjksMTMgQEAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZQogICAgICAgICAgICAgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xMzQ5LDEzICsxMzQ5LDEzIEBACiAgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogCiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM3MywxMyArMTM3MywxMiBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlKGRhdGEucmVhZFN0cmluZzgoKSk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKIAogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM5Myw3ICsxMzkyLDcgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBjbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUpOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCkBAIC0xNDE3LDE3ICsxNDE2LDE3IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgRHJtQnVmZmVyKiBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgaGVhZGVySW5mbyA9IG5ldyBEcm1CdWZmZXIoKGNoYXIgKilkYXRhLnJlYWRJbnBsYWNlKGJ1ZmZlclNpemUpLCBidWZmZXJTaXplKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBoZWFkZXJJbmZvOyBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xNDM5LDggKzE0MzgsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0NTAsNyArMTQ0OSw3IEBACiAgICAgICAgICAgICBkZWNCdWZmZXJTaXplID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTQ3MCw3ICsxNDY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKyAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCkBAIC0xNDgwLDcgKzE0NzksNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlKGRlY0J1ZmZlci0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOwpAQCAtMTQ5NSwxMyArMTQ5NCwxMyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAotICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTUxMiw4ICsxNTExLDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAobnVtQnl0ZXMgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKQEAgLTE1MjQsMTMgKzE1MjMsMTMgQEAKIAogICAgICAgICBjb25zdCBvZmY2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CiAKLSAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgJmhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICBpZiAoMCA8IHJlc3VsdCkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNDE3MTA3Zi4uNzNmMTFhNCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC01OSwxMCArNTksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC04MCwyNyArODEsMjggQEAKICAgICBEcm1TdXBwb3J0SW5mbyogZ2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogcHJvdGVjdGVkOgpAQCAtMjY1LDcgKzI2Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCkBAIC0yODAsNyArMjgyLDggQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzQwMSw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBmZCAqLywgb2ZmNjRfdCAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgLyogbGVuZ3RoICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCkBAIC00MTUsNyArNDE4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSA9IDA7CiAKICAgICAvKioKQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB1cmkgKi8sIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIAogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NDcsNyArNDUwLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiAvKiBidWYgKi8sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKiBtaW1lVHlwZSAqLykgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NjEsNyArNDY0LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC00NzMsNyArNDc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtNDkzLDcgKzQ5Niw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC01MDYsNyArNTA5LDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNTE5LDcgKzUyMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggYWNjOGVkOS4uMTgzN2ExMSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAogICAgIC8qKgpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCAwMzc2YjQ5Li44MzZhZTBhIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCkBAIC0xMTUsMTAgKzExNSwxMSBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCkBAIC0xMzgsMjggKzEzOSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcyxvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApAQCAtMjAzLDEwICsyMDQsMTAgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMjI1LDI4ICsyMjYsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKaW5kZXggYmYwNGE4OS4uYWZiY2IzOSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC0yNjcsNyArMjY3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yNzgsNyArMjc4LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMzk2LDE1ICszOTYsMTUgQEAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQyMCwxOSArNDIwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NDgsMjAgKzQ0OCwyMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ3NywyMCArNDc3LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0ICYmIE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw3ICs0OTcsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MzIsNyArNTMyLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJlc3VsdCA9IERFQ1JZUFRfRklMRV9FUlJPUjsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAppbmRleCBlN2NkZDM2Li4yNjIyMmJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaApAQCAtODksMTAgKzg5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTA5LDI1ICsxMTAsMjYgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2b2lkIG9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KTsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggZGFkNTk5Yi4uMjYwMGEyYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTU4LDIyICs1OCwyNiBAQAogICAgIHJldHVybiBkcm1fcGVybV9sYWJlbHNbaW5kZXhdOwogfQogCi1ib29sIERybU1hbmFnZXJTZXJ2aWNlOjpzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBkcm1fcGVybV90IHBlcm0pIHsKK2Jvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGNvbnN0IGNoYXIqIHNzaWQsIGRybV9wZXJtX3QgcGVybSkgewogICAgIGlmIChzZWxpbnV4X2VuYWJsZWQgPD0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBjaGFyICpzY3R4OworICAgIGNoYXIgKnNjdHggPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNlbGludXhfY2xhc3MgPSAiZHJtc2VydmljZSI7CiAgICAgY29uc3QgY2hhciAqc3RyX3Blcm0gPSBnZXRfcGVybV9sYWJlbChwZXJtKTsKIAotICAgIGlmIChnZXRwaWRjb24oc3BpZCwgJnNjdHgpICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlNFTGludXg6IGdldHBpZGNvbihwaWQ9JWQpIGZhaWxlZC5cbiIsIHNwaWQpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNzaWQgPT0gTlVMTCkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMTAzNTA0MiIpOworCisgICAgICAgIGlmIChnZXRwaWRjb24oc3BpZCwgJnNjdHgpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJTRUxpbnV4OiBnZXRwaWRjb24ocGlkPSVkKSBmYWlsZWQuXG4iLCBzcGlkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGJvb2wgYWxsb3dlZCA9IChzZWxpbnV4X2NoZWNrX2FjY2VzcyhzY3R4LCBkcm1zZXJ2ZXJfY29udGV4dCwgc2VsaW51eF9jbGFzcywKLSAgICAgICAgICAgIHN0cl9wZXJtLCBOVUxMKSA9PSAwKTsKKyAgICBib29sIGFsbG93ZWQgPSAoc2VsaW51eF9jaGVja19hY2Nlc3Moc3NpZCA/IHNzaWQgOiBzY3R4LCBkcm1zZXJ2ZXJfY29udGV4dCwKKyAgICAgICAgICAgIHNlbGludXhfY2xhc3MsIHN0cl9wZXJtLCBOVUxMKSA9PSAwKTsKICAgICBmcmVlY29uKHNjdHgpOwogCiAgICAgcmV0dXJuIGFsbG93ZWQ7CkBAIC04NiwxMCArOTAsMTEgQEAKICAgICBJUENUaHJlYWRTdGF0ZSogaXBjU3RhdGUgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwogICAgIHVpZF90IHVpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgcGlkX3Qgc3BpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgY2hhciogc3NpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nU2lkKCk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHRydXN0ZWRVaWRzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmICh0cnVzdGVkVWlkc1tpXSA9PSB1aWQpIHsKLSAgICAgICAgICAgIHJldHVybiBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChzcGlkLCBwZXJtKTsKKyAgICAgICAgICAgIHJldHVybiBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChzcGlkLCBzc2lkLCBwZXJtKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC05Nyw3ICsxMDIsOSBAQAogCiB2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKICAgICBBTE9HVigiaW5zdGFudGlhdGUiKTsKLSAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSwgbmV3IERybU1hbmFnZXJTZXJ2aWNlKCkpOworICAgIHNwPERybU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gbmV3IERybU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgc2VydmljZS0+c2V0UmVxdWVzdGluZ1NpZCh0cnVlKTsKKyAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSwgc2VydmljZSk7CiAKICAgICBpZiAoMCA+PSB0cnVzdGVkVWlkcy5zaXplKCkpIHsKICAgICAgICAgLy8gVE9ETwpAQCAtMjA2LDcgKzIxMyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjb25zdW1lUmlnaHRzIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENPTlNVTUVfUklHSFRTKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0yMTUsNyArMjIyLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIEFMT0dWKCJFbnRlcmluZyBzZXRQbGF5YmFja1N0YXR1cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChTRVRfUExBWUJBQ0tfU1RBVFVTKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0yNjIsNyArMjY5LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjcyLDcgKzI3OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiB3aXRoIHVyaSIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjgyLDcgKzI4OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiBmb3Igc3RyZWFtaW5nIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yOTIsNyArMjk5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNsb3NlRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoQ0xPU0VfREVDUllQVF9TRVNTSU9OKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0zMDAsNyArMzA3LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKElOSVRJQUxJWkVfREVDUllQVF9VTklUKSkgewpAQCAtMzEwLDcgKzMxNyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJFbnRlcmluZyBkZWNyeXB0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKERFQ1JZUFQpKSB7CkBAIC0zMjAsNyArMzI3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKEZJTkFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzI4LDcgKzMzNSw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgcHJlYWQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoUFJFQUQpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggNDVjZWUyZS4uMmUyN2EzYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wZXJtX2xhYmVsKGRybV9wZXJtX3QgcGVybSk7CiAKLSAgICBzdGF0aWMgYm9vbCBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBkcm1fcGVybV90IHBlcm0pOworICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGNvbnN0IGNoYXIqIHNzaWQsIGRybV9wZXJtX3QgcGVybSk7CiAKICAgICBzdGF0aWMgYm9vbCBpc1Byb3RlY3RlZENhbGxBbGxvd2VkKGRybV9wZXJtX3QgcGVybSk7CiAKQEAgLTk1LDEwICs5NSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCxpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMTUsMjYgKzExNiwyNyBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IGMwNDdlYjEuLmIwYTQ0MWIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjY3LDcgKzI2Nyw3IEBACiBzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLCBtaW1lKTsKICAgICB9CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCiAgICAgICAgICYmIChOVUxMICE9IGRlY0J1ZmZlcikgJiYgKE5VTEwgIT0gKmRlY0J1ZmZlcikpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZGVjcnlwdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMyOSw3ICszMjksNyBAQAogICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKICAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBhNTcxYjNhLi5iNjJkZGI5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbik7CiAjZWxzZQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CiAjZW5kaWYKQEAgLTMzMCwxMSArMzMwLDExIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogI2Vsc2UKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAjZW5kaWYKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpOwogCiAvKioKQEAgLTM2MCw3ICszNjAsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KQEAgLTM3Myw3ICszNzMsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwogc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CkBAIC00MTYsNyArNDE2LDcgQEAKICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwotc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCkBAIC00MzAsNyArNDMwLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKIC8qKgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCiAgKi8KIHNzaXplX3Qgb25SZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOwogCkBAIC00NjMsMTIgKzQ2MywxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIG9mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbHNlCiBvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZW5kaWYKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKICNlbHNlCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDczZWVhODkuLjc2OWRlMGMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ29uc3VtZVJpZ2h0cyhpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYWN0aW9uICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogcmVzZXJ2ZSAqLykgewogICAgIC8vIE5vIHJpZ2h0cyBjb25zdW1wdGlvbgpAQCAtMzcyLDExICszNzIsMTMgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywKKyAgICAgICAgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgewogI2Vsc2UKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwpAQCAtNDcwLDEzICs0NzIsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgLyogbGVuZ3RoICovKSB7CiAjZWxzZQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsZW5ndGggKi8pIHsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgotICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoIWRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSB7CiAgICAgICAgIGZpbGVEZXNjID0gZHVwKGZkKTsKICAgICB9IGVsc2UgewpAQCAtNTMzLDEyICs1MzUsMTIgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKICAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CiAgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CiAKQEAgLTU2MiwxMSArNTY0LDExIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKHNlc3Npb24tPmZpbGVEZXNjKTsKQEAgLTU3Niw3ICs1NzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKQEAgLTU4NCw5ICs1ODYsNyBAQAogCiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmV4dGVuZGVkRGF0YS5jbGVhcigpOwotCi0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOwotICAgICAgICBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBoZWFkZXJJbmZvICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCgKICAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8sCkBAIC02MTMsNyArNjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLykgewpAQCAtNjIyLDE5ICs2MjIsMTkgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25SZWFkKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgewogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYKICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CkBAIC02NTQsMTUgKzY1NCwxNSBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLW9mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2Vsc2UKLW9mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbmRpZgogICAgIG9mZl90IG9mZnZhbCA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKQEAgLTY3NSwxMyArNjc1LDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CiAjZWxzZQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgewpAQCAtNjkwLDcgKzY5MCw3IEBACiAKICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVyU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKE5VTEwgIT0gKGRlY29kZXJTZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgJiYKICAgICAgICAgKE5VTEwgIT0gYnVmZmVyKSAmJgogICAgICAgICAobnVtQnl0ZXMgPiAtMSkgJiYKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCmluZGV4IDdiNjZkYzcuLjRhYjUyNzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaApAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgb25WYWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTc0LDI2ICs3NSwyNSBAQAogICAgIERybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKIAotICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKLQotcHJpdmF0ZToKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb25JbXBsKCk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCBkN2YyZDI4Li4wZmEzNDc4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTgzLDEzICsxODMsMTMgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpAQCAtMjM2LDcgKzIzNiw4IEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgIG9mZjY0X3QgLypsZW5ndGgqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KQEAgLTI0NiwzNiArMjQ3LDM4IEBACiAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAjZWxzZQotICAgICh2b2lkKShkZWNyeXB0SGFuZGxlKTsgLy8gdW51c2VkCisgICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUuZ2V0KCkpOyAvLyB1bnVzZWQKICNlbmRpZgogCiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgeworICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIC8qSVYqLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLAorICAgICAgICBEcm1CdWZmZXIqIC8qSVYqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KQEAgLTI5NiwxMiArMjk5LDEyIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAorc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA5MWQxZjdlLi4wMWVmYjIyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMjcsMTEgKzI3LDExIEBACiAgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKQEAgLTU5LDEzICs1OSwxMSBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKaW5kZXggMzAzNWM1YS4uNGRkYTVkNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKQEAgLTMwLDE2ICszMCwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwpAQCAtNTAsNiArNTAsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc2LDYgKzc3LDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUXzFfMihTdGF0dXNfVjFfMiBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOzsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQogCiBzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7CiAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwpAQCAtMTk2LDYgKzIwOSw5IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewogICAgICAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklDcnlwdG9QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTYsNiArMjMyLDcgQEAKICAgICB9CiAKICAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM4OSwyMSArNDA2LDMzIEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwKLSAgICAgICAgICAgIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+ZGVjcnlwdF8xXzIoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksCisgICAgICAgICAgICAgICAgaE1vZGUsIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAorICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CiAgICAgfQogCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBjZjA4NjEwLi41ODg4YWYwIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KQEAgLTQxLDE0ICs0MSwxNiBAQAogCiB1c2luZyBkcm06OlYxXzA6OktleWVkVmVjdG9yOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTksNiArNjEsMTAgQEAKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogbmFtZXNwYWNlIHsKIAogLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudApAQCAtMTM5LDI2ICsxNDUsNTUgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWwgbGV2ZWwpIHsKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CiAgICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9ORToKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQ3J5cHRvOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREU7CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoCisgICAgICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlKSB7CisgICAgc3dpdGNoKGxpY2Vuc2VTdGF0ZSkgeworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVzYWJsZTsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWxfVjFfMiBsZXZlbCkgeworICAgIHN3aXRjaChsZXZlbCkgeworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YxOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMjoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8xOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8yOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgIH0KIH0KLQotCiBzdGF0aWMgOjpLZXllZFZlY3RvciB0b0hpZGxLZXllZFZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYKICAgICAgICAga2V5ZWRWZWN0b3IpIHsKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CkBAIC0xOTksNiArMjM0LDE1IEBACiAgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgorICAgICAgICBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKIHN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIHN0YXR1cykgewogICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMjE3LDcgKzI2MSw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0YXR1czo6QkFEX1ZBTFVFOgogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjM4LDYgKzI4MiwxOSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CisKIAogTXV0ZXggRHJtSGFsOjptTG9jazsKIApAQCAtMjk3LDM5ICszNTQsNTEgQEAKIAogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKICAgICAgICAgfQogICAgIH0KICAgICBtUGx1Z2luLmNsZWFyKCk7CiAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogfQogCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CiAgICAgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzOwogCi0gICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKIAogICAgIGlmIChtYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjEgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTAxLDMyICs1NzAsODAgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCi1ib29sIERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBQYXJjZWwgb2JqOworICAgICAgICB3cml0ZUJ5dGVBcnJheShvYmosIHNlc3Npb25JZCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25Mb3N0U3RhdGUsIDAsICZvYmopOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKKyAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAorICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIGlmIChtaW1lVHlwZSAhPSAiIikgewotICAgICAgICAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKG1GYWN0b3JpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIHV1aWQsIG1pbWVUeXBlLCBsZXZlbCwgaXNTdXBwb3J0ZWQpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwogICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MzQsMTMgKzY1MSwyMiBAQAogICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogCisKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIApAQCAtNTU0LDMwICs2ODAsMTUgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIElOSVRfQ0hFQ0soKTsKIAotICAgIFNlY3VyaXR5TGV2ZWwgaFNlY3VyaXR5TGV2ZWw7CisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOwogICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CiAKLSAgICBzd2l0Y2gobGV2ZWwpIHsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg6CisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXgpIHsKICAgICAgICAgc2V0U2VjdXJpdHlMZXZlbCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0YXR1c190ICBlcnIgPSBVTktOT1dOX0VSUk9SOwpAQCAtNjU3LDYgKzc2OCwzOSBAQAogICAgIHJldHVybiBERUFEX09CSkVDVDsKIH0KIAorc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZSgKKyAgICAgICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCisgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0S2V5UmVxdWVzdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsCiAgICAgICAgIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLCBLZXllZFZlY3RvcjxTdHJpbmc4LApAQCAtNjgzLDczICs4MjcsNTEgQEAKICAgICA6OktleWVkVmVjdG9yIGhPcHRpb25hbFBhcmFtZXRlcnMgPSB0b0hpZGxLZXllZFZlY3RvcihvcHRpb25hbFBhcmFtZXRlcnMpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7Ci0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KLSAgICAgICAgICAgIG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKICAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6Ok5PTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6VVBEQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVXBkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KIAogICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOwpAQCAtODMxLDE4ICs5NTMsMzMgQEAKICAgICBJTklUX0NIRUNLKCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKQEAgLTk4OCwyMiArMTEyNSwzMSBAQAogICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQogICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaENvbm5lY3RlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoTWF4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KIAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQpAQCAtMTA2NSw2ICsxMjExLDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CkBAIC0xMzQzLDIyICsxNTU2LDIyIEBACiAKIHZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKLSAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgibWVkaWFkcm0iKSk7CisgICAgaXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpdGVtLT5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJ2ZW5kb3IiLCB2ZW5kb3IuY19zdHIoKSk7CiAgICAgfQogICAgIHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRpb24gZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwpAQCAtMTM2OSw5ICsxNTgyLDkgQEAKICAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwogICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsIGI2NEVuY29kZWRNZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgIGlmICghaXRlbS0+c2VsZnJlY29yZCgpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VsZiByZWNvcmQgZnJhbWV3b3JrIG1ldHJpY3MiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggNTA5OTYxZi4uNTEyNzRkMSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtNjEsNyArNjEsMTAgQEAKICAgICBHRVRfTlVNQkVSX09GX1NFU1NJT05TLAogICAgIEdFVF9TRUNVUklUWV9MRVZFTCwKICAgICBSRU1PVkVfU0VDVVJFX1NUT1AsCi0gICAgR0VUX1NFQ1VSRV9TVE9QX0lEUworICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLAorICAgIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTgwLDE4ICs4MywyMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSh1dWlkLCAxNik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG1pbWVUeXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKKwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfQ1JZUFRPX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoImlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkOiBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgKmlzU3VwcG9ydGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpOwogCi0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKQEAgLTEyMCwxMSArMTI3LDExIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlY3VyaXR5TGV2ZWwpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobGV2ZWwpOwogCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTM3Niw2ICszODMsNTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNldElkcy5jbGVhcigpOworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKKyAgICAgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfT0ZGTElORV9MSUNFTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGljZW5zZVN0YXRlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC03MTksNyArNzcyLDEyIEBACiAgICAgICAgICAgICB1aW50OF90IHV1aWRbMTZdOwogICAgICAgICAgICAgZGF0YS5yZWFkKHV1aWQsIHNpemVvZih1dWlkKSk7CiAgICAgICAgICAgICBTdHJpbmc4IG1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsICZpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKQEAgLTk4MCw2ICsxMDM4LDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4ga2V5U2V0SWRzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGtleVNldElkcy5zaXplKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdGVyID0ga2V5U2V0SWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IGtleVNldElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaXRlci0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShpdGVyLT5hcnJheSgpLCBpdGVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGl0ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoa2V5U2V0SWQsICZzdGF0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHN0YXRlKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfUFJPUEVSVFlfU1RSSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCmluZGV4IDVjYjQ4YmYuLjhjZDZmOTYgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTM0LDE3ICszNCwxNyBAQAogc3RhdHVzX3QgcmVwb3J0VmVuZG9yTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShuYW1lLmNfc3RyKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBhbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKG5hbWUuY19zdHIoKSkpOworICAgIGFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAKICAgICBzdGQ6OnN0cmluZyBhcHBfcGFja2FnZV9uYW1lKGFwcFBhY2thZ2VOYW1lLmNfc3RyKCksIGFwcFBhY2thZ2VOYW1lLnNpemUoKSk7Ci0gICAgYW5hbHl0aWNzSXRlbS5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOworICAgIGFuYWx5dGljc0l0ZW0tPnNldFBrZ05hbWUoYXBwX3BhY2thZ2VfbmFtZSk7CiAgICAgaWYgKG1ldHJpY3Muc2l6ZSgpID4gMCkgewotICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CisgICAgICAgIGFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CiAgICAgfQogCi0gICAgaWYgKCFhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKSkgewotICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLmdldFNlc3Npb25JRCgpKTsKKyAgICBpZiAoIWFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKSkgeworICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLT5nZXRTZXNzaW9uSUQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA3NjI4OTY4Li45ZTAxMTVlIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAibGliYmluZGVyIiwKICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCAxNTU4ZThiLi5iZjM1MjI0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC02NSw3ICs2NSwyMCBAQAogICAgICpwbHVnaW4gPSBuZXcgQ2xlYXJLZXlDYXNQbHVnaW4oYXBwRGF0YSwgY2FsbGJhY2spOwogICAgIHJldHVybiBPSzsKIH0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdHVzX3QgQ2xlYXJLZXlDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogYm9vbCBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeTo6aXNTeXN0ZW1JZFN1cHBvcnRlZCgKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKICAgICByZXR1cm4gQ0Ffc3lzdGVtX2lkID09IHNDbGVhcktleVN5c3RlbUlkOwpAQCAtODQsNyArOTcsMTMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKICAgICAgICAgdm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQ2FsbGJhY2tFeHQoTlVMTCksIG1BcHBEYXRhKGFwcERhdGEpIHsKKyAgICBBTE9HVigiQ1RPUiIpOworfQorCitDbGVhcktleUNhc1BsdWdpbjo6Q2xlYXJLZXlDYXNQbHVnaW4oCisgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrKQorICAgIDogbUNhbGxiYWNrKE5VTEwpLCBtQ2FsbGJhY2tFeHQoY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CiAgICAgQUxPR1YoIkNUT1IiKTsKIH0KIApAQCAtMTY3LDExICsxODYsMzAgQEAKICAgICAvLyBFY2hvIHRoZSByZWNlaXZlZCBldmVudCB0byB0aGUgY2FsbGJhY2suCiAgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBhbnkgZXZlbnQsIGVjaG8naW5nIGZvciB0ZXN0aW5nIG9ubHkuCiAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLCBldmVudERhdGEuc2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSB7CisgICAgQUxPR1YoInNlbmRTZXNzaW9uRXZlbnQ6IHNlc3Npb25JZD0lcywgZXZlbnQ9JWQsIGFyZz0lZCIsCisgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSwgZXZlbnQsIGFyZyk7CisgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgorICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgorICAgIGlmIChtQ2FsbGJhY2tFeHQgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tFeHQoKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSwgJnNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgewogICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIHN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IDM4OWUxNzIuLmY0OGQ1YjEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDcsNiArNDcsMTEgQEAKICAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtNjMsNiArNjgsNyBAQAogY2xhc3MgQ2xlYXJLZXlDYXNQbHVnaW4gOiBwdWJsaWMgQ2FzUGx1Z2luIHsKIHB1YmxpYzoKICAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjayk7CisgICAgQ2xlYXJLZXlDYXNQbHVnaW4odm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2spOwogICAgIHZpcnR1YWwgfkNsZWFyS2V5Q2FzUGx1Z2luKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByaXZhdGVEYXRhKApAQCAtODUsNiArOTEsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCkBAIC05NCw2ICsxMDQsNyBAQAogICAgIE11dGV4IG1LZXlGZXRjaGVyTG9jazsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8S2V5RmV0Y2hlcj4gbUtleUZldGNoZXI7CiAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IG1DYWxsYmFja0V4dDsKICAgICB2b2lkKiBtQXBwRGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCmluZGV4IDg0MDRhODMuLjI5NjQ3OTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcApAQCAtNjAsNiArNjAsMTkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkKiAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgLypjYWxsYmFjayovLAorICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKKyAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgTW9ja0Nhc1BsdWdpbigpOworICAgIHJldHVybiBPSzsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIE1vY2tEZXNjcmFtYmxlckZhY3Rvcnk6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKQEAgLTE3MCw2ICsxODMsMTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBpbnQzMl90IGV2ZW50LAorICAgICAgICBpbnQgLyphcmcqLywgY29uc3QgQ2FzRGF0YSYgLypldmVudERhdGEqLykgeworICAgIEFMT0dWKCJzZW5kU2Vzc2lvbkV2ZW50OiBzZXNzaW9uSWQ9JXMsIGV2ZW50PSVkIiwKKyAgICAgICAgICBhcnJheVRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGV2ZW50KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIHsKICAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBzdHIuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKaW5kZXggODEwNjk5MC4uNzRiNTQwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKQEAgLTQyLDYgKzQyLDExIEBACiAgICAgICAgICAgICB2b2lkICphcHBEYXRhLAogICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTW9ja0Rlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtODAsNyArODUsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCiAgICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAppbmRleCA5M2M2NDNiLi5kNDhiMGE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKQEAgLTI3LDQgKzI3LDE4IEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhDaGFyc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgLy8gRWFjaCBpbnB1dCBieXRlIGNyZWF0ZXMgdHdvIG91dHB1dCBoZXggY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXRfYnVmZmVyKGxlbmd0aCAqIDIsICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBjaGFyIGJ5dGUgPSBpbl9idWZmZXJbaV07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKV0gPSBrSGV4Q2hhcnNbKGJ5dGUgPj4gNCkgJiAweGZdOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMikgKyAxXSA9IGtIZXhDaGFyc1tieXRlICYgMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9idWZmZXI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCmluZGV4IDI1NDMxMjQuLmFhNTcxYzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApAQCAtMTcsMTQgKzE3LDE2IEBACiAjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCiAjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCiAvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCmluZGV4IDJmY2UwNzkwLi4wYWM4NzljIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCAzNDFkNGY2Li5lOTFlOTE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC0xNCw4ICsxNCw4IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAogCiAgICAgc3JjczogWwpAQCAtMjUsMjMgKzI1LDI0IEBACiAgICAgICAgICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIiwKICAgICAgICAgIkNyeXB0b0ZhY3RvcnkuY3BwIiwKICAgICAgICAgIkNyeXB0b1BsdWdpbi5jcHAiLAorICAgICAgICAiRGV2aWNlRmlsZXMuY3BwIiwKICAgICAgICAgIkRybUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRybVBsdWdpbi5jcHAiLAogICAgICAgICAiSW5pdERhdGFQYXJzZXIuY3BwIiwKICAgICAgICAgIkpzb25XZWJLZXkuY3BwIiwKKyAgICAgICAgIk1lbW9yeUZpbGVTeXN0ZW0uY3BwIiwKICAgICAgICAgIlNlc3Npb24uY3BwIiwKICAgICAgICAgIlNlc3Npb25MaWJyYXJ5LmNwcCIsCi0gICAgICAgICJzZXJ2aWNlLmNwcCIsCiAgICAgXSwKIAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKIAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCkBAIC00OSwxMSArNTAsMTMgQEAKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAogICAgICAgICAibGlianNtbiIsCiAgICAgXSwKIApAQCAtNjUsNCArNjgsMjYgQEAKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICB9LAogfQorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCisgICAgdmVuZG9yOiB0cnVlLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCit9CitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSIsCisgICAgZGVmYXVsdHM6IFsiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic2VydmljZS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCit9CitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5IiwKKyAgICBvdmVycmlkZXM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiXSwKKyAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJzZXJ2aWNlTGF6eS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAppbmRleCBjMmVkNzUxLi42NTdhNDJmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcykgewpAQCAtMTY5LDcgKzE2OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKaW5kZXggZTU4ZjU4YS4uNzVmODM5NSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcApAQCAtMjEsNyArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogQnVmZmVyOjpCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQpAQCAtNDcsNyArNDcsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCmluZGV4IDFiYTVjNmEuLjE0MTBkNzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIGV4dGVybiAiQyIgewpAQCAtMzgsNyArMzgsNyBAQAogfSAvLyBleHRlcm4gIkMiCiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcAppbmRleCAwODQ4Y2VmLi4yYTQ4ZGI2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIFJldHVybjxib29sPiBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTYwLDcgKzYwLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAppbmRleCBmMzNmOTRlLi5mYzBjY2ViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7CkBAIC00MiwxMCArNDIsNDIgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KAorICAgIGJvb2wgc2VjdXJlLAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiBrZXlJZCwKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgaXYsCisgICAgTW9kZSBtb2RlLAorICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgY29uc3QgaGlkbF92ZWM8U3ViU2FtcGxlPiYgc3ViU2FtcGxlcywKKyAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKworICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKKworICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IGRlY3J5cHRfMV8yKAorICAgICAgc2VjdXJlLCBrZXlJZCwgaXYsIG1vZGUsIHBhdHRlcm4sIHN1YlNhbXBsZXMsIHNvdXJjZSwgb2Zmc2V0LCBkZXN0aW5hdGlvbiwKKyAgICAgIFsmXShTdGF0dXNfVjFfMiBoU3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICBzdGF0dXMgPSB0b1N0YXR1c18xXzAoaFN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IGhEZXRhaWxlZEVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgKTsKKworICBzdGF0dXMgPSBoUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgIF9oaWRsX2NiKHN0YXR1cywgYnl0ZXNXcml0dGVuLCBkZXRhaWxlZEVycm9yKTsKKyAgcmV0dXJuIFZvaWQoKTsKK30KKwogLy8gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9yIGNvZGUgYW5kIHBvc2l0aXZlIHZhbHVlcyBmb3IgdGhlIHNpemUgb2YKIC8vIGRlY3J5cHRlZCBkYXRhLiAgSW4gdGhlb3J5LCB0aGUgb3V0cHV0IHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBpbnB1dAogLy8gc2l6ZSwgYnV0IGluIHByYWN0aWNlIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIEFFUy1DVFIuCi1SZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KAorUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdF8xXzIoCiAgICAgICAgIGJvb2wgc2VjdXJlLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JRF9TSVpFPiYga2V5SWQsCiAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKQEAgLTU1LDE3ICs4NywxNyBAQAogICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAogICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCi0gICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgZGVjcnlwdF8xXzJfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQocGF0dGVybik7CiAKICAgICBpZiAoc2VjdXJlKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKICAgICAgICAgICAgICJTZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQ2xlYXJLZXkuIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgaWYgKG1TaGFyZWRCdWZmZXJNYXAuZmluZChzb3VyY2UuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAic291cmNlIGRlY3J5cHQgYnVmZmVyIGJhc2Ugbm90IHNldCIpOwogICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CkBAIC03Myw3ICsxMDUsNyBAQAogICAgIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGVzdCA9IGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeTsKICAgICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoZGVzdC5idWZmZXJJZCkgPT0gbVNoYXJlZEJ1ZmZlck1hcC5lbmQoKSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgIH0KQEAgLTgxLDEyICsxMTMsMTIgQEAKIAogICAgIHNwPElNZW1vcnk+IHNvdXJjZUJhc2UgPSBtU2hhcmVkQnVmZmVyTWFwW3NvdXJjZS5idWZmZXJJZF07CiAgICAgaWYgKHNvdXJjZUJhc2UgPT0gbnVsbHB0cikgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAic291cmNlIGlzIGEgbnVsbHB0ciIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJzb3VyY2UgaXMgYSBudWxscHRyIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgaWYgKHNvdXJjZS5vZmZzZXQgKyBvZmZzZXQgKyBzb3VyY2Uuc2l6ZSA+IHNvdXJjZUJhc2UtPmdldFNpemUoKSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCkBAIC05OCwxMiArMTMwLDEyIEBACiAgICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGVzdEJ1ZmZlciA9IGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeTsKICAgICAgICAgc3A8SU1lbW9yeT4gZGVzdEJhc2UgPSBtU2hhcmVkQnVmZmVyTWFwW2Rlc3RCdWZmZXIuYnVmZmVySWRdOwogICAgICAgICBpZiAoZGVzdEJhc2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlc3RCdWZmZXIub2Zmc2V0ICsgZGVzdEJ1ZmZlci5zaXplID4gZGVzdEJhc2UtPmdldFNpemUoKSkgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOwpAQCAtMTI4LDcgKzE2MCw3IEBACiAKICAgICBpZiAobW9kZSA9PSBNb2RlOjpVTkVOQ1JZUFRFRCkgewogICAgICAgICBpZiAoaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWQgc3Vic2FtcGxlcyBmb3VuZCBpbiBhbGxlZ2VkbHkgdW5lbmNyeXB0ZWQgZGF0YS4iKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KQEAgLTE0NCwyMiArMTc2LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNb2RlOjpBRVNfQ1RSKSB7CiAgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZDsKLSAgICAgICAgU3RhdHVzIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCisgICAgICAgIFN0YXR1c19WMV8yIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpLCB0b1ZlY3RvcihzdWJTYW1wbGVzKSwgJmJ5dGVzRGVjcnlwdGVkKTsKLSAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCksICIiKTsKKyAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVCwgc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzKSwKLSAgICAgICAgICAgICAgICAgICAgIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKHJlcywgMCwgIkRlY3J5cHRpb24gRXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBDbGVhcktleSBEUk0gUGx1Z2luLiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTE3OSw3ICsyMTAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKy8vIFByb3RvYnVmIGdlbmVyYXRlZCBjbGFzc2VzLgordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Ok9mZmxpbmVGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Okhhc2hlZEZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrTGljZW5zZUZpbGVOYW1lRXh0W10gPSAiLmxpYyI7CisKK2Jvb2wgSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc3RkOjpzdHJpbmcqIGhhc2gpIHsKKyAgICBpZiAoIWhhc2gpIHJldHVybiBmYWxzZTsKKworICAgIGhhc2gtPnJlc2l6ZShTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEuZGF0YSgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmKCpoYXNoKVswXSk7CisgICAgU0hBMjU2KGlucHV0LCBkYXRhLnNpemUoKSwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlTGljZW5zZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goc2VyaWFsaXplZEZpbGUsICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlV2l0aEhhc2g6IEZhaWxlZCB0byBjb21wdXRlIGhhc2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaGFzaEZpbGUuc2V0X2ZpbGUoc2VyaWFsaXplZEZpbGUpOworICAgIGhhc2hGaWxlLnNldF9oYXNoKGhhc2gpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIGhhc2hGaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVJhdyhmaWxlTmFtZSwgc2VyaWFsaXplZEhhc2hGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRIYXNoRmlsZSkgeworICAgIE1lbW9yeUZpbGVTeXN0ZW06Ok1lbW9yeUZpbGUgbWVtRmlsZTsKKyAgICBtZW1GaWxlLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKyAgICBtZW1GaWxlLnNldENvbnRlbnQoc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICBtZW1GaWxlLnNldEZpbGVTaXplKHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpOworICAgIHNpemVfdCBsZW4gPSBtRmlsZUhhbmRsZS5Xcml0ZShmaWxlTmFtZSwgbWVtRmlsZSk7CisKKyAgICBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVJhdzogRmFpbGVkIHRvIHdyaXRlICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IGV4cGVjdGVkPSV6ZCwgYWN0dWFsPSV6dSIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiB3cm90ZSAlenUgYnl0ZXMgdG8gJXMiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVMaWNlbnNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGlmICghUmV0cmlldmVIYXNoZWRGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS50eXBlKCkgIT0gT2ZmbGluZUZpbGU6OkxJQ0VOU0UpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnZlcnNpb24oKSAhPSBPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWZpbGUuaGFzX2xpY2Vuc2UoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBMaWNlbnNlIG5vdCBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMaWNlbnNlIGxpY2Vuc2UgPSBmaWxlLmxpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKGxpY2Vuc2Uuc3RhdGUoKSkgeworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRToKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVBY3RpdmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiUmV0cmlldmVMaWNlbnNlOiBVbnJlY29nbml6ZWQgbGljZW5zZSBzdGF0ZTogJXUiLAorICAgICAgICAgICAgICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93bik7CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqb2ZmbGluZUxpY2Vuc2UgPSBsaWNlbnNlLmxpY2Vuc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVBbGxMaWNlbnNlcygpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlQWxsRmlsZXMoKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6TGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGV2aWNlRmlsZXM6Okxpc3RMaWNlbnNlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZXMgPSBtRmlsZUhhbmRsZS5MaXN0RmlsZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpY2Vuc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBsaWNlbnNlID0gbGljZW5zZXNbaV07CisgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlLnN1YnN0cigwLCBsaWNlbnNlLnNpemUoKSAtIHN0cmxlbihrTGljZW5zZUZpbGVOYW1lRXh0KSk7CisgICAgfQorICAgIHJldHVybiBsaWNlbnNlczsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFGaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlcyA9IEdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgc2l6ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBzZXJpYWxpemVkSGFzaEZpbGUucmVzaXplKGJ5dGVzKTsKKyAgICBieXRlcyA9IG1GaWxlSGFuZGxlLlJlYWQoZmlsZU5hbWUsICZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgaWYgKGJ5dGVzICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogZXhwZWN0ZWQ6ICV6ZCwgYWN0dWFsOiAlemQiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBieXRlcyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiByZWFkICV6ZCBmcm9tICVzIiwgYnl0ZXMsIGZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBpZiAoIWhhc2hGaWxlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkSGFzaEZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBoYXNoIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChoYXNoRmlsZS5maWxlKCksICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhhc2ggIT0gaGFzaEZpbGUuaGFzaCgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggbWlzbWF0Y2giKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUtPlBhcnNlRnJvbVN0cmluZyhoYXNoRmlsZS5maWxlKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoZmlsZU5hbWUpOworfQorCitib29sIERldmljZUZpbGVzOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGZpbGVOYW1lKTsKK30KKworc3NpemVfdCBEZXZpY2VGaWxlczo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkdldEZpbGVTaXplKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDc3NTU3ZjkuLjlmYjViYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzAsMTAgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTQxLDYgKzQyLDEzIEBACiAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCh1dWlkLmRhdGEoKSk7CiB9CiAKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHJldHVybiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSAmJiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlKSAmJgorICAgICAgICAgICAgbGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKK30KKwogUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CiAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCiAgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fApAQCAtNzEsNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IDNiNjEwODUuLmJhZGI5OWUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIkNsZWFyS2V5RHJtUHJvcGVydGllcy5oIgogI2luY2x1ZGUgIlNlc3Npb24uaCIKICNpbmNsdWRlICJUeXBlQ29udmVydC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5U2V0SWRQcmVmaXgoImNraWQiKTsKK2NvbnN0IGludCBrS2V5U2V0SWRMZW5ndGggPSAxNjsKIGNvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrT2ZmbGluZUxpY2Vuc2UoIlwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCIiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOwotY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOwogCiBjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKQEAgLTU0LDE4ICs1OCwzMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAorS2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV9WMV8wKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgIHJldHVybiBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSk7CisgIH0KK30KKwogRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQogICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSksCiAgICAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQoMCksCi0gICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSB7CisgICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgICAgICBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykgewogICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CiAgICAgaW5pdFByb3BlcnRpZXMoKTsKICAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7CiB9CiAKIHZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKQEAgLTc1LDYgKzkyLDcgQEAKICAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKICAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0RybUVycm9yVGVzdFZhbHVlOwogCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CiAgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKQEAgLTEwMyw2ICsxMjEsNyBAQAogCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKQEAgLTExNCw2ICsxMzMsNyBAQAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKICAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHByb2Nlc3NNb2NrRXJyb3Ioc2Vzc2lvbik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CiAKICAgICBTdGF0dXMgc3RhdHVzID0gc2V0U2VjdXJpdHlMZXZlbChzZXNzaW9uSWQsIHNlY3VyaXR5TGV2ZWwpOwpAQCAtMTI5LDYgKzE0OSwxMCBAQAogCiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CiAgICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgc2VuZFNlc3Npb25Mb3N0U3RhdGUoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CiAgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CiAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwpAQCAtMTM3LDM1ICsxNjEsNzUgQEAKICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwogfQogCi1TdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKK1N0YXR1c19WMV8yIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAogICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmVxdWVzdCwKLSAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlLAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICprZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpIHsKICAgICAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKKyAgICAvLyBHZXRLZXlSZXF1ZXN0T2ZmbGluZUtleVR5cGVOb3RTdXBwb3J0ZWQoKSBpbiB2dHMgMS4wIGFuZCAxLjEgZXhwZWN0cworICAgIC8vIEtleVR5cGU6Ok9GRkxJTkUgdG8gcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFIGluIGNsZWFya2V5IHBsdWdpbi4KKyAgICAvLyBUaG9zZSB0ZXN0cyBwYXNzIGluIGFuIGVtcHR5IGluaXREYXRhLCB3ZSB1c2UgdGhlIGVtcHR5IGluaXREYXRhIHRvCisgICAgLy8gc2lnbmFsIHN1Y2ggc3BlY2lmaWMgdXNlIGNhc2UuCisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSAmJiAwID09IGluaXREYXRhLnNpemUoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKwogICAgICpkZWZhdWx0VXJsID0gIiI7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKLSAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpTVFJFQU1JTkcgfHwga2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OklOSVRJQUw7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKLSAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICB9CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KAorICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIHJlcXVlc3QpKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QtPmJlZ2luKCksIHJlcXVlc3QtPmVuZCgpKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eVJlc3BvbnNlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5U2V0SWRTdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ibGVtIHJlbGVhc2luZyBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZWxlYXNlS2V5c01hcC5maW5kKGtleVNldElkU3RyaW5nKSA9PSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgbVJlbGVhc2VLZXlzTWFwW2tleVNldElkU3RyaW5nXSA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgia2V5IGlzIGluIHVzZSwgaWdub3JlIHJlbGVhc2UgcmVxdWVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk9mZmxpbmUgbGljZW5zZSBub3QgZm91bmQsIG5vdGhpbmcgdG8gcmVsZWFzZSIpOworICAgICAgICB9CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlJFTEVBU0U7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3OCwxNSArMjQyLDE1IEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAotICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKLSAgICBTdGF0dXMgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKHN0YXR1cyksIHRvSGlkbFZlYyhyZXF1ZXN0KSwKKyAgICAgICAgICAgIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChrZXlSZXF1ZXN0VHlwZSksCiAgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KQEAgLTIwMCwxMCArMjY0LDMxIEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKKworICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBrZXlSZXF1ZXN0VHlwZSwgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCkBAIC0yMjcsNiArMzEyLDMwIEBACiAgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CiB9CiAKK2Jvb2wgRHJtUGx1Z2luOjptYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKSB7CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICBBTE9HRSgia2V5U2V0SWQgZGVzdGluYXRpb24gbm90IHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga3NpZChrS2V5U2V0SWRQcmVmaXguYmVnaW4oKSwga0tleVNldElkUHJlZml4LmVuZCgpKTsKKyAgICBrc2lkLnJlc2l6ZShrS2V5U2V0SWRMZW5ndGgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJhbmRvbURhdGEoKGtLZXlTZXRJZExlbmd0aCAtIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpIC8gMiwgMCk7CisKKyAgICB3aGlsZSAoa2V5U2V0SWQtPmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ciA9IHJhbmRvbURhdGEuYmVnaW4oKTsgaXRyICE9IHJhbmRvbURhdGEuZW5kKCk7ICsraXRyKSB7CisgICAgICAgICAgICAqaXRyID0gc3RkOjpyYW5kKCkgJSAweGZmOworICAgICAgICB9CisgICAgICAgICprZXlTZXRJZCA9IGtLZXlTZXRJZFByZWZpeCArIEJ5dGVBcnJheVRvSGV4U3RyaW5nKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhbmRvbURhdGEuZGF0YSgpKSwgcmFuZG9tRGF0YS5zaXplKCkpOworICAgICAgICBpZiAobUZpbGVIYW5kbGUuTGljZW5zZUV4aXN0cygqa2V5U2V0SWQpKSB7CisgICAgICAgICAgICAvLyBjb2xsaXNpb24sIHJlZ2VuZXJhdGUKKyAgICAgICAgICAgIEFMT0dWKCJSZXRyeSBnZW5lcmF0aW5nIEtleVNldElkIik7CisgICAgICAgICAgICBrZXlTZXRJZC0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTIzNywyMiArMzQ2LDYwIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IHRvVmVjdG9yKHNjb3BlKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgYm9vbCBpc1JlbGVhc2UgPSAobWVtY21wKHNjb3BlSWQuZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSA9PSAwKTsKKyAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgIGtleVNldElkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworCisgICAgICAgIGF1dG8gaXRlciA9IG1SZWxlYXNlS2V5c01hcC5maW5kKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSk7CisgICAgICAgIGlmIChpdGVyICE9IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihpdGVyLT5zZWNvbmQuYmVnaW4oKSwgaXRlci0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgLy8gbm9uIG9mZmxpbmUgbGljZW5zZSByZXR1cm5zIGVtcHR5IGtleVNldElkCisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVELCBoaWRsX3ZlYzx1aW50OF90PigpKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0KICAgICBzZXRQbGF5UG9saWN5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7Ci0gICAga2V5U2V0SWQuY2xlYXIoKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIC8vIFRlc3QgY2FsbGluZyBBTWVkaWFEcm0gbGlzdGVuZXJzLgotICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgdG9WZWN0b3Ioc2NvcGUpLCB0b1ZlY3RvcihzY29wZSkpOworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ha2VLZXlTZXRJZCgma2V5U2V0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04sIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZSh0b1ZlY3RvcihzY29wZSksIDEwMCk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IG1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZXNwb25zZS5iZWdpbigpLCByZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzOwogICAgICAgICBLZXlTdGF0dXMga2V5U3RhdHVzOwpAQCAtMjY3LDE2ICs0MTQsNTEgQEAKICAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOwogICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOwogCi0gICAgICAgIHNlbmRLZXlzQ2hhbmdlKHRvVmVjdG9yKHNjb3BlKSwga2V5c1N0YXR1cywgdHJ1ZSk7CisgICAgICAgIHNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5c1N0YXR1cywgdHJ1ZSk7CisKKyAgICAgICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2Vzc2lvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJvdmlkZUtleVJlc3BvbnNlIHJldHVybnMgZXJyb3I9JWQiLCBzdGF0dXMpOwogICAgIH0KIAotICAgIGluc3RhbGxTZWN1cmVTdG9wKHNjb3BlKTsKLQotICAgIC8vIFJldHVybnMgc3RhdHVzIGFuZCBlbXB0eSBrZXlTZXRJZAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWRWZWMoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkVmVjKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZXN0b3JlS2V5cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOworICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKKyAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd24gPT0gbGljZW5zZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBsaWNlbnNlIHN0YXRlPSVkIiwgbGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4ob2ZmbGluZUxpY2Vuc2UuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBvZmZsaW5lTGljZW5zZS5lbmQoKSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBrZXlzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZShwcm9wZXJ0eU5hbWUuY19zdHIoKSk7CkBAIC0yOTIsNiArNDc0LDggQEAKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWxnb3JpdGhtc0tleV07CiAgICAgfSBlbHNlIGlmIChuYW1lID09IGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KSB7CiAgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0RybUVycm9yVGVzdEtleV07CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAiIik7CkBAIC0zMzYsNiArNTIwLDE2IEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ZyYW1lVG9vTGFyZ2VWYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgICAgICB9CisgICAgfQorCiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKHZhbHVlLmNfc3RyKCkpOwogICAgIHJldHVybiBTdGF0dXM6Ok9LOwogfQpAQCAtMzQ2LDYgKzU0MCw5IEBACiAgICBpZiAobmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKICAgICAgIEFMT0dEKCJDYW5ub3Qgc2V0IGltbXV0YWJsZSBwcm9wZXJ0eTogJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgfSBlbHNlIGlmIChuYW1lID09IGtDbGllbnRJZEtleSkgeworICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSB0b1ZlY3Rvcih2YWx1ZSk7CisgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiAgICB9CiAKICAgIC8vIFNldHRpbmcgb2YgdW5kZWZpbmVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZApAQCAtNDgzLDYgKzY4MCw1MSBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VOYW1lcyA9IG1GaWxlSGFuZGxlLkxpc3RMaWNlbnNlcygpOworICAgIHN0ZDo6dmVjdG9yPEtleVNldElkPiBrZXlTZXRJZHM7CisgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogbGljZW5zZU5hbWVzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSk7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgIH0KKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBrZXlTZXRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQpIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgaWYgKG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2UobGljZW5zZU5hbWUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQmIGtleVNldElkLAorICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKKyAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGU7CisgICAgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVVbmtub3duOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBoTGljZW5zZVN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4gc3RvcHM7CiAgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgewpAQCAtNTg1LDcgKzgyNyw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCmluZGV4IGUyYmI2NTEuLjhlYmI0MmIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgewpAQCAtNDUsMjEgKzQ1LDIyIEBACiB9CiAKIFN0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgewogICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CiAKLSAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgaWYgKG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgewogICAgICAgICBTdGF0dXMgcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQpIHsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgewogICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECiAgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgewogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CkBAIC02OSw4ICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICB9CiAKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgIC8vIHJlc3RvcmUga2V5CisgICAgfQorCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKLSAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlJZHMpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CiAKICAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKQEAgLTEzMSw5ICsxMzYsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KIAotc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5U2Vzc2lvbigiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50U2Vzc2lvbigiXSxcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwifSIpOwogCiAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CiAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOwpAQCAtMTQ3LDcgKzE1NCwxMiBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZChlbmNvZGVkSWQpOwogICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKICAgICB9Ci0gICAgcmVxdWVzdC5hcHBlbmQoa1JlcXVlc3RTdWZmaXgpOworICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrVGVtcG9yYXJ5U2Vzc2lvbik7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6Ok9GRkxJTkUgfHwKKyAgICAgICAgICAgICAgICAgICBrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtQZXJzaXN0ZW50U2Vzc2lvbik7CisgICAgfQogCiAgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCiAgICAgY29uc3QgY2hhciBrQmFzZTY0UGFkZGluZyA9ICc9JzsKQEAgLTE1Nyw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKaW5kZXggY2NjYjQxZS4uZDkzNzc3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0yMiwxOCArMjIsMjEgQEAKICNpbmNsdWRlICJCYXNlNjQuaCIKIAogbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOwotY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUYWcoImsiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlJZFRhZygia2lkIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOworY29uc3Qgc3RkOjpzdHJpbmcga01lZGlhU2Vzc2lvblR5cGUoInR5cGUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50TGljZW5zZVNlc3Npb24oInBlcnNpc3RlbnQtbGljZW5zZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlU2Vzc2lvbigidGVtcG9yYXJ5Iik7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEpzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7CkBAIC0yNjgsNyArMjcxLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2QwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKTsKK30KKworc3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlc3VsdC0+c2Vjb25kLmdldEZpbGVTaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHNpemUgZm9yICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNZW1vcnlGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3Q7CisgICAgZm9yIChjb25zdCBhdXRvJiBmaWxlbmFtZSA6IG1NZW1vcnlGaWxlU3lzdGVtKSB7CisgICAgICAgIGxpc3QucHVzaF9iYWNrKGZpbGVuYW1lLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogYnVmZmVyKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGUgPSByZXN1bHQtPnNlY29uZC5nZXRDb250ZW50KCk7CisgICAgICAgIGJ1ZmZlci0+YXNzaWduKHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgICAgIHJldHVybiBidWZmZXItPnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZnJvbSAlcyIsIHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2Uoa2V5KTsKKyAgICB9CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4oa2V5LCBtZW1vcnlGaWxlKSk7CisgICAgcmV0dXJuIG1lbW9yeUZpbGUuZ2V0RmlsZVNpemUoKTsKK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgbGljZW5zZSB0byByZW1vdmU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uY2xlYXIoKTsKKyAgICByZXR1cm4gbU1lbW9yeUZpbGVTeXN0ZW0uZW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCmluZGV4IDA3YzkyNjkuLmE5ZDcwMTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcApAQCAtMjgsNyArMjgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTQyLDkgKzQyLDEwIEBACiBTdGF0dXMgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7Ci0gICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVJlcXVlc3QpOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBrZXlSZXF1ZXN0KTsKIH0KIAogU3RhdHVzIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKQEAgLTY3LDI5ICs2OCwzNCBAQAogICAgIH0KIH0KIAotU3RhdHVzIFNlc3Npb246OmRlY3J5cHQoCitTdGF0dXNfVjFfMiBTZXNzaW9uOjpkZWNyeXB0KAogICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKICAgICAgICAgdWludDhfdCogZGVzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAogICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwogCisgICAgaWYgKGdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICByZXR1cm4gZ2V0TW9ja0Vycm9yKCk7CisgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CiAgICAga2V5SWRWZWN0b3IuY2xlYXIoKTsKICAgICBrZXlJZFZlY3Rvci5pbnNlcnQoa2V5SWRWZWN0b3IuZW5kKCksIGtleUlkLCBrZXlJZCArIGtCbG9ja1NpemUpOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdHI7CiAgICAgaXRyID0gbUtleU1hcC5maW5kKGtleUlkVmVjdG9yKTsKICAgICBpZiAoaXRyID09IG1LZXlNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKLSAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgU3RhdHVzIHN0YXR1cyA9IGRlY3J5cHRvci5kZWNyeXB0KAogICAgICAgICAgICAgaXRyLT5zZWNvbmQgLyprZXkqLywgaXYsIHNyY1B0ciwgZGVzdFB0ciwgc3ViU2FtcGxlcywKICAgICAgICAgICAgIHN1YlNhbXBsZXMuc2l6ZSgpLCBieXRlc0RlY3J5cHRlZE91dCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPihzdGF0dXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAppbmRleCBiNDMxOWU2Li45OWZiMzBmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw3ICs1OSw4IEBACiAKICAgICBtU2Vzc2lvbnMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKICAgICAgICAgICAgIHNwPFNlc3Npb24+ID4oc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKSk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtNzAsNyArNzEsOCBAQAogc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtODQsNyArODYsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTg1NmEuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTEgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIG1lZGlhCi0gICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZkM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTQgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBkaXNhYmxlZAorICAgIG9uZXNob3QKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTIgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKaW5kZXggMGM3ZWYyMC4uNzIxZjRjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC00Miw3ICs0Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCmluZGV4IDRhMzg1YmQuLmVjMzBjYzEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC0zOCw3ICszOCw3IEBACiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKaW5kZXggNWJiYjI4YS4uYzQ5N2UzNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKaW5kZXggZDY1YjI1Yy4uMWJiYzgyMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMjIsMzAgKzIyLDM5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0S2V5KCJkcm1FcnJvclRlc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0VmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSgicmVzb3VyY2VDb250ZW50aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRnJhbWVUb29MYXJnZVZhbHVlKCJmcmFtZVRvb0xhcmdlIik7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KICAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAogICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCiAvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAppbmRleCA0NmNiNWU0Li4wM2M0MzRlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKQEAgLTE3LDE3ICsxNywxOCBAQAogI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCA5OTUyMDI3Li42MzY4ZjNkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggMTc1YWI3Ni4uMjAzYmIyZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCA2YTczODA2Li44NjgwZjBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTMyLDE2ICszMiwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUxLDcgKzUyLDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBJQ3J5cHRvUGx1Z2luIHsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK3N0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luIHsKICAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgICAgICBtSW5pdFN0YXR1cyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KQEAgLTgwLDYgKzgzLDE4IEBACiAgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCiAgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKIAorICAgIFJldHVybjx2b2lkPiBkZWNyeXB0XzFfMigKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSVZfU0laRT4mIGl2LAorICAgICAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICAgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKTsKKwogICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOwogCkBAIC05Niw3ICsxMTEsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm90b3MvRGV2aWNlRmlsZXMucGIuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitjbGFzcyBEZXZpY2VGaWxlcyB7CisgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKSB7fTsKKyAgICB2aXJ0dWFsIH5EZXZpY2VGaWxlcygpIHt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zZXRfaWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKaW5kZXggNmY1ODE5NS4uNGNhODU2ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTM5LDYgKzM5LDEwIEBACiAgICAgUmV0dXJuPGJvb2w+IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48Ym9vbD4gaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUpCiAgICAgICAgICAgICBvdmVycmlkZTsKIApAQCAtNTIsNyArNTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBmYjA2OTVhLi5iYTVmYTY1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0xNywzMiArMTcsNDIgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKICNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlc3Npb25JZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKK3VzaW5nIGRybTo6VjFfMDo6U2Vzc2lvbklkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTUwLDEwICs2MCwxNSBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCiBzdHJ1Y3QgRHJtUGx1Z2luIDogcHVibGljIElEcm1QbHVnaW4gewogICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpOwogCi0gICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KIAogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCkBAIC03Nyw2ICs5MiwxNCBAQAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gcHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTkxLDEzICsxMTQsNyBAQAogCiAgICAgUmV0dXJuPFN0YXR1cz4gcmVzdG9yZUtleXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotCi0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9CisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgb3ZlcnJpZGU7CiAKICAgICBSZXR1cm48dm9pZD4gcXVlcnlLZXlTdGF0dXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xMTUsNiArMTMyLDE4IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIGdldFByb3Zpc2lvblJlcXVlc3RfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZVR5cGUpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVBdXRob3JpdHkpOworCisgICAgICAgIGhpZGxfc3RyaW5nIGRlZmF1bHRVcmw7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgaGlkbF92ZWM8dWludDhfdD4oKSwgZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLAogICAgICAgICBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VfY2IgX2hpZGxfY2IpIHsKQEAgLTEzNCw2ICsxNjMsMTMgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0SGRjcExldmVsc18xXzIoZ2V0SGRjcExldmVsc18xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgY29ubmVjdGVkTGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOworICAgICAgICBIZGNwTGV2ZWxfVjFfMiBtYXhMZXZlbCA9IEhkY3BMZXZlbF9WMV8yOjpIRENQX05PX09VVFBVVDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6Ok9LLCBjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBnZXROdW1iZXJPZlNlc3Npb25zKGdldE51bWJlck9mU2Vzc2lvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKQEAgLTE0MSw2ICsxNzcsMTMgQEAKIAogICAgIFJldHVybjx2b2lkPiBnZXRNZXRyaWNzKGdldE1ldHJpY3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkICZrZXlTZXRJZCkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQsCisgICAgICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKwogICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCiAgICAgICAgIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKQEAgLTI0OCwxMiArMjkxLDE3IEBACiAKICAgICBSZXR1cm48dm9pZD4gc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybVBsdWdpbkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lclYxXzIgPSBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjo6Y2FzdEZyb20obGlzdGVuZXIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH07CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudCgKKyAgICAgICAgICAgIEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBkYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjYxLDggKzMwOSwxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yNzAsOSArMzIyLDEyIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yODAsNiArMzM1LDE0IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCkBAIC0zMDAsMTggKzM2MywxOSBAQAogcHJpdmF0ZToKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBpbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIG1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpOwogICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CiAKLSAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgU3RhdHVzX1YxXzIgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCiAgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAotICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqZ2V0S2V5UmVxdWVzdFR5cGUsCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZGVmYXVsdFVybCk7CiAKICAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKQEAgLTMyMywxOSArMzg3LDMxIEBACiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbVJlbGVhc2VLZXlzTWFwOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPiBtU2VjdXJpdHlMZXZlbDsKICAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMj4gbUxpc3RlbmVyVjFfMjsKICAgICBTZXNzaW9uTGlicmFyeSAqbVNlc3Npb25MaWJyYXJ5OwogICAgIGludDY0X3QgbU9wZW5TZXNzaW9uT2tDb3VudDsKICAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Pa0NvdW50OwogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OwogICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOwogCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3IobU1vY2tFcnJvcik7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKaW5kZXggMzE4OWM0YS4uODg5ZjUxMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtMzQsNyArMzQsOCBAQAogICAgIEluaXREYXRhUGFyc2VyKCkge30KIAogICAgIFN0YXR1cyBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CiAKIHByaXZhdGU6CkBAIC00MywxMiArNDQsMTIgQEAKICAgICBTdGF0dXMgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKIAotICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdCgKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCmluZGV4IDRhYjAzNGMuLmU1NzQ3MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogY2xhc3MgSnNvbldlYktleSB7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICAvLyBMaWNlbnNlIGZpbGUgbmFtZSBpcyBtYWRlIHVwIG9mIGEgdW5pcXVlIGtleVNldElkLCB0aGVyZWZvcmUsCisgICAgLy8gdGhlIGZpbGVuYW1lIGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGxpY2Vuc2VzIGluIHRoZQorICAgIC8vIG1lbW9yeSBmaWxlIHN5c3RlbS4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CisKKyAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVtb3J5RmlsZVN5c3RlbSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggY2RkZmNhNS4uYTE1OWU1YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw0MyArMjcsNTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKKwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCi0gICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHt9CiAgICAgdmlydHVhbCB+U2Vzc2lvbigpIHt9CiAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgU3RhdHVzIGdldEtleVJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWltZVR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKIAogICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOwogCi0gICAgU3RhdHVzIGRlY3J5cHQoCisgICAgU3RhdHVzX1YxXzIgZGVjcnlwdCgKICAgICAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICAgICAgdWludDhfdCogZHN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKIAorICAgIHZvaWQgc2V0TW9ja0Vycm9yKFN0YXR1c19WMV8yIGVycm9yKSB7bU1vY2tFcnJvciA9IGVycm9yO30KKyAgICBTdGF0dXNfVjFfMiBnZXRNb2NrRXJyb3IoKSBjb25zdCB7cmV0dXJuIG1Nb2NrRXJyb3I7fQorCiBwcml2YXRlOgogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CiAgICAgS2V5TWFwIG1LZXlNYXA7CiAgICAgTXV0ZXggbU1hcExvY2s7CisKKyAgICAvLyBGb3IgbW9ja2luZyBlcnJvciByZXR1cm4gc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCmluZGV4IDMyNmEwYzEuLjFlNTY3YjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTgsNyArNTgsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKaW5kZXggY2MwNjMyOS4uYjBmODYwNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC02OCw4ICs2OCwxOSBAQAogICAgIHJldHVybiB2ZWM7CiB9CiAKK2lubGluZSBTdGF0dXMgdG9TdGF0dXNfMV8wKFN0YXR1c19WMV8yIHN0YXR1cykgeworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRldmljZV9maWxlcy5wcm90bworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgIEZvcm1hdCBvZiB2YXJpb3VzIGZpbGVzIHN0b3JlZCBhdCB0aGUgZGV2aWNlLgorLy8KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuZHJtLlYxXzIuY2xlYXJrZXk7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgTGljZW5zZSB7CisgIGVudW0gTGljZW5zZVN0YXRlIHsKKyAgICBBQ1RJVkUgPSAxOworICAgIFJFTEVBU0lORyA9IDI7CisgIH0KKworICBvcHRpb25hbCBMaWNlbnNlU3RhdGUgc3RhdGUgPSAxOworICBvcHRpb25hbCBieXRlcyBsaWNlbnNlID0gMjsKK30KKworbWVzc2FnZSBPZmZsaW5lRmlsZSB7CisgIGVudW0gRmlsZVR5cGUgeworICAgIExJQ0VOU0UgPSAxOworICB9CisKKyAgZW51bSBGaWxlVmVyc2lvbiB7CisgICAgVkVSU0lPTl8xID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIEZpbGVUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBGaWxlVmVyc2lvbiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IFZFUlNJT05fMV07CisgIG9wdGlvbmFsIExpY2Vuc2UgbGljZW5zZSA9IDM7CisKK30KKworbWVzc2FnZSBIYXNoZWRGaWxlIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZmlsZSA9IDE7CisgIC8vIEEgcmF3IChub3QgaGV4LWVuY29kZWQpIFNIQTI1NiwgdGFrZW4gb3ZlciB0aGUgYnl0ZXMgb2YgJ2ZpbGUnLgorICBvcHRpb25hbCBieXRlcyBoYXNoID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCmluZGV4IDZhOTdiNzIuLmIzOWVhMDEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcApAQCAtMTMsMzIgKzEzLDI0IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIKLQogI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwotCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7Ci0KLSAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCi0gICAgLy8gL2Rldi92bmRiaW5kZXIKLSAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOwotCiAgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKICAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmQ4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OkxhenlTZXJ2aWNlUmVnaXN0cmFyOworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OworICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CisKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIExhenlTZXJ2aWNlUmVnaXN0cmFyIHNlcnZpY2VSZWdpc3RyYXI7CisKKyAgICAvLyBTZXR1cCBod2JpbmRlciBzZXJ2aWNlCisgICAgQ0hFQ0tfRVEoc2VydmljZVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2UoZHJtRmFjdG9yeSwgImNsZWFya2V5IiksIGFuZHJvaWQ6Ok5PX0VSUk9SKQorICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIENsZWFya2V5IEZhY3RvcnkgSEFMIjsKKyAgICBDSEVDS19FUShzZXJ2aWNlUmVnaXN0cmFyLnJlZ2lzdGVyU2VydmljZShjcnlwdG9GYWN0b3J5LCAiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgQ3J5cHRvICBIQUwiOworCisgICAgam9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI3YmE0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFlN2M5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNTU4NjU3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxYTk5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KLSNkZWZpbmUgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSBtYXN0ZXJpbmdfaW5kaWNhdGlvbiB7Ci0gICAgTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQsCi0gICAgTUFTVEVSRURfRk9SX1NURVJFTywKLSAgICBNQVNURVJFRF9GT1JfU1VSUk9VTkQsCi0gICAgTUFTVEVSRURfRk9SXzNELAotICAgIE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkUsCi19OwotCi1zdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQ7Ci0gICAgaW50MzJfdCBtUHJvZ3JhbUlkOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYWJlbHM7Ci0gICAgU3RyaW5nOCBtTGFuZ3VhZ2U7Ci0gICAgaW50MzJfdCBtTWFzdGVyaW5nSW5kaWNhdGlvbjsKLSAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlOwotICAgIGJvb2wgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZTsKLSAgICBib29sIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlOwotCi0gICAgQXVkaW9QcmVzZW50YXRpb24oKSB7Ci0gICAgICAgIG1QcmVzZW50YXRpb25JZCA9IC0xOwotICAgICAgICBtUHJvZ3JhbUlkID0gLTE7Ci0gICAgICAgIG1MYW5ndWFnZSA9ICIiOwotICAgICAgICBtTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUklOR19OT1RfSU5ESUNBVEVEOwotICAgICAgICBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgfQotfTsKLQotdHlwZWRlZiBWZWN0b3I8c3A8QXVkaW9QcmVzZW50YXRpb24+PiBBdWRpb1ByZXNlbnRhdGlvbnM7Ci0KLWNsYXNzIEF1ZGlvUHJlc2VudGF0aW9uSW5mbyA6IHB1YmxpYyBSZWZCYXNlIHsKLSBwdWJsaWM6Ci0gICAgQXVkaW9QcmVzZW50YXRpb25JbmZvKCk7Ci0KLSAgICB+QXVkaW9QcmVzZW50YXRpb25JbmZvKCk7Ci0KLSAgICB2b2lkIGFkZFByZXNlbnRhdGlvbihzcDxBdWRpb1ByZXNlbnRhdGlvbj4gcHJlc2VudGF0aW9uKTsKLQotICAgIHNpemVfdCBjb3VudFByZXNlbnRhdGlvbnMoKSBjb25zdDsKLQotICAgIGNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gICAgQXVkaW9QcmVzZW50YXRpb25zIG1QcmVzZW50YXRpb25zOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjZiZmFmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kNmYxYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCmluZGV4IDkwNWJlYzEuLjE5OGIyN2UgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAppbmRleCA1NGM4MDQ3Li5kMmFiMmYxIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitzdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjliMmM0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0V2ZW50TG9nLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmggYi9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGUyZGQwODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0YjM1ZmUxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTY0NzJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+IC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhVHJhY2s7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CisKK2V4dGVybiAiQyIgeworCitzdHJ1Y3QgQ0RhdGFTb3VyY2UgeworICAgIHNzaXplX3QgKCpyZWFkQXQpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCAoKmdldFNpemUpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqaGFuZGxlICk7CisgICAgYm9vbCAoKmdldFVyaSkodm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKKyAgICB2b2lkICpoYW5kbGU7Cit9OworCitlbnVtIENNZWRpYVRyYWNrUmVhZE9wdGlvbnMgOiB1aW50MzJfdCB7CisgICAgU0VFS19QUkVWSU9VU19TWU5DID0gMCwKKyAgICBTRUVLX05FWFRfU1lOQyA9IDEsCisgICAgU0VFS19DTE9TRVNUX1NZTkMgPSAyLAorICAgIFNFRUtfQ0xPU0VTVCA9IDMsCisgICAgU0VFS19GUkFNRV9JTkRFWCA9IDQsCisgICAgU0VFSyA9IDgsCisgICAgTk9OQkxPQ0tJTkcgPSAxNgorfTsKKworLyoqCisgKiBvbmx5IHVzZSBDTWVkaWFCdWZmZXIgYWxsb2NhdGVkIGZyb20gdGhlIENNZWRpYUJ1ZmZlckdyb3VwIHRoYXQgaXMKKyAqIHByb3ZpZGVkIHRvIENNZWRpYVRyYWNrOjpzdGFydCgpCisgKi8KK3N0cnVjdCBDTWVkaWFCdWZmZXIgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICgqcmVsZWFzZSkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkKiAoKmRhdGEpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqc2l6ZSkodm9pZCAqaGFuZGxlKTsKKyAgICBzaXplX3QgKCpyYW5nZV9vZmZzZXQpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2VfbGVuZ3RoKSh2b2lkICpoYW5kbGUpOworICAgIHZvaWQgKCpzZXRfcmFuZ2UpKHZvaWQgKmhhbmRsZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCk7CisgICAgQU1lZGlhRm9ybWF0KiAoKm1ldGFfZGF0YSkodm9pZCAqaGFuZGxlKTsKK307CisKK3N0cnVjdCBDTWVkaWFCdWZmZXJHcm91cCB7CisgICAgdm9pZCAqaGFuZGxlOworICAgIGJvb2wgKCppbml0KSh2b2lkICpoYW5kbGUsIHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCk7CisgICAgdm9pZCAoKmFkZF9idWZmZXIpKHZvaWQgKmhhbmRsZSwgc2l6ZV90IHNpemUpOworICAgIG1lZGlhX3N0YXR1c190ICgqYWNxdWlyZV9idWZmZXIpKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpOworICAgIGJvb2wgKCpoYXNfYnVmZmVycykodm9pZCAqaGFuZGxlKTsKK307CisKK3N0cnVjdCBDTWVkaWFUcmFjayB7CisgICAgdm9pZCAqZGF0YTsKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0YXJ0KSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXApOworICAgIG1lZGlhX3N0YXR1c190ICgqc3RvcCkodm9pZCAqZGF0YSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRGb3JtYXQpKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnJlYWQpKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgdWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpOworICAgIGJvb2wgICAgICgqc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQpKHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IENNZWRpYUV4dHJhY3RvciB7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKyAgICBzaXplX3QgKCpjb3VudFRyYWNrcykodm9pZCAqZGF0YSk7CisgICAgQ01lZGlhVHJhY2sqICgqZ2V0VHJhY2spKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRUcmFja01ldGFEYXRhKSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0TWV0YURhdGEpKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqbWV0YSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqZGF0YSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpzZXRNZWRpYUNhcykodm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKTsKKyAgICBjb25zdCBjaGFyICogKCpuYW1lKSh2b2lkICpkYXRhKTsKK307CisKK3R5cGVkZWYgQ01lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKShDRGF0YVNvdXJjZSAqc291cmNlLCB2b2lkICptZXRhKTsKK3R5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7CisKKy8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCisvLyB0aGUgY29ycmVzcG9uZGluZyBleHRyYWN0b3IgaW5pdGlhbGl6ZSBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZworLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQorLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KK3R5cGVkZWYgQ3JlYXRvckZ1bmMgKCpTbmlmZmVyRnVuYykoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7CisKK3R5cGVkZWYgQ01lZGlhRXh0cmFjdG9yIENNZWRpYUV4dHJhY3RvcjsKK3R5cGVkZWYgQ3JlYXRvckZ1bmMgQ3JlYXRvckZ1bmM7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Cit9IG1lZGlhX3V1aWRfdDsKKworc3RydWN0IEV4dHJhY3RvckRlZiB7CisgICAgLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKKworICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgorICAgIC8vIFNlZSBiZWxvdyBmb3IgYSBjb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgdGhpcyBmcm9tIGEgc3RyaW5nLgorICAgIG1lZGlhX3V1aWRfdCBleHRyYWN0b3JfdXVpZDsKKworICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB1dWlkIGFyZSBlbmNvdW50ZXJlZCwgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHZlcnNpb24gbnVtYmVyIHdpbGwKKyAgICAvLyBiZSB1c2VkLgorICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOworCisgICAgLy8gYSBodW1hbiByZWFkYWJsZSBuYW1lCisgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7CisKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgfSB2MjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIFNuaWZmZXJGdW5jIHNuaWZmOworICAgICAgICAgICAgLy8gYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBjb250YWluZXIgbWltZSB0eXBlcyBhbmQvb3IgZmlsZSBleHRlbnNpb25zCisgICAgICAgICAgICAvLyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzCisgICAgICAgICAgICBjb25zdCBjaGFyICoqc3VwcG9ydGVkX3R5cGVzOworICAgICAgICB9IHYzOworICAgIH0gdTsKK307CisKKy8vIHRoZSBDKysgYmFzZWQgQVBJIHdoaWNoIGZpcnN0IHNoaXBwZWQgaW4gUCBhbmQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAorY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT05fTEVHQUNZID0gMTsKKworLy8gdGhlIGZpcnN0IEMvTkRLIGJhc2VkIEFQSQorY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxID0gMjsKKworLy8gdGhlIHNlY29uZCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMiA9IDM7CisKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OID0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyOworCisvLyBlYWNoIHBsdWdpbiBsaWJyYXJ5IGV4cG9ydHMgb25lIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZQordHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fQVBJX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2ZjE3NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaApAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgTWV0YURhdGFCYXNlOworc3RydWN0IE1lZGlhVHJhY2s7CisKKworY2xhc3MgTWVkaWFUcmFja0hlbHBlcjsKKworY2xhc3MgTWVkaWFCdWZmZXJIZWxwZXIgeworcHJpdmF0ZToKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqKTsKKyAgICBDTWVkaWFCdWZmZXIgKm1CdWZmZXI7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJIZWxwZXIoQ01lZGlhQnVmZmVyICpidWYpIHsKKyAgICAgICAgbUJ1ZmZlciA9IGJ1ZjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckhlbHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCogZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPmRhdGEobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+c2l6ZShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnJhbmdlX29mZnNldChtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnJhbmdlX2xlbmd0aChtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgeworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UobUJ1ZmZlci0+aGFuZGxlLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIHZpcnR1YWwgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5tZXRhX2RhdGEobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyIHsKK3ByaXZhdGU6CisgICAgQ01lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBzdGQ6Om1hcDxDTWVkaWFCdWZmZXIqLCBNZWRpYUJ1ZmZlckhlbHBlcio+IG1CdWZmZXJIZWxwZXJzOworcHVibGljOgorICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoQ01lZGlhQnVmZmVyR3JvdXAgKmdyb3VwKSB7CisgICAgICAgIG1Hcm91cCA9IGdyb3VwOworICAgIH0KKyAgICB+TWVkaWFCdWZmZXJHcm91cEhlbHBlcigpIHsKKyAgICAgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcAorICAgICAgICBBTE9HVigiYnVmZmVyZ3JvdXAgJXAgbWFwIGhhcyAlenUgZW50cmllcyIsIHRoaXMsIG1CdWZmZXJIZWxwZXJzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJIZWxwZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJIZWxwZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCkgeworICAgICAgICByZXR1cm4gbUdyb3VwLT5pbml0KG1Hcm91cC0+aGFuZGxlLCBidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworICAgIH0KKyAgICB2b2lkIGFkZF9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApIHsKKyAgICAgICAgQ01lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPQorICAgICAgICAgICAgICAgIG1Hcm91cC0+YWNxdWlyZV9idWZmZXIobUdyb3VwLT5oYW5kbGUsICZidWYsIG5vbkJsb2NraW5nLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gaGVscGVyID0gbUJ1ZmZlckhlbHBlcnMuZmluZChidWYpOworICAgICAgICAgICAgaWYgKGhlbHBlciA9PSBtQnVmZmVySGVscGVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyKiBuZXdIZWxwZXIgPSBuZXcgTWVkaWFCdWZmZXJIZWxwZXIoYnVmKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVySGVscGVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYnVmLCBuZXdIZWxwZXIpKTsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gbmV3SGVscGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gaGVscGVyLT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBib29sIGhhc19idWZmZXJzKCkgeworICAgICAgICByZXR1cm4gbUdyb3VwLT5oYXNfYnVmZmVycyhtR3JvdXAtPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFUcmFja0hlbHBlciB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFja0hlbHBlcigpIDogbUJ1ZmZlckdyb3VwKG51bGxwdHIpIHsKKyAgICB9CisgICAgdmlydHVhbCB+TWVkaWFUcmFja0hlbHBlcigpIHsKKyAgICAgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICB9CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQpID0gMDsKKworICAgIGNsYXNzIFJlYWRPcHRpb25zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKKyAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKSB7CisgICAgICAgICAgICBtT3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgICAgICBtU2Vla1Bvc1VzID0gc2Vla1Bvc1VzOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSykgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0aW1lX3VzID0gbVNlZWtQb3NVczsKKyAgICAgICAgICAgICptb2RlID0gKFNlZWtNb2RlKSAobU9wdGlvbnMgJiA3KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9wdGlvbnMgJiBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrUG9zVXM7CisgICAgfTsKKworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKSB7IHJldHVybiBmYWxzZTsgfQorcHJvdGVjdGVkOgorICAgIGZyaWVuZCBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjayk7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworfTsKKworaW5saW5lIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrKSB7CisgICAgaWYgKHRyYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIENNZWRpYVRyYWNrICp3cmFwcGVyID0gKENNZWRpYVRyYWNrKikgbWFsbG9jKHNpemVvZihDTWVkaWFUcmFjaykpOworICAgIHdyYXBwZXItPmRhdGEgPSB0cmFjazsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFUcmFja0hlbHBlciopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+c3RhcnQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXApIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgaWYgKCgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaGFuZGxlIGl0IGFueXdheQorICAgICAgICAgICAgZGVsZXRlICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cDsKKyAgICAgICAgfQorICAgICAgICAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cEhlbHBlcihidWZmZXJHcm91cCk7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdGFydCgpOworICAgIH07CisgICAgd3JhcHBlci0+c3RvcCA9IFtdKHZvaWQgKmRhdGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN0b3AoKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldEZvcm1hdCA9IFtdKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+Z2V0Rm9ybWF0KG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+cmVhZCA9IFtdKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKQorICAgICAgICAgICAgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyBvcHRzKG9wdGlvbnMsIHNlZWtQb3NVcyk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWYgPSBOVUxMOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5yZWFkKCZidWYsICZvcHRzKTsKKyAgICAgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICpidWZmZXIgPSBidWYtPm1CdWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9OworICAgIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkID0gW10odm9pZCAqZGF0YSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworCisvLyBleHRyYWN0b3IgcGx1Z2lucyBjYW4gZGVyaXZlIGZyb20gdGhpcyBjbGFzcyB3aGljaCBsb29rcyByZW1hcmthYmx5CisvLyBsaWtlIE1lZGlhRXh0cmFjdG9yIGFuZCBjYW4gYmUgZWFzaWx5IHdyYXBwZWQgaW4gdGhlIHJlcXVpcmVkIEMgQVBJCitjbGFzcyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcgoreworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoKSB7fQorCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJik7Cit9OworCitpbmxpbmUgQ01lZGlhRXh0cmFjdG9yICp3cmFwKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICpleHRyYWN0b3IpIHsKKyAgICBDTWVkaWFFeHRyYWN0b3IgKndyYXBwZXIgPSAoQ01lZGlhRXh0cmFjdG9yKikgbWFsbG9jKHNpemVvZihDTWVkaWFFeHRyYWN0b3IpKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gZXh0cmFjdG9yOworICAgIHdyYXBwZXItPmZyZWUgPSBbXSh2b2lkICpkYXRhKSAtPiB2b2lkIHsKKyAgICAgICAgZGVsZXRlIChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+Y291bnRUcmFja3MgPSBbXSh2b2lkICpkYXRhKSAtPiBzaXplX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmNvdW50VHJhY2tzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFjayA9IFtdKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCkgLT4gQ01lZGlhVHJhY2sqIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrKGluZGV4KSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFja01ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrTWV0YURhdGEobWV0YSwgaW5kZXgsIGZsYWdzKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldE1ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0TWV0YURhdGEobWV0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5mbGFncyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gdWludDMyX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmZsYWdzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zZXRNZWRpYUNhcyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCAqY2FzVG9rZW4sIHNpemVfdCBzaXplKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+c2V0TWVkaWFDYXMoY2FzVG9rZW4sIHNpemUpOworICAgIH07CisgICAgd3JhcHBlci0+bmFtZSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gY29uc3QgY2hhciAqIHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5uYW1lKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworLyogYWRkcyBzb21lIGNvbnZpZW5jZSBtZXRob2RzICovCitjbGFzcyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKworICAgIGV4cGxpY2l0IERhdGFTb3VyY2VIZWxwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2UtPm1Tb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZUhlbHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG1Tb3VyY2UtPmhhbmRsZSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShtU291cmNlLT5oYW5kbGUsIHNpemUpOworICAgIH0KKworICAgIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFVyaShtU291cmNlLT5oYW5kbGUsIHVyaVN0cmluZywgYnVmZmVyU2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmZsYWdzKG1Tb3VyY2UtPmhhbmRsZSk7CisgICAgfQorCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKKyAgICBib29sIGdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVsyXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDIpICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgOCkgfCBieXRlWzFdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIDMgYnl0ZSBpbnQsIHJldHVybmVkIGFzIGEgMzItYml0IGludAorICAgIGJvb2wgZ2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDhfdCBieXRlWzNdOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMykgIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoYnl0ZVswXSA8PCAxNikgfCAoYnl0ZVsxXSA8PCA4KSB8IGJ5dGVbMl07CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IG50b2hsKHRtcCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50NjRfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA4KSAhPSA4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9ICgodWludDY0X3QpbnRvaGwodG1wICYgMHhmZmZmZmZmZikgPDwgMzIpIHwgbnRvaGwodG1wID4+IDMyKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCisgICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDE2KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgdWludDhfdCB0bXA7CisgICAgICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50MzIob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICB1aW50MTZfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDY0KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIENEYXRhU291cmNlICptU291cmNlOworfTsKKworCisKKy8vIGhlbHBlcnMgdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbAorCisvLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCisvLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKK2ludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7CisgICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJworICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAorICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Cit9CisKK2NvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgeworICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBOPgorY29uc3RleHByIG1lZGlhX3V1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOworICAgIHJldHVybgorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCisgICAgICAgICAgICBtZWRpYV91dWlkX3Qge3sKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAwKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA5KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxMSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjgpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMwKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzQpLAorICAgICAgICAgICAgfX07Cit9CisvLyBDb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgYSBtZWRpYV91dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBzaG91bGQKKy8vIGJlIGZvcm1hdHRlZCBhcyAiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjIiwgYXMgZ2VuZXJhdGVkIGJ5CisvLyBlLmcuIGh0dHBzOi8vd3d3LnV1aWRnZW5lcmF0b3IubmV0LyBvciB0aGUgJ3V1aWRnZW4nIGxpbnV4IGNvbW1hbmQuCisvLyBIZXggZGlnaXRzIG1heSBiZSB1cHBlciBvciBsb3dlciBjYXNlLgorLy8KKy8vIFRoZSBtYWNybyBjYWxsIGlzIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseQorLy8gKGUuZy4gVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IikgaXMgdGhlIHNhbWUgYXMKKy8vICAgICAgIHt7MHg3ZCwgMHg2MSwgMHgzOCwgMHg1OCwgMHg1OCwgMHgzNywgMHg0YSwgMHgzOCwKKy8vICAgICAgICAgMHg4NCwgMHhjNSwgMHgzMywgMHgyZCwgMHgxYywgMHhkZCwgMHhlZSwgMHgyN319KQorCisjZGVmaW5lIFVVSUQoc3RyKSBbXXsgY29uc3RleHByIG1lZGlhX3V1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWY3NTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKaW5kZXggMmUxNDdjNC4uMzRiZjY1ZCAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNWE2MzI4N2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzZWJhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitzdHJ1Y3QgQ01lZGlhVHJhY2s7CisKK2NsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorfTsKKworc3RydWN0IE1lZGlhVHJhY2sKKy8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKK3sKKyAgICBNZWRpYVRyYWNrKCk7CisKKyAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKKyAgICAvLyBnZXRGb3JtYXQoKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCisgICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCisgICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KKyAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAorICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOworCisgICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bworICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlaworICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAorICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7CisgICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKKyAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgsCisgICAgICAgIH07CisKKyAgICAgICAgUmVhZE9wdGlvbnMoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbU9wdGlvbnMgPSAwOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7CisgICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKSB7CisgICAgICAgICAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCisgICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KKyAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7CisgICAgICAgICAgICBjbGVhclNlZWtUbygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBlbnVtIE9wdGlvbnMgeworICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7CisgICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKKyAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgorCisgICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQorICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgIC8vIGlzIHJlYWNoZWQuCisgICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KKyAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcworICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKKyAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxyZWFkfCBzdXBwb3J0cyBub25ibG9ja2luZyBvcHRpb24sIG90aGVyd2lzZSBmYWxzZS4KKyAgICAvLyB8cmVhZE11bHRpcGxlfCBpZiBzdXBwb3J0ZWQsIGFsd2F5cyBhbGxvd3MgdGhlIG5vbmJsb2NraW5nIG9wdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7CisgICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Cit9OworCitjbGFzcyBNZWRpYVRyYWNrQ1Vud3JhcHBlciA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFUcmFja0NVbndyYXBwZXIgKmNyZWF0ZShDTWVkaWFUcmFjayAqd3JhcHBlcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFUcmFja0NVbndyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqd3JhcHBlcik7CisgICAgQ01lZGlhVHJhY2sgKndyYXBwZXI7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiYmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IoYW5kcm9pZDo6c3RhdHVzX3QpOworCithbmRyb2lkOjpzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCk7CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0VSUk9SX1BSSVZfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYTRhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFGb3JtYXQgeworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFNZXNzYWdlPiBtRm9ybWF0OworICAgIGFuZHJvaWQ6OlN0cmluZzggbURlYnVnOworICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1TdHJpbmdDYWNoZTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHNwPEFNZXNzYWdlPiAqKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKaW5kZXggZTNlZjEzNC4uODVlMTdmOSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAorKysgYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYWRhYTQ4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggY2ExMTlkNS4uNWYxOWY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01MzgsNiArNTM4LDEwIEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yLnB1c2godGltZXN0YW1wKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIEV4dGVuZGVkVGltZXN0YW1wIGdldFRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXBNdXRhdG9yLmxhc3QoKTsKKyAgICB9CisKICAgICAvLyBGbHVzaGVzIHRoZSBzaGFyZWQgcmluZyBidWZmZXIgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIGl0IHVzaW5nIG1TdHJlYW1pbmcubUZsdXNoLgogICAgIC8vIElmIGZsdXNoIG9jY3VycyB0aGVuOgogICAgIC8vICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCwgU2VydmVyUHJveHk6Om1GbHVzaCBhbmQgU2VydmVyUHJveHk6Om1GbHVzaGVkIHdpbGwgYmUgbW9kaWZpZWQKQEAgLTU1MSw2ICs1NTUsOSBAQAogICAgIC8vIFRvdGFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZmx1c2hlZCBmcmFtZXMgc2luY2UgY3JlYXRpb24gKG5ldmVyIHJlc2V0KS4KICAgICB2aXJ0dWFsIGludDY0X3QgICAgIGZyYW1lc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBtRmx1c2hlZDsgfQogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCA9IDA7CisKICAgICAvLyBHZXQgZHluYW1pYyBidWZmZXIgc2l6ZSBmcm9tIHRoZSBzaGFyZWQgY29udHJvbCBibG9jay4KICAgICB1aW50MzJfdCAgICAgICAgICAgIGdldEJ1ZmZlclNpemVJbkZyYW1lcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgoaW50MzJfdCAqKSZtQ2Jsay0+bUJ1ZmZlclNpemVJbkZyYW1lcyk7CkBAIC01ODgsOCArNTk1LDcgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKLSAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBzZXJ2ZXIuCiAKICAgICAvLyBDdXJyZW50bHkgQXVkaW9GbGluZ2VyIHdpbGwgY2FsbCBmcmFtZXNSZWFkeSgpIGZvciBhIGZhc3QgdHJhY2sgZnJvbSB0d28gdGhyZWFkczoKICAgICAvLyBGYXN0TWl4ZXIgdGhyZWFkLCBhbmQgbm9ybWFsIG1peGVyIHRocmVhZC4gIFRoaXMgaXMgZGFuZ2Vyb3VzLCBhcyB0aGUgcHJveHkgaXMgaW50ZW5kZWQKQEAgLTY5Myw2ICs2OTksOCBAQAogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsgLy8gRm9yIGNvbXBsZXRlbmVzcyBvbmx5OyBtUmVhciB3cml0dGVuIGJ5IHNlcnZlci4KICAgICB9CiAKKyAgICBzaXplX3QgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBjbGllbnQuCisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCmluZGV4IDVmZDhlYjIuLmMzNTdjYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaAppbmRleCA3YTI5ZTMxLi4yZTJmZjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaApAQCAtNTIsNiArNTIsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICAgICAgIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggMWY2ODdhMi4uMWUyZDEyMyAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtMiw4ICsyLDEwIEBACiBkd2thbmdAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXNzaWNrQGdvb2dsZS5jb20KK2drYXN0ZW5AZ29vZ2xlLmNvbQogaGt1YW5nQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KK2ppYWJpbkBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIGtyb2NhcmRAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKaW5kZXggNzBjMjgxYS4uMWYyNDQxMyAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCkBAIC00LDcgKzQsNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCW1haW5fYXVkaW9zZXJ2ZXIuY3BwIFwKLQkuLi9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliYWF1ZGlvc2VydmljZSBcCkBAIC0xNyw5ICsxNiwxMiBAQAogCWxpYmh3YmluZGVyIFwKIAlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKKwlsaWJtZWRpYXV0aWxzIFwKIAlsaWJuYmFpbyBcCisJbGlibmJsb2cgXAogCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAotCWxpYnV0aWxzCisJbGlidXRpbHMgXAorCWxpYnZpYnJhdG9yCiAKICMgVE9ETyBvYm9lc2VydmljZSBpcyB0aGUgb2xkIGZvbGRlciBuYW1lIGZvciBhYXVkaW9zZXJ2aWNlLiBJdCB3aWxsIGJlIGNoYW5nZWQuCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKQEAgLTQwLDkgKzQyLDYgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKLUxPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKLQogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCkBAIC01NCwxMyArNTMsOSBAQAogIyAgIGJvdGggICAgdG8gYnVpbGQgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBsaWJyYXJpZXMsCiAjICAgICAgICAgICBhbmQgdXNlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoMzIgb3IgNjQpIGZvciBhdWRpb3NlcnZlci4KICMgICBmaXJzdCAgIHRvIGJ1aWxkIGxpYnJhcmllcyBhbmQgYXVkaW9zZXJ2ZXIgZm9yIHRoZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgb25seS4KLSMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIDMyIGJpdCBhdWRpb3NlcnZlci4KKyMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIHByaW1hcnkgdGFyZ2V0IGF1ZGlvc2VydmVyLgogCi1pZmVxICgkKHN0cmlwICQoQVVESU9TRVJWRVJfTVVMVElMSUIpKSwpCi1MT0NBTF9NVUxUSUxJQiA6PSAzMgotZWxzZQogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLWVuZGlmCiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgogCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCmluZGV4IDFmMmU4MmYuLmRmYjFhM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCkBAIC03LDYgKzcsNyBAQAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKICAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCiAgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMApAQCAtMTUsMyArMTYsNiBAQAogICAgIHN0b3AgYXVkaW9zZXJ2ZXIKIG9uIHByb3BlcnR5OnZ0cy5uYXRpdmVfc2VydmVyLm9uPTAKICAgICBzdGFydCBhdWRpb3NlcnZlcgorCitvbiBpbml0CisgICAgbWtkaXIgL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIgMDc3NSBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqIGZtcURlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIGZhbHNlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsICpmbXFEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbDsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCh0aGlzLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTdmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgZm1xRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApIHt9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbCAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYTcwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUyMGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw3MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCgpOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1JbnZhbGlkYXRlZDsgLy8gVE9ETzogaW1wbGVtZW50CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1JbnZhbGlkYXRlZChmYWxzZSksIG1IYXNDYWNoZShmYWxzZSksCisgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpbUludmFsaWRhdGVkOworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgKmZtcURlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmZm1xRGVzYywgdHJ1ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKmZtcURlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dENoYW5uZWxdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yJiBkZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgIH0KKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlCisgKiBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEFuIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcworICogYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThmNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVye2J1ZmZlcklkLCBoYW5kbGV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcnswLCBudWxscHRyfSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWNiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBRdWV1ZURlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU3NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YTc1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCit2b2lkIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QgbXNnSWQ7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciogZm1xRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiBpbnZEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgZmFsc2UsICZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmbXNnSWQsICZmbXFEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCBtc2dJZCwgKmZtcURlc2MsICppbnZEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsIDAsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLyksCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JVbnN5bmM8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Zmx1c2goKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsIGJvb2wgbG9jYWwsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QoCisgICAgICAgICAgICAgICAgdGhpcywgb2JzZXJ2ZXIsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIHBNc2dJZCwKKyAgICAgICAgICAgICAgICBzdGF0dXNEZXNjUHRyLCBpbnZEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDI1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLCBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBvd25lZCBieSBidWZmZXJwb29sICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgICAgICBjbGllbnQgb2JzZXJ2ZXIgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwTXNnSWQgICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjZW50IGJ1ZmZlciBwb29sIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc3RhdHVzRGVzY1B0ciBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52RGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgZnJvbSBhIGJ1ZmZlciBwb29sIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjYwOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDg1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZyksCisgICAgICAgICAgICBtSW52YWxpZGF0ZWQoZmFsc2UpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1JbnZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIHN0YXR1c0Rlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICpwTXNnSWQgPSBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uQ2hhbm5lbC5nZXREZXNjKGludkRlc2NQdHIpOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25Db25uZWN0KGlkLCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIEFMT0dWKCJjb25uZWN0aW9uIGNsb3NlICVsbGQ6ICV1IiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQsIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUlkKTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25DbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5mbHVzaChzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpoYW5kbGVJbnZhbGlkYXRlQWNrKCkgeworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gb2JzZXJ2ZXJzOworICAgIHVpbnQzMl90IGludmFsaWRhdGlvbklkOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25IYW5kbGVBY2soJm9ic2VydmVycywgJmludmFsaWRhdGlvbklkKTsKKyAgICB9CisgICAgLy8gRG8gbm90IGhvbGQgbG9jayBmb3Igc2VuZCBpbnZhbGlkYXRpb25zCisgICAgZm9yIChhdXRvIGl0ID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ICE9IG9ic2VydmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBvYnNlcnZlci0+b25NZXNzYWdlKGl0LT5maXJzdCwgaW52YWxpZGF0aW9uSWQpOworICAgICAgICAgICAgKHZvaWQpIHRyYW5zUmVzdWx0OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtQnVmZmVyUG9vbC5pc1ZhbGlkKCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSwKKyAgICAgIG1TdGFydFNlcSgwKSB7CisgICAgbVZhbGlkID0gbUludmFsaWRhdGlvbkNoYW5uZWwuaXNWYWxpZCgpOworfQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK3N0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246OnNJbnZTZXFJZCgwKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbDIgJXAgIgorICAgICAgICAgICJjYWNoZWQ6ICV6dS8lenVNLCAlenUvJWQlJSBpbiB1c2U7ICIKKyAgICAgICAgICAiYWxsb2NzOiAlenUsICVkJSUgcmVjeWNsZWQ7ICIKKyAgICAgICAgICAidHJhbnNmZXJzOiAlenUsICVkJSUgdW5mZXRjZWQiLAorICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkID4+IDIwLAorICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBwZXJjZW50YWdlKG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucyksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycywKKyAgICAgICAgICBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMgLSBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycykpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQ29ubmVjdCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+JiBvYnNlcnZlcikgeworICAgIG1BY2tzW2NvbklkXSA9IG1JbnZhbGlkYXRpb25JZDsgLy8gc3RhcnRzIGZyb20gY3VycmVudCBpbnZhbGlkYXRpb25JZAorICAgIG1PYnNlcnZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBvYnNlcnZlcikpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQ2xvc2UoQ29ubmVjdGlvbklkIGNvbklkKSB7CisgICAgbUFja3MuZXJhc2UoY29uSWQpOworICAgIG1PYnNlcnZlcnMuZXJhc2UoY29uSWQpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQWNrKAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsCisgICAgICAgIHVpbnQzMl90IG1zZ0lkKSB7CisgICAgYXV0byBpdCA9IG1BY2tzLmZpbmQoY29uSWQpOworICAgIGlmIChpdCA9PSBtQWNrcy5lbmQoKSkgeworICAgICAgICBBTE9HVygiQUNLIGZyb20gaW5jb25zaXN0ZW50IGNvbm5lY3Rpb24hICVsbGQiLCAobG9uZyBsb25nKWNvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobXNnSWQsIGl0LT5zZWNvbmQpKSB7CisgICAgICAgIG1BY2tzW2NvbklkXSA9IG1zZ0lkOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkJ1ZmZlckludmFsaWRhdGVkKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCkgeworICAgIGZvciAoYXV0byBpdCA9IG1QZW5kaW5ncy5iZWdpbigpOyBpdCAhPSBtUGVuZGluZ3MuZW5kKCk7KSB7CisgICAgICAgIGlmIChpdC0+aXNJbnZhbGlkYXRlZChidWZmZXJJZCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICAgICAgICAgIGlmIChpdC0+bU5lZWRzQWNrKSB7CisgICAgICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsLnBvc3RJbnZhbGlkYXRpb24obXNnSWQsIGl0LT5tRnJvbSwgaXQtPm1Ubyk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5ncy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkludmFsaWRhdGlvblJlcXVlc3QoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssCisgICAgICAgIHVpbnQzMl90IGZyb20sCisgICAgICAgIHVpbnQzMl90IHRvLAorICAgICAgICBzaXplX3QgbGVmdCwKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgaWYgKG5lZWRzQWNrKSB7CisgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIGludmFsaWRhdGlvbiByZXF1ZXN0ZWQgYW5kIHF1ZXVlZCIpOworICAgIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBmcm9tLCB0byk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogc2VuZGluZyBoaW50IG1lc3NhZ2U/CisgICAgICAgIEFMT0dWKCJidWZmZXJwb28yIGludmFsaWRhdGlvbiByZXF1ZXN0ZWQgYW5kIHBlbmRpbmciKTsKKyAgICAgICAgUGVuZGluZyBwZW5kaW5nKG5lZWRzQWNrLCBmcm9tLCB0bywgbGVmdCwgaW1wbCk7CisgICAgICAgIG1QZW5kaW5ncy5wdXNoX2JhY2socGVuZGluZyk7CisgICAgfQorICAgIHNJbnZhbGlkYXRvci0+YWRkQWNjZXNzb3IobUlkLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkhhbmRsZUFjaygKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpIHsKKyAgICBpZiAobUludmFsaWRhdGlvbklkICE9IDApIHsKKyAgICAgICAgKmludmFsaWRhdGlvbklkID0gbUludmFsaWRhdGlvbklkOworICAgICAgICBzdGQ6OnNldDxpbnQ+IGRlYWRzOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWNrcy5iZWdpbigpOyBpdCAhPSBtQWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQgIT0gbUludmFsaWRhdGlvbklkKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiBvYnNlcnZlciA9IG1PYnNlcnZlcnNbaXQtPmZpcnN0XTsKKyAgICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLT5lbXBsYWNlKGl0LT5maXJzdCwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29ubmVjdGlvbiAlbGxkIHdpbGwgY2FsbCBvYnNlcnZlciAoJXU6ICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXQtPmZpcnN0LCBpdC0+c2Vjb25kLCBtSW52YWxpZGF0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBOLkI6IG9uTWVzc2FnZSB3aWxsIGJlIGNhbGxlZCBsYXRlci4gaWdub3JlIHBvc3NpYmlsaXR5IG9mCisgICAgICAgICAgICAgICAgICAgIC8vIG9uTWVzc2FnZSMgb25ld2F5IGNhbGwgYmVpbmcgbG9zdC4KKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVycG9vbDIgb2JzZXJ2ZXIgZGllZCAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgICAgICBkZWFkcy5pbnNlcnQoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGRlYWRzLmJlZ2luKCk7IGl0ICE9IGRlYWRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgb25DbG9zZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtUGVuZGluZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gQWxsIGludmFsaWRhdGlvbiBJZHMgYXJlIHN5bmNlZCBhbmQgbm8gbW9yZSBwZW5kaW5nIGludmFsaWRhdGlvbnMuCisgICAgICAgIHNJbnZhbGlkYXRvci0+ZGVsQWNjZXNzb3IobUlkKTsKKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQobWVzc2FnZS5idWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoZm91bmQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ0cmFuc2ZlciBmaW5pc2hlZCAlbGx1ICV1IC0gJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCwgZGVsZXRlZCk7CisgICAgICAgIHJldHVybiBkZWxldGVkOworICAgIH0KKyAgICBBTE9HVigidHJhbnNmZXIgbm90IGZvdW5kICVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiBtZXNzYWdlczsKKyAgICBtT2JzZXJ2ZXIuZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhtZXNzYWdlcyk7CisgICAgbVRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgZm9yIChCdWZmZXJTdGF0dXNNZXNzYWdlJiBtZXNzYWdlOiBtZXNzYWdlcykgeworICAgICAgICBib29sIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubmV3U3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpVU0VEOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTzoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclRvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST006CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0xPU1Q6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSzoKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclJlc3VsdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25BY2sobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sMiAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytmcmVlSXQ7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wyIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aW52YWxpZGF0ZSgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sICpmcmVlSXQpKSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsrZnJlZUl0OworICAgIH0KKworICAgIHNpemVfdCBsZWZ0ID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCBpdC0+Zmlyc3QpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICArK2xlZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUludmFsaWRhdGlvbi5vbkludmFsaWRhdGlvblJlcXVlc3QobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBtSW52YWxpZGF0aW9uQ2hhbm5lbCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBCdWZmZXJJZCBmcm9tID0gbVN0YXJ0U2VxOworICAgIEJ1ZmZlcklkIHRvID0gbVNlcTsKKyAgICBtU3RhcnRTZXEgPSBtU2VxOworICAgIC8vIFRPRE86IG5lZWRzQWNrIHBhcmFtcyAKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiByZXF1ZXN0IGJwOiV1ICV1ICV1IiwgbUludmFsaWRhdGlvbi5tSWQsIGZyb20sIHRvKTsKKyAgICBpZiAoZnJvbSAhPSB0bykgeworICAgICAgICBpbnZhbGlkYXRlKHRydWUsIGZyb20sIHRvLCBpbXBsKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgICAgICBib29sICZyZWFkeSkgeworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBjb3BpZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBpZiAoIXJlYWR5KSB7CisgICAgICAgICAgICAgICAgY3Yud2FpdChsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcGllZC5pbnNlcnQoYWNjZXNzb3JzLmJlZ2luKCksIGFjY2Vzc29ycy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpsaXN0PENvbm5lY3Rpb25JZD4gZXJhc2VkOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb3BpZWQuYmVnaW4oKTsgaXQgIT0gY29waWVkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+IGltcGwgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghaW1wbCkgeworICAgICAgICAgICAgICAgIGVyYXNlZC5wdXNoX2JhY2soaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1wbC0+aGFuZGxlSW52YWxpZGF0ZUFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBlcmFzZWQuYmVnaW4oKTsgaXQgIT0gZXJhc2VkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3JzLmVyYXNlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkcmFpbmluZyBjcHUuCisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6QWNjZXNzb3JJbnZhbGlkYXRvcigpIDogbVJlYWR5KGZhbHNlKSB7CisgICAgc3RkOjp0aHJlYWQgaW52YWxpZGF0b3IoCisgICAgICAgICAgICBpbnZhbGlkYXRvclRocmVhZCwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1BY2Nlc3NvcnMpLAorICAgICAgICAgICAgc3RkOjpyZWYobU11dGV4KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1DdiksCisgICAgICAgICAgICBzdGQ6OnJlZihtUmVhZHkpKTsKKyAgICBpbnZhbGlkYXRvci5kZXRhY2goKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6YWRkQWNjZXNzb3IoCisgICAgICAgIHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgYm9vbCBub3RpZnkgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGFjY2Vzc29ySWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCFtUmVhZHkpIHsKKyAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29ySWQsIGltcGwpKTsKKyAgICAgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gYWRkZWQgYnA6JXUgJWQiLCBhY2Nlc3NvcklkLCBub3RpZnkpOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgbUN2Lm5vdGlmeV9vbmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJZCk7CisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gZGVsZXRlZCBicDoldSIsIGFjY2Vzc29ySWQpOworICAgIGlmIChtQWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1SZWFkeSA9IGZhbHNlOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPiBBY2Nlc3Nvcjo6SW1wbDo6c0ludmFsaWRhdG9yOworCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBpZiAoIXNJbnZhbGlkYXRvcikgeworICAgICAgICBzSW52YWxpZGF0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE3MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwKKyAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEFjY2Vzc29yOjpJbXBsPiB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB+SW1wbCgpOworCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHZvaWQgaGFuZGxlSW52YWxpZGF0ZUFjaygpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25uZWN0aW9uSWQgPSBwaWQgOiAodGltZXN0YW1wX2NyZWF0ZWQgKyBzZXFJZCkKKyAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBmb3IgZWFjaCBjb25uZWN0aW9uCisgICAgc3RhdGljIHVpbnQzMl90IHNTZXFJZDsKKyAgICBzdGF0aWMgaW50MzJfdCBzUGlkOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcy4gSGFuZGxlcyBidWZmZXIgYWxsb2NhdGlvbi9yZWN5Y2xpbmcuCisgICAgICogSGFuZGxlcyBidWZmZXIgdHJhbnNmZXIgYmV0d2VlbiBidWZmZXIgcG9vbCBjbGllbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCdWZmZXJQb29sIHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RMb2dVczsKKyAgICAgICAgQnVmZmVySWQgbVNlcTsKKyAgICAgICAgQnVmZmVySWQgbVN0YXJ0U2VxOworICAgICAgICBib29sIG1WYWxpZDsKKyAgICAgICAgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgbU9ic2VydmVyOworICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIG1JbnZhbGlkYXRpb25DaGFubmVsOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8QnVmZmVySWQ+PiBtVXNpbmdCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPj4gbVVzaW5nQ29ubmVjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPj4gbVBlbmRpbmdUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIFRyYW5zYWN0aW9ucyBjb21wbGV0ZWQgYmVmb3JlIFRSQU5TRkVSX1RPIG1lc3NhZ2UgYXJyaXZhbC4KKyAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3Qgb2NjdXIgZm9yIHRoZSB0cmFuc2FjdGlvbnMuCisgICAgICAgIC8vIE9ubHkgdHJhbnNhY3Rpb24gaWQgaXMga2VwdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyBpbiBzaG9ydCBkdXJhdGlvbi4KKyAgICAgICAgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4gbUNvbXBsZXRlZFRyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gQ3VycmVudGx5IGFjdGl2ZShwZW5kaW5nKSB0cmFuc2F0aW9ucycgc3RhdHVzICYgaW5mb3JtYXRpb24uCisgICAgICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2FjdGlvblN0YXR1cz4+CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6c2V0PEJ1ZmZlcklkPiBtRnJlZUJ1ZmZlcnM7CisKKyAgICAgICAgc3RydWN0IEludmFsaWRhdGlvbiB7CisgICAgICAgICAgICBzdGF0aWMgc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gc0ludlNlcUlkOworCisgICAgICAgICAgICBzdHJ1Y3QgUGVuZGluZyB7CisgICAgICAgICAgICAgICAgYm9vbCBtTmVlZHNBY2s7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbUZyb207CisgICAgICAgICAgICAgICAgdWludDMyX3QgbVRvOworICAgICAgICAgICAgICAgIHNpemVfdCBtTGVmdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiBtSW1wbDsKKyAgICAgICAgICAgICAgICBQZW5kaW5nKGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1OZWVkc0FjayhuZWVkc0FjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gcm9tKGZyb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVG8odG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwoaW1wbCkKKyAgICAgICAgICAgICAgICB7fQorCisgICAgICAgICAgICAgICAgYm9vbCBpc0ludmFsaWRhdGVkKHVpbnQzMl90IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0J1ZmZlckluUmFuZ2UobUZyb20sIG1UbywgYnVmZmVySWQpICYmIC0tbUxlZnQgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdGQ6Omxpc3Q8UGVuZGluZz4gbVBlbmRpbmdzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCB1aW50MzJfdD4gbUFja3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG1PYnNlcnZlcnM7CisgICAgICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICB1aW50MzJfdCBtSWQ7CisKKyAgICAgICAgICAgIEludmFsaWRhdGlvbigpIDogbUludmFsaWRhdGlvbklkKDApLCBtSWQoc0ludlNlcUlkLmZldGNoX2FkZCgxKSkge30KKworICAgICAgICAgICAgdm9pZCBvbkNvbm5lY3QoQ29ubmVjdGlvbklkIGNvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAgICAgICAgIHZvaWQgb25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQWNrKENvbm5lY3Rpb25JZCBjb25JZCwgdWludDMyX3QgbXNnSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKTsKKworICAgICAgICAgICAgdm9pZCBvbkludmFsaWRhdGlvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25IYW5kbGVBY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKTsKKyAgICAgICAgfSBtSW52YWxpZGF0aW9uOworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgICAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlKGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnZhbGlkYXRlIGFsbCBjdXJyZW50CisgICAgICAgICAqIGZyZWUgYnVmZmVycy4gQWN0aXZlIGJ1ZmZlcnMgYXJlIGludmFsaWRhdGVkIGFmdGVyIGJlaW5nIGluYWN0aXZlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzb3I6OkltcGw7CisgICAgfSBtQnVmZmVyUG9vbDsKKworICAgIHN0cnVjdCAgQWNjZXNzb3JJbnZhbGlkYXRvciB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gbUFjY2Vzc29yczsKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DdjsKKyAgICAgICAgYm9vbCBtUmVhZHk7CisKKyAgICAgICAgQWNjZXNzb3JJbnZhbGlkYXRvcigpOworICAgICAgICB2b2lkIGFkZEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKyAgICAgICAgdm9pZCBkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKTsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBY2Nlc3NvckludmFsaWRhdG9yPiBzSW52YWxpZGF0b3I7CisKKyAgICBzdGF0aWMgdm9pZCBpbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICBib29sICZyZWFkeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiT2JzZXJ2ZXIuY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwN2RlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lEKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCh1aW50MzJfdCBtc2dJZCA9IDApOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpOworCisgICAgdm9pZCBpbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+IG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IFJlbGVhc2VDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG9uZSBsaXN0Pyh1c2luZyBvbmUgbGlzdCBtYXkgZGVhbHkgc2VuZGluZyBtZXNzYWdlcz8pCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2luZ0lkczsKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzZWRJZHM7CisgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRlSWQ7IC8vIFRPRE86IGludmFsaWRhdGlvbiBBQ0sgdG8gYnVmZmVycG9vbAorICAgICAgICBib29sIG1JbnZhbGlkYXRlQWNrOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisKKyAgICAgICAgUmVsZWFzZUNhY2hlKCkgOiBtSW52YWxpZGF0ZUlkKDApLCBtSW52YWxpZGF0ZUFjayh0cnVlKSB7fQorICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1IYXNDYWNoZShmYWxzZSksIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwKKyAgICAgICAgICAgICAgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQnVmZmVySWQgaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKHRydWUpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgKnN0YXR1c0Rlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqaW52RGVzYzsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgdHJ1ZSwKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwKKyAgICAgICAgICAgICZzdGF0dXNEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKnN0YXR1c0Rlc2MpOworICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KCppbnZEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICB1aW50MzJfdCYgb3V0TXNnSWQgPSBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+JiBvdXRDaGFubmVsID0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiYgb3V0T2JzZXJ2ZXIgPQorICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsCisgICAgICAgICAgICBbJnZhbGlkLCAmb3V0Q29ubmVjdGlvbiwgJmlkLCAmb3V0TXNnSWQsICZvdXRDaGFubmVsLCAmb3V0T2JzZXJ2ZXJdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQsCisgICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciYgc3RhdHVzRGVzYywKKyAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yJiBpbnZEZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0TXNnSWQgPSBtc2dJZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oc3RhdHVzRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oaW52RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgJiYgb3V0T2JzZXJ2ZXItPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICBzeW5jUmVsZWFzZWQobWVzc2FnZUlkKTsKKyAgICAvLyBUT0RPOiBldmljdCBjYWNoZSByZXF1aXJlZD8KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZsdXNoKCkgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICByZXR1cm4gbUxvY2FsQ29ubmVjdGlvbi0+Zmx1c2goKTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWxsb2NhdGVCdWZmZXJIYW5kbGUocGFyYW1zLCAmYnVmZmVySWQsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBpdCBpcyByZWN5Y2xlZC4gKG5vdCBoYXZpbmcgYWN0aXZlIHJlZikKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoY2FjaGVJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IGNhY2hlIGNyZWF0aW9uIGZhaWx1cmUgJWQ6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IG51bGxwdHIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIHBvc3RCdWZmZXJSZWxlYXNlKGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBVcyAhPSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzICs9IGtSZWNlaXZlVGltZW91dFVzOworICAgIH0KKyAgICBpZiAoIXBvc3RSZWNlaXZlKGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5mZXRjaENhY2hlKHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0cmFuc2ZlciB0aW1lX291dAorICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gcmVmZXJlbmNlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5jcmVhdGVDYWNoZShzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSBjYWNoZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlLm1DcmVhdGluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZldGNoQnVmZmVySGFuZGxlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlcklkLCBzdGQ6Om1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgYm9vbCBwb3N0ZWQgPSBwb3N0UmVjZWl2ZVJlc3VsdChidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA/IHRydWUgOiBmYWxzZSwgJm5lZWRzU3luYyk7CisgICAgQUxPR1YoImNsaWVudCByZWNlaXZlICVsbGQgLSAldSA6ICVzICglZCkiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICpidWZmZXIgPyAib2siIDogImZhaWwiLCBwb3N0ZWQpOworICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgaWYgKCFwb3N0ZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKKyAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworfQorCisvLyBUT0RPOiByZXZpc2UgYWQtaG9jIHBvc3RpbmcgZGF0YSBzdHJ1Y3R1cmUKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgeworICAgICAgICAvLyBUT0RPOiBkb24ndCBuZWVkIHRvIGNhbGwgc3luY1JlbGVhc2VkIGV2ZXJ5IHRpbWUKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgfQorICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIGJvb2wgY2xlYXJlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlbGVhc2UgYnVmZmVyICVsbGQgLSAldSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChpZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+b25DYWNoZVJlbGVhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmRlY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSByZWxlYXNlIHN0YXR1cyBpbmNvbnNpdGVudCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHN0YXR1cyBpbmNvbnNpdGVudCEiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLmNsZWFyKCk7CisgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiBpbnZhbGlkYXRpb25zOworICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+Z2V0SW52YWxpZGF0aW9ucyhpbnZhbGlkYXRpb25zKTsKKyAgICB1aW50MzJfdCBsYXN0TXNnSWQgPSAwOworICAgIGlmIChpbnZhbGlkYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gaW52YWxpZGF0aW9ucy5iZWdpbigpOyBpdCAhPSBpbnZhbGlkYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPm1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdE1zZ0lkID0gaXQtPm1lc3NhZ2VJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+ZnJvbUJ1ZmZlcklkID09IGl0LT50b0J1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyb21CdWZmZXJJZCA9IFVJTlQzMl9NQVgKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQnVmZmVyKGl0LT5mcm9tQnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmFuZ2UoaXQtPmZyb21CdWZmZXJJZCwgaXQtPnRvQnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChsYXN0TXNnSWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKGxhc3RNc2dJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IGxhc3RNc2dJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFyZSBkcmFpbmVkLgorICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1lc3NhZ2VJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IG1lc3NhZ2VJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spIHsKKyAgICAgICAgICAgIC8vIHBvc3QgQUNLCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayk7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50ICVsbGQgaW52YWxpZGF0ZWlvbiBhY2sgKCVkKSAldSIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2ssIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsZWFyZWQ7Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fCBjbGVhckNhY2hlKSB7CisgICAgICAgIHNpemVfdCBldmljdGVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSAmJiAoaXQtPnNlY29uZC0+ZXhwaXJlKCkgfHwgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgKytldmljdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjYWNoZSBjb3VudCAlbGxkIDogdG90YWwgJXp1LCBhY3RpdmUgJWQsIGV2aWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBtQ2FjaGUubUJ1ZmZlcnMuc2l6ZSgpLCBtQ2FjaGUubUFjdGl2ZSwgZXZpY3RlZCk7CisgICAgICAgIG1MYXN0RXZpY3RDYWNoZVVzID0gbm93OworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpZCA9PSBpdC0+c2Vjb25kLT5pZCgpKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogYnVmZmVyICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkluY29uc2l0ZW50IGludmFsaWRhdGlvbiAlbGxkIDogYWN0aXZlciBidWZmZXIhISAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCAodW5zaWduZWQgaW50KWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKSB7CisgICAgc2l6ZV90IGludmFsaWRhdGVkID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJpZCA9IGl0LT5zZWNvbmQtPmlkKCk7CisgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkICYmIGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgfHwgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiAjIG9mIGludmFsaWRhdGVkICV6dSIsCisgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpbnZhbGlkYXRlZCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6On5CdWZmZXJQb29sQ2xpZW50KCkgeworICAgIC8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3JwaGFuZWQgYnVmZmVycz8KK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc1ZhbGlkKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzTG9jYWwoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc0xvY2FsKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1JbXBsLT5pc0FjdGl2ZShsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSk7Cit9CisKK0Nvbm5lY3Rpb25JZCBCdWZmZXJQb29sQ2xpZW50OjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmFjY2Vzc29yID0gbUltcGwtPmdldEFjY2Vzc29yKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKSB7CisgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIGNsaWVudCByZWN2IGludiAldSIsIG1zZ0lkKTsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIG1JbXBsLT5yZWNlaXZlSW52YWxpZGF0aW9uKG1zZ0lkKTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpmbHVzaCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50Ojpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gbUltcGwtPnBvc3RTZW5kKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUlkLCByZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgICAgIHJldHVybiByZXN1bHQgPyBSZXN1bHRTdGF0dXM6Ok9LIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ5YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgY2xpZW50IGZvciBhIGJ1ZmZlciBwb29sLiBGb3IgYSBzcGVjaWZpYyBidWZmZXIgcG9vbCwgYXQgbW9zdAorICogb25lIGJ1ZmZlciBwb29sIGNsaWVudCBleGlzdHMgcGVyIHByb2Nlc3MuIFRoaXMgY2xhc3Mgd2lsbCBub3QgYmUgZXhwb3NlZAorICogb3V0c2lkZS4gQSBidWZmZXIgcG9vbCBjbGllbnQgd2lsbCBiZSB1c2VkIHZpYSBDbGllbnRNYW5hZ2VyLgorICovCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSBsb2NhbCBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNjcmVhdGUpLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIHJlbW90ZSBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNyZWdpc3RlclNlbmRlcikuCisgICAgICogTm90ZTogQSBidWZmZXIgcG9vbCBjbGllbnQgY3JlYXRlZCB3aXRoIHJlbW90ZSBidWZmZXIgcG9vbCBjYW5ub3QKKyAgICAgKiBhbGxvY2F0ZSBhIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgcmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7CisgICAgZnJpZW5kIHN0cnVjdCBPYnNlcnZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzcyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sU3RhdHVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitib29sIGlzTWVzc2FnZUxhdGVyKHVpbnQzMl90IGN1ck1zZ0lkLCB1aW50MzJfdCBwcmV2TXNnSWQpIHsKKyAgICByZXR1cm4gY3VyTXNnSWQgIT0gcHJldk1zZ0lkICYmIGN1ck1zZ0lkIC0gcHJldk1zZ0lkIDwgcHJldk1zZ0lkIC0gY3VyTXNnSWQ7Cit9CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgcmV0dXJuIGZyb20gPD0gYnVmZmVySWQgJiYgYnVmZmVySWQgPCB0bzsKKyAgICB9IGVsc2UgeyAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgcmV0dXJuIGZyb20gPD0gYnVmZmVySWQgfHwgYnVmZmVySWQgPCB0bzsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1FbGVtZW50c0luUXVldWUgPSAxMDI0KjE2Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA9IDEyODsKKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpvcGVuKAorICAgICAgICBDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVyU3RhdHVzUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpuZWVkc1N5bmMoKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIGF2YWlsICsga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA8IGtOdW1FbGVtZW50c0luUXVldWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiBwZW5kaW5nLnNpemUoKSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGF2YWlsID0gc3RkOjptaW4oYXZhaWwsIHBlbmRpbmcuc2l6ZSgpKTsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbDsgKytpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCBpbnZhbGlkYXRlSWQsCisgICAgICAgIGJvb2wgKmludmFsaWRhdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiAhKmludmFsaWRhdGVkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpbnZhbGlkYXRlSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICppbnZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OkJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKKyAgICAvLyBkcmFpbiBwcmV2aW91cyBtZXNzYWdlcworICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5hdmFpbGFibGVUb1JlYWQoKSwgKHNpemVfdCkga051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gdGVtcChhdmFpbCk7CisgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKTsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmdldEludmFsaWRhdGlvbnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIC8vIFRyeSB0d2ljZSBpbiBjYXNlIG9mIG92ZXJmbG93LgorICAgIC8vIFRPRE86IGhhbmRsaW5nIG92ZXJmbG93IHRob3VnaCBpdCBtYXkgbm90IGhhcHBlbi4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gdGVtcChhdmFpbCk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5yZWFkKHRlbXAuZGF0YSgpLCBhdmFpbCkpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlcy5yZXNlcnZlKG1lc3NhZ2VzLnNpemUoKSArIGF2YWlsKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSB0ZW1wLmJlZ2luKCk7IGl0ICE9IHRlbXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKCppdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK0J1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OkJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKQorICAgIDogbVZhbGlkKHRydWUpLAorICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlKAorICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlLCB0cnVlKSkgeworICAgIGlmICghbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlIHx8IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgIH0KK30KKworYm9vbCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6Z2V0RGVzYyhjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICoqZm1xRGVzY1B0cikgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmdldERlc2MoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OnBvc3RJbnZhbGlkYXRpb24oCisgICAgICAgIHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpIHsKKyAgICBCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2U7CisKKyAgICBtZXNzYWdlLm1lc3NhZ2VJZCA9IG1zZ0lkOworICAgIG1lc3NhZ2UuZnJvbUJ1ZmZlcklkID0gZnJvbUlkOworICAgIG1lc3NhZ2UudG9CdWZmZXJJZCA9IHRvSWQ7CisgICAgLy8gVE9ETzogaGFuZGxlIGZhaWx1cmUgKGl0IGRvZXMgbm90IGhhcHBlbiBub3JtYWxseS4pCisgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT53cml0ZSgmbWVzc2FnZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY1ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvKiogUmV0dXJucyBtb25vdG9uaWMgdGltZXN0YW1wIGluIFVzIHNpbmNlIGZpeGVkIHBvaW50IGluIHRpbWUuICovCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpOworCitib29sIGlzTWVzc2FnZUxhdGVyKHVpbnQzMl90IGN1ck1zZ0lkLCB1aW50MzJfdCBwcmV2TXNnSWQpOworCitib29sIGlzQnVmZmVySW5SYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywgQnVmZmVySWQgYnVmZmVySWQpOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBidWZmZXIKKyAqIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgRk1RcyBmcm9tIHRoZSBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNPYnNlcnZlciB7Citwcml2YXRlOgorICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPj4KKyAgICAgICAgICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXM7CisKK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBGTVEgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIG9wZW4oQ29ubmVjdGlvbklkIGlkLCBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICAvKiogQ2xvc2VzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBpcyBjbG9zZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgaWQpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBGTVEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgb3duZXJzaGlwL3N0YXR1cworICogY2hhbmdlIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgZm1xIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gbUJ1ZmZlclN0YXR1c1F1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mCisgICAgICogdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gdGhlIGJ1ZmZlciBwb29sICovCisgICAgYm9vbCBuZWVkc1N5bmMoKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgorICAgICAqIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBidWZmZXIgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICBuZXcgc3RhdHVzIG9mIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXRJZCAgICAgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHJlY2VpdmVyKG9ubHkgd2hlbiB0aGUgc2VuZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdHMgYSBzdGF0dXMgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaXMgcG9zdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgaW52YWxpYWRhdGlvbiBtZXNzZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlSWQgIGludmFsaWRhdGlvbiBhY2sgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIGludmFsaWRhdGlvbiBpZCBpcyB6ZXJvLCB0aGUgYWNrIHdpbGwgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlZCAgIHNldHMge0Bjb2RlIHRydWV9IG9ubHkgd2hlbiB0aGUgaW52YWxpZGF0aW9uIGFjayBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgICAgIGJvb2wgKmludmFsaWRhdGVkKTsKK307CisKKy8qKgorICogQSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBpbnZhbGlkYXRpb24KKyAqIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCB2aWEgdGhlIGZtcSBmcm9tIHRoZSBidWZmZXIgcG9vbC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIGhhbmRsZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcihjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRJbnZhbGlkYXRpb25zKHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+ICZtZXNzYWdlcyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBBIGJ1ZmZlciBwb29sIHdpbGwgc2VuZCBidWZmZXIKKyAqIGludmFsaWRhdGlvbiBtZXNzYWdlcyB0byB0aGUgY2xpZW50cyB2aWEgdGhlIEZNUS4gVGhlIEZNUSBpcyBzaGFyZWQgYW1vbmcKKyAqIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4KKyAgICAgKi8KKyAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBkZXNjcmlwdG9yIG9mIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEuIHRoZSBkZXNjcmlwdG9yIG1heQorICAgICAqIGJlIHBhc3NlZCB0byB0aGUgY2xpZW50IGZvciBidWZmZXIgaW52YWxpZGF0aW9uIGhhbmRsaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgdm9pZCBnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKTsKKworICAgIC8qKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gZm9yIGludmFsaWRhdGVkIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnSWQgICAgIEludmFsaWRhdGlvbiBtZXNzYWdlIGlkIHdoaWNoIGlzIHVzZWQgd2hlbiBjbGllbnRzIHNlbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGFja3MgYmFjayB2aWEgQnVmZmVyU3RhdHVzTWVzc2FnZQorICAgICAqIEBwYXJhbSBmcm9tSWQgICAgVGhlIHN0YXJ0IGJ1ZmZlcmlkIG9mIHRoZSBpbnZhbGlkYXRlZCBidWZmZXJzKGluY2x1c2l2ZSkKKyAgICAgKiBAcGFyYW0gdG9JZCAgICAgIFRoZSBlbmQgYnVmZmVySWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqLworICAgIHZvaWQgcG9zdEludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCwgQnVmZmVySWQgZnJvbUlkLCBCdWZmZXJJZCB0b0lkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFkMzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAKQEAgLTAsMCArMSw1MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIk9ic2VydmVyLmgiCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBzcDxPYnNlcnZlcj4gbU9ic2VydmVyOworCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciBtUmVtb3RlQ2xpZW50Q29va2llczsKK307CisKK0NsaWVudE1hbmFnZXI6OkltcGw6OkltcGwoKQorICAgIDogbU9ic2VydmVyKG5ldyBPYnNlcnZlcigpKSB7fQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjbGVhblVwKCk7CisgICAgaW50NjRfdCB0aW1lb3V0VXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtSZWdpc3RlclRpbWVvdXRVczsKKyAgICBkbyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBzQWNjZXNzb3IgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNBY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoc0FjY2Vzc29yLCBhY2Nlc3NvcikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmUubUNsaWVudHMuZmluZCgqcENvbm5lY3Rpb25JZCkgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIGV4aXN0aW5nIGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DYWNoZS5tQ29ubmVjdGluZykgeworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yLCBtT2JzZXJ2ZXIpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIG1PYnNlcnZlci0+YWRkQ2xpZW50KGNvbklkLCB3Y2xpZW50KTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2LndhaXRfZm9yKAorICAgICAgICAgICAgICAgIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoa1JlZ2lzdGVyVGltZW91dFVzKSk7CisgICAgfSB3aGlsZSAoZ2V0VGltZXN0YW1wTm93KCkgPCB0aW1lb3V0VXMpOworICAgIC8vIFRPRE86IHJldHVybiB0aW1lb3V0IGVycm9yCisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgIGJvb2wgbG9jYWwgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChzZW5kZXJJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbG9jYWwgPSBpdC0+c2Vjb25kLT5pc0xvY2FsKCk7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBycyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICAgICAgICAgIGFjY2Vzc29yLAorICAgICAgICAgICAgICAgIFsmcnMsIHJlY2VpdmVySWRdKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAqcmVjZWl2ZXJJZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsICYmIHJzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50ID0gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworICAgICAgICAgICAgaWYgKHJlY2lwaWVudCkgIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IGRlYXRoIHJlY2lwaWVudCByZWdpc3RlcmVkICVsbGQiLCAobG9uZyBsb25nKSpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IG1SZW1vdGVDbGllbnRDb29raWVzLmdldENvb2tpZShyZWNlaXZlciwgJmFkZGVkKTsKKyAgICAgICAgICAgICAgICByZWNpcGllbnQtPmFkZENvb2tpZVRvQ29ubmVjdGlvbihjb29raWUsICpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPmxpbmtUb0RlYXRoKHJlY2lwaWVudCwgY29va2llKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJzOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY29uc3Qgc3A8QWNjZXNzb3I+IGFjY2Vzc29yID0gbmV3IEFjY2Vzc29yKGFsbG9jYXRvcik7CisgICAgaWYgKCFhY2Nlc3NvciB8fCAhYWNjZXNzb3ItPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gVE9ETzogb2JzZXJ2ZXIgaXMgbG9jYWwuIHVzZSBkaXJlY3QgY2FsbCBpbnN0ZWFkIG9mIGhpZGwgY2FsbC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgaWYgKCFjbGllbnQgfHwgIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBTaW5jZSBhIG5ldyBidWZmZXJwb29sIGlzIGNyZWF0ZWQsIGV2aWN0IG1lbW9yaWVzIHdoaWNoIGFyZSB1c2VkIGJ5CisgICAgLy8gZXhpc3RpbmcgYnVmZmVycG9vbHMgYW5kIGNsaWVudHMuCisgICAgY2xlYW5VcCh0cnVlKTsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgIG1PYnNlcnZlci0+YWRkQ2xpZW50KGNvbklkLCB3Y2xpZW50KTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICB9CisgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgIEFMT0dWKCJjcmVhdGUgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xvc2luZyA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1BY3RpdmUubUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IgfHwgKGFjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChjQWNjZXNzb3IsIGFjY2Vzc29yKSkpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2l0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jazIudW5sb2NrKCk7CisgICAgICAgIGxvY2sxLnVubG9jaygpOworICAgICAgICBjbG9zaW5nLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Zmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5mbHVzaCgpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSBidWZmZXItPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Z2V0QWNjZXNzb3IoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmdldEFjY2Vzc29yKGFjY2Vzc29yKTsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaW50NjRfdCBsYXN0VHJhbnNhY3Rpb25VczsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIDwgbm93KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGludCBjbGVhbmVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc0FjdGl2ZSgmbGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RUcmFuc2FjdGlvblVzICsga0NsaWVudFRpbWVvdXRVcyA8IG5vdykgeworICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1BY3RpdmUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICArK2NsZWFuZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytjaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiMgb2YgY2xlYW5lZCBjb25uZWN0aW9uczogJWQiLCBjbGVhbmVkKTsKKyAgICAgICAgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzID0gbm93OworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5yZWdpc3RlclNlbmRlcihidWZmZXJQb29sLCAmY29ubmVjdGlvbklkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1IsIC0xKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gTWV0aG9kcyBmb3IgbG9jYWwgdXNlLgorc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlOworc3RkOjptdXRleCBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2VMb2NrOworCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzSW5zdGFuY2VMb2NrKTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2xpZW50TWFuYWdlcigpOworICAgIH0KKyAgICBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitDbGllbnRNYW5hZ2VyOjpDbGllbnRNYW5hZ2VyKCkgOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitDbGllbnRNYW5hZ2VyOjp+Q2xpZW50TWFuYWdlcigpIHsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNyZWF0ZShhbGxvY2F0b3IsIHBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBzZW5kZXJJZCwgcmVjZWl2ZXJJZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Zmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUoY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QqIHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1JbXBsICYmIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gbUltcGwtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpjbGVhblVwKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcCh0cnVlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMGU3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorUmV0dXJuPHZvaWQ+IENvbm5lY3Rpb246OmZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIGlmIChidWZmZXJJZCAhPSBTWU5DX0JVRkZFUklEKSB7CisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWNjZXNzb3ItPmZldGNoKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcntidWZmZXJJZCwgaGFuZGxlfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7MCwgbnVsbHB0cn0pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmZsdXNoKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDc3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBhY3RpdmUgYW5kL29yIGFyZSByZWFkeSB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK09ic2VydmVyOjpPYnNlcnZlcigpIHsKK30KKworT2JzZXJ2ZXI6On5PYnNlcnZlcigpIHsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IE9ic2VydmVyOjpvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgY2xpZW50LT5yZWNlaXZlSW52YWxpZGF0aW9uKG1zZ0lkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIE9ic2VydmVyOjphZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQubG9jaygpIHx8IGl0LT5maXJzdCA9PSBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIGl0ID0gbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCB3Y2xpZW50KSk7CisKK30KKwordm9pZCBPYnNlcnZlcjo6ZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJkN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBPYnNlcnZlciA6IHB1YmxpYyBJT2JzZXJ2ZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gb25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgb3ZlcnJpZGU7CisKKyAgICB+T2JzZXJ2ZXIoKTsKKworICAgIHZvaWQgYWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCk7CisKKyAgICB2b2lkIGRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworcHJpdmF0ZToKKyAgICBPYnNlcnZlcigpOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworCisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+IG1DbGllbnRzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzkwNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtVbnN5bmNocm9uaXplZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBTdGF0dXNEZXNjcmlwdG9yOworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSwga1Vuc3luY2hyb25pemVkV3JpdGU+CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOwordHlwZWRlZiBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTo6RGVzY3JpcHRvciBJbnZhbGlkYXRpb25EZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0cyBjYWNoZWQgYWxsb2NhdGlvbnMuIElmIGl0J3MgbG9jYWwgY29ubmVjdGlvbiwgcmVsZWFzZSB0aGUKKyAgICAgKiBwcmV2aW91cyBhbGxvY2F0aW9ucyBhbmQgZG8gbm90IHJlY3ljbGUgY3VycmVudCBhY3RpdmUgYWxsb2NhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyByZXNldHRlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ0ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmN2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4MWRjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI2OTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdlZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNzM5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRE9DVU1FTlRBVElPTiBHRU5FUkFUSU9OCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDMl9ST09UIDo9ICQoY2FsbCBteS1kaXIpCisKK0MyX0RPQ1NfUk9PVCA6PSAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIKKworQzJfT1VUX1RFTVAgOj0gJChQUk9EVUNUX09VVCkvZ2VuL0VUQy9Db2RlYzItZG9jc19pbnRlcm1lZGlhdGVzCisKK0MyX0RPWFkgOj0gJChvciAkKHNoZWxsIGNvbW1hbmQgLXYgZG94eWdlbiksXAorCQkkKHNoZWxsIGNvbW1hbmQgLXYgL0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvZG94eWdlbikpCisKKy5QSE9OWTogY2hlY2stZG94eWdlbgorY2hlY2stZG94eWdlbjoKK2lmbmRlZiBDMl9ET1hZCisJJChlcnJvciAnZG94eWdlbiBpcyBub3QgYXZhaWxhYmxlJykKK2VuZGlmCisKKyQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJIyBvbmx5IGRvY3VtZW50IGluY2x1ZGUgZGlyZWN0b3J5LCBubyBpbnRlcm5hbCBzZWN0aW9ucworCXNlZCAncy9cKF5JTlBVVCAqPS4qXCkvXDFpbmNsdWRlXC8vOyBcCisJcy9cKF5JTlRFUk5BTF9ET0NTICo9ICpcKS4qL1wxTk8vOyBcCisJcy9cKF5FTkFCTEVEX1NFQ1RJT05TICo9LipcKUlOVEVSTkFMXCguKlwpLiovXDFcMi87IFwKKwlzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXQ6XDEnJChPVVRfRElSKSc6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCiskKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJc2VkICdzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXRcKC4qXClhcGk6XDEnJChPVVRfRElSKSdcMmludGVybmFsOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworLlBIT05ZOiBkb2NzLWFwaQorZG9jcy1hcGk6ICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBBUEkgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2FwaQorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2FwaQorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnCisKKy5QSE9OWTogZG9jcy1pbnRlcm5hbAorZG9jcy1pbnRlcm5hbDogJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gSW50ZXJuYWwgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcKKworLlBIT05ZOiBkb2NzLWFsbAorZG9jcy1hbGw6IGRvY3MtYXBpIGRvY3MtaW50ZXJuYWwKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKGNhbGwgbXktZGlyKSkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYTU4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0QWFjRGVjLmNwcCIsCisgICAgICAgICJEcmNQcmVzTW9kZVdyYXAuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwMGQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0RlYy5oIgorCisjZGVmaW5lIEZJTEVSRUFEX01BWF9MQVlFUlMgMgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgwLjI1KSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDJ1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDczNTAsIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFhY0Zvcm1hdCwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXLCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBpbnQzMl90IGdldERyY0NvbXByZXNzTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNDb21wcmVzc01vZGUtPnZhbHVlID09IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgPyAxIDogMDsgfQorICAgIGludDMyX3QgZ2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY0VuY1RhcmdldExldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjQm9vc3RGYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQm9vc3RGYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQXR0ZW51YXRpb25GYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjRWZmZWN0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNFZmZlY3RUeXBlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRBYWNEZWM6OkMyU29mdEFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRGVjb2RlcihudWxscHRyKSwKKyAgICAgIG1TdHJlYW1JbmZvKG51bGxwdHIpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRBYWNEZWM6On5DMlNvZnRBYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgLy8gVG8gbWFrZSB0aGUgY29kZWMgYmVoYXZlIHRoZSBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgYSByZXNldCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZQorICAgIC8vIHN0cmVhbWluZm8gc3RydWN0LiBUaGlzIGRvZXMgdGhhdDoKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQUFDRGVjb2RlcikgeworICAgICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgbUFBQ0RlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIG1BQUNEZWNvZGVyID0gYWFjRGVjb2Rlcl9PcGVuKFRUX01QNF9BRElGLCAvKiBudW0gbGF5ZXJzICovIDEpOworICAgIGlmIChtQUFDRGVjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdHJlYW1JbmZvID0gYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgaWYgKG1TdHJlYW1JbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworCisgICAgaWYgKG1BQUNEZWNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGlzIG51bGwuIFRPRE86IENhbiBub3QgY2FsbCBhYWNEZWNvZGVyX1NldFBhcmFtIGluIHRoZSBmb2xsb3dpbmcgY29kZSIpOworICAgIH0KKworICAgIC8vYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwgMCk7CisKKyAgICAvL2luaXQgRFJDIHdyYXBwZXIKKyAgICBtRHJjV3JhcC5zZXREZWNvZGVySGFuZGxlKG1BQUNEZWNvZGVyKTsKKyAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKworICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4gYnkgcGxhdGZvcm0gcHJvcGVydGllcworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgRFJDIHNldHRpbmdzIGRlcGVuZGluZyBvbiBhdWRpbyBvdXRwdXQgZGV2aWNlIHR5cGUgKEhETUksIGxvYWRzcGVha2VyLCBoZWFkcGhvbmUpCisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgKHVuc2lnbmVkKXRhcmdldFJlZkxldmVsKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SCisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCAodW5zaWduZWQpYXR0ZW51YXRpb25GYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgKHVuc2lnbmVkKWJvb3N0RmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCAodW5zaWduZWQpY29tcHJlc3NNb2RlKTsKKworICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGludDMyX3QgZW5jVGFyZ2V0TGV2ZWwgPSBtSW50Zi0+Z2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZW5jb2Rlci1zaWRlIERSQyByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCBlbmNUYXJnZXRMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCAodW5zaWduZWQpZW5jVGFyZ2V0TGV2ZWwpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgZWZmZWN0VHlwZSk7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwuCisgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAorICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwgbnVtU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgT1ZFUkZMT1ciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrXSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkIC09IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGJvb2wgZW9zKSB7CisgICAgd2hpbGUgKCFtQnVmZmVyc0luZm8uZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgID49IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgSW5mbyAmb3V0SW5mbyA9IG1CdWZmZXJzSW5mby5mcm9udCgpOworICAgICAgICBBTE9HVigib3V0SW5mby5mcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBvdXRJbmZvLmZyYW1lSW5kZXgpOworICAgICAgICBpbnQgc2FtcGxlc2l6ZSBfX3VudXNlZCA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3V0SW5mby5kZWNvZGVkU2l6ZXMuc2l6ZSgpOworICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQgc2FtcGxlcyBhdmFpbGFibGUgKCVkKSwgb3IgJWQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IGZpbGxXb3JrID0KKyAgICAgICAgICAgIFsmYmxvY2ssIG51bVNhbXBsZXMsIHBvb2wsIHRoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgLT4gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IHsKKyAgICAgICAgICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLCBjMl9zdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgICAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX09LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gZmV0Y2ggYSBsaW5lYXIgYmxvY2sgKCVkKSIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX05PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4od1ZpZXcuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KCk7CisKKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG91dEluZm8uZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluaXNoKG91dEluZm8uZnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG91dEluZm8udGltZXN0YW1wLCBibG9jayA/IGJsb2NrLT5jYXBhY2l0eSgpIDogMCk7CisgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVDSEFSKiBpbkJ1ZmZlcltGSUxFUkVBRF9NQVhfTEFZRVJTXTsKKyAgICBVSU5UIGluQnVmZmVyTGVuZ3RoW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworICAgIFVJTlQgYnl0ZXNWYWxpZFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKworICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgLy9UT0RPCisjaWYgMAorICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVygiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIEZMQUdfQ09ERUNfQ09ORklHIHNldCIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGNvZGVjQ29uZmlnICYmIHNpemUgPiAwdSkgeworICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImFhY0RlY29kZXJfQ29uZmlnUmF3IGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbmZvIGluSW5mbzsKKyAgICBpbkluZm8uZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGluSW5mby50aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIGluSW5mby5idWZmZXJTaXplID0gc2l6ZTsKKyAgICBpbkluZm8uZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CisKKyAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOworICAgICAgICBzaXplIC09IGluQnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgb2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPAorICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYnVmZmVyCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlcyAtIG51bUNvbnN1bWVkOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wdXNoX2JhY2sobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ5dGVzVmFsaWRbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSBidWZmZXJTaXplIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBkZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuYmVnaW4oKSwgaW5JbmZvLmRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAoKG1JbnB1dEJ1ZmZlckNvdW50ID4gMikgJiYgKG1PdXRwdXRCdWZmZXJDb3VudCA8PSAxKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgYWx0ZXJlZCBkdXJpbmcgY29uZmlnLgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOworICAgIH0KKworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICBtQnVmZmVyc0luZm8ucHVzaF9iYWNrKHN0ZDo6bW92ZShpbkluZm8pKTsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIGlmICghZW9zICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgLy8gZGlzY2FyZCBvdXRwdXREZWxheSBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpZiAoZGlzY2FyZCA+IHRvQ29tcGVuc2F0ZSkgeworICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRpc2NhcmRlZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgZGlzY2FyZCk7CisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBmYWxzZSAvKiBub3QgRU9TICovKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBib29sIGVvcyA9IChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKworICAgIGRyYWluRGVjb2RlcigpOworICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBlb3MpOworCisgICAgaWYgKGVvcykgeworICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgfTsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXJzSW5mby5zaXplKCkgPiAxdSkgeworICAgICAgICAgICAgZmluaXNoKG1CdWZmZXJzSW5mby5mcm9udCgpLmZyYW1lSW5kZXgsIGZpbGxFbXB0eVdvcmspOworICAgICAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgaW50IGF2YWlsOworICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBhdmFpbCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgYXZhaWwpOworICAgICAgICBpZiAobnMgIT0gYXZhaWwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLy8gZmx1c2ggZGVjb2RlciB1bnRpbCBvdXRwdXREZWxheSBpcyBjb21wZW5zYXRlZAorICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0QWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFhY0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtQUFDRGVjb2RlcjsKKyAgICBDU3RyZWFtSW5mbyAqbVN0cmVhbUluZm87CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlY29kZWRTaXplczsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxJbmZvPiBtQnVmZmVyc0luZm87CisKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyIG1EcmNXcmFwOworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBkcmFpbkRlY29kZXIoKTsKKworICAgIHZvaWQgZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgYm9vbCBlb3MpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3ZTc3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgNil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4QnVmU2l6ZUNhbGN1bGF0b3IsIG1DaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4QnVmU2l6ZUNhbGN1bGF0b3IoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gJmNoYW5uZWxDb3VudCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAxMDI0ICogc2l6ZW9mKHNob3J0KSAqIGNoYW5uZWxDb3VudC52LnZhbHVlOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworfTsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIjsKKworQzJTb2Z0QWFjRW5jOjpDMlNvZnRBYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0VuY29kZXIobnVsbHB0ciksCisgICAgICBtU0JSTW9kZSgtMSksCisgICAgICBtU0JSUmF0aW8oMCksCisgICAgICBtQUFDUHJvZmlsZShBT1RfQUFDX0xDKSwKKyAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUoMHUpLAorICAgICAgbU91dEJ1ZmZlclNpemUoMHUpLAorICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCisgICAgICBtSW5wdXRUaW1lU2V0KGZhbHNlKSwKKyAgICAgIG1JbnB1dFNpemUoMCksCisgICAgICBtSW5wdXRUaW1lVXMoLTFsbCksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdEFhY0VuYzo6fkMyU29mdEFhY0VuYygpIHsKKyAgICBvblJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jT3BlbigmbUFBQ0VuY29kZXIsIDAsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHNldEF1ZGlvUGFyYW1zKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25TdG9wKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1JbnB1dFRpbWVVcyA9IC0xbGw7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBhYWNFbmNDbG9zZSgmbUFBQ0VuY29kZXIpOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIC8vIG5vLW9wCit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBDSEFOTkVMX01PREUgZ2V0Q2hhbm5lbE1vZGUodWludDMyX3QgbkNoYW5uZWxzKSB7CisgICAgQ0hBTk5FTF9NT0RFIGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICBzd2l0Y2ggKG5DaGFubmVscykgeworICAgICAgICBjYXNlIDE6IGNoTW9kZSA9IE1PREVfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogY2hNb2RlID0gTU9ERV8yOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBjaE1vZGUgPSBNT0RFXzFfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogY2hNb2RlID0gTU9ERV8xXzJfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogY2hNb2RlID0gTU9ERV8xXzJfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogY2hNb2RlID0gTU9ERV8xXzJfMl8xOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gY2hNb2RlOworfQorCisvL3N0YXRpYyBBVURJT19PQkpFQ1RfVFlQRSBnZXRBT1RGcm9tUHJvZmlsZShPTVhfVTMyIHByb2ZpbGUpIHsKKy8vICAgIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RMQykgeworLy8gICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RIRSkgeworLy8gICAgICAgIHJldHVybiBBT1RfU0JSOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUykgeworLy8gICAgICAgIHJldHVybiBBT1RfUFM7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdExEKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfTEQ7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEVMRCkgeworLy8gICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0VMRDsKKy8vICAgIH0gZWxzZSB7CisvLyAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIEFBQyBwcm9maWxlIC0gZGVmYXVsdGluZyB0byBBQUMtTEMiKTsKKy8vICAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKy8vICAgIH0KKy8vfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OnNldEF1ZGlvUGFyYW1zKCkgeworICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRyYXRlIG9yIFNCUiBtb2RlIGNoYW5nZQorICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgorCisgICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcywgJWkgc2JyIG1vZGUsICVpIHNiciByYXRpbyIsCisgICAgICAgICBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCksIG1JbnRmLT5nZXRCaXRyYXRlKCksIG1TQlJNb2RlLCBtU0JSUmF0aW8pOworCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQU9ULCBtQUFDUHJvZmlsZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQU1QTEVSQVRFLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwKKyAgICAgICAgICAgIGdldENoYW5uZWxNb2RlKG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1RSQU5TTVVYLCBUVF9NUDRfUkFXKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU0JSTW9kZSAhPSAtMSAmJiBtQUFDUHJvZmlsZSA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgbVNCUk1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNCUiByYXRpbyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnM6CisgICAgICAgMDogRGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZXJlaW4gU0JSIHJhdGlvIGlzIGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIGF1ZGlvIG9iamVjdCB0eXBlIGJ5CisgICAgICAgICAgdGhlIEZESy4KKyAgICAgICAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkKKyAgICAgICAyOiBEdWFscmF0ZSBTQlIgKGRlZmF1bHQgZm9yIEhFLUFBQykKKyAgICAgKi8KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfUkFUSU8sIG1TQlJSYXRpbykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKworICAgIGlmICghbVNlbnRDb2RlY1NwZWNpZmljRGF0YSkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMKKyAgICAgICAgLy8gZGF0YS4KKworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIGZvciBwcm9maWxlIC8gc2FtcGxlLXJhdGUgLyBiaXQtcmF0ZSAvIGNoYW5uZWxzIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlKCk7CisgICAgICAgIHVpbnQzMl90IGFjdHVhbEJpdFJhdGUgPSBhYWNFbmNvZGVyX0dldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSk7CisgICAgICAgIGlmIChiaXRyYXRlICE9IGFjdHVhbEJpdFJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAldSB1bnN1cHBvcnRlZCwgdXNpbmcgJXUiLCBiaXRyYXRlLCBhY3R1YWxCaXRSYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0IGVuY0luZm87CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jSW5mbyhtQUFDRW5jb2RlciwgJmVuY0luZm8pKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBBQUMgZW5jb2RlciBpbmZvIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShlbmNJbmZvLmNvbmZTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGVuY0luZm8uY29uZkJ1ZiwgZW5jSW5mby5jb25mU2l6ZSk7CisgICAgICAgIEFMT0dWKCJwdXQgY3NkIik7CisjaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIG1PdXRCdWZmZXJTaXplID0gZW5jSW5mby5tYXhPdXRCdWZCeXRlczsKKyAgICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGVuY0luZm8uZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCB0ZW1wWzFdOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSB0ZW1wOworICAgIHNpemVfdCBjYXBhY2l0eSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgZGF0YSA9IHZpZXcuZGF0YSgpOworICAgICAgICBjYXBhY2l0eSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKCFtSW5wdXRUaW1lU2V0ICYmIGNhcGFjaXR5ID4gMCkgeworICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgbUlucHV0VGltZVNldCA9IHRydWU7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IChjYXBhY2l0eSArIG1JbnB1dFNpemUgKyAoZW9zID8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZSAtIDEgOiAwKSkKKyAgICAgICAgICAgIC8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBBTE9HVigiY2FwYWNpdHkgPSAlenU7IG1JbnB1dFNpemUgPSAlenU7IG51bUZyYW1lcyA9ICV6dSBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gJXUiLAorICAgICAgICAgIGNhcGFjaXR5LCBtSW5wdXRTaXplLCBudW1GcmFtZXMsIG1OdW1CeXRlc1BlcklucHV0RnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldyaXRlVmlldz4gd1ZpZXc7CisgICAgdWludDhfdCAqb3V0UHRyID0gdGVtcDsKKyAgICBzaXplX3Qgb3V0QXZhaWxhYmxlID0gMHU7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworCisgICAgQUFDRU5DX0luQXJncyBpbmFyZ3M7CisgICAgQUFDRU5DX091dEFyZ3Mgb3V0YXJnczsKKyAgICBtZW1zZXQoJmluYXJncywgMCwgc2l6ZW9mKGluYXJncykpOworICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkKiBpbkJ1ZmZlcltdICAgICAgICA9IHsgKHVuc2lnbmVkIGNoYXIgKilkYXRhIH07CisgICAgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlclNpemVbXSAgICA9IHsgKElOVCljYXBhY2l0eSB9OworICAgIElOVCAgIGluQnVmZmVyRWxTaXplW10gID0geyBzaXplb2YoaW50MTZfdCkgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKKyAgICBpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKKyAgICBpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKKyAgICBpbkJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBpbkJ1ZmZlclNpemU7CisgICAgaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CisKKyAgICB2b2lkKiBvdXRCdWZmZXJbXSAgICAgICA9IHsgb3V0UHRyIH07CisgICAgSU5UICAgb3V0QnVmZmVySWRzW10gICAgPSB7IE9VVF9CSVRTVFJFQU1fREFUQSB9OworICAgIElOVCAgIG91dEJ1ZmZlclNpemVbXSAgID0geyAwIH07CisgICAgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CisgICAgb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworICAgIG91dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CisgICAgb3V0QnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IG91dEJ1ZmZlclNpemU7CisgICAgb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKKworICAgIEFBQ0VOQ19FUlJPUiBlbmNvZGVyRXJyID0gQUFDRU5DX09LOworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIHdoaWxlIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSyAmJiBpbmFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIGVuY29kZXJFcnIgPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKworICAgICAgICBpZiAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0YXJncy5udW1PdXRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3VtZWQgPSAoY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCkpIC0gaW5hcmdzLm51bUluU2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dGFyZ3MubnVtT3V0Qnl0ZXMpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBoZXhkdW1wKG91dFB0ciwgc3RkOjptaW4ob3V0YXJncy5udW1PdXRCeXRlcywgMjU2KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRQdHIgPSB0ZW1wOworICAgICAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSBpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1JbnB1dFRpbWVVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtSW5wdXRUaW1lVXMucGVla2xsKCkpOworICAgIH0KKworICAgIGlmIChlb3MgJiYgaW5CdWZmZXJTaXplWzBdID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIC8vIEZsdXNoCisgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKworICAgICAgICAodm9pZClhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworICAgIH0KKworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZW9zID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDApLAorICAgICAgICAgICAgIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgKHZvaWQpcG9vbDsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKworICAgIC8vIFRPRE86IHdlIGRvbid0IGhhdmUgYW55IHBlbmRpbmcgd29yayBhdCB0aGlzIHRpbWUgdG8gZHJhaW4uCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QWFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzkzNjViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiYWFjZW5jX2xpYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDRU5DT0RFUiBtQUFDRW5jb2RlcjsKKworICAgIGludDMyX3QgbVNCUk1vZGU7CisgICAgaW50MzJfdCBtU0JSUmF0aW87CisgICAgQVVESU9fT0JKRUNUX1RZUEUgbUFBQ1Byb2ZpbGU7CisgICAgVUlOVCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIFVJTlQgbU91dEJ1ZmZlclNpemU7CisKKyAgICBib29sIG1TZW50Q29kZWNTcGVjaWZpY0RhdGE7CisgICAgYm9vbCBtSW5wdXRUaW1lU2V0OworICAgIHNpemVfdCBtSW5wdXRTaXplOworICAgIGMyX2NudHI2NF90IG1JbnB1dFRpbWVVczsKKworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BhcmFtcygpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YWViYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RyY1dyYXBwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vI2RlZmluZSBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKworI2RlZmluZSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA0MAorCitDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisKKyAgICAvKiBEYXRhIGZyb20gc3RyZWFtSW5mby4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbVN0cmVhbVBSTCA9IC0xOworICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IC0xOworICAgIG1TdHJlYW1OckFBQ0NoYW4gPSAwOworICAgIG1TdHJlYW1Ock91dENoYW4gPSAwOworCisgICAgLyogRGVzaXJlZCB2YWx1ZXMgKHNldCBieSB1c2VyKS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbURlc1RhcmdldCA9IC0xOworICAgIG1EZXNBdHRGYWN0b3IgPSAwOworICAgIG1EZXNCb29zdEZhY3RvciA9IDA7CisgICAgbURlc0hlYXZ5ID0gMDsKKworICAgIG1FbmNvZGVyVGFyZ2V0ID0gLTE7CisKKyAgICAvKiBWYWx1ZXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBkZXNpcmVkIHZhbHVlcyAqLworICAgIG1MYXN0VGFyZ2V0ID0gLTE7CisgICAgbUxhc3RBdHRGYWN0b3IgPSAwOworICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSAwOworICAgIG1MYXN0SGVhdnkgPSAwOworfQorCitDRHJjUHJlc01vZGVXcmFwcGVyOjp+Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKQoreworICAgIG1IYW5kbGVEZWNvZGVyID0gaGFuZGxlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKiBwU3RyZWFtSW5mbykKK3sKKyAgICBhc3NlcnQocFN0cmVhbUluZm8pOworCisgICAgaWYgKG1TdHJlYW1QUkwgIT0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYpIHsKKyAgICAgICAgbVN0cmVhbVBSTCA9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2OworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJvZ1JlZkxldiBpcyAlZFxuIiwgbVN0cmVhbVBSTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbURSQ1ByZXNNb2RlICE9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSkgeworICAgICAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGU7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcmVzTW9kZSBpcyAlZFxuIiwgbVN0cmVhbURSQ1ByZXNNb2RlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuICE9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJBQUNDaGFuID0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogYWFjTnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1OckFBQ0NoYW4pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW4gIT0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1Ock91dENoYW4gPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBudW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yT3V0Q2hhbik7CisjZW5kaWYKKyAgICB9CisKKworCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW48bVN0cmVhbU5yQUFDQ2hhbikgeworICAgICAgICBtSXNEb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNEb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgKG1TdHJlYW1Ock91dENoYW4gPT0gMSkpIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgbVN0cmVhbU5yT3V0Q2hhbiA9PSAyKXsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IGZhbHNlOworICAgIH0KKworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQ6CisgICAgICAgIG1EZXNUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SOgorICAgICAgICBtRGVzQXR0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SOgorICAgICAgICBtRGVzQm9vc3RGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWToKKyAgICAgICAgbURlc0hlYXZ5ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUOgorICAgICAgICBtRW5jb2RlclRhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjp1cGRhdGUoKQoreworICAgIC8vIEdldCBEYXRhIGZyb20gRGVjb2RlcgorICAgIGludCBwcm9nUmVmTGV2ZWwgPSBtU3RyZWFtUFJMOworICAgIGludCBkcmNQcmVzTW9kZSA9IG1TdHJlYW1EUkNQcmVzTW9kZTsKKworICAgIC8vIGJ5IGRlZmF1bHQsIGRvIGFzIGRlc2lyZWQKKyAgICBpbnQgbmV3VGFyZ2V0ICAgICAgICAgPSBtRGVzVGFyZ2V0OworICAgIGludCBuZXdBdHRGYWN0b3IgICAgICA9IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG5ld0Jvb3N0RmFjdG9yICAgID0gbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKKworICAgIGlmIChtRGF0YVVwZGF0ZSkgeworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xMCBkQiBvciBiZWxvdworICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nLCBjYWxjdWxhdGVkIHNjYWxpbmcgb2YgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBhcyBsaXR0bGUgY29tcHJlc3Npb24gYXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgPCBtRGVzVGFyZ2V0KSB7IC8vIGlmIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsY0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYWxjRmFjdG9yX25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMC4wZiA8IGNhbGNGYWN0b3Jfbm9ybSA8IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoZmxvYXQpKG1EZXNUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobUVuY29kZXJUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3IgPSAoaW50KShjYWxjRmFjdG9yX25vcm0qMTI3LjBmKTsgLy8gMCA8PSBjYWxjRmFjdG9yIDwgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY0ZhY3RvciBpcyB0aGUgbG93ZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAoY2FsY0ZhY3Rvcj5uZXdBdHRGYWN0b3IpID8gY2FsY0ZhY3RvciA6IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgQXR0RmFjdG9yIHdpbGwgYmUgYWx3YXlzID0gY2FsY0ZhY3RvciwgYXMgaXQgaXMgc2V0IHRvIDAgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgbGV2ZWwgPiBtRW5jb2RlclRhcmdldCA+IFBSTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQ8OTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCOiBsaWdodCBEUkMgb25seSBuZWVkZWQgaWYgd2UgcGVyZm9ybSBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscworCisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgeworICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChkcmNQcmVzTW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDogLy8gcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsgLy8gYXQgbGVhc3QsIHVzZSBsaWdodCBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0IDwgOTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcmVzZW50YXRpb24gbW9kZSAxIGFuZCAyIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQ6CisgICAgICAgICAgICAvLyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyAoRFZCKTsgU3BlY2lmaWNhdGlvbiBmb3IgdGhlIHVzZSBvZiBWaWRlbyBhbmQgQXVkaW8gQ29kaW5nCisgICAgICAgICAgICAvLyBpbiBCcm9hZGNhc3RpbmcgQXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSwKKyAgICAgICAgICAgIC8vIHNlY3Rpb24gQy41LjQuLCAiRGVjb2RpbmciLCBhbmQgVGFibGUgQy4zMworICAgICAgICAgICAgLy8gSVNPIERSQyAgICAgICAgICAgIC0+IG5ld0hlYXZ5ID0gMCAgKFVzZSBsaWdodCBjb21wcmVzc2lvbiwgTVBFRy1zdHlsZSkKKyAgICAgICAgICAgIC8vIENvbXByZXNzaW9uX3ZhbHVlICAtPiBuZXdIZWF2eSA9IDEgIChVc2UgaGVhdnkgY29tcHJlc3Npb24sIERWQi1zdHlsZSkKKyAgICAgICAgICAgIC8vIHNjYWxpbmcgcmVzdHJpY3RlZCAtPiBuZXdBdHRGYWN0b3IgPSAxMjcKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjogLy8gcHJlc2VudGF0aW9uIG1vZGUgMiwgTGlnaHQ6LTIzL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc01vbm9Eb3dubWl4KSB7IC8vIGlmIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQorICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQorCisgICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgeworICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQorICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWNvZGVyCisgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbUxhc3RUYXJnZXQpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgbUxhc3RUYXJnZXQgPSBuZXdUYXJnZXQ7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1EZXNUYXJnZXQpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgdGFyZ2V0IGxldmVsIHRvICVkIChmcm9tICVkKVxuIiwgbmV3VGFyZ2V0LCBtRGVzVGFyZ2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCB0YXJnZXQgbGV2ZWwgdG8gJWRcbiIsIG5ld1RhcmdldCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbUxhc3RBdHRGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBuZXdBdHRGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1EZXNBdHRGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwgbmV3QXR0RmFjdG9yLCBtRGVzQXR0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWRcbiIsIG5ld0F0dEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtTGFzdEJvb3N0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgbmV3Qm9vc3RGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RCb29zdEZhY3RvciA9IG5ld0Jvb3N0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1EZXNCb29zdEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBib29zdCBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IsIG1EZXNCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYm9vc3QgZmFjdG9yIHRvICVkXG4iLCBuZXdCb29zdEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtTGFzdEhlYXZ5KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBuZXdIZWF2eSk7CisgICAgICAgICAgICBtTGFzdEhlYXZ5ID0gbmV3SGVhdnk7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3SGVhdnkgIT0gbURlc0hlYXZ5KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5LCBtRGVzSGVhdnkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkXG4iLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgY29uZmlnOiB0Z3RfbGV2OiAlM2QsIGN1dDogJTNkLCBib29zdDogJTNkLCBoZWF2eTogJWRcbiIsIG5ld1RhcmdldCwKKyAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IsIG5ld0Jvb3N0RmFjdG9yLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgbURhdGFVcGRhdGUgPSBmYWxzZTsKKworICAgIH0gLy8gaWYgKG1EYXRhVXBkYXRlKQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQgICAgICAgICA9IDB4MDAwMCwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SICAgICA9IDB4MDAwMSwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IgICA9IDB4MDAwMiwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSAgICAgICAgICA9IDB4MDAwMywKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQgICAgICAgICA9IDB4MDAwNAorfSBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU07CisKKworY2xhc3MgQ0RyY1ByZXNNb2RlV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIH5DRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgdm9pZCBzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSk7CisgICAgdm9pZCBzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSk7CisgICAgdm9pZCBzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKik7CisgICAgdm9pZCB1cGRhdGUoKTsKKworcHJvdGVjdGVkOgorICAgIEhBTkRMRV9BQUNERUNPREVSIG1IYW5kbGVEZWNvZGVyOworICAgIGludCBtRGVzVGFyZ2V0OworICAgIGludCBtRGVzQXR0RmFjdG9yOworICAgIGludCBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG1EZXNIZWF2eTsKKworICAgIGludCBtRW5jb2RlclRhcmdldDsKKworICAgIGludCBtTGFzdFRhcmdldDsKKyAgICBpbnQgbUxhc3RBdHRGYWN0b3I7CisgICAgaW50IG1MYXN0Qm9vc3RGYWN0b3I7CisgICAgaW50IG1MYXN0SGVhdnk7CisKKyAgICBTQ0hBUiBtU3RyZWFtUFJMOworICAgIFNDSEFSIG1TdHJlYW1EUkNQcmVzTW9kZTsKKyAgICBJTlQgbVN0cmVhbU5yQUFDQ2hhbjsKKyAgICBJTlQgbVN0cmVhbU5yT3V0Q2hhbjsKKworICAgIGJvb2wgbUlzRG93bm1peDsKKyAgICBib29sIG1Jc01vbm9Eb3dubWl4OworICAgIGJvb2wgbUlzU3RlcmVvRG93bm1peDsKKworICAgIGJvb2wgbURhdGFVcGRhdGU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI1YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3NyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFNUk5CIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yTmJFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJXYkVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFkNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgQU1STkIKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yTmJEZWMiCisjZWxzZQorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJXYkRlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJEZWMuaCIKKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgQU1STkIKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiOworI2Vsc2UKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdEFtckRlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJEZWM6OkMyU29mdEFtckRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQW1ySGFuZGxlKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0ciksCisgICAgICBtRGVjb2RlckNvb2tpZShudWxscHRyKSB7CisjaWZkZWYgQU1STkIKKyAgICBtSXNXaWRlID0gZmFsc2U7CisjZWxzZQorICAgIG1Jc1dpZGUgPSB0cnVlOworI2VuZGlmCit9CisKK0MyU29mdEFtckRlYzo6fkMyU29mdEFtckRlYygpIHsKKyAgICAodm9pZClvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25TdG9wKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChtQW1ySGFuZGxlKSB7CisgICAgICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgbURlY29kZXJDb29raWUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChpbnQ4X3QgKikiQU1STkJEZWNvZGVyIikpCisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbUFtckhhbmRsZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZNKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0geworICAgICAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgIDUsIDYsIDUsIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbMTZdID0geworICAgICAgICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLAorICAgICAgICA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworCisgICAgaWYgKEZNID4gMTUgfHwgKGlzV2lkZSAmJiBGTSA+IDkgJiYgRk0gPCAxNCkgfHwgKCFpc1dpZGUgJiYgRk0gPiAxMSAmJiBGTSA8IDE1KSkgeworICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgbW9kZSAlZCIsIEZNKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFkZCAxIGZvciBoZWFkZXIgYnl0ZQorICAgIHJldHVybiAoaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZNXSA6IGtGcmFtZVNpemVOQltGTV0pICsgMTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU51bUZyYW1lcyhjb25zdCB1aW50OCAqaW5wdXQsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmZyYW1lU2l6ZUxpc3QsIGJvb2wgaXNXaWRlKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBpblNpemU7KSB7CisgICAgICAgIGludDE2X3QgRk0gPSAoKGlucHV0WzBdID4+IDMpICYgMHgwZik7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGTSk7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpblNpemUgLSBrKSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGlucHV0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGsgKz0gZnJhbWVTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGZyYW1lU2l6ZUxpc3QtPnB1c2hfYmFjayhmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVMaXN0OworICAgIGlmIChPSyAhPSBjYWxjdWxhdGVOdW1GcmFtZXMoclZpZXcuZGF0YSgpICsgaW5PZmZzZXQsIGluU2l6ZSwgJmZyYW1lU2l6ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZyYW1lU2l6ZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgc2l6ZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCBvdXRTYW1wbGVzID0gbUlzV2lkZSA/IGtOdW1TYW1wbGVzUGVyRnJhbWVXQiA6IGtOdW1TYW1wbGVzUGVyRnJhbWVOQjsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZSA9IG91dFNhbXBsZXMgKiBmcmFtZVNpemVMaXN0LnNpemUoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBhdXRvIGl0ID0gZnJhbWVTaXplTGlzdC5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGZyYW1lU2l6ZUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoKmlucHV0ID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQgPSBBTVJEZWNvZGUobUFtckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGcmFtZV9UeXBlXzNHUFApIEZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyAxLCBvdXRwdXQsIE1JTUVfSUVURik7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQgKyAxKSAhPSAqaXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChGTSA+PSA5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGluc3RlYWQgb2YgY29tZm9ydCBub2lzZSBhbmQgZm9yCisgICAgICAgICAgICAgICAgLy8gc3BlZWNoIGxvc3Qvbm8gZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MTZfdCBGVDsKKyAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IG51bVJlY1NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBtaW1lX3Vuc29ydGluZyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsICZGVCwgJkZNLCAxLCAmcnhfc3RhdGUpOworICAgICAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYihGTSwgbUlucHV0U2FtcGxlQnVmZmVyLCBvdXRwdXQsICZudW1SZWNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgRlQsIG1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUmVjU2FtcGxlcyAhPSBvdXRTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgb3V0cHV0IHBlciBmcmFtZSBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgb3V0cHV0KSAqLworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVjU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtpXSAmPSAweGZmZkM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluUG9zICs9ICppdDsKKyAgICAgICAgb3V0cHV0ICs9IG91dFNhbXBsZXM7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBTVJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QU1SRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFtckRlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBTVJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFtckRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBbXJEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZU5CICAgPSAxNjAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVXQiAgID0gMzIwLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQgKm1BbXJIYW5kbGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgYm9vbCBtSXNXaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYWE3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJOYkVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJOYkVuYzo6QzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNTdGF0ZShudWxscHRyKSwKKyAgICAgIG1TaWRTdGF0ZShudWxscHRyKSB7Cit9CisKK0MyU29mdEFtck5iRW5jOjp+QzJTb2Z0QW1yTmJFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkluaXQoKSB7CisgICAgYm9vbCBkdHhfZW5hYmxlID0gZmFsc2U7CisKKyAgICBpZiAoQU1SRW5jb2RlSW5pdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlLCBkdHhfZW5hYmxlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA0NzUwOiBtTW9kZSA9IE1SNDc1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE1MDogbU1vZGUgPSBNUjUxNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU5MDA6IG1Nb2RlID0gTVI1OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY3MDA6IG1Nb2RlID0gTVI2NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0MDA6IG1Nb2RlID0gTVI3NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc5NTA6IG1Nb2RlID0gTVI3OTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDIwMDogbU1vZGUgPSBNUjEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyMjAwOiBtTW9kZSA9IE1SMTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gTVI3OTU7CisgICAgfQorICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNTdGF0ZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUpOworICAgICAgICBtRW5jU3RhdGUgPSBtU2lkU3RhdGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoQU1SRW5jb2RlUmVzZXQobUVuY1N0YXRlLCBtU2lkU3RhdGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGU7CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbU1vZGUsIG1JbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuZGF0YSgpICsgb3V0UG9zLCAmZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1RYX1dNRik7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDAgfHwgbnVtRW5jQnl0ZXMgPiAoKGludClvdXRDYXBhY2l0eSAtIChpbnQpb3V0UG9zKSkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgaGVhZGVyIGJ5dGUgZnJvbSBXTUYgdG8gSUVURiBmb3JtYXQuCisgICAgICAgIGlmIChudW1FbmNCeXRlcyA+IDApCisgICAgICAgICAgICB3Vmlldy5kYXRhKClbb3V0UG9zXSA9ICgod1ZpZXcuZGF0YSgpW291dFBvc10gPDwgMykgfCA0KSAmIDB4N2M7CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtck5iRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtck5iRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJOYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWIxNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNTdGF0ZTsKKyAgICB2b2lkICptU2lkU3RhdGU7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yTmJFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5Y2IzMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yV2JFbmMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDE2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbygxNjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJXYkVuYzo6QzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNvZGVySGFuZGxlKG51bGxwdHIpLAorICAgICAgbUFwaUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1NZW1PcGVyYXRvcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFtcldiRW5jOjp+QzJTb2Z0QW1yV2JFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDY2MDA6IG1Nb2RlID0gVk9BTVJXQl9NRDY2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODg1MDogbU1vZGUgPSBWT0FNUldCX01EODg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI2NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDEyNjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDI1MDogbU1vZGUgPSBWT0FNUldCX01EMTQyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE4MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTk4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzMDUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUFwaUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICAgICAgbUFwaUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtTWVtT3BlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKKyAgICAgICAgbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvblN0b3AoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlc1BlckZyYW1lOyBpKyspIHsKKyAgICAgICAgbUlucHV0RnJhbWVbaV0gPSAweDAwMDg7IC8qIEVIRl9NQVNLICovCisgICAgfQorICAgIHVpbnQ4X3Qgb3V0QnVmZmVyW2tOdW1CeXRlc1BlcklucHV0RnJhbWVdOworICAgICh2b2lkKSBlbmNvZGVJbnB1dChvdXRCdWZmZXIsIGtOdW1CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgaWYgKCFtTWVtT3BlcmF0b3IpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KAorICAgICAgICAgICAgICAgICZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgVk9BTVJXQkZSQU1FVFlQRSB0eXBlID0gVk9BTVJXQl9SRkMzMjY3OworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0KKyAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICAmbU1vZGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1Nb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQzJTb2Z0QW1yV2JFbmM6OmVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworCisgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwKKyAgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbnB1dERhdGEpKTsKKworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBidWZmZXI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBsZW5ndGg7CisgICAgVk9fVTMyIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEoCisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBpZiAocmV0ICE9IFZPX0VSUl9OT05FICYmIHJldCAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKSB7CisgICAgICAgIEFMT0dEKCJlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgZW5jb2RlIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGF0YS5MZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBlbmNvZGVJbnB1dCgod1ZpZXcuZGF0YSgpICsgb3V0UG9zKSwgb3V0Q2FwYWNpdHkgLSBvdXRQb3MpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtcldiRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtcldiRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJXYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY29kZXJIYW5kbGU7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SICptTWVtT3BlcmF0b3I7CisgICAgVk9BTVJXQk1PREUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgaW50IGVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtcldiRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYmY1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2MyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW9tRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBb21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBb21EZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICBoZWxwZXIsIENPTVBPTkVOVF9OQU1FLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geworICAgICAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIG9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+JiBtZSwKKyAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4KKyAgICAgICAgLy8gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+JiBtZSwKKyAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4mIG1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZ2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKK307CisKK0MyU29mdEFvbURlYzo6QzJTb2Z0QW9tRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKXsKKworICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0QW9tRGVjOjp+QzJTb2Z0QW9tRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBb21EZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyLiIpOworICAgICAgICBkZXN0cm95RGVjb2RlcigpOworICAgICAgICAodm9pZClpbml0RGVjb2RlcigpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBb21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBkZXN0cm95RGVjb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgd2hpbGUgKGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcikpIHsKKyAgICB9CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbmV3IGFvbV9jb2RlY19jdHhfdDsKKyAgICB9CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBhb21fY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGFvbV9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIGNmZy5hbGxvd19sb3diaXRkZXB0aCA9IDE7CisKKyAgICBhb21fY29kZWNfZmxhZ3NfdCBmbGFnczsKKyAgICBtZW1zZXQoJmZsYWdzLCAwLCBzaXplb2YoYW9tX2NvZGVjX2ZsYWdzX3QpKTsKKworICAgIGFvbV9jb2RlY19lcnJfdCBlcnI7CisgICAgaWYgKChlcnIgPSBhb21fY29kZWNfZGVjX2luaXQobUNvZGVjQ3R4LCBhb21fY29kZWNfYXYxX2R4KCksICZjZmcsIDApKSkgeworICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEFvbURlYzo6ZGVzdHJveURlY29kZXIoKSB7CisgICAgaWYgKG1Db2RlY0N0eCkgeworICAgICAgICBhb21fY29kZWNfZGVzdHJveShtQ29kZWNDdHgpOworICAgICAgICBkZWxldGUgbUNvZGVjQ3R4OworICAgICAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBb21EZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworICAgIGlmIChpblNpemUpIHsKKyAgICAgICAgdWludDhfdCogYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90Kj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBpbnQzMl90IGRlY29kZVRpbWUgPSAwOworICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKworICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIGJpdHN0cmVhbSwgaW5TaXplKTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworCisgICAgICAgIGFvbV9jb2RlY19lcnJfdCBlcnIgPQorICAgICAgICAgICAgYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCk7CisKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNGQgZGVsYXk9JTRkXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBBT01fQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90KiBkc3RTdGFydCA9IGRzdDsKKworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RTdHJpZGUgLyAyLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0QW9tRGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgYW9tX2ltYWdlX3QqIGltZyA9IGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QqKWltZy0+dXNlcl9wcml2LCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKKyAgICBibG9jayA9IG51bGxwdHI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICB1aW50MzJfdCBkcmFpbk1vZGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHdoaWxlICgob3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspKSkgeworICAgIH0KKworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TICYmIHdvcmsgJiYKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QW9tRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworICAgcHVibGljOgorICAgIEMyU29mdEFvbUZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW9tRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBb21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW9tRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW9tRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MjY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSAiYW9tL2FvbV9kZWNvZGVyLmgiCisjaW5jbHVkZSAiYW9tL2FvbWR4LmgiCisKKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBb21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QW9tRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFvbURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYW9tX2NvZGVjX2N0eF90KiBtQ29kZWNDdHg7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyAgICAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2spOworICAgIGJvb2wgb3V0cHV0QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCh1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW9tRGVjKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvdGVtcC9hdjEiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICJ3ZWJtIgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvdGVtcC9hdjEiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiYXYxIgorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiR0VORVJBVEVfRklMRV9OQU1FUyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorICAgIH0KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkR1bXAgdG8gZmlsZSEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgICAgICAgICAgaWYgKGZwICE9IE5VTEwpIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjE0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM3IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZGVjIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0RlYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2VuYyJdLAorCisgICAgc3JjczogWyJDMlNvZnRBdmNFbmMuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjkwZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKQEAgLTAsMCArMSw5ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QXZjRGVjLmgiCisjaW5jbHVkZSAiaWgyNjRkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEF2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDh1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBjb2RlZCBhbmQgb3V0cHV0IHBpY3R1cmUgc2l6ZSBpcyB0aGUgc2FtZSBmb3IgdGhpcyBjb2RlYworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0h9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ180LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ181LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA4MHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA4MHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDE5Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0QXZjRGVjOjpDMlNvZnRBdmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpIHsKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKK30KKworQzJTb2Z0QXZjRGVjOjp+QzJTb2Z0QXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gbVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRBdmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUgyNjREX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdGZyX2NoYXJzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZnM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEF2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIHsKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZClnZXRWdWlQYXJhbXMoKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR0QoIkJ5dGVzIGNvbnN1bWVkIGlzIHplcm8uIElnbm9yaW5nIHJlbWFpbmluZyBieXRlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEF2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBdmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBdmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjdhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloMjY0ZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL2F2Y2RfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJoMjY0IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMICYmIG1fb2Zmc2V0ID09IDApIHsgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCkgbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGZwID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisKK2NsYXNzIEMyU29mdEF2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QXZjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpOworICAgIHZvaWQgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODUxOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKQEAgLTAsMCArMSwxNTYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEF2Y0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNFbmMuaCIKKyNpbmNsdWRlICJpaDI2NGUuaCIKKyNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBdmNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjU2MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgMC4pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIG1vZGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9BUkJJVFJBUlkgfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW50cmFSZWZyZXNoLCBwZXJpb2QpLmFueSgpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihJbnRyYVJlZnJlc2hTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsIExFVkVMX0FWQ180XzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMywKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfM18yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzQsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ181LAorICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUsIG1GcmFtZVJhdGUsIG1CaXRyYXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gJmZyYW1lUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZiaXRyYXRlKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBMZXZlbExpbWl0cyB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbDsKKyAgICAgICAgICAgIGZsb2F0IG1ic1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IG1iczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgICAgMTQ4NSwgICAgOTksICAgICA2NDAwMCB9LAorICAgICAgICAgICAgLy8gRGVjb2RlciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbGV2ZWwgMWIuCisgICAgICAgICAgICAvLyB7IExFVkVMX0FWQ18xQiwgICAgMTQ4NSwgICA5OSwgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgICAzMDAwLCAgIDM5NiwgICAgMTkyMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsICAgNjAwMCwgICAzOTYsICAgIDM4NDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAgMTE4ODAsICAgMzk2LCAgICA3NjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgIDExODgwLCAgIDM5NiwgICAyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsICAxOTgwMCwgICA3OTIsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAgMjAyNTAsICAxNjIwLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgIDQwNTAwLCAgMTYyMCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDEwODAwMCwgIDM2MDAsICAxNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAyMTYwMDAsICA1MTIwLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgMjQ1NzYwLCAgODE5MiwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDI0NTc2MCwgIDgxOTIsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA1MjIyNDAsICA4NzA0LCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTg5ODI0LCAyMjA4MCwgMTM1MDAwMDAwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgdWludDY0X3QgbWJzID0gdWludDY0X3QoKHNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgoc2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KTsKKyAgICAgICAgZmxvYXQgbWJzUGVyU2VjID0gZmxvYXQobWJzKSAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuIEZvciBMZXZlbCAxYiwgd2Ugd2FudCB0byB1cGRhdGUgdGhlIGxldmVsIGFueXdheSwKKyAgICAgICAgLy8gc28gd2Ugc2V0IGl0IHRvIHRydWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gKG1lLnYubGV2ZWwgPT0gTEVWRUxfQVZDXzFCKTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAobWJzIDw9IGxpbWl0Lm1icyAmJiBtYnNQZXJTZWMgPD0gbGltaXQubWJzUGVyU2VjICYmCisgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUudi52YWx1ZSA8PSBsaW1pdC5iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cywgYW5kIGlmCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdXBwbGllZCBsZXZlbCB5ZXQsIHRoYXQgbWVhbnMgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJHaXZlbiBsZXZlbCAleCBkb2VzIG5vdCBjb3ZlciBjdXJyZW50IGNvbmZpZ3VyYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGluZyB0byAleCIsIG1lLnYubGV2ZWwsIGxpbWl0LmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBsaW1pdC5sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lLnYubGV2ZWwgPT0gbGltaXQubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB0aGUgbG93ZXN0IGZlYXNpYmxlIGxldmVsIGlzCisgICAgICAgICAgICAgICAgLy8gZm91bmQuIFRoZSBmYWN0IHRoYXQgd2UncmUgaGVyZSBtZWFucyB0aGF0IG91ciBsZXZlbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gbWVldCB0aGUgcmVxdWlyZW1lbnQgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vIFdlIHNldCB0byB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGV2ZWwuCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0FWQ181OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEludHJhUmVmcmVzaFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi5wZXJpb2QgPCAxKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQ7CisgICAgICAgICAgICBtZS5zZXQoKS5wZXJpb2QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IGFyYml0cmFyeSBtb2RlIChjeWNsaWMgaW4gb3VyIGNhc2UpCisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgSVZfUFJPRklMRV9UIGdldFByb2ZpbGVfbCgpIGNvbnN0IHsKKyAgICAgICAgc3dpdGNoIChtUHJvZmlsZUxldmVsLT5wcm9maWxlKSB7CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU6ICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfQkFTRUxJTkU6IHJldHVybiBJVl9QUk9GSUxFX0JBU0U7CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfTUFJTjogICAgIHJldHVybiBJVl9QUk9GSUxFX01BSU47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHByb2ZpbGU6ICV4IiwgbVByb2ZpbGVMZXZlbC0+cHJvZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gSVZfUFJPRklMRV9ERUZBVUxUOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgYXZjTGV2ZWw7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbCBsZXZlbHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzEsICAgMTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFCLCAgIDkgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgMTEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMiwgMTIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgMTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgMjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMSwgMjEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgMjIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgMzAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMSwgMzEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMzIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgNDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMSwgNDEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNDIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTAgfSwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbCAmbGV2ZWwgOiBsZXZlbHMpIHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZUxldmVsLT5sZXZlbCA9PSBsZXZlbC5jMkxldmVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsLmF2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gNDE7CisgICAgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZF9sKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGdldEludHJhUmVmcmVzaF9sKCkgY29uc3QgeyByZXR1cm4gbUludHJhUmVmcmVzaDsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworI2RlZmluZSBpdmVfYXBpX2Z1bmN0aW9uICBpaDI2NGVfYXBpX2Z1bmN0aW9uCisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciI7CisKK25hbWVzcGFjZSB7CisKKy8vIEZyb20gZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIvaWgyNjRlX2JpdHN0cmVhbS5oCitjb25zdGV4cHIgdWludDMyX3QgTUlOX1NUUkVBTV9TSVpFID0gMHg4MDA7CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMlNvZnRBdmNFbmM6OkMyU29mdEF2Y0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1BVkNFbmNQcm9maWxlKElWX1BST0ZJTEVfQkFTRSksCisgICAgICBtQVZDRW5jTGV2ZWwoNDEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKKyAgICAgIG1TYXdPdXRwdXRFT1MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKSwKKyAgICAgIC8vIFRPRE86IG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgbU91dEJ1ZmZlclNpemUoNTI0Mjg4KSB7CisKKyAgICAvLyBJZiBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCitDMlNvZnRBdmNFbmM6On5DMlNvZnRBdmNFbmMoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpvblJlc2V0KCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9SRVNFVD8KKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0ZMVVNIPworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCAgQzJTb2Z0QXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIG1OdW1NZW1SZWNvcmRzID0gREVGQVVMVF9NRU1fUkVDX0NOVDsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gMDsKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtQXJjaCA9IERFRkFVTFRfQVJDSDsKKyAgICBtU2xpY2VNb2RlID0gREVGQVVMVF9TTElDRV9NT0RFOworICAgIG1TbGljZVBhcmFtID0gREVGQVVMVF9TTElDRV9QQVJBTTsKKyAgICBtSGFsZlBlbEVuYWJsZSA9IERFRkFVTFRfSFBFTDsKKyAgICBtSUludGVydmFsID0gREVGQVVMVF9JX0lOVEVSVkFMOworICAgIG1JRFJJbnRlcnZhbCA9IERFRkFVTFRfSURSX0lOVEVSVkFMOworICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTDsKKyAgICBtRW5hYmxlRmFzdFNhZCA9IERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEOworICAgIG1FbmFibGVBbHRSZWYgPSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGOworICAgIG1FbmNTcGVlZCA9IERFRkFVTFRfRU5DX1NQRUVEOworICAgIG1JbnRyYTR4NCA9IERFRkFVTFRfSU5UUkE0eDQ7CisgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnID0gREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQTsKKyAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CisgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CisgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREaW1lbnNpb25zKCkgeworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCBzX2RpbWVuc2lvbnNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90IHNfZGltZW5zaW9uc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtU2l6ZS0+d2lkdGg7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90KTsKKyAgICBzX2RpbWVuc2lvbnNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RpbWVuc2lvbnNfaXAsICZzX2RpbWVuc2lvbnNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSBkaW1lbnNpb25zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RpbWVuc2lvbnNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXROdW1Db3JlcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19udW1fY29yZXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19udW1fY29yZXNfb3A7CisgICAgc19udW1fY29yZXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9DT1JFUyk7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisKKyAgICBzX251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopICZzX251bV9jb3Jlc19pcCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvY2Vzc29yIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90IHNfZnJhbWVfcmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3Qgc19mcmFtZV9yYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90KTsKKyAgICBzX2ZyYW1lX3JhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3JhdGVfaXAsICZzX2ZyYW1lX3JhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSByYXRlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3JhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRJcGVQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90IHNfaXBlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3Qgc19pcGVfcGFyYW1zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfaXBlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfaXBlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfSVBFX1BBUkFNUzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmFibGVfaW50cmFfNHg0ID0gbUludHJhNHg0OworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmNfc3BlZWRfcHJlc2V0ID0gbUVuY1NwZWVkOworICAgIHNfaXBlX3BhcmFtc19pcC51NF9jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gbUNvbnN0cmFpbmVkSW50cmFGbGFnOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCk7CisgICAgc19pcGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pcGVfcGFyYW1zX2lwLCAmc19pcGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaXBlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19pcGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0Qml0UmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3Qgc19iaXRyYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCBzX2JpdHJhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19iaXRyYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19iaXRyYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9CSVRSQVRFOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUtPnZhbHVlOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYml0cmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCk7CisgICAgc19iaXRyYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19iaXRyYXRlX2lwLCAmc19iaXRyYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYml0IHJhdGUgPSAweCV4XG4iLCBzX2JpdHJhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UIGVfZnJhbWVfdHlwZSkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19mcmFtZV90eXBlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV90eXBlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVRZUEU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9mcmFtZV90eXBlID0gZV9mcmFtZV90eXBlOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCk7CisgICAgc19mcmFtZV90eXBlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV90eXBlX2lwLCAmc19mcmFtZV90eXBlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgdHlwZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV90eXBlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UXAoKSB7CisgICAgaXZlX2N0bF9zZXRfcXBfaXBfdCBzX3FwX2lwOworICAgIGl2ZV9jdGxfc2V0X3FwX29wX3Qgc19xcF9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CisKKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7CisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3FwX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfaXBfdCk7CisgICAgc19xcF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3FwX2lwLCAmc19xcF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHFwIDB4JXhcbiIsIHNfcXBfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCBzX2VuY19tb2RlX2lwOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3Qgc19lbmNfbW9kZV9vcDsKKworICAgIHNfZW5jX21vZGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2VuY19tb2RlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9FTkNfTU9ERTsKKworICAgIHNfZW5jX21vZGVfaXAuZV9lbmNfbW9kZSA9IGVfZW5jX21vZGU7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCk7CisgICAgc19lbmNfbW9kZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY19tb2RlX2lwLCAmc19lbmNfbW9kZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGluIGhlYWRlciBlbmNvZGUgbW9kZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19lbmNfbW9kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFZidlBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3Qgc192YnZfaXA7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90IHNfdmJ2X29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfdmJ2X2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc192YnZfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1ZCVl9QQVJBTVM7CisKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmX3NpemUgPSAwOworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZmZXJfZGVsYXkgPSAxMDAwOworCisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Zidl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCk7CisgICAgc192YnZfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Zidl9pcCwgJnNfdmJ2X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgVkJWIHBhcmFtcyA9IDB4JXhcbiIsIHNfdmJ2X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0QWlyUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCBzX2Fpcl9pcDsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3Qgc19haXJfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19haXJfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2Fpcl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQUlSX1BBUkFNUzsKKworICAgIHNfYWlyX2lwLmVfYWlyX21vZGUgPQorICAgICAgICAobUludHJhUmVmcmVzaC0+bW9kZSA9PSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCB8fCBtSW50cmFSZWZyZXNoLT5wZXJpb2QgPCAxKQorICAgICAgICAgICAgPyBJVkVfQUlSX01PREVfTk9ORSA6IElWRV9BSVJfTU9ERV9DWUNMSUM7CisgICAgc19haXJfaXAudTRfYWlyX3JlZnJlc2hfcGVyaW9kID0gbUludHJhUmVmcmVzaC0+cGVyaW9kOworCisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2Fpcl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCk7CisgICAgc19haXJfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2Fpcl9pcCwgJnNfYWlyX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYWlyIHBhcmFtcyA9IDB4JXhcbiIsIHNfYWlyX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0TWVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90IHNfbWVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90IHNfbWVfcGFyYW1zX29wOworCisgICAgc19tZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX21lX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTUVfUEFSQU1TOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2Zhc3Rfc2FkID0gbUVuYWJsZUZhc3RTYWQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2FsdF9yZWYgPSBtRW5hYmxlQWx0UmVmOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2hwZWwgPSBtSGFsZlBlbEVuYWJsZTsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfcXBlbCA9IERFRkFVTFRfUVBFTDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9tZV9zcGVlZF9wcmVzZXQgPSBERUZBVUxUX01FX1NQRUVEOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3ggPSBERUZBVUxUX1NSQ0hfUk5HX1g7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeSA9IERFRkFVTFRfU1JDSF9STkdfWTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCk7CisgICAgc19tZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfbWVfcGFyYW1zX2lwLCAmc19tZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBtZSBwYXJhbXMgPSAweCV4XG4iLCBzX21lX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEdvcFBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90IHNfZ29wX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3Qgc19nb3BfcGFyYW1zX29wOworCisgICAgc19nb3BfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19nb3BfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9HT1BfUEFSQU1TOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3QpOworICAgIHNfZ29wX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZ29wX3BhcmFtc19pcCwgJnNfZ29wX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEdPUCBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZ29wX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFByb2ZpbGVQYXJhbXMoKSB7CisgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCBzX3Byb2ZpbGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3Qgc19wcm9maWxlX3BhcmFtc19vcDsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9QUk9GSUxFX1BBUkFNUzsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID0gbUludGYtPmdldFByb2ZpbGVfbCgpOworICAgIGlmIChzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9PSBJVl9QUk9GSUxFX0JBU0UpIHsKKyAgICAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAxOworICAgIH0KKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCk7CisgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3QpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcHJvZmlsZV9wYXJhbXNfaXAsICZzX3Byb2ZpbGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvZmlsZSBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREZWJsb2NrUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90IHNfZGVibG9ja19wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCBzX2RlYmxvY2tfcGFyYW1zX29wOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RFQkxPQ0tfUEFSQU1TOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9kaXNhYmxlX2RlYmxvY2tfbGV2ZWwgPSBtRGlzYWJsZURlYmxrTGV2ZWw7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCk7CisgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RlYmxvY2tfcGFyYW1zX2lwLCAmc19kZWJsb2NrX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZW5hYmxlL2Rpc2FibGUgZGVibG9jayBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB1MV92ZXJzaW9uID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZnNpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfY3RsX2lwLCAodm9pZCAqKSAmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb246IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiSXR0aWFtIGVuY29kZXIgdmVyc2lvbjogJXMiLCAoY2hhciAqKXNfY3RsX2lwLnB1MV92ZXJzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgbGV2ZWw7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgYzJfc3RhdHVzX3QgZXJyVHlwZSA9IEMyX09LOworCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgbUFWQ0VuY0xldmVsID0gbUludGYtPmdldExldmVsX2woKTsKKyAgICAgICAgbUlJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICB9CisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKworICAgIG1TdHJpZGUgPSB3aWR0aDsKKworICAgIC8vIFRPRE8KKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisKKyAgICBBTE9HRCgiUGFyYW1zIHdpZHRoICVkIGhlaWdodCAlZCBsZXZlbCAlZCBjb2xvckZvcm1hdCAlZCIsIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LCBtQVZDRW5jTGV2ZWwsIG1JdlZpZGVvQ29sb3JGb3JtYXQpOworCisgICAgLyogR2V0dGluZyBOdW1iZXIgb2YgTWVtUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X251bV9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19udW1fbWVtX3JlY19pcCwgJnNfbnVtX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkdldCBudW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYXJyYXkgdG8gaG9sZCBtZW1vcnkgcmVjb3JkcyAqLworICAgIGlmIChtTnVtTWVtUmVjb3JkcyA+IFNJWkVfTUFYIC8gc2l6ZW9mKGl2X21lbV9yZWNfdCkpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RlZCBtZW1vcnkgc2l6ZSBpcyB0b28gYmlnLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBtTWVtUmVjb3JkcyA9IChpdl9tZW1fcmVjX3QgKiltYWxsb2MobU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKG51bGxwdHIgPT0gbU1lbVJlY29yZHMpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvbGQgbWVtb3J5IHJlY29yZHM6IFNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBudWxscHRyOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUgPSAwOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5lX21lbV90eXBlID0gSVZfTkFfTUVNX1RZUEU7CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldHRpbmcgTWVtUmVjb3JkcyBBdHRyaWJ1dGVzICovCisgICAgeworICAgICAgICBpdl9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX3JlY19pcDsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NvbG9yX2Zvcm1hdCA9IERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfZmlsbF9tZW1fcmVjX2lwLCAmc19maWxsX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkZpbGwgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGluZyBNZW1vcnkgZm9yIE1lbSBSZWNvcmRzICovCisgICAgeworICAgICAgICBXT1JEMzIgdG90YWxfc2l6ZTsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICB0b3RhbF9zaXplID0gMDsKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZV9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbSByZWNvcmQgaWQgJXp1IHNpemUgJXVcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29kZWMgSW5zdGFuY2UgQ3JlYXRpb24gKi8KKyAgICB7CisgICAgICAgIGl2ZV9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmVfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICBtQ29kZWNDdHggPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZV9hcGlfZnVuY3Rpb247CisKKyAgICAgICAgc19pbml0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfaXBfdCk7CisgICAgICAgIHNfaW5pdF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X29wX3QpOworCisgICAgICAgIHNfaW5pdF9pcC5lX2NtZCA9IElWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF93ZCA9IHdpZHRoOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfaW5pdF9pcC5lX2lucF9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgICAgIGlmIChtUmVjb25FbmFibGUgfHwgbVBTTlJFbmFibGUpIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc19pbml0X2lwLmVfcmVjb25fY29sb3JfZm10ID0gREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfaW5pdF9pcC5lX3JjX21vZGUgPSBERUZBVUxUX1JDX01PREU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfZnJhbWVyYXRlID0gREVGQVVMVF9NQVhfRlJBTUVSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2JpdHJhdGUgPSBERUZBVUxUX01BWF9CSVRSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2JmcmFtZXMgPSBtQmZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLmVfY29udGVudF90eXBlID0gSVZfUFJPR1JFU1NJVkU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworICAgICAgICBzX2luaXRfaXAuZV9zbGljZV9tb2RlID0gbVNsaWNlTW9kZTsKKyAgICAgICAgc19pbml0X2lwLnU0X3NsaWNlX3BhcmFtID0gbVNsaWNlUGFyYW07CisgICAgICAgIHNfaW5pdF9pcC5lX2FyY2ggPSBtQXJjaDsKKyAgICAgICAgc19pbml0X2lwLmVfc29jID0gREVGQVVMVF9TT0M7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2luaXRfaXAsICZzX2luaXRfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkluaXQgZW5jb2RlciBmYWlsZWQgPSAweCV4XG4iLCBzX2luaXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IENvZGVjIFZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBzZXQgcHJvY2Vzc29yIGRldGFpbHMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgZGltZW5zaW9ucyAqLworICAgIHNldERpbWVuc2lvbnMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIHJhdGVzICovCisgICAgc2V0RnJhbWVSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBJUEUgUGFyYW1zICovCisgICAgc2V0SXBlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBCaXRyYXRlICovCisgICAgc2V0Qml0UmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUVAgKi8KKyAgICBzZXRRcCgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQUlSIHBhcmFtcyAqLworICAgIHNldEFpclBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgVkJWIHBhcmFtcyAqLworICAgIHNldFZidlBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgTW90aW9uIGVzdGltYXRpb24gcGFyYW1zICovCisgICAgc2V0TWVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEdPUCBwYXJhbXMgKi8KKyAgICBzZXRHb3BQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IERlYmxvY2sgcGFyYW1zICovCisgICAgc2V0RGVibG9ja1BhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUHJvZmlsZSBwYXJhbXMgKi8KKyAgICBzZXRQcm9maWxlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBpbiBFbmNvZGUgaGVhZGVyIG1vZGUgKi8KKyAgICBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9IRUFERVIpOworCisgICAgQUxPR1YoImluaXRfY29kZWMgc3VjY2Vzc2Z1bGwiKTsKKworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXMgPSBJVl9TVUNDRVNTOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCBzX3JldHJpZXZlX21lbV9pcDsKKyAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3Qgc19yZXRyaWV2ZV9tZW1fb3A7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc19yZXRyaWV2ZV9tZW1faXAudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3QpOworICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X3NpemUgPSBzaXplb2YoaXZfcmV0cmlldmVfbWVtX3JlY19vcF90KTsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5lX2NtZCA9IElWX0NNRF9SRVRSSUVWRV9NRU1SRUM7CisgICAgc19yZXRyaWV2ZV9tZW1faXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3JldHJpZXZlX21lbV9pcCwgJnNfcmV0cmlldmVfbWVtX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHJldHJpZXZlIG1lbW9yeSByZWNvcmRzID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3JldHJpZXZlX21lbV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvKiBGcmVlIG1lbW9yeSByZWNvcmRzICovCisgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc19yZXRyaWV2ZV9tZW1fb3AudTRfbnVtX21lbV9yZWNfZmlsbGVkOyBpKyspIHsKKyAgICAgICAgaWYgKHBzX21lbV9yZWMpIGl2ZV9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1lbW9yeSByZWNvcmQgaXMgbnVsbC4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgcHNfbWVtX3JlYysrOworICAgIH0KKworICAgIGlmIChtTWVtUmVjb3JkcykgZnJlZShtTWVtUmVjb3Jkcyk7CisKKyAgICAvLyBjbGVhciBvdGhlciBwb2ludGVycyBpbnRvIHRoZSBzcGFjZSBiZWluZyBmcmVlKClkCisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RW5jb2RlQXJncygKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAsCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgdWludDhfdCAqYmFzZSwKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGl2X3Jhd19idWZfdCAqcHNfaW5wX3Jhd19idWY7CisKKyAgICBwc19pbnBfcmF3X2J1ZiA9ICZwc19lbmNvZGVfaXAtPnNfaW5wX2J1ZjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi5wdl9idWYgPSBiYXNlOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J5dGVzID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9idWZzaXplID0gY2FwYWNpdHk7CisgICAgcHNfZW5jb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfaXBfdCk7CisgICAgcHNfZW5jb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfb3BfdCk7CisKKyAgICBwc19lbmNvZGVfaXAtPmVfY21kID0gSVZFX0NNRF9WSURFT19FTkNPREU7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9idWZzID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnB2X21iX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfcGljX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+dTRfbWJfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3BpY19pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IHRpbWVzdGFtcCA+PiAzMjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSB0aW1lc3RhbXAgJiAweEZGRkZGRkZGOworICAgIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnB2X2J1ZiA9IG51bGxwdHI7CisKKyAgICAvKiBJbml0aWFsaXplIGNvbG9yIGZvcm1hdHMgKi8KKyAgICBtZW1zZXQocHNfaW5wX3Jhd19idWYsIDAsIHNpemVvZihpdl9yYXdfYnVmX3QpKTsKKyAgICBwc19pbnBfcmF3X2J1Zi0+dTRfc2l6ZSA9IHNpemVvZihpdl9yYXdfYnVmX3QpOworICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaWYgKGlucHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyl7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJ3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsIGlucHV0LT53aWR0aCgpLCBpbnB1dC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBpbnB1dC0+bGF5b3V0KCk7CisgICAgdWludDhfdCAqeVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICp1UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKnZQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBBTE9HVigieVBsYW5lU2l6ZSA9ICV6dSIsIHlQbGFuZVNpemUpOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKmlucHV0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JdlZpZGVvQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwUDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnN0IGJ1dCBJdHRpYW0gQVBJIHdhbnRzIGJhcmUgcG9pbnRlci4KKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1syXSA9IHZQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMl0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMl0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsyXSA9IHZTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0gcHUxX2J1ZjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBtV2lkdGggKiAyOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2hpbGUgKCFtU2F3T3V0cHV0RU9TICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyb3I7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOworICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKKworICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVhZGVyTGVuZ3RoID0gTUlOX1NUUkVBTV9TSVpFOworICAgICAgICB1aW50OF90IGhlYWRlcltrSGVhZGVyTGVuZ3RoXTsKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBudWxscHRyLCBoZWFkZXIsIGtIZWFkZXJMZW5ndGgsIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChlcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkOiAlZCIsIGVycm9yKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgaGVhZGVyIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGhlYWRlciwgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIERVTVBfVE9fRklMRSgKKyAgICAgICAgICAgICAgICBtT3V0RmlsZSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIHNldEJpdFJhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRyYVJlZnJlc2ggIT0gbUludHJhUmVmcmVzaCkgeworICAgICAgICAgICAgbUludHJhUmVmcmVzaCA9IGludHJhUmVmcmVzaDsKKyAgICAgICAgICAgIHNldEFpclBhcmFtcygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIHNldEZyYW1lVHlwZShJVl9JRFJfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgfQorCisgICAgLyogSW4gbm9ybWFsIG1vZGUsIHN0b3JlIGlucHV0QnVmZmVySW5mbyBhbmQgdGhpcyB3aWxsIGJlIHJldHVybmVkCisgICAgICAgd2hlbiBlbmNvZGVyIGNvbnN1bWVzIHRoaXMgaW5wdXQgKi8KKyAgICAvLyBpZiAoIW1JbnB1dERhdGFJc01ldGEgJiYgKGlucHV0QnVmZmVySW5mbyAhPSBOVUxMKSkgeworICAgIC8vICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUzsgaSsrKSB7CisgICAgLy8gICAgICAgICBpZiAoTlVMTCA9PSBtSW5wdXRCdWZmZXJJbmZvW2ldKSB7CisgICAgLy8gICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXSA9IGlucHV0QnVmZmVySW5mbzsKKyAgICAvLyAgICAgICAgICAgICBicmVhazsKKyAgICAvLyAgICAgICAgIH0KKyAgICAvLyAgICAgfQorICAgIC8vIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgdmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmICh2aWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgZG8geworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaCBsaW5lYXIgYmxvY2sgZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGVyciA9ICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCB2aWV3LmdldCgpLCB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChlcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIDogJWQiLCBlcnJvcik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyb3I7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEVU1QX1RPX0ZJTEUoCisgICAgICAgIC8vICAgICAgICAgbUluRmlsZSwgc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdLAorICAgICAgICAvLyAgICAgICAgIChtSGVpZ2h0ICogbVN0cmlkZSAqIDMgLyAyKSk7CisKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCisgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKChzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikgPT0gSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfR0VUQlVGSU5GTyBmb3IgcHJvcGVyIG1heCBpbnB1dCBzaXplPworICAgICAgICAgICAgICAgIG1PdXRCdWZmZXJTaXplICo9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiRW5jb2RlIEZyYW1lIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKTsKKworICAgIC8vIEhvbGQgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICBtQnVmZmVyc1tzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworCisgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgLyogSWYgZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLworICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgbm90IHRyYWNrZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9CisgICAgICAgICgodWludDY0X3Qpc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwgc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2xvdzsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworCisgICAgaWYgKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIGlmIChJVl9JRFJfRlJBTUUgPT0gc19lbmNvZGVfb3AudTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgICAgICBBTE9HVigiSURSIGZyYW1lIHByb2R1Y2VkIik7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAoc19lbmNvZGVfb3AudTRfaXNfbGFzdCkgeworICAgICAgICAvLyBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIG1TYXdPdXRwdXRFT1MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICY9IH5PTVhfQlVGRkVSRkxBR19FT1M7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgKHZvaWQpZHJhaW5Nb2RlOworICAgICh2b2lkKXBvb2w7CisgICAgcmV0dXJuIEMyX09LOworfQorCisKK2NsYXNzIEMyU29mdEF2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBdmNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBdmNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhM2NhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdjIuaCIKKyNpbmNsdWRlICJpdmUyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgICAgICAgICAgNAorI2RlZmluZSBMRU5fU1RBVFVTX0JVRkZFUiAgICAgICAgKDEwICAqIDEwMjQpCisjZGVmaW5lIE1BWF9WQlZfQlVGRl9TSVpFICAgICAgICAoMTIwICogMTYzODQpCisjZGVmaW5lIE1BWF9OVU1fSU9fQlVGUyAgICAgICAgICAgMworCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAyCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCisjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDIwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWCAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9GUkFNRVJBVEUgICAgICAgMTIwMDAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTX1BSRV9FTkMgICAwCisjZGVmaW5lIERFRkFVTFRfRlBTICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0VOQ19TUEVFRCAgICAgICAgICAgSVZFX05PUk1BTAorCisjZGVmaW5lIERFRkFVTFRfTUVNX1JFQ19DTlQgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkVDT05fRU5BQkxFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfQ0hLU1VNX0VOQUJMRSAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1RBUlRfRlJNICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0ZSTVMgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVCAgICAgICBJVl9ZVVZfNDIwU1BfVlUKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQgICAgIElWX1lVVl80MjBQCisjZGVmaW5lIERFRkFVTFRfTE9PUEJBQ0sgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1JDX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX1RHVF9GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9NQVhfV0QgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfSFQgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTEVWRUwgICAgICAgICAgIDQxCisjZGVmaW5lIERFRkFVTFRfU1RSSURFICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfV0QgICAgICAgICAgICAgICAgICAxMjgwCisjZGVmaW5lIERFRkFVTFRfSFQgICAgICAgICAgICAgICAgICA3MjAKKyNkZWZpbmUgREVGQVVMVF9QU05SX0VOQUJMRSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NRV9TUEVFRCAgICAgICAgICAgIDEwMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRCAgICAgMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JDX01PREUgICAgICAgICAgICAgSVZFX1JDX1NUT1JBR0UKKyNkZWZpbmUgREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgIDYwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9JX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0lfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9QX1FQICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIERFRkFVTFRfUF9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9CX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0JfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9BSVIgICAgICAgICAgICAgICAgIElWRV9BSVJfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfQUlSX1JFRlJFU0hfUEVSSU9EICAzMAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1ggICAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19ZICAgICAgICAgIDQ4CisjZGVmaW5lIERFRkFVTFRfSV9JTlRFUlZBTCAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0lEUl9JTlRFUlZBTCAgICAgICAgMTAwMAorI2RlZmluZSBERUZBVUxUX0JfRlJBTUVTICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUwgMAorI2RlZmluZSBERUZBVUxUX0hQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX1FQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0k0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0VQUk9GSUxFICAgICAgICAgICAgSVZfUFJPRklMRV9CQVNFCisjZGVmaW5lIERFRkFVTFRfRU5UUk9QWV9NT0RFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfTU9ERSAgICAgICAgICBJVkVfU0xJQ0VfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfUEFSQU0gICAgICAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9BUkNIICAgICAgICAgICAgICAgIEFSQ0hfQVJNX0E5UQorI2RlZmluZSBERUZBVUxUX1NPQyAgICAgICAgICAgICAgICAgU09DX0dFTkVSSUMKKyNkZWZpbmUgREVGQVVMVF9JTlRSQTR4NCAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RSTEVOR1RIICAgICAgICAgICAgICAgICAgIDUwMAorI2RlZmluZSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBICAgMAorCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIEFMSUdOMTYoeCkgKCgoKHgpICsgMTUpID4+IDQpIDw8IDQpCisjZGVmaW5lIEFMSUdOMTI4KHgpICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKKyNkZWZpbmUgQUxJR040MDk2KHgpICgoKCh4KSArIDQwOTUpID4+IDEyKSA8PCAxMikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNkZWZpbmUgaXZlX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmVfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKK3N0cnVjdCBDMlNvZnRBdmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QXZjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuYygpOworCitwcml2YXRlOgorICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CisgICAgICAgIGludDMyX3QgbUZsYWdzOworICAgIH0gSW5wdXRCdWZmZXJJbmZvOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIGludDMyX3QgbVN0cmlkZTsKKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgSVZfUFJPRklMRV9UIG1BVkNFbmNQcm9maWxlIF9fdW51c2VkOworICAgIFdPUkQzMiAgIG1BVkNFbmNMZXZlbDsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisKKyAgICBib29sICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgbVNhd091dHB1dEVPUzsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCAgICAgbUludHJhNHg0OworICAgIGJvb2wgICAgIG1FbmFibGVGYXN0U2FkOworICAgIGJvb2wgICAgIG1FbmFibGVBbHRSZWY7CisgICAgYm9vbCAgICAgbVJlY29uRW5hYmxlOworICAgIGJvb2wgICAgIG1QU05SRW5hYmxlOworICAgIGJvb2wgICAgIG1FbnRyb3B5TW9kZTsKKyAgICBib29sICAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisgICAgSVZFX1NQRUVEX0NPTkZJRyAgICAgbUVuY1NwZWVkOworCisgICAgaXZfb2JqX3QgKm1Db2RlY0N0eDsgICAgICAgICAvLyBDb2RlYyBjb250ZXh0CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsgICAvLyBNZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOyAgICAgICAvLyBOdW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IGNvZGVjCisgICAgc2l6ZV90IG1OdW1Db3JlczsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgdXNlZCBieSB0aGUgY29kZWMKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBVV09SRDMyIG1CZnJhbWVzOworICAgIElWX0FSQ0hfVCBtQXJjaDsKKyAgICBJVkVfU0xJQ0VfTU9ERV9UIG1TbGljZU1vZGU7CisgICAgVVdPUkQzMiBtU2xpY2VQYXJhbTsKKyAgICBib29sIG1IYWxmUGVsRW5hYmxlOworICAgIFVXT1JEMzIgbUlJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1EaXNhYmxlRGVibGtMZXZlbDsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IG1CdWZmZXJzOworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICB2b2lkIGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UICBlX2ZyYW1lX3R5cGUpOworICAgIGMyX3N0YXR1c190IHNldFFwKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREaW1lbnNpb25zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRJcGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRCaXRSYXRlKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0QWlyUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TWVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRHb3BQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRQcm9maWxlUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RGVibG9ja1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFZidlBhcmFtcygpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QXZjRW5jKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX2lucHV0IgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJ5dXYiCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggICAgIi9zZGNhcmQvbWVkaWEvYXZjZV9vdXRwdXQiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAgICAgImgyNjQiCisKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCxcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE0NDRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTI5IEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlQzJDb21wb25lbnQuY3BwIiwKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICAgICAgImxpYmxvZyIsICAgIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLCAvLyBmb3IgSW1hZ2VDb3B5CisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIE11dGV4ZWQKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5IGFzIGl0cyBzdGFiaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLCAvLyBmb3IgSW1hZ2VDb3B5CisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIENvbG9yVXRpbHMgYW5kIE1JTUUKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGYxZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMyQ29tcG9uZW50IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwb3BfZnJvbnQoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHN0ZDo6bW92ZShtUXVldWUuZnJvbnQoKS53b3JrKTsKKyAgICBtUXVldWUucG9wX2Zyb250KCk7CisgICAgcmV0dXJuIHdvcms7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgc3RkOjptb3ZlKHdvcmspLCBOT19EUkFJTiB9KTsKK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjplbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmVtcHR5KCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6Y2xlYXIoKSB7CisgICAgbVF1ZXVlLmNsZWFyKCk7Cit9CisKK3VpbnQzMl90IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmRyYWluTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmZyb250KCkuZHJhaW5Nb2RlOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6Om1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgbnVsbHB0ciwgZHJhaW5Nb2RlIH0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OldvcmtIYW5kbGVyKCkgOiBtUnVubmluZyhmYWxzZSkge30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeikgeworICAgIG1UaGl6ID0gdGhpejsKK30KKworc3RhdGljIHZvaWQgUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgKmVyciA9IG51bGxwdHIpIHsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCAqZXJyKTsKKyAgICB9CisgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiB0aGl6ID0gbVRoaXoubG9jaygpOworICAgIGlmICghdGhpeikgeworICAgICAgICBBTE9HRCgiY29tcG9uZW50IG5vdCB5ZXQgc2V0OyBtc2cgPSAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgICAgIGlmIChtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UHJvY2VzczogeworICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXotPnByb2Nlc3NRdWV1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZXNzLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgcHJvY2VzcyBtZXNzYWdlIGFzIHdlJ3JlIG5vdCBydW5uaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0SW5pdDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vbkluaXQoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RvcDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vblN0b3AoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVzZXQ6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVzZXQoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2U6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVsZWFzZSgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIG1zZzogJWQiLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQ6OkJsb2NraW5nQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBCbG9ja2luZ0Jsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBiYXNlKTogbUJhc2V7YmFzZX0ge30KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldExvY2FsSWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldEFsbG9jYXRvcklkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoQ2lyY3VsYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1CYXNlOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IER1bW15UmVhZFZpZXcgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgRHVtbXlSZWFkVmlldygpIDogQzJSZWFkVmlldyhDMl9OT19JTklUKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1NpbXBsZUMyQ29tcG9uZW50OjpTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikKKyAgICA6IG1EdW1teVJlYWRWaWV3KER1bW15UmVhZFZpZXcoKSksCisgICAgICBtSW50ZihpbnRmKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbUhhbmRsZXIobmV3IFdvcmtIYW5kbGVyKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZShpbnRmLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfVklERU8pOworfQorCitTaW1wbGVDMkNvbXBvbmVudDo6flNpbXBsZUMyQ29tcG9uZW50KCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAodm9pZCltTG9vcGVyLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUhhbmRsZXItPnNldENvbXBvbmVudChzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1heUJsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUtPm1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIC8vIFRPRE86IHdhaXQgZm9yIGxpc3RlbmVyIGNoYW5nZSB0byBoYXZlIHRha2VuIHBsYWNlIGJlZm9yZSByZXR1cm5pbmcKKyAgICAvLyAoZS5nLiBpZiB0aGVyZSBpcyBhbiBvbmdvaW5nIGxpc3RlbmVyIGNhbGxiYWNrKQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKiBjb25zdCBpdGVtcykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBxdWV1ZVdhc0VtcHR5ID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWVXYXNFbXB0eSA9IHF1ZXVlLT5lbXB0eSgpOworICAgICAgICB3aGlsZSAoIWl0ZW1zLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+cHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtcy0+ZnJvbnQoKSkpOworICAgICAgICAgICAgaXRlbXMtPnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChxdWV1ZVdhc0VtcHR5KSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UHJvY2VzcywgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50Ojphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICAodm9pZClpdGVtczsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmZsdXNoX3NtKAorICAgICAgICBmbHVzaF9tb2RlX3QgZmx1c2hNb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKWZsdXNoTW9kZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5pbmNHZW5lcmF0aW9uKCk7CisgICAgICAgIC8vIFRPRE86IHF1ZXVlLT5zcGxpY2VkQnkoZmx1c2hlZFdvcmssIGZsdXNoZWRXb3JrLT5lbmQoKSk7CisgICAgICAgIHdoaWxlICghcXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICB3aGlsZSAoIXBlbmRpbmctPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBlbmRpbmctPmJlZ2luKCktPnNlY29uZCkpOworICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UocGVuZGluZy0+YmVnaW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpkcmFpbl9uYihkcmFpbl9tb2RlX3QgZHJhaW5Nb2RlKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHF1ZXVlLT5tYXJrRHJhaW4oZHJhaW5Nb2RlKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgIH0KKyAgICBib29sIG5lZWRzSW5pdCA9IChzdGF0ZS0+bVN0YXRlID09IFVOSU5JVElBTElaRUQpOworICAgIHN0YXRlLnVubG9jaygpOworICAgIGlmIChuZWVkc0luaXQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdEluaXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdGFydCwgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICBzdGF0ZS5sb2NrKCk7CisgICAgc3RhdGUtPm1TdGF0ZSA9IFJVTk5JTkc7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBBTE9HVigic3RvcCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBwZW5kaW5nLT5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdG9wLCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIGludDMyX3QgZXJyOworICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBBTE9HVigicmVzZXQiKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBzdGF0ZS0+bVN0YXRlID0gVU5JTklUSUFMSVpFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlc2V0LCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoInJlbGVhc2UiKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZWxlYXNlLCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBTaW1wbGVDMkNvbXBvbmVudDo6aW50ZigpIHsKKyAgICByZXR1cm4gbUludGY7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gdmVjKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiByZXQ7CisgICAgcmV0LnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIHJldHVybiByZXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpmaW5pc2goCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrID0gc3RkOjptb3ZlKHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcGVuZGluZy0+ZXJhc2UoZnJhbWVJbmRleCk7CisgICAgfQorICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyBwZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmNsb25lQW5kU2VuZCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICBpZiAoY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBmcmFtZUluZGV4KSB7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gY3VycmVudFdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpLT5pbnB1dC5vcmRpbmFsOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigiY2xvbmVkIGFuZCBzZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OnByb2Nlc3NRdWV1ZSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHVpbnQ2NF90IGdlbmVyYXRpb247CisgICAgaW50MzJfdCBkcmFpbk1vZGU7CisgICAgYm9vbCBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIGJvb2wgaGFzUXVldWVkV29yayA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGlvbiA9IHF1ZXVlLT5nZW5lcmF0aW9uKCk7CisgICAgICAgIGRyYWluTW9kZSA9IHF1ZXVlLT5kcmFpbk1vZGUoKTsKKyAgICAgICAgaXNGbHVzaFBlbmRpbmcgPSBxdWV1ZS0+cG9wUGVuZGluZ0ZsdXNoKCk7CisgICAgICAgIHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgIGhhc1F1ZXVlZFdvcmsgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgfQorICAgIGlmIChpc0ZsdXNoUGVuZGluZykgeworICAgICAgICBBTE9HVigicHJvY2Vzc2luZyBwZW5kaW5nIGZsdXNoIik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZsdXNoIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbU91dHB1dEJsb2NrUG9vbCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3QgdXNlIHF1ZXJ5X3ZiCisgICAgICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb3V0cHV0Rm9ybWF0KDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgeyAmb3V0cHV0Rm9ybWF0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInF1ZXJ5IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBpZiAocGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCAqb3V0cHV0UG9vbHMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9vbHMgJiYgb3V0cHV0UG9vbHMtPmZsZXhDb3VudCgpID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbElkID0gb3V0cHV0UG9vbHMtPm0udmFsdWVzWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgICAgICAgICBlcnIgPSBHZXRDb2RlYzJCbG9ja1Bvb2wocG9vbElkLCBzaGFyZWRfZnJvbV90aGlzKCksICZibG9ja1Bvb2wpOworICAgICAgICAgICAgQUxPR0QoIlVzaW5nIG91dHB1dCBibG9jayBwb29sIHdpdGggcG9vbElEICVsbHUgPT4gZ290ICVsbHUgLSAlZCIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJsb2NrUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QmxvY2tpbmdCbG9ja1Bvb2w+KGJsb2NrUG9vbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9KCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghd29yaykgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBkcmFpbihkcmFpbk1vZGUsIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB1cGRhdGVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW06IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdXBkYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmKCktPmNvbmZpZ192Yih1cGRhdGVzLCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiYXBwbGllZCAlenUgY29uZmlnVXBkYXRlcyA9PiAlcyAoJWQpIiwgdXBkYXRlcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic3RhcnQgcHJvY2Vzc2luZyBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgLy8gSWYgaW5wdXQgYnVmZmVyIGxpc3QgaXMgbm90IGVtcHR5LCBpdCBtZWFucyB3ZSBoYXZlIHNvbWUgaW5wdXQgdG8gcHJvY2VzcyBvbi4KKyAgICAvLyBIb3dldmVyLCBpbnB1dCBjb3VsZCBiZSBhIG51bGwgYnVmZmVyLiBJbiBzdWNoIGNhc2UsIGNsZWFyIHRoZSBidWZmZXIgbGlzdAorICAgIC8vIGJlZm9yZSBtYWtpbmcgY2FsbCB0byBwcm9jZXNzKCkuCisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkgJiYgIXdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pIHsKKyAgICAgICAgQUxPR0QoIkVuY291bnRlcmVkIG51bGwgaW5wdXQgYnVmZmVyLiBDbGVhcmluZyB0aGUgaW5wdXQgYnVmZmVyIik7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisgICAgcHJvY2Vzcyh3b3JrLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICBBTE9HVigicHJvY2Vzc2VkIGZyYW1lICMlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmdlbmVyYXRpb24oKSAhPSBnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBBTE9HRCgid29yayBmb3JtIG9sZCBnZW5lcmF0aW9uOiB3YXMgJSIgUFJJdTY0ICIgbm93ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPmdlbmVyYXRpb24oKSwgZ2VuZXJhdGlvbik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBxdWV1ZS51bmxvY2soKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHRoaXMgd29yayIpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlIHBlbmRpbmcgd29yayIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHVuZXhwZWN0ZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkID0gc3RkOjptb3ZlKHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBlbmRpbmctPmluc2VydCh7IGZyYW1lSW5kZXgsIHN0ZDo6bW92ZSh3b3JrKSB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5leHBlY3RlZCkgeworICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgcGVuZGluZyB3b3JrIik7CisgICAgICAgICAgICB1bmV4cGVjdGVkLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWModW5leHBlY3RlZCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICByZXR1cm4gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKG9mZnNldCwgc2l6ZSwgOjpDMkZlbmNlKCkpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgICByZXR1cm4gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssIGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jay0+c2hhcmUoY3JvcCwgOjpDMkZlbmNlKCkpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMySW50ZXJmYWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyB1c2UgTWVkaWFEZWZzIGhlcmUgdnMuIE1lZGlhQ29kZWNDb25zdGFudHMgYXMgdGhpcyBpcyBub3QgTWVkaWFDb2RlYyBzcGVjaWZpYy9kZXBlbmRlbnQKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBTaW1wbGVJbnRlcmZhY2UgKi8KKworU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpCYXNlUGFyYW1zKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyU3RyaW5nIG5hbWUsCisgICAgICAgIEMyQ29tcG9uZW50OjpraW5kX3Qga2luZCwKKyAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlcykKKyAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgeworICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1OYW1lLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPihuYW1lLmNfc3RyKCkpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgaWYgKGFsaWFzZXMuc2l6ZSgpKSB7CisgICAgICAgIEMyU3RyaW5nIGpvaW5lZDsKKyAgICAgICAgZm9yIChjb25zdCBDMlN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICBpZiAoam9pbmVkLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgam9pbmVkICs9ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpvaW5lZCArPSBhbGlhczsKKyAgICAgICAgfQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFsaWFzZXMsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BTElBU0VTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nPihqb2luZWQuY19zdHIoKSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1LaW5kLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRLaW5kU2V0dGluZyhraW5kKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Eb21haW4sIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9ET01BSU4pCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyhkb21haW4pKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2ltcGxlIGludGVyZmFjZXMgaGF2ZSBzaW5nbGUgc3RyZWFtcworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjppbnB1dCgxKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dCgxKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNldCB1cCBidWZmZXIgZm9ybWF0cyBhbmQgYWxsb2NhdG9ycworCisgICAgLy8gZGVmYXVsdCB0byBsaW5lYXIgYnVmZmVycyBhbmQgbm8gbWVkaWEgdHlwZQorICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICBDMlN0cmluZyByYXdNZWRpYVR5cGU7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCBjb2RlZEJ1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBjb2RlZEFsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGNvZGVkUG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKworICAgIHN3aXRjaCAoZG9tYWluKSB7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOgorICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRlZmluZSByYXcgaW1hZ2U/IFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGltZXN0YW1wIGhhbmRsaW5nCisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpHUkFQSElDOworICAgICAgICAgICAgcmF3TWVkaWFUeXBlID0gTUVESUFfTUlNRVRZUEVfVklERU9fUkFXOworICAgICAgICAgICAgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOgorICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgICAgICAgICAgcmF3TWVkaWFUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXOworICAgICAgICAgICAgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYm9vbCBpc0VuY29kZXIgPSBraW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisKKyAgICAvLyBoYW5kbGUgcmF3IGRlY29kZXJzCisgICAgaWYgKG1lZGlhVHlwZSA9PSByYXdNZWRpYVR5cGUpIHsKKyAgICAgICAgY29kZWRCdWZmZXJUeXBlID0gcmF3QnVmZmVyVHlwZTsKKyAgICAgICAgY29kZWRBbGxvY2F0b3IgPSByYXdBbGxvY2F0b3I7CisgICAgICAgIGNvZGVkUG9vbElkID0gcmF3UG9vbElkOworICAgIH0KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIGlzRW5jb2RlciA/IHJhd0J1ZmZlclR5cGUgOiBjb2RlZEJ1ZmZlclR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgaXNFbmNvZGVyID8gcmF3TWVkaWFUeXBlIDogbWVkaWFUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIGlzRW5jb2RlciA/IGNvZGVkQnVmZmVyVHlwZSA6IHJhd0J1ZmZlclR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgaXNFbmNvZGVyID8gbWVkaWFUeXBlIDogcmF3TWVkaWFUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gcmF3QWxsb2NhdG9yIDogY29kZWRBbGxvY2F0b3IgfTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZEFsbG9jYXRvciA6IHJhd0FsbG9jYXRvciB9OworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZHNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkUG9vbElkIDogcmF3UG9vbElkIH07CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9JTlBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZChpbnB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUlucHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUlucHV0QWxsb2NhdG9ycywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfT1VUUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFBvb2xJZHMsIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dFBvb2xJZHMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBhZGQgc3RhdGVsZXNzIHBhcmFtcworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1BBUkFNX0lORElDRVMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvKiBUT0RPCisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ3VycmVudFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9DVVJSRU5UX1dPUkspCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQ3VycmVudFdvcmtUdW5pbmcoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJDdXJyZW50V29ya1R1bmluZz46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfSU5QVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dCgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX09VVFBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dCgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyT3V0T2ZNZW1vcnlUdW5pbmc+IG1PdXRPZk1lbW9yeTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjppbnB1dD4gbUlucHV0Q29uZmlnQ291bnRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb25maWdDb3VudGVyVHVuaW5nPiBtRGlyZWN0Q29uZmlnQ291bnRlcjsKKworICAgICovCit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub0lucHV0TGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vT3V0cHV0TGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUGlwZWxpbmVMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9Qcml2YXRlQnVmZmVycygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZUFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50LCBDMl9QQVJBTUtFWV9NQVhfUFJJVkFURV9CVUZGRVJfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlUG9vbElkcywgQzJfUEFSQU1LRVlfUFJJVkFURV9CTE9DS19QT09MUykKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub0lucHV0UmVmZXJlbmNlcygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vT3V0cHV0UmVmZXJlbmNlcygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vVGltZVN0cmV0Y2goKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVRpbWVTdHJldGNoLCBDMl9QQVJBTUtFWV9USU1FX1NUUkVUQ0gpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmcoMS5mKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKworLyoKKyAgICBDbGllbnRzIG5lZWQgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgYmFzZSBwYXJhbXMgZHVlIHRvIGN1c3RvbSBkZXBlbmRlbmN5LgorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpRmVhdHVyZXNTZXR0aW5nPiBtQXBpRmVhdHVyZXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmc+IG1BdHRyaWI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dD4gbVN1Z2dlc3RlZE91dHB1dEJ1ZmZlckNvdW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisKKyovCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMjlhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisjZGVmaW5lIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKyAgICB2aXJ0dWFsIH5TaW1wbGVDMkNvbXBvbmVudCgpOworCisgICAgLy8gQzJDb21wb25lbnQKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgLy8gZm9yIGhhbmRsZXIKKyAgICBib29sIHByb2Nlc3NRdWV1ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZyBzZXQKKyAgICAgKiBpbiB0aGUgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBzdGFydCgpLCBidXQgb25seSBhdCB0aGUgZmlyc3QgaW52b2NhdGlvbiBvcgorICAgICAqIGFmdGVyIHJlc2V0KCkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkluaXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvblN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHdvcmsgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSAgIHdvcmsgICAgdGhlIHdvcmsgdG8gcHJvY2VzcworICAgICAqIFxwYXJhbVtpbl0gICAgICAgcG9vbCAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLyoqCisgICAgICogRHJhaW4gdGhlIGNvbXBvbmVudCBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBkcmFpbk1vZGUgICBtb2RlIG9mIGRyYWluLgorICAgICAqIFxwYXJhbVtpbl0gICBwb29sICAgICAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICBUaGUgY29tcG9uZW50IGhhcyBkcmFpbmVkIGFsbCBwZW5kaW5nIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLgorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgICAgICBVbnN1cHBvcnRlZCBtb2RlIChlLmcuIERSQUlOX0NIQUlOKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvLyBmb3IgZGVyaXZlZCBjbGFzc2VzCisgICAgLyoqCisgICAgICogRmluaXNoIHBlbmRpbmcgd29yay4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHBlbmRpbmcgd29yayBhY2NvcmRpbmcgdG8gfGZyYW1lSW5kZXh8IGFuZAorICAgICAqIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8IG11c3QgYmUKKyAgICAgKiAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSBwZW5kaW5nIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBmaW5pc2godWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhbmQgc2VuZCB0aGUgd29yayBiYWNrIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYW5kIGNsb25lIHRoZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhY2NvcmRpbmcKKyAgICAgKiB0byB8ZnJhbWVJbmRleHwgYW5kIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8CisgICAgICogbXVzdCBiZSAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGN1cnJlbnRXb3JrICAgdGhlIGN1cnJlbnQgd29yayB1bmRlciBwcm9jZXNzaW5nCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmY3JvcCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OworCisgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworCisgICAgY2xhc3MgV29ya0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBrV2hhdFByb2Nlc3MsCisgICAgICAgICAgICBrV2hhdEluaXQsCisgICAgICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICAgICAga1doYXRTdG9wLAorICAgICAgICAgICAga1doYXRSZXNldCwKKyAgICAgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAgfTsKKworICAgICAgICBXb3JrSGFuZGxlcigpOworICAgICAgICB+V29ya0hhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gbVRoaXo7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgICBTVE9QUEVELAorICAgICAgICBSVU5OSU5HLAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXhlY1N0YXRlIHsKKyAgICAgICAgRXhlY1N0YXRlKCkgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkge30KKworICAgICAgICBpbnQgbVN0YXRlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgfTsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT4gbUV4ZWNTdGF0ZTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8V29ya0hhbmRsZXI+IG1IYW5kbGVyOworCisgICAgY2xhc3MgV29ya1F1ZXVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGlubGluZSBXb3JrUXVldWUoKSA6IG1GbHVzaChmYWxzZSksIG1HZW5lcmF0aW9uKDB1bCkge30KKworICAgICAgICBpbmxpbmUgdWludDY0X3QgZ2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1HZW5lcmF0aW9uOyB9CisgICAgICAgIGlubGluZSB2b2lkIGluY0dlbmVyYXRpb24oKSB7ICsrbUdlbmVyYXRpb247IG1GbHVzaCA9IHRydWU7IH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBwb3BfZnJvbnQoKTsKKyAgICAgICAgdm9pZCBwdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayk7CisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbWFya0RyYWluKHVpbnQzMl90IGRyYWluTW9kZSk7CisgICAgICAgIGlubGluZSBib29sIHBvcFBlbmRpbmdGbHVzaCgpIHsKKyAgICAgICAgICAgIGJvb2wgZmx1c2ggPSBtRmx1c2g7CisgICAgICAgICAgICBtRmx1c2ggPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmbHVzaDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZTsKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1GbHVzaDsKKyAgICAgICAgdWludDY0X3QgbUdlbmVyYXRpb247CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVF1ZXVlOworICAgIH07CisgICAgTXV0ZXhlZDxXb3JrUXVldWU+IG1Xb3JrUXVldWU7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IFBlbmRpbmdXb3JrOworICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+IG1QZW5kaW5nV29yazsKKworICAgIGNsYXNzIEJsb2NraW5nQmxvY2tQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCbG9ja2luZ0Jsb2NrUG9vbD4gbU91dHB1dEJsb2NrUG9vbDsKKworICAgIFNpbXBsZUMyQ29tcG9uZW50KCkgPSBkZWxldGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1MWQzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV3JhcCBhIGNvbW1vbiBpbnRlcmZhY2Ugb2JqZWN0IChzdWNoIGFzIENvZGVjMkNsaWVudDo6SW50ZXJmYWNlLCBvciBDMkludGVyZmFjZUhlbHBlciBpbnRvCisgKiBhIEMyQ29tcG9uZW50SW50ZXJmYWNlLgorICoKKyAqIFxwYXJhbSBUIGNvbW1vbiBpbnRlcmZhY2UgdHlwZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBTaW1wbGVDMkludGVyZmFjZShjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUPiAmaW1wbCkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtSWQoaWQpLAorICAgICAgICAgIG1JbXBsKGltcGwpIHsKKyAgICB9CisKKyAgICB+U2ltcGxlQzJJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50SW50ZXJmYWNlCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1OYW1lOyB9CisgICAgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUlkOyB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgbWF5QmxvY2ssIGhlYXBQYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y29uZmlnKHBhcmFtcywgbWF5QmxvY2ssIGZhaWx1cmVzKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBjb25zdCBjMl9ub2RlX2lkX3QgbUlkOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUPiBtSW1wbDsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzc2VzIGZvciBjb21tb24gaW50ZXJmYWNlcy4KKyAqLwordGVtcGxhdGU8PgorY2xhc3MgU2ltcGxlQzJJbnRlcmZhY2U8dm9pZD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIEJhc2UgQ29kZWMgMi4wIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGFsbCBjb21wb25lbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCYXNlUGFyYW1zIDogQzJJbnRlcmZhY2VIZWxwZXIgeworICAgICAgICBleHBsaWNpdCBCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlciwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpraW5kX3Qga2luZCwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICAgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlcyA9IHN0ZDo6dmVjdG9yPEMyU3RyaW5nPigpKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gaW5wdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCBhbmQgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIG91dHB1dCBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCBhbmQgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dC4KKyAgICAgICAgdm9pZCBub091dHB1dExhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gcGlwZWxpbmUgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZyBhbmQgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLgorICAgICAgICB2b2lkIG5vUGlwZWxpbmVMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIG5lZWQgZm9yIHByaXZhdGUgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nLCBDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nIGFuZAorICAgICAgICAvLy8gQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZy4KKyAgICAgICAgdm9pZCBub1ByaXZhdGVCdWZmZXJzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBpbnB1dCBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0IGFuZAorICAgICAgICAvLy8gQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQuCisgICAgICAgIHZvaWQgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBob2xkcyBubyByZWZlcmVuY2VzIHRvIG91dHB1dCBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dC4KKyAgICAgICAgdm9pZCBub091dHB1dFJlZmVyZW5jZXMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCBzdHJldGNoIHRpbWUuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nLgorICAgICAgICB2b2lkIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpRmVhdHVyZXNTZXR0aW5nPiBtQXBpRmVhdHVyZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1MZXZlbFNldHRpbmc+IG1QbGF0Zm9ybUxldmVsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZz4gbVBsYXRmb3JtRmVhdHVyZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+IG1OYW1lOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4gbUFsaWFzZXM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEtpbmRTZXR0aW5nPiBtS2luZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50RG9tYWluU2V0dGluZz4gbURvbWFpbjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmc+IG1BdHRyaWI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nPiBtVGltZVN0cmV0Y2g7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQ+IG1SZXF1ZXN0ZWRJbnB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RlZE91dHB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nPiBtUmVxdWVzdGVkUGlwZWxpbmVEZWxheTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0PiBtQWN0dWFsSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1BY3R1YWxPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZz4gbUFjdHVhbFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dD4gbU1heElucHV0UmVmZXJlbmNlQWdlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dD4gbU1heE91dHB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dD4gbU1heE91dHB1dFJlZmVyZW5jZUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc+IG1NYXhQcml2YXRlQnVmZmVyQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjppbnB1dD4gbUlucHV0U3RyZWFtQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0PiBtT3V0cHV0U3RyZWFtQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gbVN1YnNjcmliZWRQYXJhbUluZGljZXM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dD4gbVN1Z2dlc3RlZE91dHB1dEJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkN1cnJlbnRXb3JrVHVuaW5nPiBtQ3VycmVudFdvcmtPcmRpbmFsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+IG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD4gbUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+IG1JbnB1dEFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZz4gbVByaXZhdGVBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0UG9vbElkczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc+IG1Qcml2YXRlUG9vbElkczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyT3V0T2ZNZW1vcnlUdW5pbmc+IG1PdXRPZk1lbW9yeTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb25maWdDb3VudGVyVHVuaW5nPiBtRGlyZWN0Q29uZmlnQ291bnRlcjsKKyAgICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3VzaW5nIFNpbXBsZUludGVyZmFjZSA9IFNpbXBsZUMySW50ZXJmYWNlPFQ+OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3QgY2hhciAqc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpICsgMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcmV0ID0gVDo6QWxsb2NTaGFyZWQobGVuLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CitzdGQ6OnNoYXJlZF9wdHI8VD4gQWxsb2NTaGFyZWRTdHJpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKHN0ci5sZW5ndGgoKSArIDEsIGFyZ3MuLi4pOworICAgIHN0cmNweShyZXQtPm0udmFsdWUsIHN0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTZXR0ZXIgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIHR5cGU7CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWUudi5mbGV4Q291bnQoKTsgKytpeCkgeworICAgICAgICAgICAgcmVzLnBsdXMobWUuRihtZS52Lm0udmFsdWVzW2l4XSkudmFsaWRhdGVQb3NzaWJsZShtZS52Lm0udmFsdWVzW2l4XSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmb2xkLAorICAgICAgICAgICAgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnZhbHVlKS5zdXBwb3J0c05vdyhtZS52LnZhbHVlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSBvbGQudi52YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNjg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM2IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjb2RlYzJwbGF5IiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiY29kZWMyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoeyBibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSkgfSkge30KK307CisKK2NsYXNzIExpc3RlbmVyOworCitjbGFzcyBTaW1wbGVQbGF5ZXIgeworcHVibGljOgorICAgIFNpbXBsZVBsYXllcigpOworICAgIH5TaW1wbGVQbGF5ZXIoKTsKKworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uVHJpcHBlZChzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpOworICAgIHZvaWQgb25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSk7CisKKyAgICB2b2lkIHBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgICBzcDxJUHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzdGQ6OmF0b21pY19pbnQgbUxpbmVhclBvb2xJZDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jSW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6bXV0ZXggbVByb2Nlc3NlZExvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVByb2Nlc3NlZENvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Qcm9jZXNzZWRXb3JrOworCisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1Db250cm9sOworfTsKKworY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaXN0ZW5lcihTaW1wbGVQbGF5ZXIgKnRoaXopIDogbVRoaXModGhpeikge30KKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25Xb3JrRG9uZShjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vblRyaXBwZWQoY29tcG9uZW50LCBzZXR0aW5nUmVzdWx0KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbkVycm9yKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU2ltcGxlUGxheWVyICogY29uc3QgbVRoaXM7Cit9OworCisKK1NpbXBsZVBsYXllcjo6U2ltcGxlUGxheWVyKCkKKyAgICA6IG1MaXN0ZW5lcihuZXcgTGlzdGVuZXIodGhpcykpLAorICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IER1bW15UHJvZHVjZXJMaXN0ZW5lciksCisgICAgICBtTGluZWFyUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICBtQ29tcG9zZXJDbGllbnQobmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCkgeworICAgIENIRUNLX0VRKG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmbUFsbG9jSW9uKSwgQzJfT0spOworICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspOworCisgICAgbUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCisgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKKyAgICAgICAgICAgIDEyODAsCisgICAgICAgICAgICA4MDAsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpOworICAgICAgICAgICAgLy9QSVhFTF9GT1JNQVRfUkdCXzU2NSk7CisKKyAgICBDSEVDSyhtQ29udHJvbCAhPSBudWxscHRyKTsKKyAgICBDSEVDSyhtQ29udHJvbC0+aXNWYWxpZCgpKTsKKworICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgLnNldExheWVyKG1Db250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgLnNob3cobUNvbnRyb2wpCisgICAgICAgICAgICAuYXBwbHkoKTsKKworICAgIG1TdXJmYWNlID0gbUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICBDSEVDSyhtU3VyZmFjZSAhPSBudWxscHRyKTsKKyAgICBtU3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUsIG1Qcm9kdWNlckxpc3RlbmVyKTsKK30KKworU2ltcGxlUGxheWVyOjp+U2ltcGxlUGxheWVyKCkgeworICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUiKTsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgIGZvciAoYXV0byAmIGl0ZW0gOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgbVByb2Nlc3NlZFdvcmsucHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtKSk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ubm90aWZ5X2FsbCgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25UcmlwcGVkKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgc2V0dGluZ1Jlc3VsdDsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgZXJyb3JDb2RlOworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6OnBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6cGxheSIpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgKHZvaWQpIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2UtPmdldEZvcm1hdCgpLCAmZm9ybWF0KTsKKworICAgIHNwPEFCdWZmZXI+IGNzZDAsIGNzZDE7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZjc2QwKTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpOworCisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvdXJjZSByZXR1cm5lZCBlcnJvciAlZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICh2b2lkKXN0b3JlLT5jcmVhdGVDb21wb25lbnQoImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCAmY29tcG9uZW50KTsKKworICAgICh2b2lkKWNvbXBvbmVudC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29scyA9CisgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyAodWludDY0X3QpQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgfSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdDsKKyAgICAodm9pZCljb21wb25lbnQtPmludGYoKS0+Y29uZmlnX3ZiKHtwb29scy5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZyZXN1bHQpOworICAgIGNvbXBvbmVudC0+c3RhcnQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgIH0KKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgcnVubmluZyh0cnVlKTsKKyAgICBzdGQ6OnRocmVhZCBzdXJmYWNlVGhyZWFkKFt0aGlzLCAmcnVubmluZ10oKSB7CisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZpZ2JwID0gbVN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NlZENvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVByb2Nlc3NlZFdvcmsuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVByb2Nlc3NlZFdvcmsucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKKyAgICAgICAgICAgIEFMT0dWKCJSZW5kZXI6IEZyYW1lICMlbGxkIiwgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrID0gb3V0cHV0LT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0gVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG5ldyBHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCkpKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCAqIDEwMDBsbCkucGVla2xsKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QoYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHFibzsKKyAgICAgICAgICAgICAgICBlcnIgPSBpZ2JwLT5xdWV1ZUJ1ZmZlcihzbG90LCBxYmksICZxYm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworCisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInJlbmRlciBsb29wIGZpbmlzaGVkIik7CisgICAgfSk7CisKKyAgICBsb25nIG51bUZyYW1lcyA9IDA7CisgICAgbUxpbmVhclBvb2wucmVzZXQobmV3IEMyUG9vbGVkQmxvY2tQb29sKG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgICAgIHZvaWQgKmRhdGEgPSBudWxscHRyOworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IDB1OworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgaWYgKGNzZDAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMDsKKyAgICAgICAgICAgIGNzZDAgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNzZDEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMTsKKyAgICAgICAgICAgIGNzZDEgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5yZWFkKCZidWZmZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcCkpOworCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3NkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBjc2QtPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgd2hpbGUgKCF3b3JrKSB7CisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBudW1GcmFtZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBtTGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZibG9jayk7CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWxkIHNpemUgPSAlenUiLCBudW1GcmFtZXMsIHNpemUpOworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgY29tcG9uZW50LT5xdWV1ZV9uYigmaXRlbXMpOworCisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgICsrbnVtRnJhbWVzOworICAgIH0KKyAgICBBTE9HVigibWFpbiBsb29wIGZpbmlzaGVkIik7CisgICAgc291cmNlLT5zdG9wKCk7CisgICAgcnVubmluZy5zdG9yZShmYWxzZSk7CisgICAgc3VyZmFjZVRocmVhZC5qb2luKCk7CisKKyAgICBjb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICptZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXRfZmlsZW5hbWVdXG4iLCBtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWgoZWxwKVxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIGludCByZXM7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImgiKSkgPj0gMCkgeworICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgU2ltcGxlUGxheWVyIHBsYXllcjsKKworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYyAmJiBlcnIgPT0gT0s7ICsraykgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CisKKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShudWxscHRyIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKGZpbGVuYW1lLCAic2luZToiLCA1KSAmJiBkYXRhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKKyAgICAgICAgc3A8SU1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UpOworCisgICAgICAgIGlmIChleHRyYWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGV4dHJhY3Rvci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV4dHJhY3RvciBkaWQgbm90IHByb3ZpZGUgTUlNRSB0eXBlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGksIDApOworCisgICAgICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFsbG93aW5nIEFWQyBvbmx5IGZvciB0aGUgdGltZSBiZWluZworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vYXZjIiwgOSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIEFWQyB0cmFjayBmb3VuZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFTb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICBpZiAobWVkaWFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwIE5VTEwgdHJhY2sgJXp1LCB0b3RhbCB0cmFja3MgJXp1LlxuIiwgaSwgbnVtVHJhY2tzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBsYXllci5wbGF5KG1lZGlhU291cmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWViNTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYkZMQUMtaGVhZGVycyJdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIxNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcApAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0RlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzI3NjgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIC8vIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdEZsYWNEZWM6OkMyU29mdEZsYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZMQUNEZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0RlYzo6fkMyU29mdEZsYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZXNldCgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIG1GTEFDRGVjb2RlciA9IG51bGxwdHI7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSB7CisgICAgICAgIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgfQorICAgIG1GTEFDRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKKyAgICBpZiAoIW1GTEFDRGVjb2RlcikgeworICAgICAgICBBTE9HRSgiaW5pdERlY29kZXI6IGZhaWxlZCB0byBjcmVhdGUgRkxBQ0RlY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCisvLyAoVE9ETykgYWRkIG11bHRpZnJhbWUgc3VwcG9ydCwgaW4gcGx1Z2luIGFuZCBGTEFDRGVjb2Rlci5jcHAKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIWNvZGVjQ29uZmlnKSB7CisgICAgICAgIEFMT0dWKCJGaXJzdCBmcmFtZSBoYXMgdG8gaW5jbHVkZSBjb25maWd1cmF0aW9uLCBmb3JjaW5nIGNvbmZpZyIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKGlucHV0LCBpblNpemUpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSyAmJiBkZWNvZGVyRXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgcGFyc2VNZXRhRGF0YSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJwcm9jZXNzOiBwYXJzZU1ldGFkYXRhIGlzIEJsb2NraW5nLCBDb250aW51ZSAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0cmVhbUluZm8gPSBtRkxBQ0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSAmJiBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICYmCisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBtSGFzU3RyZWFtSW5mbyA9IHRydWU7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oCisgICAgICAgICAgICAgICAgICAgIDB1LCBtU3RyZWFtSW5mby5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgicHJvY2VzczogZGVjb2RlciBjb25maWd1cmF0aW9uIDogJWQgSHosICVkIGNoYW5uZWxzLCAlZCBzYW1wbGVzLCIKKyAgICAgICAgICAgICAgICAgICIgJWQgYmxvY2sgc2l6ZSIsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlLCBtU3RyZWFtSW5mby5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgIChpbnQpbVN0cmVhbUluZm8udG90YWxfc2FtcGxlcywgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgb3V0cHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihzaG9ydCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBtSGFzU3RyZWFtSW5mbyA/CisgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzYW1wbGVTaXplCisgICAgICAgICAgOiBrTWF4QmxvY2tTaXplICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNhbXBsZVNpemU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBpblNpemUsIHdWaWV3LmRhdGEoKSwgJm91dFNpemUsIG91dHB1dEZsb2F0KTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDkxYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEZsYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhCbG9ja1NpemUgICA9IDQwOTYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUhhc1N0cmVhbUluZm87CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDQ2MDgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6aW5wdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciI7CisKK0MyU29mdEZsYWNFbmM6OkMyU29mdEZsYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMzIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRW5jOjp+QzJTb2Z0RmxhY0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25Jbml0KCkgeworICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX25ldygpOworICAgIGlmICghbUZsYWNTdHJlYW1FbmNvZGVyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICBrSW5CbG9ja1NpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoRkxBQ19faW50MzIpKTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTMyKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2RlbGV0ZShtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTMyKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlc2V0KCkgeworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgbnVsbHB0cik7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpZiAoZXJyICE9IE9LKSBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUpIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCB1bnNpZ25lZCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2FtcGxlU2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGZyYW1lU2l6ZTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBmcmFtZVNpemUsIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyBmcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzYW1wbGVTaXplOworCisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNl90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgaW50IGJpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsIG1Db21wcmVzc2lvbkxldmVsKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF92ZXJpZnkobUZsYWNTdHJlYW1FbmNvZGVyLCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb2sgJj0gRkxBQ19fU1RSRUFNX0VOQ09ERVJfSU5JVF9TVEFUVVNfT0sgPT0KKyAgICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2luaXRfc3RyZWFtKG1GbGFjU3RyZWFtRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrICAgIC8qd3JpdGVfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnNlZWtfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnRlbGxfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKm1ldGFkYXRhX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoaXMgLypjbGllbnRfZGF0YSovKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1CbG9ja1NpemUgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfYmxvY2tzaXplKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisKKyAgICBBTE9HVigiZW5jb2RlciBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCIpOworICAgIHJldHVybiBPSzsKK30KKworRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIEMyU29mdEZsYWNFbmM6OmZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiwKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKSB7CisgICAgcmV0dXJuICgoQzJTb2Z0RmxhY0VuYyopIGNsaWVudF9kYXRhKS0+b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGJ1ZmZlciwgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgc3dpdGNoIChkcmFpbk1vZGUpIHsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIERSQUlOX0NIQUlOOgorICAgICAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzoKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgZmxhZyBpcyBub3QgYmVpbmcgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIFBlbmRpbmdXb3JrIHF1ZXVlIGFzIGFsbCB0aGUKKyAgICAgICAgICAgIC8vIGlucHV0cyBhcmUgYmVpbmcgc2VudCBiYWNrIHdpdGggZW1wdHl3b3JrIG9yIHZhbGlkIGVuY29kZWQgZGF0YQorICAgICAgICAgICAgLy8gbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOworICAgIGlmICghb2spIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjMwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZW5jb2Rlci5oIgorCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUlOICAgICAwCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVCA1CisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYICAgICA4CisKKyNkZWZpbmUgRkxBQ19IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0RmxhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRGbGFjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgY29uZmlndXJlRW5jb2RlcigpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlciwgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgb25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga0luQmxvY2tTaXplID0gMTE1MjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bUNoYW5uZWxzID0gMjsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyKiBtRmxhY1N0cmVhbUVuY29kZXI7CisgICAgRkxBQ19faW50MzIqIG1JbnB1dEJ1ZmZlclBjbTMyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQzMl90IG1Db21wcmVzc2lvbkxldmVsOworICAgIHVpbnQzMl90IG1CbG9ja1NpemU7CisgICAgYm9vbCBtSXNGaXJzdEZyYW1lOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAorICAgIGJvb2wgbUVuY29kZXJXcml0ZURhdGE7CisgICAgc2l6ZV90IG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzOworICAgIHVuc2lnbmVkIG1IZWFkZXJPZmZzZXQ7CisgICAgYm9vbCBtV3JvdGVIZWFkZXI7CisgICAgY2hhciBtSGVhZGVyW0ZMQUNfSEVBREVSX1NJWkVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RmxhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0Y2E3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEc3MTFEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgQUxBVworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyNpZmRlZiBBTEFXCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbyg2NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEc3MTFEZWM6OkMyU29mdEc3MTFEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpIHsKK30KKworQzJTb2Z0RzcxMURlYzo6fkMyU29mdEc3MTFEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uSW5pdCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVsZWFzZSgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaW50IG91dFNpemUgPSBpblNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dHB0ciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQxNl90ICpvdXRwdXRwdHIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKworI2lmZGVmIEFMQVcKKyAgICBEZWNvZGVBTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZWxzZQorICAgIERlY29kZU1MYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbmRpZgorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisjaWZkZWYgQUxBVwordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKKyAgICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7CisKKyAgICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgICAgICBtYW50ICs9IDE2OworICAgICAgICB9CisKKyAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgICBpZiAoaWV4cCA+IDEpIHsKKyAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7CisgICAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworCisgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KK30KKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RzcxMURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U4ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRHNzExRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEc3MTFEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisjaWZkZWYgQUxBVworICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbHNlCisgICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2VuZGlmCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0R3NtRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0R3NtRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHc21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRHc21EZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgMTMyMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDEzMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTAyNCAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX0lOX0ZSTV9TWikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0R3NtRGVjOjpDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Hc20obnVsbHB0cikgeworfQorCitDMlNvZnRHc21EZWM6On5DMlNvZnRHc21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25Jbml0KCkgeworICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyBzaXplX3QgZGVjb2RlR1NNKGdzbSBoYW5kbGUsIGludDE2X3QgKm91dCwgc2l6ZV90IG91dENhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IDA7CisKKyAgICBpZiAoaW5TaXplICUgTVNHU01fSU5fRlJNX1NaID09IDAKKyAgICAgICAgICAgICYmIChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKCpvdXQpCisgICAgICAgICAgICAgICAgICAgIDw9IG91dENhcGFjaXR5KSkgeworICAgICAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworCisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dFNpemUgKiBzaXplb2YoaW50MTZfdCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiApICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCAqb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHNpemVfdCBvdXRTaXplID0gZGVjb2RlR1NNKG1Hc20sIG91dHB1dCwgb3V0Q2FwYWNpdHksIGlucHV0LCBpblNpemUpOworICAgIGlmICghb3V0U2l6ZSkgeworICAgICAgICBBTE9HRSgiZW5jb3VudGVyZWQgaW1wcm9wZXIgaW5zaXplIG9yIG91dHNpemUiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRHU01EZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0R1NNRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEdzbURlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0R1NNRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0R1NNRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMDlmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSAiZ3NtLmgiCit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1ogICAgICAgICAgICAgMzMKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEgICAgIDMyCisjZGVmaW5lIEZSR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAxNjAKKyNkZWZpbmUgTVNHU01fSU5fRlJNX1NaICAgICAgICAgICAgIChGUkdTTV9JTl9GUk1fU1ogKyBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSkKKyNkZWZpbmUgTVNHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIChGUkdTTV9PVVRfRlJNX1NaICogMikKKworc3RydWN0IEMyU29mdEdzbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0R3NtRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBnc20gbUdzbTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHc21EZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRIZXZjRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAorCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNlbmMiXSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZGRhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTAsMCArMSw5ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRIZXZjRGVjLmgiCisjaW5jbHVkZSAiaWhldmNkX2N4YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCg4dSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEhldmNEZWM6OkMyU29mdEhldmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSkgeworfQorCitDMlNvZnRIZXZjRGVjOjp+QzJTb2Z0SGV2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50ID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEhldmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSEVWQ0RfQ1hBX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEhldmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgIH0KKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEhldmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEhldmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworCitzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciBjb2xvckFzcGVjdHMgZnVuY3Rpb25zLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBib29sIGNvbG9yQXNwZWN0c0RpZmZlcihjb25zdCBDb2xvckFzcGVjdHMgJmEsIGNvbnN0IENvbG9yQXNwZWN0cyAmYik7CisgICAgdm9pZCB1cGRhdGVGaW5hbENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgIGNvbnN0IENvbG9yQXNwZWN0cyAmb3RoZXJBc3BlY3RzLCBjb25zdCBDb2xvckFzcGVjdHMgJnByZWZlcnJlZEFzcGVjdHMpOworICAgIHN0YXR1c190IGhhbmRsZUNvbG9yQXNwZWN0c0NoYW5nZSgpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBhN2EwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXR0X3ZpZGVvX2FwaS5oIgorI2luY2x1ZGUgImloZXZjZV9hcGkuaCIKKyNpbmNsdWRlICJpaGV2Y2VfcGx1Z2luLmgiCisjaW5jbHVkZSAiQzJTb2Z0SGV2Y0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEhldmNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDMyMCwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDEyOCwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSEVWQ19NQUlOLCBMRVZFTF9IRVZDX01BSU5fMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vbmVPZih7QzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtMRVZFTF9IRVZDX01BSU5fMSwgTEVWRUxfSEVWQ19NQUlOXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8yXzEsIExFVkVMX0hFVkNfTUFJTl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fM18xLCBMRVZFTF9IRVZDX01BSU5fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzRfMSwgTEVWRUxfSEVWQ19NQUlOXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl81XzEsIExFVkVMX0hFVkNfTUFJTl81XzJ9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUsIG1GcmFtZVJhdGUsIG1CaXRyYXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJnNpemUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+ICZmcmFtZVJhdGUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IRVZDX01BSU47CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3RleHByIExldmVsTGltaXRzIGtMaW1pdHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzEsICAgICAgIDU1Mjk2MCwgICAgMzY4NjQsICAgIDEyODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAzNjg2NDAwLCAgIDEyMjg4MCwgICAxNTAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yXzEsICAgIDczNzI4MDAsICAgMjQ1NzYwLCAgIDMwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAxNjU4ODgwMCwgICA1NTI5NjAsICAgNjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgIDMzMTc3NjAwLCAgIDk4MzA0MCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80LCAgICAgNjY4NDY3MjAsICAyMjI4MjI0LCAgMTIwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzRfMSwgIDEzMzY5MzQ0MCwgIDIyMjgyMjQsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAgMjY3Mzg2ODgwLCAgODkxMjg5NiwgIDI1MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzEsICA1MzQ3NzM3NjAsICA4OTEyODk2LCAgNDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMiwgMTA2OTU0NzUyMCwgIDg5MTI4OTYsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxMDY5NTQ3NTIwLCAzNTY1MTU4NCwgIDYwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzEsIDIxMzkwOTUwNDAsIDM1NjUxNTg0LCAxMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMiwgNDI3ODE5MDA4MCwgMzU2NTE1ODQsIDI0MDAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IHNhbXBsZXMgPSBzaXplLnYud2lkdGggKiBzaXplLnYuaGVpZ2h0OworICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjID0gc2FtcGxlcyAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuCisgICAgICAgIGJvb2wgbmVlZHNVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyA8PSBsaW1pdC5zYW1wbGVzICYmIHNhbXBsZXNQZXJTZWMgPD0gbGltaXQuc2FtcGxlc1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IRVZDX01BSU5fNV8yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMOiByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgaGV2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgNjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzJfMSwgIDYzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICA5MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgOTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzQsICAgMTIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsIDEyMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAxNTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMSwgMTUzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDE1NiB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxODAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMSwgMTgzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDE4NiB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuaGV2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gMTU2OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fAorICAgICAgICAgICAgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVSYXRlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0cmF0ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RTeW5jOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiOworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitDMlNvZnRIZXZjRW5jOjpDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtSGV2Y0VuY1Byb2ZpbGUoMSksCisgICAgICBtSGV2Y0VuY0xldmVsKDMwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZChmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0SGV2Y0VuYzo6fkMyU29mdEhldmNFbmMoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6b25Jbml0KCkgeworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIHJldHVybiByZWxlYXNlRW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVzZXQoKSB7CisgICAgb25TdG9wKCk7CisgICAgaW5pdEVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoIlNpZ25hbGxpbmcgRU9TIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU51bUNvcmVzID0gTUlOKEdldENQVUNvcmVDb3VudCgpLCBDT0RFQ19NQVhfQ09SRVMpOworICAgIG1lbXNldCgmbUVuY1BhcmFtcywgMCwgc2l6ZW9mKGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KSk7CisKKyAgICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9zZXRfZGVmX3BhcmFtcygmbUVuY1BhcmFtcyk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGRlZmF1bHQgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgY29uZmlndXJhdGlvbgorICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF93aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub20gPSAxMDAwOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9udW0gPSBtRnJhbWVSYXRlLT52YWx1ZSAqIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X2NvZGVjX2xldmVsID0gbUhldmNFbmNMZXZlbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2lfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfY3JhX29wZW5fZ29wX3BlcmlvZCA9IG1JRFJJbnRlcnZhbDsKKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisgICAgbUVuY1BhcmFtcy5zX211bHRpX3RocmRfcHJtcy5pNF9tYXhfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIG1FbmNQYXJhbXMuc19vdXRfc3RybV9wcm1zLmk0X2NvZGVjX3Byb2ZpbGUgPSBtSGV2Y0VuY1Byb2ZpbGU7CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMjsKKyAgICBtRW5jUGFyYW1zLnNfbGFwX3BybXMuaTRfcmNfbG9va19haGVhZF9waWNzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX2Nsb3NlKG1Db2RlY0N0eCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgKHZvaWQpZHJhaW5Nb2RlOworICAgICh2b2lkKXBvb2w7CisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgQ0hFQ0soIW1Db2RlY0N0eCk7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1IZXZjRW5jUHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlX2woKTsKKyAgICAgICAgbUhldmNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKKworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgcGFyYW1zIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworICAgIGVyciA9IGloZXZjZV9pbml0KCZtRW5jUGFyYW1zLCAmbUNvZGVjQ3R4KTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZW5jb2RlciBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QqIHBhcmFtcyA9ICZtRW5jUGFyYW1zOworICAgIG1lbXNldChwc19lbmNvZGVfaXAsIDAsIHNpemVvZihpaGV2Y2VfaW5wX2J1Zl90KSk7CisKKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQmIGxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90KiB5UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIHVQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogdlBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbgorICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPQorICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgdVN0cmlkZSA9PSB2U3RyaWRlICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0KKyAgICAgICAgICAgICAgICBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6IHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlCisgICAgICAgICAgICAvLyBwb2ludGVyLgorICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsyXSA9IHZTdHJpZGU7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzBdID0geVN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzFdID0gdVN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMl0gPSB2U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRTogeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1syXSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzJdID0gMDsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMF0gPSB5U3RyaWRlICogaGVpZ2h0OworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMV0gPSB1U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsyXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF90Z3RfYml0cmF0ZVswXTsKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfcGVha19iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9wZWFrX2JpdHJhdGVbMF07CisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX3JhdGVfZmFjdG9yID0gcGFyYW1zLT5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfZmFjdG9yOworICAgIHBzX2VuY29kZV9pcC0+dThfcHRzID0gdGltZXN0YW1wOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIEFMT0dEKCJTaWduYWxsZWQgRXJyb3IgLyBTaWduYWxsZWQgRW9zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHN0YXR1cyA9IGluaXRFbmNvZGVyKCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICB2aWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IElIRVZDRV9FT0s7CisKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgIGloZXZjZV9vdXRfYnVmX3Qgc19oZWFkZXJfb3B7fTsKKyAgICAgICAgZXJyID0gaWhldmNlX2VuY29kZV9oZWFkZXIobUNvZGVjQ3R4LCAmc19oZWFkZXJfb3ApOworICAgICAgICBpZiAoZXJyID09IElIRVZDRV9FT0sgJiYgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkLCAwdSk7CisgICAgICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBzX2hlYWRlcl9vcC5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNzZCkpOworICAgICAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWhldmNlX2lucF9idWZfdCBzX2VuY29kZV9pcHt9OworICAgIGloZXZjZV9vdXRfYnVmX3Qgc19lbmNvZGVfb3B7fTsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisKKyAgICBzdGF0dXMgPSBzZXRFbmNvZGVBcmdzKCZzX2VuY29kZV9pcCwgdmlldy5nZXQoKSwgdGltZXN0YW1wKTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOworICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwID0gKGlucHV0QnVmZmVyKSA/ICZzX2VuY29kZV9pcCA6IG51bGxwdHI7CisKKyAgICBlcnIgPSBpaGV2Y2VfZW5jb2RlKG1Db2RlY0N0eCwgcHNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICBBTE9HRSgiRW5jb2RlIEZyYW1lIGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCAoaW50KXRpbWVUYWtlbiwKKyAgICAgICAgICAoaW50KXRpbWVEZWxheSwgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgIGlmIChzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgICAgICBzdGF0dXMgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCwgdXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKEMyX09LICE9IHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHdWaWV3LmRhdGEoKSwgc19lbmNvZGVfb3AucHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIHNfZW5jb2RlX29wLnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBzX2VuY29kZV9vcC51OF9wdHM7CisgICAgICAgIGlmIChzX2VuY29kZV9vcC5pNF9pc19rZXlfZnJhbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRIZXZjRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJmZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgNAorCitzdHJ1Y3QgQzJTb2Z0SGV2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyU29mdEhldmNFbmMoKTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190IG1FbmNQYXJhbXM7CisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgIFVXT1JEMzIgbUhldmNFbmNQcm9maWxlOworICAgIFVXT1JEMzIgbUhldmNFbmNMZXZlbDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB2b2lkKiBtQ29kZWNDdHg7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApOworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC9oZXZjIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJoMjY1IgorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkR1bXAgdG8gZmlsZSEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX0hFVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wM0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI2ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wM0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wM0RlYy5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXAzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNUDM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHs4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAzMjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRNUDM6OkMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29uZmlnKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0cikgeworfQorCitDMlNvZnRNUDM6On5DMlNvZnRNUDMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uU3RvcCgpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlbGVhc2UoKSB7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnOworICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE1QMzo6aW5pdERlY29kZXIoKSB7CisgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICBpZiAoIW1Db25maWcpIHJldHVybiBOT19NRU1PUlk7CisgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7CisgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworCisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIGlmICghbURlY29kZXJCdWYpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIFRoZSBiZWxvdyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gLi90ZXN0L21wM3JlYWRlci5jcHAgKi8KK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICBpZiAob3V0X2JpdHJhdGUpICpvdXRfYml0cmF0ZSA9IDA7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgICAgaWYgKGxheWVyID09IDB4MDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7IC8vIGxheWVyIEkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGxheWVyIElJIG9yIElJSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBWMiAob3IgMi41KQorICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVPdXRTaXplKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpkZWNvZGVkU2l6ZXMpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzOworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKworICAgIHdoaWxlICh0b3RhbEluU2l6ZSArIDQgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZU1wM0hlYWRlcihVMzJfQVQoaGVhZGVyICsgdG90YWxJblNpemUpLCAmZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjaGFubmVscywgbnVsbHB0ciwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcGFyc2UgbXAzIGhlYWRlciBkdXJpbmcgb3V0U2l6ZSBlc3RpbWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbEluU2l6ZSArPSBmcmFtZVNpemU7CisgICAgICAgIGRlY29kZWRTaXplcy0+cHVzaF9iYWNrKG51bVNhbXBsZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgaWYgKGRlY29kZWRTaXplcy0+ZW1wdHkoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCisvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCisvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKKy8vICAgICAgIG1wZWcgbGF5ZXIgMSBmcmFtZSBzaXplIGlzIDM4NCBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzaG91bGQgaW50cm9kdWNlCisvLyAgICAgICBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNhbiBjYXVzZSBTRUcgZmF1bHRzLiBTb2Z0IG9teCBtcDMgcGx1Z2luIGNhbiBoYXZlCisvLyAgICAgICB0aGlzIHByb2JsZW0gKENIRUNLISkKK3ZvaWQgQzJTb2Z0TVAzOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwICYmICghbUdhcGxlc3NCeXRlcyB8fCAhZW9zKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisgICAgc2l6ZV90IGNhbE91dFNpemU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBkZWNvZGVkU2l6ZXM7CisgICAgaWYgKGluU2l6ZSAmJiBPSyAhPSBjYWxjdWxhdGVPdXRTaXplKGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLCAmZGVjb2RlZFNpemVzKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsT3V0U2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShkZWNvZGVkU2l6ZXMuYmVnaW4oKSwgZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGNhbE91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dFNpemUgPSAwOworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGF1dG8gaXQgPSBkZWNvZGVkU2l6ZXMuYmVnaW4oKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZGVjb2RlZFNpemVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSArIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAoY2FsT3V0U2l6ZSAtIG91dFNpemUpOworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkgKyBvdXRTaXplKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiBkZWNvZGVyRXJyICE9IFNJREVfSU5GT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWNvdmVyYWJsZSwganVzdCBpZ25vcmUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEFMT0dWKCJpZ25vcmluZyBlcnJvciBhbmQgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICBpZiAobUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAqaXQgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy0+cE91dHB1dEJ1ZmZlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKml0ICE9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0U2l6ZSArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGluUG9zICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0KSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVjb2RlciBkZWxheSBpcyA1Mjkgc2FtcGxlcywgc28gdHJpbSB0aGF0IG1hbnkgc2FtcGxlcyBvZmYKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IG1ha2VzIHRoaXMKKyAgICAgICAgLy8gZGVjb2RlciBoYXZlIHplcm8gZGVsYXksIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBhc3N1bWVzLgorICAgICAgICBvdXRPZmZzZXQgPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBpZiAoY2FsT3V0U2l6ZSA+PQorICAgICAgICAgICAgb3V0U2l6ZSArIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBpZiAoIW1lbXNldChyZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkgKyBvdXRTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIDUyOSBzYW1wbGVzIGF0IGVuZCIpOworICAgICAgICAgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCisgICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRNcDNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXAzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgIG5ldyBDMlNvZnRNUDMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNUDM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wM0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmJkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKKworYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TVAzIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNUDMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSA9IDUyOSAvLyBzYW1wbGVzCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworCisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtR2FwbGVzc0J5dGVzOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TVAzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWcyRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApAQCAtMCwwICsxLDEwNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWcyRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzJEZWMuaCIKKyNpbmNsdWRlICJpbXBlZzJkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWcyLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE5MjAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTA4OCwgNCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2MoV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICptZW0pIHsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjpDMlNvZnRNcGVnMkRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1lbVJlY29yZHMobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJEcmFpbihudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApIHsKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworfQorCitDMlNvZnRNcGVnMkRlYzo6fkMyU29mdE1wZWcyRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJEcmFpbiA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldE51bU1lbVJlY29yZHMoKSB7CisgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKyAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLCBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZmlsbE1lbVJlY29yZHMoKSB7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gKGl2X21lbV9yZWNfdCAqKSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmICghcHNfbWVtX3JlYykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwc19tZW1fcmVjLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspCisgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgIG1NZW1SZWNvcmRzID0gcHNfbWVtX3JlYzsKKworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworCisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gbVdpZHRoOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IG1IZWlnaHQ7CisgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEobU51bU1lbVJlY29yZHMsIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgaWYgKCFwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gbVdpZHRoOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IG1IZWlnaHQ7CisgICAgc19pbml0X2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2luaXRfaXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9vcF90KTsKKworICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmaWxsTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckRyYWluOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6Z2V0U2VxSW5mbygpIHsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90IHNfY3RsX2dldF9zZXFfaW5mb19pcDsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90IHNfY3RsX2dldF9zZXFfaW5mb19vcDsKKworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QpOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9HRVRfU0VRX0lORk87CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HVygiRXJyb3IgaW4gZ2V0dGluZyBTZXF1ZW5jZSBpbmZvOiAweCV4Iiwgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9ICBmYWxzZTsgIC8vIG1wZWcyIHZpZGVvIGhhcyBsaW1pdGVkIHJhbmdlLgorCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVN0cmlkZSA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlSW5pdERlY29kZXIoKSB7CisgICAgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgIGRlbGV0ZURlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCisgICAgICAgIERVTVBfVE9fRklMRShtSW5GaWxlLCBzX2RlY29kZV9pcC5wdl9zdHJlYW1fYnVmZmVyLCBzX2RlY29kZV9pcC51NF9udW1fQnl0ZXMpOworICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkICIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSU1QRUcyRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBzX2RlY29kZV9vcC51NF9waWNfd2QsIHNfZGVjb2RlX29wLnU0X3BpY19odCk7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworCisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT0sgIT0gcmVJbml0RGVjb2RlcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWluaXRpYWxpemUgZGVjb2RlciIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyIG91dDogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpIGdldFNlcUluZm8oKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisKKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzJEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlICJpdl9kYXRhdHlwZWRlZi5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGltcGVnMmRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9fb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvbXBlZzJkX2lucHV0IgorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAodWludDMyX3QpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworc3RydWN0IEMyU29mdE1wZWcyRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWcyRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgZmlsbE1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRTZXFJbmZvKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckRyYWluOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnMkRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGE3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RGVjIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RGVjLmgiCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgxdSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QNFZfMykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzZ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAxOTIwLCAxMDg4KSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDM1MiwgMjg4KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTkyMCAqIDEwODggKiAzIC8gMikpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM1MiAqIDI4OCAqIDMgLyAyKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworI2lmZGVmIE1QRUc0CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisjZWxzZQorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMzUydSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyODh1KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRNYXhXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT53aWR0aDsgfQorICAgIHVpbnQzMl90IGdldE1heEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT5oZWlnaHQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitDMlNvZnRNcGVnNERlYzo6QzJTb2Z0TXBlZzREZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgeworfQorCitDMlNvZnRNcGVnNERlYzo6fkMyU29mdE1wZWc0RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICAodm9pZClvbkluaXQoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1Jc01wZWc0ID0gdHJ1ZTsKKyNlbHNlCisgICAgbUlzTXBlZzQgPSBmYWxzZTsKKyNlbmRpZgorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgLyogVE9ETzogYnJpbmcgdGhlc2UgdmFsdWVzIHRvIDM1MiBhbmQgMjg4LiBJdCBjYW5ub3QgYmUgZG9uZSBhcyBvZiBub3cKKyAgICAgKiBiZWNhdXNlLCBoMjYzIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBwb3J0IHJlY29uZmlndXJhdGlvbi4gSW4gT01YLCB0aGUKKyAgICAgKiBwcm9ibGVtIG9mIGxhcmdlciB3aWR0aCBhbmQgaGVpZ2h0IHRoYW4gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGlzCisgICAgICogb3ZlcmNvbWUgYnkgYWRhcHRpdmVQbGF5QmFjaygpIGFwaSBjYWxsLiBUaGlzIGNhbGwgZ2V0cyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogaW5mb3JtYXRpb24gZnJvbSBleHRyYWN0b3IuIFN1Y2ggYSB0aGluZyBpcyBub3QgcG9zc2libGUgaGVyZS4KKyAgICAgKiBTbyB3ZSBhcmUgY29uZmlndXJpbmcgdG8gbGFyZ2VyIHZhbHVlcy4qLworICAgIG1XaWR0aCA9IDE0MDg7CisgICAgbUhlaWdodCA9IDExNTI7CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBhbGlnbihtV2lkdGgsIDE2KSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzREZWM6OmhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OworICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOworCisgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisKKyAgICBDSEVDS19MRShkaXNwX3dpZHRoLCBidWZfd2lkdGgpOworICAgIENIRUNLX0xFKGRpc3BfaGVpZ2h0LCBidWZfaGVpZ2h0KTsKKworICAgIEFMT0dWKCJkaXNwbGF5IHNpemUgKCVkeCVkKSwgYnVmZmVyIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOworCisgICAgYm9vbCByZXNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gbVdpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICByZXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNNcGVnNCkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmVzQ2hhbmdlZDsKK30KKworLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQorICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKKyAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKyAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisgICAgLyogVSBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgLyogViBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKKyAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CisgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CisgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChjb2RlY0NvbmZpZyB8fCB2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gYml0c3RyZWFtOworICAgICAgICAgICAgdm9sX3NpemUgPSBpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIG1vZGUgPSAobUlzTXBlZzQpID8gTVBFRzRfTU9ERSA6IEgyNjNfTU9ERTsKKyAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCisgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBtb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIlBWSW5pdFZpZGVvRGVjb2RlciBmYWlsZWQuIFVuc3VwcG9ydGVkIGNvbnRlbnQ/Iik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgICAgICBpZiAobW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiRGVjb2RlZCBtb2RlIG5vdCBzYW1lIGFzIGFjdHVhbCBtb2RlIG9mIHRoZSBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpOworICAgICAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1EZWNIYW5kbGUtPnNpemU7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMil7CisgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICV6dSBieXRlcyIsIG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLG1PdXRwdXRCdWZmZXJbMV0pOworICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgorICAgICAgICBWb3BIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOworICAgICAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAoaW5Qb3MgPT0gMCk7CisgICAgICAgIGludDMyX3QgdG1wSW5TaXplID0gKGludDMyX3QpaW5TaXplOworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW1UbXAgPSBiaXRzdHJlYW07CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IHdvcmtJbmRleDsKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCAmYml0c3RyZWFtVG1wLCAmdGltZXN0YW1wLCAmdG1wSW5TaXplLAorICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2luZm8sICZ1c2VFeHRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdm9wIGhlYWRlci4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBIMjYzIGRvZXNuJ3QgaGF2ZSBWT0wgaGVhZGVyLCB0aGUgZnJhbWUgc2l6ZSBpbmZvcm1hdGlvbiBpcyBpbiBzaG9ydCBoZWFkZXIsIGkuZS4gdGhlCisgICAgICAgIC8vIGRlY29kZXIgbWF5IGRldGVjdCBzaXplIGNoYW5nZSBhZnRlciBQVkRlY29kZVZvcEhlYWRlci4KKyAgICAgICAgYm9vbCByZXNDaGFuZ2UgPSBoYW5kbGVSZXNDaGFuZ2Uod29yayk7CisgICAgICAgIGlmIChtSXNNcGVnNCAmJiByZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRtcEluU2l6ZSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdmlkZW8gZnJhbWUuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJZID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKG91dHB1dEJ1ZmZlclksIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LndpZHRoKCksIGFsaWduKG1XaWR0aCwgMTYpLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIGluUG9zICs9IGluU2l6ZSAtIChzaXplX3QpdG1wSW5TaXplOworICAgICAgICBmaW5pc2hXb3JrKHdvcmtJbmRleCwgd29yayk7CisgICAgICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgICAgIGlmIChpblNpemUgLSBpblBvcyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzREZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnNERlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfREVDX0hfCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKKyAgICB9OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYm9vbCBoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOworICAgIHNpemVfdCAgbU91dHB1dEJ1ZmZlclNpemU7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dDsKKworICAgIGJvb2wgbUlzTXBlZzQ7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnNERlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfTVBFRzRfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmE1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApAQCAtMCwwICsxLDY3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIE1QRUc0CisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzRFbmMiCisjZWxzZQorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdEgyNjNFbmMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzRFbmMuaCIKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAxNzYsIDE0NCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE3NiwgMTYpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTQ0LCAxNiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5vbmVPZih7MTc2LCAzNTJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLm9uZU9mKHsxNDQsIDI4OH0pLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDE3LikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIE1QRUc0CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9NUDRWX1NJTVBMRSwgTEVWRUxfTVA0Vl8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0gyNjNfQkFTRUxJTkUsIExFVkVMX0gyNjNfNDUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9IMjYzX0JBU0VMSU5FKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX01QNFZfU0lNUExFOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0gyNjNfQkFTRUxJTkU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX01QNFZfMjsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0gyNjNfNDU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKK0MyU29mdE1wZWc0RW5jOjpDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1FbmNQYXJhbXMobnVsbHB0ciksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKK30KKworQzJTb2Z0TXBlZzRFbmM6On5DMlNvZnRNcGVnNEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uSW5pdCgpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1FbmNvZGVNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyNlbHNlCisgICAgbUVuY29kZU1vZGUgPSBIMjYzX01PREU7CisjZW5kaWYKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIH0KKworICAgIGlmICghbUVuY1BhcmFtcykgeworICAgICAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ3ZpZGVvRW5jT3B0aW9uczsKKyAgICB9CisKKyAgICBpZiAoIShtRW5jUGFyYW1zICYmIG1IYW5kbGUpKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICh2b2lkKVBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtSGFuZGxlOworICAgICAgICBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0VuY0NvbnRyb2xzKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIGlmICghUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNQYXJhbXMsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGlmIChtRnJhbWVSYXRlLT52YWx1ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZXJhdGUgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IG1FbmNvZGVNb2RlOworICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMtPmVuY0hlaWdodFswXSA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgbUVuY1BhcmFtcy0+cmNUeXBlID0gVkJSXzE7CisgICAgbUVuY1BhcmFtcy0+dmJ2RGVsYXkgPSA1LjBmOworICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyAobUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjUpOworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy0+aVF1YW50WzBdID0gMTU7CisgICAgbUVuY1BhcmFtcy0+cFF1YW50WzBdID0gMTI7CisgICAgbUVuY1BhcmFtcy0+cXVhbnRUeXBlWzBdID0gMDsKKyAgICBtRW5jUGFyYW1zLT5ub0ZyYW1lU2tpcHBlZCA9IFBWX09GRjsKKworICAgIC8vIFBWJ3MgTVBFRzQgZW5jb2RlciByZXF1aXJlcyB0aGUgdmlkZW8gZGltZW5zaW9uIG9mIG11bHRpcGxlCisgICAgaWYgKG1TaXplLT53aWR0aCAlIDE2ICE9IDAgfHwgbVNpemUtPmhlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW5pdEVuY1BhcmFtcygpOworICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplZCBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtSGFuZGxlLCBtRW5jUGFyYW1zKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyAxc3QgYnVmZmVyIGZvciBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCAmJiBDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopd1ZpZXcuZGF0YSgpOworICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgorICAgICAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKCFQVkdldFZvbEhlYWRlcihtSGFuZGxlLCBvdXRQdHIsICZvdXRwdXRTaXplLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXctPmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPSBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGluQnVmZmVyLndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBwbGFuZXMgYXJlIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLKE5VTEwgIT0geVBsYW5lKTsKKyAgICAvKiBFbmNvZGUgZnJhbWVzICovCisgICAgVmlkZW9FbmNGcmFtZUlPIHZpbiwgdm91dDsKKyAgICBtZW1zZXQoJnZpbiwgMCwgc2l6ZW9mKHZpbikpOworICAgIG1lbXNldCgmdm91dCwgMCwgc2l6ZW9mKHZvdXQpKTsKKyAgICB2aW4ueUNoYW4gPSB5UGxhbmU7CisgICAgdmluLnVDaGFuID0gdVBsYW5lOworICAgIHZpbi52Q2hhbiA9IHZQbGFuZTsKKyAgICB2aW4udGltZXN0YW1wID0gKGlucHV0VGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcworICAgIHZpbi5oZWlnaHQgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICB2aW4ucGl0Y2ggPSBhbGlnbih3aWR0aCwgMTYpOworCisgICAgdWludDMyX3QgbW9kVGltZU1zID0gMDsKKyAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICBpZiAoIVBWRW5jb2RlVmlkZW9GcmFtZShtSGFuZGxlLCAmdmluLCAmdm91dCwgJm1vZFRpbWVNcywgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgJm5MYXllcikgfHwKKyAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW50IHRyYWNrIGF0IGZyYW1lICUiIFBSSWQ2NCwgbU51bUlucHV0RnJhbWVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXRwdXRTaXplIGZpbGxlZCA6ICVkIiwgb3V0cHV0U2l6ZSk7CisgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgQ0hFQ0soTlVMTCA9PSBQVkdldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworCisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0cHV0U2l6ZSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworICAgICAgICBpZiAoaGludFRyYWNrLkNvZGVUeXBlID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0KKworICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKHlQbGFuZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzRFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQ2MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmMoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgdGFndmlkZW9FbmNDb250cm9scyAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICptRW5jUGFyYW1zOworCisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB1aW50MzJfdCBtT3V0QnVmZmVyU2l6ZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgTVA0RW5jb2RpbmdNb2RlIG1FbmNvZGVNb2RlOworCisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzRFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQxNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0T3B1c0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKK30KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfb3B1c2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0T3B1c0VuYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDcxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRPcHVzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2MDAwLCA1MTAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA5NjAgKiA2KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRPcHVzRGVjOjpDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0T3B1c0RlYzo6fkMyU29mdE9wdXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgY29uc3QgaW50IGtSYXRlID0gNDgwMDA7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCByYXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnMpICogcmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGluU2l6ZTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gKHZvaWQgKilkYXRhOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CisKKyAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGRhdGEsIGluU2l6ZSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworCisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBQYXJzaW5nIE9wdXMgSGVhZGVyLiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBpZiAobUhlYWRlci5jaGFubmVscyA8PSBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmICYmIGNvZGVjRGVsYXlCdWZTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjb2RlY0RlbGF5QnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXModmFsdWUsIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vla1ByZVJvbGxCdWYgJiYgc2Vla1ByZVJvbGxCdWZTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjb2RlY0RlbGF5QnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNFbmMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVMgMjAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdE9wdXNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCAxMjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDUwMCwgNTEyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29tcGxleGl0eSwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0KDB1LCAxMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ29tcGxleGl0eSwgdmFsdWUpLmluUmFuZ2UoMSwgMTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzODQwKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiBtQ29tcGxleGl0eS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNFbmM6OkMyU29mdE9wdXNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1PdXRwdXRCbG9jayhudWxscHRyKSwKKyAgICAgIG1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMTYobnVsbHB0ciksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0T3B1c0VuYzo6fkMyU29mdE9wdXNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICB1bnNpZ25lZCBjaGFyIG1vbm9fbWFwcGluZ1syNTZdID0gezB9OworICAgIHVuc2lnbmVkIGNoYXIgc3RlcmVvX21hcHBpbmdbMjU2XSA9IHswLCAxfTsKKyAgICB1bnNpZ25lZCBjaGFyIHN1cnJvdW5kX21hcHBpbmdbMjU2XSA9IHswLCAxLCAyNTV9OworICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIGludCBjb21wbGV4aXR5ID0gbUludGYtPmdldENvbXBsZXhpdHkoKTsKKyAgICBtTnVtU2FtcGxlc1BlckZyYW1lID0gbVNhbXBsZVJhdGUgLyAoMTAwMCAvIG1GcmFtZUR1cmF0aW9uTXMpOworICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgPQorICAgICAgICBtQ2hhbm5lbENvdW50ICogbU51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQgZXJyID0gQzJfT0s7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBtYXBwaW5nOworICAgIGlmIChtQ2hhbm5lbENvdW50IDwgMikgeworICAgICAgICBtYXBwaW5nID0gbW9ub19tYXBwaW5nOworICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAyKSB7CisgICAgICAgIG1hcHBpbmcgPSBzdGVyZW9fbWFwcGluZzsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXBwaW5nID0gc3Vycm91bmRfbWFwcGluZzsKKyAgICB9CisKKyAgICBpZiAobUVuY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgfQorCisgICAgbUVuY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LAorICAgICAgICAxLCAxLCBtYXBwaW5nLCBPUFVTX0FQUExJQ0FUSU9OX0FVRElPLCAmZXJyKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgY3JlYXRlIGxpYm9wdXMgZW5jb2Rlci4gRXJyb3IgY29kZTogJWkiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIENvbXBsZXhpdHkKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bCgKKyAgICAgICAgICAgIG1FbmNvZGVyLCBPUFVTX1NFVF9DT01QTEVYSVRZKGNvbXBsZXhpdHkpKSAhPSBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGNvbXBsZXhpdHkiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBEVFgKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfRFRYKDApICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGR0eCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFwcGxpY2F0aW9uCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsCisgICAgICAgICAgICBPUFVTX1NFVF9BUFBMSUNBVElPTihPUFVTX0FQUExJQ0FUSU9OX0FVRElPKSkgIT0gT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBhcHBsaWNhdGlvbiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNpZ25hbCB0eXBlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1NJR05BTChPUFVTX0FVVE8pKSAhPQorICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHNpZ25hbCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFVuY29uc3RyYWluZWQgVkJSCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUigwKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCB2YnIgdHlwZSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSX0NPTlNUUkFJTlQoMCkgIT0KKyAgICAgICAgICAgIE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciBjb25zdHJhaW50Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQml0cmF0ZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9CSVRSQVRFKGJpdHJhdGUpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBiaXRyYXRlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IGNvZGVjRGVsYXkKKyAgICBpbnQzMl90IGxvb2thaGVhZDsKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19HRVRfTE9PS0FIRUFEKCZsb29rYWhlYWQpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBsb29rYWhlYWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgbUNvZGVjRGVsYXkgPSBsb29rYWhlYWQgKiAxMDAwMDAwMDAwbGwgLyBtU2FtcGxlUmF0ZTsKKworICAgIC8vIFNldCBzZWVrIHByZXJvbGwgdG8gODAgbXMKKyAgICBtU2Vla1ByZVJvbGwgPSA4MDAwMDAwMDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICBtRnJhbWVEdXJhdGlvbk1zID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTl9NUzsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTE2KSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0KKyAgICAgICAgICAgIChpbnQxNl90KiltYWxsb2Moa0ZyYW1lU2l6ZSAqIGtNYXhOdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorICAgIGlmICghbUlucHV0QnVmZmVyUGNtMTYpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICAvKiBEZWZhdWx0IENvbmZpZ3VyYXRpb25zICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiT1BVU19SRVNFVF9TVEFURSBmYWlsZWQgc3RhdHVzID0gJXMiLCBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRwdXRCbG9jaykgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMTYpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20xNik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9kZXN0cm95KG1FbmNvZGVyKTsKKyAgICAgICAgbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKKy8vIERyYWluIHRoZSBlbmNvZGVyIHRvIGdldCBsYXN0IGZyYW1lcyAoaWYgYW55KQoraW50IEMyU29mdE9wdXNFbmM6OmRyYWluRW5jb2Rlcih1aW50OF90KiBvdXRQdHIpIHsKKyAgICBtZW1zZXQoKHVpbnQ4X3QgKiltSW5wdXRCdWZmZXJQY20xNiArIG1GaWxsZWRMZW4sIDAsCisgICAgICAgIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgIGludCBlbmNvZGVkQnl0ZXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZSgKKyAgICAgICAgbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTE2LCBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICBpZiAoZW5jb2RlZEJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlZCBieXRlcyIsCisgICAgICAgICAgICAgIG1CeXRlc0VuY29kZWQpOworICAgICAgICAvLyBhIGZhdGFsIGVycm9yIHdvdWxkIHN0b3AgdGhlIGVuY29kaW5nCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSk7CisgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICByZXR1cm4gZW5jb2RlZEJ5dGVzOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGlmICghbUVuY29kZXIpIHsKKyAgICAgICAgaWYgKGluaXRFbmNvZGVyKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0RW5jb2RlciBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUgPiAwKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IHByb2Nlc3NTaXplID0gMDsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSAwdTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICB1aW50NjRfdCBpbnB1dEluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgY29uc3QgdWludDhfdCogaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoIW1IZWFkZXJHZW5lcmF0ZWQpIHsKKyAgICAgICAgdWludDhfdCBoZWFkZXJbQU9QVVNfVU5JRklFRF9DU0RfTUFYU0laRV07CisgICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKyAgICAgICAgT3B1c0hlYWRlciBvcHVzSGVhZGVyOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxzID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fc3RyZWFtcyA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgIG9wdXNIZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobUNoYW5uZWxDb3VudCA+IDgpID8gMjU1IDogKG1DaGFubmVsQ291bnQgPiAyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IFdyaXRlT3B1c0hlYWRlcnMob3B1c0hlYWRlciwgbVNhbXBsZVJhdGUsIGhlYWRlciwKKyAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBtQ29kZWNEZWxheSwgbVNlZWtQcmVSb2xsKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKGhlYWRlckxlbiwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBoZWFkZXJMZW4pOworICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIGhlYWRlckxlbik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgbUhlYWRlckdlbmVyYXRlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgYnVmZmVyIHNpemUgd2hpY2ggaXMgbm90IGEgbXVsdGlwbGUgb2YgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSwgd2Ugd2lsbAorICAgICAqIGFjY3VtdWxhdGUgdGhlIGlucHV0IGFuZCBrZWVwIGl0LiBPbmNlIHRoZSBpbnB1dCBpcyBmaWxsZWQgd2l0aCBleHBlY3RlZCBudW1iZXIKKyAgICAgKiBvZiBieXRlcywgd2Ugd2lsbCBzZW5kIGl0IHRvIGVuY29kZXIuIG1GaWxsZWRMZW4gbWFuYWdlcyB0aGUgYnl0ZXMgb2YgaW5wdXQgeWV0CisgICAgICogdG8gYmUgcHJvY2Vzc2VkLiBUaGUgbmV4dCBjYWxsIHdpbGwgZmlsbCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbgorICAgICAqIGJ5dGVzIHRvIGlucHV0IGFuZCBzZW5kIGl0IHRvIHRoZSBlbmNvZGVyLgorICAgICAqLworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBwY21CeXRlcyA9IGluUHRyICsgaW5Qb3M7CisgICAgICAgIGludCBmaWxsZWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbjsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBpblNpemUgLSBpblBvczsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0QnVmZmVyUGNtMTYgKyBmaWxsZWRTYW1wbGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCB1bnNpZ25lZCBuSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5JbnB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBkYXRhID0gcGNtQnl0ZXNbMiAqIGkgKyAxXSA8PCA4IHwgcGNtQnl0ZXNbMiAqIGldOworICAgICAgICAgICAgZGF0YSA9ICgoZGF0YSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwOworICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMTZbaSArIGZpbGxlZFNhbXBsZXNdID0gZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgbUZpbGxlZExlbiArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgaWYgKCFtQnVmZmVyQXZhaWxhYmxlKSBicmVhazsKKyAgICAgICAgdWludDhfdCogb3V0UHRyID0gd1ZpZXcuZGF0YSgpICsgbUJ5dGVzRW5jb2RlZDsKKyAgICAgICAgaW50IGVuY29kZWRCeXRlcyA9CisgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZShtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICAgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgICAgIHByb2Nlc3NTaXplKTsKKworICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzIDwgMCB8fCBlbmNvZGVkQnl0ZXMgPiBrTWF4UGF5bG9hZCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfZW5jb2RlIGZhaWxlZCwgZW5jb2RlZEJ5dGVzIDogJWQiLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kZWRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKG1PdXRwdXRCbG9jaywgbUJ5dGVzRW5jb2RlZCwgZW5jb2RlZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQnl0ZXNFbmNvZGVkICs9IGVuY29kZWRCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKGZpbGxlZFNhbXBsZXMgKyBuSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgb3V0VGltZVN0YW1wID0KKyAgICAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAoKHByb2Nlc3NTaXplICsgbUZpbGxlZExlbikgPCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKQorICAgICAgICAgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBlb3MiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIGlmICghbUVuY29kZXJGbHVzaGVkKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkcmFpbiB0aGUgZW5jb2RlciBmb3IgbGFzdCBidWZmZXIKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwocG9vbCwgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZmxhZ3MpLCBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IG51bGxwdHI7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpbnQgZW5jQnl0ZXMgPSBkcmFpbkVuY29kZXIod1ZpZXcuZGF0YSgpKTsKKyAgICBpZiAoZW5jQnl0ZXMgPiAwKSBtQnl0ZXNFbmNvZGVkICs9IGVuY0J5dGVzOworICAgIGlmIChtQnl0ZXNFbmNvZGVkID4gMCkgeworICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCAwLCBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC8gc2l6ZW9mKGludDE2X3QpKTsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1DaGFubmVsQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0KKyAgICAgICAgKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG91dE9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0T3B1c0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNTI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitzdHJ1Y3QgT3B1c01TRW5jb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0T3B1c0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICAvKiBPUFVTX0ZSQU1FU0laRV8yMF9NUyAqLworICAgIGNvbnN0IGludCBrRnJhbWVTaXplID0gOTYwOworICAgIGNvbnN0IGludCBrTWF4UGF5bG9hZCA9IDQwMDA7CisgICAgY29uc3QgaW50IGtNYXhOdW1DaGFubmVscyA9IDg7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisKKyAgICBPcHVzTVNFbmNvZGVyKiBtRW5jb2RlcjsKKyAgICBpbnQxNl90KiBtSW5wdXRCdWZmZXJQY20xNjsKKworICAgIGJvb2wgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgYm9vbCBtRW5jb2RlckZsdXNoZWQ7CisgICAgYm9vbCBtQnVmZmVyQXZhaWxhYmxlOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQzMl90IG1GcmFtZUR1cmF0aW9uTXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBDb2RlYyBkZWxheSBpbiBucworICAgIHVpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIC8vIFNlZWsgcHJlLXJvbGwgaW4gbnMKKyAgICB1aW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50IG1OdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgaW50IG1CeXRlc0VuY29kZWQ7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIHNpemVfdCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpbnQgZHJhaW5FbmNvZGVyKHVpbnQ4X3QqIG91dFB0cik7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0T3B1c0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0UmF3RGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJjYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFJhd0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0UmF3RGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0UmF3RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMTkyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAxMDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDY0ICogMTAyNCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWb3JiaXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2b3JiaXNpZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzkzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0Vm9yYmlzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWb3JiaXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMzIwMDAsIDUwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIgKiAyICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRWb3JiaXNEZWM6OkMyU29mdFZvcmJpc0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtU3RhdGUobnVsbHB0ciksCisgICAgICBtVmkobnVsbHB0cikgeworfQorCitDMlNvZnRWb3JiaXNEZWM6On5DMlNvZnRWb3JiaXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIChpbml0RGVjb2RlcigpID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRWb3JiaXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mb3t9OworICAgIGlmICghbVZpKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisKKyAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZXt9OworICAgIGlmICghbVN0YXRlKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbmZvVW5wYWNrZWQgPSBmYWxzZTsKKyAgICBtQm9va3NVbnBhY2tlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmIChtU3RhdGUpIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBudWxscHRyOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCisvLyAoQ0hFQ0shKSBtdWx0aWZyYW1lIGlzIHRyaWNreS4gZGVjb2RlIGNhbGwgZG9lc250IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisvLyBjb25zdW1lZCBieSB0aGUgY29tcG9uZW50LiBBbHNvIGl0IGlzIHVuY2xlYXIgd2h5IG51bVBhZ2VGcmFtZXMgaXMgYmVpbmcKKy8vIHRhZ2dlZCBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIG5ldyBwYWdlcy4gUmVmZXIgbGluZXMgMjk3LTMwMCBpbgorLy8gU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaW50MzJfdCBudW1DaGFubmVscyAgPSBtVmktPmNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmVuY29kZXIiOworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciI7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjBmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmIDAKKyAgICAgICAgLy8gc2FtcGxlIEJULjIwMjAgc3RhdGljIGluZm8KKyAgICAgICAgbUhkclN0YXRpY0luZm8gPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigpOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWFzdGVyaW5nID0geworICAgICAgICAgICAgLnJlZCAgID0geyAueCA9IDAuNzA4LCAgLnkgPSAwLjI5MiB9LAorICAgICAgICAgICAgLmdyZWVuID0geyAueCA9IDAuMTcwLCAgLnkgPSAwLjc5NyB9LAorICAgICAgICAgICAgLmJsdWUgID0geyAueCA9IDAuMTMxLCAgLnkgPSAwLjA0NiB9LAorICAgICAgICAgICAgLndoaXRlID0geyAueCA9IDAuMzEyNywgLnkgPSAwLjMyOTAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IDAuMSwKKyAgICAgICAgfTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heENsbCA9IDEwMDA7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhGYWxsID0gMTIwOworCisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhMdW1pbmFuY2UgPSAwOyAvLyBkaXNhYmxlIHN0YXRpYyBpbmZvCisKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCwgQzJDb2xvclh5U3RydWN0PigpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkclN0YXRpY0luZm8pCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkclN0YXRpY0luZm8sIG1hc3RlcmluZy5yZWQueCkuaW5SYW5nZSgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyU3RhdGljSW5mb1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAyMDQ4dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyMDQ4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisjaWZkZWYgVlA5CisjaWYgMAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gbUhkclN0YXRpY0luZm87CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4LCBpbnRmID0gdGhpcy0+bUludGZdKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0U3RyaWRlICogaGVpZ2h0OworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorYm9vbCBDMlNvZnRWcHhEZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIGZhbHNlOworCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKTsKKworICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaW1nLT5kX3cgIT0gbVdpZHRoIHx8IGltZy0+ZF9oICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgIG1IZWlnaHQgPSBpbWctPmRfaDsKKworICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludCkqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdik7CisKKyAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJgorICAgICAgICAgICAgd29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdFZweEZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcHhGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZweERlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZweEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZweEZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzg0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWcHhEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZweERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBNT0RFX1ZQOCwKKyAgICAgICAgTU9ERV9WUDksCisgICAgfSBtTW9kZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdnB4X2NvZGVjX2N0eF90ICptQ29kZWNDdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOWE4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZweEVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWYgMAorc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKyNlbmRpZgorCitDMlNvZnRWcHhFbmM6OkMyU29mdFZweEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDb250ZXh0KG51bGxwdHIpLAorICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbihudWxscHRyKSwKKyAgICAgIG1Db2RlY0ludGVyZmFjZShudWxscHRyKSwKKyAgICAgIG1TdHJpZGVBbGlnbigyKSwKKyAgICAgIG1Db2xvckZvcm1hdChWUFhfSU1HX0ZNVF9JNDIwKSwKKyAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUoVlBYX1ZCUiksCisgICAgICBtRXJyb3JSZXNpbGllbmNlKGZhbHNlKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGgoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4KDApLAorICAgICAgbUxhc3RUaW1lc3RhbXAoMHg3RkZGRkZGRkZGRkZGRkZGdWxsKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CisgICAgbWVtc2V0KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCAwLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSA9IDEwMDsKK30KKworQzJTb2Z0VnB4RW5jOjp+QzJTb2Z0VnB4RW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRWcHhFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUNvZGVjQ29udGV4dCkgeworICAgICAgICB2cHhfY29kZWNfZGVzdHJveShtQ29kZWNDb250ZXh0KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbnRleHQ7CisgICAgICAgIG1Db2RlY0NvbnRleHQgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29kZWNDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDb25maWd1cmF0aW9uOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyB0aGlzIG9uZSBpcyBub3QgYWxsb2NhdGVkIGJ5IHVzCisgICAgbUNvZGVjSW50ZXJmYWNlID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvblN0b3AoKSB7CisgICAgb25SZWxlYXNlKCk7CisgICAgbUxhc3RUaW1lc3RhbXAgPSAweDdGRkZGRkZGRkZGRkZGRkZMTDsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuOworICAgIHN0YXR1c190IHJlc3VsdCA9IFVOS05PV05fRVJST1I7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtQml0cmF0ZU1vZGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZU1vZGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgbVJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gbUludGYtPmdldFRlbXBvcmFsTGF5ZXJzX2woKS0+bS5sYXllckNvdW50OworICAgIH0KKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICAgICAgbUJpdHJhdGVDb250cm9sTW9kZSA9IFZQWF9WQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9DT05TVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUgPSBWUFhfQ0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKyAgICBpZiAoIW1Db2RlY0ludGVyZmFjZSkgZ290byBDbGVhblVwOworCisgICAgQUxPR0QoIlZQeDogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBuZXcgdnB4X2NvZGVjX2VuY19jZmdfdDsKKyAgICBpZiAoIW1Db2RlY0NvbmZpZ3VyYXRpb24pIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z193ID0gbVNpemUtPndpZHRoOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfaCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy9tQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSBnZXRDcHVDb3JlQ291bnQoKTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gbUVycm9yUmVzaWxpZW5jZTsKKworICAgIC8vIHRpbWViYXNlIHVuaXQgaXMgbWljcm9zZWNvbmQKKyAgICAvLyBnX3RpbWViYXNlIGlzIGluIHNlY29uZHMgKGkuZS4gMS8xMDAwMDAwIHNlY29uZHMpCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5udW0gPSAxOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UuZGVuID0gMTAwMDAwMDsKKyAgICAvLyByY190YXJnZXRfYml0cmF0ZSBpcyBpbiBrYnBzLCBtQml0cmF0ZSBpbiBicHMKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOworICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOworICAgIC8vIERpc2FibGUgbGFnZ2VkIGVuY29kaW5nLgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDE7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSA+PSAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CisgICAgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKyAgICBtQ29kZWNDb250ZXh0ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQpIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIGZsYWdzCisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluaXRpYWxpemluZyB2cHggZW5jb2RlciIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgLy8gRXh0cmEgQ0JSIHNldHRpbmdzCisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJjX21heF9pbnRyYV90YXJnZXQgPQorICAgICAgICAgICAgICAgICh1aW50MzJfdCkobUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiBtRnJhbWVSYXRlLT52YWx1ZSAvIDIwICsgMC41KTsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvZGVjX3JldHVybiA9IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSBnb3RvIENsZWFuVXA7CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgICAgICBpZiAoKCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCkgPgorICAgICAgICAgICAgKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcsIHdpZHRoPSV1LCBoZWlnaHQ9JXUuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMik7CisgICAgICAgICAgICBpZiAoIW1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitDbGVhblVwOgorICAgIG9uUmVsZWFzZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBDMlNvZnRWcHhFbmM6OmdldEVuY29kZUZsYWdzKCkgeworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgaWYgKG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPiAwKSB7CisgICAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgICAgc3dpdGNoIChtVGVtcG9yYWxQYXR0ZXJuW3BhdHRlcm5JZHhdKSB7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQorCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgWVVWIGlucHV0IGNvbG9yIGZvcm1hdHMKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBTVkMsIEFSRi4gU1ZDIGFuZCBBUkYgcmV0dXJucyBtdWx0aXBsZSBmcmFtZXMKKy8vIChoaWVyYXJjaGljYWwgLyBub3Nob3cpIGluIG9uZSBjYWxsLiBUaGVzZSBmcmFtZXMgc2hvdWxkIGJlIGNvbWJpbmVkIGluIHRvCisvLyBhIHNpbmdsZSBidWZmZXIgYW5kIHNlbnQgYmFjayB0byB0aGUgY2xpZW50Cit2b2lkIEMyU29mdFZweEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5CisgICAgaWYgKCFtQ29kZWNDb250ZXh0ICYmIE9LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkVtcHR5IGlucHV0IEJ1ZmZlciIpOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0KKyAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSAhPSBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgIT0gbVNpemUtPmhlaWdodCkgeworICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBJbnB1dCBidWZmZXIgYXR0cmlidXRlcyAlZCglZCkgeCAlZCglZCkiLAorICAgICAgICAgICAgICBpbkJ1ZmZlci53aWR0aCgpLCBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQzMl90IHdpZHRoID0gclZpZXctPndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gclZpZXctPmhlaWdodCgpOworICAgIGlmICh3aWR0aCA+IDB4ODAwMCB8fCBoZWlnaHQgPiAweDgwMDApIHsKKyAgICAgICAgQUxPR0UoIkltYWdlIHRvbyBiaWc6ICV1IHggJXUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVihtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sIG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSB0aG91Z2ggd2l0aCBjdXN0b20gb2Zmc2V0IGFuZCBzdHJpZGUKKyAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1sxXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzFdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMl0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsyXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzBdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMV0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsyXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd0luYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgc3RyaWRlLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpID49IHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMF0pOworICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX3NldF9yZWN0KCZyYXdfZnJhbWUsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGw6ICV1IHggJXUgZm9yICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB2c3RyaWRlLCBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgIC8vIGhhbmRsZSBkeW5hbWljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IHJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBBTE9HVigiR290IG1JbnRyYVJlZnJlc2ggcmVxdWVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0KKyAgICAgICAgICAgICAgICAobUJpdHJhdGUtPnZhbHVlICsgNTAwKSAvIDEwMDA7CisgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIHVwZGF0ZSBiaXRyYXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcocmVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgaW5wdXRUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgdWludDMyX3QgZnJhbWVEdXJhdGlvbjsKKyAgICBpZiAoaW5wdXRUaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KShpbnB1dFRpbWVTdGFtcCAtIG1MYXN0VGltZXN0YW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgZGVmYXVsdCBvZiAzMCBmcHMgaW4gY2FzZSBvZiAwIGZyYW1lIHJhdGUuCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICBpZiAoZnJhbWVSYXRlIDwgMC4wMDEpIHsKKyAgICAgICAgICAgIGZyYW1lUmF0ZSA9IDMwOworICAgICAgICB9CisgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKDEwMDAwMDAgLyBmcmFtZVJhdGUgKyAwLjUpOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworCisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNvZGUobUNvZGVjQ29udGV4dCwgJnJhd19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJ2cHggZW5jb2RlciBmYWlsZWQgdG8gZW5jb2RlIGZyYW1lIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7CisgICAgdnB4X2NvZGVjX2l0ZXJfdCBlbmNvZGVkX3BhY2tldF9pdGVyYXRvciA9IG51bGxwdHI7CisgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiBlbmNvZGVkX3BhY2tldDsKKyAgICB3aGlsZSAoKGVuY29kZWRfcGFja2V0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCAmZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IpKSkgeworICAgICAgICBpZiAoZW5jb2RlZF9wYWNrZXQtPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeiwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSh3Vmlldy5kYXRhKCksIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmJ1ZiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgICAgICAgIEFMT0dEKCJieXRlcyBnZW5lcmF0ZWQgJXp1IiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spOworICAgICAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0tFWSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUucHRzOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHBvcHVsYXRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBvcHVsYXRlZCkgeworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTFhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCitjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMHUsIDAsIDAsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJMYXllckNvdW50KS5pblJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJpdHJhdGVSYXRpb3MpLmluUmFuZ2UoMC4sIDEuKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTGF5ZXJpbmdTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKKyAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbUxheWVyaW5nOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDczMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNDb21wcmVzc01vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dD4gbURyY0VuY1RhcmdldExldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0Jvb3N0RmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0PiBtRHJjRWZmZWN0VHlwZTsKKyAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZworfTsKKworQzJTb2Z0WGFhY0RlYzo6QzJTb2Z0WGFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTXBlZ0REcmNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcihudWxscHRyKSB7Cit9CisKK0MyU29mdFhhYWNEZWM6On5DMlNvZnRYYWFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvbkluaXQoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1TYW1wRnJlcSA9IDA7CisgICAgbU51bUNoYW5uZWxzID0gMDsKKyAgICBtUGNtV2RTeiA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gMDsKKyAgICBtTnVtT3V0Qnl0ZXMgPSAwOworICAgIG1DdXJGcmFtZUluZGV4ID0gMDsKKyAgICBtQ3VyVGltZXN0YW1wID0gMDsKKyAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKworICAgIElBX0VSUk9SQ09ERSBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gSUFfTk9fRVJST1IgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKKworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvblN0b3AoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbURSQ0ZsYWcgPSAwOworICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisKKyAgICBlcnJDb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVyckNvZGUpIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGlmIChtT3V0cHV0RHJhaW5CdWZmZXIpIHsKKyAgICAgICAgZGVsZXRlW10gbU91dHB1dERyYWluQnVmZmVyOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBudWxscHRyOworICAgIH0KK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIEZhaWxlZCIpOworICAgICAgICAvKiBDYWxsIGRlSW5pdCB0byBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgICAgIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltrT3V0cHV0RHJhaW5CdWZmZXJTaXplXTsKKyAgICAgICAgaWYgKCFtT3V0cHV0RHJhaW5CdWZmZXIpIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRHJjKCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgImluaXRYQUFDRHJjIik7CisKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICBBTE9HVigibUN1ckZyYW1lSW5kZXggPSAlIiBQUkl1NjQsIG1DdXJGcmFtZUluZGV4KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGludDE2X3QqIG91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSk7CisgICAgbWVtY3B5KG91dEJ1ZmZlciwgbU91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spXSgKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG1DdXJGcmFtZUluZGV4KSkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2gobUN1ckZyYW1lSW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9CisKKyAgICBBTE9HVigib3V0IHRpbWVzdGFtcCAlIiBQUkl1NjQgIiAvICV1IiwgbUN1clRpbWVzdGFtcCwgYmxvY2stPmNhcGFjaXR5KCkpOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCogaW5CdWZmZXIgPSBudWxscHRyOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gMDsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIHNpemUgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorICAgIGlmIChzaXplICYmIHZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB2aWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbXB0eSBjb2RlYyBjb25maWciKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICBpbkJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworCisgICAgICAgIC8qIEdBIGhlYWRlciBjb25maWd1cmF0aW9uIHNlbnQgdG8gRGVjb2RlciEgKi8KKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DdXJGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgbUN1clRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIGNoYXIqIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciA9IG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB3aGlsZSAoc2l6ZSA+IDB1KSB7CisgICAgICAgIGlmICgoa091dHB1dERyYWluQnVmZmVyU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtCisgICAgICAgICAgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIDwKKyAgICAgICAgICAgIChtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gRHJhaW5CdWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImluQXR0cmlidXRlIHNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgaWYgKG1JbnRmLT5pc0FkdHMoKSkgeworICAgICAgICAgICAgQUxPR1YoIkFEVFMiKTsKKyAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFkdHNIZWFkZXIgPSB2aWV3LmRhdGEoKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9ICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZHRzSGVhZGVyWzRdIDw8IDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFhY19mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwgc2l6ZSwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gYWFjX2ZyYW1lX2xlbmd0aCAtIGFkdHNIZWFkZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTm9uIEFEVFMiKTsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBwcmV2U2FtcGxlUmF0ZSA9IG1TYW1wRnJlcTsKKyAgICAgICAgc2lnbmVkIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgLyogWEFBQyBkZWNvZGVyIGV4cGVjdHMgZmlyc3QgZnJhbWUgdG8gYmUgZmVkIHZpYSBjb25maWdYQUFDRGVjb2RlciBBUEkKKyAgICAgICAgICogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUKKyAgICAgICAgICogZGVjb2RlWEFBQ1N0cmVhbSBBUEkgd2l0aCBzYW1lIGZyYW1lIHRvIGRlY29kZSEgKi8KKyAgICAgICAgaWYgKCFtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG1TYW1wRnJlcSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAobU51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TYW1wRnJlcSwgcHJldk51bUNoYW5uZWxzLCBtTnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU2FtcEZyZXEpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBieXRlc0NvbnN1bWVkID0gMDsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycm9yQ29kZSA9IElBX05PX0VSUk9SOworICAgICAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVycm9yQ29kZSA9IGRlY29kZVhBQUNTdHJlYW0oaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNDb25zdW1lZCwgJm1OdW1PdXRCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAgICAgQUxPR1coIkFzc3VtcHRpb24gdGhhdCBmaXJzdCBmcmFtZSBhZnRlciBoZWFkZXIgaW5pdGlhbGl6ZXMgZGVjb2RlciBGYWlsZWQhIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gYnl0ZXNDb25zdW1lZDsKKyAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzQ29uc3VtZWQ7CisKKyAgICAgICAgaWYgKGluQnVmZmVyTGVuZ3RoICE9ICh1aW50MzJfdClieXRlc0NvbnN1bWVkKQorICAgICAgICAgICAgQUxPR1coIkFsbCBkYXRhIG5vdCBjb25zdW1lZCIpOworCisgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGRlY29kZXIgd291bGQgaGF2ZSBnaXZlbiBvdXQgZW1wdHkgYnVmZmVyICovCisgICAgICAgIGlmICgoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSAmJiAoMCA9PSBtTnVtT3V0Qnl0ZXMpICYmIG1Jc0NvZGVjSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBtTnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKKworICAgICAgICBpZiAoIWJ5dGVzQ29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJieXRlc0NvbnN1bWVkID0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVpbnQzMl90KW1OdW1PdXRCeXRlcyA+CisgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtTnVtT3V0Qnl0ZXMgPiBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMsIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3csIEFTQU4KKyAgICAgICAgICAgIG1lbXNldChtT3V0cHV0QnVmZmVyLCAwLCBtTnVtT3V0Qnl0ZXMpOworCisgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodGVtcE91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0QnVmZmVyLCBtTnVtT3V0Qnl0ZXMpOworICAgICAgICB0ZW1wT3V0cHV0RHJhaW5CdWZmZXIgKz0gbU51bU91dEJ5dGVzOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyArPSBtTnVtT3V0Qnl0ZXM7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKSB7CisgICAgICAgIGZpbmlzaFdvcmsod29yaywgcG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisgICAgaWYgKGVvcykgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdmbHVzaERlY29kZSgpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGU7CisgICAgdWludDMyX3QgdWlfaW5pdF9kb25lOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dWKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gY29uZmlnZmx1c2hEZWNvZGU6IEVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICB9CisgICAgfQorICAgIGRyYWluRGVjb2RlcigpOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRyYWluRGVjb2RlcigpIHsKKyAgICAvKiBPdXRwdXQgZGVsYXkgY29tcGVuc2F0aW9uIGxvZ2ljIHNob3VsZCBzaXQgaGVyZS4gKi8KKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgYXMgWEFBQyBkZWNvZGVyIGRvZXMgbm90IGludHJvZHVjZSBvdXRwdXQgYnVmZmVyIGRlbGF5ICovCisKKyAgICByZXR1cm4gMDsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRGVjb2RlcigpIHsKKyAgICAvKiBGaXJzdCBwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogRXJyb3IgSGFuZGxlciBJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBMaWJyYXJ5IE5hbWUsIExpYnJhcnkgVmVyc2lvbiBhbmQgQVBJIFZlcnNpb24gKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgKyBEZWZhdWx0IGNvbmZpZyBzZXQgICAgICovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbXMgZnJvbSB1c2VyICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEluaXRpYWxpemUgbWVtb3J5IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBHZXQgbWVtb3J5IGluZm9ybWF0aW9uIGFuZCBhbGxvY2F0ZSBtZW1vcnkgICAgICAgICovCisKKyAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIC8qIFByb2Nlc3Mgc3RydWN0IGluaXRpbmcgZW5kICovCisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlIGFuZCBzZXQgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0ICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBUEkgc2l6ZSAqLworICAgIHVpbnQzMl90IHB1aV9hcGlfc2l6ZTsKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1aV9hcGlfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKCFtWGhlYWFjQ29kZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogR2V0IHRoZSBBUEkgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobnVsbHB0ciwgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsIDAsICZwdWlfYXBpX3NpemUpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbU1wZWdERHJjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1NcGVnRERyY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9tcDRfZmxhZyA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9tcDRfZmxhZyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgTWVtb3J5IGluZm8gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplOworICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKCFwdl9hbGxvY19wdHIpIHsKKyAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBbGxvY2F0ZSBNZW1vcnkgd2l0aCBpbmZvIGZyb20gbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBtZW1vcmllcywgdGhhdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICAvKiBwZXJzaXN0ZW50LHNjcmF0Y2gsaW5wdXQgYW5kIG91dHB1dCAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCB1aV9zaXplID0gMCwgdWlfYWxpZ25tZW50ID0gMCwgdWlfdHlwZSA9IDA7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwKKyAgICAgICAgICAgICAgICAgICB1aV9zaXplICsgdWlfYWxpZ25tZW50KTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgICAgIGlmICh1aV90eXBlID09IElBX01FTVRZUEVfSU5QVVQpIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IChwV09SRDgpcHZfYWxsb2NfcHRyOworICAgICAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IHVpX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9PVVRQVVQpCisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgfQorICAgIC8qIEVuZCBmaXJzdCBwYXJ0ICovCisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIHVuc2lnbmVkIGludCB1aV9kcmNfdmFsOworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKKyAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsID0gbUludGYtPmdldERyY1RhcmdldFJlZkxldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCB0YXJnZXRSZWZMZXZlbCk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpdGFyZ2V0UmVmTGV2ZWw7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCIpOworCisgICAgLyogVXNlIHVpX2RyY192YWwgZnJvbSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgb3IgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTAorICAgICAqIGZvciBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIHRvbyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgaW50MzJfdCBhdHRlbnVhdGlvbkZhY3RvciA9IG1JbnRmLT5nZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQiLCBhdHRlbnVhdGlvbkZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYXR0ZW51YXRpb25GYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWJvb3N0RmFjdG9yOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpbnQzMl90IGNvbXByZXNzTW9kZSA9IG1JbnRmLT5nZXREcmNDb21wcmVzc01vZGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIiwgY29tcHJlc3NNb2RlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCljb21wcmVzc01vZGU7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKworICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9IG1JbnRmLT5nZXREcmNFZmZlY3RUeXBlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIE1QRUctRCBEUkMgZWZmZWN0IHR5cGUgJWQiLCBlZmZlY3RUeXBlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCllZmZlY3RUeXBlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworICAgIEFMT0dWKCJkZUluaXRYQUFDRGVjb2RlciIpOworCisgICAgLyogRXJyb3IgY29kZSAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICB9CisKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgZXJyb3IgcmV0dXJuZWQgaW4gSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1NZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HVigiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICBpZiAobUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgIC8qIElmIGNvZGVjIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZW4gR0EgaGVhZGVyIGlzIHBhc3NlZCBhZ2FpbiAqLworICAgICAgICAvKiBOZWVkIHRvIGNhbGwgdGhlIEZsdXNoIEFQSSBpbnN0ZWFkIG9mIElOSVRfUFJPQ0VTUyAqLworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7IC8qIENvZGVjIG5lZWRzIHRvIGJlIFJlaW5pdGlhbGl6ZWQgYWZ0ZXIgZmx1c2ggKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0dBX0hEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfR0FfSERSIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2VzcyAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX1BST0NFU1MiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBpbml0aWFsaXphdGlvbiAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2J5dGVzX2NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dJKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIGVycl9jb2RlID0gY29uZmlnTVBFR0REcmMoKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiY29uZmlnTVBFR0REcmMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdE1QRUdERERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQoraW50IEMyU29mdFhhYWNEZWM6OmNvbmZpZ01QRUdERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpX2VmZmVjdF90eXBlOworICAgIGludCBpX2xvdWRfbm9ybTsKKyAgICBpbnQgaV90YXJnZXRfbG91ZG5lc3M7CisgICAgdW5zaWduZWQgaW50IGlfc2JyX21vZGU7CisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplID0gMDsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHIgPSBOVUxMOworCisgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgLyogVG90YWwgTnVtYmVyIG9mIENoYW5uZWxzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworCisgICAgLypTZXQgRWZmZWN0IFR5cGUqLworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1lbXNldChwdl9hbGxvY19wdHIsIDAsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICBkZUluaXRNUEVHREREcmMoKTsKKworICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBEUkMgYnVmZmVycworICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCisgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KKyAgICB7CisgICAgICAgIFZPSUQqIHBfYXJyYXlbMl1bMTZdOworICAgICAgICBXT1JEMzIgaWk7CisgICAgICAgIFdPUkQzMiBidWZfc2l6ZXNbMl1bMTZdOworICAgICAgICBXT1JEMzIgbnVtX2VsZW1lbnRzOworICAgICAgICBXT1JEMzIgbnVtX2NvbmZpZ19leHQ7CisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisKKyAgICAgICAgV09SRDMyIHVvX251bV9jaGFuOworCisgICAgICAgIG1lbXNldChidWZfc2l6ZXMsIDAsIDMyICogc2l6ZW9mKFdPUkQzMikpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUywgJmJ1Zl9zaXplc1swXVswXSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUyIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9QVFIiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwgSUFfQ01EX1RZUEVfSU5JVF9TRVRfQlVGRl9QVFIsIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fRUxFLCAmbnVtX2VsZW1lbnRzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUiKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0NPTkZJR19FWFQsICZudW1fY29uZmlnX2V4dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCIpOworCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9jb25maWdfZXh0OyBpaSsrKSB7CisgICAgICAgICAgICAvKmNvcHkgbG91ZG5lc3MgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMF1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMF1baWldLCBidWZfc2l6ZXNbMF1baWldKTsKKworICAgICAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQsICZiaXRfc3RyX2ZtdCk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1swXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQ1BZX0lMX0JTRl9CVUZGIik7CisKKyAgICAgICAgICAgICAgICBtRFJDRmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1fZWxlbWVudHM7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBjb25maWcgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMV1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMV1baWldLCBidWZfc2l6ZXNbMV1baWldKTsKKyAgICAgICAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRFJDRmxhZyA9PSAxKSB7CisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLypSZWFkIGludGVyZmFjZSBidWZmZXIgY29uZmlnIGZpbGUgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICAgICAgV09SRDMyIGludGVyZmFjZV9pc19wcmVzZW50ID0gMTsKKworICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpX3Nicl9tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMjA0ODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlfc2JyX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFLCAoV09SRDMyICopJm1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9JTlRfUFJFU0VOVCwgJmludGVyZmFjZV9pc19wcmVzZW50KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5UIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLCBudWxscHRyKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZ1b19udW1fY2hhbik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET19FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBwcm9jZXNzaW5nICovCisgICAgdWludDMyX3QgdWlfZXhlY19kb25lOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2V4ZWNfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9leGVjX2RvbmUgIT0gMSkgeworICAgICAgICBWT0lEKiBwX2FycmF5OyAgICAgICAgLy8gSVRUSUFNOmJ1ZmZlciB0byBoYW5kbGUgZ2FpbiBwYXlsb2FkCisgICAgICAgIFdPUkQzMiBidWZfc2l6ZSA9IDA7ICAvLyBJVFRJQU06Z2FpbiBwYXlsb2FkIGxlbmd0aAorICAgICAgICBXT1JEMzIgYml0X3N0cl9mbXQgPSAxOworICAgICAgICBXT1JEMzIgZ2Fpbl9zdHJlYW1fZmxhZyA9IDE7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4sICZidWZfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19HQUlOX1BBWUxPQURfTEVOIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYsICZwX2FycmF5KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYiKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgPiAwKSB7CisgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXksIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFU19CUywgMCwgJmJ1Zl9zaXplKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0dBSU5fU1RSRUFNX0ZMQUcsICZnYWluX3N0cmVhbV9mbGFnKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIC8qIEdldCB0aGUgb3V0cHV0IGJ5dGVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCeXRlcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX09VVFBVVF9CWVRFUyIpOworCisgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICBtZW1jcHkobURyY0luQnVmLCBtT3V0cHV0QnVmZmVyLCAqb3V0Qnl0ZXMpOworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsIDAsIG91dEJ5dGVzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfRVhFQ1VURSwgSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0RPX0VYRUNVVEUiKTsKKworICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2FtcEZyZXEpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTnVtQ2hhbm5lbHMpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUENNIHdvcmQgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTUFTSyIpOworCisgICAgLyogQ2hhbm5lbCBtb2RlIHRvIHRlbGwgTU9OTy9TVEVSRU8vRFVBTC1NT05PL05PTkVfT0ZfVEhFU0UgKi8KKyAgICB1aW50MzJfdCB1aV9jaGFubmVsX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfY2hhbm5lbF9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTU9ERSIpOworICAgIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTU9OT19PUl9QU1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDEpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IFNURVJFT1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDIpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IERVQUwtTU9OT1xuIik7CisgICAgZWxzZQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBOT05FX09GX1RIRVNFIG9yIE1VTFRJQ0hBTk5FTFxuIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBTQlIgUFJFU0VOVC9OT1RfUFJFU0VOVCAqLworICAgIHVpbnQzMl90IHVpX3Nicl9tb2RlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKyAgICBpZiAodWlfc2JyX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBOT1RfUFJFU0VOVFxuIik7CisgICAgZWxzZSBpZiAodWlfc2JyX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBQUkVTRU5UXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJTQlIgTW9kZTogSUxMRUdBTFxuIik7CisKKyAgICAvKiBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyBTQlJfTU9ERSkgZm9yIEFBQyAqLworICAgIC8qIEZvciBVU0FDIGl0IGNvdWxkIGJlIDEwMjQgKiAzICwgc3VwcG9ydCB0byBxdWVyeSAgKi8KKyAgICAvKiBub3QgeWV0IGFkZGVkIGluIGNvZGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNCAqICgxICsgdWlfc2JyX21vZGUpOworICAgIEFMT0dJKCJtT3V0cHV0RnJhbWVMZW5ndGggJWQgdWlfc2JyX21vZGUgJWQiLCBtT3V0cHV0RnJhbWVMZW5ndGgsIHVpX3Nicl9tb2RlKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OnNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpbnQzMl90IHVpX2RyY19lbmFibGUgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfZW5hYmxlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSIpOworICAgIGlmIChkcmNDdXQgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsICZkcmNDdXQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworICAgIH0KKworICAgIGlmIChkcmNCb29zdCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsICZkcmNCb29zdCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisgICAgfQorCisgICAgaWYgKGRyY1JlZkxldmVsICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworICAgIH0KKworICAgIGlmIChkcmNIZWF2eUNvbXByZXNzaW9uICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0hlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisgICAgfQorCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJmRyRWZmZWN0VHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBpbnQzMl90IGlfZWZmZWN0X3R5cGUsIGlfdGFyZ2V0X2xvdWRuZXNzLCBpX2xvdWRfbm9ybTsKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIC8qU2V0IHRhcmdldCBsb3VkbmVzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLCAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjbGFzcyBDMlNvZnRYYWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFhhYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0WGFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRYYWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg1NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfWEFBQ19ERUNfSF8KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaXhoZWFhY2RfdHlwZV9kZWYuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9oYW5kbGVyLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX21lbW9yeV9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hYWNfY29uZmlnLmgiCisKKyNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKyNkZWZpbmUgTUFYX05VTV9CTE9DS1MgICAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGJsb2NrcyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LCBwVk9JRCBwdl92YWx1ZSk7CitleHRlcm4gIkMiICBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZ2V0X2NvbmZpZ19wYXJhbShwVk9JRCBwX2lhX3Byb2Nlc3NfYXBpX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfc2FtcF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9udW1fY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfcGNtX3dkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9jaGFubmVsX21hc2spOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRYYWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFhhYWNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgICAgICA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIE1BWF9OVU1fQkxPQ0tTLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQqIG1YaGVhYWNDb2RlY0hhbmRsZTsKKyAgICB2b2lkKiBtTXBlZ0REcmNIYW5kbGU7CisgICAgdWludDMyX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RnJhbWVMZW5ndGg7CisgICAgaW50OF90KiBtSW5wdXRCdWZmZXI7CisgICAgaW50OF90KiBtT3V0cHV0QnVmZmVyOworICAgIGludDMyX3QgbVNhbXBGcmVxOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVBjbVdkU3o7CisgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CisgICAgaW50MzJfdCBtTnVtT3V0Qnl0ZXM7CisgICAgdWludDY0X3QgbUN1ckZyYW1lSW5kZXg7CisgICAgdWludDY0X3QgbUN1clRpbWVzdGFtcDsKKyAgICBib29sIG1Jc0NvZGVjSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQ7CisgICAgaW50OF90KiBtRHJjSW5CdWY7CisgICAgaW50OF90KiBtRHJjT3V0QnVmOworICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKKyAgICBpbnQzMl90IG1EUkNGbGFnOworCisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudCBfX3VudXNlZDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBjaGFyKiBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgdWludDMyX3QgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3M7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0RHJjUGFyYW1ldGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCk7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgaW50IGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7CisgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY1JlZkxldmVsLCBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFhhYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX1hBQUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjM3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsiQzIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8qKgorICogVGhlcmUgaXMgbm90aGluZyBoZXJlIHlldC4gVGhpcyBsaWJyYXJ5IGlzIGJ1aWx0IHRvIHNlZSB3aGF0IHN5bWJvbHMgYW5kIG1ldGhvZHMgZ2V0CisgKiBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIEFQSSBpbmNsdWRlIGZpbGVzLgorICoKKyAqIEdvaW5nIGZvcndhcmQsIHRoZSBDb2RlYzIgbGlicmFyeSB3aWxsIGNvbnRhaW4gdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBmb3IKKyAqIENvZGVjMiBjbGllbnRzLgorICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzQ2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX0hfCisjZGVmaW5lIEMyX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvKiogbmFub3NlY29uZHMgd2l0aCBhcmJpdHJhcnkgb3JpZ2luLiAqLwordHlwZWRlZiBpbnQ2NF90IGMyX25zZWNzX3Q7CisKKy8qKiBcbWFpbnBhZ2UgQ29kZWMyCisgKgorICogQ29kZWMyIGlzIGEgZ2VuZXJpYyBmcmFtZS1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgQVBJLgorICoKKyAqIFRoZSBtZWRpYSBzdWJzeXN0ZW0gYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgorICovCisKKy8qKiBcaW5ncm91cCBBUEkKKyAqCisgKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKgorICogQ29kaW5nIENvbnZlbnRpb25zCisgKgorICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KKyAqCisgKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCisgKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKKyAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBjMl9zdGF0dXNfdCwgd2l0aCBDMl9PTUlUVEVEIG5vdCByZXF1aXJpbmcKKyAqICAgYW55IHVwZGF0ZSB0byBpbnB1dC9vdXRwdXQgYXJndW1lbnRzLgorICogLSBsaW1pdGluZyBzeW1ib2wgZXhwb3J0IG9mIGlubGluZSBtZXRob2RzCisgKiAtIHVzZSBvZiBwaW1wbCAob3Igc2hhcmVkLXBpbXBsKQorICoKKyAqIE5hbWluZworICoKKyAqIC0gYWxsIGNsYXNzZXMgYW5kIHR5cGVzIHByZWZpeCB3aXRoIEMyCisgKiAtIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBwcmVmaXggd2l0aCBfQzIKKyAqIC0gZW51bSB2YWx1ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSBwcmVmaXggd2l0aCBDMl8gYWxsIGNhcHMKKyAqIC0gZW51bSB2YWx1ZXMgaW5zaWRlIGNsYXNzZXMgaGF2ZSBubyBDMl8gcHJlZml4IGFzIGNsYXNzIGFscmVhZHkgaGFzIGl0CisgKiAtIHN1cHBvcnRpbmcgdHdvIGtpbmRzIG9mIGVudW0gbmFtaW5nOiBhbGwtY2FwcyBhbmQga0NhbWVsQ2FzZQorICogXHRvZG8gcmV2aXNpdCBrQ2FtZWxDYXNlIGZvciBwYXJhbS10eXBlCisgKgorICogQXNwZWN0cworICoKKyAqIEFzcGVjdHMgZGVmaW5lIGNlcnRhaW4gY29tbW9uIGJlaGF2aW9yIGFjcm9zcyBhIGdyb3VwIG9mIG9iamVjdHMuCisgKiAtIGNsYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIF9DMi4qQXNwZWN0CisgKiAtIG9ubHkgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworICogLSBubyBkZXNjdHJ1Y3RvciBhbmQgY29waWFibGUKKyAqIC0gYWxsIG1ldGhvZHMgYXJlIGlubGluZSBvciBzdGF0aWMgKHRoaXMgaXMgb3Bwb3NpdGUgb2YgdGhlIGludGVyZmFjZSBwYXJhZGlnbSB3aGVyZSBhbGwgbWV0aG9kcworICogICBhcmUgdmlydHVhbCwgd2hpY2ggd291bGQgbm90IHdvcmsgZHVlIHRvIHRoZSBhdCBtb3N0IG9uZSB2dGFibGUgcnVsZS4pCisgKiAtIG9ubHkgcHJpdmF0ZSB2YXJpYWJsZXMgKHRoaXMgcHJldmVudHMgc3ViY2xhc3NlcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBhc3BlY3RzLikKKyAqLworCisvLy8gXGRlZmdyb3VwIHR5cGVzIENvbW1vbiBUeXBlcworLy8vIEB7CisKKy8qKgorICogQzJTdHJpbmc6IGJhc2ljIHN0cmluZyBpbXBsZW1lbnRhdGlvbgorICovCit0eXBlZGVmIHN0ZDo6c3RyaW5nIEMyU3RyaW5nOworCisvKioKKyAqIEMyU3RyaW5nTGl0ZXJhbDogYmFzaWMgc3RyaW5nIGxpdGVyYWwgaW1wbGVtZW50YXRpb24uCisgKiBcbm90ZSB0aGVzZSBhcmUgbmV2ZXIgb3duZWQgYnkgYW55IG9iamVjdCwgYW5kIGNhbiBvbmx5IHJlZmVyIHRvIEMgc3RyaW5nIGxpdGVyYWxzLgorICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKKworLyoqCisgKiBjMl9zdGF0dXNfdDogc3RhdHVzIGNvZGVzIHVzZWQuCisgKi8KK2VudW0gYzJfc3RhdHVzX3QgOiBpbnQzMl90IHsKKy8qCisgKiBVc2UgUE9TSVggZXJybm8gY29uc3RhbnRzLgorICovCisgICAgQzJfT0sgICAgICAgID0gMCwgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisKKyAgICAvLyBiYWQgaW5wdXQKKyAgICBDMl9CQURfVkFMVUUgPSBFSU5WQUwsICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCisgICAgQzJfQkFEX0lOREVYID0gRU5YSU8sICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKKyAgICBDMl9DQU5OT1RfRE8gPSBFTk9UU1VQLCAgICAgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsaWQgYnV0IG5vdCBwb3NzaWJsZQorCisgICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCisgICAgQzJfRFVQTElDQVRFID0gRUVYSVNULCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cworICAgIEMyX05PVF9GT1VORCA9IEVOT0VOVCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCisgICAgQzJfQkFEX1NUQVRFID0gRVBFUk0sICAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCisgICAgQzJfQkxPQ0tJTkcgID0gRVdPVUxEQkxPQ0ssICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAorICAgIEMyX0NBTkNFTEVEICA9IEVJTlRSLCAgICAgICAgLy8vPCBvcGVyYXRpb24gaW50ZXJydXB0ZWQvY2FuY2VsZWQKKworICAgIC8vIGJhZCBlbnZpcm9ubWVudAorICAgIEMyX05PX01FTU9SWSA9IEVOT01FTSwgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KKyAgICBDMl9SRUZVU0VEICAgPSBFQUNDRVMsICAgICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorCisgICAgQzJfVElNRURfT1VUID0gRVRJTUVET1VULCAgICAvLy88IG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiB0aW1lb3V0CisKKyAgICAvLyBiYWQgdmVyc2lvbmluZworICAgIEMyX09NSVRURUQgICA9IEVOT1NZUywgICAgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkL3N1cHBvcnRlZCAob3B0aW9uYWwgb25seSkKKworICAgIC8vIHVua25vd24gZmF0YWwKKyAgICBDMl9DT1JSVVBURUQgPSBFRkFVTFQsICAgICAgIC8vLzwgc29tZSB1bmV4cGVjdGVkIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uCisgICAgQzJfTk9fSU5JVCAgID0gRU5PREVWLCAgICAgICAvLy88IHN0YXR1cyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKK307CisKKy8qKgorICogVHlwZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVzaXJlZCBibG9ja2luZyBiZWhhdmlvciBmb3IgdmFyaWFibGUgYmxvY2tpbmcgY2FsbHMuIEJsb2NraW5nIGluIHRoaXMKKyAqIEFQSSBpcyB1c2VkIGluIGEgc29tZXdoYXQgbW9kaWZpZWQgbWVhbmluZyBzdWNoIHRoYXQgb3BlcmF0aW9ucyB0aGF0IG1lcmVseSB1cGRhdGUgdmFyaWFibGVzCisgKiBwcm90ZWN0ZWQgYnkgbXV0ZXhlcyBhcmUgc3RpbGwgY29uc2lkZXJlZCAibm9uLWJsb2NraW5nIiAoYWx3YXlzIHVzZWQgaW4gcXVvdGVzKS4KKyAqLworZW51bSBjMl9ibG9ja2luZ190IDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBTSEFMTCBiZSAibm9uLWJsb2NraW5nIi4gVGhpcyBtZWFucyB0aGF0IGl0IHNoYWxsIG5vdCBwZXJmb3JtIGFueSBmaWxlCisgICAgICogb3BlcmF0aW9ucywgb3IgY2FsbC93YWl0IG9uIG90aGVyIHByb2Nlc3Nlcy4gSXQgbWF5IHVzZSBhIHByb3RlY3RlZCByZWdpb24gYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBtdXRleCBpcyBuZXZlciB1c2VkIHRvIHByb3RlY3QgY29kZSB0aGF0IGlzIG90aGVyd2lzZSAibWF5IGJsb2NrIi4KKyAgICAgKi8KKyAgICBDMl9ET05UX0JMT0NLID0gZmFsc2UsCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBNQVkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuCisgICAgICovCisgICAgQzJfTUFZX0JMT0NLID0gdHJ1ZSwKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcworLy8vIEB7CisKKyNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisgICAgdHlwZShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisKKyNkZWZpbmUgQzJfREVGQVVMVF9NT1ZFKHR5cGUpIFwKKyAgICB0eXBlJiBvcGVyYXRvcj0odHlwZSAmJikgPSBkZWZhdWx0OyBcCisgICAgdHlwZSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKworI2RlZmluZSBDMl9BTExPV19PVkVSRkxPVyBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyNkZWZpbmUgQzJfQ09OU1QgICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorI2RlZmluZSBDMl9ISURFICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIEMyX0lOTElORSAgIGlubGluZSBDMl9ISURFCisjZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQorI2RlZmluZSBDMl9QQUNLICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgQzJfUFVSRSAgICAgX19hdHRyaWJ1dGVfXygocHVyZSkpCisKKyNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQorCisjZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCwgbWFzaykgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyBcCisgICAgICAgIHJldHVybiAoZmllbGQgJiBtYXNrKSA8IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spID09IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKKworI2RlZmluZSBERUZJTkVfRU5VTV9PUEVSQVRPUlMoZXR5cGUpIFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfChldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSB8IHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yfD0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3ImKGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpICYgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3ImPShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvcl4oZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgXiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvcl49KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfihldHlwZSBhKSB7IHJldHVybiAoZXR5cGUpKH5zdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdDsKKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX2MyX2NudHJfY29tcGF0X2hlbHBlciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mKFUpID49IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgVCBnZXQoY29uc3QgYzJfY250cl90PFUsIHZvaWQ+ICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZS5tVmFsdWUpOworICAgIH0KK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBJbnRlZ3JhbCBjb3VudGVyIHR5cGUuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIE5FVkVSIGNoZWNrZWQgZm9yIG92ZXJmbG93L3VuZGVyZmxvdyAtIGFuZAorICogY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHJlZGVmaW5lZC4KKyAqCisgKiBcbm90ZSBDb21wYXJpc29uIG9mIGNvdW50ZXIgdHlwZXMgaXMgbm90IGZ1bGx5IHRyYW5zaXRpdmUsIGUuZy4KKyAqIGl0IGNvdWxkIGJlIHRoYXQgYSA+IGIgPiBjIGJ1dCBhICE+IGMuCisgKiBzdGQ6Omxlc3M8PiwgZ3JlYXRlcjw+LCBsZXNzX2VxdWFsPD4gYW5kIGdyZWF0ZXJfZXF1YWw8PiBzcGVjaWFsaXphdGlvbnMgeWllbGQgdG90YWwgb3JkZXJpbmcsCisgKiBidXQgbWF5IG5vdCBtYXRjaCBzZW1hbnRpYyBvcmRlcmluZyBvZiB0aGUgdmFsdWVzLgorICoKKyAqIFRlY2huaWNhbGx5OiBjb3VudGVyIHR5cGVzIHJlcHJlc2VudCBpbnRlZ2VyIHZhbHVlczogQSAqIDJeTiArIHZhbHVlLCB3aGVyZSBBIGNhbiBiZSBhcmJpdHJhcnkuCisgKiBUaGlzIG1ha2VzIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgbXVsdGlwbGljYXRpb24gKGFzIHdlbGwgYXMgYml0d2lzZSBvcGVyYXRpb25zKSB3ZWxsIGRlZmluZWQuCisgKiBIb3dldmVyLCBkaXZpc2lvbiBpcyBpbiBnZW5lcmFsIG5vdCB3ZWxsIGRlZmluZWQsIGFzIHRoZSByZXN1bHQgbWF5IGRlcGVuZCBvbiBBLiBUaGlzIGlzIGFsc28KKyAqIHRydWUgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCBib29sZWFuIGNvbnZlcnNpb24uCisgKgorICogRXZlbiB0aG91Z2ggd2VsbCBkZWZpbmVkLCBiaXR3aXNlIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIGZvciBjb3VudGVyIHR5cGVzIGFzIHRoZXkgYXJlIG5vdAorICogbWVhbmluZ2Z1bC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdCB7CisgICAgdXNpbmcgY29tcGF0ID0gX2MyX2NudHJfY29tcGF0X2hlbHBlcjxUPjsKKworICAgIFQgbVZhbHVlOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBIQUxGX1JBTkdFID0gVCh+MCkgXiAoVCh+MCkgPj4gMSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGZyaWVuZCBzdHJ1Y3QgX2MyX2NudHJfY29tcGF0X2hlbHBlcjsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemVkIGNvdW50ZXIgdG8gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdCgpIDogbVZhbHVlKFQoMCkpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIGNvbXBhdGlibGUgdHlwZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KGNvbnN0IFUgJnZhbHVlKSA6IG1WYWx1ZShjb21wYXQ6OmdldCh2YWx1ZSkpIHt9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGUgcGVlaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyB1bmRlcmx5aW5nIHVuc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBUIHBlZWt1KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGxvbmcgbG9uZyBwZWVrbGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobG9uZyBsb25nKW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuc2lnbmVkIGxvbmcgbG9uZyAtIGUuZy4gZm9yIHByaW50aW5nLgorICAgICAqLworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgcGVla3VsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gYSBzbWFsbGVyIGNvdW50ZXIgdHlwZS4gVGhpcyBpcyBhbHdheXMgc2FmZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4KKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGMyX2NudHJfdDxVPigpIHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihtVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyaXRobWV0aWMgb3BlcmF0b3JzCisgICAgICovCisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKGF0dHJpYiwgb3AsIG9wX2Fzc2lnbikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiYgb3BlcmF0b3Igb3BfYXNzaWduKGNvbnN0IFUgJnZhbHVlKSB7IFwKKyAgICAgICAgbVZhbHVlIG9wX2Fzc2lnbiBjb21wYXQ6OmdldCh2YWx1ZSk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoY29tcGF0OjpnZXQoVSgwKSkpPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGNvbnN0IFUgJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgb3AgY29tcGF0OjpnZXQodmFsdWUpKTsgXAorICAgIH0gXAorICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4gXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxVPiBvcGVyYXRvciBvcChjb25zdCBjMl9jbnRyX3Q8VT4gJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihVKG1WYWx1ZSkgb3AgdmFsdWUucGVla3UoKSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoYXR0cmliLCBvcCkgXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcCgpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG9wIG1WYWx1ZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjMl9jbnRyX3Q8VD4gJm9wZXJhdG9yIG9wKCkgeyBcCisgICAgICAgIG9wIG1WYWx1ZTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcChpbnQpIHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQsIHZvaWQ+KG1WYWx1ZSBvcCk7IFwKKyAgICB9CisKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICssICs9KQorICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgLSwgLT0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAqLCAqPSkKKworICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtKQorICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKQorCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgKyspCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgLS0pCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yPDwoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgPDwgdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3I8PD0oY29uc3QgVSAmdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlIDw8PSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG90aGVyLm1WYWx1ZSAtIG1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gVChtVmFsdWUgLSBvdGhlci5tVmFsdWUpIDwgSEFMRl9SQU5HRTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWUgPT0gb3RoZXIubVZhbHVlOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKnRoaXMgPD0gb3RoZXIgJiYgKnRoaXMgIT0gb3RoZXI7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA+PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKyhjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiArIGE7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3ItKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBjMl9jbnRyX3Q8VD4oYSkgLSBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKihjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiAqIGE7Cit9CisKK3R5cGVkZWYgYzJfY250cl90PHVpbnQzMl90PiBjMl9jbnRyMzJfdDsgLyoqIDMyLWJpdCBjb3VudGVyIHR5cGUgKi8KK3R5cGVkZWYgYzJfY250cl90PHVpbnQ2NF90PiBjMl9jbnRyNjRfdDsgLyoqIDY0LWJpdCBjb3VudGVyIHR5cGUgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBzdHJ1Y3QgYzJfdHlwZXM7CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgYSBzaW5nbGUgdHlwZSAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBjMl90eXBlczxUPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlIHdpZGVfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBtaW5fdHlwZTsgLy8gdHlwZSBmb3IgbWluKFQuLi4pCit9OworCisvKiogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB0eXBlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBjMl90eXBlczxULCBVPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJtaXhpbmcgZmxvYXRpbmcgcG9pbnQgYW5kIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPT0gc3RkOjppc19zaWduZWQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIGRlY2x0eXBlKHRydWUgPyBzdGQ6OmRlY2x2YWw8VD4oKSA6IHN0ZDo6ZGVjbHZhbDxVPigpKT46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKFQpIDwgc2l6ZW9mKFUpLCBULCBVPjo6dHlwZT46OnR5cGUgbmFycm93X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCB3aWRlX3R5cGUsIG5hcnJvd190eXBlPjo6dHlwZSBtaW5fdHlwZTsKK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcy4gT25seSBzdXBwb3J0cyBzaW1pbGFyIGNsYXNzZXMsIHN1Y2ggYXM6CisgKiAtIGFsbCBmbG9hdGluZyBwb2ludAorICogLSBhbGwgdW5zaWduZWQvYWxsIHNpZ25lZAorICogLSBhbGwgcG9pbnRlcgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorc3RydWN0IGMyX3R5cGVzPFQsIFUsIFYuLi4+IHsKKyAgICAvKiogQ29tbW9uIHR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgYWxsIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIC8qKiBOYXJyb3dlc3QgdHlwZSBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om5hcnJvd190eXBlLCBWLi4uPjo6bmFycm93X3R5cGUgbmFycm93X3R5cGU7CisgICAgLyoqIFR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpbnB1dCBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSwgVi4uLj46Om1pbl90eXBlIG1pbl90eXBlOworfTsKKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWF4IHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Citjb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSBjMl9tYXgoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeyB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21heChiLCBjLi4uKSk7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBsaXN0IG9mICJzaW1pbGFybHkgdHlwZWQiIHZhbHVlcy4KKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdGQ6Om1pbiB3aGVyZSB0aGUgdHlwZXMgZG8gbm90IGhhdmUgdG8gYmUgaWRlbnRpY2FsLCBhbmQgdGhlIHNtYWxsZXN0CisgKiByZXN1bHRpbmcgdHlwZSBpcyB1c2VkIHRoYXQgYWNjb21tb2RhdGVzIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAqCisgKiBcbm90ZSBWYWx1ZSB0eXBlcyBtdXN0IGJlIHNpbWlsYXIsIGUuZy4gYWxsIGZsb2F0aW5nIHBvaW50LCBhbGwgcG9pbnRlcnMsIGFsbCBzaWduZWQsIG9yIGFsbAorICogdW5zaWduZWQuCisgKgorICogQHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIC4uLiBjKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxVLCBWLi4uPjo6bWluX3R5cGUgcmVzdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgcmVzdF90eXBlPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhjMl9taW4oYiwgYy4uLikpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+OjptaW5fdHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOworICAgIH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlIGMyX2NsYW1wKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFY+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpLCBjXyhjKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVj46OndpZGVfdHlwZT4oYl8gPCBhXyA/IGFfIDogYl8gPiBjXyA/IGNfIDogYl8pOworICAgIH0pOworfQorCisvLy8gQH0KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzczw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPCByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzc19lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPD0gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXI8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID4gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXJfZXF1YWw8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID49IHJoLnBlZWt1KCk7CisgICAgfQorfTsKKworI2VuZGlmICAvLyBDMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKQEAgLTAsMCArMSwyMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9IXworI2RlZmluZSBDMkJVRkZFUl9IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+IC8vIGZvciBDMkluZm8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJCdWZmZXIuaD4KKyNlbHNlCisKK3R5cGVkZWYgdm9pZCogQzJIYW5kbGU7CisKKyNlbmRpZgorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlciBCdWZmZXJzCisvLy8gQHsKKworLy8vIFxkZWZncm91cCBidWZmZXJfc3luYyBTeW5jaHJvbml6YXRpb24KKy8vLyBAeworCisvKioKKyAqIFN5bmNocm9uaXphdGlvbiBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZXZlbnQgYW5kIGZlbmNlIG9iamVjdHMuCisgKgorICogVGhlc2UgYXJlIGNyb3NzLXByb2Nlc3MgZXh0ZW5zaW9ucyBvZiBwcm9taXNlL2Z1dHVyZSBpbmZyYXN0cnVjdHVyZS4KKyAqIEV2ZW50cyBhcmUgYW5hbG9nb3VzIHRvIHN0ZDo6cHJvbWlzZTx2b2lkPiwgd2hlcmVhcyBmZW5jZXMgYXJlIHRvIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPi4KKyAqCisgKiBGZW5jZXMgYW5kIGV2ZW50cyBhcmUgc2hhcmVhYmxlL2NvcHlhYmxlLgorICoKKyAqIEZlbmNlcyBhcmUgdXNlZCBpbiB0d28gc2NlbmFyaW9zLCBhbmQgYWxsIGNvcGllZCBpbnN0YW5jZXMgcmVmZXIgdG8gdGhlIHNhbWUgZXZlbnQuCisgKiBcdG9kbyBkbyBldmVudHMgbmVlZCB0byBiZSBjb3B5YWJsZSBvciBzaG91bGQgdGhleSBiZSB1bmlxdWU/CisgKgorICogYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdDogc2lnbmFsZWQgd2hlbiBpdCBpcyBzYWZlIGZvciB0aGUgY29tcG9uZW50IG9yIGNsaWVudCB0byBhY2Nlc3MKKyAqICh0aGUgY29udGVudHMgb2YpIGFuIG9iamVjdC4KKyAqCisgKiByZWxlYXNlIHN5bmMgZmVuY2Ugb2JqZWN0OiBcdG9kbworICoKKyAqIEZlbmNlcyBjYW4gYmUgYmFja2VkIGJ5IGhhcmR3YXJlLiBIYXJkd2FyZSBmZW5jZXMgYXJlIGd1YXJhbnRlZWQgdG8gc2lnbmFsIE5PIE1BVFRFUiBXSEFUIHdpdGhpbgorICogYSBzaG9ydCAocGxhdGZvcm0gc3BlY2lmaWMpIGFtb3VudCBvZiB0aW1lOyB0aGlzIGd1YXJhbnRlZSBpcyB1c3VhbGx5IGxlc3MgdGhhbiAxNSBtc2Vjcy4KKyAqLworCisvKioKKyAqIEZlbmNlIG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgd2FpdGluZyBmb3IgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdmdXR1cmUnLgorICoKKyAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHZlbmRvcnMgaWYgdXNpbmcgSFcgZmVuY2VzLgorICovCitjbGFzcyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBXYWl0cyBmb3IgYSBmZW5jZSB0byBiZSBzaWduYWxlZCB3aXRoIGEgdGltZW91dC4KKyAgICAgKgorICAgICAqIFx0b2RvIGEgbWVjaGFuaXNtIHRvIGNhbmNlbCBhIHdhaXQgLSBmb3Igbm93IHRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGlzIHRvIGFiYW5kb24gdGhlCisgICAgICogZXZlbnQsIGJ1dCBmZW5jZXMgYXJlIHNoYXJlZCBzbyBjYW5jZWxpbmcgYSB3YWl0IHdpbGwgY2FuY2VsIGFsbCB3YWl0cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0aW1lb3V0TnMgICAgICAgICAgIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBuc2VjcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgZmVuY2UgaGFzIG5vdCBiZWVuIHNpZ25hbGVkIHdpdGhpbiB0aGUgdGltZW91dAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGFzIGJlZW4gYWJhbmRvbmVkIHdpdGhvdXQgYmVpbmcgc2lnbmFsZWQgKGl0IHdpbGwgbmV2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2lnbmFsZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gd2FpdCBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHdhaXRpbmcgZm9yIHRoZSBmZW5jZSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBpcyB2YWxpZCAoaWYgdGhlcmUgaXMgYSBjaGFuY2UgZm9yIGl0IHRvIGJlIHNpZ25hbGVkLikKKyAgICAgKiBBIGZlbmNlIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgY29udHJvbGluZyBldmVudCBpcyBkZXN0cm95ZWQgd2l0aG91dCBpdCBzaWduYWxpbmcgdGhlIGZlbmNlLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBib29sIHZhbGlkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQgKGlzIHJlYWR5KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICovCisgICAgYm9vbCByZWFkeSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoaXMgZmVuY2UgaW4gYSBzZWxlY3Qgc3lzdGVtIGNhbGwuCisgICAgICogXG5vdGUgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciwgaWYgdmFsaWQsIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGUuZy4gcG9sbCgpIHN5c3RlbSBjYWxscy4gVGhpcyBmaWxlIGJlY29tZXMgcmVhZGFibGUgKFBPTExJTikgd2hlbiB0aGUKKyAgICAgKiBmZW5jZSBpcyBzaWduYWxlZCwgYW5kIGJhZCAoUE9MTEVSUikgaWYgdGhlIGZlbmNlIGlzIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgZmVuY2UgKHdpdGggb3duZXJzaGlwKSwgb3IgLTEgaWYgdGhlIGZlbmNlCisgICAgICogaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoXHRvZG8gb3IgYWJhbmRvbmVkKS4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggZmVuY2VzIHVzZWQgYnkgZ3JhbGxvYworICAgICAqLworICAgIGludCBmZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgYSBoYXJkd2FyZS1iYWNrZWQgZmVuY2UuCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkd2FyZSBmZW5jZQorICAgICAqLworICAgIGJvb2wgaXNIVygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogTnVsbC1mZW5jZS4gQSBmZW5jZSB0aGF0IGhhcyBmaXJlZC4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJGZW5jZSgpIDogbUltcGwobnVsbHB0cikgeyB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgQzJGZW5jZShzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZnJpZW5kIHN0cnVjdCBfQzJGZW5jZUZhY3Rvcnk7Cit9OworCisvKioKKyAqIEV2ZW50IG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgc2lnbmFsaW5nIG9mIGFuIGV2ZW50LCBhbmFsb2dvdXMgdG8gYSAncHJvbWlzZScuCisgKgorICogSGFyZHdhcmUgYmFja2VkIGV2ZW50cyBkbyBub3QgZ28gdGhyb3VnaCB0aGlzIG9iamVjdCwgYW5kIG11c3QgYmUgZXhwb3NlZCBkaXJlY3RseSBhcyBmZW5jZXMKKyAqIGJ5IHZlbmRvcnMuCisgKi8KK2NsYXNzIEMyRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmZW5jZSBmb3IgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIChhbGwpIGFzc29jaWF0ZWQgZmVuY2UocykuCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBzaWduYWwgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHNpZ25hbGluZyB0aGUgZmVuY2UocykgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmlyZSgpOworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGlzIGV2ZW50IGZyb20gdGhlIG1lcmdpbmcgb2YgdGhlIHN1cHBsaWVkIGZlbmNlcy4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgKiBhYmFuZG9uZWQgaWYgYW55IG9mIHRoZXNlIGZlbmNlcyBoYXZlIGJlZW4gYWJhbmRvbmVkLCBhbmQgaXQgd2lsbCBiZSBmaXJlZCBpZiBhbGwgb2YgdGhlc2UKKyAgICAgKiBmZW5jZXMgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBtZXJnaW5nIHdhcyBzdWNjZXNzZnVsbHkgZG9uZQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBtZXJnaW5nCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZSBoYXZlIGFscmVhZHkgYmVlbiBtZXJnZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIGFiYW5kb25lZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIG1lcmdlIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBtZXJnaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBtZXJnZShzdGQ6OnZlY3RvcjxDMkZlbmNlPiBmZW5jZXMpOworCisgICAgLyoqCisgICAgICogQWJhbmRvbnMgdGhlIGV2ZW50IGFuZCBhbnkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBcbm90ZSBDYWxsIHRoaXMgdG8gZXhwbGljaXRseSBhYmFuZG9uIGFuIGV2ZW50IGJlZm9yZSBpdCBpcyBkZXN0cnVjdGVkIHRvIGF2b2lkIGEgd2FybmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgaGFzIG5vIGVmZmVjdCBubyBlZmZlY3QgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNpZ25hbGVkIG9yIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2Uocykgd2VyZSBzdWNjZXNzZnVsbHkgc2lnbmFsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlKHMpIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gYWJhbmRvbiB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgYnVmX2ludGVybmFsIEludGVybmFsCisvLy8gQHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBlbmNhcHN1bGF0ZSBhbiB1cGRhdGFibGUgc3RhdHVzIHZhbHVlLgorICovCitzdHJ1Y3QgX0MySW5uYXRlU3RhdHVzIHsKKyAgICBpbmxpbmUgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcm90ZWN0ZWQ6CisgICAgX0MySW5uYXRlU3RhdHVzKGMyX3N0YXR1c190IHN0YXR1cykgOiBtU3RhdHVzKHN0YXR1cykgeyB9CisKKyAgICBjMl9zdGF0dXNfdCBtU3RhdHVzOyAvLyB0aGlzIHN0YXR1cyBpcyB1cGRhdGFibGUgYnkgdGhlIG9iamVjdAorfTsKKworLy8vIEB9CisKKy8qKgorICogVGhpcyBpcyBhIHV0aWxpdHkgdGVtcGxhdGUgZm9yIG9iamVjdHMgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UsIHNvIHRoYXQgZXJyb3JzIGR1cmluZworICogYWNxdWlyaW5nIHRoZSBvYmplY3QgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkFjcXVpcmFibGUgOiBwdWJsaWMgQzJGZW5jZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIG9iamVjdCBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZS4gQW55IGVycm9ycyBkdXJpbmcgdGhlIG1hcHBpbmcgd2lsbCBiZQorICAgICAqIHBhc3NlZCB0byB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogXHJldHVybiBhY3F1aXJlZCBvYmplY3QgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgaWYgd2FpdGluZyBmb3IgdGhlIGZlbmNlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBUIGdldCgpIHsKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gd2FpdCgpOworICAgICAgICByZXR1cm4gbVQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJBY3F1aXJhYmxlKGMyX3N0YXR1c190IGVycm9yLCBDMkZlbmNlIGZlbmNlLCBUIHQpIDogQzJGZW5jZShmZW5jZSksIG1Jbml0aWFsRXJyb3IoZXJyb3IpLCBtVCh0KSB7IH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdGlhbEVycm9yOworICAgIFQgbVQ7IC8vIFRPRE86IG1vdmUgaW5zdGVhZCBvZiBjb3B5Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBsaW5lYXIgTGluZWFyIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIExJTkVBUiBBU1BFQ1RTLCBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNpYyBzZWdtZW50IG1hdGggc3VwcG9ydC4KKyAqLworc3RydWN0IEMyU2VnbWVudCB7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHNpemU7CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCh1aW50MzJfdCBvZmZzZXRfLCB1aW50MzJfdCBzaXplXykKKyAgICAgICAgOiBvZmZzZXQob2Zmc2V0XyksCisgICAgICAgICAgc2l6ZShzaXplXykgeworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IH5zaXplOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiAhaXNFbXB0eSgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhYm9vbCgqdGhpcyk7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgY29udGFpbnMoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoIWlzVmFsaWQoKSB8fCAhb3RoZXIuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IG90aGVyLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgKyBzaXplID49IG90aGVyLm9mZnNldCArIG90aGVyLnNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPT0gb3RoZXIub2Zmc2V0ICYmIHNpemUgPT0gb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcikgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIHNpemU7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBpbnRlcnNlY3QoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGVuZCgpLCBvdGhlci5lbmQoKSkgLSBjMl9tYXgob2Zmc2V0LCBvdGhlci5vZmZzZXQpKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBvZmZzZXQgaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG9mZnNldCwgYzJfbWF4KG9mZnNldCwgZW5kKCkpIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBtYXggaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgc2F0dXJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9taW4oc2l6ZSwgfm9mZnNldCkpOworICAgIH0KKworfTsKKworLyoqCisgKiBDb21tb24gYXNwZWN0IGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKi8KK2NsYXNzIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBMaW5lYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIEMyU2VnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudCgwLCBtQ2FwYWNpdHkpOworICAgIH0KKworcHJvdGVjdGVkOgorCisjaWYgVUlOVFBUUl9NQVggPT0gMHhmZmZmZmZmZgorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSwgInNpemVfdCBpcyB0b28gYmlnIik7CisjZWxzZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBzbWFsbCIpOworICAgIC8vIGV4cGxpY2l0bHkgZGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBzaXplX3QKKyAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Qoc2l6ZV90IGNhcGFjaXR5KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgIDogbUNhcGFjaXR5KGNhcGFjaXR5KSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBjb25zdGV4cHIgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBtQ2FwYWNpdHkocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FwYWNpdHk7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciByYW5nZSBpbnNpZGUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldCArIG1TaXplOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG1PZmZzZXQsIG1TaXplKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gc3VicmFuZ2Ugb2YgY2FwYWNpdHkgWzAsIGNhcGFjaXR5XSAmIFtzaXplLCBzaXplICsgb2Zmc2V0XQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QodWludDMyX3QgY2FwYWNpdHlfLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjYXBhY2l0eV8pLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIChubyBlcnJvciBjaGVjaykKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZvdGhlcikKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChvdGhlci5jYXBhY2l0eSgpKSwKKyAgICAgICAgICBtT2Zmc2V0KG90aGVyLm9mZnNldCgpKSwKKyAgICAgICAgICBtU2l6ZShvdGhlci5zaXplKCkpIHsKKyAgICB9CisKKyAgICAvLyBwYXJlbnQgY2FwYWNpdHkgcmFuZ2UgWzAsIGNhcGFjaXR5XQorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoMCksCisgICAgICAgICAgbVNpemUoY2FwYWNpdHkoKSkgeworICAgIH0KKworICAgIC8vIHN1YnJhbmdlIG9mIHBhcmVudCBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKKyAgICAvLyBzdWJzZWN0aW9uIG9mIHRoZSBwYXJlbnQncyBhbmQgW29mZnNldCwgb2Zmc2V0ICsgc2l6ZV0gcmFuZ2VzCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKGMyX21heChvZmZzZXQsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+b2Zmc2V0KCkpLCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoc3RkOjptaW4oYzJfbWluKHNpemUsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+c2l6ZSgpKSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpKSB7CisgICAgfQorCitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCBjaGlsZFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgKKyAgICAgICAgICAgIG1TaXplLAorICAgICAgICAgICAgYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSAtIG1PZmZzZXQsCisgICAgICAgICAgICBjMl9taW4oYzJfbWluKHNpemUsIG1TaXplKSwgY2FwYWNpdHkoKSAtIGMyX21pbihjMl9tYXgob2Zmc2V0LCBtT2Zmc2V0KSwgY2FwYWNpdHkoKSkpKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdDsKKyAgICAvLyBpbnZhcmlhbnRzIDAgPD0gbU9mZnNldCA8PSBtT2Zmc2V0ICsgbVNpemUgPD0gY2FwYWNpdHkoKQorICAgIHVpbnQzMl90IG1PZmZzZXQ7CisgICAgdWludDMyX3QgbVNpemU7CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyTGluZWFyUmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmcGFyZW50LCBvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UgaW50ZXJzZWN0KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIGNhcGFjaXR5IGFuZCByYW5nZSBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyTGluZWFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJMaW5lYXJDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpCisgICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKGNhcGFjaXR5LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSByYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYW4gZWRpdGFibGUgbGluZWFyIHJhbmdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgIHVzaW5nIF9DMkxpbmVhclJhbmdlQXNwZWN0OjpfQzJMaW5lYXJSYW5nZUFzcGVjdDsKKworcHVibGljOgorLy8vIFxuYW1lIEVkaXRhYmxlIGxpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb2Zmc2V0IHRvIHxvZmZzZXR8LCB3aGlsZSB0cnlpbmcgdG8ga2VlcCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdW5jaGFuZ2VkIChlLmcuCisgICAgICogc2l6ZSB3aWxsIGdyb3cgaWYgb2Zmc2V0IGlzIGRlY3JlYXNlZCwgYW5kIG1heSBzaHJpbmsgaWYgb2Zmc2V0IGlzIGluY3JlYXNlZC4pIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gaWYgMCA8PSB8b2Zmc2V0fCA8PSBjYXBhY2l0eSgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPiBtT2Zmc2V0ICsgbVNpemUpIHsKKyAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaXplID0gbU9mZnNldCArIG1TaXplIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0bworICAgICAqIGlmIDAgPD0gfHNpemV8IDw9IGNhcGFjaXR5KCkgLSBvZmZzZXQoKS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQorICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRTaXplKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIC0gbU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRPZmZzZXQoKSBleGNlcHQgdGhhdCBvZmZzZXQgd2lsbAorICAgICAqIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCisgICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0T2Zmc2V0X2JlKHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICAodm9pZClzZXRPZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8IHdpdGggYmVzdCBlZmZvcnQuIFNhbWUgYXMgc2V0U2l6ZSgpIGV4Y2VwdCB0aGF0IHRoZSBzZWxlY3RlZCByZWdpb24KKyAgICAgKiB3aWxsIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eSAoZS5nLiBzaXplIGlzIGNsYW1wZWQgdG8gWzAsIGNhcGFjaXR5KCkgLSBvZmZzZXQoKV0pLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplX2JlKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgbVNpemUgPSBjMl9taW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpOworICAgIH0KKy8vLyBAfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEFMTE9DQVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxpbmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiAgQWxsb2NhdG9ycyBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFsbG9jYXRlIG1lbW9yeSAoYWxsb2NhdGlvbnMpIGZvciBidWZmZXJzLiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIDFEIG9yIDJEIGFsbG9jYXRpb25zLgorICoKKyAqICBcbm90ZSBJbiB0aGVvcnkgdGhleSBjb3VsZCBzdXBwb3J0IGJvdGgsIGJ1dCBpbiBwcmFjdGljZSwgd2Ugd2lsbCB1c2Ugb25seSBvbmUgb3IgdGhlIG90aGVyLgorICoKKyAqICBOZXZlciBjb25zdHJ1Y3RlZCBvbiBzdGFjay4KKyAqCisgKiAgQWxsb2NhdG9ycyBhcmUgcHJvdmlkZWQgYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRvciBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgaWRfdDsKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIEJBRF9JRCA9IDB4QkFERCwgLy8gaW52YWxpZCBhbGxvY2F0b3IgSUQKKyAgICB9OworCisgICAgLyoqCisgICAgICogQWxsb2NhdGlvbiB0eXBlcy4gVGhpcyBpcyBhIGJpdG1hc2sgYW5kIGlzIHVzZWQgaW4gQzJBbGxvY2F0b3I6OkluZm8KKyAgICAgKiB0byBsaXN0IHRoZSBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcyBvZiBhbiBhbGxvY2F0b3IuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIExJTkVBUiAgPSAxIDw8IDAsIC8vCisgICAgICAgIEdSQVBISUMgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGFuIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEFsbG9jYXRvcnMgZG9uJ3QgaGF2ZSBhIHF1ZXJ5IEFQSSBzbyBhbGwgcXVlcmlhYmxlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlLgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAgICBDMlN0cmluZyBuYW1lOyAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgbmFtZQorICAgICAgICBpZF90IGlkOyAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgSUQKKyAgICAgICAgdHlwZV90IHN1cHBvcnRlZFR5cGVzOyAgICAgIC8vLzwgc3VwcG9ydGVkIGFsbG9jYXRpb24gdHlwZXMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5pbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtaW5pbWFsbHkgcmVxdWlyZWQgZm9yIGFsbG9jYXRpb25zCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4aW11bVVzYWdlOyAvLy88IHVzYWdlIHRoYXQgaXMgbWF4aW1hbGx5IGFsbG93ZWQgZm9yIGFsbG9jYXRpb25zCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBhbGxvY2F0b3IgZnJvbSB0aGUKKyAgICAgKiBhbGxvY2F0b3Igc3RvcmUsIGFuZCB0byBpZGVudGlmeSB0aGlzIGFsbG9jYXRvciBhY3Jvc3MgYWxsIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuCisgICAgICovCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIHRyYWl0cy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgZnVsbC1mbGVkZ2VkIHF1ZXJ5IEFQSSwgb25seSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYWxsb2NhdG9yIGluZm9ybWF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSAxRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICogc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgIHRoZSBzaXplIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDFEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSB8aGFuZGxlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkCisgICAgICogaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLiBPbiBzdWNjZXNzLCB0aGUgYWxsb2NhdGlvbiB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRha2Ugb3duZXJzaGlwIG9mIHxoYW5kbGV8LgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHJlY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSByZWNyZWF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDJEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFRoaXMgY291bGQgYmUgYSB2ZW5kb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBhbGxvY2F0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDJEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSBoYW5kbGUuICBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjcmVhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK3Byb3RlY3RlZDoKKyAgICBDMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogXGluZ3JvdXAgbGluZWFyIGFsbG9jYXRvcgorICogMUQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbiBzdGFydGluZyBmcm9tIHxvZmZzZXR8IHdpdGggfHNpemV8IGludG8gbG9jYWwgcHJvY2VzcyBtZW1vcnkuCisgICAgICogU3RvcmVzIHRoZSBzdGFydGluZyBhZGRyZXNzIGludG8gfGFkZHJ8LCBvciBOVUxMIGlmIHRoZSBvcGVyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKiB8ZmVuY2V8IHdpbGwgY29udGFpbiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5CisgICAgICogc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGNvbnRhaW4gYW4gZW1wdHkgKGFscmVhZHkgZmlyZWQpIGZlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgICAgICAgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHBvcnRpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwYWdlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBwYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb3J0aW9uIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKgorICAgICAqIFx0b2RvIE9ubHkgb25lIHBvcnRpb24gY2FuIGJlIG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lIC0gdGhpcyBpcyB0cnVlIGZvciBncmFsbG9jLCBidXQgdGhlcmUKKyAgICAgKiAgICAgICBpcyBubyBuZWVkIGZvciB0aGlzIGZvciAxRCBidWZmZXJzLgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW5jIG9wZXJhdGlvbiBhcyB3ZSBjb3VsZCBqdXN0IHdhaXQgZm9yIHRoZSBmZW5jZT8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgaWYgdGhlIGFsbG9jYXRpb24gaXMgYWxyZWFkeSBtYXBwZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChvZmZzZXQvc2l6ZSkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovLAorICAgICAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxzaXplfC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgbWFwcGVkIHJlZ2lvbgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyB1bm1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhIHJlbGVhc2UgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eSBmZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIFRoaXMgZmVuY2Ugc2lnbmFscyB3aGVuIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGNvbnRhaW5zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCB0byB0aGUgbWFwcGVkIHJlZ2lvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdGlvbiB3YXMgbm90IG1hcHBlZCBwcmV2aW91c2x5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChhZGRyL3NpemUpIGRvIG5vdCBjb3JyZXNwb25kIHRvIHByZXZpb3VzbHkgbWFwcGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgcG9ydGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gXHRvZG8gc2hvdWxkIHdlIGxpbWl0IGFsbG9jYXRpb24gZGlyZWN0bHk/CisgICAgQzJMaW5lYXJBbGxvY2F0aW9uKHNpemVfdCBjYXBhY2l0eSkgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIFVJTlQzMl9NQVgpKSB7fQorICAgIHZpcnR1YWwgfkMyTGluZWFyQWxsb2NhdGlvbigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ2lyY3VsYXJCbG9jazsKK2NsYXNzIEMyTGluZWFyQmxvY2s7CitjbGFzcyBDMkdyYXBoaWNCbG9jazsKKworLyoqCisgKiAgQmxvY2sgcG9vbHMgYXJlIHVzZWQgYnkgY29tcG9uZW50cyB0byBvYnRhaW4gb3V0cHV0IGJ1ZmZlcnMgaW4gYW4gZWZmaWNpZW50IHdheS4gVGhleSBjYW4KKyAqICBzdXBwb3J0IGVpdGhlciBsaW5lYXIgKDFEKSwgY2lyY3VsYXIgKDFEKSBvciBncmFwaGljICgyRCkgYmxvY2tzLgorICoKKyAqICBCbG9jayBwb29scyBkZWNvdXBsZSB0aGUgcmVjeWNsaW5nIG9mIG1lbW9yeS9hbGxvY2F0aW9ucyBmcm9tIHRoZSBjb21wb25lbnRzLiBUaGV5IGFyZSBtZWFudCB0bworICogIGJlIGFuIG9wYXF1ZSBzZXJ2aWNlICh0aGVyZSBhcmUgbm8gcHVibGljIEFQSXMgb3RoZXIgdGhhbiBvYnRhaW5pbmcgYmxvY2tzKSBwcm92aWRlZCBieSB0aGUKKyAqICBwbGF0Zm9ybS4gQmxvY2sgcG9vbHMgYXJlIGFsc28gbWVhbnQgdG8gZGVjb3VwbGUgYWxsb2NhdGlvbnMgZnJvbSBtZW1vcnkgdXNlZCBieSBidWZmZXJzLiBUaGlzCisgKiAgaXMgYWNjb21wbGlzaGVkIGJ5IGFsbG93aW5nIHBvb2xzIHRvIGFsbG90IG11bHRpcGxlIG1lbW9yeSAnYmxvY2tzJyBvbiBhIHNpbmdsZSBhbGxvY2F0aW9uLiBBcworICogIHRoZWlyIG5hbWUgc3VnZ2VzdCwgYmxvY2sgcG9vbHMgbWFpbnRhaW4gYSBwb29sIG9mIG1lbW9yeSBibG9ja3MuIFdoZW4gYSBjb21wb25lbnQgYXNrcyBmb3IKKyAqICBhIG1lbW9yeSBibG9jaywgcG9vbHMgd2lsbCB0cnkgdG8gcmV0dXJuIGEgZnJlZSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBpbiB0aGUgcG9vbC4gSWYgbm8gc3VjaAorICogIGJsb2NrIGV4aXN0cywgdGhleSB3aWxsIGFsbG9jYXRlIG1lbW9yeSB1c2luZyB0aGUgYmFja2luZyBhbGxvY2F0b3IgYW5kIGFsbG90IGEgYmxvY2sgb24gdGhhdAorICogIGFsbG9jYXRpb24uIFdoZW4gYmxvY2tzIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgc3lzdGVtLCB0aGV5IGFyZSByZWN5Y2xlZCBiYWNrIHRvIHRoZSBibG9jaworICogIHBvb2wgYW5kIGFyZSBhdmFpbGFibGUgYXMgZnJlZSBibG9ja3MuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICovCitjbGFzcyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmxvY2sgcG9vbCBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDY0X3QgbG9jYWxfaWRfdDsKKworICAgIGVudW0gOiBsb2NhbF9pZF90IHsKKyAgICAgICAgQkFTSUNfTElORUFSID0gMCwgIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAxRCBibG9ja3MKKyAgICAgICAgQkFTSUNfR1JBUEhJQyA9IDEsIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAyRCBibG9ja3MKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhpcyBibG9jayBwb29sLiBUaGlzIElEIGlzIHVzZWQgdG8gZ2V0IHRoaXMgYmxvY2sgcG9vbCBmcm9tIHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBsb2NhbCBJRCBmb3IgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGxpbmVhciB3cml0ZWFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlCisgICAgICogYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wuIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBibG9jay4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGNpcmN1bGFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGNpcmN1bGFyIGJsb2NrLiAobm90ZTogdGhlIHNpemUgb2YgdGhlIG9idGFpbmVkCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLiB0byBhY2NvbW1vZGF0ZSBhbnkgc3lzdGVtLXJlcXVpcmVkCisgICAgICogICAgICAgICAgICAgICAgIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4KKyAgICAgKiAgICAgICAgICAgICAgIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYmxvY2suIFRoaXMgY291bGQgYmUgYSB2ZW5kb3Igc3BlY2lmaWMgZm9ybWF0LgorICAgICAqIFxwYXJhbSB1c2FnZSAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CisgICAgICogICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IDJEIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworfTsKKworLy8vIEB9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJMT0NLUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorICogQmxvY2tzIGFyZSBzZWN0aW9ucyBvZiBhbGxvY2F0aW9ucy4gVGhleSBjYW4gYmUgZWl0aGVyIDFEIG9yIDJELgorICovCisKK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDFEIGJsb2NrLgorICoKKyAqIFxub3RlIGNhcGFjaXR5KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCBzaXplKCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZQorICogdXNhYmxlIHBvcnRpb24uIFVzZSBhbmQgb2Zmc2V0KCkgYW5kIHNpemUoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrIGRpcmVjdGx5IHRocm91Z2ggaXRzIGhhbmRsZQorICogdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIHRvIHRoaXMgYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2sxRCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBoYW5kbGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIHRoYXQgdGhlIGJsb2NrIGFuZCBpdHMgYmxvY2sgcG9vbCBoYXMgc2hhcmVkIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlCisgICAgICogICAgICAgYW5kIGlmIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBibG9jayBhcmUgcmVsZWFzZWQsIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgICAgICogICAgICAgYWxsb2NhdGlvbiBtYXkgZ2V0IHJldXNlZCBldmVuIGlmIGEgY2xpZW50IGtlZXBzIGEgY2xvbmUgb2YgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgdGhhdCBjcmVhdGVkIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gZm9yIHRoaXMgYmxvY2suIFRoaXMKKyAgICAgKiBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaGFuZGxlLgorICAgICAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIC8qKiBjb25zdHJ1Y3QgYSBibG9jay4gKi8KKyAgICBDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIFJlYWQgdmlldyBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBDMlJlYWRWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgIHZpZXcuCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIEMyUmVhZFZpZXcgc3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24vbWFwcGluZyBvZiB0aGlzIHZpZXcuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoaXMgdmlldy4gVGhpcyBzZXRzIGVycm9yIHRvIEMyX05PX0lOSVQuCisgICAgICovCisgICAgLy92b2lkIHJlbGVhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKKyAgICBleHBsaWNpdCBDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgdWludDMyX3QgbU9mZnNldDsgLyoqPCBvZmZzZXQgaW50byB0aGUgbGluZWFyIGJsb2NrIGJhY2tpbmcgdGhpcyByZWFkIHZpZXcgKi8KK307CisKKy8qKgorICogV3JpdGUgdmlldyBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4gXHRvZG8gbW92YWJsZSBvbmx5PworICovCitjbGFzcyBDMldyaXRlVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBibG9jayBhdCB0aGUgY3VycmVudCBvZmZzZXQgb3IgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgKiAgICAgICAgIFRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhpcyB2aWV3IG9yIHVudGlsIGl0IGlzIHJlbGVhc2VkLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZXhwbGljaXQgQzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBsaW5lYXIgYmxvY2sgKHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbikgd2l0aCBhbiBhY3F1aXJlIGZlbmNlLgorICogQmxvY2tzIGFyZSB1bm1hcHBlZCB3aGVuIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbWFwcGVkIGludG8gYSByZWFkIHZpZXcgb24gZGVtYW5kLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUgYW5kIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0aW9uIHRoYXQgaXQgaXMgYmFzZWQgb24uCisgKi8KK2NsYXNzIEMyQ29uc3RMaW5lYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgYmxvY2suCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGluZWFyIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc3ViQmxvY2soc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmb3IgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmZW5jZSB0aGF0IG11c3QgYmUgd2FpdGVkIG9uIGJlZm9yZSByZWFkaW5nIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3QgeyByZXR1cm4gbUZlbmNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBtRmVuY2UpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIEMyRmVuY2UgbUZlbmNlOworfTsKKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaXMgYSB3cml0ZWFibGUgMUQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0cyB3aXRoCisgKiBjb25zdW1lcnMvcmVhZGVycyBhcyByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrKHMpLgorICovCitjbGFzcyBDMkxpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdExpbmVhckJsb2NrIHNoYXJlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworcHJvdGVjdGVkOgorICAgIEMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ0lSQ1VMQVIgQkxPQ0tTIEFORCBWSUVXUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLyBcZGVmZ3JvdXAgY2lyY3VsYXIgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQKKy8vLyBAeworCisvKioKKyAqIENpcmN1bGFyIGJsb2NrcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gYSB3cml0ZXIgYW5kIGEgcmVhZGVyIChhbmQvb3Igb3RoZXIgY29uc3VtZXJzKS0KKyAqIGluIGEgbWVtb3J5LWVmZmljaWVudCB3YXkgYnkgcmV1c2luZyBhIHNlY3Rpb24gb2YgbWVtb3J5LiBDaXJjdWxhciBibG9ja3MgYXJlIGEgYml0IG1vcmUgY29tcGxleAorICogdGhhbiBzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgc2NoZW1lcyB0byBmYWNpbGl0YXRlIGJsb2NrLWJhc2VkIGNvbnN1bWluZyBvZiBkYXRhLgorICoKKyAqIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOgorICoKKyAqIDEpIG9uZSB3cml0ZXIgdGhhdCBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZCAodGhpcyBtb2RlbCBjYW4gYmUgdXNlZCBieSBjb21wb25lbnRzKQorICoKKyAqIDIpIG9uZSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGludW91c2x5LCBhbmQgb25lIHJlYWRlciB0aGF0IGNhbiBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZAorICogICAgYnkgZnVydGhlciByZWNpcGllbnRzICh0aGlzIG1vZGVsIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGNhbm5vdCBiZSB1c2VkIGJ5IGNvbXBvbmVudHMuKQorICoKKyAqIENpcmN1bGFyIGJsb2NrcyBoYXZlIGZvdXIgc2VnbWVudHMgd2l0aCBydW5uaW5nIHBvaW50ZXJzOgorICogIC0gcmVzZXJ2ZWQ6IGRhdGEgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdGhlIHdyaXRlcgorICogIC0gY29tbWl0dGVkOiBkYXRhIGNvbW1pdHRlZCBieSB0aGUgd3JpdGVyIGFuZCBhdmFpbGFibGUgdG8gdGhlIHJlYWRlciAoaWYgcHJlc2VudCkKKyAqICAtIHVzZWQ6IGRhdGEgdXNlZCBieSBjb25zdW1lcnMgKGlmIHByZXNlbnQpCisgKiAgLSBhdmFpbGFibGU6IHVudXNlZCBkYXRhIGF2YWlsYWJsZSB0byBiZSByZXNlcnZlZAorICovCitjbGFzcyBDMkNpcmN1bGFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKKyAgICAvLyBUT0RPOiBhZGQgbWV0aG9kcworCitwcml2YXRlOgorICAgIHNpemVfdCBtUmVzZXJ2ZWQgX191bnVzZWQ7ICAgLy8gZW5kIG9mIHJlc2VydmVkIHNlY3Rpb24KKyAgICBzaXplX3QgbUNvbW1pdHRlZCBfX3VudXNlZDsgIC8vIGVuZCBvZiBjb21taXR0ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtVXNlZCBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIHVzZWQgc2VjdGlvbgorICAgIHNpemVfdCBtRnJlZSBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIGZyZWUgc2VjdGlvbgorfTsKKworY2xhc3MgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50CisgICAgICovCisgICAgc2l6ZV90IGF2YWlsYWJsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciB0aGlzIHNlZ21lbnQgZnJvbSBpdHMgY3VycmVudCBzdGFydC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIGRlc2lyZWQgc3BhY2UgaW4gYnl0ZXMKKyAgICAgKiBccGFyYW0gZmVuY2UgICBhIHBvaW50ZXIgdG8gYW4gYWNxdWlyZSBmZW5jZS4gSWYgbm9uLW51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBhc3luY2hyb25vdXMgYW5kCisgICAgICogICAgICAgICAgICAgIGEgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSB0aGF0IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiB0aGUgcmVzZXJ2YXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgICAgY29tcGxldGUuIElmIG51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgc3BhY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICB0aGUgc3BhY2UgcmVxdWVzdGVkIGNhbm5vdCBiZSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgcmVzZXJ2YXRpb24gdGltZWQgb3V0IFx0b2RvIHdoZW4/CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXJ2aW5nIHNwYWNlLiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZXNlcnZlKHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50LiBUaGlzIHdpbGwgbW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWJhbmRvbgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYWJhbmRvbmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGFiYW5kb25pbmcgdGhlIGRhdGEgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgYWJhbmRvbihzaXplX3Qgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTaGFyZSBhIHBvcnRpb24gYXMgYmxvY2socykgd2l0aCBjb25zdW1lcnMgKHRoZXNlIGFyZSBtb3ZlZCB0byB0aGUgdXNlZCBzZWN0aW9uKS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICogXG5vdGUgU2hhcmUgZG9lcyBub3QgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LiAoXHRvZG8gYWRkIGFiYW5kb24vb2Zmc2V0PykKKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBzaGFyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWN0aW9uCisgICAgICogXHBhcmFtIGJsb2NrcyAgdmVjdG9yIHdoZXJlIHRoZSBibG9ja3Mgb2YgdGhlIHNlY3Rpb24gYXJlIGFwcGVuZGVkIHRvCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHBvcnRpb24gd2FzIHN1Y2Nlc3NmdWxseSBzaGFyZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gc2hhcmUgdGhlIHBvcnRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2hhcmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzaGFyZShzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSwgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlZ2lubmluZyBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgYmVnaW4oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVuZCBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgZW5kKCk7Cit9OworCisvKioKKyAqIEEgY2lyY3VsYXIgd3JpdGUtdmlldyBpcyBhIGR5bmFtaWMgbWFwcGVkIHZpZXcgZm9yIGEgc2VnbWVudCBvZiBhIGNpcmN1bGFyIGJsb2NrLiBDYXJlIG11c3QgYmUKKyAqIHRha2VuIHdoZW4gdXNpbmcgdGhpcyB2aWV3IHNvIHRoYXQgb25seSB0aGUgc2VjdGlvbiBvd25lZCBieSB0aGUgc2VnbWVudCBpcyBtb2RpZmllZC4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrLgorICAgICAqIFxub3RlIHRoZSBzZWdtZW50IGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmJhc2UoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworfTsKKworLyoqCisgKiBUaGUgd3JpdGVyIG9mIGEgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIENhbiBjb21taXQgZGF0YSB0byBhIHJlYWRlciAobm90IHN1cHBvcnRlZCBmb3IgY29tcG9uZW50cykgT1Igc2hhcmUgZGF0YSBibG9ja3MgZGlyZWN0bHkgd2l0aCBhCisgKiBjb25zdW1lci4KKyAqCisgKiBJZiBhIGNvbXBvbmVudCBzdXBwb3J0cyBvdXRwdXR0aW5nIGRhdGEgaW50byBjaXJjdWxhciBidWZmZXJzLCBpdCBtdXN0IGFsbG9jYXRlIGEgY2lyY3VsYXIKKyAqIGJsb2NrIGFuZCB1c2UgYSBjaXJjdWxhciB3cml0ZXIuCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJXcml0ZXIgOiBwdWJsaWMgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbW1pdHMgYSBwb3J0aW9uIG9mIHRoaXMgc2VnbWVudCB0byB0aGUgbmV4dCBzZWdtZW50LiBUaGlzIG1vdmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBjb21taXQgdG8gdGhlIG5leHQgc2VnbWVudAorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHVzZWQgZm9yIHRoZSBjb21taXQgKHRoZSBmZW5jZSBtdXN0IHNpZ25hbCBiZWZvcmUgdGhlIGRhdGEgaXMgY29tbWl0dGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGNvbW1pdChzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMkNpcmN1bGFyV3JpdGVWaWV3PiBtYXAoKTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGdyYXBoaWMgR3JhcGhpYyBEYXRhIEJsb2NrcworLy8vIEB7CisKKy8qKgorICogQzJSZWN0OiByZWN0YW5nbGUgdHlwZSB3aXRoIG5vbi1uZWdhdGl2ZSBjb29yZGluYXRlcy4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KKyAqLworc3RydWN0IEMyUmVjdCB7CisvLyBwdWJsaWM6CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QoKQorICAgICAgICA6IEMyUmVjdCgwLCAwLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiBDMlJlY3Qod2lkdGhfLCBoZWlnaHRfLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBDMlJlY3QgaW5saW5lIGF0KHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3Qod2lkdGgsIGhlaWdodCwgbGVmdF8sIHRvcF8pOworICAgIH0KKworICAgIC8vIHV0aWxpdHkgbWV0aG9kcworCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8PSB+d2lkdGggJiYgdG9wIDw9IH5oZWlnaHQ7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0IDw9IG90aGVyLmxlZnQgJiYgdG9wIDw9IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiBsZWZ0ICsgd2lkdGggPj0gb3RoZXIubGVmdCArIG90aGVyLndpZHRoCisgICAgICAgICAgICAgICAgICAgICYmIHRvcCArIGhlaWdodCA+PSBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IG90aGVyLmxlZnQgJiYgdG9wID09IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiB3aWR0aCA9PSBvdGhlci53aWR0aCAmJiBoZWlnaHQgPT0gb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgcmlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkdGg7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGJvdHRvbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRvcCArIGhlaWdodDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGludGVyc2VjdChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWluKHJpZ2h0KCksIG90aGVyLnJpZ2h0KCkpIC0gYzJfbWF4KGxlZnQsIG90aGVyLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpIC0gYzJfbWF4KHRvcCwgb3RoZXIudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWF4KHRvcCwgb3RoZXIudG9wKSk7CisgICAgfQorCisgICAgLyoqIGNsYW1wcyByaWdodCBhbmQgYm90dG9tIHRvIHRvcCwgbGVmdCBpZiB0aGV5IG92ZXJmbG93ICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3Qgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KGMyX21heChsZWZ0LCByaWdodCgpKSAtIGxlZnQsIGMyX21heCh0b3AsIGJvdHRvbSgpKSAtIHRvcCwgbGVmdCwgdG9wKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIG5vdGU6IHBvdGVudGlhbGx5IHVudXN1YWwgYXJndW1lbnQgb3JkZXIKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCh1aW50MzJfdCB3aWR0aF8sIHVpbnQzMl90IGhlaWdodF8sIHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksCisgICAgICAgICAgaGVpZ2h0KGhlaWdodF8pLAorICAgICAgICAgIGxlZnQobGVmdF8pLAorICAgICAgICAgIHRvcCh0b3BfKSB7IH0KK307CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHdpZHRoIGFuZCBoZWlnaHQgKHBsYW5hciBjYXBhY2l0eSkuCisgKi8KK2NsYXNzIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX21XaWR0aDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gX21IZWlnaHQ7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJSZWN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KF9tV2lkdGgsIF9tSGVpZ2h0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCisgICAgICA6IF9tV2lkdGgod2lkdGgpLCBfbUhlaWdodChoZWlnaHQpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9tV2lkdGgocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT53aWR0aCgpKSwKKyAgICAgICAgICBfbUhlaWdodChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmhlaWdodCgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBfbVdpZHRoOworICAgIHVpbnQzMl90IF9tSGVpZ2h0OworLy8vIEB9Cit9OworCisvKioKKyAqIEMyUGxhbmVJbmZvOiBpbmZvcm1hdGlvbiBvbiB0aGUgbGF5b3V0IG9mIGEgc2luZ2UgZmxleGlibGUgcGxhbmUuCisgKgorICogUHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4KKyAqLworc3RydWN0IEMyUGxhbmVJbmZvIHsKKy8vcHVibGljOgorICAgIGVudW0gY2hhbm5lbF90IDogdWludDMyX3QgeworICAgICAgICBDSEFOTkVMX1ksICAvLy88IGx1bWEKKyAgICAgICAgQ0hBTk5FTF9SLCAgLy8vPCByZWQKKyAgICAgICAgQ0hBTk5FTF9HLCAgLy8vPCBncmVlbgorICAgICAgICBDSEFOTkVMX0IsICAvLy88IGJsdWUKKyAgICAgICAgQ0hBTk5FTF9BLCAgLy8vPCBhbHBoYQorICAgICAgICBDSEFOTkVMX0NSLCAvLy88IENyCisgICAgICAgIENIQU5ORUxfQ0IsIC8vLzwgQ2IKKyAgICB9IGNoYW5uZWw7CisKKyAgICBpbnQzMl90IGNvbEluYzsgICAgICAgLy8vPCBjb2x1bW4gaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKyAgICBpbnQzMl90IHJvd0luYzsgICAgICAgLy8vPCByb3cgaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKworICAgIHVpbnQzMl90IGNvbFNhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIHdpZHRoIChtdXN0IGJlIGEgcG93ZXIgb2YgMikKKyAgICB1aW50MzJfdCByb3dTYW1wbGluZzsgLy8vPCBzdWJzYW1wbGluZyBjb21wYXJlZCB0byBoZWlnaHQgKG11c3QgYmUgYSBwb3dlciBvZiAyKQorCisgICAgdWludDMyX3QgYWxsb2NhdGVkRGVwdGg7IC8vLzwgc2l6ZSBvZiBlYWNoIHNhbXBsZSAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDgpCisgICAgdWludDMyX3QgYml0RGVwdGg7ICAgICAgIC8vLzwgc2lnbmlmaWNhbnQgYml0cyBwZXIgc2FtcGxlCisgICAgLyoqCisgICAgICogdGhlIHJpZ2h0IHNoaWZ0IG9mIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBzYW1wbGUuIEUuZy4gaWYgYSAxMC1iaXQgc2lnbmlmaWNhbnQKKyAgICAgKiB2YWx1ZSBpcyBsYWlkIG91dCBpbiBhIDE2LWJpdCBhbGxvY2F0aW9uIGFsaWduZWQgdG8gTFNCICh2YWx1ZXMgMC0xMDIzKSwgcmlnaHRTaGlmdAorICAgICAqIHdvdWxkIGJlIDAgYXMgdGhlIDE2LWJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIHNhbXBsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJpZ2h0IHNoaWZ0ZWQKKyAgICAgKiBhbmQgY2FuIGJlIHVzZWQgYXMgaXMgKGFmdGVyIGFwcGx5aW5nIGEgMTAtYml0IG1hc2sgb2YgMHgzRkYpLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHwgICAgICBWVnxWVlZWVlZWVnwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICoKKyAgICAgKiBJZiB0aGUgdmFsdWUgaXMgbGFpZCBvdXQgYWxpZ25lZCB0byBNU0IsIHJpZ2h0U2hpZnQgd291bGQgYmUgNiwgYXMgdGhlIHZhbHVlIHJlYWQKKyAgICAgKiBmcm9tIHRoZSBhbGxvY2F0ZWQgc2FtcGxlIG11c3QgYmUgcmlnaHQtc2hpZnRlZCBieSA2IHRvIGdldCB0aGUgYWN0dWFsIHNhbXBsZSB2YWx1ZS4KKyAgICAgKgorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiB8VlZWVlZWVlZ8VlYgICAgICB8CisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqICAxNSAgICAgOCA3ICAgICAgMAorICAgICAqLworICAgIHVpbnQzMl90IHJpZ2h0U2hpZnQ7CisKKyAgICBlbnVtIGVuZGlhbm5lc3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTkFUSVZFLAorICAgICAgICBMSVRUTEVfRU5ELCAvLyBMSVRUTEVfRU5ESUFOIGlzIHJlc2VydmVkIG1hY3JvCisgICAgICAgIEJJR19FTkQsICAgIC8vIEJJR19FTkRJQU4gaXMgYSByZXNlcnZlZCBtYWNybworICAgIH0gZW5kaWFubmVzczsgLy8vPCBlbmRpYW5uZXNzIG9mIHRoZSBzYW1wbGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgZGVmaW5lIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBsYW5lcy4gSWYgbXVsdGlwbGUgcGxhbmVzIGFyZQorICAgICAqIGludGVybGVhdmVkLCB0aGV5IHNoYXJlIGEgcm9vdCBwbGFuZSAod2hpY2hldmVyIHBsYW5lJ3Mgc3RhcnQgYWRkcmVzcyBpcyB0aGUgbG93ZXN0KSwgYW5kCisgICAgICogfG9mZnNldHwgaXMgdGhlIG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSB0aGUgcm9vdCBwbGFuZSAoaW4gYnl0ZXMpLiB8cm9vdEl4fCBpcyB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUgcm9vdCBwbGFuZS4gSWYgYSBwbGFuZSBpcyBpbmRlcGVuZGVudCwgcm9vdEl4IGlzIGl0cyBpbmRleCBhbmQgb2Zmc2V0IGlzIDAuCisgICAgICovCisgICAgdWludDMyX3Qgcm9vdEl4OyAvLy88IGluZGV4IG9mIHRoZSByb290IHBsYW5lCisgICAgdWludDMyX3Qgb2Zmc2V0OyAvLy88IG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSBvZiB0aGUgcm9vdCBwbGFuZQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBzc2l6ZV90IG1pbk9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgICAgIHNzaXplX3Qgb2ZmcyA9IDA7CisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgY29sSW5jIDwgMCkgeworICAgICAgICAgICAgb2ZmcyArPSBjb2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiByb3dJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IHJvd0luYyAqIChzc2l6ZV90KShoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2ZmczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWF4T2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gKGFsbG9jYXRlZERlcHRoICsgNykgPj4gMzsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPiAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KK30gQzJfUEFDSzsKKworc3RydWN0IEMyUGxhbmFyTGF5b3V0IHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAorICAgICAgICBUWVBFX1lVViA9IDB4MTAwLCAgIC8vLzwgWVVWIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9ZVVZBLCAgICAgICAgICAvLy88IFlVVkEgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgICAgICBUWVBFX1JHQiwgICAgICAgICAgIC8vLzwgUkdCIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9SR0JBLCAgICAgICAgICAvLy88IFJCR0EgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHR5cGUKKyAgICB1aW50MzJfdCBudW1QbGFuZXM7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb21wb25lbnQgcGxhbmVzCisgICAgdWludDMyX3Qgcm9vdFBsYW5lczsgICAgICAgICAgICAvLyBudW1iZXIgb2YgbGF5b3V0IHBsYW5lcyAocm9vdCBwbGFuZXMpCisKKyAgICBlbnVtIHBsYW5lX2luZGV4X3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBMQU5FX1kgPSAwLAorICAgICAgICBQTEFORV9VID0gMSwKKyAgICAgICAgUExBTkVfViA9IDIsCisgICAgICAgIFBMQU5FX1IgPSAwLAorICAgICAgICBQTEFORV9HID0gMSwKKyAgICAgICAgUExBTkVfQiA9IDIsCisgICAgICAgIFBMQU5FX0EgPSAzLAorICAgICAgICBNQVhfTlVNX1BMQU5FUyA9IDQsCisgICAgfTsKKworICAgIEMyUGxhbmVJbmZvIHBsYW5lc1tNQVhfTlVNX1BMQU5FU107Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7Citwcml2YXRlOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Qod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgbUNyb3AoQzJSZWN0KHN0ZDo6bWluKHdpZHRoIC0gc3RkOjptaW4oY3JvcC5sZWZ0LCB3aWR0aCksIGNyb3Aud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihoZWlnaHQgLSBzdGQ6Om1pbihjcm9wLnRvcCwgaGVpZ2h0KSwgY3JvcC5oZWlnaHQpKS5hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmhlaWdodCwgaGVpZ2h0KSkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjaGlsZCBwbGFuYXIgc2VjdGlvbiBmb3IgfGNyb3B8LCB3aGVyZSB0aGUgY2FwYWNpdHkgcmVwcmVzZW50cyB0aGlzIHNlY3Rpb24uCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IGNoaWxkU2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoCisgICAgICAgICAgICAgICAgbUNyb3Aud2lkdGgsIG1Dcm9wLmhlaWdodCwKKyAgICAgICAgICAgICAgICAvLyBjcm9wIGFuZCB0cmFuc2xhdGUgfGNyb3B8IHJlY3QKKyAgICAgICAgICAgICAgICBDMlJlY3QoYzJfbWluKG1Dcm9wLnJpZ2h0KCkgLSBjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihtQ3JvcC5ib3R0b20oKSAtIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAuYXQoYzJfY2xhbXAobUNyb3AubGVmdCwgY3JvcC5sZWZ0LCBtQ3JvcC5yaWdodCgpKSAtIG1Dcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSAtIG1Dcm9wLnRvcCkpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksIG1Dcm9wKHdpZHRoKCksIGhlaWdodCgpKSB7fQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1Dcm9wKHBhcmVudCA9PSBudWxscHRyID8gQzJSZWN0KCkgOiAoKEMyUmVjdCkqcGFyZW50KS5pbnRlcnNlY3QoY3JvcCkubm9ybWFsaXplKCkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6IHBhcmVudC0+Y3JvcCgpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdDsKKyAgICBDMlJlY3QgbUNyb3A7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgc2VjdGlvbiBpbnRlcmZhY2UKKy8vLyBAeworICAgIHVzaW5nIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q6Ol9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q7CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqICBTZXRzIGNyb3AgdG8gY3JvcCBpbnRlcnNlY3RlZCB3aXRoIFsoMCwwKSAuLiAod2lkdGgsIGhlaWdodCldCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0Q3JvcF9iZShjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICAgICAgbUNyb3AubGVmdCA9IHN0ZDo6bWluKHdpZHRoKCksIGNyb3AubGVmdCk7CisgICAgICAgIG1Dcm9wLnRvcCA9IHN0ZDo6bWluKGhlaWdodCgpLCBjcm9wLnRvcCk7CisgICAgICAgIC8vIEl0J3MgZ3VhcmFudGVlZCB0aGF0IG1Dcm9wLmxlZnQgPD0gd2lkdGgoKSAmJiBtQ3JvcC50b3AgPD0gaGVpZ2h0KCkKKyAgICAgICAgbUNyb3Aud2lkdGggPSBzdGQ6Om1pbih3aWR0aCgpIC0gbUNyb3AubGVmdCwgY3JvcC53aWR0aCk7CisgICAgICAgIG1Dcm9wLmhlaWdodCA9IHN0ZDo6bWluKGhlaWdodCgpIC0gbUNyb3AudG9wLCBjcm9wLmhlaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QsIGl0IHNldHMgY3JvcCB0byBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRDcm9wKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBpZiAod2lkdGgoKSA8IGNyb3Aud2lkdGggfHwgaGVpZ2h0KCkgPCBjcm9wLmhlaWdodAorICAgICAgICAgICAgICAgIHx8IHdpZHRoKCkgLSBjcm9wLndpZHRoIDwgY3JvcC5sZWZ0IHx8IGhlaWdodCgpIC0gY3JvcC5oZWlnaHQgPCBjcm9wLnRvcCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Dcm9wID0gY3JvcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorLy8vIEB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNhZmUgcmFuZ2UgY2FsY3VsYXRpb25zIHVzaW5nIHNpemVfdC1zLgorICovCitjbGFzcyBDMlBsYW5hclNlY3Rpb24gOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24oY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KCZwYXJlbnQsIGNyb3ApIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJQbGFuYXJTZWN0aW9uKCp0aGlzLCBjcm9wKTsKKyAgICB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNpbXBsZSBhbmQgc2FmZSBwbGFuYXIgY2FwYWNpdHkgYW5kIHNlY3Rpb24gY29uc3RydWN0aW9uLgorICovCitjbGFzcyBDMlBsYW5hckNhcGFjaXR5IDogcHVibGljIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIGV4cGxpY2l0IEMyUGxhbmFyQ2FwYWNpdHkoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGMyX21pbih3aWR0aCwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oaGVpZ2h0LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uIHNlY3Rpb24oY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKworLyoqCisgKiBcaW5ncm91cCBncmFwaGljIGFsbG9jYXRvcgorICogMkQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyR3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgYSByZWN0YW5ndWxhciBzZWN0aW9uIChhcyBkZWZpbmVkIGJ5IHxyZWN0fCkgb2YgYSAyRCBhbGxvY2F0aW9uIGludG8gbG9jYWwgcHJvY2VzcworICAgICAqIG1lbW9yeSBmb3IgZmxleGlibGUgYWNjZXNzLiBPbiBzdWNjZXNzLCBpdCBmaWxscyBvdXQgfGxheW91dHwgd2l0aCB0aGUgcGxhbmUgc3BlY2lmaWNhdGlvbnMKKyAgICAgKiBhbmQgZmlsbHMgdGhlIHxhZGRyfCBhcnJheSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiBlYWNoCisgICAgICogcGxhbmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCBsZWF2ZXMgfGxheW91dHwgYW5kIHxhZGRyfCB1bnRvdWNoZWQuIHxmZW5jZXwgd2lsbCBjb250YWluCisgICAgICogYW4gYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdC4gSWYgaXQgaXMgYWxyZWFkeSBzYWZlIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBidWZmZXIgY29udGVudHMsIHRoZW4gaXQgd2lsbCBiZSBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBTYWZlIHJlZ2lvbnMgZm9yIHRoZSBwb2ludGVyIGFkZHJlc3NlcyByZXR1cm5lZCBjYW4gYmUgZ290dGVuIHZpYSBDMkxheW91dEluZm8ubWluT2Zmc2V0KCkvCisgICAgICogbWF4T2Zmc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICAgICAgICBzZWN0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyBtYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYW5kIGFjcXVpcmUgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZlbmNlIG9uIGZhaWx1cmUuIElmIG51bGwsIHRoZSBtYXBwaW5nIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICogXHBhcmFtIGxheW91dCAgICAgICAgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBtYXBwZWQgcGxhbmVzJyBkZXNjcmlwdG9ycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiBPbiBmYWlsdXJlLCBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUuCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLiBPbmx5IGxheW91dC5udW1QbGFuZXMgZWxlbWVudHMgd2lsbCBiZSBtb2RpZmllZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBzZWN0aW9uCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlcmUgaXMgYWxyZWFkeSBhIG1hcHBlZCByZWdpb24gYW5kIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG11bHRpLW1hcHBpbmcgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAocmVjdCkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFVubWFwcyBhIHNlY3Rpb24gb2YgYW4gYWxsb2NhdGlvbiBhdCB8YWRkcnwgd2l0aCB8cmVjdHwuIFRoZXNlIG11c3QgYmUgcGFyYW1ldGVycyBwcmV2aW91c2x5CisgICAgICogcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB8bWFwfDsgb3RoZXJ3aXNlLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorICAgICAqCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgbWFwcGVkIGxheWVycworICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIGJvdW5kYXJpZXMgb2YgdGhlIG1hcHBlZCBzZWN0aW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgc2VjdGlvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGVyZSBpcyBubyBzdWNoIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gdW5tYXAgdGhlIHNlY3Rpb24gKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHVzaW5nIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OjpfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdDsKKyAgICB2aXJ0dWFsIH5DMkdyYXBoaWNBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDJEIGJsb2NrLgorICoKKyAqIFxub3RlIHdpZHRoKCkvaGVpZ2h0KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCwgY3JvcCgpLndpZHRoKCkgYW5kCisgKiBjcm9wKCkuaGVpZ2h0KCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZSB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBjcm9wKCkgaWYgYWNjZXNzaW5nIHRoZSBibG9jaworICogZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlIHRvIHJlcHJlc2VudCB0aGUgYWxsb3R0ZWQgcmVnaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcworICogYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2syRCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogR3JhcGhpYyB2aWV3IHByb3ZpZGVzIHJlYWQgb3IgcmVhZC13cml0ZSBhY2Nlc3MgZm9yIGEgZ3JhcGhpYyBibG9jay4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICoKKyAqIFxub3RlIER1ZSB0byB0aGUgc3Vic2FtcGxpbmcgb2YgZ3JhcGhpYyBidWZmZXJzLCBhIHJlYWQgdmlldyBtdXN0IHN0aWxsIGNvbnRhaW4gYSBjcm9wIHJlY3RhbmdsZQorICogdG8gZW5zdXJlIHN1YnNhbXBsaW5nIGlzIGZvbGxvd2VkLiBUaGlzIHJlc3VsdHMgaW4gbmVhcmx5IGlkZW50aWNhbCBpbnRlcmZhY2UgYmV0d2VlbiByZWFkIGFuZAorICogd3JpdGUgdmlld3MsIHNvIEMyR3JhcGhpY1ZpZXcgY2FuIGVuY29tcGFzcyBib3RoIG9mIHRoZW0uCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXcgOiBwdWJsaWMgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGxheW91dCBvZiB0aGUgZ3JhcGhpYyBibG9jayB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3Agb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbiBvZiB0aGlzIHZpZXcKKyAgICAgKi8KKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKyAgICBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKyAgICBleHBsaWNpdCBDMkdyYXBoaWNWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgZ3JhcGhpYyBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdEdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCByZWN0YW5nbGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBncmFwaGljIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaXMgYSB3cml0ZWFibGUgMkQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBncmFwaGljIGJsb2NrLgorICovCitjbGFzcyBDMkdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJHcmFwaGljQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBidWZmZXJfb25qIEJ1ZmZlciBvYmplY3RzCisvLy8gQHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQlVGRkVSUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBcdG9kbzogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzPworLy8vCisvLyBUaGVyZSBhcmUgMiBraW5kcyBvZiBidWZmZXJzOiBsaW5lYXIgb3IgZ3JhcGhpYy4gTGluZWFyIGJ1ZmZlcnMgY2FuIGNvbnRhaW4gYSBzaW5nbGUgYmxvY2ssIG9yCisvLyBhIGxpc3Qgb2YgYmxvY2tzIChMSU5FQVJfQ0hVTktTKS4gU3VwcG9ydCBmb3IgbGlzdCBvZiBibG9ja3MgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYWxsb3cgY29uc3VtaW5nCisvLyBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVycyBvciBzY2F0dGVyZWQgZGF0YSBzb3VyY2VzIHdpdGhvdXQgZXh0cmEgbWVtY3B5LiBDdXJyZW50bHksIGxpc3Qgb2YKKy8vIGdyYXBoaWMgYmxvY2tzIGlzIG5vdCBzdXBwb3J0ZWQuCisKK2NsYXNzIEMyTGluZWFyQnVmZmVyOyAgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkdyYXBoaWNCdWZmZXI7ICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgorY2xhc3MgQzJMaW5lYXJDaHVua3NCdWZmZXI7CisKKy8qKgorICogQzJCdWZmZXJEYXRhOiB0aGUgbWFpbiwgbm9uLW1ldGEgZGF0YSBvZiBhIGJ1ZmZlci4gQSBidWZmZXIgY2FuIGNvbnRhaW4gZWl0aGVyIGxpbmVhciBibG9ja3MKKyAqIG9yIGdyYXBoaWMgYmxvY2tzLCBhbmQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgc2luZ2xlIGJsb2NrIG9yIG11bHRpcGxlIGJsb2Nrcy4gVGhpcyBpcyBkZXRlcm1pbmVkCisgKiBieSBpdHMgdHlwZS4KKyAqLworY2xhc3MgQzJCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgVGhlIHR5cGUgb2YgYnVmZmVyIGRhdGEuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIElOVkFMSUQsICAgICAgICAgICAgLy8vPCBpbnZhbGlkIGJ1ZmZlciB0eXBlLiBEbyBub3QgdXNlLgorICAgICAgICBMSU5FQVIsICAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBsaW5lYXIgYmxvY2sKKyAgICAgICAgTElORUFSX0NIVU5LUywgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgbGluZWFyIGJsb2NrcworICAgICAgICBHUkFQSElDLCAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBncmFwaGljIGJsb2NrCisgICAgICAgIEdSQVBISUNfQ0hVTktTLCAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvZiBtb3JlIGdyYXBoaWMgYmxvY2tzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgorICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGxpbmVhciBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7Cit9OworCisvKioKKyAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAorICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCisgKgorICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCisgKi8KK2NsYXNzIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworCisgICAgLy8vQG5hbWUgUHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uIGhhbmRsaW5nCisgICAgLy8vQHsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24ganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqT25EZXN0cm95Tm90aWZ5KSAoY29uc3QgQzJCdWZmZXIgKmJ1Ziwgdm9pZCAqYXJnKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBmb3IgYSBwcmUtZGVzdHJveSBub3RpZmljYXRpb24uIFRoaXMgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gdGhlIGRlc3RydWN0aW9uIG9mCisgICAgICogdGhpcyBidWZmZXIgKHdoZW4gdGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlZ2lzdGVyIGZvciB0aGlzIGNhbGxiYWNrCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHVucmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBub3RpZmljYXRpb24gd2FzIG5vdCBmb3VuZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGFuIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWdpc3RyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8vL0B9CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIC8vL0BuYW1lIEJ1ZmZlci1zcGVjaWZpYyBhcmJpdHJhcnkgbWV0YWRhdGEgaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBpbmZvIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2hlcyAob3IgdXBkYXRlcykgYW4gKGV4aXN0aW5nKSBtZXRhZGF0YSBmb3IgdGhpcyBidWZmZXIuCisgICAgICogSWYgdGhlIG1ldGFkYXRhIGlzIHN0cmVhbSBzcGVjaWZpYywgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZm8gTWV0YWRhdGEgdG8gdXBkYXRlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgbWV0YWRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZC91cGRhdGVkLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGF0dGFjaCB0aGUgbWV0YWRhdGEgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaWYgdGhlIHNhbWUga2luZCBvZiBtZXRhZGF0YSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBidWZmZXIpLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgY2VydGFpbiB0eXBlIG9mIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgaXMgYSBtZXRhZGF0YSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIsIGFuZCByZXR1cm5zIGEKKyAgICAgKiBzaGFyZWQgcG9pbnRlciB0byBpdCBpZiB0aGVyZSBpcy4gUmV0dXJucyBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlciBvYmplY3QgKG51bGxwdHIpIGlmIHRoZXJlCisgICAgICogaXMgbm90LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEgZnJvbSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCk7CisgICAgLy8vQH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBsaW5lYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBncmFwaGljIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKTsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KKyAqCisgKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgorICovCitjbGFzcyBDMkluZm9CdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgaW5mbyBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCisgICAgICovCisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7Cit9OworCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0JBU0VfSF8KKyNkZWZpbmUgQzJCVUZGRVJfQkFTRV9IXworCisvLy8gXGRlZmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworLyoqCisgKiBCdWZmZXIvbWVtb3J5IHVzYWdlIGJpdHMuIFRoZXNlIHNoYWxsIGJlIHVzZWQgYnkgdGhlIGFsbG9jYXRvcnMgdG8gc2VsZWN0IG9wdGltYWwgbWVtb3J5IHR5cGUvCisgKiBwb29sIGFuZCBidWZmZXIgbGF5b3V0LiBVc2FnZSBiaXRzIGFyZSBjb25jZXB0dWFsbHkgc2VwYXJhdGVkIGludG8gcmVhZCBhbmQgd3JpdGUgdXNhZ2UsIHdoaWxlCisgKiB0aGUgYnVmZmVyIHVzZSBsaWZlLWN5Y2xlIGlzIHNlcGFyYXRlZCBpbnRvIHByb2R1Y2VycyAod3JpdGVycykgYW5kIGNvbnN1bWVycyAocmVhZGVycykuCisgKiBUaGVzZSB0d28gY29uY2VwdHMgYXJlIHJlbGF0ZWQgYnV0IG5vdCBlcXVpdmFsZW50OiBjb25zdW1lcnMgbWF5IG9ubHkgcmVhZCBidWZmZXJzIGFuZCBvbmx5CisgKiBwcm9kdWNlcnMgbWF5IHdyaXRlIHRvIGJ1ZmZlcnM7IG5vdGUsIGhvd2V2ZXIsIHRoYXQgYnVmZmVyIHByb2R1Y2VycyBtYXkgYWxzbyB3YW50IG9yIG5lZWQgdG8KKyAqIHJlYWQgdGhlIGJ1ZmZlcnMuCisgKgorICogUmVhZCBhbmQgd3JpdGUgYnVmZmVyIHVzYWdlIGJpdHMgc2hhbGwgYmUgb3ItZWQgdG8gYXJyaXZlIGF0IHRoZSBmdWxsIGJ1ZmZlciB1c2FnZS4gQWRtaXR0ZWRseSwKKyAqIHRoaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIGFtb3VudCBvZiByZWFkaW5nIGFuZCB3cml0aW5nIChlLmcuIGEgYnVmZmVyIG1heSBoYXZlIG9uZSBvciBtb3JlCisgKiByZWFkZXJzKTsgaG93ZXZlciwgdGhlIHByb3BlciBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcHJvcGVybHkgd2VpZ2ggdGhlIHZhcmlvdXMgdXNhZ2VzIHdvdWxkIGJlCisgKiB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZC93cml0dGVuIGZvciBlYWNoIHVzYWdlIHR5cGUuIFRoaXMgd291bGQgcmVzdWx0IGluIGFuIGludGVnZXIgYXJyYXkgb2YKKyAqIHNpemUgNjQgKG9yIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNhZ2VzKSBmb3IgbWVtb3J5IHVzYWdlLCBhbmQgbGlrZWx5IHN1Y2ggZGV0YWlsZWQgaW5mb3JtYXRpb24KKyAqIHdvdWxkIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgorICoKKyAqIFRoYXQgcGxhdGZvcm0tYWdub3N0aWMgQ29kZWMgMi4wIEFQSSBvbmx5IGRlZmluZXMgdGhlIGJhcmUgbWluaW11bSB1c2FnZXMuIFBsYXRmb3JtcyBzaGFsbCBkZWZpbmUKKyAqIHVzYWdlIGJpdHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwbGF0Zm9ybS4KKyAqLworc3RydWN0IEMyTWVtb3J5VXNhZ2UgeworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIEJ1ZmZlciByZWFkIHVzYWdlLgorICAgICAqLworICAgIGVudW0gcmVhZF90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHJlYWQgYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1JFQUQgICAgICAgID0gMSA8PCAwLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgcmVhZCBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlIGlzCisgICAgICAgICAqIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHJlYWRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgYWNjZXNzIG11c3QgYmUKKyAgICAgICAgICogcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUkVBRF9QUk9URUNURUQgID0gMSA8PCAxLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgd3JpdGUgdXNhZ2UuCisgICAgICovCisgICAgZW51bSB3cml0ZV90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHdyaXR0ZWQgdG8gYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1dSSVRFICAgICAgICA9IDEgPDwgMiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBzaGFsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gYnkgdHJ1c3RlZCBoYXJkd2FyZS4gVGhlIGRlZmluaXRpb24gb2YgdHJ1c3RlZCBoYXJkd2FyZQorICAgICAgICAgKiBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgYnV0IHRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byBwcmV2ZW50IG1hcHBpbmcgdGhpcyBibG9jayBpbnRvIENQVQorICAgICAgICAgKiB3cml0YWJsZSBtZW1vcnkgcmVzdWx0aW5nIGluIGJ1cyBmYXVsdC4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIHdoZW4gYnVmZmVyIGludGVncml0eSBtdXN0CisgICAgICAgICAqIGJlIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgPSAxIDw8IDMsCisgICAgfTsKKworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgdXNhZ2UgYml0cyByZXNlcnZlZCBmb3IgdGhlIHBsYXRmb3JtLiBXZSBkb24ndCBzZXBhcmF0ZWx5IHJlc2VydmUgcmVhZCBhbmQKKyAgICAgICAgICogd3JpdGUgdXNhZ2VzIGFzIHBsYXRmb3JtcyBtYXkgaGF2ZSBhc3ltbWV0cmljIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9NQVNLICAgICA9IH4oQ1BVX1JFQUQgfCBDUFVfV1JJVEUgfCBSRUFEX1BST1RFQ1RFRCB8IFdSSVRFX1BST1RFQ1RFRCksCisgICAgfTsKKworICAgIC8qKiBDcmVhdGUgYSB1c2FnZSBmcm9tIHNlcGFyYXRlIGNvbnN1bWVyIGFuZCBwcm9kdWNlciB1c2FnZSBtYXNrLiBcZGVwcmVjYXRlZCAqLworICAgIGlubGluZSBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGNvbnN1bWVyLCB1aW50NjRfdCBwcm9kdWNlcikKKyAgICAgICAgOiBleHBlY3RlZChjb25zdW1lciB8IHByb2R1Y2VyKSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGV4cGVjdGVkXykKKyAgICAgICAgOiBleHBlY3RlZChleHBlY3RlZF8pIHsgfQorCisgICAgdWludDY0X3QgZXhwZWN0ZWQ7IC8vIGV4cGVjdGVkIGJ1ZmZlciB1c2FnZQorfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmOGQyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJDT01QT05FTlRfSF8KKworI2RlZmluZSBDMkNPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8vLyBcZGVmZ3JvdXAgY29tcG9uZW50cyBDb21wb25lbnRzCisvLy8gQHsKKworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSB7CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBPU1NJQkxFLCAvLy88IHF1ZXJ5IGFsbCBwb3NzaWJsZSB2YWx1ZXMgcmVnYXJkbGVzcyBvZiBvdGhlciBzZXR0aW5ncworICAgICAgICBDVVJSRU5ULCAgLy8vPCBxdWVyeSBjdXJyZW50bHkgcG9zc2libGUgdmFsdWVzIGdpdmVuIGRlcGVuZGVudCBzZXR0aW5ncworICAgIH07CisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgdHlwZV90IF9tVHlwZTsKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB2YWx1ZXM7CisKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8sIHR5cGVfdCB0eXBlXykKKyAgICAgICAgOiBfbUZpZWxkKGZpZWxkXyksIF9tVHlwZSh0eXBlXyksIHN0YXR1cyhDMl9OT19JTklUKSB7IH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBDdXJyZW50KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfKSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoZmllbGRfLCBDVVJSRU5UKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CisgICAgUG9zc2libGUoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIFBPU1NJQkxFKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkIGZpZWxkKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZDsgfTsKKworICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorfTsKKworLyoqCisgKiBDb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4gVGhpcyBvYmplY3QgY29udGFpbnMgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgcG90ZW50aWFsIG9yCisgKiBhY3R1YWwgY29tcG9uZW50LiBJdCBjYW4gYmUgY3JlYXRlZCBhbmQgdXNlZCBpbmRlcGVuZGVudGx5IG9mIGFuIGFjdHVhbCBDMkNvbXBvbmVudCBpbnN0YW5jZSB0bworICogcXVlcnkgc3VwcG9ydCBhbmQgcGFyYW1ldGVycyBmb3IgdmFyaW91cyBjb21wb25lbnQgc2V0dGluZ3MgYW5kIGNvbmZpZ3VyYXRpb25zIGZvciBhIHBvdGVudGlhbAorICogY29tcG9uZW50LiBBY3R1YWwgY29tcG9uZW50cyBhbHNvIGV4cG9zZSB0aGlzIGludGVyZmFjZS4KKyAqLworCitjbGFzcyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQUxXQVlTIEFWQUlMQUJMRSBNRVRIT0RTCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSAnY2xhc3MnOyBob3dldmVyLCBtdWx0aXBsZQorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBTSEFMTCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIElEIGlzIHVzZWQgYXMgd29yayB0YXJnZXRzLCB1bmlxdWUgd29yayBJRHMsIGFuZCB3aGVuIGNvbmZpZ3VyaW5nIHR1bm5lbGluZy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB1bmlxdWUgbm9kZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgYSBzZXQgb2YgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb3IgcGFyYW1ldGVycworICAgICAqIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgd2l0aG91dCBibG9ja2luZy4gQW55IGVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICogQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuCisgICAgICogSW52YWxpZCBvciBibG9ja2luZyBwYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgorICAgICAqCisgICAgICogXHRvZG8gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcXVlcnkgaW5mby1idWZmZXJzLiBJcyB0aGF0IGEgcHJvYmxlbT8KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vdGUgRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW1baW5dIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQgcGFyYW0gaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgICAgICAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGVzIGluCisgICAgICogdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHxwYXJhbXN8LiBJZiBhbnkgcGFyYW1ldGVyIHVwZGF0ZSBmYWlscywgdGhlIGNvbXBvbmVudCBzaGFsbAorICAgICAqIGNvbW11bmljYXRlIHRoZSBmYWlsdXJlIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wsIGFuZCBzdGlsbCBwcm9jZXNzIHRoZQorICAgICAqIHJlbWFpbmluZyBwYXJhbWV0ZXJzLiBVbnN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBza2lwcGVkLCB0aG91Z2ggdGhleSBhcmUgY29tbXVuaWNhdGVkIGluCisgICAgICogdGhlciByZXR1cm4gdmFsdWUuIE1vc3QgcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBhdCBiZXN0IGVmZm9ydCAtIHN1Y2ggdGhhdCBldmVuIGlmIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgYSBmaWVsZCwgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlIGlzIHVzZWQuIE9uIHRoZQorICAgICAqIG90aGVyIGhhbmQsIHN0cmljdCBwYXJhbWV0ZXJzIG9ubHkgYWNjZXB0IHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlaXIgZmllbGRzLCBhbmQgaWYgdGhlIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSwgdGhlIHBhcmFtZXRlciBzZXR0aW5nIHNoYWxsIGZhaWwgZm9yIHRoYXQgZmllbGQuCisgICAgICogSWYgdGhlIGNsaWVudCB0cmllcyB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgZmllbGQgdGhhdCByZXF1aXJlcyBtb21lbnRhcnkgYmxvY2tpbmcgd2l0aG91dAorICAgICAqIHNldHRpbmcgfG1heUJsb2NrfCB0byBDMl9NQVlfQkxPQ0ssIHRoYXQgcGFyYW1ldGVyIHNoYWxsIGFsc28gYmUgc2tpcHBlZCBhbmQgYSBzcGVjaWZpYworICAgICAqIHJldHVybiB2YWx1ZSBzaGFsbCBiZSB1c2VkLiBGaW5hbCB2YWx1ZXMgZm9yIGFsbCBwYXJhbWV0ZXJzIHNldCBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZQorICAgICAqIGNhbGxlciBpbiB8cGFyYW1zfC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB0dW5pbmcgRE9FUyBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycy4gRS5nLiBzb21lIHBhcmFtZXRlcgorICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgZnVydGhlciBwYXJhbWV0ZXIgdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPworICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICogXHBhcmFtW291dF0gZmFpbHVyZXMgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMgYW5kIG9wdGlvbmFsIGd1aWRhbmNlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHNldCB0aGUgcGFyYW1ldGVycyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBUVU5ORUxJTkcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIElmIHRoZSBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgbWF5IGluY2x1ZGUgYQorICAgICAqIHR1bm5lbGVkIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIHR1bm5lbCBhbHJlYWR5IGV4aXN0cworICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIHNwZWNpZmljIHR1bm5lbCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIHR1bm5lbCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhlIHJlbGVhc2Ugb2YgYSB0dW5uZWwgaXMgZGVsYXllZCB3aGlsZSB0aGVyZSBhcmUgcGVuZGluZyB3b3JrIGl0ZW1zIGZvciB0aGUgdHVubmVsLgorICAgICAqIEFmdGVyIHJlbGVhc2luZyBhIHR1bm5lbCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBNVVNUIE5PVCBpbmNsdWRlIGEgdHVubmVsZWQKKyAgICAgKiBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgbWFya2VkIGZvciByZWxlYXNlIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIHR1bm5lbCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBtYXJrIHRoZSB0dW5uZWwgZm9yIHJlbGVhc2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlbGVhc2Ugb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOworCisgICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBxdWVyaWVkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIENsaWVudCBTSEFMTCBzZXQgdGhlIHBhcmFtZXRlci1maWVsZCBzcGVjaWZpZXIgYW5kIHRoZSB0eXBlIG9mIHN1cHBvcnRlZCB2YWx1ZXMgcXVlcnkgKGUuZy4KKyAgICAgKiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcywgb3IgcG90ZW50aWFsIHN1cHBvcnRlZCB2YWx1ZXMpIGluIGZpZWxkcy4KKyAgICAgKiBVcG9uIHJldHVybiB0aGUgY29tcG9uZW50IFNIQUxMIGZpbGwgaW4gdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMgbGlzdGVkIGFzIHdlbGwKKyAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IGZpZWxkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHN1cHBvcnRlZCB2YWx1ZXMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgTGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25UdW5uZWxSZWxlYXNlZCg8ZnJvbT4sIDx0bz4pID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25Db21wb25lbnRSZWxlYXNlZCg8aWQ+KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIGZvciB0aGlzIGNvbXBvbmVudAorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIHN0YXRlcyBleGNlcHQgcmVsZWFzZWQuCisgICAgICogVGhlIGxpc3RlbmVyIGNhbiBvbmx5IGJlIHNldCB0byBub24tbnVsbCB2YWx1ZSBpbiBzdG9wcGVkIHN0YXRlICh0aGF0IGRvZXMgbm90IGluY2x1ZGUKKyAgICAgKiB0cmlwcGVkIG9yIGVycm9yKS4gSXQgY2FuIGJlIHNldCB0byBudWxscHRyIGluIGJvdGggc3RvcHBlZCBhbmQgcnVubmluZyBzdGF0ZXMuCisgICAgICogQ29tcG9uZW50cyBvbmx5IHVzZSB0aGUgbGlzdGVuZXIgaW4gcnVubmluZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIGxpc3RlbmVyIGlzIG51bGxwdHIsIHRoZSBjb21wb25lbnQgU0hBTEwgZ3VhcmFudGVlIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3MgYXJlCisgICAgICogZG9uZSB0byB0aGUgb3JpZ2luYWwgbGlzdGVuZXIgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLiAoQW55IHBlbmRpbmcgbGlzdGVuZXIgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBuZWVkIHRvIGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhpcyBjYWxsIC0gaGVuY2UgdGhpcyBjYWxsIG1heSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4pCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBTSEFMTCBoYW5kbGUgbGlzdGVuZXIgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBzYW1lIHRocmVhZCAodGhlIHRocmVhZCB1c2VkIGlzCisgICAgICogYXQgdGhlIGNvbXBvbmVudCdzIGRpc2NyZXRpb24uKQorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBjb3VsZCBhbHNvIGJlIGFjY29tcGxpc2hlZCBieSBwYXNzaW5nIGEgd2Vha19wdHIgdG8gYSBjb21wb25lbnQtc3BlY2lmaWMgbGlzdGVuZXIKKyAgICAgKiBoZXJlIGFuZCByZXF1aXJpbmcgdGhlIGNsaWVudCB0byBhbHdheXMgcHJvbW90ZSB0aGUgd2Vha19wdHIgYmVmb3JlIGFueSBjYWxsYmFjay4gVGhpcyB3b3VsZAorICAgICAqIHB1dCB0aGUgYnVyZGVuIG9uIHRoZSBjbGllbnQgdG8gY2xlYXIgdGhlIGxpc3RlbmVyIC0gd2FpdCBmb3IgaXRzIGRlbGV0aW9uIC0gYXQgd2hpY2ggcG9pbnQKKyAgICAgKiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBvY2N1ci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gbGlzdGVuZXIgdGhlIGNvbXBvbmVudCBsaXN0ZW5lciBvYmplY3QKKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSBhdHRlbXB0aW5nIHRvIGNoYW5nZSB0aGUgbGlzdGVuZXIgaW4gdGhlIHJ1bm5pbmcgc3RhdGUgdG8gYSBub24tbnVsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICh1c2VyIGVycm9yKSwgb3IgY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBsaXN0ZW5lciB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSA9IDA7CisKKyAgICAvLy8gY29tcG9uZW50IGRvbWFpbiAoZS5nLiBhdWRpbyBvciB2aWRlbykKKyAgICBlbnVtIGRvbWFpbl90IDogdWludDMyX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGtpbmQgKGUuZy4gZW5jb2RlciwgZGVjb2RlciBvciBmaWx0ZXIpCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQgcmFuay4gVGhpcyBudW1iZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgY29tcG9uZW50IG9yZGVyaW5nICh0aGUgbG93ZXIgdGhlIHNvb25lcikKKyAgICAvLy8gaW4gdGhlIGNvbXBvbmVudCBsaXN0LgorICAgIHR5cGVkZWYgdWludDMyX3QgcmFua190OworCisgICAgLy8vIGNvbXBvbmVudCBhdHRyaWJ1dGVzCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQ2NF90OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSBjb21wb25lbnQuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgLy8gcHVibGljOgorICAgICAgICBDMlN0cmluZyBuYW1lOyAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudAorICAgICAgICBkb21haW5fdCBkb21haW47IC8vLzwgY29tcG9uZW50IGRvbWFpbgorICAgICAgICBraW5kX3Qga2luZDsgLy8vPCBjb21wb25lbnQga2luZAorICAgICAgICByYW5rX3QgcmFuazsgLy8vPCBjb21wb25lbnQgcmFuaworICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGU7IC8vLzwgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgICAgICBDMlN0cmluZyBvd25lcjsgLy8vPCBuYW1lIG9mIHRoZSBjb21wb25lbnQgc3RvcmUgb3duaW5nIHRoaXMgY29tcG9uZW50CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5hbWUgYWxpYXMoZXMpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKiBcbm90ZSBNdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzIGFzIGxvbmcgYXMgdGhlaXIgbWVkaWEtdHlwZSBkaWZmZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgfTsKKworICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE9LIGFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdXNpbmcgdGhlCisgICAgICogb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgd2FzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudHMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgdGhlIHdvcmsKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHF1ZXVpbmcgdGhlIHdvcmsgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgPSAwOworCisgICAgLyoqCisgICAgICogQW5ub3VuY2VzIGEgd29yayB0byBiZSBxdWV1ZWQgbGF0ZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcmVzZXJ2ZXMgYSBzbG90IGZvciB0aGUgcXVldWUKKyAgICAgKiB0byBlbnN1cmUgY29ycmVjdCB3b3JrIG9yZGVyaW5nIGV2ZW4gaWYgdGhlIHdvcmsgaXMgcXVldWVkIGxhdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KKyAgICAgKiBcdG9kbyBFeHBvc2UgbmV4dCB3b3JrIGl0ZW0gZm9yIGVhY2ggY29tcG9uZW50IHRvIGRldGVjdCBzdGFsbHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOworCisgICAgZW51bSBmbHVzaF9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgb25seQorICAgICAgICBGTFVTSF9DT01QT05FTlQsCisKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIGNvbXBvbmVudHMgY29ubmVjdGVkIGRvd25zdHJlYW0gZnJvbSBpdCB2aWEKKyAgICAgICAgLy8vIHR1bm5lbGluZworICAgICAgICBGTFVTSF9DSEFJTiA9ICgxIDw8IDE2KSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKKyAgICAgKiBkb3duc3RyZWFtLgorICAgICAqCisgICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCisgICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93CisgICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQorICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKKyAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCisgICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQorICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKiBUaGlzIHNoYWxsIGJlIGNvbXBsZXRlZCB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCisgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KKyAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cworICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KKyAgICAgICAgRFJBSU5fQ0hBSU4gPSAoMSA8PCAxNiksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCisgICAgICAgICAqICAgICAgIGFsbCB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjb21wb25lbnQuCisgICAgICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/CisgICAgICAgICAqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CisgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImRyYWluLXRpbGwtaGVyZSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgorICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyB1c2VkIHRvIHNldCB0aGUKKyAgICAgKiBlbmQtb2Ytc3RyZWFtIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrCisgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBkcmFpbiBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgZHJhaW4gcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgZHJhaW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBkZWZpbmUgc3VwcG9ydGVkIG1vZGVzIGRpc2NvdmVyeQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCisgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgKG9yIHJlc3VtZWQpIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXJ0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBzdG9wcGVkIHN0YXRlIG9yIHRyaXBwZWQgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCBhbmQgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlCisgICAgICogcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCisgICAgICogdmVyaWZ5IGFjY291bnRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdG9wIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBydW5uaW5nIHN0YXRlLCBpbmNsdWRpbmcgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0b3BwZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RvcHBpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcyBvdGhlciB0aGFuIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCisgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CisgICAgICoKKyAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgorICAgICAqCisgICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZworICAgICAqIHN0dWZmLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZXNldAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHJlc2V0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlc2V0IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2V0dGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuIFVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzIHNoYWxsIGJlIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZWxlYXNlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWxlYXNpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7Cit9OworCitDMkVOVU0oQzJDb21wb25lbnQ6OmtpbmRfdCwgdWludDMyX3QsCisgICAgS0lORF9PVEhFUiwKKyAgICBLSU5EX0RFQ09ERVIsCisgICAgS0lORF9FTkNPREVSCispOworCitDMkVOVU0oQzJDb21wb25lbnQ6OmRvbWFpbl90LCB1aW50MzJfdCwKKyAgICBET01BSU5fT1RIRVIsCisgICAgRE9NQUlOX1ZJREVPLAorICAgIERPTUFJTl9BVURJTywKKyAgICBET01BSU5fSU1BR0UKKyk7CisKK2NsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwYXJzZUZyYW1lKEMyRnJhbWVEYXRhICZmcmFtZSk7CisKKyAgICB2aXJ0dWFsIH5DMkZyYW1lSW5mb1BhcnNlcigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIHR5cGVkZWYgQzJBbGxvY2F0b3I6OmlkX3QgaWRfdDsKKworICAgIGVudW0gOiBDMkFsbG9jYXRvcjo6aWRfdCB7CisgICAgICAgIERFRkFVTFRfTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgREVGQVVMVF9HUkFQSElDLCAgICAvLy88IGJhc2ljIGdyYXBoaWMgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgICAgICBWRU5ET1JfU1RBUlQgICA9IDB4MTAwLAorICAgICAgICBCQURfSUQgICAgICAgICA9IEMyQWxsb2NhdG9yOjpCQURfSUQsIC8vLzwgRE8gTk9UIFVTRQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvY2F0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgYWxsb2NhdG9yIGluZm9ybWF0aW9uIChhcyBzaGFyZWQgcG9pbnRlcnMpCisgICAgICogXHJldHZhbCBhbiBlbXB0eSB2ZWN0b3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSB2ZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzL2NyZWF0ZXMgYSBzaGFyZWQgYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBUaGUgYWxsb2NhdG9yIGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBhbmQgdGhlIHNhbWUgYWxsb2NhdG9yIGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBjb25jdXJyZW50IHVzZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhlIGFsbG9jYXRvciBpcyBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0b3JlLCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgbGluZWFyIGFuZCBncmFwaGljIGFsbG9jYXRvcnMgaXMgZm9ybWFsaXplZC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCisgICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gY29tcG9uZW50ICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGludGVyZmFjZSAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZAorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIGFuIGludGVyZmFjZSwgb3IgY291bGQgdGhpcyBqdXN0IGJlIGEgY29tcG9uZW50IHRoYXQgaXMgbmV2ZXIgc3RhcnRlZD8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKKyAgICAvLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGUuZy4gZm9yIGdsb2JhbCBzZXR0aW5ncyAoc3lzdGVtLXdpZGUgc3RyaWRlLCBldGMuKQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCisgICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0CisgICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCisgICAgICogdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLiBVbnN1cHBvcnRlZCBwYXJhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCisgICAgICogZnV0dXJlLgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKKyAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQorICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLiBUaGlzIGlzIHNoYXJlZCBmb3IgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgc2hhcmVkIHBhcmFtZXRlciByZWZsZWN0b3Igb2JqZWN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBzdG9yZSBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIFN0b3JlIHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IHN0b3JlIGZpZWxkCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0LAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKyAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEZyYW1lUmF0ZSA9IEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWF4Qml0cmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heEZyYW1lUmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4R29wLAorICAgIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWwsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lLAorICAgIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZywKKyAgICBrUGFyYW1JbmRleExheWVySW5kZXgsCisgICAga1BhcmFtSW5kZXhMYXllckNvdW50LAorICAgIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFRpbGVMYXlvdXQgPSBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFRpbGVIYW5kbGluZywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdWRpbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhTYW1wbGVSYXRlID0gQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhQY21FbmNvZGluZywKKyAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleEFhY1Nick1vZGUsIC8vIGFhYyBlbmNvZGUsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbCwgIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbCwgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQsIC8vIGFsbCwgdTMyCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzLCAvLyBhbGwsIHU2NCBtYXNrCisgICAga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhBc3BlY3RzVG9EYXRhU3BhY2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnMsIC8vIHN0b3JlLCBzdHJ1Y3RbXQorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlVG9Bc3BlY3RzLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2UsIC8vIHUzMgorICAgIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmcsIC8vIHUzMgorCisgICAgLy8gaW5wdXQgc3VyZmFjZQorICAgIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zLCAvLyBpbnB1dC1zdXJmYWNlLCBlb3MKKyAgICBrUGFyYW1JbmRleFRpbWVkQ29udHJvbCwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhTdGFydEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN1c3BlbmRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhSZXN1bWVBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdG9wQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VGltZU9mZnNldCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGUsIC8vIGlucHV0LXN1cmZhY2UsIGZsb2F0CisgICAga1BhcmFtSW5kZXhUaW1lc3RhbXBHYXBBZGp1c3RtZW50LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKworICAgIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvciwgLy8gdTMyCit9OworCit9CisKKy8qKgorICogQ29kZWMgMi4wIHBhcmFtZXRlciB0eXBlcyBmb2xsb3cgdGhlIGZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiBDMjxncm91cD48ZG9tYWluPjxpbmRleD48dHlwZT4KKyAqCisgKiBFLmcuIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOiBncm91cD0iIiBkb21haW49IlN0cmVhbSIgaW5kZXg9IlBpY3R1cmVTaXplIiB0eXBlPSJJbmZvIi4KKyAqIEdyb3VwIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGRlbm90ZXMga2luZCBvZiBvYmplY3RzIHRoZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZC4KKyAqIEF0IHRoaXMgcG9pbnQgd2UgdXNlIENvbXBvbmVudCBhbmQgU3RvcmUgdG8gZGlzdGluZ3Vpc2ggYmFzaWMgY29tcG9uZW50L3N0b3JlIHBhcmFtZXRlcnMuCisgKgorICogUGFyYW1ldGVyIGtleXMgYXJlIG5hbWVkIEMyX1BBUkFNS0VZX1s8Z3JvdXA+X108ZG9tYWluPl88aW5kZXg+IGFzIHR5cGUgaXMgbm90IGV4cGVjdGVkCisgKiB0byBkaXN0aW5ndWlzaCBwYXJhbWV0ZXJzLiBFLmcuIGEgY29tcG9uZW50IGNvdWxkIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGFuZCBpdAorICogaXMgbm90IGV4cGVjdGVkIHVzZXJzIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHRoZSBrZXkuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIGxldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gQzJDb25maWc6OmFwaV9sZXZlbF90IDogdWludDMyX3QgeworICAgIEFQSV9MMF8xID0gMCwgICAvLy88IHN1cHBvcnQgZm9yIEFQSSBsZXZlbCAwLjEKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2xldmVsX3Q+LCBrUGFyYW1JbmRleEFwaUxldmVsPgorICAgICAgICBDMkFwaUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9MRVZFTFtdID0gImFwaS5sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OmFwaV9mZWF0dXJlX3QgOiB1aW50NjRfdCB7CisgICAgQVBJX1JFRkxFQ1RJT04gICAgICAgPSAoMVUgPDwgMCksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgcGFyYW1ldGVycworICAgIEFQSV9WQUxVRVMgICAgICAgICAgID0gKDFVIDw8IDEpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3Qgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIKKyAgICBBUElfQ1VSUkVOVF9WQUxVRVMgICA9ICgxVSA8PCAyKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9ERVBFTkRFTkNZICAgICAgID0gKDFVIDw8IDMpLCAgLy8vPCBoYXZlIGEgZGVmaW5lZCBwYXJhbWV0ZXIgZGVwZW5kZW5jeQorCisgICAgQVBJX1NUUkVBTVMgICAgICAgICAgPSAoMVVMTCA8PCAzMiksICAvLy88IHN1cHBvcnRpbmcgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmVhbXMKKworICAgIEFQSV9UVU5ORUxJTkcgICAgICAgID0gKDFVTEwgPDwgNDgpLCAgLy8vPCB0dW5uZWxpbmcgQVBJCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFwaV9mZWF0dXJlX3Q+LCBrUGFyYW1JbmRleEFwaUZlYXR1cmVzPgorICAgICAgICBDMkFwaUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9GRUFUVVJFU1tdID0gImFwaS5mZWF0dXJlcyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdlbmVyaWMgY29tcG9uZW50IGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBkb3QgJy4nLCBoeXBoZW4gJy0nLCBwbHVzICcrJywgb3IKKyAqIHVuZGVybGluZSAnXycuIFRoZSBuYW1lIG9mIGVhY2ggY29tcG9uZW50IG11c3QgYmUgdW5pcXVlLgorICoKKyAqIEZvciBBbmRyb2lkOiBDb21wb25lbnQgbmFtZXMgbXVzdCBzdGFydCB3aXRoICdjMi4nIGZvbGxvd2VkIGJ5IHRoZSBjb21wYW55IG5hbWUgb3IgYWJicmV2aWF0aW9uCisgKiBhbmQgYW5vdGhlciBkb3QsIGUuZy4gJ2MyLmFuZHJvaWQuJy4gVXNlIG9mIGxvd2VyY2FzZSBpcyBwcmVmZXJyZWQgYnV0IG5vdCByZXF1aXJlZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE5hbWU+IEMyQ29tcG9uZW50TmFtZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRVtdICA9ICJjb21wb25lbnQubmFtZSI7CisKKy8qKgorICogQWx0ZXJuYXRlIG5hbWVzIChhbGlhc2VzKSBvZiB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoaXMgaXMgYSBjb21tYSAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWx0ZXJuYXRlIGNvbXBvbmVudCBuYW1lcy4gVW5saWtlIGNvbXBvbmVudCBuYW1lcyB0aGF0CisgKiBtdXN0IGJlIHVuaXF1ZSwgbXVsdGlwbGUgY29tcG9uZW50cyBjYW4gaGF2ZSB0aGUgc2FtZSBhbGlhcy4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleEFsaWFzZXM+IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFU1tdICA9ICJjb21wb25lbnQuYWxpYXNlcyI7CisKKy8qKgorICogQ29tcG9uZW50IGtpbmQuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6a2luZF90Piwga1BhcmFtSW5kZXhLaW5kPgorICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkRbXSAgPSAiY29tcG9uZW50LmtpbmQiOworCisvKioKKyAqIENvbXBvbmVudCBkb21haW4uCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+LCBrUGFyYW1JbmRleERvbWFpbj4KKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTltdICA9ICJjb21wb25lbnQuZG9tYWluIjsKKworLyoqCisgKiBDb21wb25lbnQgYXR0cmlidXRlcy4KKyAqCisgKiBUaGVzZSBhcmUgYSBzZXQgb2YgZmxhZ3MgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBjaGFyYWN0ZXJpemluZyBpdHMgcHJvY2Vzc2luZyBhbGdvcml0aG0uCisgKi8KK0MyRU5VTShDMkNvbXBvbmVudDo6YXR0cmliX3QsIHVpbnQ2NF90LAorICAgIEFUVFJJQl9JU19URU1QT1JBTCA9IDF1IDw8IDAsIC8vLzwgY29tcG9uZW50IGlucHV0IG9yZGVyaW5nIG1hdHRlcnMgZm9yIHByb2Nlc3NpbmcKKykKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjphdHRyaWJfdD4sIGtQYXJhbUluZGV4QXR0cmlidXRlcz4KKyAgICAgICAgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTW10gPSAiY29tcG9uZW50LmF0dHJpYnV0ZXMiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaGluZy4KKyAqCisgKiBUaGlzIGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSByYXRlIG9mIHRoZSBpbnB1dCB0aW1lc3RhbXAsIGFuZCB0aGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqIEUuZy4gaWYgdGhpcyBpcyA0LjAsIGZvciBldmVyeSAxIHNlY29uZHMgb2YgaW5wdXQgdGltZXN0YW1wIGRpZmZlcmVuY2UsIHRoZSBvdXRwdXQgc2hhbGwgZGlmZmVyCisgKiBieSA0IHNlY29uZHMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleFRpbWVTdHJldGNoPiBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIW10gID0gImFsZ28udGltZS1zdHJldGNoIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29kaW5nIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFByb2ZpbGUgYW5kIGxldmVsLgorICoKKyAqIFByb2ZpbGUgZGV0ZXJtaW5lcyB0aGUgdG9vbHMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICogTGV2ZWwgZGV0ZXJtaW5lcyB0aGUgbGV2ZWwgb2YgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCituYW1lc3BhY2UgeworCitlbnVtIDogdWludDMyX3QgeworICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCisgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKKyAgICBfQzJfUExfSDI2M19CQVNFID0gMHgzMDAwLAorICAgIF9DMl9QTF9NUDRWX0JBU0UgPSAweDQwMDAsCisgICAgX0MyX1BMX0FWQ19CQVNFICA9IDB4NTAwMCwKKyAgICBfQzJfUExfSEVWQ19CQVNFID0gMHg2MDAwLAorICAgIF9DMl9QTF9WUDlfQkFTRSAgPSAweDcwMDAsCisgICAgX0MyX1BMX0RWX0JBU0UgICA9IDB4ODAwMCwKKyAgICBfQzJfUExfQVYxX0JBU0UgID0gMHg5MDAwLAorCisgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAorfTsKKworfQorCitlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CisgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBBQUMgKE1QRUctMiBQYXJ0IDcgYW5kIE1QRUctNCBQYXJ0IDMpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BQUNfTEMgPSBfQzJfUExfQUFDX0JBU0UsICAgICAgICAgICAvLy88IEFBQyBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTWFpbgorICAgIFBST0ZJTEVfQUFDX1NTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZQorICAgIFBST0ZJTEVfQUFDX0xUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAgICBQUk9GSUxFX0FBQ19IRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19FUl9MQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19IRV9QUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeSBQYXJhbWV0cmljIFN0ZXJlbworICAgIFBST0ZJTEVfQUFDX0VMRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfWEhFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFeHRlbmRlZCBIaWdoLUVmZmljaWVuY3kKKworICAgIC8vIE1QRUctMiBWaWRlbyBwcm9maWxlcworICAgIFBST0ZJTEVfTVAyVl9TSU1QTEUgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTaW1wbGUKKyAgICBQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbgorICAgIFBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTTlIgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU3BhdGlhbGx5IFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2gKKyAgICBQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgNDoyOjIKKyAgICBQUk9GSUxFX01QMlZfTVVMVElWSUVXLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTXVsdGktdmlldworCisgICAgLy8gSC4yNjMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUgPSBfQzJfUExfSDI2M19CQVNFLCAgIC8vLzwgSC4yNjMgQmFzZWxpbmUgKFByb2ZpbGUgMCkKKyAgICBQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMSkKKyAgICBQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAxIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMikKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgMykKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAzIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgNCkKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiAoUHJvZmlsZSA1KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCAoUHJvZmlsZSA2KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgKFByb2ZpbGUgNykKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSGlnaCBMYXRlbmN5IChQcm9maWxlIDgpCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgTmF0dXJhbCBWaXN1YWwgUHJvZmlsZXMKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlCisgICAgUFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBNYWluCisgICAgUFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBOLUJpdAorICAgIFBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgUmVhbHRpbWUgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTywgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9GR1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZQorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBwcm9maWxlcworICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgLy8vPCBBVkMgKEguMjY0KSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNYWluCisgICAgUFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEV4dGVuZGVkCisgICAgUFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaAorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgUHJlZGljdGl2ZQorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDQVZMQyA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFICsgMHgxMDAsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdILCAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoIEludHJhCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCwgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU3RlcmVvIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdILCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHg0MDAsICAvLy88IEFWQyAoSC4yNjQpIEVuaGFuY2VkIE11bHRpdmlldyBEZXB0aCBIaWdoCisKKyAgICAvLyBIRVZDIHByb2ZpbGVzCisgICAgUFJPRklMRV9IRVZDX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fU1RJTEwsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xNiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0ID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgzMDAsICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE11bHRpdmlldyBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg1MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg2MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0LCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDXzNEX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg3MDAsICAvLy88IEhFVkMgKEguMjY1KSAzRCBNYWluCisKKyAgICAvLyBWUDkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOV8wID0gX0MyX1BMX1ZQOV9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMCAoNDoyOjApCisgICAgUFJPRklMRV9WUDlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDEgKDQ6MjoyIG9yIDQ6NDo0KQorICAgIFBST0ZJTEVfVlA5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAyICg0OjI6MCwgMTAgb3IgMTIgYml0KQorICAgIFBST0ZJTEVfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAzICg0OjI6MiBvciA0OjQ6NCwgMTAgb3IgMTIgYml0KQorCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGVzCisgICAgUFJPRklMRV9EVl9BVl9QRVIgPSBfQzJfUExfRFZfQkFTRSArIDAsICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfQVZfUEVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDQgPSBfQzJfUExfRFZfQkFTRSArIDQsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wNSA9IF9DMl9QTF9EVl9CQVNFICsgNSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA1IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFX0RUSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZHRoIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNyA9IF9DMl9QTF9EVl9CQVNFICsgNywgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA3IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA4ID0gX0MyX1BMX0RWX0JBU0UgKyA4LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDggcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfQVZfMDkgPSBfQzJfUExfRFZfQkFTRSArIDksICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi4wOSBwcm9maWxlCisKKyAgICAvLyBBVjEgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKKyAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCit9OworCitlbnVtIEMyQ29uZmlnOjpsZXZlbF90IDogdWludDMyX3QgeworICAgIExFVkVMX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZXZlbCBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIE1QRUctMiBWaWRlbyBsZXZlbHMKKyAgICBMRVZFTF9NUDJWX0xPVyA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTG93IExldmVsCisgICAgTEVWRUxfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4gTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCAxNDQwIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaFAgTGV2ZWwKKworICAgIC8vIEguMjYzIGxldmVscworICAgIExFVkVMX0gyNjNfMTAgPSBfQzJfUExfSDI2M19CQVNFLCAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAxMAorICAgIExFVkVMX0gyNjNfMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAyMAorICAgIExFVkVMX0gyNjNfMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAzMAorICAgIExFVkVMX0gyNjNfNDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0MAorICAgIExFVkVMX0gyNjNfNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0NQorICAgIExFVkVMX0gyNjNfNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA1MAorICAgIExFVkVMX0gyNjNfNjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA2MAorICAgIExFVkVMX0gyNjNfNzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA3MAorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIGxldmVscworICAgIExFVkVMX01QNFZfMCA9IF9DMl9QTF9NUDRWX0JBU0UsICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMAorICAgIExFVkVMX01QNFZfMEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMGIKKyAgICBMRVZFTF9NUDRWXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDEKKyAgICBMRVZFTF9NUDRWXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDIKKyAgICBMRVZFTF9NUDRWXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDMKKyAgICBMRVZFTF9NUDRWXzNCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDNiCisgICAgTEVWRUxfTVA0Vl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0CisgICAgTEVWRUxfTVA0Vl80QSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0YQorICAgIExFVkVMX01QNFZfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNQorICAgIExFVkVMX01QNFZfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNgorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBsZXZlbHMKKyAgICBMRVZFTF9BVkNfMSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMQorICAgIExFVkVMX0FWQ18xQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxYgorICAgIExFVkVMX0FWQ18xXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjEKKyAgICBMRVZFTF9BVkNfMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4yCisgICAgTEVWRUxfQVZDXzFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMworICAgIExFVkVMX0FWQ18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyCisgICAgTEVWRUxfQVZDXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMQorICAgIExFVkVMX0FWQ18yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVkNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMworICAgIExFVkVMX0FWQ18zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVkNfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVZDXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQKKyAgICBMRVZFTF9BVkNfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVZDXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMgorICAgIExFVkVMX0FWQ181LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1CisgICAgTEVWRUxfQVZDXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMQorICAgIExFVkVMX0FWQ181XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVkNfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNgorICAgIExFVkVMX0FWQ182XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjEKKyAgICBMRVZFTF9BVkNfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNi4yCisKKyAgICAvLyBIRVZDIChILjI2NSkgdGllcnMgYW5kIGxldmVscworICAgIExFVkVMX0hFVkNfTUFJTl8xID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDEKKyAgICBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyCisgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMworICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDMuMQorICAgIExFVkVMX0hFVkNfTUFJTl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQKKyAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA0LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1CisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4yCisgICAgTEVWRUxfSEVWQ19NQUlOXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNgorICAgIExFVkVMX0hFVkNfTUFJTl82XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMQorICAgIExFVkVMX0hFVkNfTUFJTl82XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMgorCisgICAgTEVWRUxfSEVWQ19ISUdIXzQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfSElHSF80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfSElHSF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX0hJR0hfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4yCisKKyAgICAvLyBWUDkgbGV2ZWxzCisgICAgTEVWRUxfVlA5XzEgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxCisgICAgTEVWRUxfVlA5XzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxLjEKKyAgICBMRVZFTF9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIKKyAgICBMRVZFTF9WUDlfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIuMQorICAgIExFVkVMX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMworICAgIExFVkVMX1ZQOV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMy4xCisgICAgTEVWRUxfVlA5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0CisgICAgTEVWRUxfVlA5XzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0LjEKKyAgICBMRVZFTF9WUDlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUKKyAgICBMRVZFTF9WUDlfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUuMQorICAgIExFVkVMX1ZQOV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4yCisgICAgTEVWRUxfVlA5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2CisgICAgTEVWRUxfVlA5XzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2LjEKKyAgICBMRVZFTF9WUDlfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMgorCisgICAgLy8gRG9sYnkgVmlzaW9uIGxldmVscworICAgIExFVkVMX0RWX01BSU5fSERfMjQgPSBfQzJfUExfRFZfQkFTRSwgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQzMAorICAgIExFVkVMX0RWX01BSU5fRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQzMAorICAgIExFVkVMX0RWX01BSU5fVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfTUFJTl9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNjAKKworICAgIExFVkVMX0RWX0hJR0hfSERfMjQgPSBfQzJfUExfRFZfQkFTRSArIDB4MTAwLCAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQzMAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfSElHSF9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQzMAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfSElHSF9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNjAKKworICAgIC8vIEFWMSBsZXZlbHMKKyAgICBMRVZFTF9BVjFfMiAgICA9IF9DMl9QTF9BVjFfQkFTRSAsICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIKKyAgICBMRVZFTF9BVjFfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMQorICAgIExFVkVMX0FWMV8yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4yCisgICAgTEVWRUxfQVYxXzJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjMKKyAgICBMRVZFTF9BVjFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMKKyAgICBMRVZFTF9BVjFfM18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMQorICAgIExFVkVMX0FWMV8zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVYxXzNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjMKKyAgICBMRVZFTF9BVjFfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQKKyAgICBMRVZFTF9BVjFfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMQorICAgIExFVkVMX0FWMV80XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVYxXzRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjMKKyAgICBMRVZFTF9BVjFfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUKKyAgICBMRVZFTF9BVjFfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMQorICAgIExFVkVMX0FWMV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4yCisgICAgTEVWRUxfQVYxXzVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjMKKyAgICBMRVZFTF9BVjFfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYKKyAgICBMRVZFTF9BVjFfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMQorICAgIExFVkVMX0FWMV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4yCisgICAgTEVWRUxfQVYxXzZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjMKKyAgICBMRVZFTF9BVjFfNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcKKyAgICBMRVZFTF9BVjFfN18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMQorICAgIExFVkVMX0FWMV83XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4yCisgICAgTEVWRUxfQVYxXzdfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjMKK307CisKK3N0cnVjdCBDMlByb2ZpbGVMZXZlbFN0cnVjdCB7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlOyAgLy8vPCBjb2RpbmcgcHJvZmlsZQorICAgIEMyQ29uZmlnOjpsZXZlbF90ICAgbGV2ZWw7ICAgIC8vLzwgY29kaW5nIGxldmVsCisKKyAgICBDMlByb2ZpbGVMZXZlbFN0cnVjdCgKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZV8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsCisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbF8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKQorICAgICAgICA6IHByb2ZpbGUocHJvZmlsZV8pLCBsZXZlbChsZXZlbF8pIHsgfQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChQcm9maWxlTGV2ZWwpCisgICAgQzJGSUVMRChwcm9maWxlLCAicHJvZmlsZSIpCisgICAgQzJGSUVMRChsZXZlbCwgICAibGV2ZWwiKQorfTsKKworLy8gVE9ETzogbWF5IG5lZWQgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IChoYXZlIC5zZXQgbWVtYmVyKQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QsIGtQYXJhbUluZGV4UHJvZmlsZUxldmVsPgorICAgICAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMW10gPSAiY29kZWQucGwiOworCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTklUX0RBVEFbXSA9ICJjb2RlZC5pbml0LWRhdGEiOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhLgorICoKKyAqIFRoaXMgaXMgY29kaW5nLXNwZWNpZmljIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbmFsIGRhdGEsIGUuZy4gU0VJIGZvciBBVkMvSEVWQy4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCBhIGNvbmZpZ3VyYXRpb24gc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBrZXkuCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSByZXR1cm5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGUsIGFuZCBjYW4gYmUgcmVwZWF0ZWQgYXMgbmVlZGVkCisgKiBpbiB0aGUgc2FtZSB1cGRhdGUuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCwgdWludDMyX3QsCisgICAgSU5GT19OT05FID0gMCwKKworICAgIElORk9fUFJFRklYX1NFSV9VTklUID0gMHgxMDAwMCwgLy8vPCBwcmVmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworICAgIElORk9fU1VGRklYX1NFSV9VTklUID0gMHgyMDAwMCwgLy8vPCBzdWZmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworCisgICAgSU5GT19TRUlfVVNFUl9EQVRBID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCA0LCAgICAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKyAgICBJTkZPX1NFSV9NRENWICAgICAgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDEzNywgIC8vLzwgbWFzdGVyaW5nIGRpc3BsYXkgY29sb3Igdm9sdW1lCisgICAgSU5GT19TRVRfVVNFUl9EQVRBX1NGWCA9IElORk9fU1VGRklYX1NFSV9VTklUIHwgNCwgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisKKyAgICBJTkZPX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAKKykKKworc3RydWN0IEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCB7CisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KCkKKyAgICAgICAgOiB0eXBlXyhJTkZPX05PTkUpIHsgfQorCisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV8pCisgICAgICAgIDogdHlwZV8odHlwZSkgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICZkYXRhX1swXSwgYzJfbWluKGRhdGFfLnNpemUoKSwgZmxleENvdW50KSk7CisgICAgfQorCisgICAgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZV87CisgICAgdWludDhfdCBkYXRhW107CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoU3VwcGxlbWVudGFsRGF0YSwgZGF0YSkKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChkYXRhLCAiZGF0YSIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0LCBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3VwcGxlbWVudGFsRGF0YUluZm87CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEgU3Vic2NyaXB0aW9uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfU1VQUExFTUVOVEFMX0RBVEFbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1zdXBwbGVtZW50YWwiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogTWVkaWEtdHlwZS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgZm9yIGJvdGggcG9ydCBhbmQgc3RyZWFtLCBidXQgc3RyZWFtIG1lZGlhIHR5cGUgbWF5IGJlIGEgc3VidHlwZSBvZiB0aGUKKyAqIHBvcnQgbWVkaWEgdHlwZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRVtdID0gImlucHV0Lm1lZGlhLXR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEVbXSA9ICJvdXRwdXQubWVkaWEtdHlwZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4gQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUW10gPSAiaW5wdXQuZGVsYXkucmVxdWVzdGVkIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWV9SRVFVRVNUW10gPSAib3V0cHV0LmRlbGF5LnJlcXVlc3RlZCI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheVJlcXVlc3Q+CisgICAgICAgIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1RbXSA9ICJwaXBlbGluZS1kZWxheS5yZXF1ZXN0ZWQiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXk+IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlbXSA9ICJpbnB1dC5kZWxheS5hY3R1YWwiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZW10gPSAib3V0cHV0LmRlbGF5LmFjdHVhbCI7CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWVtdID0gImFsZ28uZGVsYXkuYWN0dWFsIjsKKworLyoqCisgKiBSZWZlcmVuY2UgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqIFRoZSBjb21wb25lbnQgbWF5IGhvbGQgb250byBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZXZlbiBhZnRlciBjb21wbGV0aW5nIHRoZSBjb3JyZXNwb25kaW5nCisgKiB3b3JrIGl0ZW0uCisgKgorICogTWF4IHJlZmVyZW5jZSBhZ2UgaXMgdGhlIGxvbmdlc3QgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWUgcHJvY2Vzc2luZyB0aGF0IGEgY29tcG9uZW50IG1heQorICogaG9sZCBvbnRvIGEgYnVmZmVyIGZvci4gTWF4IHJlZmVyZW5jZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhdCB0aGUgc2FtZSB0aW1lIGF0IHRoZSB3b3JzdCBjYXNlLiBUaGVzZSBudW1iZXJzIGFzc3VtZSBzaW5nbGUgZnJhbWUgcGVyIGJ1ZmZlcnMuCisgKgorICogVXNlIG1heC11aW50MzIgaWYgdGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBtYXggYWdlIG9yIGNvdW50LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQWdlPgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAiaW5wdXQucmVmZXJlbmNlLm1heC1hZ2UiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50PgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVFtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJvdXRwdXQucmVmZXJlbmNlLm1heC1jb3VudCI7CisKKy8qKgorICogT3V0cHV0IHJlb3JkZXJpbmcuCisgKgorICogVGhlIHNpemUgb2YgdGhlIHdpbmRvdyB0byB1c2UgZm9yIG91dHB1dCBidWZmZXIgcmVvcmRlcmluZy4gMCBpcyBpbnRlcnByZXRlZCBhcyAxLgorICovCisvLyBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZW9yZGVyQnVmZmVyRGVwdGg+CisgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LnJlb3JkZXIuZGVwdGgiOworCitDMkVOVU0oQzJDb25maWc6Om9yZGluYWxfa2V5X3QsIHVpbnQzMl90LAorICAgICAgICBPUkRJTkFMLAorICAgICAgICBUSU1FU1RBTVAsCisgICAgICAgIENVU1RPTSkKKworLy8gcmVhZC1vbmx5LCBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6Om9yZGluYWxfa2V5X3Q+LCBrUGFyYW1JbmRleFJlb3JkZXJLZXk+CisgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFT1JERVJfS0VZW10gPSAib3V0cHV0LnJlb3JkZXIua2V5IjsKKworLyoqCisgKiBTdHJlYW0gY291bnQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3RyZWFtQ291bnQ+IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UW10gPSAiaW5wdXQuc3RyZWFtLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlRbXSA9ICJvdXRwdXQuc3RyZWFtLWNvdW50IjsKKworLyoqCisgKiBDb25maWcgdXBkYXRlIHN1YnNjcmlwdGlvbi4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXM+CisgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFU1tdID0gIm91dHB1dC5zdWJzY3JpYmVkLWluZGljZXMiOworCisvKioKKyAqIFN1Z2dlc3RlZCBidWZmZXIgKEMyRnJhbWUpIGNvdW50LiBUaGlzIGlzIGEgc3VnZ2VzdGlvbiBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgbnVtYmVyIG9mCisgKiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lcyBhbGxvY2F0ZWQgZm9yIHRoZSBjb21wb25lbnQncyB1c2UgaW4gdGhlIGJ1ZmZlciBwb29scy4KKyAqCisgKiBDb21wb25lbnQgc2hhbGwgc2V0IHRoZSBhY2NlcHRhYmxlIHJhbmdlIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBpdC4gRS5nLiBjbGllbnQgc2hhbGwKKyAqIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZhbHVlLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4U3VnZ2VzdGVkQnVmZmVyQ291bnQ+CisgICAgICAgIEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gImlucHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVUdHRVNURURfQlVGRkVSX0NPVU5UW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKKworLyoqCisgKiBJbnB1dC9vdXRwdXQgYmF0Y2hpbmcuCisgKgorICogRm9yIGlucHV0LCBjb21wb25lbnQgcmVxdWVzdHMgdGhhdCBjbGllbnQgYmF0Y2hlcyB3b3JrIGluIGJhdGNoZXMgb2Ygc3BlY2lmaWVkIHNpemUuIEZvciBvdXRwdXQsCisgKiBjbGllbnQgcmVxdWVzdHMgdGhhdCB0aGUgY29tcG9uZW50IGJhdGNoZXMgd29yayBjb21wbGV0aW9uIGluIGdpdmVuIGJhdGNoIHNpemUuCisgKiBWYWx1ZSAwIG1lYW5zIGRvbid0IGNhcmUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4QmF0Y2hTaXplPiBDMlBvcnRCYXRjaFNpemVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9CQVRDSF9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5iYXRjaC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CQVRDSF9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7CisKKy8qKgorICogQ3VycmVudCAmIGxhc3Qgd29yayBvcmRpbmFscy4KKyAqCisgKiBpbnB1dCBwb3J0OiBsYXN0IHdvcmsgcXVldWVkIHRvIGNvbXBvbmVudC4KKyAqIG91dHB1dCBwb3J0OiBsYXN0IHdvcmsgY29tcGxldGVkIGJ5IGNvbXBvbmVudC4KKyAqIGdsb2JhbDogY3VycmVudCB3b3JrLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleExhc3RXb3JrUXVldWVkPiBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleEN1cnJlbnRXb3JrPiBDMkN1cnJlbnRXb3JrVHVuaW5nOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVtb3J5IGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFsbG9jYXRvcnMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSByZXF1ZXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBJZiBub25lIHNwZWNpZmllZCwgY2xpZW50IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBJRCBiYXNlZCBvbiB0aGUgY29tcG9uZW50IGRvbWFpbiBhbmQKKyAqIGtpbmQuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9BTExPQ0FUT1JTW10gPSAiaW5wdXQuYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTW10gPSAib3V0cHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkFsbG9jYXRvcjo6aWRfdD4sIGtQYXJhbUluZGV4QWxsb2NhdG9ycz4KKyAgICAgICAgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSVZBVEVfQUxMT0NBVE9SU1tdID0gImFsZ28uYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKKworLyoqCisgKiBBbGxvY2F0b3IgdG8gdXNlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSByZXF1ZXN0IGFsbG9jYXRvciB0eXBlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBCdWZmZXJRdWV1ZS1iYWNrZWQgYWxsb2NhdG9yIElEIGZvciBvdXRwdXR0aW5nIHRvCisgKiBzdXJmYWNlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN1cmZhY2VBbGxvY2F0b3I+CisgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VSRkFDRV9BTExPQ0FUT1JbXSA9ICJvdXRwdXQuYnVmZmVycy5zdXJmYWNlLWFsbG9jYXRvci1pZCI7CisKKy8qKgorICogQmxvY2sgcG9vbHMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIGNsaWVudCBmb3IgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYWxsb2NhdG9yIElEcyBzcGVjaWZpZWQgYnkgdGhlCisgKiBjb21wb25lbnQuIFRoaXMgaXMgbm90IHVzZWQgZm9yIHRoZSBpbnB1dCBwb3J0LgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+LCBrUGFyYW1JbmRleEJsb2NrUG9vbHM+CisgICAgICAgIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTW10gPSAiYWxnby5idWZmZXJzLnBvb2wtaWRzIjsKKworLyoqCisgKiBUaGUgbWF4IG51bWJlciBvZiBwcml2YXRlIGFsbG9jYXRpb25zIGF0IGFueSBvbmUgdGltZSBieSB0aGUgY29tcG9uZW50LgorICogKFRoaXMgaXMgYW4gYXJyYXkgd2l0aCBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgZm9yIGVhY2ggcHJpdmF0ZSBhbGxvY2F0b3IpCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfUFJJVkFURV9CVUZGRVJfQ09VTlRbXSA9ICJhbGdvLmJ1ZmZlcnMubWF4LWNvdW50IjsKKworLyoqCisgKiBCdWZmZXIgdHlwZQorICoKKyAqIFRoaXMgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIGNsaWVudCB0byBhbGxvY2F0ZSB0aGUgcHJvcGVyIGJ1ZmZlciB0eXBlIGZvciB0aGUKKyAqIGlucHV0IHBvcnQsIGFuZCBjYW4gYmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCB0byBjb250cm9sIHRoZSBidWZmZXIgdHlwZSBmb3IgdGhlIG91dHB1dC4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQnVmZmVyRGF0YTo6dHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlPgorICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAiaW5wdXQuYnVmZmVycy50eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJvdXRwdXQuYnVmZmVycy50eXBlIjsKKworLyoqCisgKiBNZW1vcnkgdXNhZ2UuCisgKgorICogU3VnZ2VzdGVkIGJ5IGNvbXBvbmVudCBmb3IgaW5wdXQgYW5kIG5lZ290aWF0ZWQgYmV0d2VlbiBjbGllbnQgYW5kIGNvbXBvbmVudCBmb3Igb3V0cHV0LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4VXNhZ2U+IEMyU3RyZWFtVXNhZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0VbXSA9ICJpbnB1dC5idWZmZXJzLnVzYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fVVNBR0VbXSA9ICJvdXRwdXQuYnVmZmVycy51c2FnZSI7CisKKy8qKgorICogUGljdHVyZSAodmlkZW8gb3IgaW1hZ2UgZnJhbWUpIHNpemUuCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVTaXplU3RydWN0IHsKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCgpCisgICAgICAgIDogd2lkdGgoMCksIGhlaWdodCgwKSB7IH0KKworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiB3aWR0aCh3aWR0aF8pLCBoZWlnaHQoaGVpZ2h0XykgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsgICAgIC8vLzwgdmlkZW8gd2lkdGgKKyAgICB1aW50MzJfdCBoZWlnaHQ7ICAgIC8vLzwgdmlkZW8gaGVpZ2h0CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVTaXplKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorfTsKKworLyoqCisgKiBPdXQgb2YgbWVtb3J5IHNpZ25hbGluZworICoKKyAqIFRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IHRvIG1hcmsgdGhhdCBpdCBjYW5ub3QgYWxsb2NhdGUgbmVjZXNzYXJ5IHByaXZhdGUgYW5kLworICogb3Igb3V0cHV0IGJ1ZmZlcnMgdG8gY29udGludWUgb3BlcmF0aW9uLCBhbmQgdG8gc2lnbmFsIHRoZSBmYWlsaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBDMk91dE9mTWVtb3J5U3RydWN0IHsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sOyAgIC8vLzwgcG9vbCBJRCB0aGF0IGZhaWxlZCB0aGUgYWxsb2NhdGlvbgorICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgLy8vPCBtZW1vcnkgdXNhZ2UgdXNlZAorICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgcGxhbmFyOyAgICAgLy8vPCBidWZmZXIgZGltZW5zaW9ucyB0byBiZSBhbGxvY2F0ZWQgaWYgMkQKKyAgICB1aW50MzJfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8vLzwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQgaWYgMkQKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIGNhcGFjaXR5IHRvIGJlIGFsbG9jYXRlZCBpZiAxRAorICAgIGMyX2Jvb2xfdCBvdXRPZk1lbW9yeTsgICAgICAgICAgIC8vLzwgdHJ1ZSBpZiBjb21wb25lbnQgaXMgb3V0IG9mIG1lbW9yeQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChPdXRPZk1lbW9yeSkKKyAgICBDMkZJRUxEKHBvb2wsICJwb29sIikKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQocGxhbmFyLCAicGxhbmFyIikKKyAgICBDMkZJRUxEKGZvcm1hdCwgImZvcm1hdCIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKG91dE9mTWVtb3J5LCAib3V0LW9mLW1lbW9yeSIpCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyT3V0T2ZNZW1vcnlTdHJ1Y3QsIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnk+IEMyT3V0T2ZNZW1vcnlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRfT0ZfTUVNT1JZW10gPSAiYWxnby5vb20iOworCisvKioKKyAqIE1heCBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgaXMgYSBoaW50IHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGV4cGVjdGVkIG9uIGEgc3RyZWFtIGZvciB0aGUKKyAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvbiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBUaGlzIGlzIGNvbW11bmljYXRlZCB0byBjbGllbnRzIHNvIHRoZXkKKyAqIGNhbiBwcmVhbGxvY2F0ZSBpbnB1dCBidWZmZXJzLCBvciBjb25maWd1cmUgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhIG1heGltdW0gc2l6ZSBvbgorICogdGhlaXIgYnVmZmVycy4KKyAqCisgKiBSZWFkLW9ubHkuIFJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGNvbXBvbmVudHMgb24gYWxsIGNvbXByZXNzZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplPiBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5tYXgtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMubWF4LXNpemUiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pc2MuIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUcmlwcGVkIHN0YXRlLAorICoKKyAqIFRoaXMgc3RhdGUgZXhpc3RzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSByZWFzb25pbmcgZm9yIGEgdHJpcHBlZCBzdGF0ZSBkdXJpbmcgbm9ybWFsCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucywgYXMgd2VsbCBhcyB0byBhbGxvdyBjbGllbnQgdG8gdHJpcCB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUcmlwcGVkPgorICAgICAgICBDMlRyaXBwZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UUklQUEVEW10gPSAiYWxnby50cmlwcGVkIjsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNvdW50ZXJzLgorICoKKyAqIENvbmZpZ3VyYXRpb25zIGFyZSB0cmFja2VkIHVzaW5nIHRocmVlIGNvdW50ZXJzLiBUaGUgaW5wdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGFjY2VwdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoZSBvdXRwdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGNvbXBsZXRlZCBieSB0aGUgY29tcG9uZW50IChpbiB0aGUgb3JkZXIgb2Ygd29yayBjb21wbGV0aW9uKS4gVGhlCisgKiBnbG9iYWwgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHRvIGVhY2ggY29uZmlnKCkgY2FsbC4gVGhlc2UgY291bnRlcnMKKyAqIHNoYWxsIGJlIHJlYWQtb25seS4KKyAqCisgKiBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY291bnRlcnMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMkNvbmZpZ0NvdW50ZXJUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9DT1VOVEVSW10gPSAiaW5wdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9DT1VOVEVSW10gPSAib3V0cHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT05GSUdfQ09VTlRFUltdID0gImFsZ28uY29uZmlnLmNvdW50ZXIiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNvdXJjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBSZXNvdXJjZXMgbmVlZGVkIGFuZCByZXNvdXJjZXMgcmVzZXJ2ZWQgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXNvdXJjZXMgYXJlIHRyYWNrZWQgYXMgYSB2ZWN0b3Igb2YgcG9zaXRpdmUgbnVtYmVycy4gQXZhaWxhYmxlIHJlc291cmNlcyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4KKyAqCisgKiBCeSBkZWZhdWx0LCBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudC4gSWYgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAqIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgYWJsZSB0byB1c2UgdGhvc2UgcmVzb3VyY2VzIGV4Y2x1c2l2ZWx5LiBJZiBob3dldmVyLCB0aGUgY29tcG9uZW50IGlzCisgKiBub3QgdXNpbmcgYWxsIG9mIHRoZSByZXNlcnZlZCByZXNvdXJjZXMsIHRob3NlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIFRPRE86IGRlZmluZSBzb21lIG9mIHRoZSByZXNvdXJjZXMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQ+IEMyUmVzb3VyY2VzTmVlZGVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkPgorICAgICAgICBDMlJlc291cmNlc1Jlc2VydmVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX05FRURFRFtdID0gInJlc291cmNlcy5uZWVkZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX1JFU0VSVkVEW10gPSAicmVzb3VyY2VzLnJlc2VydmVkIjsKKworLyoqCisgKiBPcGVyYXRpbmcgcmF0ZS4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiB3b3JrIHRocm91Z2ggdGhlIGNvbXBvbmVudC4gTmVnYXRpdmUgdmFsdWVzIGlzCisgKiBpbnZhbGlkLgorICoKKyAqIFRPRE86IHRoaXMgY291bGQgZGlzdGluZ3Vpc2ggc2V0IHZhbHVlCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGU+IEMyT3BlcmF0aW5nUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFW10gPSAiYWxnby5yYXRlIjsKKworLyoqCisgKiBSZWFsdGltZSAvIG9wZXJhdGluZyBwb2ludC4KKyAqCisgKiBQcmlvcml0eSB2YWx1ZSBkZWZpbmVzIHRoZSBvcGVyYXRpbmcgcG9pbnQgZm9yIHRoZSBjb21wb25lbnQuIE9wZXJhdGluZyBwb2ludHMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuIFByaW9yaXR5IHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIG9wZXJhdGlvbiBhdCB0aGUgZ2l2ZW4gb3BlcmF0aW5nCisgKiByYXRlLiBQcmlvcml0eSB2YWx1ZXMgLTEgYW5kIGJlbG93IGRlZmluZSBvcGVyYXRpbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UuIEluIHRoaXMKKyAqIGNhc2UgY2xpZW50IGV4cGVjdHMgYmVzdCBlZmZvcnQgd2l0aG91dCBleGNlZWRpbmcgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBwb2ludC4gVGhpcyBhbGxvd3MKKyAqIGNsaWVudCB0byBydW4gY29tcG9uZW50cyBkZWVwZXIgaW4gdGhlIGJhY2tncm91bmQgYnkgdXNpbmcgbGFyZ2VyIHByaW9yaXR5IHZhbHVlcy4gSW4gdGhlc2UKKyAqIGNhc2VzIG9wZXJhdGluZyByYXRlIGlzIGEgaGludCBmb3IgdGhlIG1heGltdW0gcmF0ZSB0aGF0IHRoZSBjbGllbnQgYW50aWNpcGF0ZXMuCisgKgorICogT3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGFyZSB1c2VkIGluIHRhbmRlbS4gRS5nLiBpZiB0aGVyZSBhcmUgY29tcG9uZW50cyB0aGF0IHJ1biBhdCBhCisgKiBoaWdoZXIgb3BlcmF0aW5nIHBvaW50IChwcmlvcml0eSkgaXQgd2lsbCBtYWtlIG1vcmUgcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgY29tcG9uZW50cyBhdAorICogYSBsb3dlciBvcGVyYXRpbmcgcG9pbnQsIHNvIG9wZXJhdGluZyByYXRlIGNhbiBiZSB1c2VkIHRvIGdhdGUgdGhvc2UgY29tcG9uZW50cy4KKyAqCisgKiBQb3NpdGl2ZSBwcmlvcml0eSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGF0IHRoZSBtb21lbnQgYW5kIHNoYWxsIGJlIHRyZWF0ZWQgZXF1aXZhbGVudCB0byAwLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5PgorICAgICAgICBDMlJlYWxUaW1lUHJpb3JpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklPUklUWVtdID0gImFsZ28ucHJpb3JpdHkiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZWN1cmUgbW9kZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KKyAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFW10gPSAiYWxnby5zZWN1cmUtbW9kZSI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5DT0RFUiBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBCaXRyYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Qml0cmF0ZT4gQzJTdHJlYW1CaXRyYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVbXSA9ICJjb2RlZC5iaXRyYXRlIjsKKworLyoqCisgKiBCaXRyYXRlIG1vZGUuCisgKgorICogVE9ETzogcmVmaW5lIHRoaXMgd2l0aCBiaXRyYXRlIHJhbmdlcyBhbmQgc3VnZ2VzdGVkIHdpbmRvdworICovCitDMkVOVU0oQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBCSVRSQVRFX0NPTlNUX1NLSVBfQUxMT1dFRCA9IDAsICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9DT05TVCA9IDEsICAgICAgICAgICAgICAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9WQVJJQUJMRV9TS0lQX0FMTE9XRUQgPSAyLCAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfVkFSSUFCTEUgPSAzLCAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfSUdOT1JFID0gNywgICAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIGJlIGV4Y2VlZGVkIGF0IHdpbGwgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YWxpdHkgb3Igb3RoZXIgc2V0dGluZ3MKKworICAgIC8vIGJpdHJhdGUgbW9kZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAgICBCSVRSQVRFX0ZMQUdfS0VFUF9BTExfRlJBTUVTID0gMSwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX1ZBUlkgPSAyLAorICAgIEJJVFJBVEVfRkxBR19DQU5fRVhDRUVEID0gNCwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZT4KKyAgICAgICAgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERVtdID0gImFsZ28uYml0cmF0ZS1tb2RlIjsKKworLyoqCisgKiBRdWFsaXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhlIGhpZ2hlciB0aGUgYmV0dGVyIHRoZSBvdXRwdXQgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZgorICogbGVzcyBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBxdWFsaXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJTdHJlYW1RdWFsaXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlF1YWxpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9RVUFMSVRZW10gPSAiYWxnby5xdWFsaXR5IjsKKworLyoqCisgKiBDb21wbGV4aXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhpcyBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSByZXNvdXJjZXMgdGhlIGNvbXBvbmVudAorICogd2lsbCB1c2UgdG8gcHJvZHVjZSBiZXR0ZXIgcXVhbGl0eSBhdCB0aGUgc2FtZSBjb21wcmVzc2lvbiBlZmZpY2llbmN5IG9yIGJldHRlciBjb21wcmVzc2lvbgorICogZWZmaWNpZW5jeSBhdCB0aGUgc2FtZSBxdWFsaXR5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBjb21wbGV4aXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyQ29tcGxleGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFlbXSA9ICJhbGdvLmNvbXBsZXhpdHkiOworCisvKioKKyAqIEhlYWRlciAoaW5pdC1kYXRhKSBoYW5kbGluZyBhcm91bmQgc3luYyBmcmFtZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90LCB1aW50MzJfdCwKKyAgICAvKioKKyAgICAgKiBkb24ndCBwcmVwZW5kIGhlYWRlci4gU2lnbmFsIGhlYWRlciBvbmx5IHRocm91Z2ggQzJTdHJlYW1Jbml0RGF0YUluZm8uCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fTk9ORSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lIGFuZCB0aGVyZWFmdGVyIGJlZm9yZSB0aGUgbmV4dCBzeW5jIGZyYW1lCisgICAgICogaWYgaXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0UsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgZXZlcnkgc3luYyBmcmFtZS4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQywKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZT4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkVbXSA9ICJyYXcuc2l6ZSI7CisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZENyb3BSZWN0PgorICAgICAgICBDMlN0cmVhbVNjYWxlZENyb3BSZWN0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX0NST1BfUkVDVFtdID0gInJhdy5zY2FsZWQtY3JvcCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29sb3IgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIENvbG9yIEluZm8KKyAqCisgKiBDaHJvbWEgbG9jYXRpb24gY2FuIHZhcnkgZm9yIHRvcCBhbmQgYm90dG9tIGZpZWxkcywgc28gdXNlIGFuIGFycmF5LCB0aGF0IGNhbiBoYXZlIDAgdG8gMgorICogdmFsdWVzLiBFbXB0eSBhcnJheSBpcyB1c2VkIGZvciBub24gWVVWIGZvcm1hdHMuCisgKi8KKworc3RydWN0IEMyQ29sb3IgeworICAgIGVudW0gbWF0cml4X3QgOiB1aW50MzJfdDsgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50IChZVVYgPD0+IFJHQikKKyAgICBlbnVtIHBsYW5lX2xheW91dF90IDogdWludDMyX3Q7ICAvLy88IHBsYW5lIGxheW91dCBmb3IgZmxleGlibGUgZm9ybWF0cworICAgIGVudW0gcHJpbWFyaWVzX3QgOiB1aW50MzJfdDsgIC8vLzwgY29sb3IgcHJpbWFyaWVzIGFuZCB3aGl0ZSBwb2ludAorICAgIGVudW0gcmFuZ2VfdCA6IHVpbnQzMl90OyAgLy8vPCByYW5nZSBvZiBjb2xvciBjb21wb25lbnQgdmFsdWVzCisgICAgZW51bSBzdWJzYW1wbGluZ190IDogdWludDMyX3Q7ICAvLy88IGNocm9tYSBzdWJzYW1wbGluZworICAgIGVudW0gdHJhbnNmZXJfdCA6IHVpbnQzMl90OyAgLy8vPCB0cmFuc2ZlciBmdW5jdGlvbgorfTsKKworLy8vIENocm9tYSBzdWJzYW1wbGluZworQzJFTlVNKEMyQ29sb3I6OnN1YnNhbXBsaW5nX3QsIHVpbnQzMl90LAorICAgIE1PTk9DSFJPTUUsICAgICAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzCisgICAgTU9OT0NIUk9NRV9BTFBIQSwgLy8vPCB0aGVyZSBhcmUgbm8gQ3Igbm9yIENiIHBsYW5lcywgYnV0IHRoZXJlIGlzIGFuIGFscGhhIHBsYW5lCisgICAgUkdCLCAgICAgICAgICAgIC8vLzwgUkdCCisgICAgUkdCQSwgICAgICAgICAgIC8vLzwgUkdCQQorICAgIFlVVl80MjAsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgYnkgMiBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgIFlVVl80MjIsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5CisgICAgWVVWXzQ0NCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgbm90IHN1YnNhbXBsZWQKKyAgICBZVVZBXzQ0NCwgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZCwgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKykKKworc3RydWN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0IHsKKyAgICAvLyBjaHJvbWEgb2Zmc2V0cyBkZWZpbmVkIGJ5IElUVQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80NDQoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMCgpIHsgcmV0dXJuIHsgMC4wZiwgMC41ZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8xKCkgeyByZXR1cm4geyAwLjVmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMygpIHsgcmV0dXJuIHsgMC41ZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF80KCkgeyByZXR1cm4geyAwLjBmLCAxLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzUoKSB7IHJldHVybiB7IDAuNWYsIDEuMGYgfTsgfQorCisgICAgZmxvYXQgeDsgICAgLy8vPCB4IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgcmlnaHQpCisgICAgZmxvYXQgeTsgICAgLy8vPCB5IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgZG93bikKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ2hyb21hT2Zmc2V0KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyQ29sb3JJbmZvU3RydWN0IHsKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgpCisgICAgICAgIDogYml0RGVwdGgoOCksIHN1YnNhbXBsaW5nKEMyQ29sb3I6OllVVl80MjApIHsgfQorCisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbXTsgLy8gbWF4IDIgZWxlbWVudHMKKworICAgIEMyQ29sb3JJbmZvU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgYml0RGVwdGhfLCBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nXykKKyAgICAgICAgOiBiaXREZXB0aChiaXREZXB0aF8pLCBzdWJzYW1wbGluZyhzdWJzYW1wbGluZ18pIHsgfQorCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfLAorICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyQ2hyb21hT2Zmc2V0U3RydWN0PiBsb2NhdGlvbnNfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0ICZsb2NhdGlvbiA6IGxvY2F0aW9uc18pIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2F0aW9uc1tpeF0gPSBsb2NhdGlvbjsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoQ29sb3JJbmZvLCBsb2NhdGlvbnMpCisgICAgQzJGSUVMRChiaXREZXB0aCwgImJpdC1kZXB0aCIpCisgICAgQzJGSUVMRChzdWJzYW1wbGluZywgInN1YnNhbXBsaW5nIikKKyAgICBDMkZJRUxEKGxvY2F0aW9ucywgImxvY2F0aW9ucyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9ySW5mb1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckluZm8+IEMyU3RyZWFtQ29sb3JJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09MT1JfSU5GT1tdID0gInJhdy5jb2xvci1mb3JtYXQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GT1tdID0gImNvZGVkLmNvbG9yLWZvcm1hdCI7CisKKy8qKgorICogQ29sb3IgQXNwZWN0cworICovCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgZW51bWVyYXRvcnMgaXMgYXMgZGVzY3JpYmVkIGluIElUVS1UIEguMjczLiAqLworCisvLy8gUmFuZ2UKK0MyRU5VTShDMkNvbG9yOjpyYW5nZV90LCB1aW50MzJfdCwKKyAgICBSQU5HRV9VTlNQRUNJRklFRCwgICAgICAgICAgLy8vPCByYW5nZSBpcyB1bnNwZWNpZmllZAorICAgIFJBTkdFX0ZVTEwsICAgICAgICAgICAgICAgICAvLy88IGZ1bGwgcmFuZ2UKKyAgICBSQU5HRV9MSU1JVEVELCAgICAgICAgICAgICAgLy8vPCBsaW1pdGVkIHJhbmdlCisKKyAgICBSQU5HRV9WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcmFuZ2UgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBSQU5HRV9PVEhFUiA9IDBYRkYgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBDb2xvciBwcmltYXJpZXMKK0MyRU5VTShDMkNvbG9yOjpwcmltYXJpZXNfdCwgdWludDMyX3QsCisgICAgUFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHByaW1hcmllcyBhcmUgdW5zcGVjaWZpZWQKKyAgICBQUklNQVJJRVNfQlQ3MDksICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS02IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ0NzBfTSwgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MC02IFN5c3RlbSBNIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC42MDEtNiA1MjUgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19HRU5FUklDX0ZJTE0sICAgICAgICAgLy8vPCBHZW5lcmljIEZpbG0KKyAgICBQUklNQVJJRVNfQlQyMDIwLCAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19SUDQzMSwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBSUCA0MzEtMiBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0VHNDMyLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIEVHIDQzMi0xIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUJVMzIxMywgICAgICAgICAgICAgIC8vLzwgRUJVIFRlY2guMzIxMy1FIG9yIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLworICAgIFBSSU1BUklFU19WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcHJpbWFyaWVzIHZhbHVlcyBzdGFydCBoZXJlCisgICAgUFJJTUFSSUVTX09USEVSID0gMHhmZiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIFRyYW5zZmVyIGZ1bmN0aW9uCitDMkVOVU0oQzJDb2xvcjo6dHJhbnNmZXJfdCwgdWludDMyX3QsCisgICAgVFJBTlNGRVJfVU5TUEVDSUZJRUQsICAgICAgICAgICAvLy88IHRyYW5zZmVyIGlzIHVuc3BlY2lmaWVkCisgICAgVFJBTlNGRVJfTElORUFSLCAgICAgICAgICAgICAgICAvLy88IExpbmVhciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MKKyAgICBUUkFOU0ZFUl9TUkdCLCAgICAgICAgICAgICAgICAgIC8vLzwgc1JHQiBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfMTcwTSwgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDE3ME0gb3IgZXF1aXZhbGVudCAoZS5nLiBCVC42MDEvNzA5LzIwMjApCisgICAgVFJBTlNGRVJfR0FNTUEyMiwgICAgICAgICAgICAgICAvLy88IEFzc3VtZWQgZGlzcGxheSBnYW1tYSAyLjIKKyAgICBUUkFOU0ZFUl9HQU1NQTI4LCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuOAorICAgIFRSQU5TRkVSX1NUMjA4NCwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC8xMi8xNC8xNiBiaXQgc3lzdGVtcworICAgIFRSQU5TRkVSX0hMRywgICAgICAgICAgICAgICAgICAgLy8vPCBBUklCIFNURC1CNjcgaHlicmlkLWxvZy1nYW1tYQorCisgICAgVFJBTlNGRVJfMjQwTSA9IDB4NDAsICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX1hWWUNDLCAgICAgICAgICAgICAgICAgLy8vPCBJRUMgNjE5NjYtMi00IG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl9CVDEzNjEsICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjEzNjEgZXh0ZW5kZWQgZ2FtdXQKKyAgICBUUkFOU0ZFUl9TVDQyOCwgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgU1QgNDI4LTEgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgVFJBTlNGRVJfVkVORE9SX1NUQVJUID0gMHg4MCwgICAvLy88IHZlbmRvci1zcGVjaWZpYyB0cmFuc2ZlciB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFRSQU5TRkVSX09USEVSID0gMHhmZiAgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBNYXRyaXggY29lZmZpY2llbnQKK0MyRU5VTShDMkNvbG9yOjptYXRyaXhfdCwgdWludDMyX3QsCisgICAgTUFUUklYX1VOU1BFQ0lGSUVELCAgICAgICAgICAgICAvLy88IG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHVuc3BlY2lmaWVkCisgICAgTUFUUklYX0JUNzA5LCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC43MDktNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgICAgICAgICAvLy88IEZDQyBUaXRsZSA0NyBDRlIgNzMuNjgyIG9yIGVxdWl2YWxlbnQgKEtSPTAuMzAsIEtCPTAuMTEpCisgICAgTUFUUklYX0JUNjAxLCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC40NzAsIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYXzI0ME0sICAgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIE1BVFJJWF9CVDIwMjAsICAgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIGNvbnN0YW50IGx1bWluYW5jZQorICAgIE1BVFJJWF9WRU5ET1JfU1RBUlQgPSAweDgwLCAgICAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgbWF0cml4IGNvZWZmaWNpZW50IHZhbHVlcyBzdGFydCBoZXJlCisgICAgTUFUUklYX09USEVSID0gMHhmZiwgICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCB1aW50MzJfdCBjb3VudF8pCisgICAgICAgIDogdHlwZV8odHlwZSksIGNvdW50KGNvdW50XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEdvcExheWVyKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGNvdW50LCAiY291bnQiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyR29wTGF5ZXJTdHJ1Y3Q+LCBrUGFyYW1JbmRleEdvcD4KKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9HT1BbXSA9ICJjb2RpbmcuZ29wIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCisgKgorICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZAorICogc3luY2hyb25vdXNseSB3aXRoIHRoZSB3b3JrLCBvciBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50IC0gbGVhZGluZyB0byBkaWZmZXJlbnQgcmVzdWx0LgorICogSWYgaXQgaXMgcGFzc2VkIHdpdGggd29yaywgaXQgc2hhbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGF0IHdvcmsgaXRlbSBpcyBiZWluZyBwcm9jZXNzZWQgKHNvCisgKiB0aGUgZmlyc3QgSSBmcmFtZSBhdCBvciBhZnRlciB0aGF0IHdvcmsgaXRlbSBzaGFsbCBiZSBhIHN5bmMgZnJhbWUpLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lPgorICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJjb2RpbmcucmVxdWVzdC1zeW5jLWZyYW1lIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGludGVydmFsIGluIHRpbWUgZG9tYWluICh0aW1lc3RhbXApLgorICoKKyAqIElmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGlzIHZhbHVlLCB0aGUgbmV4dCBpbnRyYSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkCisgKiBhcyBhIHN5bmMgZnJhbWUuIFRoZSB2YWx1ZSBvZiBNQVhfSTY0IG9yIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gc3luYyBmcmFtZXMgYWZ0ZXIgdGhlIGZpcnN0CisgKiBmcmFtZS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGFsbCBzeW5jIGZyYW1lcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWw+CisgICAgICAgIEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMW10gPSAiY29kaW5nLnN5bmMtZnJhbWUtaW50ZXJ2YWwiOworCisvKioKKyAqIFRlbXBvcmFsIGxheWVyaW5nCisgKgorICogTGF5ZXIgaW5kZXggaXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIGxheWVyIGNvdW50IC0gMS4gTGF5ZXJzIHdpdGggaGlnaGVyIGluZGV4IGhhdmUgaGlnaGVyCisgKiBmcmVxdWVuY3k6CisgKiAgICAgMAorICogICAxICAgMQorICogIDIgMiAyIDIKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckluZGV4PiBDMlN0cmVhbUxheWVySW5kZXhJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfSU5ERVhbXSA9ICJjb2RlZC5sYXllci1pbmRleCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TGF5ZXJDb3VudD4gQzJTdHJlYW1MYXllckNvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0xBWUVSX0NPVU5UW10gPSAiY29kZWQubGF5ZXItY291bnQiOworCitzdHJ1Y3QgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0IHsKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QoKQorICAgICAgICA6IGxheWVyQ291bnQoMCksIGJMYXllckNvdW50KDApIHsgfQorCisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KHNpemVfdCAvKiBmbGV4Q291bnQgKi8sIHVpbnQzMl90IGxheWVyQ291bnRfLCB1aW50MzJfdCBiTGF5ZXJDb3VudF8pCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGZsb2F0PiByYXRpb3MpCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGZsb2F0IHJhdGlvIDogcmF0aW9zKSB7CisgICAgICAgICAgICBpZiAoaXggPT0gZmxleENvdW50KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiaXRyYXRlUmF0aW9zW2l4KytdID0gcmF0aW87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBsYXllckNvdW50OyAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgbGF5ZXJzICgwIG1lYW5zIG5vIHRlbXBvcmFsIGxheWVyaW5nKQorICAgIHVpbnQzMl90IGJMYXllckNvdW50OyAgICAvLy88IHRvdGFsIG51bWJlciBvZiBiaWRpcmVjdGlvbmFsIGxheWVycyAoPD0gbnVtIGxheWVycykKKyAgICAvKioKKyAgICAgKiBCaXRyYXRlIGJ1ZGdldHMgZm9yIGVhY2ggbGF5ZXIgYW5kIHRoZSBsYXllcnMgYmVsb3csIGdpdmVuIGFzIGEgcmF0aW8gb2YgdGhlIHRvdGFsCisgICAgICogc3RyZWFtIGJpdHJhdGUuIFRoaXMgY2FuIGJlIG9taXR0ZWQgb3IgcGFydGlhbGx5IHNwZWNpZmlmZWQgYnkgdGhlIGNsaWVudCB3aGlsZSBjb25maWd1cmluZywKKyAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb21wb25lbnQgc2hhbGwgZmlsbCBpbiBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBtaXNzaW5nIGxheWVycy4KKyAgICAgKiBUaGlzIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aGVuIHF1ZXJpZWQgZm9yIGF0IGxlYXN0IGxheWVyIGNvdW50IC0gMSAoYXMgdGhlCisgICAgICogbGFzdCBsYXllcidzIGJ1ZGdldCBpcyBhbHdheXMgMS4wKS4KKyAgICAgKi8KKyAgICBmbG9hdCBiaXRyYXRlUmF0aW9zW107ICAgLy8vPCAxLjAtYmFzZWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZW1wb3JhbExheWVyaW5nLCBiaXRyYXRlUmF0aW9zKQorICAgIEMyRklFTEQobGF5ZXJDb3VudCwgImxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJMYXllckNvdW50LCAiYi1sYXllci1jb3VudCIpCisgICAgQzJGSUVMRChiaXRyYXRlUmF0aW9zLCAiYml0cmF0ZS1yYXRpb3MiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZz4KKyAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkdbXSA9ICJjb2RpbmcudGVtcG9yYWwtbGF5ZXJpbmciOworCisvKioKKyAqIEludHJhLXJlZnJlc2guCisgKi8KKworQzJFTlVNKEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCwgdWludDMyX3QsCisgICAgSU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgICAgIC8vLzwgbm8gaW50cmEgcmVmcmVzaAorICAgIElOVFJBX1JFRlJFU0hfQVJCSVRSQVJZLCAgICAvLy88IGFyYml0cmFyeSwgdW5zcGVjaWZpZWQKKykKKworc3RydWN0IEMySW50cmFSZWZyZXNoU3RydWN0IHsKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdCgpCisgICAgICAgIDogbW9kZShDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCksIHBlcmlvZCgwLikgeyB9CisKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdChDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QgbW9kZV8sIGZsb2F0IHBlcmlvZF8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHBlcmlvZChwZXJpb2RfKSB7IH0KKworICAgIEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlOyAvLy88IHJlZnJlc2ggbW9kZQorICAgIGZsb2F0IHBlcmlvZDsgICAgICAgICAvLy88IGludHJhIHJlZnJlc2ggcGVyaW9kIGluIGZyYW1lcyAobXVzdCBiZSA+PSAxKSwgMCBtZWFucyBkaXNhYmxlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChJbnRyYVJlZnJlc2gpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRChwZXJpb2QsICJwZXJpb2QiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludHJhUmVmcmVzaFN0cnVjdCwga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2g+CisgICAgICAgIEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSFtdID0gImNvZGluZy5pbnRyYS1yZWZyZXNoIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UgQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRpbGUgbGF5b3V0LgorICoKKyAqIFRoaXMgZGVzY3JpYmVkIGhvdyB0aGUgaW1hZ2UgaXMgZGVjb21wb3NlZCBpbnRvIHRpbGVzLgorICovCitDMkVOVU0oQzJDb25maWc6OnNjYW5fb3JkZXJfdCwgdWludDMyX3QsCisgICAgU0NBTl9MRUZUX1RPX1JJR0hUX1RIRU5fRE9XTgorKQorCitzdHJ1Y3QgQzJUaWxlTGF5b3V0U3RydWN0IHsKKyAgICBDMlBpY3R1cmVTaXplU3RydWN0IHRpbGU7ICAgICAgIC8vLzwgdGlsZSBzaXplCisgICAgdWludDMyX3QgY29sdW1uQ291bnQ7ICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aWxlcyBob3Jpem9udGFsbHkKKyAgICB1aW50MzJfdCByb3dDb3VudDsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIHZlcnRpY2FsbHkKKyAgICBDMkNvbmZpZzo6c2Nhbl9vcmRlcl90IG9yZGVyOyAgIC8vLzwgdGlsZSBvcmRlcgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUaWxlTGF5b3V0KQorICAgIEMyRklFTEQodGlsZSwgInRpbGUiKQorICAgIEMyRklFTEQoY29sdW1uQ291bnQsICJjb2x1bW5zIikKKyAgICBDMkZJRUxEKHJvd0NvdW50LCAicm93cyIpCisgICAgQzJGSUVMRChvcmRlciwgIm9yZGVyIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVGlsZUxheW91dFN0cnVjdCwga1BhcmFtSW5kZXhUaWxlTGF5b3V0PiBDMlN0cmVhbVRpbGVMYXlvdXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVRbXSA9ICJjb2RlZC50aWxlLWxheW91dCI7CisKKy8qKgorICogVGlsZSBoYW5kbGluZy4KKyAqCisgKiBXaGV0aGVyIHRvIGNvbmNhdGVuYXRlIHRpbGVzIG9yIG91dHB1dCB0aGVtIGVhY2guCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6dGlsaW5nX21vZGVfdCwgdWludDMyX3QsCisgICAgVElMSU5HX1NFUEFSQVRFLCAgICAvLy88IG91dHB1dCBlYWNoIHRpbGUgaW4gYSBzZXBhcmF0ZSBvbldvcmtEb25lCisgICAgVElMSU5HX0NPTkNBVEVOQVRFICAvLy88IG91dHB1dCBvbmUgd29yayBjb21wbGV0aW9uIHBlciBmcmFtZSAoY29uY2F0ZW5hdGUgdGlsZXMpCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVIYW5kbGluZz4KKyAgICAgICAgQzJTdHJlYW1UaWxlSGFuZGxpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0hBTkRMSU5HW10gPSAiY29kaW5nLnRpbGUtaGFuZGxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBVURJTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogU2FtcGxlIHJhdGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTYW1wbGVSYXRlPiBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEVbXSA9ICJyYXcuc2FtcGxlLXJhdGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEVbXSA9ICJjb2RlZC5zYW1wbGUtcmF0ZSI7CisKKy8qKgorICogQ2hhbm5lbCBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcuY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQuY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogTWF4IGNoYW5uZWwgY291bnQuIFVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb2RlZCBvciBkZWNvZGVkIGNoYW5uZWxzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudD4gQzJTdHJlYW1NYXhDaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcubWF4LWNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5tYXgtY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogQXVkaW8gc2FtcGxlIGZvcm1hdCAoUENNIGVuY29kaW5nKQorICovCitDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKKyAgICBQQ01fMTYsCisgICAgUENNXzgsCisgICAgUENNX0ZMT0FUCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBjbV9lbmNvZGluZ190Piwga1BhcmFtSW5kZXhQY21FbmNvZGluZz4KKyAgICAgICAgQzJTdHJlYW1QY21FbmNvZGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkdbXSA9ICJyYXcucGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1BDTV9FTkNPRElOR1tdID0gImNvZGVkLnBjbS1lbmNvZGluZyI7CisKKy8qKgorICogQUFDIFNCUiBNb2RlLiBVc2VkIGR1cmluZyBlbmNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdCwgdWludDMyX3QsCisgICAgQUFDX1NCUl9PRkYsCisgICAgQUFDX1NCUl9TSU5HTEVfUkFURSwKKyAgICBBQUNfU0JSX0RVQUxfUkFURSwKKyAgICBBQUNfU0JSX0FVVE8gLy8vPCBsZXQgdGhlIGNvZGVjIGRlY2lkZQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdD4sIGtQYXJhbUluZGV4QWFjU2JyTW9kZT4KKyAgICAgICAgQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFW10gPSAiY29kaW5nLmFhYy1zYnItbW9kZSI7CisKKy8qKgorICogRFJDIENvbXByZXNzaW9uLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90LCBpbnQzMl90LAorICAgIERSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgRFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgIERSQ19DT01QUkVTU0lPTl9IRUFWWSAvLy88CispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24+CisgICAgICAgIEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREVbXSA9ICJjb2RpbmcuZHJjLmNvbXByZXNzaW9uLW1vZGUiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTFtdID0gImNvZGluZy5kcmMucmVmZXJlbmNlLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLmVuY29kZWQtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SW10gPSAiY29kaW5nLmRyYy5ib29zdC1mYWN0b3IiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiY29kaW5nLmRyYy5hdHRlbnVhdGlvbi1mYWN0b3IiOworCisvKioKKyAqIERSQyBFZmZlY3QgVHlwZSAoc2VlIElTTyAyMzAwMy00KSBVbmlmb3JtIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3QsIGludDMyX3QsCisgICAgRFJDX0VGRkVDVF9PRE1fREVGQVVMVCA9IC0yLCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfRUZGRUNUX09GRiA9IC0xLCAgICAvLy88IG5vIERSQworICAgIERSQ19FRkZFQ1RfTk9ORSA9IDAsICAgIC8vLzwgbm8gRFJDIGV4Y2VwdCB0byBwcmV2ZW50IGNsaXBwaW5nCisgICAgRFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgIERSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgRFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgIERSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgIERSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgIERSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTgorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlPgorICAgICAgICBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEVbXSA9ICJjb2RpbmcuZHJjLmVmZmVjdC10eXBlIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFBQyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFBQyBzdHJlYW0gZm9ybWF0CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190LCB1aW50MzJfdCwKKyAgICBBQUNfUEFDS0FHSU5HX1JBVywKKyAgICBBQUNfUEFDS0FHSU5HX0FEVFMKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmc+IEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvIEMyU3RyZWFtQWFjRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkdbXSA9ICJjb2RlZC5hYWMtcGFja2FnaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUExBVEZPUk0tREVGSU5FRCBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogUGxhdGZvcm0gbGV2ZWwgYW5kIGZlYXR1cmVzLgorICovCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3QgeworICAgIFBMQVRGT1JNX1AsICAgLy8vPCBzdXBwb3J0IGZvciBBbmRyb2lkIDkuMCBmZWF0dXJlIHNldAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWw+CisgICAgICAgIEMyUGxhdGZvcm1MZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9MRVZFTFtdID0gImFwaS5wbGF0Zm9ybS1sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICAvLyBubyBwbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcz4KKyAgICAgICAgQzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0ZFQVRVUkVTW10gPSAiYXBpLnBsYXRmb3JtLWZlYXR1cmVzIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBpb24gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIG1lbW9yeSB1c2FnZS4KKyAqLworc3RydWN0IEMyU3RvcmVJb25Vc2FnZVN0cnVjdCB7CisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QodWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgaGVhcE1hc2soMCksIGFsbG9jRmxhZ3MoMCksIG1pbkFsaWdubWVudCgwKSB7IH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAvLy88IGNhcGFjaXR5CisgICAgaW50MzJfdCBoZWFwTWFzazsgICAgICAvLy88IGlvbiBoZWFwTWFzaworICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIHVpbnQzMl90IG1pbkFsaWdubWVudDsgLy8vPCBtaW5pbXVtIGFsaWdubWVudAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChTdG9yZUlvblVzYWdlKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGhlYXBNYXNrLCAiaGVhcC1tYXNrIikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChtaW5BbGlnbm1lbnQsICJtaW4tYWxpZ25tZW50IikKK307CisKKy8vIHN0b3JlLCBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZT4KKyAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKKworLyoqCisgKiBGbGV4aWJsZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgeworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGJpdERlcHRoOworICAgIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmc7CisgICAgQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QgbGF5b3V0OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcikKKyAgICBDMkZJRUxEKHBpeGVsRm9ybWF0LCAicGl4ZWwtZm9ybWF0IikKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobGF5b3V0LCAibGF5b3V0IikKK307CisKKy8qKgorICogUGxhbmUgbGF5b3V0IG9mIGZsZXhpYmxlIHBpeGVsIGZvcm1hdHMuCisgKgorICogYnBwOiBieXRlcyBwZXIgY29sb3IgY29tcG9uZW50LCBlLmcuIDEgZm9yIDgtYml0IGZvcm1hdHMsIGFuZCAyIGZvciAxMC0xNi1iaXQgZm9ybWF0cy4KKyAqLworQzJFTlVNKEMyQ29sb3I6OnBsYW5lX2xheW91dF90LCB1aW50MzJfdCwKKyAgICAgICAvKiogVW5rbm93biBsYXlvdXQgKi8KKyAgICAgICBVTktOT1dOX0xBWU9VVCwKKworICAgICAgIC8qKiBQbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jID0gYnBwKSAqLworICAgICAgIFBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogU2VtaXBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmNfWS9BID0gYnBwIChwbGFuYXIpLAorICAgICAgICAqICBjb2xJbmNfQ2IvQ3IgPSAyKmJwcCAoaW50ZXJsZWF2ZWQpLiBVc2VkIG9ubHkgZm9yIFlVVihBKSBmb3JtYXRzLiAqLworICAgICAgIFNFTUlQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIHBhY2tlZC4gY29sSW5jID0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgYWxpZ25lZC4gY29sSW5jID0gc21hbGxlc3QgcG93ZXIgb2YgMiA+PSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvcgorICAgICAgICAqICBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX0FMSUdORUQKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycz4KKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIGRhdGFzcGFjZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGF0YVNwYWNlPiBDMlN0cmVhbURhdGFTcGFjZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFW10gPSAicmF3LmRhdGEtc3BhY2UiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBzdXJmYWNlIHNjYWxpbmcgbW9kZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmc+IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc3VyZmFjZS1zY2FsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElOUFVUIFNVUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW5wdXQgc3VyZmFjZSBFT1MKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zPgorICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TW10gPSAiaW5wdXQtc3VyZmFjZS5lb3MiOworCisvKioKKyAqIFN0YXJ0L3N1c3BlbmQvcmVzdW1lL3N0b3AgY29udHJvbHMgYW5kIHRpbWVzdGFtcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogVE9ETzogbWFrZSB0aGVzZSBjb3VudGVycworICovCisKK3N0cnVjdCBDMlRpbWVkQ29udHJvbFN0cnVjdCB7CisgICAgYzJfYm9vbF90IGVuYWJsZWQ7IC8vLzwgY29udHJvbCBpcyBlbmFibGVkCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgaWYgZW5hYmxlZCwgdGltZSB0aGUgY29udHJvbCBzaG91bGQgdGFrZSBlZmZlY3QKKworICAgIEMyVGltZWRDb250cm9sU3RydWN0KCkKKyAgICAgICAgOiBlbmFibGVkKEMyX0ZBTFNFKSwgdGltZXN0YW1wKDApIHsgfQorCisgICAgLyogaW1wbGljaXQgKi8gQzJUaW1lZENvbnRyb2xTdHJ1Y3QodWludDY0X3QgdGltZXN0YW1wXykKKyAgICAgICAgOiBlbmFibGVkKEMyX1RSVUUpLCB0aW1lc3RhbXAodGltZXN0YW1wXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVkQ29udHJvbCkKKyAgICBDMkZJRUxEKGVuYWJsZWQsICAgImVuYWJsZWQiKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0YXJ0QXQ+CisgICAgICAgIEMyUG9ydFN0YXJ0VGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVEFSVF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RhcnQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3VzcGVuZEF0PgorICAgICAgICBDMlBvcnRTdXNwZW5kVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVVNQRU5EX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdXNwZW5kIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFJlc3VtZUF0PgorICAgICAgICBDMlBvcnRSZXN1bWVUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1JFU1VNRV9BVFtdID0gImlucHV0LXN1cmZhY2UucmVzdW1lIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0b3BBdD4KKyAgICAgICAgQzJQb3J0U3RvcFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RPUF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RvcCI7CisKKy8qKgorICogVGltZSBvZmZzZXQgZm9yIGlucHV0IHN1cmZhY2UuIElucHV0IHRpbWVzdGFtcCB0byBjb2RlYyBpcyBzdXJmYWNlIGJ1ZmZlciB0aW1lc3RhbXAgcGx1cyB0aGlzCisgKiB0aW1lIG9mZnNldC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4VGltZU9mZnNldD4gQzJDb21wb25lbnRUaW1lT2Zmc2V0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FX09GRlNFVFtdID0gImlucHV0LXN1cmZhY2UudGltZS1vZmZzZXQiOworCisvKioKKyAqIE1pbmltdW0gZnBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFJlcGVhdCBmcmFtZSB0byBtZWV0IHRoaXMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGU+IEMyUG9ydE1pbkZyYW1lUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfTUlOX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC1zdXJmYWNlLm1pbi1mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lc3RhbXAgYWRqdXN0bWVudCAob3ZlcnJpZGUpIGZvciBpbnB1dCBzdXJmYWNlIGJ1ZmZlcnMuIFRoZXNlIGNvbnRyb2wgdGhlIGlucHV0IHRpbWVzdGFtcAorICogZmVkIHRvIHRoZSBjb2RlYywgYnV0IGRvIG5vdCBpbXBhY3QgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QgeworICAgIC8vLyBjb250cm9sIG1vZGVzCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKTsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QobW9kZV90IG1vZGVfLCB1aW50NjRfdCB2YWx1ZV8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHZhbHVlKHZhbHVlXykgeyB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgLy8vPCBjb250cm9sIG1vZGUKKyAgICB1aW50NjRfdCB2YWx1ZTsgLy8vPCBjb250cm9sIHZhbHVlIGZvciBnYXAgYmV0d2VlbiB0d28gdGltZXN0YW1wCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVzdGFtcEdhcEFkanVzdG1lbnQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK0MyRU5VTShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBNSU5fR0FQLAorICAgIEZJWEVEX0dBUCwKKyk7CisKK2lubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6OkMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpCisgICAgOiBtb2RlKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6Tk9ORSksIHZhbHVlKDApIHsgfQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkVOVU1fSF8KKyNkZWZpbmUgQzJFTlVNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVG9vbHMgZm9yIGVhc2llciBlbnVtIHN1cHBvcnQuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCisgKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0MyRW51bUNvbnN0IHsKK3B1YmxpYzoKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAorICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAorICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCisgICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KKyAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKKyAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Citwcml2YXRlOgorICAgIFQgX21WYWx1ZTsKK307CisKKy8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQorLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKKy8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorCisvLy8gXGVuZGNvbmQKKworY2xhc3MgX0MyRW51bVV0aWxzIHsKKyAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSk7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXggPSBudWxscHRyKTsKKworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X0VudW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorICAgIC8vIHRoaXMgbWF5IG5vdCBiZSB1c2VkLi4uCisgICAgc3RhdGljIEMyX0hJREUgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IG51bGxwdHIpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzID0gc2FuaXRpemVFbnVtVmFsdWVOYW1lcyhuYW1lcywgcHJlZml4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpICYmIGkgPCBzYW5pdGl6ZWROYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKHNhbml0aXplZE5hbWVzW2ldLCB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgY3VzdG9tRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIEU+PiBpdGVtcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIHR5cGUsIHByZWZpeCwgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUiMjZW5hYmxlZChuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgcHJlZml4KTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIjI2VuYWJsZWQobmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6Y3VzdG9tRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgbmFtZT4+IG5hbWVzKTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyLiBUaGUgZGVmYXVsdCBtYXBwZXIKKyAqIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggYWNyb3NzIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcywgYW5kCisgKiByZXBsYWNlcyBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTShjMl9lbnVtX3QsIHVpbnQzMl90LAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICIxIiwgQzJfVkFMVUUyID0+ICIyIiwgLi4uCisgKiAgLy8gbG9uZ2VzdCBjb21tb24gcHJlZml4IGlzICJDMl9WQUxVRSIKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICovCisjZGVmaW5lIEMyRU5VTShuYW1lLCB0eXBlLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBudWxscHRyLCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlciBidXQgY3VzdG9tIHByZWZpeC4gVGhlIGRlZmF1bHQKKyAqIG1hcHBlciByZW1vdmVzIHRoZSBwcmVmaXggZnJvbSBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMgKGlmIHByZXNlbnQpLCBhbmQKKyAqIGluc2VydHMgZGFzaGVzIGF0IGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyAobG93SGlnaCBiZWNvbWVzIGxvdy1oaWdoKSBhbmQgYWxzbyByZXBsYWNlcworICogbm9uLWxlYWRpbmcgdW5kZXJzY29yZXMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fUFJFRklYKGMyX2VudW1fdCwgdWludDMyX3QsICJDMl8iLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJWQUxVRTEiLCBDMl9WQUxVRTIgPT4gIlZBTFVFMiIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKiBccGFyYW0gcHJlZml4IHByZWZpeCB0byByZW1vdmUKKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX1BSRUZJWChuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCBjdXN0b20gbmFtZXMuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fTkFNRVMoU29tZVN0cnVjdDo6YzJfZW51bV90LCB1aW50MzJfdCwgKHsKKyAqICAgICAgeyAiT25lIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUxIH0sCisgKiAgICAgIHsgIlR3byIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMiB9LAorICogICAgICB7ICJUaHJlZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMyB9IH0pLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKgorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiT25lIiwgQzJfVkFMVUUyID0+ICJUd28iLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9OQU1FUyhuYW1lLCB0eXBlLCBuYW1lcywgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykKKworLyoqCisgKiBNYWtlIGVudW1zIHVzYWJsZSBhcyB0aGVpciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBOb3RlOiB0aGlzIG1ha2VzIHRoZW0gbm90IHVzYWJsZSBpbiBwcmludGYoKQorICovCit0ZW1wbGF0ZTxjbGFzcyBFPgorc3RydWN0IEMyRWFzeUVudW0geworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICBFIHZhbHVlOworICAgIC8vIGRlZmluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgRSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKEUgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXykgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKFUgdmFsdWVfKSA6IHZhbHVlKEUodmFsdWVfKSkgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKCkgPSBkZWZhdWx0OworfTsKKworLy8gbWFrZSBDMkVhc3lFbnVtIGJlaGF2ZSBsaWtlIGEgcmVndWxhciBlbnVtCisKK25hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IGlzX2VudW08QzJFYXN5RW51bTxFPj4geworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQzJFTlVNX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJQQVJBTV9IXworI2RlZmluZSBDMlBBUkFNX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCisKKy8qIQorICogXGZpbGUKKyAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKKyAqID09PQorICoKKyAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCisgKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKKyAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKKyAqIG1ldGhvZHMuCisgKgorICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6CisgKgorICogUmVzdHJpY3Rpb25zOgorICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKKyAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCisgKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCisgKiAgIC0gc29tZSBjb21tb24gbWVtYmVyIGZpZWxkIG5hbWVzIGFyZSByZXNlcnZlZCBhcyB0aGV5IGFyZSBkZWZpbmVkIGFzIG1ldGhvZHMgZm9yIGFsbAorICogICAgIHBhcmFtZXRlcnM6CisgKiAgICAgdGhleSBhcmU6IHNpemUsIHR5cGUsIGtpbmQsIGluZGV4IGFuZCBzdHJlYW0KKyAqCisgKiBCZWhhdmlvcjoKKyAqIC0gUGFyYW1zIGNhbiBiZSBnbG9iYWwgKG5vdCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCksIHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0LAorICogICBvciByZWxhdGVkIHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uCisgKiAtIEFsbCBwYXJhbXMgYXJlIHF1ZXJpZWQvc2V0IHVzaW5nIGEgdW5pcXVlIHBhcmFtIGluZGV4LCB3aGljaCBpbmNvcnBvcmF0ZXMgYSBwb3RlbnRpYWwgc3RyZWFtCisgKiAgIGluZGV4IGFuZC9vciBwb3J0LgorICogLSBRdWVyeWluZyAoc3VwcG9ydGVkKSBwYXJhbXMgTVVTVCBuZXZlciBmYWlsLgorICogLSBBbGwgcGFyYW1zIE1VU1QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KKyAqIC0gSWYgc29tZSBmaWVsZHMgaGF2ZSAidW5zdXBwb3J0ZWQiIG9yICJpbnZhbGlkIiB2YWx1ZXMgZHVyaW5nIHNldHRpbmcsIHRoaXMgU0hPVUxEIGJlCisgKiAgIGNvbW11bmljYXRlZCB0byB0aGUgYXBwLgorICogICBhKSBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBhdm9pZGVkLiAgV2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMsIGluIGdlbmVyYWwsIGNvbXBvbmVudCBzaG91bGQgZG8KKyAqICAgICAiYmVzdCBlZmZvcnQiIHRvIGFwcGx5IGFsbCBzZXR0aW5ncy4gSXQgc2hvdWxkIGNoYW5nZSAiaW52YWxpZC91bnN1cHBvcnRlZCIgdmFsdWVzIHRvIHRoZQorICogICAgIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlcy4KKyAqICAgLSBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50IGJ5IGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWVzIGluIHR1bmUoKS8KKyAqICAgICBjb25maWd1cmUoKS4KKyAqICAgYikgSWYgZmFsbGluZyBiYWNrIHRvIGEgc3VwcG9ydGVkIHZhbHVlIGlzIGFic29sdXRlbHkgaW1wb3NzaWJsZSwgdGhlIGNvbXBvbmVudCBTSEFMTCByZXR1cm4KKyAqICAgICBhbiBlcnJvciBmb3IgdGhlIHNwZWNpZmljIHNldHRpbmcsIGJ1dCBzaG91bGQgY29udGludWUgdG8gYXBwbHkgb3RoZXIgc2V0dGluZ3MuCisgKiAgICAgVE9ETzogdGhpcyBjdXJyZW50bHkgbWF5IHJlc3VsdCBpbiB1bmludGVuZGVkIHJlc3VsdHMuCisgKgorICogKipOT1RFOioqIHVubGlrZSBPTVgsIHBhcmFtcyBhcmUgbm90IHZlcnNpb25lZC4gSW5zdGVhZCwgYSBuZXcgc3RydWN0IHdpdGggbmV3IHBhcmFtIGluZGV4CisgKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCisgKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqCisgKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKKyAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAorICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCisgKi8KKworLy8vIFxpbmdyb3VwIGludGVybmFsCisKKy8qKgorICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCisgKi8KK3N0cnVjdCBDMlBhcmFtIHsKKyAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gLSBraW5kIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKKyAgICAvLyAtIHNjb3BlCisgICAgLy8gICAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQorICAgIC8vICAgLSBzdHJlYW0gZmxhZworICAgIC8vICAgLSBzdHJlYW0gSUQgKHVzdWFsbHkgMCkKKyAgICAvLyAtIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdHlwZSAoY29yZSBpbmRleCkKKyAgICAvLyAgIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKKyAgICAvLyAgIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCisgICAgLy8gICAtIHR5cGUgaW5kZXggKHRoaXMgaW5jbHVkZXMgdGhlIHZlbmRvciBleHRlbnNpb24gZmxhZykKKyAgICAvLworICAgIC8vIGxheW91dDoKKyAgICAvLworICAgIC8vICAgICAgICBraW5kIDogPC0tLS0tLS0gc2NvcGUgLS0tLS0tLT4gOiA8LS0tLS0gY29yZSBpbmRleCAtLS0tLT4KKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIHR5cGUgaW5kZXggIHwKKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAorICAgIC8vCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCisgICAgICovCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PTkUgICAgPSAwLAorICAgICAgICBTVFJVQ1QgID0gKDEgPDwgMCksCisgICAgICAgIElORk8gICAgPSAoMSA8PCAxKSwKKyAgICAgICAgU0VUVElORyA9ICgxIDw8IDIpLAorICAgICAgICBUVU5JTkcgID0gKDEgPDwgMykgfCBTRVRUSU5HLCAvLyB0dW5pbmdzIGFyZSBzZXR0aW5ncworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW5kZXggc3BlY2lmaWVzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIG9mIGEgcGFyYW1ldGVyIGFzCisgICAgICogYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlciB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHBsYXRmb3JtIHR5cGVzIGFuZCB2ZW5kb3IgdHlwZXMuCisgICAgICoKKyAgICAgKiBQbGF0Zm9ybSB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gYW5kIGFyZSBjb21tb24gZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICoKKyAgICAgKiBWZW5kb3IgdHlwZXMgYXJlIGRlZmluZWQgYnkgZWFjaCB2ZW5kb3JzLCBzbyB0aGV5IG1heSBkaWZmZXIgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZW5kb3IgdHlwZXMgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgYnkgYSBzcGVjaWZpYworICAgICAqIHZlbmRvci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHVpbnQzMl90IHR5cGVfaW5kZXhfdDsKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgVFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQgPSAweDAwMDA4MDAwLCAvLy88IHZlbmRvciBpbmRpY2VzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29yZSBpbmRleCBpcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBwYXJhbWV0ZXIuIEl0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAgICogbGF5b3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbXBvbmVudCBvciBwYXJhbWV0ZXIga2luZC9zY29wZS4KKyAgICAgKgorICAgICAqIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGRpc3Rpbmd1aXNoIGdsb2JhbCBwYXJhbWV0ZXJzLCBhbmQgYWxzbyBwYXJhbWV0ZXJzIG9uIGEgZ2l2ZW4KKyAgICAgKiBwb3J0IG9yIHN0cmVhbS4gVGhleSBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHNldCBvZiBnbG9iYWwgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgICogc2V0IG9mIHBhcmFtZXRlcnMgb24gZWFjaCBwb3J0IG9yIGVhY2ggc3RyZWFtLCBidXQgdGhlIHNhbWUgY29yZSBpbmRleCBjYW4gYmUgdXNlZCBmb3IKKyAgICAgKiBwYXJhbWV0ZXJzIG9uIGRpZmZlcmVudCBzdHJlYW1zIG9yIHBvcnRzLCBhcyB3ZWxsIGFzIGZvciBnbG9iYWwgcGFyYW1ldGVycyBhbmQgcG9ydC9zdHJlYW0KKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogTXVsdGlwbGUgcGFyYW1ldGVyIHR5cGVzIGNhbiBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgbGF5b3V0IGZvciBhbGwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGNvcmUgaW5kZXggYWNyb3NzIGFsbCBjb21wb25lbnRzIG11c3QKKyAgICAgKiBiZSBpZGVudGljYWwuCisgICAgICovCisgICAgc3RydWN0IENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBJU19GTEVYX0ZMQUcgPSAweDAwMDEwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRkUwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMTcsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgY2xhc3M9ZGVjbHR5cGUoQzJQYXJhbShQKCkpKT4KKyAgICBQICpBcygpIHsgcmV0dXJuIFA6OkZyb20odGhpcyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQPgorICAgIGNvbnN0IFAgKkFzKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBQKj4oUDo6RnJvbShjb25zdF9jYXN0PEMyUGFyYW0qPih0aGlzKSkpOyB9CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIC8vLyBzZXRzIHRoZSBzdHJlYW0gZmllbGQuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8vLyBzZXRzIHRoZSBwb3J0IChkaXJlY3Rpb24pLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgorICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCisgICAgaW5saW5lIHZvaWQgaW52YWxpZGF0ZSgpIHsgX21TaXplID0gMDsgfQorCisgICAgLy8gaWYgb3RoZXIgaXMgdGhlIHNhbWUga2luZCBvZiAodmFsaWQpIHBhcmFtIGFzIHRoaXMsIGNvcHkgaXQgaW50byB0aGlzIGFuZCByZXR1cm4gdHJ1ZS4KKyAgICAvLyBvdGhlcndpc2UsIGRvIG5vdCBjb3B5IGFueXRoaW5nLCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlubGluZSBib29sIHVwZGF0ZUZyb20oY29uc3QgQzJQYXJhbSAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLl9tU2l6ZSA8PSBfbVNpemUgJiYgb3RoZXIuX21JbmRleCA9PSBfbUluZGV4ICYmIF9tU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSh0aGlzLCAmb3RoZXIsIG90aGVyLl9tU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gcmV0dXJucyB8b3wgaWYgaXQgaXMgYSBudWxsIHB0ciwgb3IgaWYgY2FuIHN1aXRhYmx5IGJlIGEgcGFyYW0gb2YgZ2l2ZW4gfHR5cGV8IChlLmcuIGhhcworICAgIC8vIHNhbWUgdHlwZSAoaWdub3Jpbmcgc3RyZWFtIElEKSwgYW5kIHNpemUpLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4gSWYgfGNoZWNrRGlyfCBpcyBmYWxzZSwKKyAgICAvLyBhbGxvdyB1bmRlZmluZWQgb3IgZGlmZmVyZW50IGRpcmVjdGlvbiAoZS5nLiBhcyBjb25zdHJ1Y3RlZCBmcm9tIEMyUG9ydFBhcmFtKCkgdnMuCisgICAgLy8gQzJQb3J0UGFyYW06OmlucHV0KSwgYnV0IHN0aWxsIHJlcXVpcmUgZXF1aXZhbGVudCB0eXBlIChzdHJlYW0sIHBvcnQgb3IgZ2xvYmFsKTsgb3RoZXJ3aXNlLAorICAgIC8vIHJldHVybiBudWxsLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgQzJQYXJhbSogSWZTdWl0YWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0qIG8sIHNpemVfdCBzaXplLCBUeXBlIHR5cGUsIHNpemVfdCBmbGV4U2l6ZSA9IDAsIGJvb2wgY2hlY2tEaXIgPSB0cnVlKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIgfHwgby0+X21TaXplIDwgc2l6ZSB8fCAoZmxleFNpemUgJiYgKChvLT5fbVNpemUgLSBzaXplKSAlIGZsZXhTaXplKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRGlyKSB7CisgICAgICAgICAgICByZXR1cm4gby0+X21JbmRleC50eXBlKCkgPT0gdHlwZS5tSW5kZXggPyBvIDogbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChvLT5fbUluZGV4LmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoby0+X21JbmRleC50eXBlKCkgXiB0eXBlLm1JbmRleCkgJiB+VHlwZTo6RElSX01BU0spID8gbnVsbHB0ciA6IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXgpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3Igd2l0aCBzdHJlYW0gc2V0CisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4LCB1bnNpZ25lZCBzdHJlYW0pCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4IHwgSW5kZXg6Ok1ha2VTdHJlYW1JZChzdHJlYW0pKSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7CisgICAgfQorCisgICAgdWludDMyX3QgX21TaXplOworICAgIEluZGV4IF9tSW5kZXg7Cit9OworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycworI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAorCisvKioKKyAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfU0VUVElORyB9OworfTsKKworLyoqCisgKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgeworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9UVU5JTkcgfTsKK307CisKKy8qKgorICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9JTkZPIH07Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCisgKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCisgKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKKyAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgorICovCitzdHJ1Y3QgX0MyRmllbGRJZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQorICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCisgICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KKyAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKKyAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVCopMCktPipwbSkpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA9PSBvdGhlci5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA8IG90aGVyLl9tT2Zmc2V0IHx8CisgICAgICAgICAgICAvLyBOT1RFOiBvcmRlciBwYXJlbnQgc3RydWN0dXJlIGJlZm9yZSBzdWIgZmllbGQKKyAgICAgICAgICAgIChfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPiBvdGhlci5fbVNpemUpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhfQzJGaWVsZElkKQorCisjaWYgMAorICAgIGlubGluZSB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBfbU9mZnNldDsgfQorICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZkLCA6OnN0ZDo6b3N0cmVhbSopOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKyAgICBmcmllbmQgc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOworCisgICAgdWludDMyX3QgX21PZmZzZXQ7IC8vIG9mZnNldCBvZiBmaWVsZAorICAgIHVpbnQzMl90IF9tU2l6ZTsgICAvLyBzaXplIG9mIGZpZWxkCit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgJ2ZpZWxkJyBpbiBhIGNvbmZpZ3VyYXRpb24uIFRoZSBmaWVsZAorICogY2FuIGJlIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLCBhIHN1YmZpZWxkIG9mIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLAorICogYW5kIGV2ZW4gdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24uIE1vcmVvdmVyLCBpZiB0aGUgZmllbGQgY2FuIHBvaW50IHRvIGFuCisgKiBlbGVtZW50IGluIGEgYXJyYXkgZmllbGQsIG9yIHRvIHRoZSBlbnRpcmUgYXJyYXkgZmllbGQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcXVlcnlpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCwgYXMgd2VsbAorICogYXMgY29tbXVuaWNhdGluZyBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMgd2hlbiB0cnlpbmcgdG8gY2hhbmdlCisgKiBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29tcG9uZW50L2ludGVyZmFjZSBvciBhIHN0b3JlLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIHN0cnVjdCBDMlNvbWVQYXJhbSB7CisgICAgICogICB1aW50MzJfdCBtRmllbGQ7CisgICAgICogICB1aW50MzJfdCBtQXJyYXlbMl07CisgICAgICogICBDMk90aGVyU3RydWN0IG1TdHJ1Y3Q7CisgICAgICogICB1aW50MzJfdCBtRmxleEFycmF5W107CisgICAgICogfSAqbVBhcmFtOworICAgICAqCisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheVswXSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bVN0cnVjdC5tU3ViRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXlbMl0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHRvZG8gZml4IHdoYXQgdGhpcyBpcyBmb3IgVFtdIChmb3Igbm93IHNpemUgYmVjb21lcyBUWzFdKQorICAgICAqCisgICAgICogXG5vdGUgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciA2NC1iaXQgbWVtYmVycyBhcyBpdCB0cmlnZ2VycyBhCisgICAgICogJ3Rha2luZyBhZGRyZXNzIG9mIHBhY2tlZCBtZW1iZXInIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG1lbWJlciBwb2ludGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZElkKChUKikoKHVpbnRwdHJfdClvZmZzZXQgLSAodWludHB0cl90KXBhcmFtKSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtRmllbGQgTWFrZShTJiBwYXJhbSwgVCYgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQocGFyYW0uaW5kZXgoKSwgKHVpbnRwdHJfdCkmb2Zmc2V0IC0gKHVpbnRwdHJfdCkmcGFyYW0sIHNpemVvZihUKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgbWVtYmVyIHBvaW50ZXIuIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuCisgICAgICogYXJyYXkgZWxlbWVudCBvciBhIHN1YmZpZWxkLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSwgJkMyU29tZVBhcmFtOjptTWVtYmVyRmllbGQpOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHAgcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gVCBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQgbWVtYmVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPmluZGV4KCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB0byBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSkuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwgX21GaWVsZElkKDB1LCBwYXJhbS0+c2l6ZSgpKSB7IH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKKyAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBDMlBhcmFtOjpJbmRleCBfbUluZGV4OyAvLy88IHBhcmFtZXRlciBpbmRleAorICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vLzwgZmllbGQgaWRlbnRpZmllcgorfTsKKworLyoqCisgKiBBIHNoYXJlZCAodW5pb24pIHJlcHJlc2VudGF0aW9uIG9mIG51bWVyaWMgdmFsdWVzCisgKi8KK2NsYXNzIEMyVmFsdWUgeworcHVibGljOgorICAgIC8vLyBBIHVuaW9uIG9mIHN1cHBvcnRlZCBwcmltaXRpdmUgdHlwZXMuCisgICAgdW5pb24gUHJpbWl0aXZlIHsKKyAgICAgICAgLy8gZmlyc3QgbWVtYmVyIGlzIGFsd2F5cyB6ZXJvIGluaXRpYWxpemVkIHNvIGl0IG11c3QgYmUgdGhlIGxhcmdlc3QKKyAgICAgICAgdWludDY0X3QgICAgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKKyAgICAgICAgaW50NjRfdCAgICAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyNjRfdCBjNjQ7ICAgLy8vPCBjMl9jbnRyNjRfdCB2YWx1ZQorICAgICAgICB1aW50MzJfdCAgICB1MzI7ICAgLy8vPCB1aW50MzJfdCB2YWx1ZQorICAgICAgICBpbnQzMl90ICAgICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCisgICAgICAgIGMyX2NudHIzMl90IGMzMjsgICAvLy88IGMyX2NudHIzMl90IHZhbHVlCisgICAgICAgIGZsb2F0ICAgICAgIGZwOyAgICAvLy88IGZsb2F0IHZhbHVlCisKKyAgICAgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ2NF90IHZhbHVlKSAgICA6IHU2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgICAgOiBpNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjY0X3QgdmFsdWUpIDogYzY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjMyX3QgdmFsdWUpIDogYzMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ4X3QgdmFsdWUpICAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjaGFyIHZhbHVlKSAgICAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgICAgIDogZnAodmFsdWUpICB7IH0KKworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBlbnVtIHR5cGUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08RT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgUHJpbWl0aXZlKEUgdmFsdWUpCisgICAgICAgICAgICA6IFByaW1pdGl2ZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZT4odmFsdWUpKSB7IH0KKworICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KKworICAgICAgICAvKiogZ2V0cyB2YWx1ZSBvdXQgb2YgdGhlIHVuaW9uICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgJnJlZigpIGNvbnN0OworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoaTY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihjNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGkzMiksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoYzMyKSwgIiIpOworICAgIH07CisgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTMyKSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzMyKSwgIiIpOworCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PX0lOSVQsCisgICAgICAgIElOVDMyLAorICAgICAgICBVSU5UMzIsCisgICAgICAgIENOVFIzMiwKKyAgICAgICAgSU5UNjQsCisgICAgICAgIFVJTlQ2NCwKKyAgICAgICAgQ05UUjY0LAorICAgICAgICBGTE9BVCwKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IFR5cGVGb3IoKSB7CisgICAgICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VT4oKTsKKyAgICB9CisKKyAgICAvLyBkZXByZWN0YXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQiA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IHR5cGVGb3IoKSB7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFQsIEI+KCk7CisgICAgfQorCisgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogX21UeXBlKHR5cGVGb3I8VD4oKSksIF9tVmFsdWUodmFsdWUpIHsgfQorCisgICAgQzJWYWx1ZSgpIDogX21UeXBlKE5PX0lOSVQpIHsgfQorCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgeworICAgICAgICBpZiAoX21UeXBlID09IHR5cGVGb3I8VD4oKSkgeworICAgICAgICAgICAgKnZhbHVlID0gX21WYWx1ZS5yZWY8VD4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAgICB2b2lkICpnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVR5cGUgPT0gTk9fSU5JVCA/IG51bGxwdHIgOiAodm9pZCopJl9tVmFsdWU7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZQorICAgIHNpemVfdCBpbmxpbmUgc2l6ZU9mKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU2l6ZUZvcihfbVR5cGUpOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgU2l6ZUZvcih0eXBlX3QgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQ05UUjMyOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGNhc2UgSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQ05UUjY0OiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5mcCk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgX21UeXBlOworICAgIFByaW1pdGl2ZSBfbVZhbHVlOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gdTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyMzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjMyX3Q+KCkgY29uc3QgeyByZXR1cm4gYzMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyNjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjY0X3Q+KCkgY29uc3QgeyByZXR1cm4gYzY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KKworLy8gcHJvdmlkZSB0eXBlcyBmb3IgZW51bXMgYW5kIHVpbnQ4X3QsIGNoYXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvdmlkZSByZWFkaW5nIGFzIHRoZW0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGNoYXIsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ4X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFIzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFI2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8ZmxvYXQsIGZhbHNlPigpIHsgcmV0dXJuIEZMT0FUOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyZSBlYXN5IGVudW0gdGVtcGxhdGUKK3RlbXBsYXRlPHR5cGVuYW1lIEU+IHN0cnVjdCBDMkVhc3lFbnVtOworCisvKioKKyAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgorICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCisgKgorICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKKyAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KKyAqLworc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKKy8vcHVibGljOgorICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKKyAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0CisgICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgorICAgICAqLworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgSU5UMzIgICA9IEMyVmFsdWU6OklOVDMyLCAgLy8vPCAzMi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDMyICA9IEMyVmFsdWU6OlVJTlQzMiwgLy8vPCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSMzIgID0gQzJWYWx1ZTo6Q05UUjMyLCAvLy88IDMyLWJpdCBjb3VudGVyCisgICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFI2NCAgPSBDMlZhbHVlOjpDTlRSNjQsIC8vLzwgNjQtYml0IGNvdW50ZXIKKyAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKKworICAgICAgICAvLyBhcnJheSB0eXBlcworICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQorICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCisKKyAgICAgICAgLy8gY29tcGxleCB0eXBlcworICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MjAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGNvcmVJbmRleC4KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gTmFtZWRWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOYW1lZFZhbHVlVHlwZT4gTmFtZWRWYWx1ZXNUeXBlOworICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBOYW1lZFZhbHVlc1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgorICAgICAqCisgICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorICAgIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQiAmKTsKKworICAgIC8qKiBzcGVjaWFsaXphdGlvbiBmb3IgZWFzeSBlbnVtcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgaW5saW5lIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQzJFYXN5RW51bTxFPiAmKSB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdudWxsLWRlcmVmZXJlbmNlIgorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXNGb3IoKihFKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEIsIGJvb2wgZW5hYmxlZD1zdGQ6OmlzX2FyaXRobWV0aWM8Qj46OnZhbHVlIHx8IHN0ZDo6aXNfZW51bTxCPjo6dmFsdWU+CisgICAgc3RydWN0IEMyX0hJREUgX05hbWVkVmFsdWVzR2V0dGVyOworCitwdWJsaWM6CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGV4dGVudCwgQzJTdHJpbmcgbmFtZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21UeXBlKCh0eXBlX3QpdHlwZSksIF9tRXh0ZW50KGV4dGVudCksIF9tTmFtZShuYW1lKSwgX21GaWVsZElkKG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJikgPSBkZWZhdWx0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tTmFtZWRWYWx1ZXMoX05hbWVkVmFsdWVzR2V0dGVyPEI+OjpnZXROYW1lZFZhbHVlcygpKSwKKyAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKFMqLCBUIFM6OiogZmllbGQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbUZpZWxkSWQoJigoKFMqKTApLT4qZmllbGQpKSB7fQorCisgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgaW5saW5lIHNpemVfdCBleHRlbnQoKSBjb25zdCB7IHJldHVybiBfbUV4dGVudDsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKKyAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBvZmZzZXRlZCBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZGVzYywgc2l6ZV90IG9mZnNldCkKKyAgICAgICAgOiBfbVR5cGUoZGVzYy5fbVR5cGUpLCBfbUV4dGVudChkZXNjLl9tRXh0ZW50KSwKKyAgICAgICAgICBfbU5hbWUoZGVzYy5fbU5hbWUpLCBfbU5hbWVkVmFsdWVzKGRlc2MuX21OYW1lZFZhbHVlcyksCisgICAgICAgICAgX21GaWVsZElkKGRlc2MuX21GaWVsZElkLl9tT2Zmc2V0ICsgb2Zmc2V0LCBkZXNjLl9tRmllbGRJZC5fbVNpemUpIHsgfQorCisgICAgdHlwZV90IF9tVHlwZTsKKyAgICB1aW50MzJfdCBfbUV4dGVudDsgLy8gdGhlIGxhc3QgbWVtYmVyIGNhbiBiZSBhcmJpdHJhcnkgbGVuZ3RoIGlmIGl0IGlzIFRbXSBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciAodGhpcyBpcyBtYXJrZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAvLyAwKS4gVFswXS1zIGFyZSBub3QgZmllbGRzLgorICAgIEMyU3RyaW5nIF9tTmFtZTsKKyAgICBOYW1lZFZhbHVlc1R5cGUgX21OYW1lZFZhbHVlczsKKworICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vIGZpZWxkIGlkZW50aWZpZXIgKG9mZnNldCBhbmQgc2l6ZSkKKworICAgIC8vIE5PVEU6IFdlIGRvIG5vdCBjYXB0dXJlIGRlZmF1bHQgdmFsdWUocykgaGVyZSBhcyB0aGF0IG1heSBkZXBlbmQgb24gdGhlIGNvbXBvbmVudC4KKyAgICAvLyBOT1RFOiBXZSBhbHNvIGRvIG5vdCBjYXB0dXJlIGJlc3RFZmZvcnQsIGFzIDEpIHRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgZmllbGRzLAorICAgIC8vIDIpIHRoaXMgaXMgYXQgcGFyYW1ldGVyIGdyYW51bGFyaXR5LgorCisgICAgLy8gdHlwZSByZXNvbHV0aW9uCisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQzMl90KikgICAgIHsgcmV0dXJuIElOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50MzJfdCopICAgIHsgcmV0dXJuIFVJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjMyX3QqKSB7IHJldHVybiBDTlRSMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDY0X3QqKSAgICAgeyByZXR1cm4gSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ2NF90KikgICAgeyByZXR1cm4gVUlOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyNjRfdCopIHsgcmV0dXJuIENOVFI2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoZmxvYXQqKSAgICAgICB7IHJldHVybiBGTE9BVDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoY2hhciopICAgICAgICB7IHJldHVybiBTVFJJTkc7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ4X3QqKSAgICAgeyByZXR1cm4gQkxPQjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHVuZGVybHlpbmcoMCk7CisgICAgICAgIHJldHVybiBHZXRUeXBlKCZ1bmRlcmx5aW5nKTsKKyAgICB9CisKKyAgICAvLyB2ZXJpZnkgQzJTdHJ1Y3QgYnkgaGF2aW5nIGEgRmllbGRMaXN0KCkgYW5kIGEgQ09SRV9JTkRFWC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPWRlY2x0eXBlKFQ6OkNPUkVfSU5ERVggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6RmllbGRMaXN0KCkpPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7CisgICAgICAgIHJldHVybiAodHlwZV90KShUOjpDT1JFX0lOREVYIHwgU1RSVUNUX0ZMQUcpOworICAgIH0KKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCisvLyBubyBuYW1lZCB2YWx1ZXMgZm9yIGNvbXBvdW5kIHR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgZmFsc2U+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgdHJ1ZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihCKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih0eXBlKSBcCit0ZW1wbGF0ZTw+IGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCB0eXBlICYpIHsgXAorICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsgXAorfQorCisvLyBXZSBjYW5ub3Qgc3VidHlwZSBjb25zdHJ1Y3RvciBmb3IgZW51bWVyYXRlZCB0eXBlcyBzbyBpbnN0ZWQgZGVmaW5lIG5vIG5hbWVkIHZhbHVlcyBmb3IKKy8vIG5vbi1lbnVtZXJhdGVkIGludGVncmFsIHR5cGVzLgorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyNjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ4X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjaGFyKQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoZmxvYXQpCisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBDMlN0cnVjdERlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRoZSBjb3JlIGluZGV4IG9mIHRoZSBzdHJ1Y3QKKyAgICBpbmxpbmUgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZS5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHN0cnVjdCAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICAvLyBNdXN0IGJlIGF0IGxlYXN0IDEgZm9yIHZhbGlkIHN0cnVjdHMuCisgICAgaW5saW5lIHNpemVfdCBudW1GaWVsZHMoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5zaXplKCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0IGZpZWxkcyAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcmF0b3I7CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIC8vIG9ubHkgc3VwcGx5aW5nIGNvbnN0IGl0ZXJhdG9yIC0gYnV0IHRoZXNlIG5hbWVzIGFyZSBuZWVkZWQgZm9yIHJhbmdlIGJhc2VkIGxvb3BzCisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoVCopCisgICAgICAgIDogQzJTdHJ1Y3REZXNjcmlwdG9yKFQ6OkNPUkVfSU5ERVgsIFQ6OkZpZWxkTGlzdCgpKSB7IH0KKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoZmllbGRzKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpIHsgfQorCisgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IF9tVHlwZTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIERlc2NyaWJlcyBwYXJhbWV0ZXJzIGZvciBhIGNvbXBvbmVudC4KKyAqLworc3RydWN0IEMyUGFyYW1EZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIHRydWUgZm9yIGJ1aWx0aW4gcGFyYW1zIGZvciBwbGF0Zm9ybS1kZWZpbmVkIGNvbXBvbmVudHMgKGUuZy4gdmlkZW8gYW5kCisgICAgICogYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMsIHZpZGVvL2F1ZGlvIGZpbHRlcnMpLgorICAgICAqIEZvciB2ZW5kb3ItZGVmaW5lZCBjb21wb25lbnRzLCBpdCBjYW4gYmUgdHJ1ZSBldmVuIGZvciB2ZW5kb3ItZGVmaW5lZCBwYXJhbXMsCisgICAgICogYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCwgaW4gY2FzZSB0aGUgY29tcG9uZW50IGJlY29tZXMgcGxhdGZvcm0tZGVmaW5lZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRVFVSVJFRDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIHBlcnNpc3RlbnQuIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIEMyVHVuaW5nIGFuZCBDMlNldHRpbmcsCisgICAgICogYnV0IG1heSBiZSBmYWxzZSBmb3IgQzJJbmZvLiBJZiB0cnVlLCB0aGlzIHBhcmFtZXRlciBwZXJzaXN0cyBhY3Jvc3MgZnJhbWVzIGFuZCBhcHBsaWVzIHRvCisgICAgICogdGhlIGN1cnJlbnQgYW5kIHN1YnNlcXVlbnQgZnJhbWVzLiBJZiBmYWxzZSwgdGhpcyBDMkluZm8gcGFyYW1ldGVyIG9ubHkgYXBwbGllcyB0byB0aGUKKyAgICAgKiBjdXJyZW50IGZyYW1lIGFuZCBpcyBub3QgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIChvciBldmVuIGJlIHByZXNlbnQpIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmcmFtZXMsIHVubGVzcyBpdCBpcyBzcGVjaWZpZWQgZm9yIHRob3NlIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1BlcnNpc3RlbnQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1BFUlNJU1RFTlQ7IH0KKworICAgIGlubGluZSBib29sIGlzU3RyaWN0KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19TVFJJQ1Q7IH0KKworICAgIGlubGluZSBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFQURfT05MWTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0hJRERFTik7IH0KKworICAgIGlubGluZSBib29sIGlzUHVibGljKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0lOVEVSTkFMKTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbS4KKyAgICAvLy8gVGhpcyBkZWZhdWx0cyB0byB0aGUgdW5kZXJseWluZyBDMlN0cnVjdCdzIG5hbWUsIGJ1dCBjb3VsZCBiZSBhbHRlcmVkIGZvciBhIGNvbXBvbmVudC4KKyAgICBpbmxpbmUgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHBhcmFtZXRlciBpbmRleAorICAgIGlubGluZSBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXg7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCB0aGlzIHBhcmFtZXRlciBoYXMgYSBkZXBlbmRlbmN5IG9uCisgICAgaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmZGVwZW5kZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gX21EZXBlbmRlbmNpZXM7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIGNvbnN0IFQqKQorICAgICAgICA6IF9tSW5kZXgoVDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICAgICAgYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9uCisgICAgICAgIElTX1JFUVVJUkVEICAgPSAxdSA8PCAwLCAvLy88IHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgSVNfUEVSU0lTVEVOVCA9IDF1IDw8IDEsIC8vLzwgcGFyYW1ldGVyIHJldGFpbnMgaXRzIHZhbHVlCisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvZmYKKyAgICAgICAgSVNfU1RSSUNUICAgICA9IDF1IDw8IDIsIC8vLzwgcGFyYW1ldGVyIGlzIHN0cmljdAorICAgICAgICBJU19SRUFEX09OTFkgID0gMXUgPDwgMywgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgcmVhZC1vbmx5CisgICAgICAgIElTX0hJRERFTiAgICAgPSAxdSA8PCA0LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdmlzaWJsZSB0byBjbGllbnRzCisgICAgICAgIElTX0lOVEVSTkFMICAgPSAxdSA8PCA1LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdXNlZCBieSBmcmFtZXdvcmsgKG90aGVyIHRoYW4gdGVzdGluZykKKyAgICAgICAgSVNfQ09OU1QgICAgICA9IDF1IDw8IDYgfCBJU19SRUFEX09OTFksIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IGNvbnN0IChoZW5jZSByZWFkLW9ubHkpCisgICAgfTsKKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nICYmbmFtZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICYmZGVwZW5kZW5jaWVzKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRGVwZW5kZW5jaWVzKHN0ZDo6bW92ZShkZXBlbmRlbmNpZXMpKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBfbUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IF9tQXR0cmliOworICAgIGNvbnN0IEMyU3RyaW5nIF9tTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gX21EZXBlbmRlbmNpZXM7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKDo6QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KQorCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisvLy8gXG5vdGUgX0ZJRUxEX0xJU1QgaXMgdXNlZCBvbmx5IGR1cmluZyBkZWNsYXJhdGlvbiBzbyB0aGF0IEMyU3RydWN0IGRlY2xhcmF0aW9ucyBjYW4gZW5kIHdpdGgKKy8vLyBhIHNpbXBsZSBsaXN0IG9mIEMyRklFTEQtcyBhbmQgY2xvc2luZyBicmFja2V0LiBNYXJrIGl0IHVudXNlZCBhcyBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZWQKKy8vLyBzdHJ1Y3RzLgorI2RlZmluZSBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCitwcml2YXRlOiBcCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVCBfX3VudXNlZDsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzICovIFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgQzIjI25hbWUjI1N0cnVjdCBfdHlwZTsgLyoqPCB0eXBlIG5hbWUgc2hvcnRoYW5kICovIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgZmFjdG9yeSAqLworCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0MyU1RSVUNUKG5hbWUpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZXNjcmliZSBhIHN0cnVjdHVyZSBvZiBhIHRlbXBsYXRlZCBzdHJ1Y3R1cmUuCisvLyBVc2UgbGlzdC4uLiBhcyB0aGUgYXJndW1lbnQgZ2V0cyByZXN1YnNpdGl0dXRlZCBhbmQgaXQgY29udGFpbnMgY29tbWFzLiBBbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8gdG8gd3JhcCBsaXN0IGluIGFuIGV4cHJlc3Npb24sIGUuZy4gKHsgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGxpc3Q7IH0pKSB3aGljaCBjb252ZXJ0cworLy8gaXQgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgdmVjdG9yLgorI2RlZmluZSBERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1Qoc3RydWt0LCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlPD4sIHN0cnVrdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGRlcHJlY2F0ZWQKKy8vLyBEZXNjcmliZSB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlIHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisjZGVmaW5lIERFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QoLCBDMiMjbmFtZSMjU3RydWN0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIGdldCB2YWx1ZSBvZiBlbmFibGVkIHRoYXQgaXMgcGFzc2VkIGluIGFzIGEgbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIHJlc29sdmUgdG8gdGhlIHNwZWNpZmljIG1hY3JvIGJhc2VkIG9uIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUIyNlbmFibGVkKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QpCisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikgXAorICAgIHRlbXBsYXRlIFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gc3RydWt0OjpGaWVsZExpc3QoKSB7IHJldHVybiBsaXN0OyB9CisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18odGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikKKworLyoqCisgKiBEZXNjcmliZSBhIGZpZWxkIG9mIGEgc3RydWN0dXJlLgorICogVGhlc2UgbXVzdCBiZSBpbiBvcmRlci4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgbWFjcm86CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpIHt9IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkgPSBkZWZhdWx0OyAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgsIHsKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgRm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMgKHRob3NlIGVuZGluZyBpbiBUW10pLCB1c2UgdGhlIGZsZXhpYmxlIG1hY3JvczoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogIHByaXZhdGU6CisgKiAgICAgIC8vIG1heSBoYXZlIHByaXZhdGUgY29uc3RydWN0b3JzIHRha2luZyBudW1iZXIgb2Ygd2lkdGhzIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICogICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUoc2l6ZV90LCBpbnQzMl90KTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgaW50MzJfdCB2YWx1ZSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IHZhbHVlOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBUW05dIG9yIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgdGhlIGZsZXhDb3VudCB3aWxsCisgKiAgICAgIC8vIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgcGFzc2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIGludCB3aWR0aHNbXSA9IHsgMSwgMiwgMyB9OworICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHdpZHRocyk7CisgKiAgICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IGludDMyX3QoJmluaXQpW05dKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gaW5pdFtpXTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgd2lkdGhzKQorICogICAgICBDMkZJRUxEKHdpZHRocywgIndpZHRocyIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCBtV2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgbVdpZHRocykKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgeworICogICAgICBDMkZJRUxEKG1XaWR0aHMsICJ3aWR0aHMiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqLworI2RlZmluZSBERVNDUklCRV9DMkZJRUxEKG1lbWJlciwgbmFtZSkgXAorICBDMkZpZWxkRGVzY3JpcHRvcigmKChfdHlwZSopKG51bGxwdHIpKS0+bWVtYmVyLCBuYW1lKSwKKworI2RlZmluZSBDMkZJRUxEKG1lbWJlciwgbmFtZSkgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisvLy8gXGlmIDAKKyNkZWZpbmUgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKQorI2RlZmluZSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBERVNDUklCRV9DMkZJRUxEIyNlbmFibGVkKG1lbWJlciwgbmFtZSkKKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhtZW1iZXIsIG5hbWUpCisvLy8gXGVuZGlmCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9CQVNFX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIFxpZiAwCisvKgorICAgQWx0ZXJuYXRlIGRlY2xhcmF0aW9uIG9mIGZpZWxkIGRlZmluaXRpb25zIGluIGNhc2Ugbm8gZmllbGQgbGlzdCBpcyB0byBiZSBnZW5lcmF0ZWQuCisgICBUaGUgc3BlY2lmaWMgbWFjcm8gaXMgY2hvc2VkIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18gKHdoZXRoZXIgaXQgaXMKKyAgIGRlZmluZWQgKHRvIGJlIGVtcHR5KSBvciBub3QuIFRoaXMgcmVxdWlyZXMgdHdvIGxldmVsIG9mIG1hY3JvIHN1YnN0aXR1dGlvbi4KKyAgIFRSSUNLWTogdXNlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0byBoYW5kbGUgY2xvc2luZyBicmFja2V0IHRoYXQgaXMgbm9ybWFsbHkgYWZ0ZXIKKyAgIHRoZXNlIG1hY3Jvcy4KKyovCisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworLy8vIFxlbmRpZgorCisKKy8qKgorICogUGFyYW1ldGVyIHJlZmxlY3RvciBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNlbnRyYWxpemVzIHRoZSBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgc3RydWN0dXJlcy4gVGhpcyBjYW4gYmUgc2hhcmVkCisgKiBieSBtdWx0aXBsZSBjb21wb25lbnRzIGFzIGRlc2NyaWJpbmcgYSBwYXJhbWV0ZXIgZG9lcyBub3QgaW1wbHkgc3VwcG9ydCBvZiB0aGF0CisgKiBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGVhY2ggc3VwcG9ydGVkIHBhcmFtZXRlciBhbmQgYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzIHdpdGhpbgorICogbXVzdCBiZSBkZXNjcmliZWQgYnkgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IgcHJvdmlkZWQgYnkgYSBjb21wb25lbnQuCisgKi8KK2NsYXNzIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBEZXNjcmliZXMgYSBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgICAqCisgICAgICogIFxwYXJhbVtpbl0gY29yZUluZGV4IHRoZSBjb3JlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlCisgICAgICogIGNvcmUgaW5kZXgKKyAgICAgKgorICAgICAqICBccmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZQorICAgICAqICBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVmbGVjdG9yCisgICAgICoKKyAgICAgKiAgVGhpcyBtZXRob2RzIHNoYWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogIFxub3RlIHRoaXMgY2xhc3MgZG9lcyBub3QgdGFrZSBhIHNldCBvZiBpbmRpY2VzIGJlY2F1c2Ugd2Ugd291bGQgdGhlbiBwcmVmZXIKKyAgICAgKiAgdG8gYWxzbyByZXR1cm4gYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGlzIGxvZ2ljIHRvIGJlCisgICAgICogIHJlcGVhdGVkIGluIGVhY2ggcmVmbGVjdG9yLiBBbHRlcm5hdGVseSwgdGhpcyBjb3VsZCBqdXN0IHJldHVybiBhIG1hcCBvZiBhbGwKKyAgICAgKiAgZGVzY3JpcHRpb25zLCBidXQgd2Ugd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkgaWYgY2xpZW50IG9ubHkgd2FudHMgdGhlIGRlc2NyaXB0aW9uCisgICAgICogIG9mIGEgZmV3IGluZGljZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBHZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCisgKgorICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGEgc2ltcGxlIHJhbmdlLCBhbiBhcml0aG1ldGljLAorICogZ2VvbWV0cmljIG9yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHdpdGggYSBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLiBWYWx1ZXMgY2FuCisgKiBiZSBkaXNjcmV0ZSB2YWx1ZXMsIG9yIGNhbiBvcHRpb25hbGx5IHJlcHJlc2VudCBmbGFncyB0byBiZSBvci1lZC4KKyAqCisgKiBcbm90ZSBEbyBub3QgdXNlIGZsYWdzIHRvIHJlcHJlc2VudCBiaXRmaWVsZHMuIFVzZSBpbmRpdmlkdWFsIHZhbHVlcyBvciBzZXBhcmF0ZSBmaWVsZHMgaW5zdGVhZC4KKyAqLworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgeworICAgICAgICBFTVBUWSwgICAgICAvLy88IG5vIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgUkFOR0UsICAgICAgLy8vPCBhIG51bWVyaWMgcmFuZ2UgdGhhdCBjYW4gYmUgY29udGludW91cyBvciBkaXNjcmV0ZQorICAgICAgICBWQUxVRVMsICAgICAvLy88IGEgbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgRkxBR1MgICAgICAgLy8vPCBhIGxpc3Qgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgT1ItZWQKKyAgICB9OworCisgICAgdHlwZV90IHR5cGU7IC8qKiBUeXBlIG9mIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKworICAgIHR5cGVkZWYgQzJWYWx1ZTo6UHJpbWl0aXZlIFByaW1pdGl2ZTsKKworICAgIC8qKgorICAgICAqIFJhbmdlIHNwZWNpZmllciBmb3Igc3VwcG9ydGVkIHZhbHVlLiBVc2VkIGlmIHR5cGUgaXMgUkFOR0UuCisgICAgICoKKyAgICAgKiBJZiBzdGVwIGlzIDAgYW5kIG51bSBhbmQgZGVub20gYXJlIGJvdGggMSwgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGFueSB2YWx1ZSwgZm9yIHdoaWNoCisgICAgICogbWluIDw9IHZhbHVlIDw9IG1heC4KKyAgICAgKgorICAgICAqIE90aGVyd2lzZSwgdGhlIHJhbmdlIHJlcHJlc2VudHMgYSBnZW9tZXRyaWMvYXJpdGhtZXRpYy9tdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcywgd2hlcmUKKyAgICAgKiBzdWNjZXNzaXZlIHN1cHBvcnRlZCB2YWx1ZXMgY2FuIGJlIGRlcml2ZWQgZnJvbSBwcmV2aW91cyB2YWx1ZXMgKHN0YXJ0aW5nIGF0IG1pbiksIHVzaW5nIHRoZQorICAgICAqIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAqICB2WzBdID0gbWluCisgICAgICogIHZbaV0gPSB2W2ktMV0gKiBudW0gLyBkZW5vbSArIHN0ZXAgZm9yIGkgPj0gMSwgd2hpbGUgbWluIDwgdltpXSA8PSBtYXguCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgLyoqIExvd2VyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkuICovCisgICAgICAgIFByaW1pdGl2ZSBtaW47CisgICAgICAgIC8qKiBVcHBlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUgaWYgcGVybWl0dGVkIGJ5IHNlcmllcykuICovCisgICAgICAgIFByaW1pdGl2ZSBtYXg7CisgICAgICAgIC8qKiBTdGVwIGJldHdlZW4gc3VwcG9ydGVkIHZhbHVlcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIHN0ZXA7CisgICAgICAgIC8qKiBOdW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgbnVtOworICAgICAgICAvKiogRGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgZGVub207CisgICAgfSByYW5nZTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgdmFsdWVzLiBVc2VkIGlmIHR5cGUgaXMgVkFMVUVTIG9yIEZMQUdTLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBWQUxVRVMsIHRoaXMgaXMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlcyBpbiBkZWNyZWFzaW5nIHByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIEZMQUdTLCB0aGlzIHZlY3RvciBjb250YWlucyB7IG1pbi1tYXNrLCBmbGFnMSwgZmxhZzIuLi4gfS4gQmFzaWNhbGx5LCB0aGUgZmlyc3QKKyAgICAgKiB2YWx1ZSBpcyB0aGUgcmVxdWlyZWQgc2V0IG9mIGZsYWdzIHRvIGJlIHNldCwgYW5kIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIGZsYWdzIHRoYXQgY2FuCisgICAgICogYmUgc2V0IGluZGVwZW5kZW50bHkuIEZMQUdTIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ3JhbCB0eXBlcy4gU3VwcG9ydGVkIGZsYWdzIHNob3VsZAorICAgICAqIG5vdCBvdmVybGFwLCBhcyBpdCBjYW4gbWFrZSB2YWxpZGF0aW9uIG5vbi1kZXRlcm1pbmlzdGljLiBUaGUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXRob2QKKyAgICAgKiBpcyB0aGF0IHN0YXJ0aW5nIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlLCBpZiBlYWNoIGZsYWcgaXMgcmVtb3ZlZCB3aGVuIGZ1bGx5IHByZXNlbnQgKHRoZQorICAgICAqIG1pbi1tYXNrIG11c3QgYmUgZnVsbHkgcHJlc2VudCksIHdlIHNoYWxsIGFycml2ZSBhdCAwLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPFByaW1pdGl2ZT4gdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpCisgICAgICAgIDogdHlwZShFTVBUWSkgeworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVuKSA6CisgICAgICAgIHR5cGUoUkFOR0UpLAorICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbnVtLCBkZW59IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIG51bSwgZGVufSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yIChUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvcihUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGludGVybmFsCisgICAgLy8vIFx0b2RvOiBjcmVhdGUgc2VwYXJhdGUgdmFsdWVzIHZzLiBmbGFncyBpbml0aWFsaXplciBhcyBmb3IgZmxhZ3Mgd2Ugd2FudAorICAgIC8vLyB0byBsaXN0IGJvdGggYWxsb3dlZCBhbmQgcmVxdWlyZWQgZmxhZ3MKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKiludWxscHRyKSk+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKW51bGxwdHIpOworICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soMCk7IC8vIG1pbi1tYXNrIGRlZmF1bHRzIHRvIDAKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmaXRlbSA6IG5hbWVkKXsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBzcGVjaWZpYyBmaWVsZC4KKyAqCisgKiBUaGlzIGlzIGEgcGFpciBvZiB0aGUgZmllbGQgc3BlY2lmaWVyIHRvZ2V0aGVyIHdpdGggYW4gb3B0aW9uYWwgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gcmVwb3J0aW5nIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXMgeworICAgIEMyUGFyYW1GaWVsZCBwYXJhbU9yRmllbGQ7IC8vLzwgdGhlIGZpZWxkIG9yIHBhcmFtZXRlcgorICAgIC8vLyBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQgaWYgcGFyYW1PckZpZWxkIHNwZWNpZmllcyBhbiBhY3R1YWwgZmllbGQgdGhhdCBpcworICAgIC8vLyBudW1lcmljIChub24gc3RydWN0LCBibG9iIG9yIHN0cmluZykuIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGFycmF5cyAoaW5jbHVkaW5nIHN0cmluZyBhbmQKKyAgICAvLy8gYmxvYnMpIGRlc2NyaWJlIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIGVsZW1lbnQgKGNoYXJhY3RlciBmb3Igc3RyaW5nLCBhbmQgYnl0ZXMgZm9yCisgICAgLy8vIGJsb2JzKS4gSXQgaXMgb3B0aW9uYWwgZm9yIHJlYWQtb25seSBzdHJpbmdzIGFuZCBibG9icy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgbWVhbnQgdG8gYmUgbW92ZSBjb25zdHJ1Y3RlZC4KKyAgICBDMl9ERUZBVUxUX01PVkUoQzJQYXJhbUZpZWxkVmFsdWVzKTsKKworICAgIC8vIENvcHkgY29uc3RydWN0b3IvYXNzaWdubWVudCBpcyBhbHNvIHByb3ZpZGVkIGFzIHRoaXMgb2JqZWN0IG1heSBnZXQgY29waWVkLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChvdGhlci5wYXJhbU9yRmllbGQpLAorICAgICAgICAgIHZhbHVlcyhvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cikgeyB9CisKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMmIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKSB7CisgICAgICAgIHBhcmFtT3JGaWVsZCA9IG90aGVyLnBhcmFtT3JGaWVsZDsKKyAgICAgICAgdmFsdWVzID0gb3RoZXIudmFsdWVzID8gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigqb3RoZXIudmFsdWVzKSA6IG51bGxwdHI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIG5vIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPih2YWx1ZXNfKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBmaWVsZHMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXywgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXyksCisgICAgICAgICAgdmFsdWVzKHN0ZDo6bW92ZSh2YWx1ZXNfKSkgeyB9Cit9OworCisvLy8gQH0KKworLy8gaW5jbHVkZSBkZWJ1ZyBoZWFkZXIgZm9yIEMyUGFyYW1zLmggaWYgQzJEZWJ1Zy5oIHdhcyBhbHJlYWR5IGluY2x1ZGVkCisjaWZkZWYgQzJVVElMU19ERUJVR19IXworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJQQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMzMjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiogXGZpbGUKKyAqIFRlbXBsYXRlcyB1c2VkIHRvIGRlY2xhcmUgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBDMlBBUkFNX0RFRl9IXworI2RlZmluZSBDMlBBUkFNX0RFRl9IXworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKy8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCisvLy8gQHsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFVUSUxJVFkgVEVNUExBVEVTIEZPUiBQQVJBTUVURVIgREVGSU5JVElPTlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAorLy8vIEB7CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCitzdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgPT0gUygpKT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdEVxdWFsKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0RXF1YWwoLi4uKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSAhPSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Tm90RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3ROb3RFcXVhbCguLi4pOworfTsKKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzLgorICoKKyAqIFVzZSBhcyBfQzJDb21wYXJhYmxlPHR5cGVuYW1lIFM+Ojp2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdEVxdWFsPFM+KDApKTo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdE5vdEVxdWFsPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyAgSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYSBDT1JFX0lOREVYIGNvbnN0YW50Lgorc3RydWN0IEMyX0hJREUgX0MyQ29yZUluZGV4SGVscGVyX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQ9Uzo6Q09SRV9JTkRFWD4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdENvcmVJbmRleChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdENvcmVJbmRleCguLi4pOworfTsKKworLy8vIE1hY3JvIHRoYXQgZGVmaW5lcyBhbmQgdGh1cyBvdmVycmlkZXMgYSB0eXBlJ3MgQ09SRV9JTkRFWCBmb3IgYSBzZXR0aW5nCisjZGVmaW5lIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKGNvcmVJbmRleCkgXAorcHVibGljOiBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGNvcmVJbmRleCB9OworCisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBhZGRzIGEgQ09SRV9JTkRFWCB0byBhIHR5cGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUgKGZvciB0ZXN0aW5nKQordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleD4KK3N0cnVjdCBDMl9ISURFIF9DMkFkZENvcmVJbmRleCA6IHB1YmxpYyBTIHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShDb3JlSW5kZXgpCit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgc3RydWN0IHJlcXVpcmVtZW50cyBmb3IgcGFyYW1ldGVycy4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAtIHZlcmlmeSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBubyB2aXJ0dWFsIG1ldGhvZHMsIGFuZCBubyBlcXVhbGl0eSBvcGVyYXRvcnMuCisgKiAgLSBleHBvc2UgUEFSQU1fVFlQRSwgYW5kIG5vbi1mbGV4IEZMRVhfU0laRS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyU3RydWN0Q2hlY2sgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgICAgICBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3IiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvbHltb3JwaGljPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIHZpcnR1YWwgbWV0aG9kcyIpOworICAgIHN0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgb3BlcmF0b3I9PSBvciAhPSIpOworCitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgUEFSQU1fVFlQRSA9IENvcmVJbmRleCB8IFR5cGVGbGFncworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBGTEVYX1NJWkUgPSAwLAorICAgIH07Cit9OworCisvLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBGTEVYX1NJWkUgbWVtYmVyLgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGVfaW1wbCB7CisgICAgLy8vIHNwZWNpYWxpemF0aW9uIGZvciB0eXBlcyB0aGF0IGhhdmUgYSBGTEVYX1NJWkUgbWVtYmVyCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdW5zaWduZWQ9Uzo6RkxFWF9TSVpFPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RmxleFNpemUoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RGbGV4U2l6ZSguLi4pOworfTsKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkZsZXhpYmxlX2ltcGw6OlRlc3RGbGV4U2l6ZTxTPigwKSk6OnZhbHVlPiB7Cit9OworCisvLy8gTWFjcm8gdG8gdGVzdCBpZiBhIHR5cGUgaXMgZmxleGlibGUgKGhhcyBhIEZMRVhfU0laRSBtZW1iZXIpLgorI2RlZmluZSBJRl9GTEVYSUJMRShTKSBFTkFCTEVfSUYoX0MyRmxleGlibGU8Uz46OnZhbHVlKQorLy8vIFNob3J0aGFuZCBmb3Igc3RkOjplbmFibGVfaWYKKyNkZWZpbmUgRU5BQkxFX0lGKGNvbmQpIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGNvbmQ+Ojp0eXBlCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFY9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9jMl9lbmFibGVfaWZfdHlwZSB7CisgICAgdHlwZWRlZiBWIHR5cGU7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgZXhwb3NlcyB0aGUgZmxleGlibGUgc3VidHlwZSBvZiBhIHN0cnVjdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIEU9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXIgeworICAgIHR5cGVkZWYgdm9pZCBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSAwIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXhpYmxlIHR5cGVzLiBUaGlzIG9ubHkgd29ya3MgaWYgX0ZsZXhNZW1iZXJUeXBlIGlzIHB1YmxpYy4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyPFMsCisgICAgICAgIHR5cGVuYW1lIF9jMl9lbmFibGVfaWZfdHlwZTx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+Ojp0eXBlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXggYXJyYXlzLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8U1tdLAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgX0MyRmxleEhlbHBlcjxTPjo6RmxleFR5cGU+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIFMgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gc2l6ZW9mKFMpIH07Cit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgZmxleGlibGUgc3RydWN0IHJlcXVpcmVtZW50cyBhbmQgYWRkIGNvbW1vbiBvcGVyYXRpb25zLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gZXhwb3NlIENPUkVfSU5ERVggYW5kIEZpZWxkTGlzdCAodGhpcyBpcyBub3JtYWxseSBpbmhlcml0ZWQgZnJvbSB0aGUgc3RydWN0LCBidXQgZmxleGlibGUKKyAqICAgIHN0cnVjdHMgY2Fubm90IGJlIGJhc2UgY2xhc3NlcyBhbmQgdGh1cyBpbmhlcml0ZWQgZnJvbSkKKyAqICAtIGRpc2FibGUgY29weSBhc3NpZ25tZW50IGFuZCBjb25zdHJ1Y3Rpb24gKFRPRE86IHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRoZSBGTEVYIG1hY3JvIGZvciB0aGUKKyAqICAgIGZsZXhpYmxlIHN0cnVjdCwgc28gbWF5IG5vdCBiZSBuZWVkZWQgaGVyZSkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXgsIHVuc2lnbmVkIFR5cGVGbGFncz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhTdHJ1Y3RDaGVjayA6CisvLyBhZGQgZmxleGlibGUgZmxhZyBhcyBfQzJTdHJ1Y3RDaGVjayBkZWZpbmVzIFBBUkFNX1RZUEUKKyAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgVHlwZUZsYWdzPiB7CitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQ09SRV9JTkRFWCA9IFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgLy8vPCBmbGV4aWJsZSBzdHJ1Y3QgY29yZS1pbmRleAorICAgIH07CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKSB7IHJldHVybiBTOjpGaWVsZExpc3QoKTsgfQorCisgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgZGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBfQzJGbGV4U3RydWN0Q2hlY2soKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYW5ub3QgY29weSBmbGV4aWJsZSBwYXJhbXMKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2soY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisgICAgX0MyRmxleFN0cnVjdENoZWNrJiBvcGVyYXRvcj0gKGNvbnN0IF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUeXBlRmxhZ3M+ICYpID0gZGVsZXRlOworCisgICAgLy8gY29uc3RhbnRzIHVzZWQgZm9yIGhlbHBlciBtZXRob2RzCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxTPjo6RkxFWF9TSVpFLCAvLy88IHNpemUgb2YgZmxleGlibGUgdHlwZQorICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBNQVhfU0laRSA9ICh1aW50MzJfdClzdGQ6Om1pbigoc2l6ZV90KVVJTlQzMl9NQVgsIFNJWkVfTUFYKSwgLy8gVE9ETzogaXMgdGhpcyBhbHdheXMgdTMyIG1heD8KKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQkFTRV9TSVpFID0gc2l6ZW9mKFMpICsgc2l6ZW9mKEMyUGFyYW0pLCAvLy88IHNpemUgb2YgdGhlIGJhc2UgcGFyYW0KKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoaXMgcGFyYW0gd2l0aCBmbGV4Q291bnQsIG9yIDAgaWYgaXQgd291bGQgb3ZlcmZsb3cuCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3QgQ2FsY1NpemUoc2l6ZV90IGZsZXhDb3VudCwgc2l6ZV90IHNpemUgPSBCQVNFX1NJWkUpIHsKKyAgICAgICAgaWYgKGZsZXhDb3VudCA8PSAoTUFYX1NJWkUgLSBzaXplKSAvIFM6OkZMRVhfU0laRSkgeworICAgICAgICAgICAgcmV0dXJuIHNpemUgKyBTOjpGTEVYX1NJWkUgKiBmbGV4Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIGR5bmFtaWMgbmV3IG9wZXJhdG9yIHVzYWJsZSBmb3IgcGFyYW1zIG9mIHR5cGUgUworICAgIGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHNpemVfdCBmbGV4Q291bnQpIG5vZXhjZXB0IHsKKyAgICAgICAgLy8gVE9ETzogYXNzZXJ0KHNpemUgPT0gQkFTRV9TSVpFKTsKKyAgICAgICAgc2l6ZSA9IENhbGNTaXplKGZsZXhDb3VudCwgc2l6ZSk7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIDo6b3BlcmF0b3IgbmV3KHNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK307CisKKy8vLyBEZWZpbmUgRnJvbSgpIGNhc3Qgb3BlcmF0b3JzIGZvciBwYXJhbXMuCisjZGVmaW5lIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkgXAorICAgIGlubGluZSBzdGF0aWMgX1R5cGUqIEZyb20oQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gKF9UeXBlKilDMlBhcmFtOjpJZlN1aXRhYmxlKCBcCisgICAgICAgICAgICAgICAgb3RoZXIsIHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFLCBfVHlwZTo6RkxFWF9TSVpFLCBcCisgICAgICAgICAgICAgICAgKF9UeXBlOjpQQVJBTV9UWVBFICYgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpICE9IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEKTsgXAorICAgIH0gXAorICAgIGlubGluZSBzdGF0aWMgY29uc3QgX1R5cGUqIEZyb20oY29uc3QgQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBfVHlwZSo+KEZyb20oY29uc3RfY2FzdDxDMlBhcmFtICo+KG90aGVyKSkpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfSBcCisKKy8qKgorICogRGVmaW5lIGZsZXhpYmxlIGFsbG9jYXRvcnMgKEFsbG9jU2hhcmVkIG9yIEFsbG9jVW5pcXVlKSBmb3IgZmxleGlibGUgcGFyYW1zLgorICogIC0gUDo6QWxsb2NYeXooZmxleENvdW50LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIGdpdmVuIGZsZXgtY291bnQuIFRoaXMgbWFwcyB0bworICogICAgICAgICAgVChmbGV4Q291bnQsIGFyZ3MuLi4pXAorICoKKyAqIENsYW5nIGRvZXMgbm90IHN1cHBvcnQgYXJncy4uLiBmb2xsb3dlZCBieSB0ZW1wbGF0ZWQgcGFyYW0gYXMgYXJncy4uLiBlYXRzIGl0LiBIZW5jZSwKKyAqIHByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIHdoZXJlIHRoZSBpbml0aWFsaXplciByZXBsYWNlcyB0aGUgZmxleENvdW50LgorICoKKyAqIFNwZWNpYWxpemF0aW9ucyB0aGF0IGRlZHVjZSBmbGV4Q291bnQ6CisgKiAgLSBQOjpBbGxvY1h5eihUW10sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgYXJyYXkuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXRpYWxpemVyCisgKiAgICAgICAgICAgIGxpc3QuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OnZlY3RvcjxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCB2ZWN0b3IuCisgKiAgVGhlc2Ugc3BlY2lhbGl6YXRpb25zIG1hcCB0byBUKGZsZXhDb3VudCA9IHNpemUtb2YtaW5pdCwgYXJncy4uLiwgaW5pdCkKKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHB0ciwgUHRyKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoZmxleENvdW50KSBfVHlwZShmbGV4Q291bnQsIGFyZ3MuLi4pKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGU+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKCBcCisgICAgICAgICAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFU+ICZpbml0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhpbml0LnNpemUoKSkgX1R5cGUoaW5pdC5zaXplKCksIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGUsIHVuc2lnbmVkIE4+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKGNvbnN0IFUoJmluaXQpW05dLCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhOKSBfVHlwZShOLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgbWV0aG9kcyBBbGxvY1NoYXJlZCwgQWxsb2NVbmlxdWUgYW5kIGZsZXhDb3VudC4KKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgc2hhcmVkLCBTaGFyZWQpIFwKKyAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHVuaXF1ZSwgVW5pcXVlKSBcCisgICAgaW5saW5lIHNpemVfdCBmbGV4Q291bnQoKSBjb25zdCB7IFwKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoX1R5cGUpID09IF9UeXBlOjpCQVNFX1NJWkUsICJpbmNvcnJlY3QgQkFTRV9TSVpFIik7IFwKKyAgICAgICAgc2l6ZV90IHN6ID0gdGhpcy0+c2l6ZSgpOyBcCisgICAgICAgIGlmIChzeiA+PSBzaXplb2YoX1R5cGUpKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAoc3ogLSBzaXplb2YoX1R5cGUpKSAvIF9UeXBlOjpGTEVYX1NJWkU7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisKKy8vLyBNYXJrIGZsZXhpYmxlIG1lbWJlciB2YXJpYWJsZSBhbmQgbWFrZSBzdHJ1Y3R1cmUgZmxleGlibGUuCisjZGVmaW5lIEZMRVgoY2xzLCBtKSBcCisgICAgQzJfRE9fTk9UX0NPUFkoY2xzKSBcCitwcml2YXRlOiBcCisgICAgQzJQQVJBTV9NQUtFX0ZSSUVORFMgXAorICAgIC8qKiBcaWYgMCAqLyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IF9DMkZsZXhIZWxwZXI7IFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgZGVjbHR5cGUobSkgX0ZsZXhNZW1iZXJUeXBlOyBcCisgICAgLyogZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIGZsZXhDb3VudCAqLyBcCisgICAgaW5saW5lIGNscyhzaXplX3QpIDogY2xzKCkge30gXAorICAgIC8qIGNvbnN0ZXhwciBzdGF0aWMgX0ZsZXhNZW1iZXJUeXBlIGNsczo6KiBmbGV4TWVtYmVyID0gJmNsczo6bTsgKi8gXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGbGV4VHlwZSBGbGV4VHlwZTsgXAorICAgIHN0YXRpY19hc3NlcnQoXAorICAgICAgICAgICAgIXN0ZDo6aXNfdm9pZDxGbGV4VHlwZT46OnZhbHVlLCBcCisgICAgICAgICAgICAibWVtYmVyIGlzIG5vdCBmbGV4aWJsZSwgb3IgYSBmbGV4aWJsZSBhcnJheSBvZiBhIGZsZXhpYmxlIHR5cGUiKTsgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07IFwKKyAgICAvKiogXGVuZGlmICovIFwKKworLy8vIEB9CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiBzdHJ1Y3R1cmVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKKyAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwcml2YXRlIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKworICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULCBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYmFzaWMgYWxsb2NhdGlvbjogbmV3KGZsZXhDb3VudCkgUC4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9JTlBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gU3RyZWFtIHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBzcGVjaWZpYyBzdHJlYW0gb24gYSBwb3J0IChpbnB1dCBvcgorICogb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW10ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCisgKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAorICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKKyAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwKKyAgICAgICAgICBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKyAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9JTlBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgaW5wdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgb3V0cHV0KCkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQorICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsCisgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUsIDB1KSB7IH0KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCisgICAgLy8vIHN0cmVhbS1JRC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBWQUxVRSBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFxpbmdyb3VwIGludGVybmFsCisgKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0IHsKKyAgICBUIHZhbHVlOyAvLy88IHNpbXBsZSB2YWx1ZSBvZiB0aGUgc3RydWN0dXJlCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIGFuIGluaXRpYWwgdmFsdWUuCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoVCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKK307CisKKy8vIFRPRE86IG1vdmUgdGhpcyBhbmQgbmV4dCB0byBzb21lIGdlbmVyaWMgcGxhY2UKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgKG1hcHBlZCkgbWVtb3J5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMk1lbW9yeUJsb2NrIHsKKyAgICAvLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJsb2NrLgorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisgICAgLy8vIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG91dHNpZGUKKyAgICAvLy8gdGhlIGJsb2NrLgorICAgIHZpcnR1YWwgY29uc3QgVCAqZGF0YSgpIGNvbnN0ID0gMDsgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgZnJpZW5kIGFjY2VzcyBvbmx5IGluIHNvbWUgQzJNZW1vcnkgbW9kdWxlPworICAgIC8vLyBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvciB3cml0ZQorICAgIC8vLyBvdXRzaWRlIHRoZSBibG9jay4KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KGNvbnN0X2Nhc3Q8Y29uc3QgQzJNZW1vcnlCbG9jayo+KHRoaXMpLT5kYXRhKCkpOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBUT0RPOiBmb3Igbm93IGl0IHNob3VsZCBuZXZlciBiZSBkZWxldGVkIGFzIEMyTWVtb3J5QmxvY2sKKyAgICB2aXJ0dWFsIH5DMk1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiBtZW1vcnkgY29udGFpbmluZyBhIGNvbnN0YW50IChjb25zdGV4cHIpIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJDb25zdE1lbW9yeUJsb2NrIDogcHVibGljIEMyTWVtb3J5QmxvY2s8VD4geworICAgIHZpcnR1YWwgY29uc3QgVCAqIGRhdGEoKSBjb25zdCB7IHJldHVybiBfbURhdGE7IH0KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgY29uc3RleHByIEMyQ29uc3RNZW1vcnlCbG9jayhjb25zdCBUKCZpbml0KVtOXSkgOiBfbURhdGEoaW5pdCksIF9tU2l6ZShOKSB7fQorCitwcml2YXRlOgorICAgIGNvbnN0IFQgKl9tRGF0YTsKKyAgICBjb25zdCBzaXplX3QgX21TaXplOworfTsKKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0byBpbml0aWFsaXplIGZsZXhpYmxlIGFycmF5cyB3aXRoIHZhcmlvdXMgaW5pdGFsaXplcnMuCitzdHJ1Y3QgX0MyVmFsdWVBcnJheUhlbHBlciB7CisgICAgLy8gY2hhcltdLXMgYXJlIHVzZWQgYXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHNvIHRoZSBsYXN0IGVsZW1lbnQgaXMgbmV2ZXIgaW5pdGVkLgorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIGNvbnN0ZXhwciBtZW1vcnkgYmxvY2suCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChibG9jay5kYXRhKCkpIHsKKyAgICAgICAgICAgIG1lbWNweShhcnJheSwgYmxvY2suZGF0YSgpLCBzdGQ6Om1pbihhcnJheUxlbiwgYmxvY2suc2l6ZSgpKSAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFQgJml0ZW0gOiBpbml0KSB7CisgICAgICAgICAgICBpZiAoaXggPT0gYXJyYXlMZW4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5W2l4KytdID0gaXRlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSB2ZWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBUKCZzdHIpW05dKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChhcnJheUxlbikgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBzdHIsIHN0ZDo6bWluKGFycmF5TGVuLCAoc2l6ZV90KU4pICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGEgZmxleGlibGUgYmxvYiBhbmQgc3RyaW5nIGFycmF5cy4gQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZQorICogZmxleGlibGUgYXJyYXkgbWVtYmVyIHdpdGggZGVmYXVsdCBmbGV4aWJsZSBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUKKyAqIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplIGlzIDAuCisgKgorICogXGludGVybmFsIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gQzJTaW1wbGVBcnJheVN0cnVjdDxUW10+IHNpbXBseSBiZWNhdXNlIGl0cyBtZW1iZXIgaGFzIHRoZSBuYW1lCisgKiBhcyB2YWx1ZSB0byByZWZsZWN0IHRoaXMgaXMgYSBzaW5nbGUgdmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgb25seSBmb3IgQkxPQiBvciBTVFJJTkciKTsKKyAgICBUIHZhbHVlW107CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKKyAgICBGTEVYKEMyU2ltcGxlVmFsdWVTdHJ1Y3QsIHZhbHVlKQorCitwcml2YXRlOgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgYmxvY2spOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8vLyBAfQorCisvKioKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZmxleGlibGUgYXJyYXkgZWxlbWVudCBvZiBhIHNwZWNpZmljIHR5cGUgKFQpIHdpdGgKKyAqIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplCisgKiBpcyAwLiBJbnN0ZWFkLCBpdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyLCBlLmcuCisgKgorICogICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyTXlGYW5jeVN0cnVjdD4sCisgKiAgICAgICAgICAga1BhcmFtSW5kZXhNeUZhbmN5QXJyYXlTdHJlYW1QYXJhbT4gQzJNeUZhbmN5QXJyYXlTdHJlYW1JbmZvOworICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlQXJyYXlTdHJ1Y3QgeworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgJiYgIXN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAidXNlIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBmb3IgQkxPQiBvciBTVFJJTkciKTsKKworICAgIFQgdmFsdWVzW107IC8vLzwgYXJyYXkgbWVtYmVyCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFNpbXBsZUFycmF5LCB2YWx1ZXMpCisgICAgLy9GTEVYKEMyU2ltcGxlQXJyYXlTdHJ1Y3QsIHZhbHVlcykKKworcHJpdmF0ZToKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDMk1lbW9yeUJsb2NrLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gdmVjdG9yLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9Cit9OworCisvKioKKyAqIFxhZGR0b2dyb3VwIHNpbXBsZXZhbHVlIFNpbXBsZSB2YWx1ZSBhbmQgYXJyYXkgc3RydWN0dXJlcy4KKyAqIEB7CisgKgorICogU2ltcGxlIHZhbHVlIHN0cnVjdHVyZXMuCisgKgorICogU3RydWN0dXJlcyBjb250YWluaW5nIGEgc2luZ2xlIHNpbXBsZSB2YWx1ZS4gVGhlc2UgY2FuIGJlIHJldXNlZCB0byBlYXNpbHkgZGVmaW5lIHNpbXBsZQorICogcGFyYW1ldGVycyBvZiB2YXJpb3VzIHR5cGVzOgorICoKKyAqICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE15SW50ZWdlclBvcnRQYXJhbT4KKyAqICAgICAgICAgICBDMk15SW50ZWdlclBvcnRQYXJhbVR1bmluZzsKKyAqCisgKiBUaGV5IGNvbnRhaW4gYSBzaW5nbGUgbWVtYmVyICh2YWx1ZSBvciB2YWx1ZXMpIHRoYXQgaXMgZGVzY3JpYmVkIGFzICJ2YWx1ZSIgb3IgInZhbHVlcyIuCisgKgorICogVGhlc2Ugc3RydWN0dXJlcyBkb24ndCBkZWZpbmUgYSBjb3JlIGluZGV4LCBhbmQgYXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBzdHJ1Y3R1cmUKKyAqIGRlY2xhcmF0aW9ucy4gVXNlIHR5cGVbXSBpbnN0ZWFkLCBzdWNoIGFzIGludDMyX3QgZmllbGRbXS4KKyAqLworLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQzMl90PiBDMkludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMkFycmF5OworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMlZhbHVlOworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyQXJyYXk7CisvLy8gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDY0X3Q+IEMySW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQ2NF90PiBDMkludDY0QXJyYXk7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDY0X3Q+IEMyVWludDY0VmFsdWU7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRBcnJheTsKKy8vLyBBIGZsb2F0IHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxmbG9hdD4gQzJGbG9hdFZhbHVlOworLy8vIEEgZmxvYXQgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRBcnJheTsKKy8vLyBBIGJsb2IgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ4X3RbXT4gQzJCbG9iVmFsdWU7CisvLy8gQSBzdHJpbmcgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGNoYXJbXT4gQzJTdHJpbmdWYWx1ZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVBcnJheVN0cnVjdDxUPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWVzLCAidmFsdWVzIikgfTsKK30KKworLy8vIEB9CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyUEFSQU1fREVGX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzZjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJXT1JLX0hfCisKKyNkZWZpbmUgQzJXT1JLX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLy8vIFxkZWZncm91cCB3b3JrIFdvcmsgYW5kIGRhdGEgcHJvY2Vzc2luZworLy8vIEB7CisKKy8qKgorICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgcmVhc29uIGEgcGFyYW1ldGVyIHNldHRpbmdzIG1heSBmYWlsLCBvcgorICogbWF5IGJlIG92ZXJyaWRlbi4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgZW51bSBGYWlsdXJlIDogdWludDMyX3QgeworICAgICAgICAvKiBwYXJhbWV0ZXIgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1RZUEUsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBCQURfUE9SVCwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBwb3J0CisgICAgICAgIEJBRF9JTkRFWCwgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHN0cmVhbQorICAgICAgICBSRUFEX09OTFksICAvLy88IHBhcmFtZXRlciBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQKKyAgICAgICAgTUlTTUFUQ0gsICAgLy8vPCBwYXJhbWV0ZXIgbWlzbWF0Y2hlcyBpbnB1dCBkYXRhCisKKyAgICAgICAgLyogZmllbGQgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1ZBTFVFLCAgLy8vPCBzdHJpY3QgcGFyYW1ldGVyIGRvZXMgbm90IGFjY2VwdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGF0IGFsbAorICAgICAgICBDT05GTElDVCwgICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZmllbGQgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisKKyAgICAgICAgLy8vIHBhcmFtZXRlciBmaWVsZCBpcyBvdXQgb2YgcmFuZ2UgZHVlIHRvIG90aGVyIHNldHRpbmdzICh0aGlzIGZhaWx1cmUgbW9kZQorICAgICAgICAvLy8gY2FuIG9ubHkgYmUgdXNlZCBmb3Igc3RyaWN0IGNhbGN1bGF0ZWQgcGFyYW1ldGVycykKKyAgICAgICAgVU5TVVBQT1JURUQsCisKKyAgICAgICAgLy8vIGZpZWxkIGRvZXMgbm90IGFjY2VzcyB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBhdCBhbGwuIEl0IGhhcyBiZWVuIGNvcnJlY3RlZCB0bworICAgICAgICAvLy8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUgbW9kZSBpcyBwcm92aWRlZCB0byBnaXZlIGd1aWRhbmNlIGFzIHRvIHdoYXQKKyAgICAgICAgLy8vIGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQgKHdoaWNoIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgYXQtYWxsLQorICAgICAgICAvLy8gcG90ZW50aWFsIHZhbHVlcykKKyAgICAgICAgSU5GT19CQURfVkFMVUUsCisKKyAgICAgICAgLy8vIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisgICAgICAgIC8vLyBhbmQgaGFzIGJlZW4gY29ycmVjdGVkIHRvIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZS4gVGhpcyBmYWlsdXJlCisgICAgICAgIC8vLyBtb2RlIGlzIGdpdmVuIHRvIHByb3ZpZGUgZ3VpZGFuY2UgYXMgdG8gd2hhdCBhcmUgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHdlbGwKKyAgICAgICAgLy8vIGFzIHRvIG9wdGlvbmFsbHkgcHJvdmlkZSBzdWdnZXN0aW9uIHRvIHRoZSBjbGllbnQgYXMgdG8gaG93IHRvIGVuYWJsZSB0aGUgcmVxdWVzdGVkCisgICAgICAgIC8vLyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgIElORk9fQ09ORkxJQ1QsCisgICAgfTsKKworICAgIEZhaWx1cmUgZmFpbHVyZTsgICAgLy8vPCBmYWlsdXJlIGNvZGUKKworICAgIC8vLyBGYWlsaW5nIChvciBjb3JyZWN0ZWQpIGZpZWxkIG9yIHBhcmFtZXRlcmFuZCBvcHRpb25hbGx5LCBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlCisgICAgLy8vIGZpZWxkLiBWYWx1ZXMgbXVzdCBvbmx5IGJlIHNldCBmb3IgZmllbGQgZmFpbHVyZXMgb3RoZXIgdGhhbiBCQURfVkFMVUUsIGFuZCBvbmx5IGlmIHRoZXkgYXJlCisgICAgLy8vIGRpZmZlcmVudCBmcm9tIHRoZSBnbG9iYWxseSBzdXBwb3J0ZWQgdmFsdWVzIChlLmcuIGR1ZSB0byByZXN0cmljdGlvbnMgYnkgYW5vdGhlciBwYXJhbSBvcgorICAgIC8vLyBpbnB1dCBkYXRhKS4KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMgZmllbGQ7CisKKyAgICAvLy8gQ29uZmxpY3RpbmcgcGFyYW1ldGVycyBvciBmaWVsZHMgd2l0aCBvcHRpb25hbCBzdWdnZXN0aW9ucyB3aXRoIChvcHRpb25hbCkgc3VnZ2VzdGVkIHZhbHVlcworICAgIC8vLyBmb3IgYW55IGNvbmZsaWN0aW5nIGZpZWxkcyB0byBhdm9pZCB0aGUgY29uZmxpY3QuIE11c3Qgb25seSBiZSBzZXQgZm9yIENPTkZMSUNULCBVTlNVUFBPUlRFRAorICAgIC8vLyBhbmQgSU5GT19DT05GTElDVCBmYWlsdXJlIGNvZGVzLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gY29uZmxpY3RzOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV09SSworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKiBVbmlxdWUgSUQgZm9yIGEgcHJvY2Vzc2luZyBub2RlLiAqLwordHlwZWRlZiB1aW50MzJfdCBjMl9ub2RlX2lkX3Q7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4V29ya09yZGluYWwsCit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGZvciBvcmRlcmluZyB3b3JrIGl0ZW1zIG9uIGEgY29tcG9uZW50IHBvcnQuCisgKi8KK3N0cnVjdCBDMldvcmtPcmRpbmFsU3RydWN0IHsKKy8vcHVibGljOgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcDsgICAgIC8qKiBmcmFtZSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzICovCisgICAgYzJfY250cjY0X3QgZnJhbWVJbmRleDsgICAgLyoqIHN1Ym1pc3Npb24gb3JkaW5hbCBvbiB0aGUgaW5pdGlhbCBjb21wb25lbnQgKi8KKyAgICBjMl9jbnRyNjRfdCBjdXN0b21PcmRpbmFsOyAvKiogY2FuIGJlIGdpdmVuIGJ5IHRoZSBjb21wb25lbnQsIGUuZy4gZGVjb2RlIG9yZGVyICovCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFdvcmtPcmRpbmFsKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKKyAgICBDMkZJRUxEKGZyYW1lSW5kZXgsICJmcmFtZS1pbmRleCIpCisgICAgQzJGSUVMRChjdXN0b21PcmRpbmFsLCAiY3VzdG9tLW9yZGluYWwiKQorfTsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgQ29kZWMgMi4wIGZyYW1lIHdpdGggaXRzIG1ldGFkYXRhLgorICoKKyAqIEEgZnJhbWUgYmFzaWNhbGx5IGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgc2V0cyBvZiBidWZmZXJzLCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYW5kIGluZm8gYnVmZmVycworICogYWxvbmcgd2l0aCBzb21lIG5vbi1jb25maWd1cmF0aW9uIG1ldGFkYXRhLgorICovCitzdHJ1Y3QgQzJGcmFtZURhdGEgeworLy9wdWJsaWM6CisgICAgZW51bSBmbGFnc190IDogdWludDMyX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGlucHV0IGZyYW1lczogbm8gb3V0cHV0IGZyYW1lIHNoYWxsIGJlIGdlbmVyYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhpcyBmcmFtZSwgYnV0CisgICAgICAgICAqIG1ldGFkYXRhIHNoYWxsIHN0aWxsIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgICogRm9yIG91dHB1dCBmcmFtZXM6IHRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIGFuZCBidXQgbWV0YWRhdGEgaXMgc3RpbGwgdmFsaWQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0RST1BfRlJBTUUgICAgPSAoMSA8PCAwKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGN1cnJlbnQgc3RyZWFtLiBGdXJ0aGVyIGZyYW1lcyBhcmUgcGFydCBvZiBhIG5ldworICAgICAgICAgKiBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBGTEFHX0VORF9PRl9TVFJFQU0gPSAoMSA8PCAxKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIHdpdGggaXRzIG1ldGFkYXRhLgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgb25seSBzZXQgYnkgY29tcG9uZW50cyAtIGUuZy4gYXMgYSByZXNwb25zZSB0byB0aGUgZmx1c2ggY29tbWFuZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRElTQ0FSRF9GUkFNRSA9ICgxIDw8IDIpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyBub3QgdGhlIGxhc3QgZnJhbWUgcHJvZHVjZWQgZm9yIHRoZSBpbnB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBmbGFnIGlzIG5vcm1hbGx5IHNldCBieSB0aGUgY29tcG9uZW50IC0gZS5nLiB3aGVuIGFuIGlucHV0IGZyYW1lIHJlc3VsdHMgaW4gbXVsdGlwbGUKKyAgICAgICAgICogb3V0cHV0IGZyYW1lcywgdGhpcyBmbGFnIGlzIHNldCBvbiBhbGwgYnV0IHRoZSBsYXN0IG91dHB1dCBmcmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxzbywgd2hlbiBjb21wb25lbnRzIGFyZSBjaGFpbmVkLCB0aGlzIGZsYWcgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZG93biB0aGUKKyAgICAgICAgICogd29yayBjaGFpbi4gVGhhdCBpcywgaWYgc2V0IG9uIGFuIGVhcmxpZXIgZnJhbWUgb2YgYSB3b3JrLWNoYWluLCBpdCBzaG91bGQgYmUgcHJvcGFnYXRlZAorICAgICAgICAgKiB0byBhbGwgbGF0ZXIgZnJhbWVzIGluIHRoYXQgY2hhaW4uIEFkZGl0aW9uYWxseSwgY29tcG9uZW50cyBkb3duIHRoZSBjaGFpbiBjb3VsZCBzZXQKKyAgICAgICAgICogdGhpcyBmbGFnIGV2ZW4gaWYgbm90IHNldCBlYXJsaWVyLCBlLmcuIGlmIG11bHRpcGxlIG91dHB1dCBmcmFtZSBpcyBnZW5lcmF0ZWQgYXQgdGhhdAorICAgICAgICAgKiBjb21wb25lbnQgZm9yIHRoZSBpbnB1dCBmcmFtZS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfSU5DT01QTEVURSA9ICgxIDw8IDMpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBjb250YWlucyBvbmx5IGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YSwgYW5kIG5vIGFjdHVhbCBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGRlcHJlY2F0ZWQgcGFzcyBjb2RlYyBjb25maWd1cmF0aW9uIHdpdGggdXNpbmcgdGhlIFx0b2RvIGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaW5mbyB0b2dldGhlciB3aXRoIHRoZSBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfQ09ERUNfQ09ORklHICA9ICgxdSA8PCAzMSksCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGZsYWdzICovCisgICAgZmxhZ3NfdCAgZmxhZ3M7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnM7CisgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAorICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7Cit9OworCitzdHJ1Y3QgQzJXb3JrbGV0IHsKKy8vcHVibGljOgorICAgIC8vIElOCisgICAgYzJfbm9kZV9pZF90IGNvbXBvbmVudDsKKworICAgIC8qKiBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gYmUgYXBwbGllZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGlzIHdvcmtsZXQuICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gdHVuaW5nczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBPVVQKKyAgICBDMkZyYW1lRGF0YSBvdXRwdXQ7Cit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHBhcnRpYWwgd29yay1jaGFpbnMgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgd29yayBpdGVtcy4KKyAqCisgKiBUbyBiZSBkZWZpbmVkIGxhdGVyLgorICovCitzdHJ1Y3QgQzJXb3JrQ2hhaW5JbmZvOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBhIHNpbmdsZSB3b3JrIGl0ZW0uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdG8gdGhlIGNvbXBvbmVudCBmb3IgdGhlIGZpcnN0IHdvcmtsZXQuIEFzIHN1Y2gsCisgKiB3b3JrbGV0cyBtdXN0IG5vdCBiZSBlbXB0eS4gVGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCBpcyBwYXNzZWQuCisgKi8KK3N0cnVjdCBDMldvcmsgeworLy9wdWJsaWM6CisgICAgLy8vIGFkZGl0aW9uYWwgd29yayBjaGFpbiBpbmZvIG5vdCBwYXJ0IG9mIHRoaXMgd29yaworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMldvcmtDaGFpbkluZm8+IGNoYWluSW5mbzsKKworICAgIC8vLyBUaGUgaW5wdXQgZGF0YSB0byBiZSBwcm9jZXNzZWQgYXMgcGFydCBvZiB0aGlzIHdvcmsvd29yay1jaGFpbi4gVGhpcyBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdpdGggb3duZXJzaGlwLiBXaGVuIHRoZSB3b3JrIGlzIHJldHVybmVkICh2aWEgb25Xb3JrRG9uZSksIHRoZSBpbnB1dCBidWZmZXItcGFjaydzCisgICAgLy8vIGJ1ZmZlciB2ZWN0b3Igc2hhbGwgY29udGFpbiBudWxscHRycy4KKyAgICBDMkZyYW1lRGF0YSBpbnB1dDsKKworICAgIC8vLyBUaGUgY2hhaW4gb2YgY29tcG9uZW50cywgdHVuaW5ncyAoaW5jbHVkaW5nIG91dHB1dCBidWZmZXIgcG9vbCBJRHMpIGFuZCBpbmZvIHJlcXVlc3RzIHRoYXQgdGhlCisgICAgLy8vIGRhdGEgbXVzdCBwYXNzIHRocm91Z2guIElmIHRoaXMgaGFzIG1vcmUgdGhhbiBhIHNpbmdsZSBlbGVtZW50LCB0aGUgdHVubmVscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICAvLy8gY29tcG9uZW50cyBvZiB0aGUgd29ya2xldCBjaGFpbiBtdXN0IGhhdmUgYmVlbiAoc3VjY2Vzc2Z1bGx5KSBwcmUtcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGF0CisgICAgLy8vIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gQWxsb2NhdGluZyB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gdGhlIHdvcmtsZXRzIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICAgIC8vLyBlYWNoIGNvbXBvbmVudC4gVXBvbiB3b3JrIHN1Ym1pc3Npb24sIGVhY2ggb3V0cHV0IGJ1ZmZlci1wYWNrIHNoYWxsIGJlIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQKKyAgICAvLy8gdmVjdG9yIGNvbnRhaW5pbmcgbnVsbHB0cnMuIFdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGVkL3JldHVybmVkIHRvIHRoZSBjbGllbnQsIG91dHB1dCBidWZmZXJzCisgICAgLy8vIHBvaW50ZXJzIGZyb20gYWxsIGJ1dCB0aGUgZmluYWwgd29ya2xldCBzaGFsbCBiZSBudWxscHRycy4KKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4+IHdvcmtsZXRzOworCisgICAgLy8vIE51bWJlciBvZiB3b3JrbGV0cyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGluIHRoaXMgY2hhaW4uIFRoaXMgc2hhbGwgYmUgaW5pdGlhbGl6ZWQgdG8gMCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdoZW4gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBJdCBzaGFsbCBjb250YWluIHRoZSBudW1iZXIgb2Ygd29ya2xldHMgdGhhdCB3ZXJlCisgICAgLy8vIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgd2hlbiB0aGUgd29yayBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LiBJZiB0aGlzIGlzIGxlc3MgdGhlbiB0aGUgbnVtYmVyCisgICAgLy8vIG9mIHdvcmtsZXRzLCByZXN1bHQgbXVzdCBub3QgYmUgc3VjY2Vzcy4gSXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIHdvcmtsZXRzLnNpemUoKV0uCisgICAgdWludDMyX3Qgd29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAvLy8gVGhlIGZpbmFsIG91dGNvbWUgb2YgdGhlIHdvcmsgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgd29ya2xldHNQcm9jZXNzZWQpLiBJZiAwIHdoZW4KKyAgICAvLy8gd29yayBpcyByZXR1cm5lZCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB3b3JrbGV0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorICAgIGMyX3N0YXR1c190IHJlc3VsdDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBmdXR1cmUgd29yayB0byBiZSBzdWJtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudC4gVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8KKyAqIHJlc2VydmUgdGhlIHdvcmsgZm9yIHdvcmsgb3JkZXJpbmcgcHVycG9zZXMuCisgKi8KK3N0cnVjdCBDMldvcmtPdXRsaW5lIHsKKy8vcHVibGljOgorICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICBzdGQ6OnZlY3RvcjxjMl9ub2RlX2lkX3Q+IGNoYWluOworfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJXT1JLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTliYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19NQUNST19VVElMU19IXworI2RlZmluZSBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisKKy8qKiBcZmlsZQorICogTWFjcm8gdXRpbGl0aWVzIGZvciB0aGUgdXRpbHMgbGlicmFyeSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxpZiAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT1VOVElORyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIF9DMl9BUkcoKSBleHBhbmRzIHRvICcnLCB3aGlsZSBfQzJfQVJHKHgpIGV4cGFuZHMgdG8gJywgeCcKKy8vIF9DMl9BUkduKC4uLikgZG9lcyB0aGUgc2FtZSBmb3IgbiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX0FSRyguLi4pICwgIyNfX1ZBX0FSR1NfXworI2RlZmluZSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcoXzEpIF9DMl9BUkcoXzIpCisjZGVmaW5lIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcyKF8zLCBfNCkKKyNkZWZpbmUgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzQoXzUsIF82LCBfNywgXzgpCisjZGVmaW5lIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICAgICAgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHOChfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KQorCisvLyByZXR1cm4gdGhlIDY1dGggYXJndW1lbnQKKyNkZWZpbmUgX0MyX0FSR0NfMyhfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIF82NAorCisvLy8gXGVuZGlmCisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAqLworLy8gV2UgZG8gdGhpcyBieSBwcmVwZW5kaW5nIDEgYW5kIGFwcGVuZGluZyA2NSBkZXNpZ25lZCB2YWx1ZXMgc3VjaCB0aGF0IHRoZSA2NXRoIGVsZW1lbnQKKy8vIHdpbGwgYmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisjZGVmaW5lIF9DMl9BUkdDKC4uLikgX0MyX0FSR0NfMSgwLCAjI19fVkFfQVJHU19fLCBcCisgICAgICAgIDY0LCA2MywgNjIsIDYxLCA2MCwgNTksIDU4LCA1NywgNTYsIDU1LCA1NCwgNTMsIDUyLCA1MSwgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLCBcCisgICAgICAgIDQyLCA0MSwgNDAsIDM5LCAzOCwgMzcsIDM2LCAzNSwgMzQsIDMzLCAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCBcCisgICAgICAgIDIwLCAxOSwgMTgsIDE3LCAxNiwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCkKKworLy8vIFxpZiAwCisKKy8vIHN0ZXAgMS4gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIHRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW0gZGVmaW5pdGlvbnMKKy8vIChOT1RFOiB3ZSBkb24ndCBrbm93IHdoaWNoIGFyZ3VtZW50IHdpbGwgaGF2ZSB0aGlzIHRyYWlsaW5nIGNvbW1hIHNvIHdlIGhhdmUgdG8gdHJ5IGFsbCkKKyNkZWZpbmUgX0MyX0FSR0NfMShfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIFwKKyAgICBfQzJfQVJHQ18yKF8gX0MyX0FSRyhfMCkgXAorICAgIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICBfQzJfQVJHMTYoXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyKSBcCisgICAgX0MyX0FSRzE2KF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCkgXAorICAgIF9DMl9BUkcxNihfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQpLCBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworLy8gc3RlcCAyLiB0aGlzIGlzIG5lZWRlZCBhcyByZW1vdmVkIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIGRpcmVjdGx5IGFzIGVtcHR5IGludG8gYSBtYWNybworI2RlZmluZSBfQzJfQVJHQ18yKC4uLikgX0MyX0FSR0NfMyhfX1ZBX0FSR1NfXykKKworLy8vIFxlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT05WRVJTSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vLyBcaWYgMAorCisvLyBtYWNyb3MgdGhhdCBjb252ZXJ0IF8xLCBfMiwgXzMsIC4uLiB0byBmbihfMSwgYXJnKSwgZm4oXzIsIGFyZyksIGZuKF8zLCBhcmcpLCAuLi4KKyNkZWZpbmUgX0MyX01BUF82NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF84KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF83KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZykKKworLy8vIFxlbmRpZgorCisvKioKKyAqIE1hcHMgZWFjaCBhcmd1bWVudCB1c2luZyBhbm90aGVyIG1hY3JvIHggLT4gZm4oeCwgYXJnKQorICovCisvLyB1c2Ugd3JhcHBlciB0byBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCisjZGVmaW5lIF9DMl9NQVAoZm4sIGFyZywgLi4uKSBfQzJfTUFQX18oX0MyX0FSR0MoX19WQV9BUkdTX18pLCBmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorCisvLy8gXGlmIDAKKworLy8gZXZhbHVhdGUgX24gc28gaXQgYmVjb21lcyBhIG51bWJlcgorI2RlZmluZSBfQzJfTUFQX18oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8oX24sIGZuLCBhcmcsIF9fVkFfQVJHU19fKQorLy8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlcgorI2RlZmluZSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyMjX24gKGZuLCBhcmcsIF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19NQUNST19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJlYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMkJVRkZFUl9IXworI2RlZmluZSBBTkRST0lEX0MyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworLyogVXNlIGFuZHJvaWQgbmF0aXZlIGhhbmRsZSBmb3IgQzJIYW5kbGUgKi8KK3R5cGVkZWYgOjpuYXRpdmVfaGFuZGxlX3QgQzJIYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBbmRyb2lkIHBsYXRmb3JtIGJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4KKyAqLworc3RydWN0IEMyQW5kcm9pZE1lbW9yeVVzYWdlIDogcHVibGljIEMyTWVtb3J5VXNhZ2UgeworICAgIGlubGluZSBDMkFuZHJvaWRNZW1vcnlVc2FnZShjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSkgOiBDMk1lbW9yeVVzYWdlKHVzYWdlKSB7IH0KKworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIFJldXNlIGdyYWxsb2MgZmxhZ3Mgd2hlcmUgcG9zc2libGUsIGFzIENvZGVjIDIuMCBBUEkgb25seSB1c2VzIGJpdHMgMCBhbmQgMS4KKyAgICAgKi8KKyAgICBlbnVtIGNvbnN1bWVyX3QgOiB1aW50NjRfdCB7CisgICAgICAgIFJFTkRFUlNDUklQVF9SRUFEID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfUkVBRCAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAorICAgICAgICBIV19DT01QT1NFUl9SRUFEICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIsCisgICAgICAgIC8vIGdyYWxsb2MgZG9lcyBub3QgZGVmaW5lIGEgdmlkZW8gZGVjb2RlciByZWFkIHVzYWdlIGZsYWcsIHNvIHVzZSBlbmNvZGVyIGZvcgorICAgICAgICAvLyBub3cKKyAgICAgICAgSFdfQ09ERUNfUkVBRCAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCisgICAgICAgIFJFQURfUFJPVEVDVEVEICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCisgICAgfTsKKworICAgIGVudW0gcHJvZHVjZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1dSSVRFID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfV1JJVEUgICA9IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAorICAgICAgICBIV19DT01QT1NFUl9XUklURSAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPREVDX1dSSVRFICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB3cml0ZSBwcm90ZWN0ZWQgdXNhZ2UgZmxhZywgc28gdXNlIHJlYWQgcHJvdGVjdGVkCisgICAgICAgIC8vIG5vdworICAgICAgICBXUklURV9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgc3RhdGljIEMyTWVtb3J5VXNhZ2UgRnJvbUdyYWxsb2NVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRvIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgdWludDY0X3QgYXNHcmFsbG9jVXNhZ2UoKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTFhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlOworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVE9ETzogOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxJSW5wdXRTdXJmYWNlPgordHlwZWRlZiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IElucHV0U3VyZmFjZUJhc2U7CisKK2NsYXNzIElucHV0U3VyZmFjZSA6IHB1YmxpYyBJbnB1dFN1cmZhY2VCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUlucHV0U3VyZmFjZQorICAgIHNwPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OkMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgLy8gVE9ETzogaW50ZigpCisKKyAgICBzdGF0aWMgc3A8SW5wdXRTdXJmYWNlPiBDcmVhdGUoKTsKKworcHJpdmF0ZToKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYmFzZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gVE9ETzogaW5oZXJpdCBmcm9tIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uCitjbGFzcyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIEZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSW5wdXRTdXJmYWNlOworCisgICAgLy8gRm9yIElucHV0U3VyZmFjZQorICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICBib29sIGluaXQoKTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKworICAgIGNsYXNzIEltcGw7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEltcGw+IG1JbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRTdXJmYWNlQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaCBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgxMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKK2ltcG9ydCByZSwgc3lzCisKK2dsb2JhbCBpbl9jb21tZW50LCBjdXJyZW50LCBpbmRlbnQsIGhvbGQKK2luX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZCA9IEZhbHNlLCBOb25lLCAnJywgW10KKworY2xhc3MgQ2hhbmdlQ1N0eWxlQ29tbWVudHNUb0RveHk6CisgICAgZGVmIGR1bXBfaG9sZCgpOgorICAgICAgICBnbG9iYWwgaG9sZAorICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBkb3h5X2hvbGQoKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGhvbGQKKyAgICAgICAgaWYgY3VycmVudCA9PSAnLy8nOgorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBwcmludChyZS5zdWIocideKCAqLy8oPyEvKSknLCByJ1wxLycsIGgpLCBlbmQ9JycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGggPSByZS5zdWIocideKCAqL1sqXSg/IVsqXSkpJywgcidcMSonLCBoKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodCwgaW5kLCBsaW5lKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGluZGVudCwgaG9sZAorICAgICAgICBpZiB0ICE9IGN1cnJlbnQgb3IgaW5kIG5vdCBpbiAoaW5kZW50LCBpbmRlbnQgKyAnICcpOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgICAgIGN1cnJlbnQsIGluZGVudCA9IHQsIGluZAorICAgICAgICBob2xkLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50CisgICAgICAgIGlmIGluZCBpbiAoaW5kZW50LCAnJyk6CisgICAgICAgICAgICBkb3h5X2hvbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgY3VycmVudCwgaW5kZW50ID0gTm9uZSwgTm9uZQorICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaW5kID0gcmUubWF0Y2gocideKCAqKScsIGxpbmUpLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbl9jb21tZW50OgorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKlsqXS8nLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKi8vJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBvbmUtbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvLycsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqL1sqXScsIGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgbXVsdGktbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZ29vZCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpbl9jb21tZW50ID0gbm90IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpCisKK2NsYXNzIEF1dG9Hcm91cDoKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGlmICcvY29kZWMyL2luY2x1ZGUvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnQVBJIENvZGVjMiBBUEknCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiAnL2NvZGVjMi92bmRrLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1ZOREsgUGxhdGZvcm0gcHJvdmlkZWQgZ2x1ZScKKyAgICAgICAgZWxpZiAnL2NvZGVjMi90ZXN0cy8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdUZXN0cyBVbml0IHRlc3RzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSAnUmFuZG9tIE1pc2MuIHNhbmRib3gnCisKKyAgICAgICAgcHJpbnQoJyN1bmRlZiBfX0FQUExFX18nKQorCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaWYgcmUubWF0Y2gocidebmFtZXNwYWNlIGFuZHJvaWQgeycsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gXGFkZHRvZ3JvdXAge30nLmZvcm1hdChncm91cCkpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gQHsnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInXn0gKy8vICtuYW1lc3BhY2UnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAfScpCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorCitQID0gQXV0b0dyb3VwKCkKK2ZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3J0JykgYXMgaW5wdXQ6CisgICAgICAgIFAucHJvY2VzcyhpbnB1dCwgcGF0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYmVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnCkBAIC0wLDAgKzEsMjQ0NiBAQAorIyBEb3h5ZmlsZSAxLjguMTEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBDb2RlYzIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBhbiBpY29uIHRoYXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQorIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5CisjIHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IG91dC90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyL2FwaQorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQorIyBVKzMwNDQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYSBuZXcKKyMgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZSBwYXJ0CisjIG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgSWYgb25lIGFkZHMgYSBzdHJ1Y3Qgb3IgY2xhc3MgdG8gYSBncm91cCBhbmQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbiBhbHNvCisjIGFueSBuZXN0ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFkZGVkIHRvIHRoZSBzYW1lIGdyb3VwLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCisjIGlzIGRpc2FibGVkIGFuZCBvbmUgaGFzIHRvIGFkZCBuZXN0ZWQgY29tcG91bmRzIGV4cGxpY2l0bHkgdmlhIFxpbmdyb3VwLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dST1VQX05FU1RFRF9DT01QT1VORFMgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLAorIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gSWYgc2V0IHRvIFlFUywgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLCBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PLCB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbgorIyBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTywgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTywgdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0NPTVBPVU5EX1JFRkVSRU5DRSB0YWcgaXMgc2V0IHRvIE5PIChkZWZhdWx0KSB0aGVuIGRveHlnZW4gd2lsbAorIyBhcHBlbmQgYWRkaXRpb25hbCB0ZXh0IHRvIGEgcGFnZSdzIHRpdGxlLCBzdWNoIGFzIENsYXNzIFJlZmVyZW5jZS4gSWYgc2V0IHRvCisjIFlFUyB0aGUgY29tcG91bmQgcmVmZXJlbmNlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfQ09NUE9VTkRfUkVGRVJFTkNFPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0dST1VQRURfTUVNQl9JTkMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgYWRkIGZvciBlYWNoCisjIGdyb3VwZWQgbWVtYmVyIGFuIGluY2x1ZGUgc3RhdGVtZW50IHRvIHRoZSBkb2N1bWVudGF0aW9uLCB0ZWxsaW5nIHRoZSByZWFkZXIKKyMgd2hpY2ggZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSB0aGUgbWVtYmVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRvZG8KKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdGVzdAorIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSBJTlRFUk5BTAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCisjIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCisjIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyByZWFkIGJ5IGRveHlnZW4uCisjCisjIElmIGxlZnQgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLAorIyAqLmMrKywgKi5qYXZhLCAqLmlpLCAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLAorIyAqLmhoLCAqLmh4eCwgKi5ocHAsICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsCisjICoubSwgKi5tYXJrZG93biwgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICoucHl3LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsCisjICoudmhkLCAqLnZoZGwsICoudWNmLCAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IEMyKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouaAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gLl8qCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHByb3Blcmx5IHByb2Nlc3NlZCBieSBkb3h5Z2VuLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGdlbmVyYXRlZCB3aXRoIHRoZSAtRHVzZS1saWJjbGFuZz1PTiBvcHRpb24gZm9yIENNYWtlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gLXN0ZD1jKysxNAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIFlFUyBjYW4gaGVscCB0byBzaG93IHdoZW4gZG94eWdlbiB3YXMgbGFzdCBydW4gYW5kIHRodXMgaWYgdGhlCisjIGRvY3VtZW50YXRpb24gaXMgdXAgdG8gZGF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHksCisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZAorIyAoWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGUgc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgSWYgdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlLXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm9ycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlIEVYVEVSTkFMX1NFQVJDSAorIyBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvciBzZWFyY2hpbmcgYW5kCisjIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkIHRoZSBpbmRleGluZworIyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUgdGhlIHNlY3Rpb24KKyMgIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQganVzdAorIyBieSBpdHMgbmFtZSBvciB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBhcyB0byBiZSB1c2VkIHdpdGggdGhlIExhVGVYCisjIFx1c2VwYWNrYWdlIGNvbW1hbmQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5IDoKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMgb3IgRVhUUkFfUEFDS0FHRVM9e3RpbWVzfQorIyBUbyB1c2UgdGhlIG9wdGlvbiBpbnRsaW1pdHMgd2l0aCB0aGUgYW1zbWF0aCBwYWNrYWdlIHlvdSBjYW4gc3BlY2lmeToKKyMgRVhUUkFfUEFDS0FHRVM9W2ludGxpbWl0c117YW1zbWF0aH0KKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIsCisjICRwcm9qZWN0YnJpZWYsICRwcm9qZWN0bG9nby4gRG94eWdlbiB3aWxsIHJlcGxhY2UgJHRpdGxlIHdpdGggdGhlIGVtcHR5CisjIHN0cmluZywgZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHRoZSB1c2VyIGlzIHJlZmVycmVkCisjIHRvIEhUTUxfSEVBREVSLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIExhVGVYIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzIGNyZWF0ZWQKKyMgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIERveHlnZW4KKyMgd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9TVFlMRVNIRUVUID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMgSWYgdGhlIFJURl9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZSBjb2RlCisjIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgUlRGIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NPVVJDRV9DT0RFICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIFRoZSBNQU5fU1VCRElSIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCB3aXRoaW4KKyMgTUFOX09VVFBVVCBpbiB3aGljaCB0aGUgbWFuIHBhZ2VzIGFyZSBwbGFjZWQuIElmIGRlZmF1bHRzIHRvIG1hbiBmb2xsb3dlZCBieQorIyBNQU5fRVhURU5TSU9OIHdpdGggdGhlIGluaXRpYWwgLiByZW1vdmVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9TVUJESVIgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8sIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IC9Wb2x1bWVzL0EvYW9zcC9wcmVidWlsdHMvY2xhbmcvZGFyd2luLXg4Ni9ob3N0LzMuNi9saWIvY2xhbmcvMy42L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9leHRlcm5hbC9saWJjeHgvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm02NCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2d0ZXN0CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19BUFBMRV9fPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19BTkRST0lEX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRDo9MSBcCisJCQkgX191bnVzZWQ9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IERFRklORV9GTEVYSUJMRV9NRVRIT0RTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbCBncmFwaCBjYW4gYmUKKyMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbGVyIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZXJncmFwaC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzZWUgdGhlIHNlY3Rpb24KKyMgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRvdCB0b29sIChHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pKS4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmLCBzdmcsIHBuZzpnZCwgcG5nOmdkOmdkLCBwbmc6Y2Fpcm8sCisjIHBuZzpjYWlybzpnZCwgcG5nOmNhaXJvOmNhaXJvLCBwbmc6Y2Fpcm86Z2RpcGx1cywgcG5nOmdkaXBsdXMgYW5kCisjIHBuZzpnZGlwbHVzOmdkaXBsdXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIHNwZWNpZmllZCBwYXRocyBhcmUgc2VhcmNoZWQgZm9yIGZpbGVzIHNwZWNpZmllZCBieQorIyB0aGUgIWluY2x1ZGUgc3RhdGVtZW50IGluIGEgcGxhbnR1bWwgYmxvY2suCisKK1BMQU5UVU1MX0lOQ0xVREVfUEFUSCAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIHRvIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY29tcG9uZW50X3dyYXBwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkNvbXBvbmVudFdyYXBwZXIuY3BwIiwKKyAgICAgICAgIlNpbXBsZU1ldGhvZFN0YXRlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWY4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQ29tcG9uZW50V3JhcHBlciIKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK2MyX3N0YXR1c190IFdyYXBTaW1wbGVNZXRob2QoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qodm9pZCk+IG9wLCBjb25zdCBTaW1wbGVNZXRob2RTdGF0ZSAmc3RhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBDMl9PSzsKKyAgICBzd2l0Y2ggKHN0YXRlLmdldE1vZGUoKSkgeworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpFWEVDVVRFOgorICAgICAgICAgICAgcmVzdWx0ID0gb3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpOT19PUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpIQU5HOgorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXN0YXRlLm92ZXJyaWRlUmVzdWx0KCZyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMkNvbXBvbmVudFdyYXBwZXI6OkluamVjdGVyOjpJbmplY3RlcihDMkNvbXBvbmVudFdyYXBwZXIgKnRoaXopIDogbVRoaXoodGhpeikge30KKworU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIEMyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIoJm1UaGl6LT5tU3RhcnRTdGF0ZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Okxpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIG1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgIG1MaXN0ZW5lci0+b25UcmlwcGVkX25iKGNvbXBvbmVudCxzZXR0aW5nUmVzdWx0KTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvbkVycm9yX25iKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgIG1MaXN0ZW5lci0+b25FcnJvcl9uYihjb21wb25lbnQsIGVycm9yQ29kZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6QzJDb21wb25lbnRXcmFwcGVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKSA6IG1Db21wKGNvbXApIHt9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1MaXN0ZW5lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGlzdGVuZXI+KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gbUNvbXAtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgbWF5QmxvY2spOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5xdWV1ZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5hbm5vdW5jZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6Zmx1c2hfc20oCisgICAgICAgIEMyQ29tcG9uZW50OjpmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICByZXR1cm4gbUNvbXAtPmZsdXNoX3NtKG1vZGUsIGZsdXNoZWRXb3JrKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpkcmFpbl9uYihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbUNvbXAtPmRyYWluX25iKG1vZGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBXcmFwU2ltcGxlTWV0aG9kKFt0aGlzXSB7IHJldHVybiBtQ29tcC0+c3RhcnQoKTsgfSwgbVN0YXJ0U3RhdGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1Db21wLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVzZXQoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZWxlYXNlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gQzJDb21wb25lbnRXcmFwcGVyOjppbnRmKCl7CisgICAgcmV0dXJuIG1Db21wLT5pbnRmKCk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjppbmplY3QoKSB7CisgICAgcmV0dXJuIEluamVjdGVyKHRoaXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKyNkZWZpbmUgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ3JlYXRlcyBhIFdyYXBwZXIgYXJvdW5kIHRoZSBjbGFzcyBDMkNvbXBvbmVudCBhbmQgaXRzIG1ldGhvZHMuIFRoZSB3cmFwcGVyIGlzIHVzZWQgdG8KKyAqIHNpbXVsYXRlIGVycm9ycyBpbiB0aGUgYW5kcm9pZCBtZWRpYSBjb21wb25lbnRzIGJ5IGZhdWx0IGluamVjdGlvbiB0ZWNobmlxdWUuCisgKiBUaGlzIGlzIGRvbmUgdG8gY2hlY2sgaG93IHRoZSBmcmFtZXdvcmsgaGFuZGxlcyB0aGUgZXJyb3Igc2l0dWF0aW9uLgorICovCitjbGFzcyBDMkNvbXBvbmVudFdyYXBwZXIKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEMyQ29tcG9uZW50V3JhcHBlcj4geworcHVibGljOgorICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeik7CisKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIHN0YXJ0KCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQzJDb21wb25lbnRXcmFwcGVyICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgbGlzdGVuZXIgY2xhc3MgaW5zaWRlIEMyQ29tcG9uZW50IGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBMaXN0ZW5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpOworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworCisgICAgZXhwbGljaXQgQzJDb21wb25lbnRXcmFwcGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50V3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgSW5qZWN0ZXIgaW5qZWN0KCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcDsKKworICAgIFNpbXBsZU1ldGhvZFN0YXRlIG1TdGFydFN0YXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEMyX0NPTVBPTkVOVF9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlkNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlTWV0aG9kU3RhdGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiU2ltcGxlTWV0aG9kU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OkluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KSA6IG1UaGl6KHRoaXopIHt9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpoYW5nKCkgeworICAgIG1UaGl6LT5tTW9kZSA9IEhBTkc7Cit9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlKSB7CisgICAgbVRoaXotPm1Nb2RlID0gZXhlY3V0ZSA/IEVYRUNVVEUgOiBOT19PUDsKKyAgICBtVGhpei0+bU92ZXJyaWRlID0gdHJ1ZTsKKyAgICBtVGhpei0+bVJlc3VsdE92ZXJyaWRlID0gZXJyOworfQorCitTaW1wbGVNZXRob2RTdGF0ZTo6U2ltcGxlTWV0aG9kU3RhdGUoKQorICAgIDogbU1vZGUoRVhFQ1VURSksIG1PdmVycmlkZShmYWxzZSksIG1SZXN1bHRPdmVycmlkZShDMl9PSykge30KKworU2ltcGxlTWV0aG9kU3RhdGU6Ok1vZGUgU2ltcGxlTWV0aG9kU3RhdGU6OmdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nb2RlOworfQorCitib29sIFNpbXBsZU1ldGhvZFN0YXRlOjpvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKCFtT3ZlcnJpZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcmVzdWx0ID0gbVJlc3VsdE92ZXJyaWRlOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX01FVEhPRF9TVEFURV9IXworI2RlZmluZSBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RhdGUgZm9yIGEgc2ltcGxlIG1ldGhvZCB3aGljaCByZXR1cm5zIGMyX3N0YXR1c190IGFuZCB0YWtlcyBubyBwYXJhbWV0ZXJzLgorICovCitjbGFzcyBTaW1wbGVNZXRob2RTdGF0ZSB7CitwdWJsaWM6CisgICAgZW51bSBNb2RlIHsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICBFWEVDVVRFLAorICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZworICAgICAgICBOT19PUCwKKyAgICAgICAgLy8gSGFuZzsgbmV2ZXIgcmV0dXJuCisgICAgICAgIEhBTkcsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluamVjdGVyIGNsYXNzIHRoYXQgbW9kaWZpZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZyB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZhaWwgdGhlIG9wZXJhdGlvbiB3aXRoIGdpdmVuIHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJvciBjb2RlIHRvIHJlcGxhY2UgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGV4ZWN1dGUgICB3aGV0aGVyIHRoZSB3cmFwcGVyIHNob3VsZCBleGVjdXRlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmFpbChjMl9zdGF0dXNfdCBlcnIsIGJvb2wgZXhlY3V0ZSA9IGZhbHNlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNpbXBsZU1ldGhvZFN0YXRlICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBleGVjdXRpb24gbW9kZS4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBpZiBjb25maWd1cmVkIHNvLgorICAgICAqLworICAgIGJvb2wgb3ZlcnJpZGVSZXN1bHQoYzJfc3RhdHVzX3QgKnJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1PdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBtUmVzdWx0T3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU0lNUExFX01FVEhPRF9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI5NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OSBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyLWhpZGwtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiQ29tcG9uZW50SW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZS5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3M2I1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIENvbXBvbmVudExpc3RlbmVyIHdyYXBwZXIKK3N0cnVjdCBDb21wb25lbnQ6Okxpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisKKyAgICBMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBjb21wb25lbnQpIDoKKyAgICAgICAgbUNvbXBvbmVudChjb21wb25lbnQpLAorICAgICAgICBtTGlzdGVuZXIoY29tcG9uZW50LT5tTGlzdGVuZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbkVycm9yKFN0YXR1czo6T0ssIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uRXJyb3JfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IHNldHRpbmdSZXN1bHRzKGMyc2V0dGluZ1Jlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmMycmVzdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYzJzZXR0aW5nUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZzZXR0aW5nUmVzdWx0c1tpeCsrXSwgKmMycmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5yZXNpemUoaXgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uVHJpcHBlZChzZXR0aW5nUmVzdWx0cyk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworCisgICAgICAgICAgICBzcDxDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9IG1Db21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgY29ycnVwdGVkIHdvcmsgaXRlbXMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25Xb3JrRG9uZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCisvLyBDb21wb25lbnQ6OlNpbmsKK3N0cnVjdCBDb21wb25lbnQ6OlNpbmsgOiBwdWJsaWMgSUlucHV0U2luayB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxJQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50LT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKKyAgICB9CisKKyAgICBTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpOworICAgIHZpcnR1YWwgflNpbmsoKSBvdmVycmlkZTsKKworICAgIC8vIFByb2Nlc3Mtd2lkZSBtYXA6IENvbXBvbmVudDo6U2luayAtPiBDMkNvbXBvbmVudC4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBzU2luazJDb21wb25lbnRNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8SUlucHV0U2luayosIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBzU2luazJDb21wb25lbnQ7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luayk7Cit9OworCitzdGQ6Om11dGV4CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50TXV0ZXh7fTsKK3N0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4KKyAgICAgICAgQ29tcG9uZW50OjpTaW5rOjpzU2luazJDb21wb25lbnR7fTsKKworQ29tcG9uZW50OjpTaW5rOjpTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpCisgICAgICAgIDogbUNvbXBvbmVudHtjb21wb25lbnR9LAorICAgICAgICAgIG1Db25maWd1cmFibGV7WyZjb21wb25lbnRdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHJldDEgPSBjb21wb25lbnQtPmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDEuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGNvbXBvbmVudCdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiByZXQyID0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4ocmV0MSktPgorICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGludGVyZmFjZSdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+PihyZXQyKTsKKyAgICAgICAgICB9KCl9IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVtcGxhY2UodGhpcywgY29tcG9uZW50LT5tQ29tcG9uZW50KTsKK30KKworQ29tcG9uZW50OjpTaW5rOjp+U2luaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVyYXNlKHRoaXMpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6U2luazo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBhdXRvIGkgPSBzU2luazJDb21wb25lbnQuZmluZChzaW5rLmdldCgpKTsKKyAgICBpZiAoaSA9PSBzU2luazJDb21wb25lbnQuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBpLT5zZWNvbmQubG9jaygpOworfQorCisvLyBDb21wb25lbnQKK0NvbXBvbmVudDo6Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpCisgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgbUludGVyZmFjZXtuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGNvbXBvbmVudC0+aW50ZigpLCBzdG9yZS5nZXQoKSl9LAorICAgICAgICBtTGlzdGVuZXJ7bGlzdGVuZXJ9LAorICAgICAgICBtU3RvcmV7c3RvcmV9LAorICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntjbGllbnRQb29sTWFuYWdlcn0geworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICAvLyBUT0RPOiBXZSBjb3VsZCBjYWNoZSB0aGlzIHBlciBjb21wb25lbnQvaW50ZXJmYWNlIHR5cGUKKyAgICBtSW5pdCA9IG1JbnRlcmZhY2UtPnN0YXR1cygpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnQ6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrczsKKworICAgIGlmICghb2JqY3B5KCZjMndvcmtzLCB3b3JrQnVuZGxlKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgaW5wdXQgYnVmZmVycy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5xdWV1ZV9uYigmYzJ3b3JrcykpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtQ29tcG9uZW50LT5mbHVzaF9zbSgKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsCisgICAgICAgICAgICAmYzJmbHVzaGVkV29ya3MpOworCisgICAgLy8gVW5yZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMmZsdXNoZWRXb3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgV29ya0J1bmRsZSBmbHVzaGVkV29ya0J1bmRsZTsKKyAgICBTdGF0dXMgcmVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjMnJlcyk7CisgICAgaWYgKGMycmVzID09IEMyX09LKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZmbHVzaGVkV29ya0J1bmRsZSwgYzJmbHVzaGVkV29ya3MsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHJlcywgZmx1c2hlZFdvcmtCdW5kbGUpOworICAgIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZHJhaW4oYm9vbCB3aXRoRW9zKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+ZHJhaW5fbmIod2l0aEVvcyA/CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TIDoKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfTk9fRU9TKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgIEdldENvZGVjMkJsb2NrUG9vbChibG9ja1Bvb2xJZCwgbUNvbXBvbmVudCwgJnBvb2wpOworICAgIGlmIChwb29sICYmIHBvb2wtPmdldEFsbG9jYXRvcklkKCkgPT0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4gYnFQb29sID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4ocG9vbCk7CisgICAgICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6Ok9uUmVuZGVyQ2FsbGJhY2sgY2IgPQorICAgICAgICAgICAgW3RoaXNdKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBiYXRjaCB0aGlzCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lPiByZW5kZXJlZDsKKyAgICAgICAgICAgICAgICByZW5kZXJlZC5yZXNpemUoMSk7CisgICAgICAgICAgICAgICAgcmVuZGVyZWRbMF0gPSB7IHByb2R1Y2VyLCBzbG90LCBuc2VjcyB9OworICAgICAgICAgICAgICAgICh2b2lkKW1MaXN0ZW5lci0+b25GcmFtZXNSZW5kZXJlZChyZW5kZXJlZCkuaXNPaygpOworICAgICAgICB9OworICAgICAgICBpZiAoYnFQb29sKSB7CisgICAgICAgICAgICBicVBvb2wtPnNldFJlbmRlckNhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgIGJxUG9vbC0+Y29uZmlndXJlUHJvZHVjZXIoc3VyZmFjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgY29ubmVjdFRvSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2luaz4gc2luazsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaW5rTXV0ZXgpOworICAgICAgICBpZiAoIW1TaW5rKSB7CisgICAgICAgICAgICBtU2luayA9IG5ldyBTaW5rKHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2luayA9IG1TaW5rOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzOworICAgIHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBpbnB1dFN1cmZhY2UtPmNvbm5lY3Qoc2luaywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmY29ubmVjdGlvbl0oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAodm9pZClwcm9kdWNlcjsKKyAgICAodm9pZClzb3VyY2U7CisgICAgKHZvaWQpX2hpZGxfY2I7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBCbG9ja1Bvb2xJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQmxvY2tQb29sSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmeworICAgICAgICAgICAgICAgICJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgKHBvb2wgPyBzdGQ6OnRvX3N0cmluZyhwb29sLT5nZXRMb2NhbElkKCkpIDogIm51bGwiKSwKKyAgICAgICAgICAgICAgICAwfSwKKyAgICAgICAgICAgIG1Qb29se3Bvb2x9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIGluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpaW5kaWNlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmllbGRzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJsb2NrUG9vbCkgeworICAgICAgICBtQmxvY2tQb29sc011dGV4LmxvY2soKTsKKyAgICAgICAgbUJsb2NrUG9vbHMuZW1wbGFjZShibG9ja1Bvb2wtPmdldExvY2FsSWQoKSwgYmxvY2tQb29sKTsKKyAgICAgICAgbUJsb2NrUG9vbHNNdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpLAorICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAwLAorICAgICAgICAgICAgbmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmxvY2tQb29sSW50Zj4oYmxvY2tQb29sKSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgIHJldHVybiBtQmxvY2tQb29scy5lcmFzZShibG9ja1Bvb2xJZCkgPT0gMSA/CisgICAgICAgICAgICBTdGF0dXM6Ok9LIDogU3RhdHVzOjpDT1JSVVBURUQ7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RhcnQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdG9wKCkpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlc2V0KCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gQ29tcG9uZW50OjpnZXRJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHNwPElDb21wb25lbnRJbnRlcmZhY2U+KG1JbnRlcmZhY2UpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHJldHVybiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNTM1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRJbnRlcmZhY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmFibGVDMkludGYgYmFzZWQgb24gQzJDb21wb25lbnRJbnRlcmZhY2UKK3N0cnVjdCBDb21wSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIENvbXBJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRme2ludGYtPmdldE5hbWUoKSwgaW50Zi0+Z2V0SWQoKX0sCisgICAgICAgIG1JbnRme2ludGZ9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIENvbXBvbmVudEludGVyZmFjZQorQ29tcG9uZW50SW50ZXJmYWNlOjpDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYsCisgICAgICAgIENvbXBvbmVudFN0b3JlKiBzdG9yZSkKKyAgICAgIDogbUludGVyZmFjZXtpbnRmfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGludGYpKX0geworICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZSk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudEludGVyZmFjZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRJbnRlcmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ZmFhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb247CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IFN0b3JlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIFN0b3JlSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRme3N0b3JlID8gc3RvcmUtPmdldE5hbWUoKSA6ICIiLCAwfSwKKyAgICAgICAgICAgIG1TdG9yZXtzdG9yZX0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgcGFyYW1zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+Y29uZmlnX3NtKHBhcmFtcywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIGZpZWxkcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKGZpZWxkcyk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6Om1ha2VfdW5pcXVlPFN0b3JlSW50Zj4oc3RvcmUpKX0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0geworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RvcmUpOworCisgICAgLy8gUmV0cmlldmUgc3RydWN0IGRlc2NyaXB0b3JzCisgICAgbVBhcmFtUmVmbGVjdG9yID0gbVN0b3JlLT5nZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdCh0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcG9ydENvbXBvbmVudEJpcnRoKGNvbXBvbmVudC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+aW5pdExpc3RlbmVyKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzKSwgaW50ZXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBjMnRyYWl0cyA9CisgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisgICAgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+IHRyYWl0cyhjMnRyYWl0cy5zaXplKCkpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmMydHJhaXQgOiBjMnRyYWl0cykgeworICAgICAgICBpZiAoYzJ0cmFpdCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmdHJhaXRzW2l4XSwgKmMydHJhaXQpKSB7CisgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhaXRzLnJlc2l6ZShpeCk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdHJhaXRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Q09SUlVQVEVELCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR2JwOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR2JwPiBCMkhHYnA7CisgICAgc3A8SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPSBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBuZXcgQjJIR2JwKHNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgIHNvdXJjZSk7CisgICAgX2hpZGxfY2IoaW5wdXRTdXJmYWNlID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Tk9fTUVNT1JZLAorICAgICAgICAgICAgIGlucHV0U3VyZmFjZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDb21wb25lbnRTdG9yZTo6b25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIC8vIGludmFsaWRhdGUgdW5zdXBwb3J0ZWQgc3RydWN0IGRlc2NyaXB0b3JzIGlmIGEgbmV3IGludGVyZmFjZSBpcyBsb2FkZWQgYXMgaXQgbWF5IGhhdmUKKyAgICAvLyBleHBvc2VkIG5ldyBkZXNjcmlwdG9ycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICBpZiAoIW1Mb2FkZWRJbnRlcmZhY2VzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvYWRlZEludGVyZmFjZXMuZW1wbGFjZShpbnRmLT5nZXROYW1lKCkpOworICAgIH0KK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgeworICAgIGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKGluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gMDsgc3JjSXggPCBpbmRpY2VzLnNpemUoKTsgKytzcmNJeCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoaW5kaWNlc1tzcmNJeF0pLmNvcmVJbmRleCgpOworICAgICAgICBjb25zdCBhdXRvIGl0ZW0gPSBtU3RydWN0RGVzY3JpcHRvcnMuZmluZChjb3JlSW5kZXgpOworICAgICAgICBpZiAoaXRlbSA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgY2FjaGUsIGFuZCBub3Qga25vd24gdG8gYmUgdW5zdXBwb3J0ZWQsIHF1ZXJ5IGxvY2FsIHJlZmxlY3RvcgorICAgICAgICAgICAgaWYgKCFtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jb3VudChjb3JlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuZW1wbGFjZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4XSwgKnN0cnVjdERlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2RzdEl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqaXRlbS0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50U3RvcmU6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gQ2FsbGVkIGZyb20gY3JlYXRlQ29tcG9uZW50KCkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIGBjb21wb25lbnRgLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBDb21wb25lbnRTdGF0dXMgY29tcG9uZW50U3RhdHVzOworICAgIGNvbXBvbmVudFN0YXR1cy5jMkNvbXBvbmVudCA9IGNvbXBvbmVudC0+bUNvbXBvbmVudDsKKyAgICBjb21wb25lbnRTdGF0dXMuYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZW1wbGFjZShjb21wb25lbnQsIGNvbXBvbmVudFN0YXR1cyk7Cit9CisKKy8vIENhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGVzdHJ1Y3RvciBvZiBgY29tcG9uZW50YC4gTm8gdmlydHVhbCBmdW5jdGlvbiBjYWxscworLy8gYXJlIG1hZGUgb24gYGNvbXBvbmVudGAgaGVyZS4KK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICBtQ29tcG9uZW50Um9zdGVyLmVyYXNlKGNvbXBvbmVudCk7Cit9CisKKy8vIER1bXBzIGNvbXBvbmVudCB0cmFpdHMuCitzdGQ6Om9zdHJlYW0mIENvbXBvbmVudFN0b3JlOjpkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wKSB7CisKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICAgIjsKKworICAgIG91dCA8PCBpbmRlbnQgPDwgIm5hbWU6ICIgPDwgY29tcC0+bmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiZG9tYWluOiAiIDw8IGNvbXAtPmRvbWFpbiA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAia2luZDogIiA8PCBjb21wLT5raW5kIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJyYW5rOiAiIDw8IGNvbXAtPnJhbmsgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIm1lZGlhVHlwZTogIiA8PCBjb21wLT5tZWRpYVR5cGUgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImFsaWFzZXM6IjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFsaWFzIDogY29tcC0+YWxpYXNlcykgeworICAgICAgICBvdXQgPDwgJyAnIDw8IGFsaWFzOworICAgIH0KKyAgICBvdXQgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHN0YXR1cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgLy8gUHJpbnQgYmlydGggdGltZS4KKyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1zID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgIGNvbXBTdGF0dXMuYmlydGhUaW1lLnRpbWVfc2luY2VfZXBvY2goKSk7CisgICAgc3RkOjp0aW1lX3QgYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KAorICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUpOworICAgIHN0ZDo6dG0gdG0gPSAqc3RkOjpsb2NhbHRpbWUoJmJpcnRoVGltZSk7CisgICAgb3V0IDw8IGluZGVudCA8PCAiQ3JlYXRpb24gdGltZTogIgorICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bSwgIiVZLSVtLSVkICVIOiVNOiVTIikKKyAgICAgICAgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtcy5jb3VudCgpICUgMTAwMAorICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBQcmludCBuYW1lIGFuZCBpZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wU3RhdHVzLmMyQ29tcG9uZW50LT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gY29tcG9uZW50IC0tIG51bGwgaW50ZXJmYWNlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQgPDwgIk5hbWU6ICIgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJJZDogIiA8PCBpbnRmLT5nZXRJZCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1Db21wb25lbnRSb3N0ZXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUNvbXBvbmVudFJvc3RlcikgeworICAgICAgICAgICAgICAgICAgICBkdW1wKG91dCwgcGFpci5zZWNvbmQpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIkVuZCBvZiBkdW1wIC0tIEMyQ29tcG9uZW50U3RvcmU6ICIKKyAgICAgICAgICAgICAgICA8PCBtU3RvcmUtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQob3V0LnN0cigpLCBoLT5kYXRhWzBdKSkgeworICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSB3cml0ZSgpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcgc3VjY2VlZGVkIjsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29uZmlndXJhYmxlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworQ2FjaGVkQ29uZmlndXJhYmxlOjpDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50ZikKKyAgICAgIDogbUludGZ7c3RkOjptb3ZlKGludGYpfSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx1aW50MzJfdD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpnZXRJZCgpIHsKKyAgICByZXR1cm4gbUludGYtPmdldElkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJnBhcmFtcywgYzJoZWFwUGFyYW1zKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIGludmFsaWQgb3V0cHV0IHBhcmFtcy4iOworICAgIH0KKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKSwgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmYzJwYXJhbXMsIGluUGFyYW1zQ29weSkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBpbnB1dCBwYXJhbXMuIjsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4oKSwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gVE9ETzogY2hlY2sgaWYgYmxvYiB3YXMgaW52YWxpZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMmZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgIGMycGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmMyZmFpbHVyZXMpOworICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGZhaWx1cmVzKGMyZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIGMycmVzdWx0IDogYzJmYWlsdXJlcykgeworICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZmFpbHVyZXNbaXhdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICsraXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGludmFsaWQgc2V0dGluZyByZXN1bHRzLiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsdXJlcy5yZXNpemUoaXgpOworICAgIH0KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBvdXRQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIGZhaWx1cmVzLCBvdXRQYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiIF9oaWRsX2NiKSB7CisgICAgQzJMaW5lYXJSYW5nZSByZXF1ZXN0ID0gQzJMaW5lYXJDYXBhY2l0eShtU3VwcG9ydGVkUGFyYW1zLnNpemUoKSkucmFuZ2UoCisgICAgICAgICAgICBzdGFydCwgY291bnQpOworICAgIGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4gcGFyYW1zKHJlcXVlc3Quc2l6ZSgpKTsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gcmVxdWVzdC5vZmZzZXQoKTsgc3JjSXggPCByZXF1ZXN0LmVuZE9mZnNldCgpOyArK3NyY0l4KSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkUGFyYW1zW3NyY0l4XSkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmcGFyYW1zW2RzdEl4XSwgKm1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJhbXMucmVzaXplKGRzdEl4KTsKKyAgICBfaGlkbF9jYihyZXMsIHBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGMyZmllbGRzOworICAgIHsKKyAgICAgICAgLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IG9iamVjdHMgYXJlIHJlc3RyaWN0ZWQgaW4gdGhhdCBzb21lCisgICAgICAgIC8vIG1lbWJlcnMgYXJlIGNvbnN0LgorICAgICAgICAvLyBDMlBhcmFtRmllbGQgLSByZXF1aXJlZCBmb3IgaXRzIGNvbnN0cnVjdG9yIC0gaGFzIG5vIGNvbnN0cnVjdG9ycworICAgICAgICAvLyBmcm9tIGZpZWxkcy4gVXNlIEMyUGFyYW1JbnNwZWN0b3IuCisgICAgICAgIGZvciAoY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBpbkZpZWxkcykgeworICAgICAgICAgICAgYzJmaWVsZHMuZW1wbGFjZV9iYWNrKF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVQYXJhbUZpZWxkKAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQuc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnR5cGUgPT0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEUgPworICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFIDoKKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGMyZmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLKTsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiBvdXRGaWVsZHMoaW5GaWVsZHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZyZXN1bHQgOiBjMmZpZWxkcykgeworICAgICAgICBpZiAob2JqY3B5KCZvdXRGaWVsZHNbZHN0SXhdLCByZXN1bHQpKSB7CisgICAgICAgICAgICArK2RzdEl4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0RmllbGRzLnJlc2l6ZShkc3RJeCk7CisgICAgICAgICAgICBjMnJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBvdXRGaWVsZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyM2EwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dEJ1ZmZlck1hbmFnZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6cmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcik7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpzZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIklucHV0IGJ1ZmZlciBhdCBpbmRleCAiIDw8IGkgPDwgIiBpcyBudWxsLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wbGFjZSgKKyAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgIT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICAgICAgPSBmaW5kTGlzdGVuZXItPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBmaW5kTGlzdGVuZXJEID0gbURlYXRoTm90aWZpY2F0aW9ucy5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyRCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpKSB7CisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gZmluZExpc3RlbmVyRC0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCAtPSBidWZmZXJJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUmVtb3ZlIGxpc3RlbmVyIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZCBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMKKy8vIGFsbCBmcmFtZUluZGljZXMgYW5kIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywgaS5lLiwgd2hlbgorLy8gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgLS0gY2FsbGVkIHdpdGggIgorICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMgPQorICAgICAgICAgICAgICAgIGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBmb3IgKGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5iZWdpbigpOworICAgICAgICAgICAgICAgIGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpOworICAgICAgICAgICAgICAgICsrZmluZEZyYW1lSW5kZXgpIHsKKyAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChjb25zdCBUcmFja2VkQnVmZmVyJiBidWZmZXJJZCA6IGJ1ZmZlcklkcykgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gYnVmZmVySWQuYnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIobGlzdGVuZXIgQCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IGJ1ZmZlcklkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGJ1ZmZlcklkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGxpc3RlbmVyKTsKK30KKworLy8gU2V0IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9zZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuc3RvcmUoCisgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zLAorICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibnVsbCBhcmd1bWVudCAocyk6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhcmcgQCAweCIgPDwgc3RkOjpoZXggPDwgYXJnCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIiAtLSAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQoaWQubGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgPT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIChmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgZnJhbWUgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICBhdXRvIGZpbmRCdWZmZXJJZCA9IGJ1ZmZlcklkcy5maW5kKGlkKTsKKyAgICBpZiAoZmluZEJ1ZmZlcklkID09IGJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgPDwgImJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVySWRzLmVyYXNlKGZpbmRCdWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBtRGVhdGhOb3RpZmljYXRpb25zW2lkLmxpc3RlbmVyXTsKKyAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlc1tpZC5mcmFtZUluZGV4XS5lbXBsYWNlX2JhY2soaWQuYnVmZmVySW5kZXgpOworICAgICsrZGVhdGhOb3RpZmljYXRpb25zLmNvdW50OworICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC5ub3RpZnlfb25lKCk7Cit9CisKKy8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorLy8gUmV0dXJuIHRydWUgYW5kIHNldCB0aW1lVG9SZXRyeSB0byB0aGUgdGltZSBwb2ludCB0byB3YWl0IGZvciBiZWZvcmUKKy8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCitib29sIElucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcykgeworCisgICAgc3RydWN0IE5vdGlmaWNhdGlvbiB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+IGlucHV0QnVmZmVyczsKKyAgICAgICAgTm90aWZpY2F0aW9uKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGwsIHNpemVfdCBzKQorICAgICAgICAgICAgICA6IGxpc3RlbmVyKGwpLCBpbnB1dEJ1ZmZlcnMocykge30KKyAgICB9OworICAgIHN0ZDo6bGlzdDxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbnM7CisgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zID0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgICBib29sIHJldHJ5ID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAqdGltZVRvUmV0cnlOcyA9IG5vdGlmaWNhdGlvbkludGVydmFsTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOworICAgICAgICAgICAgICAgICp0aW1lVG9SZXRyeU5zID0gc3RkOjptaW4oKnRpbWVUb1JldHJ5TnMsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zIC0gdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMpOworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOb3RpZmljYXRpb25zIGZvciBsaXN0ZW5lciBAICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2lsbCBiZSBwb3N0cG9uZWQuIjsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0byB0aGlzCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBidXQgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMsIHRoZQorICAgICAgICAgICAgLy8gbGlzdGVuZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zLS0tdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBub3RpZmljYXRpb24gdGltZSBhbnltb3JlLgorICAgICAgICAgICAgaWYgKGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5lbXBsYWNlX2JhY2sobGlzdGVuZXIsIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCk7CisgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyPiAmaW5wdXRCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5iYWNrKCkuaW5wdXRCdWZmZXJzOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yIChzdGQ6OnBhaXI8Y29uc3QgdWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+JiBwIDoKKyAgICAgICAgICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gcC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzaXplX3QmIGJ1ZmZlckluZGV4IDogYnVmZmVySW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyICZpbnB1dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5wdXRCdWZmZXJzW2krK107CisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhciBkZWF0aE5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIHNldCByZXRyeSB0byB0cnVlCisgICAgICAgICAgICAvLyBzbyBwcm9jZXNzTm90aWZpY2F0aW9ucyB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi4gVGhpcyB3aWxsCisgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhhdCBhIGxpc3RlbmVyIHdpdGggbm8gcGVuZGluZyBub3RpZmljYXRpb25zIHdpbGwKKyAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGhhcyBwYXNzZWQuCisgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID0gMDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5sYXN0U2VudE5zID0gdGltZU5vd05zOworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmlucHV0QnVmZmVycykuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGlmIHRoZSBjbGllbnQgaGFzIGRpZWQuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBzZW5kIGRlYXRoIG5vdGlmaWNhdGlvbnMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG5vdGlmaWNhdGlvbi5saXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIH0gZWxzZSB7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbnB1dEJ1ZmZlckxvZzsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIgOgorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJMb2cgPDwgIiAoIiA8PCBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZGVhdGggbm90aWZpY2F0aW9ucyBzZW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIHRoZXNlIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgcGFpcnM6IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlucHV0QnVmZmVyTG9nLnN0cigpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAid2lsbCByZXRyeSBhZ2FpbiBpbiAiIDw8ICp0aW1lVG9SZXRyeU5zIDw8ICJucy4iOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibm8gcGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zLiI7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldHJ5OworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6bWFpbigpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlciBtYWluIC0tIHN0YXJ0ZWQuIjsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHdoaWxlIChwcm9jZXNzTm90aWZpY2F0aW9ucygmdGltZVRvUmV0cnlOcykpIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHRpbWVUb1JldHJ5TnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyOjpJbnB1dEJ1ZmZlck1hbmFnZXIoKQorICAgICAgOiBtTWFpblRocmVhZHsmSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluLCB0aGlzfSB7Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlciYgSW5wdXRCdWZmZXJNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyIGluc3RhbmNle307CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM0NGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIERlcml2ZWQgY2xhc3Mgb2YgQzJJbnRlcmZhY2VIZWxwZXIKK2NsYXNzIElucHV0U3VyZmFjZTo6SW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb25maWd1cmFibGVDMkludGYKK2NsYXNzIElucHV0U3VyZmFjZTo6Q29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZUludGYoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpJbnRlcmZhY2U+ICZpbnRmLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBDb25maWd1cmFibGVDMkludGYoImlucHV0LXN1cmZhY2UiLCAwKSwKKyAgICAgICAgICBtSW50ZihpbnRmKSwKKyAgICAgICAgICBtU291cmNlKHNvdXJjZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkNvbmZpZ3VyYWJsZUludGYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnkoe30sIGluZGljZXMsIG1heUJsb2NrLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUludGYtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gbUludGY7CisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK1JldHVybjxzcDxJbnB1dFN1cmZhY2U6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICByZXR1cm4gbVByb2R1Y2VyOworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IElucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAoIXNpbmspIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBDb21wb25lbnQ6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKKyAgICBpZiAoY29tcCkgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgY29tcCwgbVN0b3JlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgc2luaywgbVN0b3JlKTsKKyAgICB9CisgICAgaWYgKCFjb25uZWN0aW9uLT5pbml0KCkpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gRGVyaXZlZCBtZXRob2RzIGZyb20gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorCisvLyBDb25zdHJ1Y3RvciBpcyBleGNsdXNpdmUgdG8gQ29tcG9uZW50U3RvcmUuCitJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpCisgICAgICA6IG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1Qcm9kdWNlcntwcm9kdWNlcn0sCisgICAgICAgIG1Tb3VyY2V7c291cmNlfSwKKyAgICAgICAgbUludGZ7c3RkOjptYWtlX3NoYXJlZDxJbnRlcmZhY2U+KHJlZmxlY3Rvcil9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVJbnRmPigKKyAgICAgICAgICAgICAgICAgICAgbUludGYsIHNvdXJjZSkpfSB7CisKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTMyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZUNvbm5lY3Rpb24iCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworY29uc3RleHByIGludDMyX3Qga0J1ZmZlckNvdW50ID0gMTY7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkgeworICAgIH0KK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb21wb25lbnRXcmFwcGVyIGZvciB1c2Ugd2l0aAorLy8gR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKCkuCisvLworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwgOiBwdWJsaWMgQ29tcG9uZW50V3JhcHBlciB7CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBsb2NhbENvbXApCisgICAgICAgICAgOiBtU291cmNle3NvdXJjZX0sIG1Mb2NhbENvbXB7bG9jYWxDb21wfSwgbVNpbmt7fSwgbUZyYW1lSW5kZXh7MH0geworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBsb2NhbENvbXAtPmludGYoKTsKKyAgICAgICAgbVNpbmtOYW1lID0gaW50ZiA/IGludGYtPmdldE5hbWUoKSA6ICIiOworICAgIH0KKworICAgIEltcGwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKQorICAgICAgICAgIDogbVNvdXJjZXtzb3VyY2V9LCBtTG9jYWxDb21we30sIG1TaW5re3Npbmt9LCBtRnJhbWVJbmRleHswfSB7CisgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBzaW5rLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rIGlzIGRlYWQuIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2lua0NvbmZpZ3VyYWJsZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KTsKKyAgICAgICAgaWYgKCFtU2lua0NvbmZpZ3VyYWJsZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsgaXMgbm90IGNvbmZpZ3VyYWJsZS4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBoaWRsX3N0cmluZyBuYW1lOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtU2lua0NvbmZpZ3VyYWJsZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbJm5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsncyBjb25maWd1cmFibGUgaXMgZGVhZC4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNpbmtOYW1lID0gbmFtZS5jX3N0cigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZS0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGJvb2wgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR3JhcGhpY0J1ZmZlclNvdXJjZSBpbml0IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGVyciA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBxdWVyeUZyb21TaW5rKHsgJmlucHV0U2l6ZSwgJnVzYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBpZiAoYzJTdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBjYW5ub3QgcXVlcnkgaW5mb3JtYXRpb24gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjb21wb25lbnQgaW50ZXJmYWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoYzJTdGF0dXMpIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHByb3BlciBjb2xvciBhc3BlY3QgJiBkYXRhc3BhY2UKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKworICAgICAgICAvLyBUT0RPOiB1c2UgdGhlIHVzYWdlIHJlYWQgZnJvbSBpbnRmCisgICAgICAgIC8vIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgIC8vICAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpLgorICAgICAgICAvLyAgICAgICAgIGFzR3JhbGxvY1VzYWdlKCk7CisKKyAgICAgICAgdWludDMyX3QgZ3JhbGxvY1VzYWdlID0KKyAgICAgICAgICAgICAgICBtU2lua05hbWUuY29tcGFyZSgwLCAxMSwgImMyLmFuZHJvaWQuIikgPT0gMCA/CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDoKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR0JTIGNvbmZpZ3VyZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBlcnIgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1Tb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQ6IGZhaWxlZCB0byBwb3B1bGF0ZSBHQlMgc2xvdHMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU291cmNlLT5zdGFydCgpLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdCUyBmYWlsZWQgdG8gc3RhcnQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6UExBVEZPUk1fU1RBUlQgKyAxLCAgLy8gR1JBTExPQworICAgICAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoYzJlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhjMmVycikgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW1wbDo6c3VibWl0QnVmZmVyIC0tIGJ1ZmZlcklkID0gIiA8PCBidWZmZXJJZCA8PCAiLiI7CisgICAgICAgIC8vIFRPRE86IFVzZSBmZCB0byBjb25zdHJ1Y3QgZmVuY2UKKyAgICAgICAgKHZvaWQpZmVuY2VGZDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIEMySGFuZGxlKiBoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwgYnVmZmVyLT51c2FnZSwgYnVmZmVyLT5zdHJpZGUpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmZldGNoX2FkZCgKKyAgICAgICAgICAgICAgICAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyKAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSwKKyAgICAgICAgICAgICAgICBbYnVmZmVySWQsIHNvdXJjZSA9IG1Tb3VyY2VdKEMyQnVmZmVyKiBwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpc291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgLTEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCBidWZmZXJJZCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkltcGw6OnN1Ym1pdEVvcyAtLSBidWZmZXJJZCA9ICIgPDwgYnVmZmVySWQgPDwgIi4iOworICAgICAgICAodm9pZClidWZmZXJJZDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5mZXRjaF9hZGQoCisgICAgICAgICAgICAgICAgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworICAgIC8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwuCisgICAgLy8KKyAgICAvLyBUaGlzIGNsYXNzIGlzIGRlY2xhcmVkIGFzIGFuIGlubmVyIGNsYXNzIHNvIHRoYXQgaXQgd2lsbCBoYXZlIGFjY2VzcyB0bworICAgIC8vIGFsbCBJbXBsJ3MgbWVtYmVycy4KKyAgICBzdHJ1Y3QgQ29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgICAgICBzcDxJbXBsPiBtQ29ubmVjdGlvbjsKKyAgICAgICAgQ29uZmlndXJhYmxlSW50Zihjb25zdCBzcDxJbXBsPiYgY29ubmVjdGlvbikKKyAgICAgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7ImlucHV0LXN1cmZhY2UtY29ubmVjdGlvbiIsIDB9LAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ue2Nvbm5lY3Rpb259IHt9CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBxdWVyeUZyb21TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgICAgIGlmIChtTG9jYWxDb21wKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBtTG9jYWxDb21wLT5pbnRmKCk7CisgICAgICAgICAgICBpZiAoaW50ZikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobVNpbmspIDw8ICItLSBxdWVyeUZyb21TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisgICAgICAgIENIRUNLKG1TaW5rQ29uZmlndXJhYmxlKSA8PCAiLS0gcXVlcnlGcm9tU2luayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gc2luayBoYXMgbm8gY29uZmlndXJhYmxlLiI7CisKKyAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgICAgICB9CisgICAgICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgICAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1TaW5rQ29uZmlndXJhYmxlLT5xdWVyeSgKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoc3RhdHVzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBlcnJvciB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaSA8IHN0YWNrUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIHNraXBwZWQgKGluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gdXBkYXRlIGZhaWxlZCAoaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBzdGFjayBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVldWVUb1Npbmsoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICAgICAgaWYgKG1Mb2NhbENvbXApIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYWxDb21wLT5xdWV1ZV9uYihpdGVtcyk7CisgICAgICAgIH0KKworICAgICAgICBDSEVDSyhtU2luaykgPDwgIi0tIHF1ZXVlVG9TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gYmFkIGlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVNpbmstPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb1NpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhc1N0cmluZyhzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Mb2NhbENvbXA7CisgICAgc3A8SUlucHV0U2luaz4gbVNpbms7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbVNpbmtDb25maWd1cmFibGU7CisgICAgc3RkOjpzdHJpbmcgbVNpbmtOYW1lOworCisgICAgLy8gTmVlZGVkIGZvciBDb21wb25lbnRXcmFwcGVyIGltcGxlbWVudGF0aW9uCisgICAgc3RkOjptdXRleCBtQWxsb2NhdG9yTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworCit9OworCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIGNvbXApfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIHNpbmspfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUltcGxNdXRleCk7CisgICAgbUltcGwgPSBudWxscHRyOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjp+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIHsKKyAgICBtSW1wbCA9IG51bGxwdHI7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW1wbE11dGV4KTsKKyAgICByZXR1cm4gbUltcGwtPmluaXQoKTsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClwYXJhbXM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClpbmRpY2VzOworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKXBhcmFtczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWZpZWxkczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM5NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIElDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBnZXRJbnRlcmZhY2UoKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgYSBDMkNvbXBvbmVudCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzaW5rIGlmIHRoZSBzaW5rIGlzIGluZGVlZAorICAgIC8vIGEgbG9jYWwgY29tcG9uZW50LiBSZXR1cm5zIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IElucHV0U3VyZmFjZTo6Y29ubmVjdCgpLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKKworcHJvdGVjdGVkOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdHJ1Y3QgU2luazsKKyAgICBzdGQ6Om11dGV4IG1TaW5rTXV0ZXg7CisgICAgc3A8U2luaz4gbVNpbms7CisKKyAgICBzdGQ6Om11dGV4IG1CbG9ja1Bvb2xzTXV0ZXg7CisgICAgLy8gVGhpcyBtYXAga2VlcHMgQzJCbG9ja1Bvb2wgb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUJsb2NrUG9vbCgpCisgICAgLy8gYWxpdmUuIFRoZXNlIEMyQmxvY2tQb29sIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQgYnkgY2FsbGluZworICAgIC8vIGRlc3Ryb3lCbG9ja1Bvb2woKSwgcmVzZXQoKSBvciByZWxlYXNlKCksIG9yIGJ5IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudC4KKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBJQ29tcG9uZW50SW50ZXJmYWNlIHsKKyAgICBDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICBDb21wb25lbnRTdG9yZSogc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIElDb21wb25lbnRTdG9yZSB7CisgICAgQ29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisgICAgdmlydHVhbCB+Q29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdCgpIHRvIHZhbGlkYXRlCisgICAgICogc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiBnZXRQb29sQ2xpZW50TWFuYWdlcigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRlYnVnKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICAvLyBEb2VzIGJvb2trZWVwaW5nIGZvciBhbiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnRTdG9yZSBrZWVwcyB0cmFjayBvZiBsaXZlIENvbXBvbmVudHMuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMkNvbXBvbmVudDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBiaXJ0aFRpbWU7CisgICAgfTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ29tcG9uZW50Um9zdGVyTXV0ZXg7CisgICAgc3RkOjptYXA8Q29tcG9uZW50KiwgQ29tcG9uZW50U3RhdHVzPiBtQ29tcG9uZW50Um9zdGVyOworCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIENvbXBvbmVudCBpcyBjcmVhdGVkLgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworICAgIC8vIENhbGxlZCBvbmx5IGZyb20gdGhlIGRlc3RydWN0b3Igb2YgQ29tcG9uZW50LgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworCisgICAgZnJpZW5kIENvbXBvbmVudDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGR1bXBpbmcuCisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCk7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cyk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTE4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCisvKioKKyAqIENvZGVjMiBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcXVlcnlpbmcgYW5kIGNvbmZpZ3VyaW5nCisgKiBmdW5jdGlvbnMsIGJ1dCBhY3Jvc3MgdGhlIFRyZWJsZSBib3VuZGFyeSwgdGhleSBzaGFyZSB0aGUgc2FtZSBISURMCisgKiBpbnRlcmZhY2UsIElDb25maWd1cmFibGUuCisgKgorICogQ29uZmlndXJhYmxlQzJJbnRmIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgYSBDb2RlYzIgb2JqZWN0IGNhbiBpbXBsZW1lbnQgdG8KKyAqIGVhc2lseSBleHBvc2UgYW4gSUNvbmZpZ3VyYWJsZSBpbnN0YW5jZS4gU2VlIENhY2hlZENvbmZpZ3VyYWJsZSBiZWxvdy4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdWludDMyX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5X3ZiIHNhbnMgc3RhY2sgcGFyYW1zICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OmNvbmZpZ192YiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5Db25maWd1cmFibGVDMkludGYoKSA9IGRlZmF1bHQ7CisKKyAgICBDb25maWd1cmFibGVDMkludGYoY29uc3QgQzJTdHJpbmcmIG5hbWUsIHVpbnQzMl90IGlkKQorICAgICAgICAgIDogbU5hbWV7bmFtZX0sIG1JZHtpZH0ge30KKworcHJvdGVjdGVkOgorICAgIEMyU3RyaW5nIG1OYW1lOyAvKiBjYWNoZWQgY29tcG9uZW50IG5hbWUgKi8KKyAgICB1aW50MzJfdCBtSWQ7Cit9OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJQ29uZmlndXJhYmxlIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcgb2YKKyAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gYSBzdXBwbGllZCBDb21wb25lbnRTdG9yZS4KKyAqCisgKiBDYWNoZWRDb25maWd1cmFibGUgZXNzZW50aWFsbHkgY29udmVydHMgYSBDb25maWd1cmFibGVDMkludGYgaW50byBISURMJ3MKKyAqIElDb25maWd1cmFibGUuIEEgQ29kZWMyIG9iamVjdCBnZW5lcmFsbHkgaW1wbGVtZW50cyBDb25maWd1cmFibGVDMkludGYgYW5kCisgKiBwYXNzZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBDYWNoZWRDb25maWd1cmFibGUuCisgKgorICogTm90ZSB0aGF0IGNhY2hpbmcgaGFwcGVucworICovCitzdHJ1Y3QgQ2FjaGVkQ29uZmlndXJhYmxlIDogcHVibGljIElDb25maWd1cmFibGUgeworICAgIENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiYmIGludGYpOworCisgICAgYzJfc3RhdHVzX3QgaW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbmZpZ3VyYWJsZQorCisgICAgdmlydHVhbCBSZXR1cm48dWludDMyX3Q+IGdldElkKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NTdkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLyoqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIKKyAqID09PT09PT09PT09PT09PT09PQorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBwcmVzZW50cyBhIHdheSB0byB0cmFjayBhbmQgdW50cmFjayBpbnB1dCBidWZmZXJzIGluIHRoaXMKKyAqIChjb2RlYykgcHJvY2VzcyBhbmQgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhIGxpc3RlbmVyLCBwb3NzaWJseSBpbiBhCisgKiBkaWZmZXJlbnQgcHJvY2Vzcywgd2hlbiBhIHRyYWNrZWQgYnVmZmVyIG5vIGxvbmdlciBoYXMgYW55IHJlZmVyZW5jZXMgaW4gdGhpcworICogcHJvY2Vzcy4KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIHJlY29yZHMgcmVwcmVzZW50aW5nIHRyYWNrZWQgYnVmZmVycworICogYW5kIHRoZWlyIGNhbGxiYWNrIGxpc3RlbmVycy4gQ29uY2VwdHVhbGx5LCBvbmUgcmVjb3JkIGlzIGEgdHJpcGxlIChsaXN0ZW5lciwKKyAqIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZQorICoKKyAqIC0gKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBpcyBhIHBhaXIgb2YgaW5kaWNlcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBidWZmZXIuCisgKiAtIGxpc3RlbmVyIGlzIG9mIHR5cGUgSUNvbXBvbmVudExpc3RlbmVyLiBJdHMgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpCisgKiAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBkaWVzLiBUaGUgYXJndW1lbnQgb2YKKyAqICAgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGEgbGlzdCBvZiBJbnB1dEJ1ZmZlciBvYmplY3RzLCBlYWNoIG9mIHdoaWNoCisgKiAgIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisgKgorICogICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgKKyAqICAgICB1aW50MzJfdCBhcnJheUluZGV4CisgKgorICogV2hlbiBhIHRyYWNrZWQgYnVmZmVyIGFzc29jaWF0ZWQgdG8gdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsCisgKiBidWZmZXJJbmRleCkgZ29lcyBvdXQgb2Ygc2NvcGUsIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgd2lsbCBiZQorICogY2FsbGVkIHdpdGggYW4gSW5wdXRCdWZmZXIgb2JqZWN0IHdob3NlIG1lbWJlcnMgYXJlIHNldCBhcyBmb2xsb3dzOgorICoKKyAqICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleAorICogICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleAorICoKKyAqIElQQyBPcHRpbWl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTaW5jZSBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgaXMgYW4gSVBDIGNhbGwsIElucHV0QnVmZmVyTWFuYWdlciB0cmllcyBub3QKKyAqIHRvIGNhbGwgaXQgdG9vIG9mdGVuLiBBbnkgdHdvIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdAorICogbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgYXBhcnQsIHdoZXJlIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzCisgKiBjb25maWd1cmFibGUgdmlhIGNhbGxpbmcgc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwoKS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzIGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJuYWxOcy4KKyAqCisgKiBQdWJsaWMgTWVtYmVyIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaXMgYSBzaW5nbGV0b24gY2xhc3MuIEl0cyBvbmx5IGluc3RhbmNlIGlzIGFjY2Vzc2libGUgdmlhCisgKiB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6CisgKgorICogLSByZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpCisgKgorICogLSB1bnJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICoKKyAqIC0gc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKQorICoKKyAqLworCitzdHJ1Y3QgSW5wdXRCdWZmZXJNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIDIgc3Vic2VxdWVudCBJUENzLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMgPSAxMDAwMDAwOyAvKiAxbXMgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrIGFsbCBidWZmZXJzIGluIGEgQzJGcmFtZURhdGEgb2JqZWN0LgorICAgICAqCisgICAgICogaW5wdXQgKEMyRnJhbWVEYXRhKSBoYXMgdGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyB0aGF0IGFyZSBvZiBpbnRlcmVzdDoKKyAgICAgKgorICAgICAqICAgQzJXb3JrT3JkaW5hbCAgICAgICAgICAgICAgICBvcmRpbmFsCisgICAgICogICB2ZWN0b3I8c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnMKKyAgICAgKgorICAgICAqIENhbGxpbmcgcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlCisgICAgICogdHJpcGxlcyAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZSBmcmFtZUluZGV4IGlzIGVxdWFsIHRvCisgICAgICogaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IGFuZCBidWZmZXJJbmRleCBydW5zIHRocm91Z2ggdGhlIGluZGljZXMgb2YKKyAgICAgKiBpbnB1dC5idWZmZXJzIHN1Y2ggdGhhdCBpbnB1dC5idWZmZXJzW2J1ZmZlckluZGV4XSBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgb2YgZGVhdGggbm90aWZpY2F0aW9ucy4KKyAgICAgKiBccGFyYW0gaW5wdXQgSW5wdXQgZnJhbWUgZGF0YSB3aG9zZSBpbnB1dCBidWZmZXJzIGFyZSB0byBiZSB0cmFja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVW50cmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgICogcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZmksIGJ1ZmZlckluZGV4KSBzdWNoIHRoYXQKKyAgICAgKiBsID0gbGlzdGVuZXIgYW5kIGZpID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKiBccGFyYW0gaW5wdXQgUHJldmlvdXNseSByZWdpc3RlcmVkIGZyYW1lIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxpc3RlbmVyLgorICAgICAqCisgICAgICogQ2FsbGluZyB1bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBzdWNoCisgICAgICogdGhhdCBsID0gbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywKKyAgICAgKiBpLmUuLCB3aGVuIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgUHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBub3RpZmljYXRpb25JbnRlcnZhbE5zIE5ldyBub3RpZmljYXRpb24gaW50ZXJ2YWwsIGluIG5hbm9zZWNvbmRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKyAgICB2b2lkIF91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHZvaWQgX3NldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGllZCB0byBDMkJ1ZmZlciBvYmplY3RzLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgc0luc3RhbmNlIGlzIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMKKyAgICAvLyAgICAgICBjbGFzcy4KKyAgICBzdGF0aWMgdm9pZCBvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworICAgIHZvaWQgX29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+PiBUcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIFN0b3JhZ2UgZm9yIHBlbmRpbmcgKHVuc2VudCkgZGVhdGggbm90aWZpY2F0aW9ucyBmb3Igb25lIGxpc3RlbmVyLgorICAgIC8vIEVhY2ggcGFpciBpbiBtZW1iZXIgbmFtZWQgImluZGljZXMiIGFyZSAoZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIGZyb20KKyAgICAvLyB0aGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgdHJpcGxlLgorICAgIHN0cnVjdCBEZWF0aE5vdGlmaWNhdGlvbnMgeworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcGVuZGluZyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICAvLyBjb3VudCBtYXkgYmUgMCwgaW4gd2hpY2ggY2FzZSB0aGUgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB3aWxsCisgICAgICAgIC8vIHJlbWFpbiB2YWxpZCBmb3Igb25seSBhIHNtYWxsIHBlcmlvZCAoc3BlY2lmaWVkCisgICAgICAgIC8vIG5hbm9zZWNvbmRzKS4KKyAgICAgICAgc2l6ZV90IGNvdW50OworCisgICAgICAgIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IGNhbGxiYWNrIG9uIHRoaXMgbGlzdGVuZXIuIFRoaXMgaXMKKyAgICAgICAgLy8gdXNlZCB0byBndWFyYW50ZWUgdGhhdCBjYWxsYmFja3MgZG8gbm90IG9jY3VyIHRvbyBmcmVxdWVudGx5LCBhbmQKKyAgICAgICAgLy8gYWxzbyB0byB0cmlnZ2VyIGV4cGlyYXRpb24gb2YgYSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IHRoYXQgaGFzCisgICAgICAgIC8vIGNvdW50ID0gMC4KKyAgICAgICAgbnNlY3NfdCBsYXN0U2VudE5zOworCisgICAgICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29sbGVjdGlvbiBvZiAoZnJhbWRlSW5kZXgsIGJ1ZmZlckluZGV4KS4KKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+IGluZGljZXM7CisKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyA9IGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAgICAgICAgICAgICAgOiBjb3VudCgwKSwKKyAgICAgICAgICAgICAgICBsYXN0U2VudE5zKHN5c3RlbVRpbWUoKSAtIG5vdGlmaWNhdGlvbkludGVydmFsTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBUaGUgbWluaW11bSB0aW1lIHBlcmlvZCBiZXR3ZWVuIElQQyBjYWxscyB0byBub3RpZnkgdGhlIGNsaWVudCBhYm91dCB0aGUKKyAgICAvLyBkZXN0cnVjdGlvbiBvZiBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6YXRvbWljPG5zZWNzX3Q+IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5ze2tEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOc307CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgorICAgIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sIERlYXRoTm90aWZpY2F0aW9ucz4gbURlYXRoTm90aWZpY2F0aW9uczsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBzaWduYWxlZCB3aGVuIGFuIGVudHJ5IGlzIGFkZGVkIHRvIG1EZWF0aE5vdGlmaWNhdGlvbnMuCisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbU9uQnVmZmVyRGVzdHJveWVkOworCisgICAgLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorICAgIC8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIGR1cmF0aW9uIHRvIHdhaXQgZm9yIGJlZm9yZQorICAgIC8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCisgICAgYm9vbCBwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKTsKKworICAgIC8vIE1haW4gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dCBidWZmZXIgbWFuYWdlciB0aHJlYWQuCisgICAgdm9pZCBtYWluKCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIHRoYXQgbWFuYWdlcyBub3RpZmljYXRpb25zLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBsYXN0IHNvIGl0cyBpbml0aWFsaXphdGlvbiB3aWxsIGhhcHBlbgorICAgIC8vIGFmdGVyIGFsbCBvdGhlciBtZW1iZXIgdmFyaWFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGQ6OnRocmVhZCBtTWFpblRocmVhZDsKKworICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyKCk7CisKKyAgICAvLyBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXImIGdldEluc3RhbmNlKCk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjgyYzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSBHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGNsYXNzIEludGVyZmFjZTsKKyAgICBjbGFzcyBDb25maWd1cmFibGVJbnRmOworCisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK307CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThiNmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworLy8gQW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBjb25uZWN0cyBhbiBJbnB1dFN1cmZhY2UgdG8gYSBzaW5rLCB3aGljaCBtYXkgYmUgYW4KKy8vIElJbnB1dFNpbmsgb3IgYSBsb2NhbCBDMkNvbXBvbmVudC4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGNob29zaW5nIHRoZQorLy8gY29ycmVzcG9uZGluZyBjb25zdHJ1Y3Rvci4gVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgdHdvIGNhc2VzIGlzCisvLyB0aGF0IHdoZW4gYW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZQorLy8gY29tcG9uZW50IHRoYXQgcHJvY2Vzc2VzIHRoZSBidWZmZXJzLCBkYXRhIHBhcmNlbGluZyBpcyBub3QgbmVlZGVkLgorc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgYm9vbCBpbml0KCk7CisKKyAgICBmcmllbmQgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKworICAgIHN0ZDo6bXV0ZXggbUltcGxNdXRleDsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENvbm5lY3Rpb25JZDsKK3VzaW5nIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVHlwZXMgb2YgbWV0YWRhdGEgZm9yIEJsb2Nrcy4KK3N0cnVjdCBDMkhpZGxfUmFuZ2UgeworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBsZW5ndGg7IC8vIERvIG5vdCB1c2UgInNpemUiIGJlY2F1c2UgdGhlIG5hbWUgY29sbGlkZXMgd2l0aCBDMkluZm86OnNpemUoKS4KK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmFuZ2UsIDA+IEMySGlkbF9SYW5nZUluZm87CisKK3N0cnVjdCBDMkhpZGxfUmVjdCB7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworfTsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySGlkbF9SZWN0LCAxPiBDMkhpZGxfUmVjdEluZm87CisKKy8vIE1ha2UgYXNTdHJpbmcoKSBhbmQgb3BlcmF0b3I8PCB3b3JrIHdpdGggU3RhdHVzIGFzIHdlbGwgYXMgYzJfc3RhdHVzX3QuCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoU3RhdHVzKTsKKworLyoqCisgKiBBbGwgb2JqY3B5KCkgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiBjb252ZXJzaW9uIHN1Y2NlZWRzIG9yIG5vdC4KKyAqLworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIFNldHRpbmdSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFBhcmFtRGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzJiBzKTsKKworLy8gQ29tcG9uZW50VHJhaXRzIC0+IEMyQ29tcG9uZW50OjpUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcyk7CisKKy8vIEMyU3RydWN0RGVzY3JpcHRvciAtPiBTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiogZCwKKyAgICAgICAgY29uc3QgU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIEFic3RyYWN0IGNsYXNzIHRvIGJlIHVzZWQgaW4KKy8vIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorc3RydWN0IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgUmVzdWx0U3RhdHVzIFJlc3VsdFN0YXR1czsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjoKKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhIEJ1ZmZlclBvb2xEYXRhOworCisgICAgLyoqCisgICAgICogU2VuZCBicERhdGEgYW5kIHJldHVybiBCdWZmZXJTdGF0dXNNZXNzYWdlIHRoYXQgY2FuIGJlIHN1cHBsaWVkIHRvCisgICAgICogSUNsaWVudE1hbmFnZXI6OnJlY2VpdmUoKSBpbiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbgorICAgICAqIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBicERhdGEgQnVmZmVyUG9vbERhdGEgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqIFxwYXJhbVtvdXRdIGJwTWVzc2FnZSBCdWZmZXJTdGF0dXNNZXNzYWdlIG9mIHRoZSB0cmFuc2FjdGlvbi4gSW5mb3JtYXRpb24KKyAgICAgKiAgICBpbnNpZGUgXHAgYnBNZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBwcm9jZXNzIGJ5IHNvbWUKKyAgICAgKiAgICBvdGhlciBtZWFucyBzbyBpdCBjYW4gY2FsbCByZWNlaXZlKCkgcHJvcGVybHkuCisgICAgICogXHJldHVybiBSZXN1bHRTdGF0dXMgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgKFNlZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIFJlc3VsdFN0YXR1cyBpbgorICAgICAqICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaGFsLikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBzZW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sU2VuZGVyKCkgPSBkZWZhdWx0OworfTsKKworLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJQb29sU2VuZGVyLgorLy8KKy8vIFRvIHVzZSBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciwgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcKKy8vIHByb2Nlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIHNlbmQoKSBjYW4gb3BlcmF0ZS4gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgd2lsbAorLy8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIGFuZCB1c2UgaXQgdG8gY2FsbAorLy8gSUNsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKCkgdG8gZXN0YWJsaXNoIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24gd2hlbgorLy8gc2VuZCgpIGlzIGNhbGxlZC4KK3N0cnVjdCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciA6IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXIgQ2xpZW50TWFuYWdlcjsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyIElDbGllbnRNYW5hZ2VyOworCisgICAgLy8gU2V0IHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYW5kIHRoZSByZWZyZXNoCisgICAgLy8gaW50ZXJ2YWwgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyA0LjUgc2Vjb25kcywgd2hpY2gKKyAgICAvLyBpcyBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBidWZmZXJwb29sIHdpbGwga2VlcCBhbgorICAgIC8vIGluYWN0aXZlIGNvbm5lY3Rpb24gZm9yLgorICAgIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIgPSBudWxscHRyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICB2b2lkIHNldFJlY2VpdmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwgPSA0NTAwbXMpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgpLiBzZW5kKCkgd2lsbCBlc3RhYmxpc2ggYQorICAgIC8vIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBpZiBuZWVkZWQsIHRoZW4gc2VuZCB0aGUgYnVmZmVycG9vbCBkYXRhIG92ZXIgdG8KKyAgICAvLyB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8Q2xpZW50TWFuYWdlcj4gbVNlbmRlck1hbmFnZXI7CisgICAgc3A8SUNsaWVudE1hbmFnZXI+IG1SZWNlaXZlck1hbmFnZXI7CisgICAgaW50NjRfdCBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtU291cmNlQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbUxhc3RTZW50OworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIG1SZWZyZXNoSW50ZXJ2YWw7Cit9OworCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKKy8vIE5vdGU6IElmIGJ1ZmZlcnBvb2wgd2lsbCBiZSB1c2VkLCBicFNlbmRlciBtdXN0IG5vdCBiZSBudWxsLgorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsCisgICAgICAgIGNvbnN0IFdvcmtCdW5kbGUmIHMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCByZXR1cm5zIEMyUGFyYW0gcG9pbnRlcnMgdG8gaXRzIHBhcmFtcy4gVGhlIHBvaW50ZXJzCisgKiBwb2ludCB0byBsb2NhdGlvbnMgaW5zaWRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBvZiBccCBibG9iLiBJZiBccCBibG9iIGlzCisgKiBkZXN0cm95ZWQsIHRoZSBwb2ludGVycyBiZWNvbWUgaW52YWxpZC4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgZmFsc2UgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsICh0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGUKKyAqICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBjb25zdCkKKyAqLworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIHBhcmFtcyB0aGUgcmVzdWx0aW5nIHZlY3RvcgorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYik7Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBhcHBsaWVzIHVwZGF0ZXMgdG8gcGFyYW1zLgorICoKKyAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBwYXJhbXMgdG8gYmUgdXBkYXRlZAorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIGNvbnRhaW5pbmcgdXBkYXRlcworICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIEJ1ZmZlclBvb2wgc3RhdHVzIHZhbHVlIHRvIGMyX3N0YXR1c190LgorICogXHBhcmFtIEJ1ZmZlclBvb2wgc3RhdHVzCisgKiBccmV0dXJuIENvcnJlc3BvbmRpbmcgYzJfc3RhdHVzX3QKKyAqLworYzJfc3RhdHVzX3QgdG9DMlN0YXR1cyg6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIFJlc3VsdFN0YXR1cyBycyk7CisKKy8vIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrIE9wZXJhdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2sgYW5kIGF0dGFjaCBpdCB0byBhbgorLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4KK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBSZXR1cm4gZmFsc2UgaWYgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorLy8gT3RoZXJ3aXNlLCBleHRyYWN0IGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdCBhbmQgcmV0dXJuIHRydWUuCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBEaXNhc3NvY2lhdGUgdGhlIGdpdmVuIGJsb2NrIHdpdGggaXRzIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUgc28gdGhhdAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4gSWYgdGhlIGJsb2NrCisvLyBkb2VzIG5vdCBoYXZlIGEgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisvLyBPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYXR0YWNoQnVmZmVyKCkgb3IgcXVldWVCdWZmZXIoKSBpcworLy8gY2FsbGVkIG1hbnVhbGx5LgorYm9vbCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOworCisvLyBDYWxsIHlpZWxkQnVmZmVyUXVldWVCbG9jaygpIG9uIGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuIHByb2Nlc3NJbnB1dAorLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0IGJsb2NrcyBhcmUgeWllbGRlZC4gcHJvY2Vzc091dHB1dCB3b3JrcyBzaW1pbGFybHkgb24KKy8vIG91dHB1dCBibG9ja3MuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzSW5wdXQgaXMgZmFsc2Ugd2hpbGUgdGhlIGRlZmF1bHQKKy8vIHZhbHVlIG9mIHByb2Nlc3NPdXRwdXQgaXMgdHJ1ZS4gVGhpcyBpbXBsaWVzIHRoYXQgaW4gbW9zdCBjYXNlcywgb25seSBvdXRwdXQKKy8vIGJ1ZmZlcnMgY29udGFpbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MuKQorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorLy8gc2VudCBvdmVyIHRoZSBUcmVibGUgYm91bmRhcnkgdG8gYW5vdGhlciBwcm9jZXNzLgordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzT3V0cHV0ID0gdHJ1ZSk7CisKKy8vIEFzc2lnbiB0aGUgZ2l2ZW4gYmxvY2sgdG8gYSBidWZmZXJxdWV1ZSBzbyB0aGF0IHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZCwKKy8vIGNhbmNlbEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLgorLy8KKy8vIElmIHRoZSBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIHRoaXMgZnVuY3Rpb24KKy8vIHJldHVybnMgZmFsc2UuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG9uZSwKKy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZQorLy8gZ2l2ZW4gb25lLCB0aGUgYmxvY2sgd2lsbCBiZSByZWFzc2lnbmVkIHRvIHRoZSBnaXZlbiBidWZmZXJxdWV1ZS4gVGhpcworLy8gd2lsbCBjYWxsIGF0dGFjaEJ1ZmZlcigpIG9uIHRoZSBnaXZlbiBpZ2JwLiBUaGUgZnVuY3Rpb24gdGhlbiByZXR1cm5zIHRydWUgb24KKy8vIHN1Y2Nlc3Mgb3IgZmFsc2Ugb24gYW55IGZhaWx1cmUgZHVyaW5nIHRoZSBvcGVyYXRpb24uCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGRldGFjaEJ1ZmZlcigpIG9yIGRlcXVldWVCdWZmZXIoKQorLy8gaXMgY2FsbGVkIG1hbnVhbGx5LgorYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pOworCisvLyBDYWxsIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gaW5wdXQgb3Igb3V0cHV0IGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisvLyBTaW5jZSB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGNhbiBiZQorLy8gZGlmZmVyZW50LCB0aGlzIGZ1bmN0aW9uIHRha2VzIGZvcklucHV0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbgorLy8gYnVmZmVycXVldWUgaXMgZm9yIGlucHV0IGJ1ZmZlcnMgb3Igb3V0cHV0IGJ1ZmZlcnMuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZgorLy8gZm9ySW5wdXQgaXMgZmFsc2UuKQorLy8KKy8vIEluIHRoZSAocmFyZSkgY2FzZSB0aGF0IGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBidWZmZXJxdWV1ZS1iYXNlZCwKKy8vIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIHRoZSBpbnB1dCBidWZmZXJzIGFuZCBvbmNlIGZvcgorLy8gdGhlIG91dHB1dCBidWZmZXJzLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20KKy8vIGFub3RoZXIgcHJvY2Vzcy4KK3ZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9ySW5wdXQgPSBmYWxzZSk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNiY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMCwwICsxLDE5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpCdWZmZXJTdGF0dXNNZXNzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENsaWVudE1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBUcmFuc2FjdGlvbklkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworY29uc3QgY2hhciogYXNTdHJpbmcoU3RhdHVzIHN0YXR1cywgY29uc3QgY2hhciogZGVmKSB7CisgICAgcmV0dXJuIGFzU3RyaW5nKHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0dXMpLCBkZWYpOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtQ2xhc3M+Cit0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlIHVuZGVybHlpbmdfdmFsdWUoCisgICAgICAgIEVudW1DbGFzcyB4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEVudW1DbGFzcz46OnR5cGU+KHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tbW9uLCB0eXBlbmFtZSBEc3RWZWN0b3IsIHR5cGVuYW1lIFNyY1ZlY3Rvcj4KK3ZvaWQgY29weVZlY3RvcihEc3RWZWN0b3IqIGQsIGNvbnN0IFNyY1ZlY3RvciYgcykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKCgqZClbMF0pKSwKKyAgICAgICAgICAgICJEc3RWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZShzWzBdKSksCisgICAgICAgICAgICAiU3JjVmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgZC0+cmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0gKyBzLnNpemUoKSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENvbW1vbio+KCYoKmQpWzBdKSk7Cit9CisKKy8vIEMyUGFyYW1GaWVsZCAtPiBQYXJhbUZpZWxkCitib29sIG9iamNweShQYXJhbUZpZWxkICpkLCBjb25zdCBDMlBhcmFtRmllbGQgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChzKSk7CisgICAgZC0+ZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzKSk7CisgICAgZC0+ZmllbGRJZC5zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IEMyUGFyYW1GaWVsZEJ1aWxkZXIgOiBwdWJsaWMgQzJQYXJhbUZpZWxkIHsKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKCkgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDApKSwgMCwgMCkgeworICAgIH0KKyAgICAvLyBQYXJhbUZpZWxkIC0+IEMyUGFyYW1GaWVsZAorICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoY29uc3QgUGFyYW1GaWVsZCYgcykgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQub2Zmc2V0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQuc2l6ZSkpIHsKKyAgICB9Cit9OworCisvLyBDMldvcmtPcmRpbmFsU3RydWN0IC0+IFdvcmtPcmRpbmFsCitib29sIG9iamNweShXb3JrT3JkaW5hbCAqZCwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGQtPnRpbWVzdGFtcFVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMudGltZXN0YW1wLnBlZWt1KCkpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5jdXN0b21PcmRpbmFsLnBlZWt1KCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBXb3JrT3JkaW5hbCAtPiBDMldvcmtPcmRpbmFsU3RydWN0Citib29sIG9iamNweShDMldvcmtPcmRpbmFsU3RydWN0ICpkLCBjb25zdCBXb3JrT3JkaW5hbCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBjMl9jbnRyNjRfdChzLmZyYW1lSW5kZXgpOworICAgIGQtPnRpbWVzdGFtcCA9IGMyX2NudHI2NF90KHMudGltZXN0YW1wVXMpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBjMl9jbnRyNjRfdChzLmN1c3RvbU9yZGluYWwpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSdzIHR5cGUgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlCitib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlKiBkLAorICAgICAgICBjb25zdCBkZWNsdHlwZShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSkmIHMpIHsKKyAgICBkLT5taW4gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5taW4udTY0KTsKKyAgICBkLT5tYXggPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5tYXgudTY0KTsKKyAgICBkLT5zdGVwID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuc3RlcC51NjQpOworICAgIGQtPm51bSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm51bS51NjQpOworICAgIGQtPmRlbm9tID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuZGVub20udTY0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkZMQUdTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU+KHMudHlwZSk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlCitib29sIG9iamNweSgKKyAgICAgICAgZGVjbHR5cGUoQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UpKiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UmIHMpIHsKKyAgICBkLT5taW4udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWluKTsKKyAgICBkLT5tYXgudTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWF4KTsKKyAgICBkLT5zdGVwLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLnN0ZXApOworICAgIGQtPm51bS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5udW0pOworICAgIGQtPmRlbm9tLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmRlbm9tKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXMgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZCwgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkVNUFRZOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90PihzLnR5cGUpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnJhbmdlLCBzLnJhbmdlKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvcHlWZWN0b3I8dWludDY0X3Q+KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBpZiAoIW9iamNweSgmZC0+ZmllbGQsIHMuZmllbGQoKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3dpdGNoIChzLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OkNVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZT4ocy50eXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGRUeXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3Q+KHMudHlwZSk7CisgICAgfQorICAgICpkID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5maWVsZCksIGRUeXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPgorLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpIHsKKyAgICBpZiAoIW9iamNweShkLCBzcSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNyLnN0YXR1cyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPnZhbHVlcywgc3IudmFsdWVzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ6OnZhbHVlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMgKmQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMgJnMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lOworCisgICAgc3dpdGNoIChzLmRvbWFpbikgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6VklERU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6QVVESU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6SU1BR0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6T1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkNvbXBvbmVudDo6ZG9tYWluX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbj4oCisgICAgICAgICAgICAgICAgcy5kb21haW4pOworICAgIH0KKworICAgIHN3aXRjaCAocy5raW5kKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJDb21wb25lbnQ6OmtpbmRfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5raW5kKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kPigKKyAgICAgICAgICAgICAgICBzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5yYW5rKTsKKworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlOworCisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaXggPSBzLmFsaWFzZXMuc2l6ZSgpOyBpeCA+IDA7ICkgeworICAgICAgICAtLWl4OworICAgICAgICBkLT5hbGlhc2VzW2l4XSA9IHMuYWxpYXNlc1tpeF07CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcykgeworICAgIGQtPm5hbWUgPSBzLm5hbWUuY19zdHIoKTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OklNQUdFOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46Ok9USEVSOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQ29tcG9uZW50VHJhaXRzOjpEb21haW4gIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbik7CisgICAgfQorCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpERUNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6RU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDb21wb25lbnRUcmFpdHM6OktpbmQgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMua2luZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmtpbmQgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6a2luZF90PihzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6cmFua190PihzLnJhbmspOworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlLmNfc3RyKCk7CisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmFsaWFzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZC0+YWxpYXNlc1tpXSA9IHMuYWxpYXNlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQzJQYXJhbUZpZWxkVmFsdWVzIC0+IFBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGlmICghb2JqY3B5KCZkLT5wYXJhbU9yRmllbGQsIHMucGFyYW1PckZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyUGFyYW1GaWVsZFZhbHVlczo6cGFyYW1PckZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT52YWx1ZXNbMF0sICpzLnZhbHVlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJQYXJhbUZpZWxkVmFsdWVzOjp2YWx1ZXMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyUGFyYW1GaWVsZFZhbHVlcyAqZCwgY29uc3QgUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGQtPnBhcmFtT3JGaWVsZCA9IEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5wYXJhbU9yRmllbGQpOworICAgIGlmIChzLnZhbHVlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBkLT52YWx1ZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCk7CisgICAgICAgIGlmICghb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6OnZhbHVlcy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgICJUd28gb3IgbW9yZSBGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3RzIGV4aXN0IGluICIKKyAgICAgICAgICAgICAgICAgICJQYXJhbUZpZWxkVmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAiT25seSB6ZXJvIG9yIG9uZSBpcyBhbGxvd2VkLiI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyU2V0dGluZ1Jlc3VsdCAtPiBTZXR0aW5nUmVzdWx0Citib29sIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19DT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5mYWlsdXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZmFpbHVyZSA9IHN0YXRpY19jYXN0PFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZSk7CisgICAgfQorICAgIGlmICghb2JqY3B5KCZkLT5maWVsZCwgcy5maWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KCZkQ29uZmxpY3QsIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJTZXR0aW5nUmVzdWx0Ojpjb25mbGljdHNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1lbW9yeSBmb3IgQzJTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmYWlsdXJlCisgICAgc3dpdGNoIChzLmZhaWx1cmUpIHsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX0lOREVYOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6UkVBRF9PTkxZOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9WQUxVRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAoKmQpLT5mYWlsdXJlID0gc3RhdGljX2Nhc3Q8QzJTZXR0aW5nUmVzdWx0OjpGYWlsdXJlPihzLmZhaWx1cmUpOworICAgIH0KKworICAgIC8vIGZpZWxkCisgICAgaWYgKCFvYmpjcHkoJigqZCktPmZpZWxkLCBzLmZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJigqZCktPmNvbmZsaWN0cy5iYWNrKCksIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2V0dGluZ1Jlc3VsdDo6Y29uZmxpY3RzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoUGFyYW1EZXNjcmlwdG9yICpkLCBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4ocy5pbmRleCgpKTsKKyAgICBkLT5hdHRyaWIgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPFBhcmFtRGVzY3JpcHRvcjo6QXR0cmliPj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0QXR0cmliKHMpKTsKKyAgICBkLT5uYW1lID0gcy5uYW1lKCk7CisgICAgY29weVZlY3Rvcjx1aW50MzJfdD4oJmQtPmRlcGVuZGVuY2llcywgcy5kZXBlbmRlbmNpZXMoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBDMlBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAqZCwgY29uc3QgUGFyYW1EZXNjcmlwdG9yICZzKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGREZXBlbmRlbmNpZXM7CisgICAgZERlcGVuZGVuY2llcy5yZXNlcnZlKHMuZGVwZW5kZW5jaWVzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBQYXJhbUluZGV4JiBzRGVwZW5kZW5jeSA6IHMuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGREZXBlbmRlbmNpZXMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHVpbnQzMl90PihzRGVwZW5kZW5jeSkpOworICAgIH0KKyAgICAqZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdD4ocy5hdHRyaWIpLAorICAgICAgICAgICAgQzJTdHJpbmcocy5uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgc3RkOjptb3ZlKGREZXBlbmRlbmNpZXMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KFN0cnVjdERlc2NyaXB0b3IgKmQsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIGQtPnR5cGUgPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBkLT5maWVsZHMucmVzaXplKHMubnVtRmllbGRzKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNGaWVsZCA6IHMpIHsKKyAgICAgICAgRmllbGREZXNjcmlwdG9yJiBkRmllbGQgPSBkLT5maWVsZHNbaSsrXTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC50eXBlID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+PigKKyAgICAgICAgICAgICAgICBzRmllbGQudHlwZSgpKTsKKyAgICAgICAgZEZpZWxkLmV4dGVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzRmllbGQuZXh0ZW50KCkpOworICAgICAgICBkRmllbGQubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzRmllbGQubmFtZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byYgc05hbWVkVmFsdWVzID0gc0ZpZWxkLm5hbWVkVmFsdWVzKCk7CisgICAgICAgIGRGaWVsZC5uYW1lZFZhbHVlcy5yZXNpemUoc05hbWVkVmFsdWVzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNOYW1lZFZhbHVlcykgeworICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlJiBkTmFtZWRWYWx1ZSA9IGRGaWVsZC5uYW1lZFZhbHVlc1tqKytdOworICAgICAgICAgICAgZE5hbWVkVmFsdWUubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzTmFtZWRWYWx1ZS5maXJzdCk7CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS52YWx1ZSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPigKKyAgICAgICAgICAgICAgICAgICAgc05hbWVkVmFsdWUuc2Vjb25kLnU2NCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5leHRlbnQsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEZpbmQgb3IgYWRkIGEgaGlkbCBCYXNlQmxvY2sgb2JqZWN0IGZyb20gYSBnaXZlbiBDMkhhbmRsZSogdG8gYSBsaXN0IGFuZCBhbgorLy8gYXNzb2NpYXRlZCBtYXAuCisvLyBOb3RlOiBUaGUgaGFuZGxlIGlzIG5vdCBjbG9uZWQuCitib29sIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJhZGRCYXNlQmxvY2sgY2FsbGVkIG9uIGEgbnVsbCBDMkhhbmRsZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGhhbmRsZSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2soCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKTsKKworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorYm9vbCBfYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnBEYXRhLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghYnBEYXRhKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoYnBEYXRhLmdldCgpKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoYnBEYXRhLmdldCgpLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcG9vbGVkQmxvY2s7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBidWZmZXJQb29sU2VuZGVyLT5zZW5kKAorICAgICAgICAgICAgICAgICAgICBicERhdGEsCisgICAgICAgICAgICAgICAgICAgICZwb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgYnVmZmVyIHdpdGggQnVmZmVyUG9vbC4gRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRCYXNlQmxvY2sucG9vbGVkQmxvY2socG9vbGVkQmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyUG9vbERhdGEgdW5hdmFpbGFibGUgaW4gYSBibG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgfQorICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRToKKyAgICAgICAgLy8gRG8gdGhlIHNhbWUgdGhpbmcgYXMgYSBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBDMkZlbmNlIC0+IGhpZGxfaGFuZGxlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdExpbmVhckJsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5tZXRhLCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj57ICZkUmFuZ2VJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkNvbnN0TGluZWFyQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdExpbmVhckJsb2NrOjpmZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShzKTsKKyAgICBpZiAoIWFkZEJhc2VCbG9jaygmZC0+aW5kZXgsIHMuaGFuZGxlKCksIGJwRGF0YSwKKyAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYmxvY2sgZGF0YSBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SZWN0SW5mbyBkUmVjdEluZm87CisgICAgQzJSZWN0IHNSZWN0ID0gcy5jcm9wKCk7CisgICAgZFJlY3RJbmZvLmxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QubGVmdCk7CisgICAgZFJlY3RJbmZvLnRvcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC50b3ApOworICAgIGRSZWN0SW5mby53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC53aWR0aCk7CisgICAgZFJlY3RJbmZvLmhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5oZWlnaHQpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJlY3RJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyQ29uc3RHcmFwaGljQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdEdyYXBoaWNCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXJEYXRhIC0+IEJ1ZmZlcgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGZpbGxzIGluIGQtPmJsb2Nrcy4KK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmJsb2Nrcy5yZXNpemUoCisgICAgICAgICAgICBzLmxpbmVhckJsb2NrcygpLnNpemUoKSArCisgICAgICAgICAgICBzLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayYgbGluZWFyQmxvY2sgOiBzLmxpbmVhckJsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgZ3JhcGhpY0Jsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2Nrcy4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKERlc3RpbmF0aW9uIGluZGV4ID0gIiA8PCBpIC0gMSA8PCAiLikiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5pbmZvLCBzLmluZm8oKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyOjpkYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMySW5mb0J1ZmZlciAtPiBJbmZvQnVmZmVyCitib29sIG9iamNweShJbmZvQnVmZmVyKiBkLCBjb25zdCBDMkluZm9CdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgLy8gVE9ETzogQzJJbmZvQnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAodm9pZClkOworICAgICh2b2lkKXM7CisgICAgKHZvaWQpYnVmZmVyUG9vbFNlbmRlcjsKKyAgICAodm9pZCliYXNlQmxvY2tzOworICAgICh2b2lkKWJhc2VCbG9ja0luZGljZXM7CisgICAgTE9HKElORk8pIDw8ICJJbmZvQnVmZmVyIG5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZyYW1lRGF0YSAtPiBGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5idWZmZXJzLnJlc2l6ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzQnVmZmVyKSB7CisgICAgICAgICAgICAvLyBBIG51bGwgKHBvaW50ZXIgdG8pIEMyQnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgQnVmZmVyIHdpdGggZW1wdHkKKyAgICAgICAgICAgIC8vIGluZm8gYW5kIGJsb2Nrcy4KKyAgICAgICAgICAgIGRCdWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgICAgICAgICBkQnVmZmVyLmJsb2Nrcy5yZXNpemUoMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmJ1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5jb25maWdVcGRhdGUsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcidzIGltcGxlbWVudGF0aW9uCisKK0RlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkKKyAgICA6IG1SZWNlaXZlck1hbmFnZXIocmVjZWl2ZXJNYW5hZ2VyKSwKKyAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQoMCksCisgICAgICBtTGFzdFNlbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpLAorICAgICAgbVJlZnJlc2hJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpIHsKK30KKwordm9pZCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2V0UmVjZWl2ZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtUmVjZWl2ZXJNYW5hZ2VyICE9IHJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBtUmVjZWl2ZXJNYW5hZ2VyID0gcmVjZWl2ZXJNYW5hZ2VyOworICAgIH0KKyAgICBtUmVmcmVzaEludGVydmFsID0gcmVmcmVzaEludGVydmFsOworfQorCitSZXN1bHRTdGF0dXMgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSB7CisgICAgaWYgKCFtUmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAoIW1TZW5kZXJNYW5hZ2VyKSB7CisgICAgICAgIG1TZW5kZXJNYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGxvY2FsIEJ1ZmZlclBvb2wgQ2xpZW50TWFuYWdlci4iOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWdpc3RlclNlbmRlciAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCA9IHJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnBvc3RTZW5kKAorICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkLCBicERhdGEsICZ0cmFuc2FjdGlvbklkLCAmdGltZXN0YW1wVXMpOworICAgIGlmIChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gcnM7CisgICAgfQorICAgIGlmICghYnBNZXNzYWdlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgb3V0cHV0IHBhcmFtZXRlciBmb3IgQnVmZmVyU3RhdHVzTWVzc2FnZS4iOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAvLyBiYXNlQmxvY2tzIGhvbGRzIGEgbGlzdCBvZiBCYXNlQmxvY2sgb2JqZWN0cyB0aGF0IEJsb2NrcyBjYW4gcmVmZXIgdG8uCisgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4gYmFzZUJsb2NrczsKKworICAgIC8vIGJhc2VCbG9ja0luZGljZXMgbWFwcyBhIHJhdyBwb2ludGVyIHRvIG5hdGl2ZV9oYW5kbGVfdCBvciBCdWZmZXJQb29sRGF0YQorICAgIC8vIGluc2lkZSBiYXNlQmxvY2tzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gYmFzZUJsb2Nrcy4gVGhlIGtleXMKKyAgICAvLyAocG9pbnRlcnMpIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGJsb2NrcyB0aGF0IGhhdmUgdGhlIHNhbWUgImJhc2UgYmxvY2siIGluCisgICAgLy8gcywgYSBsaXN0IG9mIEMyV29yayBvYmplY3RzLiBCZWNhdXNlIGJhc2VCbG9ja3Mgd2lsbCBiZSBjb3BpZWQgaW50byBhCisgICAgLy8gaGlkbF92ZWMgZXZlbnR1YWxseSwgdGhlIHZhbHVlcyBvZiBiYXNlQmxvY2tJbmRpY2VzIGFyZSB6ZXJvLWJhc2VkCisgICAgLy8gaW50ZWdlciBpbmRpY2VzIGluc3RlYWQgb2YgbGlzdCBpdGVyYXRvcnMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGNhbiBiZSByYXcgYmVjYXVzZSBiYXNlQmxvY2tJbmRpY2VzIGhhcyBhIHNob3J0ZXIKKyAgICAvLyBsaWZlc3BhbiB0aGFuIGFsbCBvZiBiYXNlIGJsb2Nrcy4KKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+IGJhc2VCbG9ja0luZGljZXM7CisKKyAgICBkLT53b3Jrcy5yZXNpemUocy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiBzV29yayA6IHMpIHsKKyAgICAgICAgV29yayAmZFdvcmsgPSBkLT53b3Jrc1tpKytdOworICAgICAgICBpZiAoIXNXb3JrKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay0+aW5wdXQsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cworICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXb3JrIHdpdGggbm8gd29ya2xldHMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmNlbCB0aGUgd29ya2xldHMuCisgICAgICAgICAgICBoaWRsX3ZlYzxXb3JrbGV0PiAmZFdvcmtsZXRzID0gZFdvcmsud29ya2xldHM7CisgICAgICAgICAgICBkV29ya2xldHMucmVzaXplKHNXb3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgc1dvcmtsZXQgOiBzV29yay0+d29ya2xldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzV29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXb3JrbGV0ICZkV29ya2xldCA9IGRXb3JrbGV0c1tqKytdOworCisgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICAgICAgZFdvcmtsZXQuY29tcG9uZW50SWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzV29ya2xldC0+Y29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHR1bmluZ3MKKyAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmRXb3JrbGV0LnR1bmluZ3MsIHNXb3JrbGV0LT50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGogLSAxIDw8ICJdLT50dW5pbmdzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgICAgIGRXb3JrbGV0LmZhaWx1cmVzLnJlc2l6ZShzV29ya2xldC0+ZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTnVsbCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGsgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1trKytdLCAqc0ZhaWx1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0Lm91dHB1dCwgc1dvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+b3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cyBwcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay0+d29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgeworICAgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgICAodm9pZClzOworICAgICpkID0gQzJGZW5jZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkxpbmVhckJsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJMaW5lYXJCbG9jazo6bWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkxpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJMaW5lYXJCbG9jay4KKyAgICAqYnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsCisgICAgICAgICAgICBmZW5jZSkpOworICAgIGlmICghKCpidWZmZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxpbmVhckJ1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJHcmFwaGljQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2Jvb2wgY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SZWN0SW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJHcmFwaGljQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmVjdEluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyR3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVHcmFwaGljQnVmZmVyIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCdWZmZXIgLT4gQzJCdWZmZXIKKy8vIE5vdGU6IFRoZSBuYXRpdmUgaGFuZGxlcyB3aWxsIGJlIGNsb25lZC4KK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgKmQgPSBudWxscHRyOworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5ibG9ja3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEJsb2NrICZzQmxvY2sgPSBzLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoIWNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpsaW5lYXIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBpZiAoIWNyZWF0ZUdyYXBoaWNCdWZmZXIoZCwgYmFzZUJsb2NrLmdyYXBoaWMsIHNCbG9ja01ldGEsIGRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OmdyYXBoaWMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjp0eXBlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmZvCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjppbmZvLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gYzJwYXJhbXsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbSkucmVsZWFzZSgpfTsKKyAgICAgICAgaWYgKCFjMnBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBhcmFtIGluIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCpkKS0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihjMnBhcmFtKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQorYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxDMkZyYW1lRGF0YTo6ZmxhZ3NfdD4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6Om9yZGluYWwuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCdWZmZXIsIHNCdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6YnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGRCdWZmZXIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5jb25maWdVcGRhdGUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHBhcnNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmFzZUJsb2NrIC0+IEMyQmFzZUJsb2NrCitib29sIG9iamNweShDMkJhc2VCbG9jayogZCwgY29uc3QgQmFzZUJsb2NrJiBzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om5hdGl2ZUJsb2NrOiB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHNIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKHMubmF0aXZlQmxvY2soKSk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKnNDMkhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUqPihzSGFuZGxlKTsKKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhzQzJIYW5kbGUpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6bmF0aXZlQmxvY2suIjsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBvb2xlZEJsb2NrOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrKCk7CisgICAgICAgICAgICBzcDxDbGllbnRNYW5hZ2VyPiBicCA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJwLT5yZWNlaXZlKAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICZjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlY2VpdmUgYnVmZmVyIGZyb20gYnVmZmVycG9vbCAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0U3RhdHVzID0gIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhjSGFuZGxlLCBicERhdGEpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6cG9vbGVkQmxvY2suIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBCYXNlQmxvY2sncyBkaXNjcmltaW5hdG9yIHdpdGggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ1bmRlcmx5aW5nIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZ2V0RGlzY3JpbWluYXRvcigpKSA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLCBjb25zdCBXb3JrQnVuZGxlJiBzKSB7CisgICAgLy8gQ29udmVydCBCYXNlQmxvY2tzIHRvIEMyQmFzZUJsb2Nrcy4KKyAgICBzdGQ6OnZlY3RvcjxDMkJhc2VCbG9jaz4gZEJhc2VCbG9ja3Mocy5iYXNlQmxvY2tzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmJhc2VCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtCdW5kbGU6OmJhc2VCbG9ja3NbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5jbGVhcigpOworICAgIGZvciAoY29uc3QgV29yayYgc1dvcmsgOiBzLndvcmtzKSB7CisgICAgICAgIGQtPmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29yaz4oKSk7CisgICAgICAgIEMyV29yayYgZFdvcmsgPSAqZC0+YmFjaygpOworCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0KHMpCisgICAgICAgIGRXb3JrLndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgV29ya2xldCYgc1dvcmtsZXQgOiBzV29yay53b3JrbGV0cykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICBkV29ya2xldC0+Y29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8YzJfbm9kZV9pZF90PigKKyAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQuY29tcG9uZW50SWQpOworCisgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICBpZiAoIWNvcHlQYXJhbXNGcm9tQmxvYigmZFdvcmtsZXQtPnR1bmluZ3MsIHNXb3JrbGV0LnR1bmluZ3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0Ojp0dW5pbmdzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZEZhaWx1cmUsIHNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6OmZhaWx1cmVzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZEZhaWx1cmUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQtPm91dHB1dCwgc1dvcmtsZXQub3V0cHV0LCBkQmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6Om91dHB1dC4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHNQcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay53b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgICAgICAvLyByZXN1bHQKKyAgICAgICAgZFdvcmsucmVzdWx0ID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNXb3JrLnJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYikgeworICAgIC8vIGFzc3VtaW5nIGJsb2IgaXMgY29uc3QgaGVyZQorICAgIHNpemVfdCBzaXplID0gYmxvYi5zaXplKCk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYmxvYi5kYXRhKCk7CisgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisKKyAgICBkbyB7CisgICAgICAgIHAgPSBDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoZGF0YSArIGl4LCBzaXplIC0gaXgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICBpeCArPSBwLT5zaXplKCk7CisgICAgICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHApOworCisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2VQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuIFQgaXMgYSBjb250YWluZXIgdHlwZQorICogd2hvc2UgbWVtYmVyIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEMyUGFyYW0qLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgY3JlYXRlZCAodGhpcyBvbmx5CisgKiAgICAgICAgIGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBfY3JlYXRlUGFyYW1zQmxvYihoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwgY29uc3QgVCAmcGFyYW1zKSB7CisgICAgLy8gYXNzdW1pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnN0CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcC0+c2l6ZSgpOworICAgICAgICBzaXplID0gYWxpZ24oc2l6ZSwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShzaXplKTsKKyAgICBzaXplX3QgaXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE5FVkVSIG92ZXJ3cml0ZSBldmVuIGlmIHBhcmFtIHZhbHVlcyAoZS5nLiBzaXplKSBjaGFuZ2VkCisgICAgICAgIHNpemVfdCBwYXJhbVNpemUgPSBzdGQ6Om1pbihwLT5zaXplKCksIHNpemUgLSBpeCk7CisgICAgICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCkgKyBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgJigqYmxvYilbaXhdKTsKKyAgICAgICAgaXggKz0gcGFyYW1TaXplOworICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKGl4KTsKKyAgICBpZiAoaXggIT0gc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgbmV3IFQgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLiBUIGlzIEMyUGFyYW0gb3IgaXRzIGNvbXBhdGlibGUgZGVyaXZlZCBjbGFzcy4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIG90aGVyd2lzZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcmFtcy0+cmVzaXplKHBhcmFtUG9pbnRlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29weVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgcGFyYW1Qb2ludGVyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10ucmVzZXQocmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKS5yZWxlYXNlKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKyAgICByZXR1cm4gX2NvcHlQYXJhbXNGcm9tQmxvYihwYXJhbXMsIGJsb2IpOworfQorCisvLyBQYXJhbXMgLT4gdXBkYXRlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBudWxsIG91dHB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleDJwYXJhbS5maW5kKHBhcmFtLT5pbmRleCgpKSA9PSBpbmRleDJwYXJhbS5lbmQoKSkgeworICAgICAgICAgICAgaW5kZXgycGFyYW0uZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgcGFyYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGZhaWxlZCB0byBwYXJzZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBpbnB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlY2x0eXBlKGluZGV4MnBhcmFtKTo6aXRlcmF0b3IgaSA9IGluZGV4MnBhcmFtLmZpbmQoCisgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKGkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIgbm90IGZvdW5kLiBTa2lwcGluZy4uLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWktPnNlY29uZC0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gc2l6ZSBtaXNtYXRjaDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuc2l6ZSgpIDw8ICIgdnMgIiA8PCBwYXJhbVBvaW50ZXItPnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChpbmRleCA9ICIgPDwgaS0+Zmlyc3QgPDwgIikuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIEJ1ZmZlclBvb2wgUmVzdWx0U3RhdHVzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykgPDwgIi4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KK3NwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgZm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKKyAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQorICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc0lucHV0KSB7CisgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29yay0+aW5wdXQsIHByb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgICAgICBpZ2JwLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oKTsKKyAgICByZXR1cm4gaGdicCA/IGhnYnAgOgorICAgICAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KGlnYnApOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIG51bGwgcHJvZHVjZXIuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOworICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoaW5nIGJ1ZmZlcjoiCisgICAgICAgICAgICA8PCAiIGJsb2NrIGRpbWVuc2lvbiAiIDw8IGJsb2NrLndpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2NrLmhlaWdodCgpCisgICAgICAgICAgICA8PCAiLCBncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkKKyAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCisgICAgICAgICAgICA8PCAiLCBmb3JtYXQgMHgiIDw8IHN0ZDo6c2V0dyg4KSA8PCBncmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpCisgICAgICAgICAgICA8PCAiLCB1c2FnZSAweCIgPDwgc3RkOjpzZXR3KDE2KSA8PCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpCisgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgICAgPDwgIiwgc3RyaWRlICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCkKKyAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gIiA8PCByZXN1bHQgPDwgIi4iOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIHJldHVybmVkIHNsb3QgIyIKKyAgICAgICAgICAgICAgICAgPDwgKmJxU2xvdCA8PCAiLiI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKSwKKyAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7Cit9CisKK2Jvb2wgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrLCBwcm9jZXNzSW5wdXQsIHByb2Nlc3NPdXRwdXQpOworfQorCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmICghZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3Qgb2xkR2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBvbGRJZDsKKyAgICBpbnQzMl90IG9sZFNsb3Q7CisgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCBidWZmZXJxdWV1ZS1iYXNlZCwgZG8gbm90aGluZy4KKyAgICBpZiAoIV9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgZGF0YSwgJm9sZEdlbmVyYXRpb24sICZvbGRJZCwgJm9sZFNsb3QpIHx8CisgICAgICAgICAgICAob2xkSWQgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIHRoZSBibG9jaydzIGJxSWQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlc2lyZWQgYnFJZCwganVzdCBob2xkLgorICAgIGlmICgob2xkSWQgPT0gYnFJZCkgJiYgKG9sZEdlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbikpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6IgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgb2xkSWQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IG9sZFNsb3QKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKGRhdGEsIGdldEhnYnAoaWdicCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGF0dGFjaCB0byB0aGUgZ2l2ZW4gaWdicCwgd2hpY2ggbXVzdCBub3QgYmUgbnVsbC4KKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYnFTbG90OworICAgIHN0YXR1c190IHJlc3VsdCA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssIGlnYnAsIGdlbmVyYXRpb24sICZicVNsb3QpOworCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBmYWlsIHRvIGF0dGFjaDoiCisgICAgICAgICAgICAgICAgICAgPDwgIiB0YXJnZXQgYnFJZCAiIDw8IGJxSWQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gYXR0YWNoZWQ6IgorICAgICAgICAgICAgICAgICA8PCAiIGJxSWQgIiA8PCBicUlkCisgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IGJxU2xvdAorICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgX0MyQmxvY2tGYWN0b3J5OjpBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBkYXRhLCBnZXRIZ2JwKGlnYnApLCBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcklucHV0KSB7CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoaG9sZEJ1ZmZlclF1ZXVlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pLAorICAgICAgICAgICAgICAgICBmb3JJbnB1dCwgIWZvcklucHV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Nzc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjM3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7InhhYWMiLCB4YWFjfSwKKyAgICAgICAgICAgIHsibXAzIiwgbXAzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJ2b3JiaXMiLCB2b3JiaXN9LAorICAgICAgICAgICAgeyJvcHVzIiwgb3B1c30sCisgICAgICAgICAgICB7InBjbSIsIHBjbX0sCisgICAgICAgICAgICB7Imc3MTEuYWxhdyIsIGc3MTFhbGF3fSwKKyAgICAgICAgICAgIHsiZzcxMS5tbGF3IiwgZzcxMW1sYXd9LAorICAgICAgICAgICAgeyJnc20iLCBnc219LAorICAgICAgICAgICAgeyJyYXciLCByYXd9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5kZWNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RydWN0IG91dHB1dE1ldGFEYXRhIHsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIHVpbnQzMl90IHJhbmdlTGVuZ3RoOworICAgIH07CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9MaXN0IG9mIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIG91dHB1dCBzaXplIHRvIGNhbGN1bGF0ZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXRhRGF0YSBtZXRhID0ge21UaW1lc3RhbXBVcywgcmFuZ2VMZW5ndGh9OworICAgICAgICAgICAgICAgICAgICAgICAgb0J1ZmZlck1ldGFEYXRhLnB1c2hfYmFjayhtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgeGFhYywKKyAgICAgICAgbXAzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIGFhYywKKyAgICAgICAgdm9yYmlzLAorICAgICAgICBvcHVzLAorICAgICAgICBwY20sCisgICAgICAgIGc3MTFhbGF3LAorICAgICAgICBnNzExbWxhdywKKyAgICAgICAgZ3NtLAorICAgICAgICByYXcsCisgICAgICAgIGZsYWMsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICA6OmFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+IG9CdWZmZXJNZXRhRGF0YTsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGJpdFN0cmVhbUluZm9bMF0pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGJpdFN0cmVhbUluZm9bMV0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEluIGRlY29kZXIgY29tcG9uZW50cywgb2Z0ZW4gdGhlIGlucHV0IHBhcmFtZXRlcnMgZ2V0IHVwZGF0ZWQgdXBvbgorLy8gcGFyc2luZyB0aGUgaGVhZGVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtLiBDbGllbnQgbmVlZHMgdG8gY29sbGVjdCB0aGlzCisvLyBpbmZvcm1hdGlvbiBhbmQgcmVjb25maWd1cmUKK3ZvaWQgZ2V0SW5wdXRDaGFubmVsSW5mbygKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgLy8gcXVlcnkgblNhbXBsZVJhdGUgYW5kIG5DaGFubmVscworICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlc3sKKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfRE9OVF9CTE9DSywgJmluUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IGluUGFyYW1zW2ldLmdldCgpOworICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb21wTmFtZSkgeworICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJuYjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcndiOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDE2MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmdzbTogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDApIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6eGFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyJ9LAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiJ9LAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8iLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiJ9LAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsICIifSwKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiIn0sCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFtbGF3LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAorICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLCAiIn0sCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCA6IHB1YmxpYyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKKyAgICBpZiAoIXN0cmNtcChtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKSkgeworICAgICAgICBBTE9HVigiRU1QVFkgSU5QVVQgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSAlcyBtVVJMICAlcyAiLAorICAgICAgICAgICAgICBnRW52LT5nZXRSZXMoKS5jX3N0cigpLCBtVVJMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgdWludDY0X3QgZXhwVHM7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIC8vIFVwZGF0ZSBTYW1wbGVSYXRlIGFuZCBDaGFubmVsQ291bnQKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBpbnQgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOworICAgICAgICBpbnQgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKKyAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT46Oml0ZXJhdG9yIGl0T3V0ID0gb0J1ZmZlck1ldGFEYXRhLmJlZ2luKCk7CisgICAgICAgIEVYUEVDVF9FUSgqaXRJbiwgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgZXhwVHMgPSAqaXRJbjsKKyAgICAgICAgd2hpbGUgKGl0T3V0ICE9IG9CdWZmZXJNZXRhRGF0YS5lbmQoKSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cFRzLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICAgICAgaWYgKGV4cFRzICE9IGl0T3V0LT50aW1lc3RhbXBVcykgYnJlYWs7CisgICAgICAgICAgICAvLyBidWZmZXIgc2FtcGxlcyA9ICgodG90YWwgYnl0ZXMpIC8gKGFjICogKGJpdHMgcGVyIHNhbXBsZSAvIDgpKQorICAgICAgICAgICAgc2FtcGxlc1JlY2VpdmVkICs9ICgoaXRPdXQtPnJhbmdlTGVuZ3RoKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgICAgICAgICBleHBUcyA9IHNhbXBsZXNSZWNlaXZlZCAqIDEwMDAwMDBsbCAvIG5TYW1wbGVSYXRlOworICAgICAgICAgICAgaXRPdXQrKzsKKyAgICAgICAgfQorICAgICAgICBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKTsKKyAgICAgICAgLS1pdEluOworICAgICAgICBFWFBFQ1RfR1QoZXhwVHMsICppdEluKTsKKyAgICAgICAgb0J1ZmZlck1ldGFEYXRhLmNsZWFyKCk7CisgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJlYW1JbmRleGVzLCBDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygwLCAxKSk7CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICBzaXplX3QgaSA9IC0xOworICAgIGRvIHsKKyAgICAgICAgaSsrOworICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGlmIChJbmZvW2ldLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2ldLmZsYWdzIC0gMSk7CisKKyAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaSArIDEpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZW5jb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QgblNhbXBsZVJhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG5TYW1wbGVSYXRlKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG5DaGFubmVscyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBmYWlsdXJlcy5zaXplKCkgPT0gMHUpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSwgYm9vbCBmbHVzaGVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgZnJhbWVJRCA9IDA7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gc2FtcGxlc1BlckZyYW1lICogbkNoYW5uZWxzICogMjsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPQorICAgICAgICAoaW50KSgoKGZsb2F0KXNhbXBsZXNQZXJGcmFtZSAvIG5TYW1wbGVSYXRlKSAqIDEwMDAwMDApOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvdW50LCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5zaXplKCkpOworCisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBBTE9HVigiRW5jb2RlVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDk2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBudW1GcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV1IiwgbUZyYW1lc1JlY2VpdmVkLCBudW1GcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGlmICgobUNvbXBOYW1lID09IGZsYWMgfHwgbUNvbXBOYW1lID09IG9wdXMgfHwgbUNvbXBOYW1lID09IGFhYykpIHsKKyAgICAgICAgaWYgKCFtQ3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGJ1ZmZlciBtaXNzaW5nIik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1Xb3JrUXVldWUgRW1wdHkgaXMgbm90IGV4cGVjdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdGVzdCIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSBtV29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSA8IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDk2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDMwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgblNhbXBsZVJhdGUsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc3M2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisKKworI2VuZGlmICAvLyBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY0NmVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBDb21tb25VdGlsIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU2OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwyMiBAQAorIyMgQ29kZWMyIEhhbCBAIDEuMCB0ZXN0cyAjIworLS0tCisjIyMjIG1hc3RlciA6CitGdW5jdGlvbmFsaXR5IG9mIG1hc3RlciBpcyB0byBlbnVtZXJhdGUgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0TWFzdGVyVGVzdCAtSSBzb2Z0d2FyZQorCisjIyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCBpcyB0byB0ZXN0IGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+CisKKyMjIyMgYXVkaW8gOgorRnVuY3Rpb25hbGl0eSBvZiBhdWRpbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIGF1ZGlvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKKyMjIyMgdmlkZW8gOgorRnVuY3Rpb25hbGl0eSBvZiB2aWRlbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIHZpZGVvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzYyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbiIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvLyBUZXN0IHRoZSBjb2RlY3MgZm9yIE51bGxCdWZmZXIsIEVtcHR5IElucHV0IEJ1ZmZlciB3aXRoKG91dCkgZmxhZ3Mgc2V0Cit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJ3b3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSB7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG51bGxwdHIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworfQorCisvLyBXYWl0IGZvciBhbGwgdGhlIGlucHV0cyB0byBiZSBjb25zdW1lZCBieSB0aGUgcGx1Z2luLgordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpIHsKKyAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgY3NkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdQYXJhbS5wdXNoX2JhY2socGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgIT0gQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgeworICAgICAgICBmcmFtZXNSZWNlaXZlZCsrOworICAgICAgICBlb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgICAgIGF1dG8gZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKGZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIGZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIEFMT0dWKCJXb3JrRG9uZTogZnJhbWVJRCByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICAgIChpbnQpd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICB3b3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhMjkwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7CisKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXhlZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlLmg+CisKKyNkZWZpbmUgTUFYX1JFVFJZIDIwCisjZGVmaW5lIFRJTUVfT1VUIDQwMG1zCisjZGVmaW5lIE1BWF9JTlBVVF9CVUZGRVJTIDgKKworLyoKKyAqIEhhbmRsZSBDYWxsYmFjayBmdW5jdGlvbnMgb25Xb3JrRG9uZSgpLCBvblRyaXBwZWQoKSwKKyAqIG9uRXJyb3IoKSwgb25EZWF0aCgpLCBvbkZyYW1lc1JlbmRlcmVkKCkKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisgICBwdWJsaWM6CisgICAgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGZuID0KKyAgICAgICAgICAgIG51bGxwdHIpCisgICAgICAgIDogY2FsbEJhY2soZm4pIHt9CisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZSBjYWxsZWQiKTsKKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpZnJhbWVJbmRleDsKKyAgICAgICAgKHZvaWQpYXJyYXlJbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKAorICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcik7CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUyk7CisKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCk7CisKKyNlbmRpZiAgLy8gTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MTNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgwM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9jb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIENvbXBvbmVudCB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSWYgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBmYXRhbCBmYWlsdXJlLCBpdCBpcyBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAvLyBmcmVlTm9kZSgpIHdpbGwgbm90IGdvIHRocm91Z2guIEluc3RlYWQgb2YgaGFuZ2luZyB0aGUgYXBwLgorICAgICAgICAgICAgLy8gbGV0IGl0IHBhc3MgdGhyb3VnaCBhbmQgcmVwb3J0IGVycm9ycworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1Fb3M7CisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCisvLyBUZXN0IEVtcHR5IEZsdXNoCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIEVtcHR5Rmx1c2gpIHsKKyAgICBBTE9HVigiRW1wdHkgRmx1c2ggVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgLy8gRW1wdHkgRmx1c2ggc2hvdWxkIG5vdCByZXR1cm4gYW55IHdvcmsKKyAgICBBU1NFUlRfRVEoZmx1c2hlZFdvcmsuc2l6ZSgpLCAwdSk7Cit9CisKKy8vIFRlc3QgUXVldWUgRW1wdHkgV29yaworVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBRdWV1ZUVtcHR5V29yaykgeworICAgIEFMT0dWKCJRdWV1ZSBFbXB0eSBXb3JrIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXVlaW5nIGFuIGVtcHR5IFdvcmtCdW5kbGUKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZ3b3JrTGlzdCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX05FKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBSZWxlYXNlIEFQSQorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVJlbGVhc2UpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgUmVsZWFzZSBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBDb21wb25lbnQgRG9tYWluIFR5cGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworCisgICAgLy8gQ29uZmlndXJlIENvbXBvbmVudCBEb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqIHBvcnRNZWRpYVR5cGUgPQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3BvcnRNZWRpYVR5cGV9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KK30KKworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBpc051bGxCdWZmZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSBBTE9HRCgiVGVzdGluZyBmb3IgbnVsbCBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgZWxzZSBBTE9HRCgiVGVzdGluZyBmb3IgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RJbnB1dEJ1ZmZlcigKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwgZmxhZ3MsIGlzTnVsbEJ1ZmZlcikpOworCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRJbnB1dHMsIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCB3b3JrLAorLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgc3RhdGVzCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNjRjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfbWFzdGVyX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgTWFzdGVyIHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMk1hc3RlckhhbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworfTsKKwordm9pZCBkaXNwbGF5Q29tcG9uZW50SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcExpc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBjb21wTGlzdFtpXS5uYW1lIDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmRvbWFpbjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmtpbmQgPDwgIlxuIjsKKyAgICB9Cit9CisKKy8vIExpc3QgQ29tcG9uZW50cworVEVTVF9GKENvZGVjMk1hc3RlckhhbFRlc3QsIExpc3RDb21wb25lbnRzKSB7CisgICAgQUxPR1YoIkxpc3RDb21wb25lbnRzIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29kZWMyQ2xpZW50IE5hbWUiOworCisgICAgLy8gR2V0IExpc3Qgb2YgY29tcG9uZW50cyBmcm9tIEhJREwgQ29kZWMyQ2xpZW50IGluc3RhbmNlCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjb21wb25lbnQsIG51bGxwdHIpIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2CkBAIC0wLDAgKzEgQEAKK8rKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS0tPT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PD87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0REQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc8Oz46PTo6Ojg4Ojs7ODg6Ojs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PjtEPD06PDw5ODo5Ojo5Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vLzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra2tvb29nZ2dnZ2dnZ2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vc3Nzc3Nzc3N3c29vb29rU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjM7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2NkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqLh4GCgoKCgoKCgYGBgX+R09PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe6+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTVE1DREREREREQ0NDREM/XdHT09PT09PS0tLS0tLS3+rr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1hRSUlJSUlJSUlISEhIRGDQ09LS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFhYmJiYmJiXoysqampqampqampqamqo2dhYmJiYmJiYmJiYmJiXFRUVFRUVFRUVFRUVVFr0NLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs3MzMzOz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXFxsbGy8zLzMvMzMzMzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy8rKysrKysrKy8vKysvLzdXV1dbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9LUz8/S1NXUz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NDR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbV1tbW1tbW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmszPzs7Ozs7Sq5zP0NO5n9HQnIKEisjPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1tXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9Wyl5i1tpO4ua+i0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3DnaKmq9KRfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COTY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmKrUz8/P0b+YoJuyrciGma3V0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT4/Pjo4RUA/Qjs3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZiq1M/Pz9O0mZaquKTbo5it1dPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+g2KGYrdXVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWodmhmK3V1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PTo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmanaoZiu1s2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpu02qOYr9jCn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tPT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SazNihma3asqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNXUsYTD1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR0tHD1dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f39/g4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxEREREPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FRERFPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QTw7PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29va2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBRD8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW2tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm4uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU0Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6vs7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfnJ2hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLW0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZmamZeXl5eXlpmbmJmZmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW2tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2uq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iZmpucnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2sq6qnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKampaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWlqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnJyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alpKWkpaWmqKinqKelpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmbnKGko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKKioqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fn5+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnZ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5uanJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ycnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5iZnJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52doKGio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+dnZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qbmpuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KTk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cmpubm5uamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pjs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucm5ubnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz1DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnZ+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPj4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7Pzw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8/QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9OTk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPj9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg5ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBvcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFEXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFLzhbbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PS2+heEF7d2NiUFBaR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0tLS5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGC/1qZDe4yAdU9tjnVSZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XUF5lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPD48OTk8QUJFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLOybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkKKXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6OhpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNgHdydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BCPkM9Ozk+OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqidiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoainpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoF2eHl4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs+Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloaSnp6GfnZ6Wk5ygl5mSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ6dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ojw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1XoyMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5M1uTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMzNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCPDg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKKnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJeXnJufnqOcnpaYl5OWnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojs7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbOrqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOMlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmlqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjMysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmlqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvBw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1paWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnZ6WnKOgoaKko6SinpqZm5ubnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VUTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg6PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Odn6JVkxvpMvUxba/v8C/urq9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnJ+eo6CmmXl6eYBzcGZlZ2RrZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8PDxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3aoOQmG+pyMjH0cGvvb24ubu7vri1sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbCnpqWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2joJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs7QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj06OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm2uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1RMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e1uLa2vLu5trS4urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLWzs764ubi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJO9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y2tbfBvbu8wMO7v8K/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBub69xL/Av8LIvcfGxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7nDvr65wL3DxsLKzsfGvbrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gYFRJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC7wru5tLu7w8PBzdDKxL21vLu5v7m6tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6dsLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PD86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9vsC4yL6roaGhprnBycW4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsC7yKy8rbq4n5ORm6O3tLC0tLW8ub65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u667u5SPztzm4tG4mpKGf52tr66zure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7Cms7ma6OPb1dfVz7qJdWpsmKynr7azsrq1u7u7tbi2sLXEsr68vry5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennauivcurqLXKz8/LmXRrbHKgpKqtrqewrK+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiarrNaOEt5qsXKxqKAhZKIiJ6jqaigpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJU0ROQz04ODc1Ojc8PTo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aXjKx9MlJoVnSvtbGejJqiopuWnaOin56koKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45hZGKArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUlYugY16Gh3RajKOZm5idoaSnpp2en6CcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzYFtecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpSPiG6Hur+jY2eTh5SRjp6joqainZ+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fWV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD07Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODU1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko11lfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZaWmYh6pMfW1Z9PbH+JgIOUmpibq6OhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmpePd5/K2rKyZ0Zmenh/g4F7irWvprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZilnaCak3CGvbJTinV5cWVpamVeUGusuqy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR05HQ0dOPT5MPjU8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqaKsoJKCe4iDeoGQpYdzWktfWklAp8G1ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoV1xRRlVIREpQST9GQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg7Ojk7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKSioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamptJF5jIeHlqOkpohibmuRroBMRLfEv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tLu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oj8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKutsqdzdnlubGyChHuFWVZ5jMCnYW7MxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb6+v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaSalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqG3tZmXb2VmXE1Wg4BwkHpob1+0p2yf08/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoaqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdm5SUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2DrJiLmmlXY1hfZHCAbX6Pck9zm5mAxtDRws/T1tjV1dLLyc7Qy8bN0snS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz9DGx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoaNi45iT1xUXGBRZl5YZVpNand5h9XR0MvQzdPX1tPV0M/S09HJ09HH0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHRyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0f3txa2VUR0lRUEdFPUpQXF91W3PV1NDJzszS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19dXGJtcm5tcXFycXdpT36NalFYS1dPS2BAS1tSbWJ20dLOxs3MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzszQxcfBuLm9xMK9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWlucGZ9i3pmZ1tKVl1jPEFWS2Fpd87NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp2g5GSfWhoVFdmUEJFXFZXXXnKxL/Cv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH+SnY5zZVpbU0FCRU9SU1aRwre4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbW1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWtyiaKSf2ZZUVFTTkA7R0xwoLOusrKysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xurawt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhnanWRj4NtX1NYZF1PRERdlZijpq2qqKqnsqy0r7Gnraarsrq5tcK5ubmvqrS5urPBua/Asb28u7W7x7nDtq2qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DAvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcPGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqeId+b2hcY2xpcXOElJePkp2kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Ozu7ezvK+4ubWyu8Gywa+lqaOrsbOzqL2qq6irrK61tKaorqGksKmzpqeorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG16d3FxaHR/f2hrk5qQjYaYm6SgoJ6jo6WlrJ6bmqOlq7Cvtramr6umqbOrs7mwtbWttrmysLq6sbaloKSgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGFgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmaXZ4dG98g3xSZ42VioqAlJmcopmcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqagqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubqwtry7uquzsrmzvbS3srG1tL+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRtenJud35nPWWMkoaKgpGZmqKbl5qhpKCimp2fmZesrKytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezr6mtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnJwa3J7UDlbfY2GjIWMmJaamZKcnaahnJ2lm5qYqaStrqmaoaG2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpacmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsa+wr6+nqKeyrbG0sLu0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbW1lbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncGlubjkuMEyAiY2HipOYlpqRm5qjoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGtq7WeoJ2VlamhopStsbGfoqOenpmbk4ugk5GTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk7Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhra2EuHytMdYSKhYiOmpOakZeboZ6poqGhoaKgmqeoopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in56XmZOKnZGNkpOVkJiYk5yho5ykoaKVoKKkpZujq6WipKqkq62lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9iaWpiPSs9TG6Ah4OHiJKTm5WVmqSkpqSopKekoJajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvo624paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozo6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNuc1NEUFtgfIJ9iYaOkJmYlJmmpKKqqKWtoaWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgamlmbl9uXGp/eIh/ioqQk5GXo5aapaOiqJuklZ2imZCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW8tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEQ/OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSU1BRVFFTVVFOTUtLU1dXVldXV1daXGFlWV9cbF9eeG+DeoSAi4mLlpuKlZefnqCWo5OemZOKhJeZi3OMgn2NlpWFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6io46JmqCho6SborSvrK+tn5imuKalsKGxrpyxu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraehppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlmYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTk9OT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaV2ltZWRFT2mIeY1+hZWQho6Mm5WalJWUkYyUiH6SiF47Vm57ipOJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6QmJqZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVFJibmNFODd5jYmHdYCNhoCFiJaJlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEiomVhJuNgoSSm5aenZSko6ippaWem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4qUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZlxUYGdXWFBKiHyMgGx3f3t3f4eOfo+Zi454g41+c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFMUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iXlxhVWV+jZKJinNgcnlwc3mDi3iAmJJ+boSNenR5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNiIBtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLS4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeomPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXFxbV1Z3l5u7emtvW3NwaHZzgot1eIiDbGmJj3Zyd2hofoFxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRTWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRVlJQmHpXkF9ob112aWd5dIWEcX2DgXFqlo9ycXpoaJyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2RjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhQRl2lqZdmcW5kdWZrfHt/fHZ/goJ2b5yRcXd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKHlZGdpKeer5WltKmtsa7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRntpdHJybXZmcIGBdnh/fnuIenOelnd8hH+DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQEREP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWTkZfd31xf3F0anWIhXV3hIJ6kYN0nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhJGph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhIeRjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZpV1haYX+He4p4fHl9iox5gISMfJWSf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaUExOV1JRSVBKRE5HQ0pEQ0BEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVV9ed2NiZ2yPj4KPiIuDhoiTg42LmYecnI+fpqKhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc6P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFdaYF3bXp1kpCOnJuZkpmQnJCXmqSao6acpainqLOWqr2qtMbItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5p3en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktQT0lKTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeNfXuTjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWl+iXKMgpWbnaq0sJ2npaejpLCnrbKurqq4r7G8m7HDqrjJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZDRkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLjQ+Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd9i5h/pZumoKe3wLylrsCzqK+8r7S6sryyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZN9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NkFCNzY0MC82Q0hDUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09eip2nnqusuKuvuMXEsbfBurCwvrS1vrG8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCilpuikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6NhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfYqDgouEln14enVmUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVRgX0xST0RBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXY+osa+1ssG3s7fFybe5v7q1s7m4tbyyuLDEX3OwpLGanaq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjqLG0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGNfWWNgamdTWGFWUlVJRUVNSkA+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeoGKgpd+dH16bGVwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0ubHBurW1x8i3tLi0t7ixtbOyrbS1mGN0p5ytcF6irJuXoKKbpJ6qpZSfn5CTjpWYmKiepp+empmDpJ2tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeW2BjWmRjUVxgU1FKQ0FFRkU8QEY/QUhCP0M8OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWlfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGDc3yKg4V7iXSBioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVlZVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrPCrbWvt7myr8LEs663r6+5qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE5QQUJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnKPkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHZscHh+cXpteHNtaYFxbWNqbXB4aXd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstamxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PWzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYVRfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp0hoWKd2x3cH1+f6GenqGMjJiTk4uMk4+VhXmFj5CNi4mIkIZ+gntxfoCBh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuBc3JpcHF6eXJ6vsuafYuxhHZyhHZnYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn52fpqSprreppbKhoaygoq2hprGeiKaak5KRiY6NiIGTiGqVooyZhIGGfpGDg5OXrYuVjZSZjoaSkZ6XqLCioaGlpKnJzc/Iw8zR1dLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVltUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCioCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9goh3f3qGkZWAg253cG12f3Z4fHSGfHpth3Z0b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6Swo6OxnqGknJ+on6Kxm4WdkZGSkIqKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIuakquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdTXFhGR0tJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoSJgYd8eIWWlomOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qcqJ6gq5qhmZidpJ2fq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmYaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycrMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaPdYJ0dYF+dICDb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWm493cGVPZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlZmWlaSblp6VnZKRlqKdmKqVkJCJjJGCi4OIiIGFj5GdmpmIhYuBhZd6iImfl5CIjYmLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsTNytHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzk1NTU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn9zfpKekZ6CkHuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSlI2cmZKTj5WMi5Sem5OflJCNjY+Kfo6NjYqDiJKWmZ6eiIuUkZ2RgYp/pZiIhI2BhYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WcoZudlJF/jIiAmIiAnJJviKiFeqGLfJGNg4iEnH2akImMo6OgkKSvoIqQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmZuOlJWQipGThX+Kh5GMiomclpihoYaSnZWfiomIjZuQg4eOf4KHhqSFjJGymJ2SlZehop+ZkpydqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfW2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Sg25td4t4eX56gXyGe3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXc4qyjYSokoSZk4WZjKKVn5iSiJqeo5OpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZiZjo+TkoaTloN+j4uZh42QqpaWoqGImJ6WmoiOh5eXiYSOjIF/h4+liY6TqJqXk5eZoZmfmZOdm6OztaajvMK+yMXFycjJwsvUzc3UqdLR1tXW2NrU0tnOhXWDa2ZhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX2IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6SdmJCol6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko6GgIWGiJGXk4uKk5KGk5eFg5CPm3OQmLKVlqOgh5uak4+KkIqWmoiKlo2GfYyYnoqQkJyamZOZmJ+UoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjWGNZUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6e22Fhnl8hHiAhIF9cHh8fXxvcox5fYF7eIaLiYaEk6i8ramzvbClrrO0qaOisK2KmrWeo7mllayjl6mtuKako5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieo6uSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46VjIqMlpiRm5mzlpSqnYqblJGMkJGLmJqJkZ2PiomVn6GOlY2XmZ2SnJielKGglJydpq6ooqSzuKvCyMS1ur27xsjIwtChxsnNzcTX1tDK1KNzfWxfXVZiU1FIRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoBzh4d8gYl1gYqDfm19fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO3jKiyrq69q5u6o6itubirp6aioaOjqq+ysaudnKOZm5iXnqKlpZKjua6ov7usrbK5paOnfYiGna28sIKLi4qQg4+DkY56gYaQjI2bh4eNloyKlJaTkJmWm6eZsJmQqpyOmo+RjpWQj5WWjpCgkIiVm6OslZaPlJyelKCdm5ifoJSan6inpKKjsLOmwMbDsLC7tsXFw7/Np8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYWQioFufnuBfnF+gXqUepKUlZiQk5aotMbJwMLMwsO5yL26sKu5u5iytrmywK6lwKOrsLy9qq6ro6Oep6yvtbGqm6CqnKKclp+vs6eMo7q6tcG8q6icsqSjqJSEjqrEw6SCi46Gh4SGlZSMeoOMkI6RoIuLk5COh5efl5KYlJaln66ci6mbjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZqkn5qgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmFk4+BcoB7jX93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprLO8vqqwqqSlo6yuta63tqCfrp+mo5ijs7ypnKi8waO2t6+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjZGPnZ+RjpKKjouTopeWmpSToZ2pnpCkmYuOj4+Vloh8jpWSkaKalKCinLamkJ+XpaSjpZ+eppielZebpaOoqKKyrKi7v8OvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFxZXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6QnY2Wjp6SiYp/iJ6ShHeFf5R+f5CIiZCAlqCarqekmMS+yMTIxtLNzs3LvMK4sLq8tL3Lu8PCt7a8rbS/uryur6ihqai2rq+qsrianqyiqKKdq7e3qqWvvsSxvbmzp6q0s62ulpWlramgkY6SscWnlI58kZV9h5GYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi4+Onohaj5aXkpakmWaZpJ+zpZajlausq6icn6aXmZaYlaKkqKaetaupurzCtKa0tcvBuKq2rLO7uK6ouLq8t4RvcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeolYyQg4alkoiBh4KahIOVkJCTjpqhn6++rqHIvsXFyMfOzs/Syr68trG7u7y/z7bEvri5t7OztrO4tKynnKusuaupqK+wmKOupaikpbXAsKustL7DucC4s6e4tLeyr5WkrbCwpYuTlKCNc8GZfJaZhI6WmouwlZmZlJGRmZikopSempWZp5yaoJ+YioyPlZ1fSpacmpSZpZdUlrCfr52fpZWvr62mm6GmlJOZmI6doKahmbSpqrO8u7ursLLHwLilq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUZNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlXPDpCQ0A9UkVXU3RiVkZIqpeZn6GorpiRl4eKp5aOiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjMzse/u7OvurnAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+uLKywrC3vKyjrrWtuqaImpalm3W+n4SYnI6SmJqLrpagm5qWlJmen6idpp+YmamZoKadl4+MkJ2CbXWSopqVnKKfkK6yoquWqquYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOmqKWmnJytqamNZmlkYlRNTkhJT0pWTD1MRE1JSkBDRDxRVTxBQUJFTzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NntmVzw6PS4uU2FMVkh+ZV5IRqyUm6Gfu66YlJ6LkqqbkZKTiKqNh6KejKOtlKOktse9tMG7wsLIycbCzsjCvrqyr7m1wcPKtsaywby1u6ypra2xpKOZqrW7p6qnrKqdqK+opKurvruorb20t77HvLa1uMCwvcCzqrW2rL+mj6KWkKCfu56Jmp+Zlp2dj7aeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqG1r6Wlk7Ksmqutn5+lpKuSlpWghJCen5yVqKShobO0uratqLWysp2do6Wal5WZqqGeeGRgYmBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6SensOsm5ekl5iom5WZmo6qlpWoppWsrZmhq7fFwbu/uMHCwMjEv83HvL66srC4tL/DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2/sLe3x7e0ubi/sb7BtrSytbC+pJajlZKak62fkKGipKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqylnJezp5qwqaCbq5+ijpqWoIWOoZqckqWkmpersbayq6WqraycmKCgko6QlqmflGlmXGNfUUpIS09NSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57FrKCeq52crZ+Rop6WpKCmqquXt7GjqrO2xcK9wLa/wbzJwr/KyLa4trSxtLS3wsa3v7G4tbq2oKetq62fnp+lpMGloaquoKSprbCipqi9taWxvLe2tsSys7e6vrLDwLe4rbS1taOcpJSRk6CsnpihnKioqqKawqyonautmpqdmKWfvaGcpJeqq6uloJiNmp+SnYiOV3+WnqWhoLmrp5OZt6Ofs6KhnLGYoZCblp6Cj6CXl46io5WQpa6yrKmioqWklZWdmIuPkpOkn4ljZ1xlYk5KS0tPRkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1FTUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6foZiew6elorOgm7Gmkqmjn6Oframrnbyxqay1ssjDwcOzwsO9x8S9xcq9sLG2rrG1sL/FtbqxsLq2rZupsKqrnJ6moajBrZytsZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq2qoqWVlJOiq6Cfn5qnqq6vr7uxpZ+pqZiYl5Kho7igoKORrq+rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco7CboJ2wkaGVmZWbgZKilpCOoKCTi6WssKWmop2gnpKSmpOGi5KNnJ+AZGhdaWdLSk1KU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTU1JOE5kXExFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDt2XV4/W1VfZ3JAODxIlndlQTSfpJ6bn8Kno6mxoKO0qZSxqqaipLKsram7s62wtLTHv8TDtb/EvsrFtsHJwrastamxuKzAxLS4r622uqWZq7Ksq5mhp5itu7ScqLCbrJ+utLKoq7qyp7m0t7K5waq3s8O9tMWnvq6tt7WpqKyhlpWRpaOiopeXpK63rbG0tp+eqKSZlJSTo6C2oqSlla2xsaWopKCdmpmZlZeooJ+Zop6vs6KmjZivmqWtmJugp5OekJaam4aXoJSNkJ2ek4uoqauhp6CanpaNj5mQgoaWiZWfemVrXm1rTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2FdQklTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW/paiurqCptamct6+ro6q0trGwuLewt7e4xbzDx728w8LIwbrCxsK7qralrbuuwcO4uKuusryjla6xrrOXpqiRqrqpoaewnaqgr7Szq6q2tay7rLOyuresubDCur6/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6qfmZaSl6aftqikoqKvsLOrsaaqn5ufn5udpZ2hmJ2jtLCcn5GUppuhqpyWpKKYm4yXmpSWl56UiZGbmZSOqainn6ObmZuTh4+Zi32Ml4aPmmxpbmJub1hRUlpUQUNEVUA7OklBNzpYUGReUFdXRVlfXk1MU05eTEo/WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2VAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKGqr6qisLeopLOyq6Gstb2us7m9u723tsHCv8nDucTDwcG5xb7BubC2qKy3sry/v7Wqr7K4n5esramvmKmpjqe7nqWts5+rorGws6yqtbO1vK2vsbWssLWywLrFt6u9r7G3rK2porGlnqWonqOWj5ifsqmyqamymZ2nm5qUjKCmpLSup6KsrK2wp7KqsKmim56oo56UoZmcqLepmJqTkp+an6Kgkq2hm5uIl5qMnpqdlIuPl5eal6alo6CdlpaWk4CQlYR7j5OEjJdnbXJocXNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUhbX15OTVNYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MT1gVl84KUMzWVVcaEs1jHpmTEClmqCkrLWjrKilrq21qK6yuKansLfFt7G3v8HCtrW6xb7LxLnDwbvAusW4wbqztKyqure7u761q6+xt5mZqKysrJ2tq4+rvZ6rr7GjqZ+xrbOvrraxubaqra+yqLawtLq8yrKqtbSxtLCvp6Gzn5qorJ+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy5o5iUkY+ZnaGZmJWuoqCXg5abj56dmZeRipSTnpqloqOhmZaTkpV7jJCFeo2Lg4uTbG55b3Z9YUZgalpJSFpcPXtKR0U2QWNUaVtNXGFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2srejrLO3ybu1u7zAvrW0t8PAzMe8w724v8DAuMC9sr2uqLq6uLfDt6yusrqWl6evraiksqqUr7ukrLKyp6ejsrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp6fp7Gfo5SbmJSxnqebn6mNqaOdnJWXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVj4+MmZ2imJGZqaWimYaUmJGenJiXl4mXkJeaqJ2koJKWkpCVdoSQhnuGg4SMjG5xeHZ8gFxMZWxcS05jXT5ie0dJOEdoV2VbTF5iTVlaV1RYVWpdUFBIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNxakxFRJGYpK2krK2qpaOwsbOptq+1n6u0uci6rsK9w7izsrXCw87EwMK+tb7BwLu/vbTEqau6sbe4wLywrbS0nqGnsa6mprGlnbG1rKmysKuoqbW6rLWytauzrKqrqaypua6ysMe/uKS5r6mtraanrbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoqpygmpuTpLSZj4qOiJGjoZaPlZ+jl5aHkJWVnpuZlpWImJOVmaedoZ+Nk5GOkHd+j4R8fX6HiopydHN/fn1cU2NuX05ZZ1xGRJZbRzpNblhiW05hYk9WV1ZXVFloXlFTTWNbW1VLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoaivpKais7Ows7SvsKCrrb3Mu67BvcextK60wsPRxMW/wrO/wsO8v7i9xaitt6y0ub3AsayzrqKkp66qqKWwo6mwqq2qsa6urKuzu6e2sLKps6mrpqWkrrqsqrHDubSruampqK2pp7GlqaSjramoop6boqyVpJ2XnpmsnaKnqKGspqOtrLexsKCpoqCqrrCsnZ6nqKmao5iZkKGomIeEj4uLn6GQjY+Yn5OSiImTl6GdlpmWh5eTk5elnJ2djJKQjYl/f4iEe3eAh4WHdHRyiXdsX1lgbmNRc3JcSzuEfEY+V3VYYVlPZFxOVlZVV1FcYl9TUE9oWVdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQU5GlZasp6CpsZynqLC1rLe0raqkq6q9ybyxv7nDr7Gts8TDzc7Dv8C0wMPEusG0ycSsr7eus7rAvrSvr6ynqKqxqaeosaWzrKqvra2xrrKts7uluLOsq66nq6CjnrG4q6qturaktbWkqqesrKqtoKinp7Cxo6aloaGslqqhk5ugpp6koqqjrKKeprG2rKyhpaKaqaquqpyhpaSkmaCZlpCYnpSCg5CJhZ2hjYyQjpySlI6Fj5qlm5OSm4yTkpKUo5qcmouPi4t8hoGCgXp1gYOBf3V4iqKGeGpeYG5mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVUtPaVdWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQ0pJRJaQr6Shqq+XqKettaq1sKqkq6qovMHAubq0vLWmsq/EycvRv8G7uL/Aw7rCusLErrK1srS8wb2zsq+trK2ntqqmra+qt62nsLCusau1qra2p7W3q6ykqamcpJ60s6mopLO0n7Wtoaqoqqisp5+rrKm4tampqqmhqaCtm5GqoZ2gpKOmo6qdnKa0rqekqaKjl6Smp6qcoqSjoJqYoJGPj5mOf4iNh4SenomGjIyRkZOPhYmXo5qOjZuRkpCPkqCYmpeNi4R/dIaCf354dYN/e3h+f4ecj3BxZmdxeFxhdIhqT12YVkhteVVlVlNkUE1WVVVRT1hbYlZJUGpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JbDhSRjuVjK+gpKqrmamjra6ytK+ppa+pqLu/vMGysLmtoravyMfH0MC/vbu8w767xMK/v6+ys7K2vrzCsbK0q7SppbWppa2ysreuoqy0sa+xuau4rqmut6yqnqqroKOhtq2poZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqGop56nm5mpsKminquhoZKhoqOnmJmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJKekpOQjZGdlZePi4aHeHSBgHx0d3mAe3V0e2uCh6R2aV5lbIF1Z4iMfFJWb15LeHNUZFNSX01NU1pnTk1XWWVZR1NpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WUQzj42xoKSlqaOkoqyms7KwqKSwp6q4vsG8sam5qqeusMnGx9DDvsC+ub/Avcm8wbixsLWyury5wLO0vKy5rKO0pqarsLW3saWmubSss7uvvKWtrbarrZypr6SfpKyqqJyeqrKks6iaq6eqpKidoqmnqr2qtLCunamkoK6cmrOjlqWcpaSfpZqaqKulnpqooZuRm6CknZmXqaqSmZqSkIuDj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWTo46UkYuRm5OWh4p/gHF6eX18aHZ8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGFQUllMTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07Rl1AKo2RsJien6ikoqGrpLaxsaSpsKatucG9trGkuayoqLDCyMjMwre9v7W4wbnItsK1tbO1sr25ur22r7m2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6upp6Gpm6OooK28p66wrqGqoqSunp6tppifmqGinJ+bmaOqopqaoqSVlpSfoZablqWsjJ+RkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKOLkpGIkJmQlIGJfXlrfXZ4eGJ6enFvcXR4a4J1a4JnY2dibnOObWJqb2BvQFx5bFVeTlFSS0pNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62hr6+orLjDu7SuoLmvq6i0usfKx7+4wb2vtL+3xLfDs7C6sbLAtru+t6q5uL6qpLWnqKmvrLivp5i5u6OtvrS0oK23taemp7CzoJ6lpqegpJmerKeonqCqr6egppaiqJ+xuJ+ksa+gq6GspJymp6iam5yfo5Wcm5qdqaaWm56okZiTmZ2TmZahqpGbio6Qh32Hf4KOfXyhjY2JeoSOhoyOjYaKk5qOiJWfiZGVgoyXjZJ9hXxzcHxxc3RfeHdpbnFxcGuAdGV6bGdlZGJmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXEZPPVJaZ0gqPzBdXDUolZummJuVrJ6doaOgtqqvo7Szqam5xbezrqC3ra2ssLXFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1p6eqr6qxrqSXu7Wjqrq1r56xuK+ppaevsZuhpKCko6CWm6+loZ6iqK+hoKGSo6Sit7ChprGrn6ujrpidqqWon5ibnaSTmZuanaWpmZubpZWUl5WcjpOYoqmikYqLkIZ6hH6Ei3qOl4qOh3uDiYSKjo+GkJOYjI6VmYuPl36Gl4yQeoF7cHJ3bm9zXnd3ZGxsbGtqhW9ncmlqZWldZHOBYFtrdmlaSn9eW1lOT0tISFNWRzM4Xl9sUEVZVlplTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobapraC7t6WsvcW0sK+jtrCsrK60w8O8s766trCzubi6t7qvrsCzs7mvv8C3rL26taWisqmmqLGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CxpJmepKmonKGfkqSgpLippKeup52koaiToKmioaGZm5yfkpmblp+iqpuamKCUkZWXmo2Tk6SppJCJio+GeoR7hIV8nY2Ki4d7goWIiYqRhpeSkouQlJSNjpR6g5eQi3d+fGx0cmxrc2B3dGhoamdncIdoaGhkZmlqYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1FWFVfYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGhbSldHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequramrMPBuLGso7aup62utr+/vLLBtrCtsra2uLa2raq9s66ysby+t6+8u7Gln7WppKSzpqitnZzAqqekr7OprLW7nqmprLClmJ2pnaakkZilrKGYnaSpoZuhm5afnae1prCqrqCgnZ2hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZiLjpibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeHkYSXlI+Oj5GRkYyTeoOVj4Zzfn5meW9qamtldHNrYmdkZHaBY2VmZmVqamNrcltfWV1sY2FOaVhaYFZKR0hLTVNXPjlebGhIRFZUXVtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpW0xaSlZiZkA6M0JoSCU1mqOgj4yroZaWoJaksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7K4s6mrubGvrrO1urWwuL2spp60qZ+gsKKorZuiv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio98gnOBgYqYhYd9iYqGhouNi5OFlZuTko6PkZaOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gmJmZ2pubGdqamluXWxscnBgVGNpY2ZaSUZNTU9YUVBVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Zk6GaqbGvnri/taC0wbu+urGmt7CnraS3uLe2rLuurKqrt6qzt66msrWyrqmwtbWwsrW5pqiftKecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSVmp+bkJukqququ6CnpKCYmpmdoY9ropaZnHCClZmjgHWSqaeelJSekImYmoCWiqKQeYeUjYNtan93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVFVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qsqqO9xa6pt8K3vbytp7ewpKqit7OxsrC5rKmmrLSlr7Sjqbe1tainq7ayrbSts6Gon7KpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dqKmktrCko6KclpiXl6OIoY6Smoagh5KcoH+lf6aqnpKSmpGIhHN4jY6FiKF2iY1pl4lmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcW+IWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU3MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeWg52rnZiYnZ+qqaeqv8Ousbq8t8C/qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyqK2dqaCwp5+jopifoZqtspOjpaW1vaatp6uqrKiloJ+Yn6ajmZiloqOYnKSolpOim5OTo6WmobikpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytaa7kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFzlHOaoaqQV09XYk9WTkZVW1hRUFONXVdbUUFdRFBORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYunk4GnqZ+XnJ2lrLGosMK9srXAtba+waums6ysqKaus6mutrOmp6W0pae3rZyzsbWrpqSnsK2ssKapnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZuamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5eWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tPWGBcV1Y7TotPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTQuLjUzLysvKC4wLjo2LyckMjAzQi8+O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLG3usGmqLCqrqior66jsLqvo6StsqOpt6eesrKwo6Whqayuq6+mpp2ioa+aoZuWlJaam6yklZqhnrOzoqyco62toJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4OgjoOwdnefcWxsbHyLTqRYSGJimX5jaKZfeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSlxlWVxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YtMC45NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCVh7OmpqGvqaiyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns62jqrSjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUmJ2soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mdoqmbppqcm6Khl5ORkpOcg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFRXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCos6ijm5ydqpWYl5WWk5agqZyZlqetsKmjn4+toqiWnZWboKWgmKGgoaCaoaGnmp6hnpSYmqagnKeVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPy8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKksa2jq7ytprSmp7W6vLK6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CSoaeflZOlqrCmopeTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlZuhnZyllZ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmxl7TCrqiyqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKKkmpKQpq2vpqGWmamgoo6QoZmnpJ+VmaSonZyknqycoZyfjJOfmp2hmZmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkheQjI/OKOemZrBq5e0wq6rrKmmtLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi1q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5ien5CMjKmwsKeel5uopqCMkaOXp6qmlJeop56eoKKtpKGeoYyToZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtTPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGcssCvraurp7ept661v7S6r663tqrAtaipoJulo6Gckampp7SisqetqaCXnKefpKu4naKsmpWYjqOilYydoJuYnJ+Rk5SrtrGomZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOQmKKWoJuWnJahk5ypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYerfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYGZnY214b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5qJueo72hl7LDsK2pqqyxprevtsOwuLCtuK6twLCro6Kdo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn5Ckn5KMnKKel52akZWTr7myrJaYpKinlJCWpJyjrJ2Qn6irnpqfqKKzn6OljqehlKKbnZiVo5iPr5+RlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbZ0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZFpUZmBjXmNRZ2dwbHVDTlFMQzpaTT9LMjsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKieoaLApZa1xLSsqqisqqm5rrDFrbOyrbWmtLisqaGhpZ6gnZmTqqOsqqW1p6afm5Wgo52spLyloKmWk5uQoZuSj6GnoZKdl5SYlbK1t62ZnqSkoouSkaWbpKqblaikpZuZoaimp6SqoZKtnpeknpiXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgZqVlGVeYGJwmYhpcot9hpVna39ydHh9f2JceHSBaFBdboN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtYZmNfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2oqylrqentLGsx6uvsqqzor2wsKWfoqedo5uZmaumrqOktKmkm5iVoJqmrai9p6iklJOalZ+ZkpakqaiQnpGQmJ2ws7+sm6eep6KIk5Gpmqejm5qqoKOZmqOnrKOgrKObsZuUp6CXlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNh5iWjoqMmJaHlJWLhJOUkomOk5SZlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWLioFxgnh5dnWJf3yJanOBdIN1ZXZ9d2tvem1fZF1waE1ZWmZqX1dab3ltbWZVT0ZSOU5ZTVJPKCs6S0I2MzU9QEE6OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6Gzo8ChpLKyt6CppbKnpa+0qseqrK+ks6TAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6qo5WRmpeemJKToZ6eoqeTkpqpqLPEsJqrnaufj5aWqJ2qnJyfq5igmpuipK+noqaooK+Yl6edmZmgnp2cr6CcoKWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYGZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GBiWt1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWt7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLShubC/rKuvsrGgqqeyraKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52ZmbClrb6gq6KQkJ2ZmZSRlaGcl6idhJ6srKO0yLSgqqSrl5WXmqadqJqeo6qTnp+doKqvqqakrKOvm5+goJiknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpF/iIJtd4F4f3NueYR0domHjoN8aodZXmx1ZV1ziWlre3BrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2loLq8uq+stLGqpaitrrCmraywu7CopqOsrbCerJafo52imZmmqpyto6WnqLKunpSij6KvpbW4pa2ijo2ZoJmTkpugmZmllnylr6OotcW4paKnr56clJ6inqOboqiokZ6gnaGqsKuspKuhqpunn6efq5agm6Wvo5abqJWfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558lpiJncC9gZadnYycwcF8gnyTjZrDwH5spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUYmdgeGRfZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6iwrq2lsrOuqaSlpa+rnqqYmqKfnJqqpqGdq6KkqKSktKScopKlrau3s6etopGQmJylkpCgoZicn52Ip62lrK7BwLGhqa6plpKenaGZoaKpo5KgoJ2erK+rrqekpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1leod2dmt8h259hZCRfm2DkGBxbHBoYF95ZVxxZ2pkZ2BSVFJXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrpbKqq6qiq6auqZ+mm5mlmJyir5+gn6ino6WgnrCrmp2Vpq2rsKqoq5+UkZqfpJKPn6WXnqejn6+mrbGpwMezqKmxrpaSnZuhl5+oqZ6UoJ+dna2wqayrnKiopaKrkquylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYudfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmWFb2F3bnJviYqSjoNuk5JmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOfnKKOo6KirK62rqixpaippq2qqqeho52ZopWfpaufoaWfqKiinp2wrJealqmnrquopqeel5SZo6GSlKGtm52no6+tpa62q7rOsa2mrquWlZydopierauclqCZnZ+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJCUoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoGWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6prKKnpamqqqikpqCbpJ6dpqeno5yrmaKsoaOfr6GdmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23ybK1qquplpGcnKKYn6WznJmglJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSpqZCSm42AnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ6SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraykopuyuKyqoKWaqKSpq6qnn6ammKqjoK+rnqWgrJqeqaWdp7WeopeTqaq1saybpJyglI+lrJGanKejoaqnrqKmqKqxtcOys6qsqJOJl5ykmqGjrqWXoZWZnKWmrZyxnq6pp5+rorasoLC4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycICaYLx9UlV0jpKjlnt+lJOMdntzh4BxXW1ueHJqgm9bZF9qb2NlXUtNUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SquKquoJugrLKzpZ6glaWtra2qp5ymp5ujqKGzr6Opp7KgmKiklKK1oqKVl6KptLijm6Gco5KPobGZnpynpqGisK6dpqmjtrPFsK2prKmRh5Ccp5yipJyllp6YmZqmpaucsaKvpaaYr6S7raG1taycnLOwtq+wpJWcrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF+n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq29vry5tJ6Wp6SttaGhmJWjp6atq6yZpqOfpqGhtqijqaewo5Sro46lraOdkJmaqrOzpJyjnKiRlJeun6Cep6SdqJ22mqOrpLatxLCpq6mijISOnKKgpqKVmZmcmZuZp6aoma2or6Olm6ymvayUvK+snaGusLepsKSYp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGpwhpldYFuMoG2VkaaZgpWPmo58fISagGtugGN/dG6AemBnZnFvaWhnQ1phWz1LVTNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcG2wLOemqygrbelo46bpKKgsLCrn6Wgnq2Zn7mho6ugr6maraGQq6iklombkK2wrKaepZutl5iPrKGhnaWhmqWdr5miqae3qsGvpaiknouAjZuan6aekpSYmpSbmqalppuqrK2kpJ6pqL6llsGqqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIWmmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ9Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1ia2hybmdmZVBVZFxBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqp+koZ62maG0qKqsnrCtnqucla+noY6Im4+vq6imoaWZrpKYj6iZop2ln5qko6aaoaOqs6q9r6Sonp2OfYublaCgmY+RmZuSmpipoKOaqa6opaWipKi6np/EpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRfta9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxmbWtjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BQ0VHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraalsqadi5ilwKq4sqiiwKeos52fsp26qJ+ur6WmlZSwq5eMgpuRrqWirKCjnKqfl4qjk6eep5yboamkmaCirK6quq2oo5uXknyImZGlm5KOkJeZj5iTqZqhmaqpoaqnoKOqup2ow6KfrKGpsLKoraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqikm5ivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGhtY0tkWEprWjtRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREZIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XLvrern8GtrqSiqa2guqOkrqytpY2WrqmPi4WWlqyepqqgnaSjoJGLpJOnmamal6Sropefp6aosLurrJqbkpJ8hJeNpZiNkZCYlI6YlaiVoJmpo5uwpp2iq7mfr7+no7Gkqq6vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+WhoGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkXRrkXdyjHh4fXpqbWZlcGVVYFlAaltIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xaV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn6C1sZCNrMi+xru6q6Omn52nn7KqpLennam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiaoba7p6qZmpCNfIGVi6CUipWRlpCPlJemkaCbqaCctaOdpqq2p67AraK1pK2trqqnprC2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5GXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoaOkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9dJd0fIyAc3yAam9mX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY1ODk9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQkJ2ktb2wra2jpJt8n6SzpaaxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqpqpjZqpkJ+5tqSlmZyNiHmBk4uak4qUkZOQjZKXo42fn6ien7iif4OutaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKmraqjZZ2fknN5mpdxgZmpmG1/o6iKZZymnZKXmJaMk52Rhp6bkZaEk4iQkJKJhXdqjoZ2hXB6hX9/YGiHipORilp1lJBnaI+Pc3yonJxme5uKhXqZaoaMhHB6gGtxZmB3cGxraVxmZmJjcVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ipq2lkpWrt7Gzp5usqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56Mq5milaehnY6Xkp2Fdq2PiaecqpKZpIqcu7OnoJmYi4h1d5KNlpOJk5GQlIyQlKGPnKGnmZyxlYGMm7Scs4ySjbmln32nonmgrLR/jY2lnoOLhpCxqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qHnIGXp4OCe52zeoqGoZialZiWgpGXl4SbmmN6h5GFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjoeGmmuQjodseXxycWhmeXBqbGtcZWxqZ3VdXklUTFJARTYuW1VVNykhMDk+Pjc0MzQ2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWVFIOUVMOz5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqapppmTr8nAsqKXqKq3n5GFn62cp6KgjpC+npqNn5qgkH2GjpmXh6ucopagoZGNk4qFgJKnjYejnqWVmZ6HoLqxp56bko6FcHaQiZWQipSPj5uLj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIugnaWnkpjCgH+riJihcp6AmqV+l4WVs4GhfaGUoZCYl4GPlJyLmZKMfYWTh46WkoqDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhZqBj5GJjJpxkJWGanl2fHhoaXZxaGhsXmRwbWduWWdHXVFNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYl5qbVxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6ealaCjpaylmKasuaSwgaKpnaaenYqUvJqTjaGSno96hJaWkYermZubmqKFjox3mpyPn5CIn6WcmJqZiKO5raSZnI2MfmJtj4qTkI2QjI2XjJCSoI+UoKCZoad+oaeHrZ2fla2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZduX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm52dGxqcF9rcW5sallpT11YRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eY3ZgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgY2RjYWNqa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6jmZihoqWtrqGesLakqZOioaCnnJqOmbSakIuejJWLdYGUko2Kp5WVmZ6ffpOFhaylh5uQi5qqmZubkommsaehlZqIiYBpboiHi46OiYuNkouQk6OMlJ+fm6Gkf5OBj6Kgk6B2nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZq0l3N9mJ+zdXRcnrKDa2NwdXhyaXBZa210c2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tK2soJqinaSkpq+dnLOvrZSZopuhpZqblZ6rm4uIknmLhXGBlo6KkKCPkpSemH2Rio6ooYeXjoqSpJWdm42Mqailno+Xh4R+anuGfn2PjYKLkJCJj5Shg5een5yfnouJd5yYoYyfcaGKhqmHmqONlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfnNpdKuDn4N0qmiVml2bhXaFnmeqa4C4Zlyob4GcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRb6iaXql/ebxsf6pcjoRdtGhdb3J7eGxqXHFrenpkYGdYYkJRRk83V0RSbzVLW1tfTlpEQDE1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlYl5iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGwrJ6mnJypoJ+vnJ6yqa6fmKWcoaCZl5ago5mGiY1qiYBye5eIi5aWg5GUmZB6i4SVpJyKlY+GjZ+Tnp2JkKmjoJqMkoqAgGmBhnh/lox6iI6OiI+Wm3+Top6foJOYcmifiZ6Oi3CSjICphpedoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXlVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWR2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mysqmao4ycrJydqpWiraWjqZCgn52bmpaYoZ2WiIeJd4aCb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGcho+qnJuVi4uKfINshIVxgaGLeIWNiIeTmZZ8k6OfnaKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkX+jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn2Gm3B7e5hsnH14mHNuqaRnYWZ6coGFbGhmZW93eGlhY1NcZ1JSYkhYSlVhWFRcZmtcZVFFQ0tNSktCS0U4T0BRTlhTWU9TUWBmZWpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiGe3B9hGh9j4OVm4F3kY6PiW9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAboGfhneAkoaImaOXepSiopmfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpOYi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtueHmYapp8dplzUUV9s19qd2x6iGdraGN1dnFvV19UWWlRU2lKV01ZVFZeaWxvVmdXTUtBSk1LSEtPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq+1oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIJphIWRg4yFnY16jYyXp5SEmKqYjJGLgol6gH2LeHCQoYZ5gpWHiZaglX+UpKablZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11b4hiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallrVlFSRlZdTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnYnBnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafjICYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJmbc3WJfpB7ZYOGlIqJlZqCfImImKiSgaOtkYaQi4KKfoCAjnJpj6aEfYeTjYmYoI+Hk6mlnIimeJWbfqWIloqxl52Pgq6WnqR2k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZuffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3irkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66MtnV4vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlcYFtndWVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkZG5zZFJrZ2hvbHJqZmlhX15cYWtibGx6b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqDmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Zk3R0hnKRg25/i5GHhZSPfXyDh5mnj4Cnp4+BjomFlXaCh5JubIupgIOLlI6JnJ+JjJOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJidoIN7fYlrjIVbeXlyenFpbn6SinKAdYGPlJRxh4SDZYx/YIGAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWMp5l9dHuVaomIcIF2fYd3bm5pjXR6fJh4hVxsWHmPaW94c3NweHhwXWyHb2poV1tgV11ma2RXY1VfUmBweXlta3dnamtrd31yc3VzYW92YnR7gnh1eYJ2f4CAgXmLhYN+e25/bGR5bl5WbmdpdWt4amlpZVxgWmNpZWxxdG5aW2JsZGxseW5obG9hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90coRxlYV7fJGLhoaQhXl+gImbpY58qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIyapp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xpXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqWThGWLjYNud4uEcYaPenFoaWZ9hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x+c3x5dWRudWhtfH52enx7eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGptYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4SGioF7gYWNnKGRg6iiiHiOl4mVioucl4SDea2CkZialYqenYiIoKmeoaGjioeTm5yimZWpoKaknpGahZOLeXaMjYOnfn+SkJOUnbKmm5WfkI2xkpeDpIuMlJqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yRiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6jj4KEjIaCjJCMfYeMi5GEem6Fhn56mWtzaWF0i3F+e3d3cHd1gl1eb4dobmFfWl1dU2lxVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBeH99f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZ3JxbVZebHRtaHl6cWdpa2SMh5y4npahoJeUmJmUmKSgnnyAmqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRzipCGkpGLnJF9jXqqhI6TmJePnJaHhpuknqGZnIWCkpqZmI+Zpp+knJuPlX6Oh3R6hY2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2LiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOQg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8e3FweoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJugIJ9b2lsbmheeoBofn13dnd1fHhdYHF+bnVhZFtdX1JnblRmXF5ia2l3e39ybG1ka2pogX9sdIJsbXVwenCGeW6HgHaCgH2FdnGCjYh+e3x8f3yCi2Boe2p1aWmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop6SkZWYipqfn597eZ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaFh32Qg5GdnZOKqZ2BcYuLjJKGoKGJhYx8p5GJkJOYlJaTeIyinp+dlZh+gJCamJKLmqKgopiVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakYmSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKNf4OGh49peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouBlKOSioSPeoaGh4R2g4SJiXxodH6BenxybWxoX35zaX12dnV+c4FrX2F0d3F4ZWRZX19Sa2lWZlpgYWhqd3qCcmdsZGxoZoCBa25+aG9ybH95h3tsjIFzgYF+gnR2go2Gf3x7f4F+f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgY2ji4malnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gcf3CLgZGThaWbiI2Jg6aVhZOMl5iSkneRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4VxiJSAkoJsiYSCgYqFZnZve4WRmIx8kniLh3t/hnt6cH13iIR4go6HiZaflIGCinaIg4OCd3yDiod4Ynp6f3V/eGhtZmJ/amt4dHV3fnJ9ZGRhc251c25hWmFfW21lU2RZYWFpa3Z6h3Jja2NtZmh9gmxpdWlucGmAfYJ6bpCGcn+Dg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXuYnoyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5aZjqWjmYBzh3uTkommj4yOipKgkYSSkJWXkYuBjpeempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaThJV4cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgoqSoY94g4F0iYd9gHR1gomFcWN8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGplamNod4duZ21pa21ogX17eG+QiHOAg4V9dIGGiXuDfXqChH19jnJ5inh4bWyHa2hfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ8gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnpSnnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6Jh4uRm5KOjIxthJCPkYiemaGglpSIlY9shpeCZYSYjpN6iYSQinCWm5Sjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+Gko+TcXWBfIKDiX1mcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLk6aLeoZ7fYqEd35xcIGHhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtRWFllY2dxcoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZvjoV0gYKDfHWCiIZ4hXx4hIV6f4l3fot7e3N4gmprX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoaabhouLgY+ch5OddoKslpOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26KdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlZ6ZopaYeYp/gIyInJ2Kj4aSmJaFiZWakJaLi4uNi5uJjY+CbYmLkJCJnJahm5aThJaGaIKhgWWEm4mQfouDi4F3k5mTn5KRiYiUjH59jpd7kIyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYN6Z3NudYCZjnqHhHmTkHl1h3Nvh3qEiniJhICGjJmhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXFrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJWThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyhHuDooSUg5aUmZ2Tm3mSe4OMkqOZk46JlZmShIeXmoyTioiNjoacg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPj4yLj4x3epGQeo6KjJKWjHyIfIBrdmtva2xte39hen6QmIJ3e4J4g419emh0bHOGlYp9h4V7ko5xeYNvdot5h4t4h3x/iY6cm4N7enaBinx2cGpsgoR7YXlxb21zdFZfcGNyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hoB1dn6MeXuFgXiIg3OGhX+MjIN7epR4ZnFrg2CIfW9va3pgam51f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHNSTYLfyJLWkntwdYV3haKElXiWkpqdkZp8lHOFkJ6hkpOQiZOclIZ/l5aIjI2HkIyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4ehhJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXt/bXxlcm9rbXt6XIF6kZCBe36AgIePe3tpc2pzio6IgIWEfJSKbH5+bX+JfYqGe4N4f4ySmJiJfHV3g494cm1ncYCFbmt1cGprdm5UX3BlcFpgbXN5aGxrY2d5c3FxZGB4YWBWbGBfd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ+i3N/hn97iX9yiYiCkIqHfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e413c3eKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4VwbW9/c2VleXF9bXl9amhrY6Sawdyu8KBybHaFd4alh5NvmJKXopacgpJyhouil4iNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNm5qYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLj4mOi4qEiW17lYF9iIWJkY+GdoV9fmt9ZHh2a295c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYGCf4qVhGuAdW2Gj4COgnyBeH2Nk5CXj3Ryd4eMdXNxZ3V6hGN1bnFja3doU2FyaGxWYG91emFzZGBpf3Fzb1tkc2FiV25bXnlOTU1lZ2Jed3SKblxdZXlfYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol7dIuJiJaGi39+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYeMaXeAinJ/nIaYp5yjkoR9cYyUeHmMnoWGoY2PfJaNgJqIhHtzeHB0anCCbGptfXVfYXl3e3F1e2dgZHzr2rXJw9yHcmx0g3eLnYuPa5qRkZ6WlIKJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYODiY6NgnGGfn9xd2h2c2p1eGxajX2ShIZ+goWChYuDd2Fya4eBjomAfn6Qj3xtgWt3hI2EkIF6gHt9jpCOlIdtcHmMhXRrcWtyeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGFdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5X15kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WCfX+Id3aKho+YgYyCe5N1bHd2eXiTdG54e31YeoZxf29neHeSgmR2hoZwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lnbXh4XGB5e3txcYBpYWdhf9W2j5Gmd25xeH1ylJKOiWybkIqdk4yHe2mHi5iGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDenCHgJWZjpOSgId0goR0gX6IkZuehpWPn36IYn+Th4WJhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46CkIGGf32GgIWJgHBfcW+Ee42KgHt+kId6cINleYGIhYqBeoR8fZGMj5GCbW55i351bW5qbHx/ZGlsa1pud1lTanNpYlFjc3htY2ZeWmuFb3VjXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BbY2x3ZWVdXVpsbWNtanR3h39xcH98fXR4hniFgn2AiHV5iYGSlXyIhnaIgG94eXuDk29ue4F3XoN/dIJtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIuOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB+ZWNnZ1edj19ydJe+xYV4cpaLkYB0mY2HnpSNiXNqiI+VgHuUi4GEm4x8ioZ9fIiMfpKHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloWSjZ2AiGZ9k4KBhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCjIB6g4KEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhomEgXeCen6Uio6LfG1reoh8dnRvaGh+eGVdcmNZcXRUVG9zaWJOaHV5Z2FeXVhwgXB1WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4KDcW9+e390dYN6g4J8goZ2fomBlpB4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfYx2anmZj4CDi4OWmIp5j5ZveXNxbGpkYHR7aV9mcntbYXN9emZwemFlZI6xsndLY1ql29KYc3yTjZJ6gJeNhpqSjYdvbIWSkXl5k4aAhJmKfIeAeXiIioOUf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5OJko+UhYhwepKEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2HhIx9eHmBhXuDa1xvfHJ/hoOIfISHeohxgG1vgoWNgoJxg3d/loqMgnZsbH2EfnZ6ZWhqf3JhWnhcWnJuT1hydGdgS253dWJeXFtZdn90cFhnXmdrcmBvT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/iG9sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fm9yfHuTcG+Bf3hnkYqCoZidkoOGZ4eEcGd6l4p/gIWCmoqCfI2NaXhybGxmX2Fvem5fY3B5XWRsg3pgcHZfZGXV676LMzo+jI+Ac3qHi5GPeIWZjoCUj41/bm2FjIt1fI9/hYKViXyDeG52hoWClXZth4RrdHt1ZXmDhKeMg46LgnxtfnJ0gniEmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3dheYSCcmRxaX9udnJ1g52NgoGHgHR2foBzgXBba3xzd4iBiXqGf3yIeHlwaoaCjoKIcIB3fZOIiX1zbWp1gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXFeXFtaXXaAdmpaYltoZm9kak5YZ1I+X2ZcXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugHt9gX+Ce3aCgoyThXCAi254fYB7e4iTiYBpe35qdHxyhntzd35/jHp4hH58a4uMg5udloyCgG2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGJsdWFocIl6YXNzXmJkm6CQbl02W7C2dWuBi3+UiHeImYh1kIyKd3BthYKGdHmJeIl9k4h6f3NndYd9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8j4pxfH6GfGl+bWuAe3lqeneCh4FyX3eCfnJkcmh2g251fIaWk4J+g4FweHp8dX9tV219dXOJgIV2hnWBiXp3cmyHf45/g3F9e3yQhod5bW1obIKBdG5caGZ1clJcfE9dcl1PXHNwZFZLdHlrWFpZWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin19cH9+fIF/gnt3gICKjIRxe4dvcneDf3uJjY+Ean57bnh5dot3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWKknl+fIKSgIB+i4NwcnBjZl5YZ19wcGBhaHFmam+JdGFzb1thY2p2e3+/nailyrlyh4Z0lX56iZWEdZKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeH+SaHGDdmZ2dWNqfISInoJ/fo6NfHF9coJ3fY+OgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9Z2B3h31ranRofIFqdoGNkpZ/fH9/cn13fHV/YlV1e3Fyh4GBe4Jwhol3d29ugYCLfXx3fHpzjISAdGdwZ2uIgXFvXWhjdG9MZndNX29WVVp0bmJRUHV5Y1NYWF1icoN0XWJcaWVlZGxlUVxxSURlYlxkcl9deGhVV1Z4XltmbmlXbF5hamdlb25pcHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHeDc253goJ+iYuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWHjZF6f4B8ioaEd4+AZ3BuYGVcWGVabnNhYWFxbWxoiW5gc2lYXmNtgHep2qnIh4izc4t6cY93fYmRgnuUi4B1dHV9dn9vcH9uhXSUhnh1bGB5gHiHjWRxgm5ndW1bbX2BkJOAgHiSkXx3emyFc32PioNylYqRj4iGhnt/hm51d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y358aHWHj46XfXaBd3KAe31ugFpWcXxvc4GFfX93a4iGc3hqc36Cgnx5e3d6cYl/enJmcmRsi4Nsc1pqYHZmSW9vTV1jWFdWeW5iUFN1d1pRVlheYXOFcF1hY25lZF5vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn93eH13gYSBfHV9g4iIg29xf3VxdX6FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXFmV1xja398ys6HuqJrbm+MbnOGc36GjIB7koV6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZHmAeGl1eWeCd2h1iIyPln5ziGtwf4B5bn1dV298bHJ9iHqAbW6JgHB2ZnZ+f36AdHpveXKFendwZHFgbYyBa3JXa195XUlwbE5YVl9UVXxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZZHFIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6UinV/e3h+eYOIgHV0f4aFjoNwb3t4d3V6hoWGjIZ6fH91i399hoSEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSi3CFhYJ6g3VjbmpZYFpdXlRoc2VhWWRycmeBcmFrZVdaX2l/eL6ue6C3bmN1iGl2fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV/cJmScH92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNh5eAcYxobHuDdW11YlttempyeYl6gGV0hn1tcGd0fXZ9fnB6anl5f3d2b2RrYGyKfWxtVWpgeFZMbG1QU1BoTll9aGJPVXZsTVFUVV9od4RnXmFxaWdgV2pdXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312dIKIgJWDbnN5e3tzc4WGiIiEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dqdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1aXFtUZXFlX1hjc3VpdnBlZWNXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bXmIfGdsd2ZqZFVXc3COpnyEe3aWj3N7cXp4bHl5j4N1l3yIhoSHhH11cXNtaHVdbWlgbHVkZ2dpem97cllngXZ1aHCAeIJ2YneFi32Wgm+MbG58gXFmc2VganhmcHWIeXxhdIN2aWtwc3lveXhye2V9fX12dW1iZGBshnxsalVpYnJUTGtsUE1PcEhefGZhTlZ1ZUtPU1hibHh/Zl5nc2tlYFdkWGNyXkxMbFhkYlVUVnRXTVl3ZVpfbGFcW2RlX3ZnbWJwanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdnSRgHyBlY6BhYR8foyGen6Adnqjpop5iYaFbHV9fHaEg417b4ZzeoV9goN1b2ppZVZdW1taU2NvZVtZYXR7amhtaGBhWF5aaYBpbG+AaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnhuaW9mZl1VWG9oj6h2gXp8kI14dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNydGpvgX56eGJ3hYV5kYZ0iXNwen9yY3FoW211ZG9xhnp3YXJ/cGdpd3Nxa3d2c3Vignl8dXRvY2JhbHx8a2tVaWJnVExuaVBIU2tGYnlmYk1Ucl5KTlVaZm14e2ZfbnJqZF1WYVZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZmB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4Rxc3R+enZ0hYiQfoF9kWxzlYF8g5+Ff4d9gX+GgoCKe3aEq59/eoiIhWxxgnt2gYCCdW+Ibn2AdIqAanBuZWRYX1paWlVia2dcWl91gmlebWxcYVdbXGuBZXJ0fWprXm14d2l2eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCnbn53gIuNeXBue2V3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX2x1ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB5c3Z+dGFwbFhwcWFub4J6c2NxgGxhbHluaWh5eHNwZIRzeHhzb2NgY2xzfWlrVGheX1VMdWRRSFZiSGN3ZmJMVHFZS01YWWlsd3tlZW5yZ2NaWF5ZeGdVSl1kWGlZWUlXZlBJY3lbXl9tW15dYmRef2lqYG90eW1vbnaDl3lygYB9f4mMhn52doZ4hox9c3V1gnl6eoKMjn1/hYlqdJeBe4udfn6GeoB7fnyGiXNxj62Me3yHj35mcYl7dH59d3Nwhmx8fm2QemNwcGJlXmVWWllXZGZsYF1ddIVoWHBtW15YWlxse2Nxd3ZuY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3VmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpGh4dIKFkHdsbXhmdmx7g3l0h3KBeX15gGlmd21hZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOEk4CJhIl7d3BzfXJheGNZbm5gbm9/enJlcYBkXm11aGNmd3pybG2Bc3F7cXBhXWRsbnxlaVNnWVpVTnpgUktaWUhjdWRhSlVuVUtNWldqbXN7ZGxtdGNhWVpcYnhdVExkXllqVFdIWWFOSGt3WV9hblxcX2JjXIVpaGJueHptb2p2gZB5bYJ+gIGSiISBd3WJdIuGdHJ2doF4fX1+jI+Bf5N+cHiWg32Zk3mAgXd5fn9ziIRzcJmhe3t/iZV5ZXWJenN5d2x1cH9seXxwknNecG9haGJsVFtaV2lkbmZcXHKJZVNybltaWVdgbHZjanVra19bb3VybnV1dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fXCAXGFjXlNaYVxkkp5lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmJbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiICGdnRrcHxsZndXW2lsYW9wfndzZW99W2BvcGJeaXB9a2pyfXBvdmluX1pka2x6YWZTZlVYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhXFpYWm1xWFNRZ1dXalRVRlpdT0lzdllgY25jWWFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG6PhnFudnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBc3+BcIeDdm+il3N7hoyHe2Z3i29ufHBneXJ7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21dVlhVZmlzaGN1ZWVeW3B3b3F2dnpsiH1/fYh3j3NjZGtvYVxubWNzeIdrWlRWYWJ2e3tvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFteV2JkWWJ1ZVVgYW1kYXFdXH5vaGlzcXRxdXdsbYWVg4p9hnJzZ298b3FvUlplaWRvcX50cmJsdVVicWpaXm5ke2RrdHtwcXFobF5YY2lqeF5lU2RVV1FWb1hSV1RQSGVzYGJGWGtPSVhUV25pZXxpbHlrYlddVlx1ZVRTWGlSWmdVVElbWlBOeXdbX2VtaVpiYV9ej25iZ2t5dm5vaXZ2f35sg4B9hph7f4eBin9rk4hyZ3OAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2lUYF9VZ2BtcFxebo5oTWlsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7f3ecenlrYWVsbV5gb2plcXl+Z1pVV19rdnp5boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKfIhucWZwe2xxbGFYX2dmbXF/cnJeaWxTZXBkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT1xPUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVX1VedlxVU2FoT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHFzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPiJGbhIB7jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp8fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fX1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJOTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6PjYyNjY2Oj4+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4V3ZWdmZmZoXENEREREQ0dkaGdnZ2dna29ubW5ucUorLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyOLhodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoKCg3JdX19fX2FSNDU1NTU0OVxgX19fX19lZ2dnZ2dqPBgcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYqKioqKiomFg4ODg4ODhYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5CNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo2NjY2NjY6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYmJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd3eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWHjYmQiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z3e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMiY+Hjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEioyIjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjYuNjI+Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgICAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqLh4eJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Pj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj5CQkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhYWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkVFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BAQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BAQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtAPz08PTw8QD09PDw+Oz08PT5BQEJBQEBAQkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnl7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4+Pj09Nzk/PT0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09Pk5TVVJMQ0BAPz5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFHZmhsaGFfT0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJSVdqamhpaGZnT0RHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NU213cGltb3FlS0pJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1Ucnh4cm5vb2xNR0lHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpISUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNSlt3eoJxbm1tbEtDQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHJydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SkpHW2doamZpc3pxQz07OjxBQUA+PDk5ODw8PDs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVZkamxhZWx4gGU3OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYplYm9wbGhrcW14UTM4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk4NjY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hxdXZwcHVwam5LNDg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAgICAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoh2eHd2eHJtbUo4Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjYJ1eHt4cnFqSEFBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjH94e3p6a1dMSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkRGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ6Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH55endZTlNNS0tJSkpKSUVEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyOiXp6dV1RVE9MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMjI2NhHl6dF5RUE5OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyNdnZ4bVRTUE1MSUdESEtITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5/ZGdtWVhVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VEZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvYWNvZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gYCAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmpZPltbWlVSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9dHNbXl5dVFVTV1dWW1t1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUU9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIqAal1dXltWV1VYVFNYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BOTUtKRUM/QDtQUFpaW1NTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gX1gVVlbVlRXVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6alhbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpwc1pOT1FRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1ZVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFgUEhCRUVERERBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl1cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQz08PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBQTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVFQkJDPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSUNGPzo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn59e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTUtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRUNBOz08PDo9RzY2NzdEbXB0dnl7e318fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3t7fXt8e3l8ent+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFdXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEZDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUlBST1NPT1BMTU9NTE1NTk9OW1dLTVFPR0lIQ0lKTExLRkZGRT9CQz48Qkc/Qj9BZHBzdnp6e3t8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0pGREhIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hJR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pFSUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtMSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRkdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDRUVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0lISU9SUlNOUmZmZnJvc3h2e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NFR0lJR01RSkZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09NT05PT05KSklMUlVVU09XZGBgbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86Pj1AQj5AQURHSkZJRklIRkZHRENCQUFGRkNCQkNERUVHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MT05PT01OT0tLS09VV1ZVU1hfXlxpYW5qbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJra3JNR0dGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtJUU1KS0hISUVGSEhFQ0lKSUtMS1BTTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWNqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERkNERkVGSkVFSUdDR0hGSEdFQ0ZLSkhOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhISElEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tJTUtKS0xITEtMS0pOS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVtdXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QkFGQ0VFRUlGRkVHRkdIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTVBMUFBRVVZXT0tWVVRSU1FSTE9SUlFWWlpdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2Zrb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTVRVVFJRUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ2xvc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRTw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdjaGhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxIS0xLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkI/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpKTlBPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFREVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUUtHS0pKTkpISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjY2dgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXV0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFpQSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlWXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkNHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQEhGS0lLTEpMSkhGRElGREZHRUZKSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdJS0pKSURGS0tLRUZJSk5LTktITE5HR0U+R0dLSUtMSktLSUdESURDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdIRkdISEZHSUdIR0hLSUxEREtLTk1MS0hKSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19jaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0tJSUdESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYWZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0pMS0lKR0VKTlFRTk9PTU5MTUhLQURCQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBgZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUEhLS0tLTk1VTk9KSktHR0tQU1NOUE9OT05OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYF9hYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTR0pPSklPTVJQTE1MTE9SVVJPT0lLTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZlteYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01PU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdsd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVMTUdKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUFRQUFBRS0hneGxjeHJtW0xOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Jydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWFXbkxxcF5GaHlXdlRLaHl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ3VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NcWmRcYW1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWW11cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNTWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFNaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xaWllYV1xaXFtgXl9bXl5hYF9iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WW15qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFpZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltZWlNPU1FWVlZUT1dSUlpSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFlbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVltYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllUV1RXW1paW1lYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXVVSWFdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFphZWJmZmVeYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZVWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VYWFtaX2BcX1lZXFxdXl9cW11ZW2BhXmBkY2RlZWViWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fW1peXV5eYV1bW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFddXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZWZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVNWFdcaGlraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3p6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7enp7fHt7fHx9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPTxL2+v76+wKKKjIyNjY6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OXTzMzMzMzPqo2Pj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDg4KCgoKCgoJ+fH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5eXl5eXl5ent7e3x8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18ent4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXt5e3h8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9enl7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGBfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIioiGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoKBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHN0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcXBxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcm9vbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJwcHBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXBufIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxb3KYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJh4eJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgIGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQioqKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJudnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4OEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgIGBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOPlZiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4eFhoaGh4iRk5GQjpCOkZGMiYiFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIiHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4F/f3+BgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4ODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4OChISFhIODg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoODgYucmqGaioKCgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGJkpCMlqOjj4GCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhYWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgpOUlpiSl56ciYGCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SEi5mUmpmXlpWShISEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhISRlYOJlpiWlZSIhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhZ2TgYGYmZiYlouFhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hYWIoaCbm5+eko2QioeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAiJqgmpqjopuMgYyKiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uUoZeWmZ+fm5iLi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgoODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGVk5CXmJOYmpeNh4eHiIeHiYeHhoiHhomJhIOEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKDg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCRjo+QjpOYmYqDhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoWQjYyPlJeUhICCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp7e4iPjY2Pj4Z/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fH1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4uPjZCGfn5+fn9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf31+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIp/f39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g5CNlYyBgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7h4iUlYSDgYKDgYCCgIKBgYOCg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goeRhIOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp9gYd/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSMgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp6e3+CgIGBg4KAfn1/f3uIkXx8jpaAfX5/goaKhYODhIOCg4yJf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4ODhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4GBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgYCAfX59fn9+i4SBh359fHx/foKCf318fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX59fXx7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn5/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7fHt7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX1+fXx7e3t8e3x8e3p7e3p6ent+fYKGiIeIioqLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCCg4OBgICBgYCBf4CBgoF/f35/fn6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x7fXx7ent7eXp6eXp7fn+Dg4SIiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYCBf3+Af4CBf4CAgYKBgYSDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enp5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgYCAgoSBf36Bf31+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fn6Afn1+foCAfoF+f4B/f3+Af31/f39+f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOEg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX2AgH+BgIGBgICAgYF+foB/gYCAgYGAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgX+Af35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B+fHp7enx7fIKBf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEg4KEg4GDgYCAgX9/f3+AfH19foB9fn9/f399f3x+fn6Bf4F/f35/gH+Bg4KDgH9/gYGBgoGBgYCAgYCAgH+AgYGBgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f31/gHx/f319gYCAfn19f35+goCBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSBhISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fX9/f4GAgX9/fH6AfoCBgoOBgICBg4WCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIWDgoOEhIOCgoKDgYKCgX+BgX2AgH6AfX59fn+AgH9/f39+fH6Af4GAgYB/f31/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf31/gX9/gIKCgIGDgoSFhoSAfn18fXx8e3l2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R1hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoKBgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fX19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHt7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9/f4B/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fX59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4F/f39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgYGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBf4CAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+Bg4J/gIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx9fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGBf4KDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCgoODhIOBgoKDg4ODgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4KCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiISFhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhISGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4aFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIRqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhYSGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6Bf397f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSFeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgX9+fn9/f3p+fXx+fX9/fn2AgYODgIKDgYKEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoaDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4GBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t9fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4SEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fH59fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIh4eGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J+f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhISGhoeGhYSDhYWGhoaGhoWGh4aGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn5+foB+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaFh4WFhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDgoJ9gYGAf4OBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aHh4WEhoWFhoWEh4SEhYSIhoaIhYWEgoWFhoWGhoeEhoaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5/gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhYSFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgISAfIF/fX6Cfn6AfoB+f319fn1+e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeGhISEgoWDg4aCg4WFhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+AhH98gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHt9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaHhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX6BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx7fH5+fX+AfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B+f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4WFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fX+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn1+fX+AgICGg4SFhIWChIKChIKBgIKAfn1+f35/foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeGhYWEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af3+Af4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb28vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbV1tbW1tbX1tbX2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ68lYicnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuyrsHJmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquKTWlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+ks5/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uVodCKkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmarR26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2rkqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SdsaSlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNadko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3OTg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBwcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFFXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVRiUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFMDhZbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSm+heEF7d2RhUFFbR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDA1qZDe4yAdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkaOXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqmdiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbKsqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpMvUxba/v8C/uru9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQmG+pyMjH0cGvvb24ubu7vre0sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm1uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e0uLa2vLu5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLaztb24uLi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y0wMHAvbu8wMO6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBucK6xb/Av8LIvcfHxsW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7u3tMG5wL3CxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC9rKvAs7u7wb7Ays7KxL21vLu5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9v6WVw7S2tb2+vs7MzMK4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsKggae2qrC+wrrSycjDsbC0tLW8ub66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u66/n3J6o42TnJ+lw8K/vayqr62yure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7CmtKF5hKeXkY+Qjo6ZsLSlqKmuwbWzsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennaequsXL08CkkJSXgoOgoKSlvMSsrqewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiYzubh4d/VxqeRiXltcZehqcGmqKihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2rqKamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aVm9vPxsbMz8y/m31samV7pcaql6Kin5+loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPjs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUk66cY3KQtMbHx6t8aWluZpS1i5uen6GcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzX1pecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpehSy1IWoizwsGrgHGDiYN4fZSinp+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko1xlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZWchFJrf2lglK+unoOBnZ6jmn+qqqWhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVocnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmHxrkKKLXnCZmI+LjZ6jpaent7WwprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3ZebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZiln5GBgLPKypNig4WGj4iVoKOhrry+uKy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqqWNfoGw1NKxdGFze4N4jZaZlaXAwL61ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamtkH1wpNWUe4dLWnB0cYKDeniTvcjCv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKuuro6FZoOof3x2X2JgZGloY1tSdsDKxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb+/v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqK2spd0fXx6en55e5KEZVxQbGlaPG7Oz9DEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2OTo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2EpJmGZXx4d3+Pl5yQaWhmZKildT+k2M/Rws/T1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoSQhl5fXllXcYN9fFxTcVWKt4ljz9XS0MzQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHSyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0hn5PT1JKUW97bH5sU3JakqyCkdDV1NDJz8zS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5tcXFycnZxVE9OTVxhdWZ6hXZZZ4OMdJ7M0tHNxs7MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzczQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltcnFdSkNNTl1bYHFiSF1vZ1aRxs3NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MTFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWl3g2BGREhHQj9NTFFUZ15Ol73HxMDCv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH5xW01JRzhGP0NTSlRkWJSvv7i4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt0gW1YS0NOVzk6TUZIW1SVorOws7KysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8XAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQURGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhoand7X09RWUU5OEZJREphn5ekp66qqKqnsqy0r7Gnraarsru5tcK5ubmvqrS5u7PBuq/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcLGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqemxPWltEQDs2Oj1NipqRlJ+kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Szu7ezvK+4ubWyu8GywK+lqaOrsbOzqL2qq6irrK61tKaorqGlsKmzp6eorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8XDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG13XUxKVlZRUT5Cep2RjoeZnKWgoJ6jo6WlrJ6bmqOkq7Gutramr6umqbOrs7mwtbWttrmysLq6sbaloKWgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVma3JXUGBnb2pafI+WjIuClpqcopqcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqafqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubuwtry7uquzsrmzvbS3srG1tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRvbGV0fG9KT4KQlIqMhZOam6Obl5mipKCimp2fmZesq6ytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezrqmtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFxdnlgPkxgco2JjoiOmJebmZKdnaahnJ2mm5qYqaStrqmaoaK2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpabmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsbCwr6+nqKeyrbG0sLy0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncG90UjEsKT94jo6JjJSYlpqRm5ukoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGuq7WeoJ2VlamhopStsbGfoqOenpibk4ugk5GTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhvbkkrHylFb5ONh4qOm5ObkpeboZ6poqGioaGgmqepopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in5+XmZOKnZGNkpOWkJiYk5yho5yloaKVoKKkpZujq6WipKqkqq2lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9ia2pKOy89SVyHjoWJiZOUnJaWm6SkpqSppKekoZajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvpK64paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNwbE1CT3Rsa4SAi4ePkZqZlZqmpKKqqKWtoqWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKexvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgaWpmbGR1dmF7fIuBjIuQlJKXo5abpqOiqJuklZ2imJCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW7tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSUlBRVFFTVVFOTUtLU1dXVldXV1daXGFlWmBbbnhldnKFeoWBjImMl5uKlZegnqCXo5OemZOLhZeZi3OMgn2Nl5WFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6jo46JmqCho6SborSvrK+toJimuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraihppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaWGlxa2ZGUGmJeo5/hZaRho6Mm5WalZWUkYyUiH6SiF47Vm57i5OJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqJ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVVNkbGNGOTh6joqIdoGNh3+FiJeKlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTk1NVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZl1WYWlaWlFLiH2NgGx3f3t3gIePfpCZi455g419c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iYWBjVmiBjpKJi3Rgcnpwc3qEjHmBmJJ+b4SNenV5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXF5gXFl5mZy8e21wXHRxaXZzg4x2eYmDbWqJkHdyd2hpf4FxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRV1VTm3tYkGBqcF53amh5dYaFcn6EgXFqlo9ycXppaZyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhPR16mqphncm9ldmdsfXyAfXaAgoJ2b52Scnd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGZiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZOHlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRnxqdXJybndncIGCd3mAf3uIe3Oel3h8hH6DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtcZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQERDP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWT0dgeH9ygHJ0a3aJhnV4hIN6koN1nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhZKph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQT9DQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs7yzl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZrV1laYoGJfIt5fHp/i4x6gYSMfZaRf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaT0xOV1JRSFBKRE5HQ0pEQ0FEQ0I8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pOVl9femRjaG2Qj4OQiouEh4iUg46LmYecnI+gp6KhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFeaoR4b3t2k5KPnpyak5uQnZGYmqSapKecpqmnqLOWqr2qtcfItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktPTklJTEZHTUNITUZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuTjo6Kn5KXnZabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWqBinONg5ecn6u1sZ6opqijpLCorbOurqq4r7G8m7HDqrnJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldob1h5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVNW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd+jpqAppyooKi4wb2lr8GzqbC9sLW6s7yyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYWJXeXRxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NUFCNzY0MC82Q0hDUVtPUVVXVVxXT19VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09ei56on6ytuaywucbEsrjBu7GxvrS1v7K8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6OhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgouEln14enVlUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVNgX0xTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZCqsrC2ssK3tLfFyri5v7q2s7m5tbyyuLDEX3OwpLGanqq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGRfWWNgamdTWGFWUlVJRUVNSkE+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+dH16a2VwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0urHBura1x8i3tLi0t7ixtbOyrbS1l2N0p5ytb16irJuXoKKbpJ6qpZSfn5CTjpWYmKiepqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeWmBjWmRkUVxgU1FKQ0FFRkU8QEY+QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmampoYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrTDrrWuuLmyr8LEs663r6+6qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXm5WWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpmWlFdWE5QQUJIRUJIO0FDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscHh+cXpteHNtaYBwbWNqbXB4aHd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstaqxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXk5uRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PXzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuAc3JpcHF6eXJ6vsuafYuxhHZyhHZoYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn56fpqSprreppbKhoa2goq2hprGeiKaak5KRiY6NiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSZjoaTkZ6XqLCioaGlpKnJzc/Iw8zR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVlpUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZWAg253cG12f3Z4fXSFfHpth3Z1b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6SwoqOxnqGknJ+on6Kxm4WdkZGRj4qKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIubkquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFhGR0tJRUU9Ojc6QEBCOkdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtvfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qdqJ6gq5uhmZidpJ2eq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaOdYJ0dYF+dICEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlpmWlaSbl56VnZKRlqKdmaqVkJCJjJGCi4OIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJOflJCNjY+Kfo6NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk6Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WboZudlJJ/jIiAmIiAnJJuiKiFeqGLfJGNg4iEnH2akImMo6OgkKSvn4qQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyOlJaQipGThX+Kh5GMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGymJ2SlJehop+ZkpydqLO5raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX56gX2Ge3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXcoqyjYSokoSZk4WZjKKVn5eSiZueo5OqsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZmajo+TkoaTloN+j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztaajvMK+x8XFycjJwsvUzc3UqdLR1tXW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6WdmJCnl6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKXk4uKk5KGk5eFg5CPm3OQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjV2NYUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox5fYF7eIaLiYaEkqi8ramzvbClrrO0qaOisK2KmrWeo7mllaykl6mtuKalo5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieoquSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46UjIqMlpiRm5m0lpSqnYublJGNkJKLmJqJkZ2Pi4qWn6KNlY2YmZ2SnJielKGglJydpq6noqSzuKvCyMS1ur28xsjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoByh4d8gYl1goqDf219fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO2jKiyra69q5u7o6itubirp6aioaOjqq+ysaqdnKOYm5iXnqKmpZKjua+ov7ysrbK5paOnfYiGna28sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCem5ifoJSan6inpKKjsLOmwMbDsLC7tsXEw77Mp8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlZiQk5WotMbJwMLMwsO5yL26sKu5u5eytrmywK6lwKSrsLy9qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqrEw6SCi46Gh4SGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZmkn5qgm6CUmJ+mpKWnpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nusC9vMS4rMGprbO8vqqxqqSlo6yutK63taCfrp+mopijtLypnKi8waO2tq+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYuPj4+Vloh8jpWSkaKalKCinLamkJ+XpKSjpZ+eppielZebpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFtaXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6PnY6Wjp6SiYp/iZ+ShHiFf5R+f5CIiZCAlqCarqekmMO+yMTIxtLNzs3LvMK4sLq9tL3Lu8TCtra8rbS/uryur6ihqKi2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tl5WlramgkY6SscWnlI58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKjI+Pnohaj5aXkpakmWaZo56zpZajlqutq6ecn6aXmZaYlaGkqKaetaupurzCtKa0tcvBuKq1rLO7uK6ouLq8t4RwcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeoloyQg4alkoiBh4Kag4OVkJCTjpqhn6++rqHHvsXFyMfOzs7Syr67trG7u7y/z7bEvre5t7OytbO4tKynnKusuaupqLCwmKOupaikpbTAsKustL7CucC5s6e4tLeyr5WkrbCwpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YioyPlZ1fSpacmpSZpJdUlrCfr52fpZWvsK2lm6GllJOZmI6dn6ahmbSpqrO8u7ursLLHwLimq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiRl4eKp5aNiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjNzce/u7OvurjAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaImpalm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJ2CbXWSopqVnKKfkK6yoquWqqqYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTkhJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FMVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvrqyr7m1wMLKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvbuorL20t77HvLa1uMCwvcCzqrW3rL+mj6KWkKCfu56JmqCYlp2djraeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqC1sKSlk7Krmqutn5+lpKqSlpWghJCen5yVqaWhobO0uratqLWysp6co6Wal5WZqqGeeGRgYWBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5WZmo6qlpWoppWsrZmiq7fFwry/uMHCwMjEv83GvL65srC5tL/CyLbAsLy3urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0ubi/sL7Bt7WytbC+pJajlZKak62fkKGipKKinpC9pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqymnJezp5qwqKCcq5+ijZqWoIWOoZqckqWlmpersbayqqWqraycmKCgko6QlqmflGlmXGNfUUpIS09MR0VESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa5tbSxtLS3wsa3v7G4tbq1oKesq6yenp+lpMGloKquoKSprbCipqi9taWxvLe2tsOys7e6vrLDwLe4rrS1taOcpJSRk6CsnpihnKioqqKawayonautmpqdmKWfvaGcpJeqqquloJiNmp+SnYiNV3+WnqWhoLmqp5OZt6Ofs6KhnLCYoY+blZ6Cj6CXl46io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYk5KS0tORkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gmkqmjn6Oeramrnbuxqay1scjEwcOzwsO9x8S9xcq9sLG2rrG1r7/Ftbqxsbq2rJupsKqqm5+moafBrZussZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq6roqWVlZOiq6Cen5qnqq6ur7uxpZ+oqZmYl5Kio7egoaORra6rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco6+bn5ywkaGVmZWbgJKilpCOoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7s62wtbTHv8TDtb/EvsrFtsHJwrWstamwuay/xLS4r622uqaZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyp7m0uLK5waq3s8O9tMWnvq6tt7WpqKyhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKCdmpmalZeooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZm4aXoJSNkJ2ek4upqauhp6CanpaNj5mQgoaWiZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW+paiurqCptaqdt6+ro6q0trGwuLewt7i4xb3Dx728w8LIwbrCxsK6qralrbutwcO4uKqtsryjla6wrrOXpqiRqrqqoKawnaqgr7Szqqq2tay7rLOyuresubDCur2/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaaqn5ufn5qdpZ2hmJ2jtLCcn5GUppuhqZyWo6KYmoyXmpSWl56UiZGbmZSOqamnn6OcmZuTh4+Zi36Ml4WPm2xpbmJub1hRUVpUQUNEVUA7OklBNzpYUGReUVdXRVlfXk1MU09eTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKCqr6qisLeopLOyq6Gttb2vs7m9u723t8HCv8nDucTDwcC5xb7BuLC2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1vK2wsbWssLWywLrFtqu9r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7KqsKmim56no56VoZmcqLapmJqSkp+ZnqGgkq2hm5qIl5qMnpqdlIuPl5eal6amo6CelpaWk4CQlYR7j5ODjJdnbXJocXNfR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbX15OTVNYY0pLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcaEs1jHpmTEClmZ+krLWjrKikrq21qK6zuKansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyqure7ur61q6+xt5iYqKyrrJyuq4+rvZ2rrrGjqZ+xrbOurrWxubaqra+yqLawtLq8ybKqtbSxtLCvp6Gzn5qoq5+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy4opiTkY+YnKGZmJWuoZ+Xg5Wajp6dmpeRipSTnpqlo6OhmZaTkpV7jJCFe42Lg4uTbG55b3Z9YUZgalpJSFpbPXtKR0U2QWNUaVtNXWFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2s7ejrLO3ybu1u7u/vrW0t8PAzMe8w723v7/BuMC9sr2uqLq6uLfCt6yusbqWl6euramksqmUr7ukrLKypqeisrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp+fp7Cfo5SbmJSxnqebn6mNqaKdm5WXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVjo+MmJ2imJGZqKShmYaUmJGenJiXl4mXkJebqJ2loZKWkpCVdoSQhnuGgoSNjW5xeHZ8gFxMZWxcS09kXT9ie0dJOEdoV2VcTF5iTVlaV1RYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpaKwsbKpt6+1n6u0uci5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLywrLS0nqGnsa+mp7GlnbG1rKqysKuoqLW6rLWytauzrKqrqaypua6ysci/uKS5sKmtraaorbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inaOoqpygmpuTpLWaj4mOiJGjoZaPlp+jl5aHkZWVnpuZl5WImJOVmaedoaCNk5GOkHd+j4R9fH2HiopydHN/fn1cU2NuXk5aZ11GRJZbRzpNblhhW01hYk5WV1ZXVVloXlFTTWNbW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoaivpKajs7Ows7SwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6yzub3AsayyraKkp66rqKWwo6qwqq6qsa6urKuzu6e3sLGosqqrpaWjr7qsqrHCubSsuampqK2pp7GlqaSiramoop6boqyVpZ2XnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mapJiZkKGomIaEj4uKn6GQjY+YnpKSiImSlqGdlpmWh5eTk5elnZ2djJKQjYl/f4iEfHd/h4WGdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPZFxOVlZVV1FcYl9TUE5oWVhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1ramkq6q9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaeosaWzraqvra2wrrKts7ult7OsrK6oq5+jnrG3q6qturaktbWkqqerrKqtoKimprCxo6eloaGrlqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlpCYnZOBgpCJhZ2gjYuQjpyRk42Fj5qlm5OSm4yTkpGUo5qcmouPi4t8hoKCgXp1gYOBfnV4iqKGeGpdX25mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVktPaVhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Xqaittaq1saqkq6qpvMHAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsq+trK2nt6qmra+qt66nsK+usaq1qra2p7S3q6ykqaqcpJ60s6iopLO0n7Wtoaqoq6irp5+rrKi4tamqqamiqJ+tm5GqoZ2gpKKmoqqdnKa0rqelqaKjl6Smp6qcoqSjoJqYn5GPj5mNf4eMh4SenomGjIyRkZOPhYiXo5qOjpuSkpCPkqCYmZeNi4R/dIaCf354dYN/e3h+f4edj3BxZmZwd1xhdIhqT12YVkhteVVkVlJjUE1WVFVRT1hbYlVJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+ppK+pqLu/vMGysLmtoravyMfI0MC/vbq8w767xMK/v6+ys7K1vbzBsrK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhtq2poZ+usqC0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqCop56nm5mpsKiin6uioZKhoqKnmZmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJGekpOQjZGdlZiPi4aGeHSBf3x0d3mAe3V0e2uDh6R2aV5la4B1Z4iMfFJWb15LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKOlqqOjoqyms7KxqKSwp6q4vsG9sam6qqeusMnGyNDDvr+9ub/Avcm8wbixsLWyury5v7O0vKy5rKO0pqarsbW3saWmubSss7yvvKWtrbWrrZypr6SfpKyqqJydqrKjs6iaq6eppKidoqmnqb2qtLCunamkoK6cmrOilqScpaSfpZqaqKqlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWToo6UkYuRm5OWh4p/gHF6eX17Z3Z8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGJQUllLTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJien6ikoaGrpLaxsaSpsKatucG9t7GkuayoqK/DycjMwre9v7W4wbrItsK1tLK1sr25ur22rrm2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbCjnKWpqaOdm6Swpq+gn6qpp6Gpm6OooK28p66wrqGqoqSunp6tppifm6GinJ+bmaOqopqZo6OVlpSgoZablqWsjJ+SkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKSKk5KIkJqQlIGJfXlrfXZ4eGJ6enFvcXR4aoJ1a4JnY2dhbnOObWJqb2BvQFx5a1ZeTlFSS0lNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62ir6+orLjDu7SuoLmvq6izusfKx7+4wb2vtL+3xLbDsq+6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oK24taemp7Czn56lpqigpZierKeonqCqr6egppeiqJ+wuJ+ksa+gq6GspJymp6iam5ueo5Wcm5qdqaaWm56okZiSmZ2TmZahqpGaio2Qh32HfoKOfHyhjY2JeoSNhoyPjYaKk5qOiJSgipGVgoyXjZJ9hXxzcH1xc3NfeHdpbnFxcGuAc2R6bGdlY2FmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdXDUolZulmJuVrJ+doaOgtquwo7Szqam5xbezrqG4ra2sr7XFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevsZuhpKCko6CWm6+moZ6iqK+hoKGSpKSht7ChprGrn6ujrpidqqWon5ianaSTmZuanaWpmZubpJWUl5WcjpOXoqmikYqKkIZ6hH6Ei3mPl4qNh3uDiYWKjo+GkJOYjI6VmYuQl36Gl4yQeoF7cHJ3bm9zXnd2ZGxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFNWRzM5Xl9sUEVZVllmTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobaqraC7t6WsvcW0sK+jta+srK+0w8O8s766trCzubi6t7qvrcCzs7ivv8C3rL26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CypJmepKmpnKKfkqSgpLippaeup52loaiToKmioaGZm5yfkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWIiYqShpeSkouQlZSOjpR7g5eQi3d+fGx0cmxrc2F3dGhoamhncIZoaGlkZmlpYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1EV1VeYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequranrMPBuLGso7aup62vt7+/vLLBtrCusra2uLa2raq9s66ysLy+t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmprLClmJ2pnaakkZilrKKYnaSpoZuhm5afnae1prCqrqCgnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrYmdkZHaBY2VmZmVqaWNrcltfWV1sY2FOaVhaYFZKR0lLTVNYPjlfbGhIQ1ZUXFtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJWksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7O4s6mrubGvrrO1urWwuLyrpp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd9iYqGhouMipOFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZaSUZMTU9YUVFVYWWAVUFXU1lURklGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvnri/taC0wru+urGmt6+nraS2t7e2rLuurKqrtqqzt66msrWxrqmwtbWws7W5pqiftaecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSWmp+bkJukqqupu6CnpKCYmpmdoY9ropaZnHCClZmjf3WRqaeelJSekImYmoCWiqKQeYeUjYNtaX93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qsqqO9xa+pt8K3vbytprewpaqitrOysrC5rKmmrLSlr7Sjqbe1tainq7ayrbStsqGonrKpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dp6mktrCkoqKdlpiXl6OIoY6Smoagh5KcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ6qqaeqv8Ovsbq8tsC+qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyp62dqaCwp5+jopifoZqss5OjpaW1vaatp6uqrKikoaCYn6ajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytae6kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFdRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ2lrLGosMK9srXAtba+waqms6ysqKaus6mutbOmp6W0pae4rZyzsbWrpqSnsa2tsKaqnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZyamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICUeHlqpzdKr1xYU2xkW0tPWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLK3usGmqLCqrqior66jsLqvo6StsqOpuKeesrKwo6Whqayuq6+mpp6ioa+aoZuWlJaamqullZqhnrOzoqyco62soJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSltkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCViLOmpqGvqaizrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUl52soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mcoqmappqcm6Khl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFQXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaeap7itoq+xn7O0sKCknp+mqbCos6ijm5ydqpWYl5WVk5WgqZyZlqetsKmjn4+toqiWnZWboKWgl6GgoaCaoaGnm56hnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKlsa2jq7ytprSmp7W6vLG6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CRoaaflZOlqrCmopaTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlJuhnZyllZ2VmaKelZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmwl7TCrqizqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgoo6QoZmnpJ+UmaWonJyknqycoZyfjJOfmp2hmJmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F8gmuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkhfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi0q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkaOXp6qmlJeop52eoKKtpKGeoYyUoZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t4f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtSPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZMXjgxQzimnJuevKGbssCvraurp7ept661v7S6r663tqrAtaipoZulo6Gckampp7SisqetqaCXnKefpKu4naOsmpWYjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOPmKKWn5uWnJahk5ypnJSPqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWZnY213b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qqquxprevtsOvuLCtuK6twLCro6Kdo6Gcm5Coo6mypLSlrKSelZqqmKasuJyhrZiUn4+knpKMnKKdl52ZkZWSr7myrJaYpKinlJCWpJujrJ2Qn6irn5qfqKO0n6OljqehlKKanJiVo5iPr5+SlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpbTT9KMzsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Srqqisqqm5rrDFrbOyrbWms7erqaGhpJ6gnZmTqqOsqqW1p6afm5Wgo52rpL2moKmWk5uQoZqRjqGnoZKcl5SYlLG1t66ZnqSkoouSkaaapaqblaekpZuZoailp6SqoZKtnpeknpeXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBdbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2o6ylrqentLGsyKuusqqzor2wsaWfoqedo5uZmaumrqOktKikm5iUoJqlrae+p6iklJOalZ+ZkpekqaiQnpGQmJyws7+tnKeep6KJk5GpmqijmpqqoKOZmqOnrKOgrKOasZuUp6CWlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiWjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVT0ZSOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKyt6CppbKnpa+0qseqq6+ls6TAp7OgnaOknKOVlZ+qpqyiorarn5iWlZ+XramkwJ6ro5SRmpadmJKUoZ6eoqeTkZmop7PEsJqrnaufj5aWqJ2qm5yfq5ihmpyipK+noqaon66Yl6edmZmgnp2br6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWx7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLSgubC/rKyvsrGgqqeyrKKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52Zma+lrb6gq6KQkJ2ZmZSQlaGcl6ichJ6rrKO0yLSgqqSqlpWXmqadqJqdo6qUnp+doKqvqqakrKOvm5+goZeknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJueIJ4f3NueYR0domHjoN8aodZXmx0ZF1ziWlrfHBrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq8uq+stLGqpaitrrCmraywu7CopqOtrbCeq5afo52hmZmmqpyto6WnqbKunpSjj6KvpbW5pa2ijo2ZoJiTkpqgmZmllXymrqOotMW4paKnr56clZ6inqOboqiokZ6hnaGqsKyspauhqpunn6igrJagm6Wvo5abqJSfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3eQg46BdXmAf3lxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6mwrq2lsrOuqaSlpa+qn6uYmqKfnJqqpqGcq6KkqKOktKScopKlraq2s6etoZGQmZykkpCfoZiboJ2Ip62lrK7AwLGhqa+plpKfnaGZoqOpo5KgoZ2era+rrqikpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1le4d2dmt8h259hZCRfm2DkGBybXBoYF95ZVxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbSrpbKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6rsKqoq5+UkZqfpJKPnqWYnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp6UoJ+dna6wqayrnKmopaKrkqyylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYydfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmSGbmF3bnJviYqSj4NukpFmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SUlARDw+PUBGRUNFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOgnKKOoqKirK62rqixpaippq2rq6aho52YopWfpaufoaWfqKiinp2wrJealqinrquopqeel5SZoqGSlKCtm52no7Ctpa21q7rNsa2mrquWlZydopierqyclqCZnp+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoKWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6orKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKYn6WznZmhlJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSoqZCSm42BnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ2SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramyrKylopuyuKuqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7WeopeTqaq1saybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylmqGjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2ZraawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycYCaYLx9UlV0jpKjl3t+lJOMdntzh4BxXW1ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SruKquoJugrLOypZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO1oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5Ccp5yipJyll56ZmpqmpaucsaKvpaaYr6S7raG2taydnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF/n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhHQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq2+vry5tJ6Wp6SttKGhmZSip6auqquYpqOfpaGgtqejqKewo5Sro46kraOdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqKVmZmcmZyZp6aoma2or6Omm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGtwhpldYFuMoG2VkaaZgpWPmo58fISZgGtugGN/dG6AemBoZnFvaWhnQ1lhWz1LVDNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6marqGQq6iklomakK2vrKaepZusl5iPrKGhnaWhmqWdr5miqae3qsGvpKmjnouAjZuan6aekpSZmpSbmqalppuqrK2kpZ+pqL6klsGqqaGgqrC3qauknbKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIanmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ8Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFtBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTk9RUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqZ+koZ62maG0qKqsnq+tnqubla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qko6aaoaOqs6q9r6SnnpyOfYublaCgmY+RmpuSmpipoKOaqa6opaaipKi7np/FpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRf9a9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraWlsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WmlZSwq5eMg5uRrqWirKCjnKqfl4qjkqaep5uboamkmaCirK6quq2oo5uWknyImZGlm5KPkZiZj5iTqZuhmaqpoaqnoKOqup6ow6KfrKGpsbKnraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqiknJivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHqAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XKvreqn8GtrqSiqKyfuqOkrqytpY2WrqmPi4WWlqydpqqgnaSjoJGLpJOnmamal6Sropeep6aosLurrJqbkpJ8hJeNpZeNkZCYlY6YlamWoJmpo5uxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+VhYGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn5+1sZCNrMi+xru6q6Omn52nn7Gpo7annam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiZora6qKqYmpCNfIGVi6CUipWRlpGQlJemkaCbqaCctqOdpqu3p67AraK1pK6trqqnp7G2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5CXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoWPkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9c5dze4yAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQj52ktb2wra2jpJt8n6SypKWxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqZqqjZqpkJ+5t6SlmZyNiHmBk4yak4qUkZSQjpKXo46fn6ien7ijf4OvtaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKnraqjZZ6fknN5mphxgZmpmG1/oqmKZZymnZKXmJaMk5yRhp6bkZaEk4iPkJKJhXdqjoZ2hXB6hX9/YGiHiZORilp1lJBnaI+Pc3yonJxme5uKhXmZaoWMhG96gGtxZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56MrJmilaehnY6Xkp2Fdq2PiaebqZKYpYqcu7SnoJmYi4l1d5ONlpOJk5GQlI2QlKGPnKGnmZyxlYCMm7ScsoySjbmln32nonmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qInIGXp4OCe5yzeoqGoZialZiWgpGXl4SbmWN6iJCFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuW1VVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVtiYWhmWVFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkH2Gj5iXh6ycoZafoZGNk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSPj5uMj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIygnaWnkpjCgX+riJihcp6AmqV+l4WVs4GhfaGToZCYl4GPlJyLmZKMfYWTh42WkomDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYV5pbFxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvJmTjaGRno96hJeWkYermZucmqKEj4x3mpyPn5CIn6Wcl5qZh6O5raSanIyMfmJtj4qTkI2QjI2YjJCSoI+VoaGZoKd+oaeHrZ2flq2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYKUkoyKppWVmJ6ffpOFhaykh5uQi5qrmZubkoimsaehlZqIiYBpboiHi46OiYuNkoyQk6ONlJ+fnKGkf5OBj6Kgk592nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tKytoJqinaSjpq+dnLOvrZSZopqhpZmalZ+rm4uIkniLhXGAlo2JkKGPk5SdmH2Rio2ooYeXjomTpJWcm42Mqailno+Xh4R+anuHfn2QjYKLkJCJkJShg5eeoJ2fnouJd5yYoYyfcaGKhqmHmqSNlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0RSbzVLW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKSboaCZl5ago5mGiY1piIBye5eIi5aWhJGVmJB6i4SVpJyKlI+GjZ+Tnp2JkamjoJqMkoqAgGmBhnh/lox6iY6OiJCXm3+Uop6foJOYcmifiZ6Oi3CSjICphpidoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyfn9vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mxsqiaooycrJycqpWiraWjqZCfnp6bmpaYoZ2WiIeJd4aBb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGbhY+qnJuVi4uKfINshIVxgaGLeIaNiIeTmZZ8k6SgnqKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhYSlVhWFRcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiFe3B9hGh9j4OVm4F3kY6Pim9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAbYGfhneAk4aImaOYe5Sio5mfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpKXi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtud3mYapp8dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2lKV01ZVFZeaWxvVmhXTUtBSk1LSEpPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq60oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY6JjIFphIWRg4yFnY16jYyXppSEmKqYjJGLgYl6gH2LeHCQoYZ5gpWHiZagln+UpaeblZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallsV1FSRlZcTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJibc3SJfpB7ZYOGlIqKlpqCfImImKiSgaOtkYaQi4KJfoCAjnJpj6aEfYeTjYmYoI+Ik6mlnIimeJWbfqWIloqxl52Pgq6WnqR1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaSlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66NtnV4vo2kk1qDp46rYXVzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlbYFtndGVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhX15cYWtibWx7b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Yk3R0hnKRg25/i5GHhpSPfXyDh5mnj4Cnp4+BjomFlHaCh5JubIupgIOMlI6JnZ+JjZOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJieoIN7folrjIVbeXlyenFpbn6SinKAdYGPlJNxh4SDZYx/X4GAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWNqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11na2RXY1VfUmBweXlta3dma2trd31ycnVzYW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5WbmdodWt4amlpZVxgWmNpZWxxdW5aW2JsZGxseW5oa29hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90c4RxlYV7fJGLhoaQhXl+gImbpY98qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xqXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCJjqWThGWLjYNud4uEcYaPenFoaWZ9hXuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH52en17eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGpsYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4OGioF7gYWNnKGRg6iiiHiOl4iUioucl4SDeayCkZialYqenYiIoameoaGjioeTm5yimZWpoKaknpGahZOLenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZGbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6kj4KEjIaCjJCMfYeLipGEem6Ehn56mWtzaWF0i3F+e3h3cHh1gl1eb4dpb2BfWl1dU2lyVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBd39+f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZnJxbVZebHRtaHl6cWdpa2WMh5y4npahoJeUmJmUmKSgnnx/mqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRyipCGkpGLnZF9jXqphI6TmJePnJaHhpuknqGZnIWCkpqZmI+Ypp+knJuPlX6Oh3R6ho2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOPg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8fHFxeoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBofn13dnd2e3hdYHF+bnVhZFtdX1JnblVmXF5ia2l3e39ybG1ka2pogX9sdIJsbHVwenCGeW6HgXaCgH2FdnGCjYh+e3x8f3uCimBoe2p1aGmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop+SkZWYipqfn597eJ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaEh32Pg5GdnZOKqZ2BcIuLjJKGn6GKhYx8p5GIkJOYlJaTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakImSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKMgIOFho9peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouClKOSioSPeoaGh4R2goSJiX1oc36BenxybWxoX35zaX12dnR9dIBrX2B0d3F4ZWRZX19Sa2lWZlpgYWlqd3qCcmdsZGxoZoCBa25+aG9xbH95h3tsjIFzgIF+gnR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgI2jiomalnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gbf3CLgpGThaWbh4yJg6aVhZOMl5iSkneRnJ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4Vxh5OAkYJsiIOCgImFZnZve4WRmIt8kniLh3t/hnt6cH13iIR4go6HipeflIGCi3aIg4OCd3yDiod4YXp6f3V/eGhtZmJ/amt4dHR3fnJ9Y2Rhc251c25hWmFeW21lU2RZYWFpbHZ6h3Jja2NtZmh9gmxpdWhucGqAfYJ6bpCGcoCDg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXqYnYyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5WYjqWimIBzh3uTkYmmj4yOipKgkYSSkJWXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaTg5V3cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgouSoY94g4F0iYd9gHR1gomFcWJ8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGpla2Nod4duZ21pa21pgn17eG+QiHSBhIR9dIGGiXuDfXqBhH19jnJ5i3h4bWyHamhfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ9gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnZSmnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6JiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5Wjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+HkY+TcXWBfIKDiHxmcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLlKaLeoZ7foqEd35xcIGGhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtQWFllY2hycoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZwjoV0gYKDfHWCiIV4hXx4hIV6f4l3fot7e3N4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabhouLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26LdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlJ6ZopWYeYp/gYyInJ2Kj4aSmJaFiZWakJeMi4yNi5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEm4mQfouDi4F3k5mTn5ORiYiUjH59jpd7kYyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYJ5Z3NudYCZjnuHhHmTkHl1h3Juh3qEiniJhICGjZqhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcYuAdX+DgXl2gIuAeIV/eIiGd4OFfIaLf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJSThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyg3qDooOUgpaUmZ2Tm3mRe4OMkqOZk46JlJmShIeXmoyUi4mOjoacg4+Je3KLhYqOh5yan5qVk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPkI2Lj4x3epGQeo6LjJKWjHyIfIBrdmtva2xte39hen6Ql4J3eoJ4g4x8emh0bHOGlYt9h4V7ko9xeYNvdYt5iIt4h3x/iY6dm4N7enaCinx3cGpsgoR8YXlxb21zdFZfcGJyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWBzVFFPXWdlXnlwiX1gXGlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hYB1dX6MeXuFgXiIg3OGhX+MjIR8epR4ZnFrg2CIfW9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHJSTYLfyJLWkntwdYR2haGElHiXkpmdkZp8lHOFj56hk5OQipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4eihJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXx/bXxlcm9rbHt6XIF6kJCBe32AgIaOenppc2pzio+JgYWEfJSKbH5+bX+KfYqFe4N4f42TmZiKfHV3g494c21ncICFbmt1cGlrdW5UX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ9i3N/hn97iX5yiYiCkIqIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KBybHaFd4akhpNvmJKWoZWcgpJxhoqil4mNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNnJqYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLkImOi4qEiGx7lYF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYKBf4qVhGuBdW2Hj4GOgn2BeH2OlJGXj3Ryd4eMdXNxZ3V6hGN1bnFja3doUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXlOTU1lZ2Jed3OKblxdZHleYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol6dIuJiJWGjH9+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUeHmMnoWGoY2PfJWNgJqIhHtzeHBzanCCbGptfXVfYXh3e3F1e2dgZHzr2rXJw9yHcmx0gneLnIqPa5qRkJ6WlIGJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p1d2xajXySg4Z+gYSBhYqCdmFya4eBjomBfn6RkH1ugWt3hI6EkIF6gHt9j5GOlIhtcHmMhXRrcGtyeYJhdWpwXWx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WDfH+IdnaKho+YgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2j5Gmd25xeH1xlJKOiGubkIqdk4yHe2iHipmGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCHgJWZjpOTgId0goR0gX6IkZudhpWPn36IYoCTh4WIhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46Cj4CGf32GgIWJf3BfcW+Ee46LgXx+kIh6cINleYGIhYqAeoR8fZGNj5GCbW55i351bW5ra3t/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BcY2x3ZWVdXVpsbWNtanR3hoBycH98fXR4hniFgn2AiHV4iYGTlXyIhnaIgG94eXuDk29ue4F3XoN/dIFtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIqOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB/ZWNnZ1edj19yc5a9xYV3cpWLkYB0mY2HnpSNiXNqiI6VgHuUjIGEm4x8ioZ9fIiMfpOHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloaTjZ2AiGZ+k4OBhoSKiXKCfmd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCi4B5g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhYmEgXeCen6Vio6LfG1reol8dnRvaGh+d2VdcmRZcXRUVG9zaWJOaHV5Z2FeXVlwgXB0WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGpzd4KDcW9+e390dYN6g4J8goZ2fomBlpF4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCi4KWmIp5j5ZveXNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql29KYc3ySjZF5f5eMhZqSjYdvbIWSkXp5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5KKk4+UhYhwe5OEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2GhIt9d3mBhXuDa1xvfHJ/h4OIfISHeohxgG1vgoWMgoJxg3d+loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnNuT1hydGdgS253dWJeXFtZdX50b1hnXmZrcV9vT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/h29sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3hmkYqCoZmdkoOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2Fvem5fY3B5XGRsg3pgcHZfZGXV676LMzo+jI+Ac3qGipCOd4WZjn+Ujo1/bm2FjIt1fI9/hYKViXyDeG52hoSClXZth4RrdXt1ZXmDhKeMg46LgnxtfnJ0gniDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udnJ1gp2MgYCGf3N2foFzgXBba3xzeIiBinuGf3yIeHlwaoaCjoKIcIB3fZOJin1zbWp2gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXBdXFtaXXaAdmpaYltoZm9jak5YZ1I+X2ZdXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugXt9gX+CenWBgYyThXCAi254fYB7e4iTiYBpe35qdHxyhntzdn5/jHp4hH58a4uMg5uel4yCgW2Nfmxpf4+OfH6Ag5SCf32KiGt1cWdpY1tjZ3NvYGJsdGFocIl6YXNzXmJjm6CQbl02W7C2dWuBin6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251fIaVkoJ+g4Bwd3p8dX9tV219dXOJgIV2hnSCiXp3cmyHf45/g3F9e3yQh4d5bW1obIKBdG5caGZ1clJcfU9dcl1PXHNwZFZLdHlrWFpaWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnt3gICJjIRye4dvcneDf3uJjY+Ean57bnh5dop3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWJknl+fIKSgIB+ioRwcnBjZl5ZZ19wcGBgaHFmam+JdGFzb1tgZGp2e3+/nailyrlyhoV0lX56iZWEdJKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeX+SaHGDdWZ2dWNqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3h31ranRoe4FqdoGNkpV/fH9/cnx3fHR/YlV1e3Fyh4KBe4Fwhop3eG9ugoGLfXx3fHpzjISAdWdwZ2yIgXFvXWhjdG9MZndNX29WVFp0bmNRUHV5YlJYWF1icoN0XWJcaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlXbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ9dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdpCAZ29uYGVcWGZZbnNhYWFxbGxoiW5gc2lZXmNtgHep2qnIh4izc4t6cY92fYmRgXuUi4B1dHV9dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW1bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGFieIZ6aHV2Y358aHWHj46WfXaBdnKAen1tgFpVcXxvc4GFfX93a4iGc3hqc3+Cgnx5e3d6cYl/e3Jmc2Rti4Nsc1pqYHZmSW9vTVxjWFdWeW5iUFN1d1lRVlheYXOFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn92eH13gYSBe3R9g4iIg29xf3VxdX6FgYiNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXBmV1xja398ys6HuqJrbm+MbnKFc36GjH97k4V6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXmAeGl1eWeCd2h1iIyPln5ziGpwfoB4bn1dV298bHN+iHqAbm6Jf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JXa195XUlwbE5YVl9VVnxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZY3FIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOIgHVzf4WFjoNwb3t4d3V6hoWGjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSim+FhYJ6g3VkbmpZX1tdXVRoc2ZhWWRycmeBcmFrZFdaX2l/eL6ue6C3bmN1iGl1fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV+cJmScX92c4BsfoCPhnGUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNhpeAcYxobHuCdG11Ylttempzeol6gGV0h31tcGd0fXZ9fnB6anl5f3h2b2RrYG2JfWxtVWpgeFZMbG1QU1BpTll8aGJPVXZsTVFUVV9nd4RnXmFxaWdhV2ldXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312c4KHf5WDbnN5e3tzc4WGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dpdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1bXFtTZXFlX1hjc3VpdnBkZWJXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bnmIfGdsd2ZqZFZXc3COpnyEe3aWkHN7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97cllngXd1aHCAeIJ2YneFi32Vgm+Ma257gXFlc2VganhmcHWIeXxhdYN2amtwdHlveXhye2V9fX12dW1jZGBshnxsalVqYnJUTGtsUE1PcUhefGZhTlZ1ZUtOVFhha3h/Zl5nc2plYFdkWGNyXkxMbFlkYlVUVXRXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36XhW5ydHx7dHGFhY+CgXqLdnSRgHyBlY6AhYR8foyGen6Adnujpop5iYaFbHV9fHaEg417b4ZzeoV9goN1bmppZVZdW1taU2NvZVtYYXR7amhtaGBhWF5aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnluaW9mZl1VWG9oj6h3gHp8kI14dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV5kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGdpd3Nxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIU2xGYnlmYk1Ucl5KTVVaZm14e2ZfbXFqZF1WYFZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhb3B2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxyg3t2gYCCdW+Ibn2AdIqAam9uZWRYX1paWlVia2dcWl92gmlebWxcYVdbXGuBZXJ0fWpqXm14d2l1eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCob353gIuNeXBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB4cnZ+dGFwbFhwcWFub4J6c2NxgGxhbXpuamh5eHNwZIR0eHh0b2NgY21zfWlrVGheX1VMdWRRSFdiSGN3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2dVSl1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gnl6eoKLjX1/hYlqdJeBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYl7dH59d3Nwhm18fm2QemNwcGJlXWVWWllXZGZsYF1ddIZoWXBtW15YWlxse2Jxd3ZtY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3RmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpWh4dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlld21gZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOElICJg4l7d3ByfXJheGNabW5gbm9/enNlcYBkXm51aGNmd3pya22Bc3F7cXBhXWRtb31kaVNoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVExkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5bYJ+gIGSiISBd3WJdIyHdHJ2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmhe3t/iZZ5ZXWJenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbmZcXHKJZVNybVtZWFdgbHZjanVqal9bb3VybnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fnCAXGFjXlNaYVxkkp9lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiH+FdnNrcHtsZndXW2lsYW9xfnhzZW9+W2BwcGFeaXB9a2pyfXBvdmlvYFpka217YWZTZlVYU1F4XVNQWlJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIaBn4l1gYCBdH+CcIeDdm+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21cVldVZmlzaGN0ZWVeW3B3b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYWJ3e3xvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXdsbYWUg4p8hnJyZ257b3FvUlpkaWRvcX50c2JtdVVicWpbXm5lfGRrdXxwcXFobF5YY2lqeF5mVGRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35tg4B9hph7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2BtcFxebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gb2plcXl+Z1pVV19rd3p6boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKe4hucWZwe2xxbGFYX2dnbXF/cnJeaWxTZXFkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT11PUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPh5GbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWGioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+Pz9BQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0/QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtERDw8PTw8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6O0xSPT09OTo/PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08T2hLQDw4PEE/Pj5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFQbl5UUEhBQ0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSVRoZ2VfYFhGTU1GRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NXGloamViZ1phTklJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1mdm9oa2lsbmFHSEhHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNTmx4dm5tb3FwUT9EQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SklSdHqDd3BtbG5WOz87OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVlrb3pubG9xc082OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYpnZGpsY2VpdYFzPDQ4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4dzcW9mZ3ByfWU0Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYd4c25vc21xYTk6Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoR3dXlyb29dQkJBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjYF7e3ZzcVZLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH96e3ReT1JMS0tJSkpKSUZEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUJDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt6cFxRUk5MTktKS0lLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2NhHp6eGRQT01OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMdnd0cVVSUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5+ZGBoXVdVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvX15vZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmlZPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9c3NbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpvc1pOTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf316e4B/g4KFhoeChoaGgYSBhoWGdmFeT0dBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e319fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0tGQ0hIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDREVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01RSUZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09MTk1PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87Pj5AQj5AQURHSkVJRklIR0ZHRENCQUFGRkNCQkJERURHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUNFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtMS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSEhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVVRSUlFSTE9SUlFWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAREE/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSkxISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTVRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dKR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSEdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSUhESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU1MTUhLQURBQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MRkdYTEdISkhHTUxRUEhLS0tLTU1VTk9KSktHR0tQU1NOUE9NTk5OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTSEpPSklPTVJRTE1MTE9SVVJPT0lMTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVNTUhKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVVRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF9jXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWFdZWV1iWl5XWFtcW1xcW1pcWlpfX2BgZGJjZGViZFphZWNmZmVdYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VXV1tbX2BcX1hZXFxdXl5cW11ZW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtbXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFhdXV9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZmZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6e3t7e3t6enp6enp6enx9fXx8fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPYWiUqKioqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDhHhzc3Nzc3N9hISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9e3t9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJqdnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5GQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4eLh4KCgoGAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4GAgYCBgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4KHiIKChIODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDgoyRgYGEhYSDhIOCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOBjpuJg4ODg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGOnaGloJGEgoOEgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDg4uSj5mmpZeEioiCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SGj5SVkpigoJiUhoOEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhIeYl5uYlpmYmpOGhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWDjJuJjZmZlpSTjYeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hoSWmYB9kZiYl5WPiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAi5+hk42am5eVko2JiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uVo5yboaGfkIKKi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGTlZagoZuUh4mIh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58en+PlJmbmpqVjoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoOPkY6Vl5iPgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDg4OCfn1+f4CAgYB+fX19fX59fHp7e4aMjZGUloV/f3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4mNjZKJfn9/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIqCf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9+fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g4+LlJSCgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl6h4iPloeDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goSNh4KChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYN/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7e3+CgIGBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx8fH19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foKGiIeIi4qLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fn6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgYCAgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Af4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDhoWBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoSEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf31/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgICAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6e31/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4KDhIOEhIWDhIWGhIWGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1+fX9/fn2AgYODgIKDgYKEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiHh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGiIWFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYGAf4OBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKBgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIB/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fXx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpYGRTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tbT0tLT09PT09PU1dTU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb29vLy8vLu/0tLS09PT09LS09TT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamosNLS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0tXT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/O0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0q2Dg5XP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpMqbvLiZtbOgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ6zpo2BjcaemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1mKOKq9a6mKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaqu4qtq5ulsZmWsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o5GNpZyWp5CZhJ2To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWoqi0qp5/oKmFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmavP2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2nkaGenpmolpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6ScuKSro57DoKukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNmpj5Cs18KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC/1tLVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD46OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6empaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTg5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Oz06Ojs3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCSkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qampmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7OTo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6enp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9rlqWVn3+Jf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxZcX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9Oz86ODw5OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xxlIaCS19wcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULzA9eId3d0BEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVNdSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI2CdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueKCjmpVlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6jRopqzqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPyLCap69rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26RzLuUk6SWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBDQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRYn7a9pqeaiHdrcW94eXt+ho6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuVhoaGfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUURpeGtudG5rZWVZV11YXGNqamlmYWmKtcHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmnnZSGcl5RVEtEW2VeY2plYWBoWVRYU1ZZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5sXl9lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJiaWNgW2NfV1JPUFBWgLS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdUVneat8C7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQl2+qycjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI5+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSVSnvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjkN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwHlSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urJwY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGhfXNrrcjFxL/Awb/Lx8PAyMC6wb/Ds7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMK1rK60tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM60doCzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5F+wMTDvry/u7u4tsHCtcG6gKCwrK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJWcpZahcK7JxMC9v7mzrrK8uq7BfnCiq6asur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaLoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLCipXKly8K/ubq1rqWss7CppFSAlqGepa22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4h49vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/GdoOqnppkp7+4tbKxra2fpKanpYhJg4+ZmJmfqa24q6qqnqSppKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3t5WMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vZCisqujcquwqautq6OooJ2enaRvSnuGiYiFj5uoraOio56rr6Gjqaihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU5AUnhxUElJS2abgVlFUq67sayzr66srba2srS1r6mmn5qbnZ6mqJ6gqKmfoaeWm5WnemJubHuDfoCIm6ifnp+huqSlnaOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSl9JU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52olJqVoLWeg36NkYuDenuMmZ2cp6qSqpyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx8ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOeeE9uS0tiZXRzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlcPaw7q2oZGMjIRza3qZn7GBm6uhn6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx49XU0lkpFxlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYlqrh3dXV0bmhioqLdWZgjryhcqquq6aisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemZ29tbK+w8TBsZSAeGxpYY20cYa3uLawp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnZ6WnZesl09ag6O3vLaif25laGlygV+qur2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmZ+ZrGZBUlp6o7K3qIJoYWhxcGCBx76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqioKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ipJtsb3tqYYOmrqZ/Zmh5iIx+s8fEwsfBwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpK2NdHyilWVmlJ6ZeWh8kJ2iqcHNy8bIxMXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqKxiHKPuMWbYnuKhXRxiJShpaW40czMzc/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2Fn4VphLXXl2psdnJ4d4OQm5ubttTT0s/Sw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Buc4KJZmyntWh8Y19ldHB4iIqJiqfV09PR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzc/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfX2FgXmBgX2BlbXBwbWptb3N1gGheg5iKg1lMWmdicXhyamiX1MzV1NHKz8zT1tLR1c3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGBeYF9eXGJtcm5tcHBycnZzZ2lwcWRYUFFXWGFiXFdLp9DJ0tLOxs7MzdTLztLMytbW0MzQ08vM0NHTys7R1dLV1sq/ysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltdW5lcXNyeHBWT05UeXdVbsHAw87Ox8XHzcrRx8rNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWpzX2V8hoVoV1pOVqCWZZu6trvHxcHDwMPIycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobnJbbXBvWUtdXnmhiW2gsa6twLm5u7m4wMHBw729uLy+uMPJxMbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt2d2ZgaGBGZmJ3gW9el6qoorSxtLOysrO7tLuwtq+zrrG6wbvAxLy/urSyur7AuMe4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhoanhwU2VuZF1XYl1MWpmmopimqK+rqauosqy0r7Gnraarsru5tcK5urmwqrS5u7PBua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdseVlSaGNFS1pTPl2Yn5qTlqCmq6Kmoaqoq6qvoqWeqay0tbC8uK+3r6ituLSzu7ezvK+4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5yQkZFRERGU0lelpyTkIqbnqWhoZ6kpKalrJ+cmqOlrLKwtransKunqrSrs7mwtbWttrmysLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbWYzNUI9NUdDbpWaj42El5ydo5udnaKkoqadmqGanqqurLG0o6ipqauspLS4rLavrLK0rrO1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVxUjE6NC84Ql5jjJaNh5WcnaWcmJujpaGjm56fmJitrK2usaCkoq2rp6G1sLGxrKivsqe6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZ3BQUT8sMSskOmullYmQmpmcmpOenqeinJ2mm5qZqqausKmboqK3qaGgrqi1qqanrbCkt7Ckt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFgYV9fYGJocGhKMSIcJkpJf5aLjpWal5ySnJyko6GkpZ2bnqWeqq6ln6CitqehoaKos6Klp6WvpbGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV5fYWppRzo0LzppfHCEi4yQnZWck5icop+po6KioaKhm6iqo5mdo7CpoaCdpKqeqKKerKyqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKWoKKkpZujq6WipKqkq62lrrKppqWnprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFlcW1tcXFxdXF9ia0s1QkJSfYZ3e4qLi5WVnZeXnaSlp6WppailoZekrKKUmKStqJ+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJmNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmZjVVhsbXyBeoCCjYmRk5yblpunpaOrqaauo6aXnaqelJSjp6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkI3NTg4OTs5Ojc6Ojc8PTo7Pz46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganBqcGV3fXiDfY2Cjo2RlpOZpJecp6SkqZyll56jmpGNnqGZlpaFhJGao4+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1daXWFnX2NecnhzfHSHfYeDjouOmZ2Llpmhn6GXpJSfmpSMhpiZi3ONgn2NlpaGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQno6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaFxeW2x1bWlHUmuKfJCBh5eSh5CNnZablZWVko2ViH+TiV87V297i5OJgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWFjWlZocGVIOzp7kIyKeIKPiICGiZiLlZWJkYaEk4V4iH9gSlFud4qRg36EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTk1NVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZT1FTU1VaaGZcZG1cXVNNioCPgm95gXx4gYmQf5CZi496hI1+dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXVlNVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5obWloWWuDj5SLjHZidHtydXuFjXqCmJJ/cIWNenZ6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVJPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWFnY158nKC9fG5yXnZzand0hY13eomEbmuKkHdzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqyzv6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRV1hXnX5bk2JscmB5a2l7doeFc3+Fg3Jrl49ycntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlQSF+prZpqdHFneGhtfn2BfneBg4N3cJ6ScneAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozk/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlJDSH5teHV0cHlocoOEeHqBgHyJe3Sfl3h9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkVMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqWRoKugsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4FzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUEhie4F0gnR2bXiLh3Z5hYR7k4R1npeGho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtMTU9XYFdsWFpbZISLfo17fnyAjI57goWNfpeSgJ6flpOamaWtkpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdnVmf5SOhoiIhoeHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOV1JRSFBKRE5HQ0pEQ0BEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi8wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9he2VkaW+TkoaTjI2GiYqVhI+MmoidnZCgqKOiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITEtNTlJea4Z5cH14lpSSoJ+clZySnpGZm6WbpaidpqqoqbSWq76rtcfItsjQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktPTklJTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTU5RWWuCjHSPhZmfoa23s6CpqKmkprGprrSvr6u5sLK9m7LDq7nJy7fDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqI+csYuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTg7PDVDOz1GS0lGSFFOUFd/j5uBqJ6qo6q6wr+nsMK0qrG+sba7s72zwLW7uqK4xai1yMe1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqssLWisayxtbu2tK20n6anoqaZqK+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejKCqoK6uu6+yu8jFs7nDu7Kyv7W2wLO9r7Z0sLOlusSjr8a4sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1hVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVFZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZGrs7G3s8S5trnHyrm6wLu2tLq5tbyzubHFYHSxpLGanqq9qaWoq6qjorK1oauon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGw8XMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhY2NfWGNgamdTWGBWUlVJRUVNSkE+R0Q9S0E9QkA9Rz47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+c316a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr21u7PCvLe2yMm4tbq1t7iytrOyrbW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxtX2JeWmBjWmRjUVtgU1BLQ0FFRkU8QEY/QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XErrawubqzr8LFtK64sLC7q7Kwpaq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYBwbWNpbXB4aXd8fsu+wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZastquypa+0qau7v7CqtKakuKarrZ+rtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1NDU0c7Hw9TRxs3S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafYuxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hprGeiKaak5KRiY+OiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlth3Z0bn12hHR4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCon6Kxm4WekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFdGR0pJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6gq5uhmpiepJ6fq5mKmouQkY2EfIeHg4WLjp+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09rb1dDa2tHWyNTLlnx+a2tdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkvNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36Fh4B3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQgomOlpmWlaSbl56VnZKRlqKdmauVkJCJjJGCjISIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnKmmpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NbZ2tvX2trZ2M7bxoh9fGpsaGJWWVdXTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV5hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJSglJCNjY+Lfo+NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLiYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUE9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyPlJaQipGThoCLiJGMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGzmJ2SlJehop+akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWVlDQUlDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIyRk4iEiYiFlZmaj4+UkoaTloN/j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZSdm6OztKajvMK+x8bFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKYlIyKk5KGk5eGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Vn5uhsa2jpLi/tMTHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBjV2NYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzUyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox6fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqmygomJjJSGkHyOjXyDhY2PlJSIh5KWi46VjYuMl5iRm5m0lpSqnYuclJGMkJKLmJqJkZ2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra69q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCdm5ifoJWbn6enpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKd3ZlX11iXk9MQ0xARUc/QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrmywa6lwKSrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjpaPkZCUlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprbO8vaqwqqSlo6yutK63taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYyPjo+Vloh8jpWSkaKalKCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsG/mnF8ZFtaX15MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGaraekmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8TCtra8rbS/ubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi46OnYhaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RwcV1bVldQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCTjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7bEvre5t7OytbO4s6ynnKusuaupqLCwmKOupaikpbXBsKuttL7DucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YiYuOlJxfSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcmhfXVFSTEZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnaCao6S1ybWpx7zExMnLycjMzse+urOvurjAwc21yLvBuba6sq+vs7SnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJyCbXWSopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTUdJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvruorb20t77HvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCYlp2djraeqJulopqboJmnpLGgmp2lnKepnJeTjpObipaJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobO0u7atqLWysp6co6Wal5WZqqGeeGRfYWBMSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/uMHCwMjEv83Gu765srC5tL7DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0uLi+sb7AtrSyta++o5ajlZKak62fkKGhpKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWlmpersbayqqWqraycmKCgko+QlqmflGlmXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaquoKSprbCipqi9taWxvLe2tsOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonautmpqdmKWfvaGcpJerq6uloJmNmqCSnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXlo6io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gnkqqjn6Oeramsnbuxqay1scjEwcOzwsO9x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKqqm5+moafCrZytsZypoq6xqqSovbemtbu9r7fErbOzwr+yxrO6t6u0tq2qoqaVlZOiq6Gfn5mnqq6ur7uxpZ+pqZmYl5Kio7egoaORrq6rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilo+OoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTHv8TDtb/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyprizuLK5waq3ssO9tMWnvq6tt7Wpp6yhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKGdmZmalZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaWoJWMkJ2ek4upqauhp6GanpaNj5mQgoaViZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i4xb3Dx728w8LIwbrBxsG6qralrbutwcO4uKqtsryjla2wrrOXpqiRqrmqoaewnaqgr7Szqqq2tay6q7OyuresuLDBur2/psOqsLauqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaern5qfn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl52UiZGbmZSOqamnn6OcmZuTh4+Zi36Nl4aPmmxpbmJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qisLeppbSyq6Gttb2vs7i8u723t8HCv8nDucTDwcC5xb3BuK+2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1u6yvsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7Krsamim56opJ6VoZmcqLapmJqSkp+Zn6Ggkq6hm5qIl5mMnZqdlIuPl5eal6amo6Cel5aWlICQlYR7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjY+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKikrq21qa+zuaansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5iYqKurrJyuq4+rvZ2rrrGjqp+xrbOurrWxubeqra+yqLavs7q8ybOqtbWxtLCvp6Gzn5qorKCllZaambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5meraebl56amay4opiTkY+YnKGZmJWuoZ+WgpWZjp6dmpeRipSTnpqlo6OgmZeTkpZ7jJGFe42Lg4uTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWNUaVtNXGFLXFxaUlJSYmFMS0VgYWFRTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe8w723v7/BuMC9sr2uqLq5uLfCt6yusbqWl6eurKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6ssqe4r7WzxMW2qbW1q7Cuqqejtp+fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Cnra+0rKSYoayonJydnJSquZyVj4+MmJ2imJGZqKShmIWUl5GdnJiXl4mXkJebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcS09kXT9ie0dJOEdoV2VbTV5iTVlZV1VYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpqKwsbKqt7C1n6u1ucm5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysKuoqLW6rLWytau0raqrqaypua2ysMe/uKW5sKmtraaorbGlpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inKOoq5ygmZuSpLWaj4mOiJGjoZaPlp+jl5WGkJWUnpuZl5WImJOVmaecoKCNk5KOkXh+j4V9fH2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpNblhhW05hYk5WVlZXVVloXlFTTWNaW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoamwpKejs7OwtLWwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6y0uLzAsayyraKkp66qqKWxo6qxqq6qsa6urKuzu6e3sLKpsqqrpqWkrrqsqrDCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mao5iZkKComIaEj4uLn6GQjY+YnpKSiIiSlqGdlpmWh5eTk5elnZ6djJKQjop/f4iFfHd/h4WHdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPY1xOVVZVV1FcYl9TT09oWFhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaapsaa0raqvra2xrrKttLult7OsrK6oq6CjnrG3q6qtubaktbWkqqesrKqtoKimp7GxpKeloaGslqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjpyRk42Fjpmlm5OSm4yTkpGUo5qcmouPi4x8hoKCgXp1gYOBfnV3i6KHeGpeX25mV2WHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPalhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+YqKittaq1saqlq6qpvcDAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsa+trK2nt6qlrbCruK6nsK+usau1qra1p7S3q6ykqqqcpJ60s6iopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqqiqZ+tm5GqoZ2gpKKmoqqenKa0rqelqaKjmKSmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyRkZOPhYiWo5qOjpuSkpCPkp+YmZeNi4SAdIeCf354dYN/e3h+f4idj3BxZmZwd1xhdIhqT12YVkhteVVkVlNkUE1VVVVRT1hbYlZJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+qpK+pqLu/vMGysLmtoravyMfH0MC/vbq8w767xMLAv66ys7O2vbzBsbK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhta2ooZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6ifrJmPsKKYoqCop56nm5mpsKmin6yioZKhoqKnmZmpppiYmZ2Pi4eViH2OhoSFpJeGg4SNh5CQkoWGlqGXiJGdkZOQjZGdlZiPi4aGeHSBf310eHqAe3V0e2uCh6R2aV5la4B1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKSlqqOkoqyms7KxqKSwp6q4v8G9sam6qqetsMnGx9DDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO0pqarsbW3saWmubSttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaq6eppKidoqmnqb2rtLCunamkoK+cmrOilqSbpaSfpZqaqKqlnpqpoZuRm6CknZmWqaqRmZqTkIuCj4V+kIOAiJ+Ph4F/jYiSkJCFgpWblIaToY2UkYuRm5OWh4p/gHJ6eX17Z3Z8e3Vxcn5qhnmFiGRfZ2NyhXttZ3ldXlZCV3ttVGJQUllLTE5wdF1JWltoWUZWZ09DPktPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJifn6mkoqGrpLaysaSpsKatucK9t7GkuaypqLDCyMjMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yis6aqqq60trOom7m7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6qpp6Gpm6OooK28p66xrqGqoqSunp6tppifmqGim5+bmaOqopqZo6OVlpSgoZablqasjJ+Sj5GMgoqAgI+Be5qVjYp9gIyHkZCNioWTmJGGk6OKkpGHkJmQlIGIfXpsfXZ4eGJ6enJwcXR4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlqyYn5eno6Gfp6O3r62ir6+orLjDu7SuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oa24taemqLCzoJ6lpaegpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynp6iam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjY2JeoSNhYuOjYWJk5qOiJSfiZCVgoyXjZF8hXx0cHxxc3NfeHhqb3FxcGuAc2R6bGdlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaOgtquwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevspyhpKCko6CWm6+loZ6iqK+hoKGSo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3uDiISJjY+Fj5OYjI6VmYuPln6Gl4yPeoF7cHJ2bm9zXnh3ZWxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZaUm6qco6GiobapraC7t6WsvsW0sK+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6yZoqecpKWUl6CxpJmepKmpnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWHiIqShZaSkouQlZSOjZR7g5iPi3d+fGx0cmxrc2F3dWhoamhncIZoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSnmZyenaO0rKequranrMPBuLGso7aup62ut8C/vLLCtrCusra2uba2raq9s66ysby/t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmqq7GlmJ6qnaakkZilrKGYnaSpoZuhm5afnae1prCqrqGhnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFd4GCgZ2Hi4OJfoCFiIeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBY2VmZmVqaWNrcltfWV1sZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJaks7Gisr22obHFvLuysaO3rKqtqbi8u7qtwLGurq62r7O4s6mrubGvrrO2uravuL2spp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdp6mln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rLuurKqrt6qzt66msrWyrqmwtraws7W6pqmftaecnaigp6uap72XrKSusLa1rK2fsa2wqaKbnKOrqJuUm6ajnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqKQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrC5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7KpnaGjmaSlmKu5k6Wlr7O3ra6lqa6rrKWhnpyhp6ablqClpJubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2io1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19NRVJWVlFRUldVZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ+qqaeqv8Ovsbq8tsC/qqW3sKispbK0rq6ytamopbCtpbSym621trWmp6iysKyyp62dqaCwp5+jopifoZqss5OjpaW2vaatp6uqrKiloaCYoKajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ucxXpytae6kHuAbZaxq7B5aGxYsa5uZWm8krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK9srXAtba+wauntKysqKaus6mvtbKmp6W0pae4rZyzsrarpaSnsa2ssKaqnaajr6Kgn52VmZ6crauTnaKfs7qjqqmira6loZyamqKnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9bKGQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqiosK6jsLmuo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+aoZuWlJaamquklZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaeyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqeqsaewp6Wdnp6ulZ6ZlJSUl52soZmZpKi1r6Kqj6qoqpudlZegpaeZnp2jn5ufo6WjlZuel5mcoqmbppqcm6Kgl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITXFQXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCotKijmpydqpWYl5WVk5WgqZyZlqetsKmjn4+to6iWnZaboaWfl6GhoqGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZ5RRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdKOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsa2jq7ytprSmp7a7vLK6vra2tLm4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mamaedlZOXl5CRoaaflZOlqrCmopaTraCmkpSgm6SlnpSapaehmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kes6yfn6irnpSntauor7GqrbOjm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZinpKCUmqWonZyknq2doZyfjJOemp2gl5mblpeioJSXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5Vtkl2rW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVzdKm5ZYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubmxsLS5qLqzn6+knaSmpp6TqbCpr6m0q6muoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSWpqqnlJipp52eoKKtpKGeoIyUoZifn5Gdl5yVnqGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFtSPj1ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r662tarAtaipoZulo6Gckampp7WisqetqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSll6OsopGWq7Gjn56mq7GZoaKPmKKWn5uVnJahk52pnJSPqpmH1JKau3Oww4DDhn3Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1lcWkNAQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6Keo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJujrZ6RoKirn5qfqKO0n6KkjqeilKKanJeVo5iQr5+SlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfYeGjIeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc5Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Ssq6isq6m6rrDFrbOyrbams7erqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZKcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SqoJGtnpeknpeXl52ej6+ok5uloY1qfWmbpXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pem4lgY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaWfoqedo5uZmaumrqOktKilm5eUoJqlrai9p6iklJOblZ+ZkpekqaiQnpGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6KasZuUp6CWlJ2fnZawpJegp5ibkJycoaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiVjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVUEZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWnn66Yl6edmZmgnp2cr6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEkJ6IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCanVkemZgamVjZGZrWWx7b2lrXVNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFNFtHNTwsQLSgubC/rKyvsrGgqqayraKss6/Er6mqorGtu6Kzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqaWjq6Kvm5+goJiknpyenK6jmJ6nkpaVm5Gjl5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8aodZXmx0ZF5ziWlrfHBrZF9STlhJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCeq5afo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmllXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKqgqpunn6egrJagm6Wvo5abqZSfm5mRo5WcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+qnquYmqKfnJqqpqGcq6KkqKOktKScopKlrau3s6euopGQmZylkpGfoZiboJ2Ip62lq67AwLGhqa+plpKfnaKZoqSqo5Ogop2era+qraejo6ihpaWdrKiRo5qorKmanKebqp+UlqOUn6GVm3/OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGBybXBoYGB6ZFxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9N0A+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6ssKqoq5+UkZqfpJKPnqSXnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqShqqmdoqWkn66fkZill56Zk5ORl6BxhYyXdYWohnGxfZ5yrH+in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qh6KMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmSFbmF3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpaippq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZoqGSlKCtm52npLCtpa21q7rNsa2mrquWlZydopmerqycl6Canp+ps6urq5usq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ97mZeFemaAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnw8nW1L+hmaunoK+inrC0sK6prKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLWvrqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepmVmniqyXSZpJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqaq1sqybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylm6GjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp+XiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaaYr6S7raG2taycnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqapJyVip99mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknKMiq2+v7y6tJ6Wp6SttaGimZSip6auqquYpqOfpaGhtqejqKewo5Sro46kraKdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqOWmZqdmZyZp6anma2or6Olm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJF9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWthaCVqqCil4afgZqVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhnQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYGFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaWgmqWdrpiiqae3qsGvpKmjnouBjpuan6aekpSZm5WbmqalppuqrK2kpZ+pqL6klsKrqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SnlZqBrIqEsIWmmqShopGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFumI+onIyYkpqafHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBgYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop2knpmjo6WZoaOqs6q9r6Snnp2PfoublqGgmI+RmpySmpipoKOaqa6opqaipai7np/FpqOnn6mzs6qso526q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpquRf9a9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaeppuaoamjmaCirK6quq2oo5uXk32ImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqup6ow6KfraKpsrKoraeeuKWsrJlzdqqluIZkiaBwaK6Ri5FubnekkJmfgXWumZRwj4txlaiknJivpHNtbWxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epamgnaSjoJGLpZKnmaiZl6OroZedpqaosLurrJqbkpJ8hJaNpZiNkZGZlY6YlqmWoJmqo5yxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVrKeNk5OMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4R+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaujn5innp6SlKOXqJqnmZSmoqWRm6eZora6qKqYmo+MfIGUi6GUipWRlpGQlJimkKCbqqCdtqOdpqu3p67AraK1pa6trqqnp7G2n6y6mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qenp6clqyek5qim5SQlquajpmZl5GWn5GIoZ6WlYaSjZGOlYuBfmWLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjlJ+ZpIWJm4p9c5d0fIyAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJjYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomco4+tnaKVqJ+gkpaZm66LqJWPqJqqjZmpkJ+5t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKurnSiu6GxnnZ3nqivuJN0q6OeiYCrf2RcYnagj6WfhJh9bZKznKOnraqjZZ6fknN5mphwgJipmG1/oqiKZZymnZKYmJaNkpyQhp6bkZeEkoePkJKJhXdqjoZ2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3yonJxme5uKhXmZaoaMhG96gGtyZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVVVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ2Rf4mIm56Mq5milaehnY6Wkp6Fda2PiKebqpKYpYqcu7SnoJmYi4l1d5ONlpOKk5GRlI2QlKGPnKGnmZyylYCMm7ScsoySjrqln32noXmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qInICXp4KBe5yzeoqGoZialZiWgpGXl4SbmWN7h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyGj5iXh6ycopafoJGMk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0ma2KyoeprIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVs4GhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXOPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJeWkYermZubmaGEjox3mpyPn5CInqWcl5qZh6O5raSanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2flq2PnZyckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmqmZubkoimsaehlZqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6Kgk592nJWPp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS3tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGAlo2JkKGPkpSdmH2QiY2ooYeXjomSpJWcm42Mqailno+Xh4R+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoYyfcaGKh6mHmqSOlaWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0NSbzVMW1tfTlpEQTI1MTw6N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ+Tnp2JkamjoJqMkoqAgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ6Oi3CSjIGphpidoaWepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn56bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkaGbc5CQgYmalqGbhY+qnJuVi4uKfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSNnZx7pZZ6qYCUmo+Jnpp7p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoqWPpqmhmquLm5mZlJmTkqGYjoeFe3B9hGh9j4OVm4B3kY6PiW9/hY6SkmyXk3yJkpSll4OPq5uUkouGiXmDdoiAboKfhneAk4aImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmY6FgJmPeqSAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Ole3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZtud3mYapp7dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOmjaaon56nhJuYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY15jYyXppSEmaqYjZGLgYl6gH2LeHCQoYZ6gZWHiZagln+UpKablZWDZm54nGyiZHtxpXebmHBmpoCUiXqkep+Wg5dznneBipWXj7lukYqiYn2YoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii256fXNyZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVYteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNsZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fp42jopyko4GWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfIiHmKiSgaOtkYaQi4KJfoCAjnJpkKaEfYeTjYiZoI+Ik6mlnIimeJWbfqSIlouxmJ2Qgq+Xn6R1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OHhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ+foulnnaffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp3bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6aKnKaeq56FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlHaCh5JubIupgYOMlI6JnZ+JjJSpop+Of3STl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4CAi3d1c5R1b3lubYdsg4ZedWd3jmV/gISMqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5oa29hjZO3qKaJoKKapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+WlIeOiomNcoN8j31+j4R7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6Jlq2nj5Klj3dvm46BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqaUhWWLjYNud4uEcYaPenFoaWZ8hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWVudWhtfH53enx7eXqAgH5vhYmEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3lvaGpsYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmJiYaHinN+gYx2hYuChJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4iUioucl4SDeq2CkZialYqenYeIoameoaGjioeTm5yjmZWqoaemn5KahpSLenaNjYOnfn+TkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOGkYt8iZ6Eh4yQiYmBhYSQd3x6dJqgiYaKnYmEk359ioB/dG5yhIF9doWFiY6lkIKFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0i3F+e3h3cHh1gl1eb4hpb2BfWl1dU2hyVmRdXWJtaHZ8fXRvcGVraml/fW55gHJqcHFsZ4F7coKAeH99f4R6bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2WMh5y5npahoJiUmJmUmKShn3x/mqyPn46GoJ2MnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4ODj36Ah4SFfIeFj5yfk4isoIRzipCGkpGLnZF9jXuqhI6TmJaPnJeHh5uknqGZnIWCkpqZmI+Zpp+knJuPlX+Oh3R6ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdIyZgYOPg4eFf4WElW55dnSSooqMhZqEhIxzf4l8e3FxeoaCeneIjYORpo+Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBpfn13dnd2e3hdYHF+bnVgY1tdX1JnblVmW15ia2l2en9ybG1ka2pogX9sdIJsbHVwenCGeW6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qfn597eJ+nkZyLh6WVjJmZenuNhn2JkYSMgoKDbnyAeXOBhX6Lkn1raH2Cl4mBiI17fYaEhnyPgpCdnZOJqZ2BcYuLjJKGoKGKhYx8qJGJkJKXk5aTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakImSlpt+k5J+h46BdXSCcXdhfoGOhnGLl32JjHKMf4KFho9oeHJ4jJiRj3+WfoiJcoGGe3tvd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWlqdnmCcmdsZGxoZoCBa25+aG9xbH95h3psjIFzgYF+gXR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJuefHeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V+i5F4Z2N9hpeKgoqLeHyAjYN5loKWmZiOl6Gbf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlo2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpWZfpiNfIiNgXZxfm57ZIB8i4Vwh5OAkYJsiIOBgImFZnVve4WRmIt8k3iLiHt/hnt6cH13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW21lU2RZYWFpa3V5hnJja2NtZmh9gmxpdWhucGqAfYN5bZCGcoCDg350fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuUh3+EhnR8fot/fZiGl5WYjaSimIBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqHiI+Jb5eem6SUlouMnouGgZGcf5KSlYaZiHuKioF5cnpsdWx8f4t+bYWTg5V3cIOEfn6LgGVyaXt/lpeDfo10kIeCeIZ9dHZ+fISAe4GLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ2YHBsdm5vXFxgXl5rXlFeWWNhaW50e4psYGpla2Nod4duZ21pa21pgn17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZl+eK+ZjZd9n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4JyeoCHeo+SiZOSnZOmnZWCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5WjlJOJi5mMgX+Qnn2SjpKMmY57ioWHc3N2bHFudXyKdG+HkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SKhoGLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3FleV5vbHNtclhbX2BibFtQWFllY2hycn+IZ11qaWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dXSBgICgh5KLlJ6YopWYeYp/gY2InJ2Kj4aSmJaFiZWakJeMjI2Ni5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEnImQfouDi4F3k5mToJOSiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0hI+Zi3F3gXWCiIN5ZnJudYCZjnuHhHmTkHl1h3NviHqEinmKhICGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbXZhcG9rcW1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarZ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgaqUhoJ3f3Zxg3qDoYOTgpWUmZ2Tm3iRe4OMkqOZk46JlZmShIeXmYyUi4mOj4acg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5GYkJyPkI2Mj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39hen6Pl4J3e4J4g4x9eWdzbHOGlYt9h4V6k49xeYNvdYt5iIp5iHuAio6dnIR7enaCi3x3cWpsgoR7YXlxb25zdFZfcGJyYmBtb3pxaXBmZ3N1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbGcpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFvhXRwcoRwa2l3boNufX1tdHJSTYLfyJLWk3twdYR2haGElHiXkpmdkZl7lHOFkJ6hk5SRipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjIqcm5yak5F4jHRlho+Fa4eihJGIloOGY4yRmY+Wi5eMjIqKcXqUiHuOiIqTkYl5hXx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR4gI2TmZiJfHV3g494cm1ncYCFbmx1cGlrdm9TX3BlcFpgbXN5aGxrY2d4cnBxZGB4YWBWbF9fd1FOTGJnY116cop2Xl1ldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3N/hn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KFzbHaFd4akhpNvmJKWopacgZJyhouil4iOlouQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SOnJqYmI2OdYl1bISHiXyJooORiZyEhV6Lk5iLkImPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFja3hoUmFyaGxWYG91emFyZGBpfXBzb1tkcmFiV25bXXlPTUxlZ2Jed3SKbl1dZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPa5qRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuPi4WOgH91eIOEcoiCk5yWlJeEi3WGfW6CgIeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4eBjomBfn6RkH1tgWt3hY6EkIF7gHt9j5GOlIhtcHmMhXRrcWxzeYJhdWpwXm14YVJlc2lmU2Bxd3VhcGBdaINxdGtYaGljaVluV1x2TUtMZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIdIWDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG9xeH1xlJKOiGubkIqdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCGgJaajpOTgId0goR0gX2IkJuehpWPn36IYoCTh4WJhYuNgICDZ3yQgH5/goyPkH5tg3yCdGxtd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pveFpTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcYBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9ycYB8fXR4hniFgn2AiHV5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB/ZWNnZ1edj19xc5a9xYV3cpWLkYB0mY2HnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gXF1hoGelYaUjoGBcX6Gc4J5h5WbloaTjZ2AiGZ+k4OBhoSKiXKBfWd9i3t5f3+Hi499aYB8g3ZmcHl4c3d0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaWh+d2VdcmRZcXVUVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXmtuYXFQWmxSRFRoYlpsb217cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcm9+e390dYN6g4J8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5eMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEkoyCfm59gXSBdoOZl5KKk4+UhYhwe5OEfoSDiYNvgXhogIV4cn9/g4qHfGV8foN1Y3FzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWMgoJxg3d/loqMg3dtbH6Ef3Z6ZWhqfnJhWnhbWnNvT1hydGdgS253dmJeXFtZdX5zcFhnXmZrcl9vT1hpUz9ZZ19bcWtneXJcW1lsZVpjcHlfaF1eZWxoZmxpcnh/h3BugH2BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1gY295XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIaZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg46LgnxsfnJ0gXiDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udXJ1gpyMgYCGf3R2foBzgXBba3xzeIiBinuGf3yId3lwa4eDj4KIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltoZm9jak5YZ1I+XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtaGpraXB4fo5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1+jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3iImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251e4aVkoJ9goBwd3p8dX9tV219dXOJgIV2hnSCiXp3cm2IgI5/g3F9e3yQh4d5bm1obYKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmlOQWJkXGB3YV11blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGiEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5dop3fXh/gYd/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4BqdoGNkZV/fH5+cXx3fHR/YlV1e3Fyh4KBe4Fwhol3eG9vgoKLfXx3fHpzjISAdWhwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlWbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4foCBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW5bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAe31tgFpVcXxvc4GFfX93a4iGc3hqdH+Dgnx5e3d6cYl/e3Jnc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWntjUlZddltbZ2xiVmtgYG5mZmxwaHB2eI90a46Ndn92eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIB4iodkcYBqanFjWG17hpyJg4Fyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXqAeGl1eWeCd2h1h4yOlX1zh2pvfoB4bn1dV298bHN+iHqAbm6Kf3B2ZnZ/gH6AdXpveXKFenhxZXJgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3FIQWldYWdfXFV7Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue6C3bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9Z2trW1ZveIukgYV/cJmScX92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdYaNhpaAcItna3uCdG11Ylttempzeol6gGV0hnxtcGd0fnd9fnB6anl5f3h2b2RsYWyJfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxqSkVsW2JlV1lUeVpOV29rWV1sZVxaZWNedGZsZXFnc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd1dYWGeIKFend0dm5renBhaGtnhnSNhG5nXl98bnmIfGdsd2ZqZFZXc3COp32Ee3aWkHR7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFlc2VgandmcHWIeXxhdYN2amtxdHpweXdye2V9fX12dW1jZWBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxMbFhkYlVUVXNXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dXGFhY+CgXqLdXSRgHyBlY6BhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV11aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXt8kI54dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGhqeHRxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIUmxFYXlmYk5Ucl5KTVVaZm14e2ZfbXFqZF1WYFZwb1dKVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVZaW2uBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR1dmZoaWFXVlloZJCob393f4qOenBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGxhbXtwamd5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWRRSFdiR2N3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2ZUSV1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKLjX1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWXBtW15XWVtse2Jxd3ZtY1xudHVodndyb4Z5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoGBc3xhYmlcVFheY2SQpWl5dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlmd21hZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNZbm5gb3B/enNlcYBkX252amNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVEtkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIuGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybVtZWFdgbHZjanVqal9bbnRybXV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF+fnCAXGFjXlNaYVxkk59lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYW9xf3hzZW9+W2FxcWJfaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVeWnB2b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3e3xvhFxjXmNUW2BaY5eVY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn90c2JtdVVjcmtcXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3aAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gbmplcXl+Z1pWWF9seHp6boJeYV1oVlhgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dmbnJ/cnJeaWxTZnFlVmJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI56bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgpV4qLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSqVhUcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+IgoODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi4+KipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4aLioWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiNiYSGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiHiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH18fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJuc2phWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW51cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJobG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh6fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1xpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGlVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BBQD8/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08QVNEPzw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUBZYUdDPT1ARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSWpmUU1FQ0dGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOaWdbW1ZMSE5NSElISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTVZlZGJgZWBOX0lHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNY2ppaGNmaGdfQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SU1tdW1qaWlpa0k6PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9mUXV4dG1tbm9sRDc4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYptdnyEcW9wb25LMjY4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hyc3xycW5vbkQzNjg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHh4iIioqMi4qLjYVsaGxveX1mPjs7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNj39mbG95fl5FQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjXlwcm92XUtMSEhIRUZIR0VDQUBDRURDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMjIyMjXxzcnBYTFJMS0tJSkpKSUZEREdIR0RERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyNinl3dW9jUU5MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhYWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjIyOhXl8eHJZTk1OTEpJRkpJRktJR0tKSUpHR0dLTE5MTUhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMeXJiXVtQUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSEpKTEpMRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI1/YFxXV1dVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NTE5HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjItuX1ttZEhVU1NSSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hyYWhYPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh4enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhoWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x8cnNbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJWU1ZUV191eICFhISFhoaGhoeHh4eIiIiIh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3pvc1pNTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFeT0ZBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZGRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0pHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hIR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0tHQ0JJSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHREdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZISEdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTU5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LRElMS09NT05PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz09Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUU1BST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gYl5cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTUlFSTE9SUlBWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTlRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MTE1HQ0NBRDw/RUVFQz1BQUNCQ0NEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BvampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZDR0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUhISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUhHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpNSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dXZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZDR0VCRUhJRkdISEZGSUdIR0lLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX11eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0pNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSWl1dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSU1QRUZJSktOTExJS0xJSUhESEtRT01NUExMSktISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNDRkdCTUhCS0tPT05MRk1GR0lKSEdMTE1PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OSEtGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoOEgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUtFUlZMS05JS1JYV1FNT09MUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOTE9IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3NydXl+gXN1em58fXl4cm5OS1N1TkNCRlBPSEpLSUtQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5VTGxgdnVraXV7em1+eGt8cFxeXmJbXmFkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ2xtcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlJRS1FNS0xQU1VTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVU1RVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBOTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2RgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUUxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXVFZaWFxdW1tdVlNNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlWV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU9SWlNSUVRSVFVUS1JXVltZWlNPU1FWVldUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWlVaXlhfXllcWVFXUllZWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmhoYmZpY2VeYmJjYWBgX11dWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXmFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6enx9fX19fHx8e3x8e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPYWiUrKysqJWOSjY2MjI2Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExsbGxsUXZaRkJCPkYx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4cG9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISDhHhzc3Nzc3N5fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXx7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH16e357d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fH18fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF0naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnNzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpiyoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgX5+n6uklqSbm5agn4Z/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDi5eal5aYoJqdnZ2ampiQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4eLh4KDgoGAgICAgYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f4CAgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgIKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KFgoGEhYSDg4OCg4OEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5OQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOChZODgYOFg4OEg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKRlIGBg4OCg4ODgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDhpaVkIyCgoOEhIODg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIOEhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDhISLmaCqqJuKhI6Jg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SEhYqTmKClpJuNloeFhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYaGhoeGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhISGlZeVl5+fnp2Sh4iGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eGhoaFg4OEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYycm5qXmpybmY6HiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3p/mZeKlJmZmJWUjImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yalX+BlpiXlZONiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXj4yYlpiXk4mHh4eHiIeHiYaHhoiHh4mJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoKan5yYjYqLg4SEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYegnpqMh4iAgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEg4KDg4OBfn1+f4CAgYB+fX19fX59fHp7eo+bl5aSiX6Af3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6e46XlZeGfn5/fn5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/f39/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f5CQj5GRf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9+fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5go2Jj5aHgYCAgYB/gX+AgICBgYKCgH6Afn9+fn9+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhYSCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoGCgoKAf359fX1+foB9fX19fX19fX18enp5eXl7iImHh4iDgYKDgYCCgIKBgYODg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXl8goKEhYOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYJ/gouEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5enx/gH2Gk4ODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEhIWFg4SEg4OEg4SFhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7fYCCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OCgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx9fX19fX18fXx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx+foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42LioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4B/f39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXx9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fX19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGDgYCAgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoB/gICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoKBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/f3+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYGCgYCBgX2AgH6AfX59fn+AgIB/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+Af3+BgoGAf36AgX5/gIKCgIGDgoSFhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn18f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOBgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXx8e318e3x8fH18fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH18fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/f39/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fH14eHV4eHl7fHx9e3t8fHx9fn9/f39+fX1+gH9/gYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpydnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIGAgYGBgYGDgH+Bg4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WDgoOCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOBgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fXx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRxeHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SAgoOCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgYGAgH99fXx8fXt2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGDgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+BgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgn2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4SEgoOCgoGDhIOEhIWDhIWGhIWGfYR6fX5/g3uFg4GEg4F/fX5/fn6Cg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f35+gX+AgH59gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SEg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoB/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhIWEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFhISEg4KBfn9+e3x7fnx8fX5/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhoSGhoSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fH18fXt8fHx8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIhoWHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fn18fXp6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhISCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLmwi4uLioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6OllVNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0dzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaueY2FiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs7Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0c3Mzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzs3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zPz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3FpKCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuzp52HnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZeckJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Uq5p+o5KKrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7Nzw/QDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uYiqGarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlm5uapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpyvnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Saz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNbMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR1Mq91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eXlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs4Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1FThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFdQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5NUGOGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn5qlKWVnX2IgF9yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3ttUXWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndXTktyk4aDTV9vcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULy89eId3dkFEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVReSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI6DdU9ujnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueaGkmpVlTF94bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6jqnRopqzqFhMrZNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6KihXd+fXLOxq+Zpq9rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urI6Gg26RzLyUlKWWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0tZ+HeWRYn7W7pqeZiHdrcW94eXt+hY6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SPcmZSRIuVhYWFfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yuo5WIdFlaUURpd2pudG5rZWVZV11YXGNqamlmYWmLtsHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmmnJOFcl5RVEtEW2VeY2plYWBoWVRYU1dZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vItpN0Y1VQT1RIPl5sX19lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWFiaWNgW2NfV1JPUFBXgbS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVpdZWxlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9GXWJhamBaWFdUVneat7+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVmVhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pd4CKVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4KQl2+ryMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2R9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI1+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSUSXvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjUN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwXhSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urFvY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGgfHJsrcjFxL/Awb/Lx8PAyMC6wru5s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLhtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMC0s660tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2zdoGzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5B+wMTDvry/u7u4tsHCtb+6tK2urK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJacpZWhca7JxMC9v7mzrrK8uq67tLOlqqasur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLChpXKly8K/ubq1rqWss7GmsrConaCepK22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYOqnpljqb+4tbKxra2fpKemoq6mnJWYl5meqK24q6qqnqSopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vI+hsqujcqywqautq6OooJ2dpZqFn5SQlJaOlp2nraOio5+hpqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmZmVaU5AUnhxUElJS2ecgVlFUq67sayzr66srba2srS1rqimn5qbnZ6mqJ6gqKmfoaeWn5FVgZ6RjI6Ui5WZoqefn6GioaWlnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBKVI5gY2KArrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olKNVVoeVj4uMlJCWmqCnnp+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXKed09uS0tjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJqTOmSEjYyLjpeUmZ6iqZ2hoJymp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0llo1tlfm9yXVFrY1tkX11rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KjgD1kgIF7eX+UmJ2jo6eepqufp66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aeoINqY2Zwenh1foybpqmrpbWyn620t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZ62q39nf4Z9dXl7gZ20rrPBmKm3uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmaC81bmVhYiMhXpxcGyAqbvEnJC5w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhth5+z29S8q5yJhouCcmhdXZDOtnOtx8XFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbXCRu8PHxMC3loOChIRyYFeFuYCA0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcm9se4hnjq22taGOfXp6a2hlcYRfutTR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1xcXB5UVl8mKSjln5vamNmamZdk9jR0tPU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcHBubHFvdYBjWneSm5mFaWFfY2ljeczUzc/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucXJ2fGBdgJSYimdZWV5tdZfH1M7L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucXFycXd3W2eHj4piVVlqgpGds83OxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NHTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFxbWlteGhVeIN8W1Rpf5Kbn67Fxr/BxM7Ox8XHzcrRx8rNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWtxX2Vvalhcd4KRl5eit7q6uLvIxcHDwMPIycjIycfBxcvFx8rNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYm5xbmlmZ2tpbnZcWlpcYHN+hoaCkq6vsa+uwLm6u7m4wMHBw729uby/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBrZGNpamp1cEhPXFloc29pZJOlpqqoo7WxtbOysrO7tbywtq+zr7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhnanlfQ1BMXFxWUnOhmp6mopqnqa+rqauos621r7Gnraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWl1jbW1mZGRkZWdseFE9RUxYX1qXpZadn5uVl6Gnq6Kmoaqpq6qvoqWeqq21trG9uK+3r6ituLSzvLezvLC4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5zRkRkgXBdlJmHnK6WkoycnqahoZ+kpaalrJ+cm6SlrLKwtransKunqrSrs7mwtbWutrmzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbGtZe3lfVFxEXmKTpJGHmJ2epJudnqKkoqadmqKbnqqurLG0o6ipqauspLS4rLavrbO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVvZllYSDIhIlxYX46UiZadnqWcmZujpaGkm56gmpitra2usaCkoq2rp6G1sLGxrKmvs6i6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFROjMhGitolI94kYyRm5mdmpSfn6iinZ6nnJqZqqausKqboqO3qaGgrqi1qqanrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJpaT0zLTJOf42TjJOOj5abmJyTnZ2lpKKlpp6cnqWfqq6ln6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWtYND9NdISKiYySjI6RnpWdlJmdo6CrpKOjoqOhm6mqo5mdpLGpoaCdpaqeqKKfrayqqa6toqKilZiimpyQrKmwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFldW1tcXFxdXF9jaEBScYd7hYaFj4qMjJeWnpiYnqWmqaaqpqilopikraOUmKSuqaCcmZugn66ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmVxeXZ/c4CFgYmEj4uSlJ2bl5yop6Ssqqevo6aYnquflJSjqKadl5GPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganRscml7gnyGf4+Ej46Tl5WapZidqKWkqp2ml56kmpGOnqKal5eGhZKbpI+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFpZGhjdnx2fneJfoiFj42Pmp2Ml5qioKKYpJWgmpSMhpiai3ONg36Ol5aGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpywu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaF9jYHF4cWtJU22LfZGCiJiTiJGOnpeclZWVk42ViX+TiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrayYp7Ojqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBlXlttdWlKPTt8ko2LeYSQiYKHipmMlZSJkYaElIV4iH9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqGpnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1Vaa3RkaHFgX1VPjIOQhHB6gn15goqRgJGZi496hY5/dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5xenBrXG6GkZWMjHdjdX1zdXyGjnuCmJJ/cIaOe3Z6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PS1JPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWRtaWJ/n6O+fHB0X3d0a3h1ho54eoqEbmuLkXhzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFpaoIFdlWNtdGF6bGp8d4iGdICFhHNrmJBzcntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlRSGCqrpxsdXJoeWluf36Cf3iChIR4cZ+Tc3eAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVJDSIBvend2cXppc4SFeXuCgX2KfHSgmHl9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUUlkfYN2hHV3bnmLiHd6hoR9lIV2n5iHho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPRkM/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XYFhtWFpcZYaNgI98gH2BjY98g4aOf5iTgJ+gl5SamaWtkpm7sae7x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSFBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9hfGVlanGVlIiVjo+HiouWhZCNm4menpChqaSiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTkxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlJebId6cX55mJaVoqCdlp2Tn5KanKacpqmdp6uoqbSWq76rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU9RWWyDjXWQhpygo6+5tKCqqaqlprKprrSwsKy6sLK9m7LDq7rJy7jDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGgq6GkqI+csYuVo6a3upugoq+SopyhnY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lGSFFOUFeAkJ2Cqp+tpay8xMCnsMO1qrG+sba8tL2zwLW7uqK4xai1yce1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6anoaaaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejaGqoa6wvbCzvMnGtLnDvLKyv7W2wLO+r7Z0sLOlusSkr8a5sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKSvqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZKstLK4tcW7trrHy7m6wLu2tLq5tr2zubHFYHSxpLGanqq9qaWoq6qjorK1oKuon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgrLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr62u7TDvLi3yMm5tbm1t7iytrSzrrW1mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyb3BvMHAxMTFyr7HzbKjurC0rpqrt7uYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEY+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XFr7exubuzsMPFtK+4sLC7q7Kwpqq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uypa+0qau7v7CqtKakuKarrqCrtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZCOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOg4eFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6hrJuhmpiepZ6fq5mLmouQkY2EfIeHg4WLjp+Zk4iEh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnx9a2pdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQg4mPlpmWlaWcl5+VnpORl6KdmauVkJCKjJGCjISIiIGFj5Gdm5mJhoyBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGlrZ2FWWVdXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCSk42cmZKTkJaNi5WfnJSglJGNjY+Lfo+OjYqDiJKWmp6eiIyVkp2RgYt/pZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHpua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiLkpKLk5OTjouPioeWmpyPlJaQipGThoCLiJGMiomclpiiooaTnZagiomIjZuQg4iOf4OHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amhfX1pVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIySk4mFiomFlpmaj4+Uk4aUl4N/j4uZh42QqpeWoqKImZ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2ZgYF9RS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiNlIuLk4+HgIaHiJKYlIyKk5OGlJiGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBiV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomJjJSGkHyOjn2Dho6PlJSIh5KWi4+VjYuMl5iRm5m0lpWqnYuclJKNkJKLmJqKkp2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxfXFVhU1FIRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWm6easZqRq52Omo+SjpWQj5WWjpCgkIiVnKSslJaPlJyelKCdm5ifoJWbn6inpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnVkX11iXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeoOMkY6RoYyMlJGOh5egmJOZlZaloK6djKqcjpaPkpGVlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltfbVROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4uTo5mXm5SToZ6pn5GlmoyPj5CVloh8jpWSkaKalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZX15MTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTj5OUkqWdk52Zk6ChoZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKusuaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmouxlZqZlZKSmZilo5WfmpWZqJyboaCZioyPlp1gSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyrtLWrqqetrJmkrqalqay6v6irt7e+wcC+t7Kyw7C3vayjrrStuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqeoKmep6CYmamZoaedl5CNkZ2DbXWTopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1MRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypraywo6OZqrW7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7eeqJylo5qboJqnpbKhmp2lnKepnZiUj5Sbi5aJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobS0uratqLWysp6co6Wal5WZqqGeeGNfYV9MSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLXAsLy2urenpKurraGhm6urxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSytbC+o5ajlZOak62fkKGhpKKjnpC+pKidqKucnKCbpp+9opiknqKpq6CdlY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWkmpirsbWxqqWqraycmKCgko+QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS1taOdpJSRk6Ctn5ihnaioqqKawqyonautmpqdmKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXl46io5WQpa6zq6mioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKmqm5+moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u1tq6qoqaVlZSiq6Gfn5mnq6+vr7uxpZ+pqZmYl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilpCOn6CTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+eqKSZk5STo6C3o6Slla6xsaWppaGem5malZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaXoJWNkJ2elIupqaqip6GanpaNj5mQgoaViZWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO4uKqtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLiZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl56UiZKbmZSOqamnoKOcmZuTh4+Zi36Nl4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7Sqr7K4n5esraiumKmpjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqqzqaqymZ2nm5qUjKCmpLSup6GsrK2xp7Orsamjm56opJ6VoZqcqLapmJqSkp+Zn6Ggkq2hm5qIl5mMnZqelIuPl5eal6elo6Cel5aWlICQlYR7j5OEjZdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKilrq21qa+zuaansLfGt7G3v8LCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurrWxubeqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCllZaambGiraClr5ahpJqZko2ipaeyqaGmsayqtaWusLSvo5mdraebl56bmqy4opiTkY+YnKGZmJWuoZ+Xg5abjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFLXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe7xL23v7/BuMC9sr2uqLq5uLfCt6yusrqWl6evrKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKem5WXpaWkt6eisLOrp7Cnra+0rKSZoayonJydnZWquZyVj4+MmJ2jmJGYqKShmYaVmJGdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcSk9kXT9ie0dJOEdnV2ZbTV5iTVlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm5rsG8w7izsrXCw8/EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1raqysauoqLW6rLWytau0raqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoq5ygmZuTpLWaj4mOiJGjoZaPlp+jl5aHkZaUnpuZlpWHmJKVmaecoKCNk5KOkXh+j4V9fX2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpObVhiW05hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamwpKejs7SwtLSwsKCrrb3Mu67CvceytK60wcPRxMa/wbK+wsO8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqqrpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnqKnqKGspqOtrLawsaCpo6CqrbCsnZ6np6mao5iZkKComIaEj4uLn6CQjI6XnpKSiImSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfHeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY+V3VYYFlPY1xOVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8PEzs7Dv8C0wMPEusG0ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLult7OsrK6oq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKeloaGrlqqhk5ugpp6ko6qjrKKeprG2rKyipaOaqauuqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZyRk42Fjpmlm5ORm4yTkpKUo5qcmouPi4x8hoKCgXp1gYSBfnV3i6KHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Yqaittaq1saqlq6qpvMDAubq0vLWms6/DycvRv8G7ub+/w7rCusHErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7S3q6ykqqqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmiqZ+tm5GqoZ2gpKOmoqqenKa0rqelqaKkmKWmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyQkJOPhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeCf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlNjUE1VVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpaqsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMLAv6+ys7O2vbzBsbK0q7Sppbappa2zsrivoq20sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCopp6nm5mpsKmin6yioZKioqOnmZqpppiYmZ2Pi4eViH2OhoSFpJaGg4SNiJGQkoaHlqGXiZGekZOQjZGclZiPi4aGeHSBgH10eHqAe3R0e2qCiKR2aV5la4F1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqOko6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO1p6essba4sqWnubWttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rtLCunamkoK+cmrOilqWbpaSfpZqaqKqlnpqpoZuRm6CknpmXqaqRmZqSkIuCj4V+kIOAiJ+Ph4F/jYmTkJGGg5WblIaToo6UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfZ2NyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yitKaqq661t7SpnLm7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qVjIl9gI2IkpCNi4eTmJGHlKSKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLWnqKqvrbivqJi4vKStvrS0oa24taemqLCzoJ6lpaehpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjYyJeoSNhoyOjYaKk5qPiZWgiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xua+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3qCiIWKjY+GkJOYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW5mcmlrZWhdZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGqrbGfmb+1pKe0taiesrypqKWpr6yZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo2Uk6SopJCJio+GeoR7hIZ9nY2Ki4d6gYWIiYqShpeSkouQlZSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLGso7aup62ut8C/vLLCt7Cusra2uba2raq9s66ysby/t667u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqmqq7GlmJ6qnaakkZilrKKYnqSpoZyhm5afnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiYqLiXmFd4GCgZ2Hi4KKfYCFiIeGkYSXlJCOj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBYmVmZmZqaWNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqysaO3rKqtqbi8u7qtwLKurq62r7O4s6mrubGvrrO2uravuL2spp61qp+gr6Oprpuhv6Cwo66xr7eutZ6tr62topmdp6mln5Wap6WfmaSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko+QkZeOkH+AjY6Db4F/ZnltZ2tpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsc3BgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rbuuraqrt6qzt66msrWyrqmwtraws7W6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKejnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiGa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrG5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7OpnaGjm6WmmKu5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9iJ50h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+qqaeqv8Ovsbq8t8C/qqW3sKmspLK0rq6zt6qopbCtpbSym621trWmp6iysKyyp62dqaCxp5+jopmfoZqss5SjpaW2vaatp6uqrKiloaCYoKajmZmlo6SYnKSplpSim5OSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVOMXFdbUEFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK+srW/tba+wauntKysqaaus6mvtrOnp6a0pae4rZyzsrarpaSnsa2ssKaqnaaksKKhn52Wmp6crauTnaKfs7qjqqmira6loZyamqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66jsLqvo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+bopuWlZaamqullZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDg6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wdn5+ulZ6ZlJSVmJ2soJmZpKi1r6Kqj6qoqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5h6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYl5WVlJagqZyZlqetsKmjn4+to6iWnZaboaWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ6hqaSxp6ypo5mcmaedlZOXl5GSoaaflZOlqrCmopaTraCmkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5VZR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m0q6quoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj9ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSlmaWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYKMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQXNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Coo6qypLSlrKWelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJykrJ6QoKirn5qfqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjZh8pLu5vZx0erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9dXT0rOlZVJz47PKeeoaK/pZa0w7Ssq6isq6m6rrDFrbOyrbams7irqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZOcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpneHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNwmoppcot9hpVna39ydXh9fmJbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtXZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKilm5eUoJumrai9p6iklJOblZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqKYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpuUoJyNgnqlhW1rfZF8gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glKKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaZk5CcjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgubC/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqpqGcq6KkqKSktKScopKmrau3s6euopGQmZylkpGfoZibn52Ip62lrK7AwLGhqa+plpKfnaKaoqSqo5Ogop2era+qraekpKihpqWdrKiRo5qoramanKibq6CVlqSVn6KWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnuoh4WgdZeTiLNjgquGoY6Ns2qEr3R9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGFybXBoYGB6ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mll5yir5+gn6inoqWgn7Crmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn66mrLGpwMezqKmxrpaSnZyil5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0Q5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52no7Ctpa22q7rOsq2mrqyXlZydopmerqycl6Canp+ps6urq5utq6Wjq5qusaGnq62lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpqCbpJ6dpaeno5yrmqKsoaOfr6GcmpKrpLWvrqCnmp2Vk6aikJqiqKCgppyxpqapsq63yLK1qqyplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhs62hqrOxoZqop62utKGRlKKml5qRe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqau1sqybpZyglI+lrJGZnKijoaqnrqKlp6mwtcOys6qtqJOKl5ylm6GjrqWXoZWZnKamrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopiejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp6YiqSXo6l/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgnBbZGBpb2NkXUxNUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpunpqGisK6dpqmitrLFsa2pramRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaeYr6S7rKG2tq2dnLSxt6+xpZecrp+inYWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmmapJyVip98mJmGh49zr4Klm6KOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBLW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqOfpaGhtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ22m6OrpLasxLCpq6mijISOnKKgpqKWmZqdmZyZp6anma2or6Smm62mvayUva+sn6GvsrepsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWthaCVqqCil4afgJmVgHuSfquAnZqWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKfsLCqn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaahmqWdrpihqKe3qcGvpKmknouBjpuan6efkpSZm5WbmqalppuqrK2kpZ+pqL6klsKsqqKgqrG3qKylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SmlZqBrIqEsIWmmqShoZGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFtmI+om4yYkpqafHqRn39ldX9jhnh0gX1iamdxbmdmZlBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop6ln5qjo6WZoKKqs6m9r6Sonp2PfoublqGhmpCRmpySmpipoKKaqa6opqaipKm7nqDGpqSooKmzs6qtpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoTXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52Rm5KaoHuDk517ZH57ZY9neYJ8YWxma2tjUWJbU2pcP1ViQ00pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaep5yaoamjmZ+hrK6quq2no5qXk32ImZGmnJOPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKosrKnrqmfuaatrZlzdqqluIZkiaBwaK6Ri5BubnekkJmfgXWumJRwj4txlaijmpeupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZmTmqJ+iZGYd2eJeGmPa3mAemVtZGdtY0tlWEprWjpRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpZKnmamal6OqoZaepqeosLurq5qbk5N8hJaOppmOkpGZlY6YlqmWoJmpo5yxpp2iq7mfr8Gno7Klqq6wqauppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVq6eNkpKMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4V+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpqlhImXkHNrkXdxjHh3fXpqbWVkcGVVYVlAalxIY2JQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOXqJqompSmoaSRnKmaora7p6qYmpCNfYGVjKKVi5WRlpGQlJimkKCbqqCdtqOdpqu3p67AraK2pa6ur6unp7G2n627mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqK+Yo6Cco6qenp6dl6ydk5mhm5SQlquajpmZl5GWn5GIoZ6WlYWSjZGOlYuBfmaLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjk5+ZpIWKm4p9dJd0e4yAc3x/am9lX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqJmojZqqkJ+6t6SkmJyNiXqClI2clIuVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKwnnd4nqevuJR1rKOeiYCrf2RcYnagj6WfhJh9bZKznKOnraqiZZ6fknN5mpdxgZmomG1/oqiKZZymnZKYmJaNkpyQhp6bkJaEkoePkJKJhXdqjod2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3uonJxme5uKhXqZaoWMhG96gGtyZWB3cGxraVxmZmJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpart7Gzp5urqK2YdI2esaCoq6eUl7mgoI+cpJ2Rf4mImp6Mq5mhlKehnY6Wkp6Edq2PiKebqZKZpYqdu7SooJmYi4l1d5ONl5OKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmn32nonmgrLR/jo2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWgpGXl4SbmWJ6h5CFj5CSi4NtcI2HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseXxxcWhleHBqbGtcZWxqZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8nAsaKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyFjpiXh6qboJWfoJGMk4mGgJGnjYejnqSVmZ+In7qyqJ6ako6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3N7d52Pp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxkJSGaXl1fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCkpaylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJaVkYeqmJqamaGEjot3m5yPn5CInqWcl5qZiKS5rqWanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprIWjjamZjJp/onWBmZRsgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgWNYUXB3Zm51c2tqb11qcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZiho6atr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGTkoyKppSUmJ2efpKFhaykh5uQipmqmZubkomnsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXRcnrKDa2NwdXdyaW9Ya21zc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARF9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGBlo2Kj6COkpSdmH2QiY2ooIeXjomSpJWcm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGhdbnJ6eGtpXHFreXpkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aVg5GVmJB6ioSVpJyKlI+GjJ+Tnp2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXpV2SGVkYXRyf39vZmBsaXd8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn52bmpaZoZ2WiIeJd4aBb3mVhZGbinuRk5aIcoCIkqGcc5GQgYmalqGchY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnp17pZZ6qYCVm4+Jn5t8p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5dsnHx4l3NuqaRnYWV6coCFbGhmZG92eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbGdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmaqhoqWPpqmhmquLm5mZlJmTk6GYjoeFe3B9hGh9j4OUmoB3kY6PiW9/hY6SkmyXk3yKk5Sll4OPq5uUk4uGiXmDdoiBboKfhniBkoaImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlosrW0xqZzmH16nWucm6t2hZtud3mYapp7dZhyUUV9s19qd2x6iGdraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJiro6Omjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY16joyXppSEmaqYjZKLgYl6gH2MeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbF2Ii256fXFxZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVIteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfImImKiSgaOtkYaQi4KKfoCAj3RpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foqknneffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaW1TV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjIxzhnqIhG+MhH2Zk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdsg4VddWd3jmV/gISMp5l9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHbmpnVltgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6iipuom6qZg4KcjH+XlIeOiomNcYJ8j31+joR7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWDho6YdnKEqYaOkp2QiZ+eiIybp5+fqoOJjpWafn6Jlq2nj5Glj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6mnuCioF1gYWBZ3eKhmpfb3GBdV5xiYCIjaSUhWWLjYNud4uEcYaPenFoaWZ8hHuWW1xraG52W3x5eHZvdHODaF1ui2trYlpaX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmKiYeHinJ9gYx2hYuBhJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKki4iTm5yjmZWqoaemn5KahpSMenaNjYOnfn+SkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYSQd3x6dJmgiIaJnYmEk359ioB/dG5yhIF9doWFiY6kj4KFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0inF+e3h3cHh1gl1eb4dobl9eWl1dU2hyVmRdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKShnnx/mqyPn46HoJ2MnpZ9eZWEfI6ZioaEhIZueYGBc4GHfYmUhG1rfnqXh4ODj36Ah4SFfIiFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJeHh5uln6KZnIWCkpqZmI+ap5+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqEhIxzf4l7fHFxeoeCeneIjYORpY6Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheen9pfn13dnd2e3hdYHF+bnRgY1tdX1JnblRmW15ia2l2en9ybG1ka2pogX9sdIJsbHVvenCGem6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVjJmZenqNhn2JkYSMgoKDbnyAeXOBhH2Lkn1raH2Cl4mBiI17fYaEhnyQg5GdnZOJqZ2BcYyLjJKGoKGKhYx8qJGJkJKXk5aTeI2jn6CdlZh+gJCamJKMm6Oho5mWkJp9jIN3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfoiJcoGGe3xwd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH54h3tsjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V9ipF3Z2N+hpeKgoqLeHyAjYN5l4OWmZiNl6Gcf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnaChl5OVeH6Ol5eNlpudpJ2YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4aRl4t8k3iLiHt/hnt6cX13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW2xlU2RZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYN6bpCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmnuXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEf4mLgGRffYuUh3+EhnR9fot/fZmGl5WYjaSimYBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5efmpGPj3J/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5eem6SUlYuMnouGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lZaDfo10kIeCeIZ9dXd/fISAe4KLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ3YHBsdm5vXFxfXl5rXlBeWWNhaG50e4lsYGlla2Npd4duZ21pa21ogX17eG+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZh+n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Jze4CHeo+SiZOSnZWmnJaCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIySnJKPi4tthJCPkYiemaKglpWIlpBth5iDZYWYjpN6iYSQinCWm5Wjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5e5iTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3Fmel5vbHNtclhbX2BhbFxQV1hlY2dxcX+IZ11paWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOPiKGNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeMjI2NjJyJjpCCbImLkZGKnZahm5eUhJeGaYOigWWEnImQfouDi4F3k5mTn5KRiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudX+YjnuHhHmTkHl1h3NviHqEinmKhYGGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcG9rcW1ZWWJhYm9ZUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ybjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgauUhoJ3f3dyg3qDoYOTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKe3KLhYqOiJyan5uVk3+TfWeEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlIt+h4V6ko9xeYNvdYt5iIp5iHyAio6dnIR7enaCi3x3cWpsgoR7YXlxb21zdFZfcGJyYmBtb3pxaXBmZ3V1aXJsYndlXVdmYWBzVFFPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoeAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1tdHNSTYLfyJLWk3twdYR2haGElHeWkZmdkZl7lHOFkJ6hkpORi5OclIZ/l5aIjY2HkY2Hm36NgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIloOGY4yRmY+Vi5eMjIqKcXqUiHuOiIqTkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR5gI2TmZiJfHV3g494c21ncYCFbmx1cGlqdW5TX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fdlBOTGJnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amhrY6Sawdyu8KFzbHaFd4akhpNwl5GWoZWcgZJyhouil4mNlouQnZaDgZaQhYmPgJGLiZV9hnp1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXhOTUxlZ2Jed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPapmRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuQi4WOgH91eIOEcoiCk5yWlJeFjHWGfW+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hY6EkIF7gHx9j5GOlIhtcHmMhXRrcGxzeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGhjaVltV1x1TEtMZmdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBpYWdhf9W2jpGmeG9xeH1xlJKOiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDe3GGgJaajpOTgYh0goV1gn+JkZydhpWPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcXCEe46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcoBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB+ZWNnZ1edj19xc5a9xYV3cpWLkYB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaTjZ2AiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaGh+d2VdcmRZcHRTVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXWtuYXFQWmxSRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYhwepKEfoOEiYNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xwfHJ/h4OIfYWHeohxgG1wgoWNgoJxg3d/loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnJuTlhydGdgS253dmJeXFtZdX5zcFhnXmZrcV9vT1hpUz9ZZ19bcWtoenJcW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIWZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIyHf3uSiHmAhY6DbIByaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltnZm9jak5YZlE9XmZdXnZmX3VxW1lVb2RaZHF6XGheYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1/jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8kIpxfH6GfGl+bWuAe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tV219dXOJgIV2hnSCiXp3cm2If45/g3F9e3yQh4d5bW1obIKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmhOQWFkXGB3YVx1bVhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3Fyh4KBe4Fwhol3eG9vgoGLfXx3fHpzjISAdWdwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURkYlxkcV5ceGhVV1Z4XlxmbmlXbF5hamdlbm5ocHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjWVxgm5ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11d39taHdlbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4GFfX93a4iGc3hqdH+Cgnx5e3d6cYl/e3Jmc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1VeckdCZl9eZ2ldWntjUlZddltbZ2thV2tgYG5mZmxxaHB2eI90a46Ndn93eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hkcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iHqAbm6Kf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3BHQWhdYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinWAe3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue5+4bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eYuCZXB9Z2trW1ZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeol6gGV0hnxtcGd0fXZ8fnB6anl5f3h2b2RrYG2JfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxpSkRqWmJlV1lVeVpOV29rWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2gH94f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd0dIWGeIKFend0dm5renBhaGtnhnSNg21nXl98b3qJfGhsd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3uIhoSHhH11cXNtaHVdbWlgbHVkZ2Zpem97cllngXZ1aHCBeIJ3Y3iFi32Vgm+Ma217gXFmc2Vga3hmcHWIeXxhdYN1aWtxdHlveHdye2V9fX12dW1jZGBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxLa1lkYlZUVXNWTVl3ZVpfbGBcW2RlX3dnbWJvaXRvcX51dJmBeICBeIB/hoR6fXaCg36YhW5ydHx7dXGFhY6CgXqLdXSQgH2BlY6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV15aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXKAb2dpeHNxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVaZm15e2ZfbXFqZF1WYFZvb1hLVGlYZ19ZTlVsVEtdel9cX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR2dmZoaWFXVlloZJCob393f4qOenBve2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnZkdYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGtgbHpuaWh5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWWltd3tlZW5yZmNaWF5Zd2ZVS11kWGlYWklXZVFJY3hbXV9tW15cYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWHBtW15YWlxse2Jxd3ZtY1xudHVpdndyboZ5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoKBc3xhYmlcVFheY2SQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeX15gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZnODk4CJg4l6dm9yfXJheGNZbm5gb3CAenNlcYBkXm11aGNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMW1dqbXN7ZGxsdWNhWVpcYndcVExkXllqVFdIWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybltZWFdgbHZjanVqal9bbnVzbnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGFjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JecGhhd2FbfHZqanJueHR0dWpygpaEh3+FdnNqcHxtZndXW2lsYW9xf3lzZW9+WmBwcGFeaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWm1xWFNQZ1hXaVRVR1pcT0lzdVhgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZ2lzaGN0ZWVeWnB2cHJ2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjXmNUW2BaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVfYG1kYXFdXX5vaGlzcXRxdXdtbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpbHlrYldcVlx1ZVRSVmlSWWdVVElaW1BOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29nc2tmeGVmXlpydm90fHl0bop7f3ece3prYWVsbV5gbmplcXl+Z1pWWF9seHt6b4NeYV1oVlhgWGSciGJrcIGGfHZranZsW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bWmGjYCKe4htcWZwe2xxbGFYX2dmbnKAc3JeaWxTZXBkVWJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aW9/ZWBVXlRedlxVUmBnUF5iVVRLXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKUk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6NjY6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD8vMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0REQ1hoZmdnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4aJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5COi42FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiIeKjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OSk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f39/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JscWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJucmphWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW11cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJoa29wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2lsbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3Ntbmxqa2hVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHN0cGdUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbHxqPzk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJTFFNTUtFQ0ZHR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk5pWk9QTklHSUhISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hLVnNeVlFLSEhISERHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8UEpZbmVeXVRHQ01GQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SmBiYWFjZVNOWDw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5xaGhnZWdpZmhGNjg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIx4bWxpaGlqWTU2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qKi4l2bW1tbGxVNzg1Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYhybm9vcGVAPjo7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoJycnFxY0dGQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjX5yc3JTS0pLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyMi3t6dF5nXVBLS0tJSkpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt4e29nVU1MTUpKS0hLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2OgnhyVVJST01OS0lJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMc1tWVFFRT0xLSEdDSEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI18XFtXVldVUU5MS0VGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+Mi4tsXVptYkdVU1JRSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dvX2dYPFlaWVRRP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJi4x7cXJaXV1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIuAaFtcXVpVV1VYU1JYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1fU1daVlNWVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3pvcllMTVBQTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTkVARERERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhBQTw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX1xaSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZFRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NzVXb3Bzd3l6e3x9fX19fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXt8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTU1NTExPTlNkTkpMUkhJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49OTk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRURFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTVBMUFBRVVZXT0tWVlVTU1FSTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkZHSUZJRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUVJUWFZNTlRWVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0hKS0lJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENGRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSElFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEpJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09NSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhLS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYCDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUlZMS05JS1JYV1FNT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm9OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUklSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0xQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVVFRVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYWFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXU1ZaWFxdW1tdVlNNVFVVXFxXUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1lSVVVZWVlVV1pcVlNXXlpdXWBcYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWJmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISEhH58fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYGCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgYGBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCb3Jvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgYGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYKCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoZ58cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKepl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1qqyjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiVnIV8fn5+f35+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ukl6Sbm5ahn4Z/fX1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjp+yqKKgmZ2dpqisqKCZkYeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eal5aYoJudnZ2ZmpeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4SIkJOPlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGDgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4OCio+Cg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDg4aYj4KDhISEhIWDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDjZmVkoiEhYSFhYSEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWUm6OropOHhZCHhoeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/iZKdpaamopOQkoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3mJmJecoaCdnZqMiImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e36Sm5mdnpydk4eIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYCVmpmbmpmShYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCWmZmYlZKCgoSEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt7eoaXl5WWj4GBgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp8e4qWlpOEgH+Af3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7ent7fI2MiouXjH1/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5foyNipGPgX9+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5ho6HgoKDgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7hYSCgoSDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYOBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp/goJ/g4uEg4SEhJeXg4OEgX1+gYGCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyAgH2HlIODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8fYGCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoaEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn5+f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXt9fH19fn1+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5/fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gYCAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/gIGAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH5/gYB/f32Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgIGAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIKDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4SEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fX5/g3uFg4CEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGBgIGAgICBgYCAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aGh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9PD46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX19bU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLe909PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6Oiq9PS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaiw0tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0tTT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9PTz8/Q09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0NChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ65npaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1l5+gqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZymoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+lm8fJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uXlJ+VlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PDw9OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlnYaer7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlqCPo5uinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Scvp6ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGUlFLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojs9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNmvjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlRMRkI8PD9GRUdLST02Njc6OTc5Ojs6Oz05Pjk4Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4ODk5Ojw+PD43Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRLSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1NTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOzo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSERFQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw4Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo7ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY4ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4aBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjUzNTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2OT07PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubm4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2PDo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyODk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz5AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzo9PkA/QDpAQkJCPz9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7OwsK2sq6qpqainqKmpqaioqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiYmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTkzNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKinqKilpqiop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD46OkE8Nzw4Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2srKyrqqmopaOkpaampaanp6qopqanp6eoqKenqKinpaSkoqGhoaCfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Ctq6mprquopaWmpqelpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1Njw/PT9BPzw/QkM/QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaOio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj47Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpKSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk4PTs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Oio6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Oj07PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6goaCkp6empaOioaOnpqalo6OmpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqOlpKWlpaWlpaWko6SjoqKioaCgoaCen5+fn5+enp+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manJ2eoaampqWko6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5eYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6OkpaSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2dn56bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6ODY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6Ojo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaXmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqalpaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2en5+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnJ2cnp6en6ChoJ+foKCgoaKjo6SkpKSioaGenJqZl6O3n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZiZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoaChoaCgoaGipqGioqKhoJ6cm5ubmaGplpybm5mcnpqWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJGSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE9PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz48Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKloZ6goaKioqGgpbKtoKCfn56cmZmampyuZnidnZ6bmZqcmZeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOSkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6aTmKyfoJ+dm5qampmqgESBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCfnp2bmpqam5qYmZmYl5eWlZSUk5GRkJCRkpKTk5KTk5SXmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw9OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz86OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ufoqKem5ydnJycnZ6gn2GZqJ+enJqam5yjoU9IhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foKGgnZyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+enJmbmpycm5qamZaWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0JDOTw/Pzs6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPDo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYl5iZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqdqXKKgm5mZm52cr3JKTIahnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmJiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilglN3opmZmp2boKNfV06HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5qcnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWWlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIpcYJObmpudnKOPZVpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+PkI6RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZ6ZXV51lpqcnZ2igWVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bm5ubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDk9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZycnZybm5ubm5yamJmZm2FiYH6Vnpyel3RjVU+Bop6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmZqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpmYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oj06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56dnZ2cmpubnJubm5iZmZ9pXVtjfZycnotpXlBTh5+bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+MkI6Qi4uPj5aIiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoqqxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg6OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRho2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZuampeTdm5mVnmUmJ2JW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo4Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+MkY+LjI+QkZGOk52fkn+ipZimnXRPUGSHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo6QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaKbjHxmkqWTnHuIg2N0gICCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKjiXlsUXOcjYtYcHt8f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3OTo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmXVTS0tzk4WCTF5vcXeJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo9ODg7Ojk6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S4CCiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+DgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GOo4tQMC87eIZ2dUBCW2pugpCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/Ojw4OTU4NzU3OTU6Ojo5PDg6PD06PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5xjQ19LPHh4aWZHMTZXbXKQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZDPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqq6OSXiqfkB8eGViUVZjSl5viqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRT43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidmPC1KVFfZCEeE9tjXhWYoCjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6qppKenmZ2kpaOinmOBu8CufKSjmpdsSVx7cFJ0laOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07QEFBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCip6GmrqamnJ9sg5i5i6zTo5u0rFxNr5pVZZChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Ojh3d+enPRxLCZo61sVqeuZl2HpqCloqGdn6KYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbW2sq2wrY+HgW2Sy72VlaaVdFZtd3Vzf5WmqqekoZ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyuLu8vLq6wrm1tJ6GdmFWnrW7pqeZh3htcnB4eXp9hIyRlpuhpqespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMLIztLQzMi9saONcGVSRIiUhYWFfXhyb2Zla2hrcXNxcXJ0e4upxsa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb5OPZybuuo5WGcllaUURmd2pudG5rZWVZWF1YXGJpamhlYWuPuMHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zNDUyrmmmpGEcFxRVEtEW2ZeY2plYmFoW1VZVFdZWlxZXXmeuLqrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJuJV0YVRPT1NIPl9sX19lY2JfZGJUVldWVFVbeaKusKqoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDn2ZLREdLRD1aZGJiamRhXGRfWFNQUFJch7a6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGwilNHTUU7S1pfZmxnX1xgWVpUT1mHp6y4tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsedcVxIPz9EXmJha2JbWFdTWYChub+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsbGxsCvelVOL1ZUV2hhUk5UerLJyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLCwsPBlUNOeYOOVlB5rc3Txba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68x6Z5bYKRlnK0zMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb+ucGF8kYqL0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqysp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5tqulmI18hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG9ycWVSHzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mxvcPKjUR2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqbnVveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/AwHdRb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbW9gY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0cO6vrzEvre8wL/Jz8fIysnBhXFzpczMy83KxsLDy87BvLi9urBuY2O8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAv8nKwb+7ubGgfHJrrsjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmI98gJvKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1puc3eBn7i4wrqzu7e7vb+6u7uupJqXhpB+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJabpZWgca7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUphjaCsr7a6tbSyrLy5uLW4wb2Ll6+hpXKly8K/ubq1rqWss7Cmr62onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYKonZljqb+4tbKxra2fpKamnKOlnJaZmZqfqa65rKurn6WopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7iztLKwsa2wubi2u7e6vI+hsaqjcqywqautq6OooJ2enZaXoZWRlZePl56orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU1AUnhxUElJS2ecgVlEUq67sayzr66srba2srS1rqimnpqbnZ6mqJ6gqKmfoaeWmpaXjZuSjI6UjJaao6ign6GioaalnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBLVI5hY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olJmUlYqUjoqNlZGXm6Gpnp6foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOdd1BuS0xjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJWdmpSNj4+PkJeWmp6jqZ2goJ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSElLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXVFrY1tkX1xrj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKclqeloZWVlpGWlpSbmZ2jpKifpaOep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1RS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2etrqyvp5+eoqCWkJOboJyZl5KTn5yho5qempijbn2XmaCbop6copyipqutp6uopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ+ZSEePn5+mo66npKygqKu1sLSwsK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52JYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWmdipgkp6jq664r6+ur6+4vLu7uLW4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhsi1c1ZoV8eYCWvLy8sLnBw8LGv77CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbHBsVGBrcHJuc4+uxL7BzM3QyMTI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qe4BkWHd3cm5yf52+z83TyrPR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm+Ee3aAfXRydW90ns/Q05m219PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Bvc4OAe4F5bWloXm2+06N/0tbUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWpsb3N2fXJ5gHJiXFNZo61yq9rP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5ucHFycXZ0b3d5dGNbXHt3iNHUyczNxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NLTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltc3BocnRnZmNdd8LFx8fExL3Bxc7Ox8XGzcrRyMvNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDo6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp1amNiXmJlXajGuL/Bubm4uL3IxcHDwMPHysjIycjBxczGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXWBbWVpcYW5xbWlmZ2tpbndcWFZdYWmqwa21uLCwsa+vwbq6u7q4wMHBxL69ub3AucTKxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpamt3ck9RV2JxmrSrrq6kp6uppLWytbOys7S7tb2xt7C1r7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI+GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhobHtlSVx1h5SoqKijm5+npJuoqbCsqaups621sLKoraess7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmhteWRthJCTm6KlrpqboZ2WmaKorKOnoaupq6uwo6afqa21trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG15eYCHhpOYkZWtpqCYlI6eoKeiop+kpKalrZ+cm6OlrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmbHlzcWpYW29Fe6CflJKJmp6fpZuenqKkoqedm6KbnqqurLG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hYmNjYmJjZGVwalhBIjpxaGmHnJKSjJeenqadmpujpaGkm5+gmZiura2vsqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnqamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYGJjYWFiYGBkZnJEGRxIipSQjpmRlI6TnJqem5Wfn6einZ2nm5qaq6evsKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJqXyU3boeLjo6UkpaQkZicmZ2Unp2lpKKlpp6cn6agq6+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJUX19dXl9cXV1gYWxXXIeDiYeNi42VjpCToJeelZqeo6CrpKOjoqSinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY2Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1tcXFxdXF9ia4OJfYp/iIiHkoyPjpiYoJmZn6anqqerp6mlopikrqSVmKSvqaCcmZugn66ZnKqzn6amn6OjoZWUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2doZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmR6hHqDd4SIg4uHkYyTlp6dmJ6pqKWtq6mwo6eZnqyglJSjqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk1OTVJXWFlYWFdaW1tgaXdwdm1/hX+IgpGGkJCUmJabppmeqaalq52mmJ6lm5KOnqKal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFsaW1ne396gXqMgIqGkY2Qm5+NmJujoaOYpJahm5SNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFtdaWRnZHV8dG1LVW6Mf5ODipqViZKQnpidlZSWk42ViYCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBpZF5xeWxMPz19k4+NeoWSioOIi5qNlpSJkYaEk4V5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTkxNVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVabX1qbXZjY1hSjoaShXF8hH56g4uSgZKZi456hY9/dX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5zfnZyYXGJlJeNjXlkd350dn2Hj3yDmJF/cIaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWVvb2eDpanAfXF2YHl2bHl3ho95e4uFbmuLknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBtZWtrWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtepYZhmGVvdWJ8bWt9eImHdYGHhXNrmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjMzNTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5ud3RpempvgH+DgHmDhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTExMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2RqXklQRz0/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfHl5c3tqdIWGenyDgn6LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoYSKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYV4hnd5b3qNiXh7h4V+lod2oJmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiICCiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtNTVBXYFhvWVtdZ4mPg5F+gX+Dj498hIePgJmUgZ+gl5Sbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMTEtOVl9ifmZma3KYlouXkJCIi4yXhpGOnIqfn5GiqaSjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITExNTlJebYl7cn97m5mXpKKfl56UoJObnaedp6qep6upqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWWyEjnaSiJ6iprG7tqKsqqump7Oqr7Wxsa26sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+So52inY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUVeAkZ6Dq6Gvp66+xcGoscS1q7K/sre9tb60wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60oKeoo6eaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDk2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorCxv7K1vsrHtbrEvbKzwLa3wbS+sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayssaWwqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZKttrO5tse8uLvJzLq7wLu3tbu6tr2zubHFYHWypLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL28vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQUlNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluSt763vLXEvrm4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLuYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhlrXFsLiyuruzsMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZast6uzpq+1qau7v7CqtKWkuKarrqCrtKOOsK2al5iMkJORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbKhoa2ho62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHh4uIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6OxnqGlnaCooKOxnIWekpGRj4uNi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+grJuhmpifpZ6fq5mLmouQko2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9a2pdXFFUVWBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId7dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjoqEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSQmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisK2KmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mSnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mWoKKNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWnKeasJqRq52Omo+SjpaRj5WXjpGgkIiUm6SslJaPlJyelKGem5igoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlJaloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltebFROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5STop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52Zk6CioZyYn5iLjI+QnohakJaXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjM0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqVnKKfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7efqZylo5qcoZqnpLOhm52lnKepnZiUj5Sbi5aJjKSilJyjn6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZq6GeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKmdqaydnaGbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytm5uemKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmZl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ+boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsaWppaGem5malZeooJ+Zop+vs6OmjJevmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GanpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoaW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2ktLCcn5CTppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmZuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Orsamjm56opJ6VoZmcqLapmJqSkZ6ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6Cel5aWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajq6ilrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusrqWl6evrKiks6mUr7ukrLKypqejsrSxsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLW6rLWytauzrKqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamvpKejs7SwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqmqpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLuluLOsrK2nq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7W3rKykqaqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiXo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMHAv6+ys7O2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCop56nm5ipsKmin6yioZKhoqOnmJqpppiYmZ2Pi4eViHyNhoSFpJaGg4OMh5CQkoWHlaCWiZGdkZOQjZGclZiPi4aGeHSBf310eHqAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vK25rKO1pqessba4sqanubWttLyvvKWtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamkoK+cmrOilqWbpaSfpZqZqKqlnpqpoZuRm6CknZmXqaqRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSak4aToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qUjIl9f4yHkZCNioaSl5GHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q6uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcm5qdqaaWm56okZiSmZ2TmZahqpGbio6Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSWmY2Uk6SopJCJio+GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGljZmpqYGtjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLCso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t6+8u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyinJafnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiIqLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdXNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2uravuL2spp61qZ+fr6Oprpyhv6Cwo66xr7eutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKeknZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6Gpn7OqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56fmJCeqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+pqaeqv8Ovsbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqqCxp5+iopmgoZqss5SjpaW2vaatp6uqrKimoaCYoKajmZmlo6SYnKSplpSinJOTo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKosMK+srW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhn7Szoquco62toJ6alqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wen5+ulZ6ZlJWVl52roJmZpKi1r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw8OD06PEM6Rjo6PzY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqitsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZOlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlq7CmopaTraClkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m1q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwsKedl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJufvKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZSbrKqXjJSlmKWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Cpo6qypLSlrKWelZmqmKasuJyirZeUn4+kn5KMnKKdl52akZWSr7myrJaYpKinlJCWpJykrZ6RoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaGhpZ6gnZmTq6SsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNxmoppcot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtYZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpyUoZ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKa3OBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJurnaufkJaWp52qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamZjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSgqqSrl5aXmaWdqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAiIJueIJ4gHNteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ2hnqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kdq6KkqKSktKOcopKmrau3s6euopGRmZylkpGfoZebn52IpqykrK3AwLGhqa+pl5GenKKZoaOqo5Ohop2drK6qraekpKehpqWdrKiRo5qoramanKibq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdZiTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gn6inoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqSXnaejn62lq7CowMezqKmxrpaSnJqhl5+pqZ+VoZ+dnKyuqKyqnKiopKKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCsmp2mo6+spKy1qrrOsq2mrqyXlJucopmerqycl6Canp+osaqrq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqip5+fpZyxpaSosa23yLK1qqyplpKcm6KZn6WznZqhlJ2fpqytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKejn6mnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq6opp+so7esobK4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpumpaChr66cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKupKaYr6S7rKG2tq2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+epqKcp521mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2orqOlm62mvayUva+sn6GvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfZdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfsLCqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqSdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrKykpZ+pqL6klsKsqqKgq7K4qaylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpqafHqRn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYV5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5KaoHuDk5x7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6GYmZmTmqJ+iZGWdmeIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7ernsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKmmKmal6OqoZadpqanr7qsrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+WhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqlhImXj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVFFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xry6q6Olnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWp5mompSmoaSQm6iZobW6qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiX2LlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm62KqZaPqJmpjZmpj565tqSlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJxme5uJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmhYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcurOooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYSVkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZnRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjpC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCZl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5Zwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcGxsallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya2xyc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq6dnLKurJOYopqhpJmblZ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFqeHlkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGwrJ6mnJypoJ+vnJ6xqa2el6SboaCZl5ego5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSjqI+gnp2bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnp17pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5hsnHx4l3NuqaRnYGV6cYCFbGhmZG51eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqLm5mZlJmTkqGYjoeFe3B9hGh9j4OUmoB3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhneAkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRoY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppOEmaqYjZKLgYl6gH2LeXCQoYZ5gJWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlza1lsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlYqKlZmCfIiHl6iRgaOtkYaQi4KKfoCAjnNpkKaEfYaTjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuChpimjn+np4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4KcjH+WlIeOiomNcoN8j31+j4V7mI90coRxlYV7fZKLhoaPhHl+gIeapY58qKKMhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoSJjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX98mIZ9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4iTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4WGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5uln6KanYWCkpqamI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeCeneJjYORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2en9ybG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnKCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqZ2BcYyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCbmZKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcoGGe3xwd3qKgnh4j4uBlKWSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiNl6Gcf3CMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6OmJiOlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hnt6cX13iIN4g4+HiZehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh3+FhnV9fot/fZiGl5WYjaSimYBzh3uTkYmmj4yOipOgkYOSkJWXkYuBj5efmpGQkHN/jZKUiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnoyGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eCeIZ9dXd/fIR/e4KLg4qTo494g4F0iYd9gHR2gomFcGJ8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lsYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Nze4CHeo+SiZOSnZWmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhWZpenV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+IZ11paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi42NjJyJjZCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYGHjZqihnuDdYKLf3d5bmyBhYNfdHVzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgb29rcW1ZWWJhYm5YUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauVh4N4f3dyg3qDoIKTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJGWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt+h4V6k49xeYNvdot5iIp5iHyBio+dnYR7enaCi3x3cWpsgoR7YXlxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2IkYyHm3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqKcXqUiHuOiIqSkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3pocmpzio+JgYWEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBxY193YGBWa19edlBOTGFnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGJiZZ+h3p1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYKBfouVhGuBdW2Hj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBzb1tjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uPioWPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hI6EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2tXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiX2gf4OZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1goV0gn+JkZydhpSPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnRiXGhfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmnyLmnd+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdIiFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB3en2Lh4V7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5jpZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYdwepKEfoOEioNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xvfHJ/hoOIfYWHeohxgG1wgoWNgoNxg3d/l4uNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdnXmZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuUcG+Af3lmkoqCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuHf3uSh3iAhY2DbIBzaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9aa31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMhJudloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh+fZdvcYV9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8j4lyfH6FfGl+bWuBe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tWG19dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLdHlrWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHt0jYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d5cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1dllRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46Ndn92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweHKFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnJRUlRXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3eHeW6VinV/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anh5f3h3b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXVrTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVqWmJlV1hVeVpOV25qWV1sZVxaZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311dIKHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bISGlYFyj4JxhoJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISGeIKFend0dm5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yIhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFmc2Vfa3hmcXWJen1hdYN1aWtxdHlveHdye2V8fX53dW5jZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ0ZEtPVFhha3d+Zl1nc2llX1djV2NxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2RlX3dnbWJwaXRvcX51dJmBeH+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgXqLdXSQgH2BlI6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl9KTVVZZWx4e2ZfbXBqY11WYFZwb1dKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6aGl3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYR9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWGhsdnplZG1xZmNaWF1Yd2dUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmRef2lqYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboZ5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMWldpbHJ7ZGxsc2JhWVpbYXddVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdga3VkanVqal9bbnRybXR0dWuHfX+BfXdvbmxkaXBjW2tyZHR2jnNcV1RjX3B/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYV6MamNlbXp5bG5pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gX+BdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjWRPb21cVldVZmhzaGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmJ2fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYV5ej25iZ2x5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29lcmtmeGVlXVpydm5ze3lzbop7gHece3prYWVsbV5gbmplcHl+Z1pWWF9qd3t6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3uBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWh2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6Ojo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0RERTkuLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU3JxscHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWEg4ODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CNjI+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4eHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYaGh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQkpGRkpKTh4WTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKBkpGRko51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkY+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fX19fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI12bnuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtboN6dHaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJebGxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1lWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bWJuc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW10cmdRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxkb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJVmNna29wbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2lncm5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXWZsbmtvbW1sa2lpa2NSR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Sltpbm5vam9ta2psbGVQR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTo6PUdibnNubmxrbGdUQj9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRkVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxJX3N0cWZSPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1pPjo7Pj0+P0BAQD4/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEFERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0FEX2Q8PT07Oz0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCQ0VIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZT08PTw4Ojs/Pz08PTs8QD09PD09Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTEZGdXdNNzg4Ojs+P1dqQTs8PDo7Oz4/Pz09ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QUBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSklNTUtFQ0ZGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOT1BQTUlHSUdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hKT05PT01LR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8T1hkTElJR0dERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop2b2lTTUA+QT8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5+bGJhUj44P0A3Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYxvYGRlWUFXPTU2NTU4NzM1Njg6ODc2NTY1Njc2Nzc3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYqKiYmKioqKi4qLjIZqZmtpZlE3ODg1NTg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoRrbGtiPzw+Pzk5Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoBtbGBFREZGQkFBQj9AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjXtta09LTUtKR0hIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyNi3htYW1kTU9LS0tJSUpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyMh3l5ZWFPT01MTUpJSkhLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4yNhmlSUk9OTk1OSkhIRUpJRUtJR0tKSUpHR0dLTE5MTUhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMYVRVU1BQT0xLSEdDSEpHTEtHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI59WlhVVVZVUE5MS0VGRkxPTlBXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxqWlhsY0dUUlJRSzs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x+YYqLi4duXWVWO1laWVRRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH17fn9+fX59fX1+fn9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BaXF1cU1VTVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af39/gH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1paXFpVV1VXUlFXVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxeUldZVlNWU1JRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f39+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU5eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3lvclhLTU9QTU9MSktERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTUVARERERENBRVBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhAQTs8PkBAP0A/a1BKYEVGSElFQj9HTE5HTVFVSUFFPj88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNTFRUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0tOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9BQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTktMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxJS0xJSk1NT1BSUEtHQ0tHQ0JJSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREE+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5vcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNFQ0NJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTU9MUFBRVVZXT0tWVlVTUlFRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUFJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21uc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HQ0NBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW5zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTExbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5MTUxGSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFwcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSEhFSExKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTktMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PWFFcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTEtMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERRYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0tQU1VTUVFTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVVpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGFYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFXV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5jXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZbWFxdW1tdVlNNVFVVXFxWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxXVVteXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFpYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xcW1pcWlpfX2BgZGJjZGRiZFlhZmJmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZXGBhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7e3t7e3t9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJiYuNjIyMjI6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyMj5CPj4+PkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISEhH58fHx8fHx8fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3t7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fH18e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoKBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYGCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFvfoJucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeIcHJxcHSagW5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaKDb3JvjZ98b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1nqJ3cXegnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHuJoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5oLSppqmpl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/f39+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvpKG1qqyjf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maWWorGgmaeUfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI2gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJixoZiVnYV9fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqMjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f3+Afn6AgX5/oaullqSbm5iioId/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIGBgYODgYGBgoOChISHj6Gyp6GgmZ2dpqisqaGakYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tsaabmqCbnpycnqGko52UiIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDipeZl5aYoJudnp2ampeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJSOlJiRh4KChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4iMh4KDgoGAgIB/gYCAgICAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CBgH+DiY6AgYKDg4B/f3+AgICAgICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIOEg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOCgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4ODgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDgoOEg4SDg4SEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4OEi4aEhISEhYWEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAg4+XhoWGhYWFhYWGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+BlZaSj4iIh4eGh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qKnaekmIyJi4uIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e32Zp6SimI+Vi4iIiomIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fIGcoJ2dnI+GhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoOcm5yVhIOCg4OEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYmbm5eFgIGBgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp6e42alYWCgH9/f3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4+TkZqPfn5/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5gIyMjIuBf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5f4WAgIGBgoCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx8enp5eXl6gYKCgoWDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYGCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IlYODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4ODgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Bf317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9g4GAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXx+fn9/fn5+fn18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f4B+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+Af4WCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY6Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt8fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISEgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4KDgX9/gYGBgoGBgYGAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx9fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3p2enh5e3t8fX17fH19fX1+f4CBgICAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4ODhIGEg4CDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foWEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnVmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnx8fH1/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4mGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiFhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOEhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fX9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiImIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWFhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhIOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIB/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOFgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAg4WEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CHhISEhISEhISEhISEiGdAREREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiioaHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Oz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztLSz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9KnntDP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9aznqOm1rCgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7QnZqTncCemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5q0wJihnLSYnKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbaZlq25hp6WsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Pz9WlmbatmIGglnibhJ6To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm2rpuoiJx5n6mFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatre1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTGo5eXnaWnlpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZux2J+rpJvQn6ukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCw9XFkI2318KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TR1MfD1dHVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE9Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZlqa5n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCjpqGioaKhoJ6cm5ubmaOmkZybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgprGuoKCfn56cmZmamp2tYXmdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgn6aSla2foKCem5qZmpmre0OBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6foWGWqJ6enJqam5ukn01JhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmadsWqCgm5qam52cr25LTIahnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilhFR0opqZmp2boaFgWE6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoItdYJGamZudnKOOZVpMgKKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ6ZXl9zlZqcnZ2hgGVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYm2FiYHyUnpyelnNjVU+BoZ6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmKBqXFphe5ucnolpXlBUiJ6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSeHNrWHyVmJ6KW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOlZ+fkoCkp5mmmnlVT2SHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaSZi3pijqOSmHOFhWh1f4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foSih3ZqUHGbjYpXbnl7f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmHJOR0lzkoOASlxub3aJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPo4hMMzI7eYR1cj89VmptgZCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5tfRWROPXl3Z2RINTZUbnGPj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa6MS4K2hkB7e2hjUl9xUVtviqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidGjF0qhJgJWMfU9sintaYICjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinmKCuL+qha+jmp13R1eBclJzlKKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ5vgpSziLbWppy4sWJQtKNWZJChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6OjiXd/dXjTu6mTnqhsVaGqaF+Hp6CloqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbS2sqywrZCIf2yYx8SXnKqSdlppc3V1f5KlqaekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyt7u8vLq6wrm0s52EdF5RnbCvpKKRhHduc3F3eHl8gomOlJmgpaespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMPJ0NTRzMe8r6GMbWNSQ4ONfn6AeXVvbWRkaWdqcXJxcXFyeYmpx8e8oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMfb5OPXx7mtopSEb1dYUERhcmdrcmtoY2VYV1xXW2BoaWdkYGySusC/uamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+y8/Uy7mlmI+CblpQVEpDXGZdYWhkYWFpXFRYVVdYWVtYX32huLmrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJupd0X1JOT1JHPV5sYF9lY2FeZGNUVVdWVFVdf6eur6qoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubfEo2pMQ0VKRD1ZYWFkbGRhXGVfWVNQUFVhi7e5rK6lpKOnpKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGzkFZITUY7SVhfaG1oX1xfWVpUUF2Nqqy4tbKsqaOhramsp62frLS0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsijd2BIPz9BXl1ca2RbWFZSXYiour66vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcbGx8K1gV1UL1VZXWxfUU1XhLnKx8LExsC8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHCwsXGnE5SgImVVVSDtc7Sxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68xad8dICRlHW8zsfH0MCvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb6xc2GAkYmKz8S/wMm+sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjZ2pnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5trO2no10hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG7xseWQnzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mwvcPIjEZ2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/Av3dTb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbG5fY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysnBhnFzpczMy83KxsLDy87BvLi9urBvZGO7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAwMnKwb+7ubGgfnNsrcjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhyd3yXvb/GwLnAvL7FxL29uLGwmY9+gpzKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpTUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1wqWHaVpeYE1SW1puc3aBn7i4wrqzu7e7vb+6u7uvpJqXiJJ+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4iqCvtZ1qZWdWWWBJSU1QU2x2hqWwt765srWyu7m8trm+tJWcppehcq7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2Kl7ChpnOly8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05BP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQFyBr7WztbK0r6y7uri2ub/FdYGpnZpkp7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0BTo7mztLKwsa2wubi2u7e6vI+hsaukc6uwqautq6OooJ2enpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaE5AUnhwUElJS2ecgFlEUq67sayzr66srba2srS1rqimnpqbnZ+mqJ6gqKmfoaeWmpaXjp2TjpCWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvWhFUp2CUVdJSmBKVI1gY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJqVlouWkY2Pl5KYnaKqn5+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmt7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6BQQXOdd1BuS0tjZnRzX1pecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaXl5WPkZGRkpqXm6Ckqp6hoZ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5emBiU1ZhSElLS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXFFrY1tkX1xqj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KYmZeXmJSZmJadm5+lpamgpqSep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NbWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SMeVVpcnZ1cGN2dlhXY2BjZ1hXVmetrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemp6XmqKdpKCeo56kqKytqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqeHVebVtSYUlSVkhGVldKQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgo4BugnBgY1hMW1NaTUxQWFJHTExHmKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZmmn6CnpbCppq2iqq22sLWysK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdnp6anZuUk5WUnp6YlIWenaCZq6Orsa+5sbGwsbC6vby8uba4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMm/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qrqOerKi2sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIRUpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKael5yUkZqemZWMioaIhnhsiqWioqursry2w72+srvBw8LFv7/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iSjY+Xl5SPjZCMgoOCdnJwbXCHpayttLjEus3Hy77CzM3NzMfI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwrzDwb+/v7W+s62/wMPDx8XHxK+/ubK4vcTCwrq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkI+Mh4SEiIaDgIGBgHlxcm9reKK2u7m8ysHT0tLIzc7R09HR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXhxa2ViaHJwcnuFioB1cG1xcm+EnK28x9HR19bV0dbN1NbW09PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKyMDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBubHBvdYB3mLjV19bX1tPXz9XU2dTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0tHSyMzNwMvNxtTPzM7JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym5yTfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucHR5dml8qc3U2NjY0cXT0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOztDM0M7OzM/PyMzQ0cvOy8PJx8rNy8zS087T0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucnJ0dXpxYm2ex9XU0KTKz87Tys3OxM3K0tLOxs7MzdTLztLNytbW0MzR1MvM0NHTys7R1dLV1srAysHGzcPIysPNxMbJy8vPy87N0M7UzMbJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFyb2txeXRlbp/PzZuX1snDyMjFxr7Cxc7Ox8XGzcrRyMvNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcrM0MjFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBubmlqbW56Z1WAwKJ5u8/DuL/Curq6uL3IxcHDwMPHysjIycfAxcvGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdETERGUkA1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXmBbWVpcYm5xbmpoaW5tc3lWapR7q8PFwK61uLCxsrCwwbu7u7m4wMHBxL69ub2/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBsZmVsbW97eF5mkse5v7esr66lqKyqpbeztbOys7S7tb2xt7C1rrK7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8vFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbWdlaGtsb35taLq4trOuqKulnKCnpZypqrGsqaups621sLKoraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxkbW5mZWZnaWtweom3r7Sso6KkpJieop6YmqOprKOnoauprKuwo6afqq20trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6uruyvL6/vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2ZrZWNlZGZobHGCpaSqopqZnqGRmqKYlY+foKeiop+lpaelrZ+cm6SmrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbOzsLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11eZGJhZGVlZGhqbIacp6Wilpedk5iflZOJm5+gpZuen6OloqedmqKbn6qvrbG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqagqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCyua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hY2NkZGVmZ2lxiZCCk6uXlpOXnZKTjZmfn6adm5ykpqGkm5+hm5iura2usqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnaamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dWZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYWNkYmJjY2NmaXNzR019kJCSk5qTlpGUnZufm5agoKijnp6onJuaq6eusKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyjoKCTlaGUlpacmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFhYmBhY2RrcmVnboiOj4+WlJiSkpidmp2Vn56mpaOmp5+dn6agqq+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfoqOdnpick4yglJGTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsXEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19eX2BdX19hY2mBj4WFi4mPjY6XkJGToZeelZuepKGspaSko6OinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwm5+in5+XmZOKnZGNkpSWkJiYk5yho5ykoKKVoKKkpZujq6WipKqkq62lrrKppqWmprSmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0lDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1xdXV1eXmFjbIiKfouBiouJlI+Qj5mZoZqan6eoqqirp6mmo5mlr6SVmaWvqaCcmZugn66ZnKqzn6amn6OjoZSUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWFlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVlZWVxcXF1eX2R6hnyEeYaLhY2Jk42Ul5+emZ6qqKaurKmwpKian6yglZWkqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0q66nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS01PUkdOS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWVhbW1xgaXp0eW+Ch4KLhZOHkZGVmJecp5qfqqamq52nmaClm5KPn6Oal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVldYWFdaXWFsbHBqfoJ9g3yNgYuHko6RnKCOmZyjoaOYpJehnJWNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVVRWWFpdaWZrZ3l/d3BMVm+NgJSEi5qWiZKQnpidlZSWlI+WioCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipq2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTU9SVFVYWWBqaGJ1fG9NQD5+lZCOe4aTi4OJjJqNlpSJkoeFlYZ5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuipp2foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVaboFucHhlZVlSjoiThnJ9hX97hIuTgZKZi497ho+AdX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl51gXl0YnOKlJeNjXpleH91d36IkHyDmJKAcYaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamkoZiZjoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWZwcGmFpanAfXJ3YXp3bXp3h495e4uFb2yMknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+lopmVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBsZWxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVtfpoZhmGZwd2N8bmx+eYqIdYGHhXRsmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5weXVqe2twgoCEgHqEhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2NqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfnp6dH1rdYaHe3yEg36LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpodmtSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYd6iHh6cHuOinl7iIZ+lod2oZmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhvWVtdaIuRhZN/goCDkJF9hYiQgJmUgaChmJSbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZmbHSamI2YkZGJjI2Yh5KPnYugn5GjqqWjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8gYKDdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop7coB8nZqapaSgmJ+WoZScnqedqKqfqKypqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3aUiaCkp7K8t6Otq6umqLOrr7Wxsa27sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+SoZ2inY+joauuq7K0oZSkqYiZiJKJlXl6foaAaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeAkp+DrKKxqbC/xsKpssW1q7K/sre9tb+0wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6ano6eaqa+ssbi3uKaataiMpI6Qkp+GeIGFd1tjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorGzwbS2wMvItbvEvbKzv7a3wbS/sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKWwqa29sLy6wcGrmLmnlK2Ol5epiH6DfmxYZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfYqCgYuDlX13enVlUFxkR0VLO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZOut7S5t8i+uLzJzLq7wLu3tbu6tr2zubHFYHWxpLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXNhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4qDh3uLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluTuL+4vbbFv7q4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLqYgHttX2FdWl9iWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYezq6Chn4uZnJmMjJWRmpGFiop+iIaMkIuIfIGDc3uKgoV7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVlaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7bGsLiyury0sMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooNwZV5fX1phWFpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uzpq+1qay7v7CqtKakuKarrqCrtKOOsK2al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cGdfZF9XYVNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmuAc3Jpb3F6eXF6vsuafouxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZKPiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXBlYmFZVVpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCclJ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtAi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4uOi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZl9bU1dSXFdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Cdi36HkoOJhoSJgYd8eIWWloiOg4eFhnqEeHF6e4OGdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKrCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+hrJuhmpifpZ6fq5mLmouQkY2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9ampdXFFUVGBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGLvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKScfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdi4uQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpIeLi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WbopudlJJ/jIh/mIeAm5Juh6iFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhaSGjJCzmJ2SlJehoZ6ZkpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIKEfn+SpqSfpaKXip2QlJeLiqiXcoqxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiY6UqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xvin55fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSRmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc4x5fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqZmYm5SVkZigl5m7u63KoWm2t6qwlZieo6uSl72kXqqzgomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mTnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mVoKKNlY2XmZ2TnJielKGglJydpa6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuKfoByhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKlpZOjua+owLusrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWRj5WXjpGgkIiUm6SslJaPlJyelKGem5ifoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+ws6eMorq6tcG7q6icsqSjqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlZeloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1d3tvXltebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB7jH93hoGCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtLypm6m8waO2tq+rk6+rqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5WUop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQUNLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlV56QnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qaWvvsSxvbizp6q0s62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52ZlKCioZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZjTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKustL7DucC4s6e4tLeyr5WkrbCvpIuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1NDQ6QjM0TldOPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnaCao6S1ybSpx7zDxMnLycjMzse+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7a+wcC+t7Kyw7C3vKyjrrWtuqWIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqUnKOfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJysqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKuqvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7afqZylo5qboJqnpbOhm52lnKiqnZiUj5Sbi5aJjKShlJyin6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZqqGeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKidqaycnKCbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCipqi9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytmpqdmKagvaGdpJirq6umoJmNmp+SnoiOWH+Wn6ahoLmqppSYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+foJiew6ekorOgnLKnkqmjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqaSnvbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmYl5KipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQEhHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utLGnqrqzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6uglpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsqWppaGem5malZeon56Zop+vs6KmjZivmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GZnpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCbn5GUppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVEA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGovKCpr6qisbeopLSxqqGttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLSywLrFtqu8r7G3rK2po7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmcqLapl5qTkp+ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6CelpaWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmqCkq7ajq6ikrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xtpmYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbSwtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpagsKexqayko66ttKi3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusbmVl6evrKiks6mUr7ukrLKypqejsrSwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2jrK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLS6rLSytKuzrKqrqKypua2ysMe/uKS5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mpoamvpKejs7OwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyraGjp66qqKWxo6qwqq6rsa6urKuzuqa3sLKpsqmqpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEe0Y/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKmxqaapsqa0raqvra2xrrKts7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRGJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJaRr6Siqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa6trKynt6qlrbCruK6osK+usau1qra1prS3rKykqaqcpJ6zs6iopLO0n7Wtoamoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjrK6ytK+qpK+pqLu/vMKyr7mtoravyMfI0cC/vbq8w727w8G/v6+xs7K2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuaq4rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6efq5mPsKKYoqCop56nm5ipsKmin6yhoZKhoqOnmJqopZiYmJyPi4eViHyNhoSFpJaGg4OMh5CQkoWHlaGWiZGekZOQjZGclZiPi4aGeHSBf310eHmAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5KeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4vsG9sKi5qqetsMnGyNDCvb+9ub+/vcm8wrixsLWxury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamjoK6bmrOilqWbpaSfpZqZqKqlnpqpoJuRmqCknZmXqamRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSblIaToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3Vwcn5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqOunp6sppifmqGim5+bmaOqopqao6OVlpOfoZaclqasi5+Rj5GMgouAgI+Be5qUjIl9f4yHkZCNioaTmJGHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcHN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfp6O3r62ir6+oq7jCurOtoLmvq6ezusfKx7+3wr2vtL63xLbCsrC5sbLAtru9t6q5uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJympqiam5ufopWcm5qdqaaWm56okZiSmJ2TmZahqpCaiY2Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhpb3BxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xLeyrqG4ra2rr7XFx8C3v8G5sLS9t7+7vrCsvrCzv7G8wripu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpecqqWon5ianaOTmpuanaWqmpubpZSUl5WcjpOXoqihkImKj4Z6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZGxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6t7qvrsCztLmvv8C3rL26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiSn6mioaGZm52fkZmblp+hqpuamKGUkZSWmY2Uk6SopJCJiY6GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dGhoamdncIdoaGljZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqOQjaSmmp2enaO0raequranrMTBt7Gso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t668u7Gln7aqpaWzp6mtnZzAq6ekr7KprLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyim5afnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnZOlnayhl5adk5ONlZeLj5ibqJ+RiImLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdHNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2urawuL2spp21qZ+fr6Oprpyhv6Cwo66wrreutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6p6iftaicnaigqKyap72YrKOur7W1ra2fsa2wqaKbnKOrqJyUnKaknZqpoqSWmp+bkJujqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Ko5mFlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6GpnrOqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZqbp6adk56fl5CdqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqaWgpyrnJiYnZ+pqaeqv8Ousbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqZ+xp5+iopmgoZqss5SjpKW1vKatp6uqrKimoaCYoKajmZmlo6SYnKSplpOinJOSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ6lrLKosMK9sbW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCraelnqOkqrG3rLS9v6+2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhnrSzoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZlqCfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFUNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Sen5+ulZ6ZlJWVl52roJmZpKi0r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqetsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjChnZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlqrCmopaTraClkpSgm6Smn5WapaahmqKfrJmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsX3BtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt764t7G0urSkt7Kfs6yfnqirnpSntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknqycoZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sLW+uLixsLW6qLq0n6+knaSnp52TqbCpr6m0q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6edl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11gcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJueu6GbssCurausp7ept6+1v7S6r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZScrKqXjJSlmKWsopGWqrKjn52mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6GdoqGbm5Cpo6qypLSlrKWelZmqmKasuJyirZeTn4+kn5KMnKKdl52akZWSr7myrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2ZwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaKhpZ6gnZmTq6OsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Byalpem4lgY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFpYZ2NfT1ttdWlxUlBERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqeco5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+sm6eep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKanOBdIN1ZXd9d2tvem1gY11waE1YWmZqYFdab3ltbWZUT0ZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJqrnaqfkJaWqJ2qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipaOm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXFNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSfqqSqlpaXmqadqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAh4Jud4J4gHNteYR0doiIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6ZoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ6inqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99lpiJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRjWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kcq6KkqKSktKOcopKmrau3s6euoZGRmZylkpCfoZibn52IpqykrK3AwLGhqa+pl5GfnaKZoaOqo5Ohop2erK+qraekpKehpqWdrKiRo5qoramanKibq6CVlqSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdJeTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gnqinoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn62lq7CowMezqKmxrpaSnZuil5+pqZ+VoZ+dna2vqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6hnoGlj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJuiYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52mo6+spKy1qrrOsq2mrqyXlZydopmerqycl6Canp+psqurq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUqyFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqiqKCfpZyxpaSosa23yLK1qqyplpGdnKKZn6WznZqhlJ2fp6ytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+Wlp+UgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGSmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKijoKqnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn5yek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpunpqGisK6cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKvpaeYr6S7rKG2ta2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ21mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2or6Smm62mvayUva+snqGvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfr7Cqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqWdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrK2kpZ+pqL6klsOsqaKgq7K4qaylnrKtp6iXda9+kIuchYd9uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmZfHqQn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipKm7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iJGWd2eIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7eqnsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKnmKmal6OqoZadpqansLusrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+VhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqkhImWj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xbu5q6Klnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWqJqompSmoaSQm6iZoba7qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltbywra2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqJmpjZmpj5+6t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcu7SooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo6CImH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZXRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjZC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGZsWGdHXVJNM0U0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcW1raVhpT11ZRjlBNUhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya21zcmZdaV5iTEU9RDZRQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tKytoJqinaSjpq6dnLKurJOYopqhpJmalJ6rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCWh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0NSbzVLW1pfTlpEQTI1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6xqa2el6SboaCZlpago5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+Pi3CSjICph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZGViUV9XXVRXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqiaooycrJycqpSirKSjqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG18cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B5e5dsnHx4l3NuqaRnYGV6cYCFbGhmZG52eGdgY1NcZlFRYkhYSlVhV1RbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqKmpiYk5mTkqGYjoeFe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhniBkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ2XqW16lYegm3SiiHegfpOXi4FwTWajknCah3Oke3l0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUE5sXmlca2lSamhpbGhsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5qXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppODmKqYjZKLgYl6gH2LeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dynneBipWXj7lukYqiYn2YoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmJOOmpCLmJCOinuHcYCIaYuLfJibc3WJfZB7ZIOHlYqKlZmCfIiHl6iRgaOskIaRi4KKfoCAjnNpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+XnqV2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4KGhYaTlZyffKV6cqiVoJZmnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibWp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjJqPhpyRhZKNjI10h3uIhG+NhX6Yk3R0hnKRgm1/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weHlsa3Zma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coRwlYV7fZKLhoaPhHl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoOIjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4F2dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH97dXB0ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4eTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4aGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHV8fHNvcGRrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eXt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZSDe46ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4eroIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZxdWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeDeneJjoORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2eX9xbG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBoe2p1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqJ2AcIyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCamJKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXOCcHdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcYGGe3xwd3qKg3l5j4yClKSSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiOl6GcfnCMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6Ol5eNlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfW57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hXt6cX13iIR5g4+IipehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg390fIOMgYB9eoKDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh36EhnV9fot/fZiGl5WYjaSimX9yh3uTkYmmj4yOipOgkYOSkJWXkYuBj5ifmpGQkHN/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnouGgZGcf5KSlYaZiHuKioF5cXlrdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eDeIZ8dXd/fIR/e4KLg4uTo494g4F0iYd9gHR2gomFcGF8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lrYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+jqJ2KipKFip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYZ/g4Nze4CHeo+SiZOSnZOmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2a3BudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhGVoeXV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6YopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi4yNjJyJjpCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYKHjZqihnuDdYKLf3d5bmyBhYNec3VzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgcG9rcW1ZWWJhYm5YUVRaZmdjdXCEgmJda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHh1gIuAeYV/eIeGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauUh4N4f3dyg3qDoIKTgpWUmZyTm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJuPj4yMj4x3e5GQeo6LjJGWjHyIfIBrdmpua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt9h4V6k49weYNvdot5iIp5iHyBi4+dnYR7enaCi3x3cWpsgoR7YHhxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dX6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfW9va3pgam51f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmYeAjJ+Ai5qUj4WImI+Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2Iko2Im3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx/bHtlc3BrbHp6W4F5kJCBen5/gIaOe3pocmpzio6JgYSEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBwY2B3YGBWa19edlBOTGFnYl16cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGKiZZ+h3p1f4l4h4SOnJqYmI6Pdol0bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh1am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYGCfouVhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBybltjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uQi4WPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGiY2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2cml0d2xajX2Tg4V9gISBhIqCdmFya4iAjomBfn6RkH1tgWt3hI2EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeoZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiXygf4SZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh0goV0gn+JkZydhpSPn36IYn+Th4WIhIqNgICDZ3yQgH5/goyPkH5tg3yCdGttd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnNiW2dfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdImFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoOJiXKBfWd9i3t5f3+Hi499aYB8g3Zmb3l4c3d0bGuPhouCi395g4GEhIBrXnB3en2Lh4R7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWRhXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCfm5+gnWCd4Sal5KKk4+UhYdwepKEfoODiYNvgXhogIV4cn9/g4qHfGV8foN2Y3BzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWNgoNxg3d/mIuNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdmXWZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnR/fW9yfHuUcG+Af3lmkomCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1gYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Uj41/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaX9+eG18e4GKg3hieYSCcWRxaH5udXJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praHB4fY5taoGEf3lugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35qdHxyhntzd31/jHp4hH58a4yMg5udloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6fnNndYh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmIiLhIl8j4lyfH6FfGl+bWuAe3lqenaCh4ByYHeBfnFkcmd1gm51e4aVkoJ9goBwd3p8dX5tV219dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLc3lqWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGiEiX18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKNh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSPiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4h31qanRoe4BqdoGNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHtzjYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh0bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4eFhXt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d6cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1d1lRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI50a46MdX92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfoWAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR5dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY214cWpscXd9fHldZXmAd2l1eGaCd2h1h4yOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweXOFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnNSUlVXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3aGeW6VinR/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+f32Hf3x4dnl2kZOffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hyd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHhlcn1uhHRmdYaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anl6gHh2b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXZsTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlYFyj4JxhYJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISFeIGFend0dW5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yHhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yVgm+Ma217gXFmc2Vga3hmcXWJen1hdYN1aWtxdHlveHdye2V9fX53dW5iZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ1ZUpPU1hha3d+Zl1nc2llX1djV2JxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgHqLdXSQgH2BlI6AhYR9foyGen6BdnujpYp5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnZ1bnpoanlqX2VuaIF3kIRoZVhhdml9hnluaW9mZ11VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hYOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNydGpvgH55d2F3hYR4kIZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVZZWx4e2ZfbXBqY11WYFVvbldKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kGxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6Z2l3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYN9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt+dXVidYaMe4iIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHBZS0xYWGhsdnplZG1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmNef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1+hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZoWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboV5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KAeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR1ZXODk3+Ig4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlRtVUpMWldpbHJ7ZGxsc2JhWVpbYXZcVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJud3ltb2p2gZB4bYN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmienuAiZV5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdgbHZkanVqal9bbnRybXR0dWuGfX+AfXdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJveHRzdGlxgpWDh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWa1FJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYl2MamNlbXp5bG5pdnmGemuEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiClIWBn4l1gX+BdH+CcIeDdm+il3N7houHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdla1NeXFZoYmxsW1xxjWROb21cVldVZ2l0aGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRwdXZsbYWUgol8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYF9ej25hZ2t5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2tmeGVlXVpydm5ze3lzbol7gHece3prYWVsbV5gbmplcHl+Z1pWWF9seHt6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3yBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2bGiGjH+Je4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5wY2hqd3JzbWh2dHmCc4KDeoiOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5KOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeGiYaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiLhoWEhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuEh4SGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5KSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZGRkZKTkpKSk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPkpGRkpKThoWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYKAkpCRko11h5GQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCCkI+Qe3WIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc26Jj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIx2bXqPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtbYJ5dHWAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0YV5kX2JqcGZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGFfbWxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bGJvc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01banJrX2x0c2dRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxjbmtaaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0VJVmJma3Fwbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2hncW5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD1IWVxbXmZsbmtvbW1sa2lpamJRR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Slpobm5wam5ta2psbGRPR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUVgbnNubmxsbGZRQj9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxIXHR1cWVQPjo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpBanxpPTk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/QEFBW2M8PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PlZqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp7e35/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJRkdHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hIRkZERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1S0pGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9oQ0E9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlgQzc1NTU3NjY2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4mKiodmSTU5QDU4ODc0NTc4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qKjINlUFpDOjw9Pjk5Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRISU1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiouLjH1qUz1CREVFQkFAQj9AQ0FAPj0+PkA/Pz9APj89PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLi4yKi3RFQ0dKTEpKR0dIRUZIR0VCQUBDRURDQUJCQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIuLiVpKUE5OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2MjIuMgWxtVU5NT0xKTEpJSkhKRkRHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4uOfWBYUE9OTUxNSkhIRUlJRUtJR0pKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMi4uKX1RUUk9PTktKR0ZCR0pHTEtGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WlhUVFZUT01LSkRFR0xPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxpWVhrYkZUUVFQSjs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dtXGVWOllZWFNRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BZW1xbUlRSVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxdUVZYVVJVU1FRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVdKTE5PS05LSUpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0JARFBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCCgYJrTUc/QDs7Pj8/Pz8+a1BKYEVGSElFQj9HTE5HTVJVSUJFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1JZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQU1NPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTk1OTUtMS0tOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUdDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRGSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQj0/PkFCRkNFQ0NJRENFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUVJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5LTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFSExKR01NTktNTkdMTUlMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tPU1NOUE9OTk5OR0tGYEVEX0xFZmRFTltJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITFBbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FNT09NUVROT1FPS0tOR01PUltaU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU01NSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBLSlFRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVFpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVVNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZaWFxdW1tdVlNNVFVVXFxWUlRWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxWVVteXF5gYV5kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1hXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xbW1pcWVpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7ent7e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJioJFPj8/Pz87m8O+v76+vcrU0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzL2eXl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKDhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19fH17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX18fX14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9e3x9fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFuf4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIiIcHFxcHSagG5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfKKEcHJwjp58bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1nqN4cHignH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZFvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3Nzc3NzcpOqpXyKoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHh5obOpp6mql317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvoqG1qaukf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maSWobGfmKaVfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcm4yfsKGgop6AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJewoJiUnIZ8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6Aoayll6KanJmioYiAfn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChISIkKKypqChmZ2dpqesqaGbkoeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tr6SamqCbnZydnaCkopyTh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDiZWYlpWYn5udnp2amZePiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYWNlJOWmZydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OHj5WNlJiQhoOChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCGmYiMhoKCgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+CiY6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgoGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDg4SDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDhISEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhISEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+AiYWGiIiIh4eGhoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3uChoeJioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3uLjIiLiouKiYiIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXkIiMjoeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoSak5aKg4OBgoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoidjYOCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIGDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp7e4qFgoB/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf35+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4OEg36Af35+fX9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5fpaTg3+Af39+f39+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6enl5gouEgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX18enp5eXl6gIKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh9goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYWEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODg4KBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/f4B9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fIqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31+fn9/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fH17e3t8e3x8fH18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYGAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEg4CDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3yAfnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4SDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoWFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQT03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNT0io2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEiGdAREREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDg8Oj07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19bW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9O4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9Wyl5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7UnKOostGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx1cOGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdTWo5i01NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9SkmbHU1aKZtNTVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDUpJmy1dWimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aSas9XVopq21M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWkmrPV1qOattfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5ux1teim7TasqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9PVsYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TS0tDD1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDs5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojk7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6ubq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ioqaqnpaSjoqKio6KgoqKhoaGgoKGhoqOko6OlpaaosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpqWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKCgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoZ+XkZCQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+dnJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY2ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKPjpabmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuYlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuUmaqcm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZmq2qnpmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCisKehoqKioJ6cm5ubmq55epubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpKWtp5+goJ6cmZmamaaTS4GdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6OieaqkoKCem5qam52oWkmEn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqSkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eqG1vq6KfnJqanJysgktPh5+enpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmqSIVISom5qZm5yeqmRUUYignZ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5yampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmgk2Jim52Ym52bopZmXVGHoZ2dnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZnJllY32cmJudnKSHZ1xRgqKdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqkaGdmiJecnJ6ceWZaVIOinp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn25lYmyGnZ2fkG9jVleHoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ95c3JeeJmcoY5hWVNajp2bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSm5+UeZqooaqUfGJSYJCSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOoJ+OfWKJqZiaboOHa3CIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/jKiNeGlScJ2PjFZteXuCfn+CkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpCgek9DSXaUg4NJV29zd4J7ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCglFM0NDt5hXVyQzhOa2+Ah4qOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPoW5GZFU/enpnZEw8OU1udY2KiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuipJhRdLCRSHuHeG1SaX9ZV3GIkIyYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqayEX7/YrEaSo5qQXWuCe15eg6KhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6imb3q9wKqazKies5pIVoRwUnifqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKinmp2kpaOionKBma6Oyc6ynrCyblO+oFRslKOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKCNfYV7htC9mJeonHJSmqxnY46jnaCgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqCiqKqusbKuq6SpmIh7ap29w6uunol2ZHB4enaHo6Sno6GdoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e2tLO2srCyp4l1Xk6Wn5CPjYB7c3BzcXh8foWSnaGko6Kkm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuytru+v8C/xb+1q5NwZlhHd4BzdXpxbmloYmJpaW92d3h9g42Yo6ispqSZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1usjS2dzVx7qtn5B4XFtPRV5rZWpwaGRiZ1lXXVleZm5ubW1sboGoyMa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMXZ4t/PvbConI14YlVXTUVebGFjamVhYmldVVxXWVpeY2FcY4CpxcC9uKmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca8x8fO0MSrjXtvXFNUVktAXmxlZm5lYl5mYVVYWlhWV1dig6W2u7mrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TCxsnJwKSIWkxISk5IPlpgYmxxaGFfZVxYVVNUUVaAtsOvrKqqqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMfGxMTDuLPBuqB3TEpRST1NVGJqaW5jX19aXFVTWn+arbe0q66lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmZyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb27vpFlVktCSj1eVlhrZ1taWVhWcJCwsau4tbOsqaOhramsp62grLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jIv8bGtqBsS1lBUnJ7gFpSUFNrn77Aur27vLq8rK2mqbu6ubfAs7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcTJwKqNeG+MmZ1TT3GfwtLHxMHEx8G8vrSxsLDCvr7BxsC/uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandsaWZ1b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMLOvHNqhZmXWpHLy83Pxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZmNrZGJrbW9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wsGZgI6ZiH/Sy8TI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLu/wLy7xL26wMS/vb22vsiklGaPzcS/wMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbq/u8O1use3trm7vLi5tbrEyaZCi8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHipzL3Ht7m4rba0t7mztbK6xcqaRoDKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1650gbvIz8LAuK61tbu9t7mxvsPHjkx7zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcXSu0dHMysS1ur/EyL6+tL7AwHtZc8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnJ0pszMy83KxsLDy87BvLi8urFyaWa7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsPApXl2eZzExsvIwcPAwMnKwb+7ubGhgXhxrsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvat9bmhubXKBlZhzeH2Yvb/GwLnAvL7FxL29uLGvnJWDiJzKwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1tudHeCobi4wrqzu7e7vb+6u7uuo56djpl/v8TDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZmdWWWBJSU1QVGx3h6awt765srWyvLm8trm+tZWgq52odK7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZuVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHaMoZhgVENYVUdhalZPRUphjqGsr7a6tbSyrLy5uLW4wb2LmrOmqnSmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BP0pDQUpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBvT0o/ZFlCTneAlGpOQVyCsLWztbK0r6y7uri2ub/GdoSsoJxlqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVV5cUE5IREdNQkdORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BY0FTo7mztLKwsa2wubi2u7e7vJCisaukc6ywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJU0VOQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2ecgFpFU6+7sayzr66srba2srS1rqmmnpqbnZ+mqJ6gqKmfoaeWm5aXjp2Tj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmx7ZGlWUmROSkhHT1NOS05IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFtgcZCxr66ztaqmrKyjm5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGSk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yXFFrY1tlYF5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmXFNaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhYY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqayppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVebVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTUxQWFJITU1HmKyqqaWgn5qSkZSYmJaWloyIi46VnZ2dnJ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW5cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnp2KYldeZWBXTVFHPT9AQ0M/PkJReKmtqaqmn56foqOdnp2anZuUk5WUnp6YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRR0U8Qz5GPD45Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdPRT5JWnxvYkI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZ15aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREE/S4aepZmEoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0srS1dbZ1tjT1tjN0srP0czP0czT0MDJyMvEzM3Mz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxKS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsTJx8/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1c3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMnBycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0pGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeYF9eXGJtcm9vc3R1dnmkv8zV0dbT09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLJysPNxMbJy8vPys7N0M7UzMbJ0M3Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtqqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0Q/OzY4Ojg6OzU3PT1AOzo8PTk8PTk9PTo+Ojw3Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfYGBhYV9fXVtdZ3JycHJzcG1yeaXH087M0M/T1MnEyMjFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jKzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7q9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zYFteXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHLwsLPy83Eur/Duru6ub7IxsLDwMPIysnIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1tbXWBgYmRkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/Iu5jAzMDGwbC2ubGxs7Gwwbu7vLq4wcHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzs3BxcO/vbK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5m46fxMO6wLitsLCmqa2rpbeztbSzs7S7tr2yt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8zFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2xwbmlmam1uc3uKv7+4uLSvqqumnaGopp2pqrGtqqyptK22sLOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8yLnDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BHQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25yhK25sLWtpKOlpZmfo5+YmqSqraSooquqrKuwo6afqq21trG9uK+3r6iuuLS0vLizvLC4ubayvMGywa+mqaOrsbO0qL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+v8W/tcLBx8i3v8DFt8TDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWro5yan6OTm6OZlo+goaijo5+lpaemrqCdm6SmrLKwt7ensKyoqrSrtLqxtrautrqzsLu6sbeloKSgp7GorKm6qqWmp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsrm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ2Tk5eelJmglpSLnKChppyfn6Olo6eem6Kcn6uwrbG1pKmqqqyspbS4rbewrLO1r7O2r7Gqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqusrbCzua+4ubqwtry7uqyzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy1t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKeakJGRmJSYnpOUjpqgoKeem52lpqKlm5+hmpmvrq6vsqGlo66rqKK1sLKyrKmws6i7s6e2oaOfnKOirqOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+qsLKys7ezrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWlZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscO1tr2ttLnBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmZCQjZGTlJyUl5KVnpygnJahoamjnp6onJqaq6evsKuco6S4qqGgr6i3q6enrrGkuLCkt6CjnJmZq6ahmq25sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrG0sLy0urivo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJKOkYmOkJGXlZmTlJmem56VoJ+mpaOmp5+cn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWfoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqmusK+rqKqqs6amq6+0sa68trGwr6CTe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurK5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJVYGFfYGFfYGBiZGl+jo6GjYuQjpCZkZOVopiflpygpaGspaSko6SjnaurpZqfpbGqoaGepaqeqKKfrqyqqa6toqKilZiim5yQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoKKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq2wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl5fX2JkbYmLf42Ci42LlpCRkJuaoZuboKipq6isp6mmpJmlr6SVmaWvqaCcmZugn66anKuzoKamn6KkoZSUm5aWkqmqrZudn6Ghm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJGWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR7iH2GeoiMho+KlI+Vl6Cfmp+rqaavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOS01PUkhOS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1hanx2e3GEiYONhpWIkpKWmpidqJugq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxre6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFqbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFubnJsgIR/hX2Pgo2IkpCSnaGOmp2joqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnY2CiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG9jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWhtaHuBeXFNVnCOgZWFjJuXipORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOWjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBramR2fnFOQT9/lZGQfIeUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+UeHZ2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiVhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNUklMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0VEQ0lOT2hZT1FTVFVaboFwc3pnZlpTj4mUh3N+hoB8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp7aXZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51gnp2ZHSLlZiNjntmeYB2eH+IkHyDmJKAcYePfHd7b2t+rX10kIt/eoaSgX1/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVvcGqGparAfnN4Ynt3bnt4h495e4uGb22Mknl0eWpqgIJxlpGMgX2VgEqTmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYd7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpa2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtfpodhmWdyeGR9b2x/eYqIdYGHhXRsmpJ0dHxqap2OTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY98dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIiMhnpwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9wenZrfGxxgoGEgHqEhYV5cqCVdHiAc3WUhzVxnaidjqGhhKOFdnCHfId8dIyujYmBaGdiam5ybXCDdWlwWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUVNES4V0f3t7dX5sdoeHe3yEg36LfXWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hHpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygmJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjXiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfX2Bf3CBfnpodmxSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktogod6iXl7cXyPi3l8iIZ+lod2oZqIh4+SlKWNralIhq6vrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4iEi3mVnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXltjZFhnZVxUUFBWWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMzMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFlvWVxeaYyShpSAg4GEkZJ+hYiRgZqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY6UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxudnVmf5SOh4iJh4iHoauilomOl396gYh5eXBna3h/fH91bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSUlMTEtOVmBjf2ZnbXSbmY6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkYeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F8npybp6WhmaCWopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF+c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4eJgYCHdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiaGlqLO8t6Suq6umqLSrsLaysa27sbO+nLPDq7rJyrfDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoOFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraKxqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisayxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1tjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU08Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUxLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7GzwbW3wczItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+t7q3uayssKWwqa29sLy6wcGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu8wbu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9SkE9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg42Win6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0lGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTlBKS1BLU1FITEFKRkpPX15iZ2lhl7fHsLmyur21scTGta+4sbC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPL0NTVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQiHyEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CqtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNPU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomIkYZ/gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOloZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuJfoN4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Szn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLR0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOgoeFhnqEeXF7e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ+hrJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg3RUI3NTU0NzkvNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlve3uGgXR6kp6OoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcmJ+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hipGLvKGYlJiZnKmmpq6fqLa/wMC5x8rOzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxFTkM7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5OekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6dmpKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouAppmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcopudlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqdlpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehop+ZkpydqLK5rKa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUxNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Rg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIOFfn+SpqSfpqKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmbj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjn18bX2IeHp+eoGBgn52doCCe2xvi355fHd4fISHi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m5q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJOYlIyKk5OGlJiGhJGQnHSRmbKVlqShiJyak4+KkIqXmomLlo2GfYyZnoqQj5yamZOZmKCVoZ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYF9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramzva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqYm5SVkZigl5m7u63KoWm2t6qwlZieoquSl72kXqmygomKjJSHkXyPjn2Dho6QlJSIh5KWi4+VjYuNlpmTnZq0lpWrnouclJKNkJKLmJuKkp2Pi4mVoKGNlY2XmZ2TnJmelaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDL06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqDfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqaioqSjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY55gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4/R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6ro6OeqKyvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkoJqgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762z7LFvsO8s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcoB7jX93hoGCkHqNoZaompqYu77JyMrC0snKws28wbOtvL+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqqp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu73Bua3CwsK/mXB7Y1tYXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tL3Lu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqaeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhFREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnKuruaupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCvpYuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKehmbSpqrO9vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJOFoIiEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnBwc21yLvBubW6sa+vsrSnpJyqtLWrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrWtuqWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkZ2DbXWTopqVnaOfkK6yo6uVqaqYq6+lpaGlqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66ZlJ6Lk6qbkZKTiaqNhqGejKOslKSktse9tMG7wsLHycXCzsjCvbmyr7m1wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKuqvryorby0uL7GvLa1uMCwvcCzqbW2q7+lj6OXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyin6G1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUZITlFJTURGRkJRS0hBREdBVlJESDxBR1ExO0E3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wnl6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwry/uMDCwMjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pq2+sLe3xra0ubi+sr/BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGplXGJeUEpIS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopukm57FrKGfrJ2crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLa/wbvJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSprbCipqi9taayvLe2tcOys7e6vrPEwLi4rrS0tKOdpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsO+x8S9xMq9sLC2rrG1sMDFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6xqqSnvbemt7u9r7fDrbOzwr+yx7O6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6qxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtcDEvsrFtsDJwrWrtamxuazAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7myuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJSTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemZqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCptaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWo6CXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeppbSyq6Gttb2vs7i9u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2wsbWssLWxwLrFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHl5iMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEtLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbmytayquri7ur61q6+xt5mYqKurq5yuq4+rvp6rr7Gjqp+xrbKurrayuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsayqtaSusLSvo5mdraebl52Zmay4opeTkY+ZnKGYmJStoZ+WgpWZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG55b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaU1NTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAvrSzt8TAzMe8xL23v8DAuMC9sr2uqLq5uLfCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVj4+MmJ2imJGYqKSgmIWTl5GdnJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVWldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKq5sba3wLyvrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2ysMe/uKS5sKmtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mOiJGjoJaOlZ+ilpWGkJWUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2RuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK20wsPRxMW/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qp6Wxo6uxqq6rsa6urKuyuqe3sbKpsqmqpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLawsaCpop+qrbCsnZ6mp6mao5eYkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZesp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CsssTEzs7Dv7+0wcTEusG0ycSsr7eus7rAvrSurqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG2rKyipaOaqauuqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQk42Fjpmlm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJeRr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG1srS8wb6zsa+trKyot6qmrbCruK6osbCusau1qrW2p7W3q6ykqaqcpJ6zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKkl6Wmp6qcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uQkJKOhYiWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+fpaqsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0cC/vbq8w727w8G/v6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq21sa+xuaq4rqqvt6uqnqqroKOhta2poZ+vsqG1qp6op6qjqqGhrK2ova+rrq2hp6efq5mPr6KYoqCopp6nm5ipsKmin6yioZKhoqOnmJqopZiYmJ2Pi4eUiHyNhoSFpJaGg4KMh5CPkoWHlaGWiZKdkZOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46wnqSlqqKlo6ymtLOxqaSwp6q4vsG8sKi5qqeusMnHyNHCvcC+ub+/vcm8wrixsLWyury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbaqrZypr6SfpayrqJydqrKktKmaqqeppKmdo6moqb2rs7CunamjoK6bmrKilqSbpaSfpZqZp6qlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V9j4J/iJ6Ph4B+jIiSkJGFgpSblIaToo2TkYuRmpKVh4p/gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltnWkZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6Sr5ifnqmko6GqpLeysaSpsaetucG9tbCkuayoqLDDycnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgr7S2qayerbGjnKWnqaOdnKSvpq+hn6upp6KqnKOpoK27p66xrqGqoqOunp6sppefmqGim5+amaKqopqao6OVlpOfoZaclqWsi5+Rj5GMgop/f4+AepqUjIl9f4yHkZCNioaTmJGHlKOKkZGHkJmQk4GIfXlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6uYn5eno6Gfp6O3r66ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbCsrC6sbLAtru+t6q5uL2qpLSmqKqvrbmwqJi4vKOtvrSzoa64taemqLCzoJ6kpaihpJmerKionqCqr6egppeiqKCwuJ+jsa+hq6GspJympqmampufopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Qh32HfoKNfHuhjI2IeYSNhouOjYaJk5qOiZWfiZCVg4yWjZF9hXx0cHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7S0qam6xbezrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzsKWYu7akq7q1rp6xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTpKSit7ChprGrn6yjr5ecqqWon5ianaOTmpuZnKWqmpubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYuOln+Gl4yPeYF7cHJ2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUnKqcpKGioLeqrqC7uKWsvcW0sa+jtbCsrK61w8O8s7+6t7Gzubi6t7qvrsCztLmwv8C4rb26taWisqmnqbGrrbGgmb+1pKe1taiesrypqKWpsKyZo6ecpKWUmKGxpZmfo6ipnKKfk6WgpLiopKeupp6loaiSn6iioaGZm52fkZqblp+hqpuamKCUkJOWmY2Uk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYqShZaTk4uQlpSNjZR8g5eOi3d+fGx0cmxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0raequranrMTBt7Gso7aup66utr++vLLBt7Cusra2uLa2raq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAq6elr7KprLW7nqipq7GlmJ6pnaakkZmmrKKYnqSpoZuhnJafnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnJOlnayhl5aclJKNlZeLj5ibqZ+RiImLiHiFdoGCgZ2HioKJfX+FiIeGkYSWlJCOkJGRkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1tfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqLi7urmtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qZ+fr6OprpyiwKCxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkJaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGZaSUZMTU9ZUVBWYWWBVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GaqbGvn7m/taC0wru9urGmtq+oraS2t7a2rLyvrKqrtqqzuK6ms7Wyrqmwtraxs7W6pqmftaicnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekImXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIU2FwdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Ogm6qtqqO9xa+puMK4vbytp7awpaujtrKxsrC5rammrLSmr7Wjqbi2tqinrLayrrSts6Gpn7OqnqCjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6adk5+fmJCeqKmktrCko6KdlpiXl6OIoI6SmYagh5OcoH+kf6WqnpKSmpKIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhpcXCIWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ousbq9t8C+qqW3sKmspbK0rq+ytqqppbCtpbSznK21trWmp6izsK2yp66dqp+xp5+iopmhoZqts5SjpaW1vaasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJSTo6SmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdbUUFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKosMK9sbW/tbe+waqns6ysqaeus6mvtbOmp6a0pae4r5yzsrarpaSnsa6usKaqnaejsKKhn52Wmp6crauTnqKftLqiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnqOkqrG3rLS9v6+2xLK3usGmqbCrrqipr66jsLquo6StsqOouKies7Owo6Wgqq2vrK+mp5+joa+bopqWlZaamqyllpuhn7Szoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqGvqaezrKm7tsKwu8KtuLa/qqytra2mrbGpoK68qqCntKyjq7WkprKzp6Sinqeqsqiwp6Wen5+tlZ+YlJWVl52roJmZpKi0rqKpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqmbppmcnKKgl5ORk5Odg9WTmblwsMF+xoZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKimtKqltKmkvLfBsLnAsbW0urO1p7GvorCypp+ttqiap7mto6+xoLO0saGknp+nqbCotKikm52dqZWYl5WXlZagqJyZlqetsKmjn4+toqiWnpeboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5yfoZiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsKyjq7ytprSmp7a7vLK6v7e2s7m5sqS0s6CxsaKeq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaadlZOXmJKSoaaflZKlqrCmopaTraClkpSgm6Smn5WbpqahmqKfrZmgnp6QlZuhnZymlZ2WmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhZqadq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZNLmZkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwl7TCraizqKmyurezuL65t7G0u7Wkt7Kfs6yfnqisn5SntauosLGrrbSkm6mgn6ihtaamqaKZnZSjoZOSm5iRlKGkmpKQpq2vpqGVmamfoo6RoZmopaGVmaWpnZyknqydoZ2gjZOemp2hmJmblpeioJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9ydF9LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLq0n6+knaSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5eeno+Mi6iwr6edl5uopp+MkqOXqKunlZepp56eoKOtpKGeoo2UoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCvrausp7ept6+1wLS7r663tqrAtaipoJqlo6Gckaqpp7WjsqiuqqCXnKegpau5naOtm5aZjqSilYydoJuYnJ+Rk5SqtrComZScrKmXjJOlmaWto5GWqrKkn56mq7GZoaOQmaKWoJuWnJehk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWkRBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsK2qq6uxp7ivtsSwubCsua6twLGro6Keo6Gbm5CppKqyo7SmraWflpqqmaesuZ2jrZiUoJCln5KMnKKdmJ2akZWSr7myrJWXo6enlJCWpJykrZ6RoKirn5ufqKOzn6OljqihlKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZl6gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+NzA3TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0w7Ssq6isq6m6rrDFrrSxrLamtLisqaGhpZ6gnZmTq6StqaW0p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblqmlpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2FzalpdmolhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydXh9fmJbd3SBaFBcboN9fItrWGt7gnJKSm+GcE50TUVYXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq1o6ylrqentbGsyKuvsamzor2xsaagoqicopuZmaymr6OjtKmlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnpGQmJywsr+sm6eep6KJk5GpmqijmpqsoKOZm6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqMhZeVjoqMmJaHlJWKhJOUkYmOkpSYlJiWmqChmpyUoJ2NgnqlhmxqfJF8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKytqCqprKnpbC0qsiqrK+ktKXAp7OgnaSknKOVlaCqp6yjorarn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEsJqrnaufkJeWqJ2qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCYl4mDj56IeoSQh4aakoiGipaPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXqIcmlzf3t2g4eCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rKuusrGgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6O0yLSfqqSrlpaXmqadqZqeo6yUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saI2YkaN3a2qLmaOemXNsbnqDjYd6WGVehoNebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIj4N8a4dZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8ua+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pq6jjo6aoZmTkpqfmZmklXulraKotMS4paKnr5+elJ6inqOboqmpkp+hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH5spbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpGfoJibn52Hpqykq63AwLGhqa+pl5GfnaKaoaOqo5Ogop6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYKtWqPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hpGRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKsrKqiqqevqaCnm5mll5yir5+gnqino6ahn7Csmp2Vp66ssKqorJ+UkpufpJOPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2vqayqnaiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+q4eGn3aZknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKijn52wrJealqmnrqyop6iel5Sao6GSlKCtm52moq+spKy1qrnNsq2mrqyXlZydopieraydl6CZnp+psqurq5ysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoGWh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKajkJqiqJ+gpZywpqSosay2yLK1qqyplpGdnKGYn6SznZqhlJ2fp6ytpbCbraqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjoK6rnaagrJqeqaWdp7afopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOys6qtqJOJl52lmqGjrqWXoZWZnKWmrZyxnq+pp56so7esobG4r52arqaysrKjk5anopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhqCErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmaqllKK1oqKVl6GptLikm6Kdo5KPobGZnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56YmpqmpKubsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+jnIWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYuWkJttcbJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqChtqejqaexo5Sso46lraOdkJqaqrOzpJyknKmRlJeun5+epqOcp5y1maKqpLarw7Cpq6mhjISOnKKgpqOVmpqcmZuZp6Woma2pr6Olm62mvayUvbCsnqGvsrmqsqWaqLCip5d5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4naCSipSSgXqvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY18fISYgGtuf2N/dG6AemFnZnFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbOfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklombkK6wrKaeppusl5ePrKGgnaWhmaScrpihqKe3qcGvpamknouAjpuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZGFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt+tV2khGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmYfHqQnn9ldX9jhXh0gHxiamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnbOzqZ+joJ61maC0qKqsnq+tnqybla+ooo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKqs6m9r6Sonp2PfYublqGgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRso4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK6quq2oo5qXk3yHmZGmm5KPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iZGWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlZV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTKv7eqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLusrJqbk5J7hJaNpZiNkZGZlI6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY6VhoGlm5iWjouUlIuQhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+dlaKXmpmkhImWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6isKOtn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6iZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qenp2clqudk5mhm5SQlquajpmZlpCWn5KJoZ6VlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaejk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566t6SlmZuNiHmBlIybk4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiol21/oqiKZZymnZKYmJaMkpyShp6akJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGzp5urp6yXdIydsKCoq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2PiKabqZGXpImcu7SooJmYi4l1d5ONlpOKk5GRlIyQlKGPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoZialZiWgpGXl4WbmWN6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo5+ImH+UjIWFmmuOjoZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNikhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isn6iwpqappZmUr8i/saKXqKm1npCFnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopafoZGMk4mGgJGnjYeinaSUmJ6Hn7qyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga6sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5yLmZKMfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKSdhJqBjo+Hi5pxkJSFaHh1fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZTcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7CpqqaalKCjpKukl6aruKOwgaGonaaenYmUvZqTjaGSno95hJaWkYirmZubmaKFjot3m5yPn5CInqWclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoKGZoad+oaeHrZ2glq2PnpydkYWAoIyprYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5d/jHtkaItzmX15lmxdfZdtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJYUG93Zm10c2tqb15rcW1raVhpT15ZRjlBNEhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaykh5qQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxygJqkY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZdaV5jTEU9RDZSQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9eW1pYYGB8ZEhDOExXVVdjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZqhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSo5Scm42LqailnpCXh4V+anuHfn2QjYOLkJGJkJShg5efoJ2gnouJd5yYooyfcqGLh6mIm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbZ5om45vmpl7gIunfXJodKuDnoN0qmiVml2bhXaFnWeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qQbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0RTbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWdYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ6SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9nZp/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRiUV9YXVVXQFpGUWhFU1dcYlheSUQ9Qjg/QTpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGbc5CQgYmalaGbhY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8lKShnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpp2ZgaRvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jc6SPdWuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEbGdmZG91d2dhY1NcZlFRYklYSlVhV1NbZWpbZVFGREtNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamhmaqKmpiYk5mTkqGYj4iGe3B9hWh9j4OUmoF3kI2PiW9/hY+TkmyXk3yJkpOlloOPq5uUk4uGinmDdoiAboKfhneAkoaImqOYe5SjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa1tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpOXi4FvTWajknCah3Oke3p0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9s19qdmt5h2ZraGN1dXBuV19UWWlRU2hJVk1ZVFZdaGtuVmdXTktCSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmaqYjZKLgYl6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dyn3eBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpeW2OhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTVhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinyHcYCJaYuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaOskIaRi4KKfoCAj3NpkKaEfYaUjYiZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqWijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6htqqKBiXaIg3erkaaIa5Gwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDp46rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6adqZ2FjJqPh5yRhZKNjI10h3uJhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/X4B/i3d0cpR1b3lubodshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN6fJh4hVxrWHmPaW94cnJveHhwXWuHbmpnVltgV11ma2RWYlVfUV9weHlsa3Zmamtsd31ycnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl9XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHuWW1xqZ252W3x5eHVuc3ODZ1xti2trYlpaX1tabHFcX2FaX11mdH57dXB0Y2tra3x+c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hVXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChZeKcW+AcpiGg36Sg4SGioF6gYWMnKGRg6eiiHmOl4mVi4ucmISDeq2CkZealYqenYiIoaqfoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJKTnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4yQiIiAhISQd3x6dJmgiIaJnYmEk359ioCAdW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX56mWtyaGF0inF+end3cHd0gl1eb4dobl9eWl1dU2hyVmRcXWJsaHV7fHNvcGRra2qAfW55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXhoOCj3+Ah4SGfYeFjpyek4eroIRzi5CGkpGLnZJ9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2EpXt8jpCRhpiroZ6UnZCOqo2QgJ2MiJOZnoKPl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaFfoWElG55dXSRoYqLhZqEhIxzf4l8fHJxeoeCeneKjoORpo+Fg46Ag4qJineGiYuNfnBsf4J8bmhsbWhfen9pfnx2dXZ1e3hcX3B+bnVgY1tdX1JnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbHVveW+GeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4met5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1qaH2Cl4h/h419foaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcHdhfYCNhnGLlXyIjHGMf4KFho9od3F4i5iRj3+WfYeKcYGGe3xwd3qKg3l5j4yClKWSi4WPe4aGh4R2g4SJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX19Sa2lVZVlfYWhqdnmCcWdrZG1oZoCBa259aG9ybH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N9hpeJgImLeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2dfoGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgXZxfW57ZIB8ioVwh5N/kYJsh4OCgImFZXVue4WRl4t8k3eLiHt/hXx6cX13iIR4hI+IipehlYGDi3aIhIOCd3yDiod4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFjamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyQbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5ytl6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGMfnyDfIGDgXh0eXt0fYGEgImLgGRffYuUhn6EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmXqHiI+Jb5edmqSUlYuMn4yGgpKcf5KSlYeZiHyKioF6cXlrdWx7fot+bYWSgpR4cIGDfn6LgGRxaXt/lpeEfoxzj4eDeIZ8dXd/fIR/e4KLhIuTo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG10e4lsYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4Nze4CHe4+SiZOSnZOmnJaCfYF9joqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAfIGCiHxkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMe4d7fouFd35xcIGHhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8d4V4eX9zc3uGa3Nwem6Ld4CBiG9xW1l+kY2IgH9/d3WBgYCghpGLk52YoZWYeIp/gY2JnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjpqRfIqAg291cGxtb3B7hWlzg46Yi3F3gHWCiYN5ZnJudYCajnuHg3mTkHl2h3NviHqEi3mKhYKHjZqih3uDdYKLf3d5bmyChYNec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWWJhYm5YUVRaZmdjdnCEgmJda25kYmZrkm5gZ2ZgaGuBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbnZtiXeDfoBublVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhJCKfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkoSRgolxg5GYkJyPkIyMj413e5KReo6LjJGWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYRvdot5iIt5h3yBi4+dnYR8e3aCi313cGpsgoR7YXlxbm1zdFZfcGJyYWBsbnpxaHBmZnN0aHFrYXdlXVdmYWByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBscXSKfXZ8hYB1dX6MeXuFgXiIg3OGhX6MjYR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ/l5aJjo2Iko2InH+OgXd6jH6JjIqcm5yblZJ5jHVmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx+bHtlc3Bra3p5W4B5j4+Ben1+f4aOe3pncmpyio6JgYWEfJSKa31+bX+LfoqFfIN5gI6UmZmJfHV3g5B4cm1ncYCFbmt1cGhqdW5UX29lcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cYp1XVxldmFiZWWPZGFmYllpc3Nua3J3jH10eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbn1liH5ucGyAWWxueXl0YXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhoujl4mOlYqRnZaDgZaQhoqQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooORiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gIGGjH95ZXJpf4mOiYGCfouWhGuBdW2HkIGOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjandoUmFxZ2xWX290emFyZF9ofnByblpjcmBiVm5ZXHhOTUxkZ2Jed3OJblxcZHleYGRlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIt7bnRxgVdxenZ5cmV3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGltfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2TiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4yeg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hY6FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmlmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdfYnNzhWpcXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mHgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh1g4V1gn+JkZyehpSPn36IYn+Th4WIhIqNgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SJf3BfcW+Ee46LgXt+kId5cINleYGJhouCeoN8fpKNj5GDbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNiXGhfZGxgblVbcE5IT2dlXGdvcYBtWlxjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAiHV5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIJtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabl4aTjZyAiGZ9k4KAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goGEhIBrXXB3en2LiIV7gI5/fXGAaHiBhoqFg3eCen+Wi46LfG1reol8dnRvaWh9d2VdcWNYcHRTVG9zaWJOaHR4ZmFeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZmSjYZvbIaSkXp5k4eBhJmKfId/eXiJioSVgG+Kh3F0fXtqeYaDpZGFk42Df25+gnWCd4WZl5OKk4+UhYdwe5KEfoODiYNvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHqCa1tvfHJ/h4OIfYWIeohxgG1wgoWNg4Rxg3d/mIuNg3dtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1ycFhoXmZqcV9vTldpUj9ZZ19bcGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+gIWCmoqBfI2NaXhya2tmX2FveW1fYm95XWRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tj41/bm2FjIx1fY9/hYKViXyDeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG9aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1pZXHV/dWlZYltnZW5iaU1YZlE9XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtZ2lraXB4fY5taoGEf3lugHt9gX+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5WCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKeHBthYOHdHmJeIl9k4h6fnJndoh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3lqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKCdW5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlYWWBxgHVhXV1gZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl6f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9MZnZMXm9VVFlzbmJRT3R5YlNXV1xhcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgYJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoizcop5cI52fYiQgXqUi4B1dHV+d39wcH9uhXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVVddYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R+g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoWAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koZ6eXR6dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fXpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhnYV9yZmpocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHx4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHpkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2AeHhzd297d2Vqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZvd4ukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Yltuempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFxaGdhV2ldXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedWZsZXFmc3B0gXhwmYV2f394f3yFh312dIKHgJWDbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlIByj4JxhoJ+goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3Bvcn9ziWVmen9qdXZ0dISFeIGFend0dW5renFiaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cnt5bHp6j4N2l3yHhoOHhH11cXNtaHVdbWlfbHVkZ2Zpem97cllngXd1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHhye2V9fn53dW5jZWFshnxta1ZqY3JUTGtsUExPcEhee2VhTlZ1ZUtPU1dga3d+Zl1nc2llX1djV2JxXUxLa1hkYlVUVXNXTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaYBpa29/Z2xiaXt6a3R1dW+GgnuBfXZ2bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWXBpj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR5kIZziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2dHVignp9dnVvY2NibXx8a2tVaWJnVExuaFBIUmxFYXhlYU1Uc15KTVVZZWx4e2ZfbXBqZF1WYFVvb1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXF0fGlqXW14d2h1eHNuhnx+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4iIgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWd5d3RwZIN0eXl0cWRhZG1yfmprVGleX1VMdWNRR1diR2N2ZWFMVHFZS0xYWGdsdnplZW1xZmNaWF1Yd2ZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlrYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Jxd3VsYltudHVodXdyboZ5f4F6d29vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Ig4h6dm9xfHFhd2Nabm9gb3CAe3JlcYBkXm11aWNmeHpybG2AdHJ8cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidGNgSlVuVUpMWlZpbHJ7Y2xsc2NhWlpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGJueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doJ3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdgbHZkanVqaV9bbnVybXR1dWuGfX+AfHdvbmxlaXFjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3N6entkZnZoXmNbYWhcXndpV2JecGhhd2FbfHZqanJveHRzdGhxgpWDh3+EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFFJUFpWa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgZG1jWGBhYl2MamRlbXp4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZml0aGN0ZWVdWnB2b3F2dnpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5dHVven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5waGlzcXRxdXZrbYWTgol8hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWVVVlBVb1hSV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVlt0ZFNSV2hRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBin5rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpydm5ze3l0bol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJub3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2a2iFjH+JeohtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhib3V6dGpua2pfWGBmaHVdZFdiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddVtUU2BnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpORi5KOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOjYmRiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiY6MiZCIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6Li5CIjYyJjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOjYuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx7e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18e31/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHh4iJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTlJOTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTk5GPk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGRkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOkJGRkZKTf4STkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoR5kJGQkohziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QjXB7kI+Pd3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6OdWyFkIdyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI14bXWOgXR2ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLiHBiZ3hzb3WChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndyXGJpXGJka2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGBjdGxeam5nZGJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aW2tza2FtdG5lWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01bZW9rWmlzdGtSUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlhiaG1ub3BxblNMT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0ZJVmNmZ3FubWhnXVFOTk5PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRUtNTVJfam1obm1tamhmY2NjWkxKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD5FVF1fY2lsbmltbGxqamtqZ15PR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R1ZfbnBxa21ramltZ1hJRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PD1RZXFyc29saFhFQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTk8S257cVZBODo8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PTw7SmxlOTo7PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0E6Rl8+Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTUZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3p8d1c8PT89PT5GaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KDhIODg4B9Xj5AQ0BBPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhIS01MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRlBTUlNTUk9QUFJUZXFxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f39+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCBg4ODg4OFiYuKiYmKioqKi4mKioFHNTY2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5/f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHiIiIioqMiomJjHo+PDo4Ozw9Pjk6Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo6Ojk5OTw/PDxBQkRJSkxLSUtMV29yc3VzdXh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjG9PPj5CREVFQkFAQj9AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouJjGM+REZKTEpKRkdIRUZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKh1ZITU1OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0hIR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE9NT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5TUU9OTUxNSkhHRUlJRUpIR0pKSUpHR0dLTE5MTUhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLYFRUUk9PTktKSEZCR0pHTEpGS09MS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WVhUVFVUT01LSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4xpWVdrYUZUUVFQSTs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGVVOllZWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5b3BZW1xbUlRSVlZUW1p1g1lVfZBhXVhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHxcUVZYVVJVUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3lucVZKTE5PS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTkxMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21xdHd4eXt7fH19fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5NSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lGSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tMTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0pGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREE+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTE5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9PT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZFSUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmhjaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdmcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnZ0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk5NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklJSkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHR1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhLSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BESERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQSk1NSk1SSUhFQUhGSklLTEpNSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JiYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURHS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlaUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0lLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhJUU1MS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGFYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhISEhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1MUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTUhISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVhVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goGDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJTWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWNkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0dLS0lKSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUExNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFdXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllZWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXWJcYGZhZGZkXl9kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGNjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tdX11gX11bYGRdXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dXFpbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4KCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz87m8O+v76+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3t5eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3e3l6e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6end7eXp8eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIWFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93cHBvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcHJ1cHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJ3dHFycnFuiYZucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycIWTcnFxb3uefm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxd6OQcHFxlZ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJznKiBb3uinn5wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGUq5twg6OffnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4d3h4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzcpOxqouVpp17c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh8qa+jsa2vn3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e4+rmaG0pJ+piHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maGVo6+fnKOafn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGZm4mYsKGdnZ2DgIGAf39/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBf5eknZSjm5mRnYh7fX5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6GqK+mnpmdn6appo+FgX9/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChYaNmquvoJujnZ+eoqSqq6WflIeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIOGjJ+rqaCZmaKdnp6fnZ6hoJqQhoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KCho+SlJWXnJyen56ZmJONiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5ORj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgIOIkJWUkJedmpGKhoeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDjJuHkJSKhIKDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoGBiIeNg4KDgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH9/iZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoODgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI+UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX2AgoSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhYWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICFhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHh4mJg4OEg4WEhIWFh4iIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDiIiGhIOCgoOEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWGh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Bg4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoGQhISCgYGAgYCCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp5fIOCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBgH9+gICAgICAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX9/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Mi4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl6gYKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh9g4OEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1/gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhoWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4OCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX19gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt6enyCgIF/f4F9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHp7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISEgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgYOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fX18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn6CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISDgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn9+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHyAfoCAf4GAgH99gX9+f39/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYGCgoGAgYGBgoKCg4B+gYOBf4CBhISBg3+CgoGDgYKCgYODg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgn+BgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChISDg4KAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIOChISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYSEhYSFhISDhIOBgoKDg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXiFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHh4eFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+CfYB8fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/Nk4icnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx173JmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdXSlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZsJ/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1s2Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTNjqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZu0vKOlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCxNWdko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkpGPlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmp6alo6CgoaGfmZKVpJqamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpaSlpaWkpKOioaGdnJqWqaqdm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKmpKOkpKSioaGem5qZqn1+nJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgsbWkoKKhoJ6cm5qaopdQg5ybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgoaeSsaKfn56cmZmam6piTIednZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoJ+qgX2uoqCem5mamqeMTlOKn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eopdZia2enJmbnJ2ralVVip6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm52ibWOeoJmZnJ2hmmlgWIygnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmbonNpf6KYm5yco4tqX1iGoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmal1cGqLl5ydnZt8aF9ch6Gdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZije2xrb4ecnJ6UcGVbX4qhnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn4mLknR+nKCjkXhlVWCQoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmqCmnI1siLGnpHiKhmNhl5ybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaloIh4W2unlpZbdIF8dpSSjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCSqI9rVFBynIqLTl10eICIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/k6h6Oy88eI96eUc6U291gYCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f56ZT09UP3uEbmZOOzVQcHp+hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCkdVOBeFB8lYl5Umh8Ulx1hIqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNn2GN1sBfpq+kpnBxin9WaIaLiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuio5Flv9Ctldu3psCxVF53aVWEkIuYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqrKBc7OvndHFopisrXFqxYdQe5+ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6isjX6ThIrIzrCzqpJ0Rq6xW3CdqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOipaGMg2+YsaOenIeBdGN6jHVtlKSioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKidgWtRjJKAfoJ2dG9wc3R+gJCjoaGfnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKurKupg3BfSG91bnF2a2llaGZncXZ+ipahpKWfoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e1s7a6vbuvlGpjV0hca2ZqcWdjY2VaWmFia3V6foiUnaOmnJ2gmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt77FzdDHwLWmk3deXVNHXHRranFlYGNpWlheWV5lbnBxdHiFmKaup6WYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vNDc4NnKu6+gkXljXF5TQV9sanF3Z2JeZ15VXFxbW15lZGJjbomyycK5oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMDO19jOuqOPfG9dVlhYTD1eYmh0cm1iYWZbV1dYWFZYWF1xkrDFy7q4t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca6xMDHz9LHpoVdT0tPU0w9VldoYmBxaGFfWFpXWFZUXoexxL2ztLaqtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBtp3Hs4xcU1ZQQ1ZTXGFmcGVYW1peWFlnkK+/uramqampqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TEubS/ubvKrnldUE5XfHSQl5ZVVFhXWWGBsLepq7K0rK6lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPDsn1WTHB3l6WdTlFTW3Sgtbeyray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THw8fIsIBgWJGmkkhMbZezwry+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcLFxc3Qx5OLqItFbbnFyc3GxcHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMHFxsnOsYxeacTQx8vPxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNrZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcG/wMmTP5TSzMXI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnOwbu/wLy7xL26wMS/vby4u8DFq0iVzMTAwMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjbq/u8O1use3trm7vLi5tbrDyalMj8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHiqy73Ht7m4rba0t7mztbK6xcmcTYTKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1651grzIz8LAuK61tbu9t7mxvsPHkVR/zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcnSu0dHMysS1ur/EyL6+tL7Av39hdsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnN0pszMy83KxsLDy87BvLi8urB4cWm7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKqytsPApXl3epzExsvIwcPAwMnKwb+7ubKiin91rsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKp9bmhubXKBlph0eH2Zvb/GwLnAvL7FxL29uLGuoJ+Mjp3KwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1waSGaVpeYE1SW1tvdHiDori4wrqzu7e7vb+6u7uuoqKml5+AvsTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4iqCvtZxqZmdWWWBJSU1QVG14iKewt765srWyvLm8trm+tZWltaWtdq3JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmIfHaMoZhfU0NYVUdhalZPRUphjqKtr7a6tbSyrLy5uLW4wb2LnrmrrnWmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBuTks/ZFlCTneAlGlNQV2DsLWztbK0r6y7uri2ub/GdoewpJxmqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV5cUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BYkBTo7mztLKwsa2wubi2u7e7vJGjs62kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2icgFpFUq67sayzr66srba2srS1rqmnn5qbnZ+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bWt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFxgcpCxr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yW1FrY1tlYV5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhXY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVdbVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTEtQWFJITU1HmKyqqaSfn5mSkpSYmJaWloyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW1cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnp2KYldeZWBXTVFHPT4/Q0M/PkJReKmtqaqln56foqOdnp2anZuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD85Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hqZVpbRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYUI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREA/SoWepJmDoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1JETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0crS1dbZ1tjT1tjN0srP0czP0czT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sa+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsPIxs/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2ZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgXmFgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcWkpGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYWBeX19eXGJtcm9vc3R1dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLIysPMxMbIy8vPys7N0M7UzMbJz83Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgYGBhYV9fXVtdZ3JycHJzcG1yeaXH08/L0NDT1MnEyMnFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jJzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7m8qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHIycrPy83Eur/Duru6ub3IxsLDwMPIysjIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fEyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1pbXWBgYmNkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/HvcnFy8DGwbC2ubGxs7Kxwry8vLq4wMHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dnhrZWhgaG9kVl5ZSkZKRkhLQUZCRklAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3LwcO6wLitsLCmqa2rpri0trSzs7O7tr2xt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8vFwMbGu8fLwM7Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15bXV5aW1tdX2xwbmlmam1ucnykxr+4uLSvqqunnqGppp6qrLKtqqyptK22sbOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8x7nDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BGQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWtpaOmppmfpJ+Zm6SqrqSooquqrKqwo6afqq21trG8uK+3r6iuuLS0vLizvK+4ubWyvMGywa+lqaOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcHBx8i3vsDFt8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWrpJ2boKOTnKOal5Cgoqmjop+lpqemraCdm6SmrLKvt7ensKyoqrSrtLqxtrautrmysLq6sbekoKSgprGorKm6qqWnp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsbm5wrPBvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVFlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ6UlJmflJmhl5WLnaChppyfn6Sloqeem6Kbn6uwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqytrbCzua+4ubqwtry7uquzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKebkZKSmZWZn5SVj5uhoaiem52lpqKlm6Chmpmvrq2vsqGlo66rqKK1sLKyrKmvs6e6s6a2oaOfnKOhraOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+rr7Kys7izrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmpGRjpKUlZ2Vl5OWn52gnJahoaikn5+pnZubq6avsKuco6S4qaCgr6i3q6enrbCkt7Ckt6CjnJmZqqahm625sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrG0sLy0uriuo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJOPkoqPkZKYlpuTlJqfm56Vn5+npqSnqKCdn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ihopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGwr6CSe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGBiZGl/j4+HjouRj5GakpOVo5mglpygpaGtpqWlpKSjnaqrpZqfpbGqoaGepaqeqKKfrqyqqa2toqKilZeimpyQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoaKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkZQT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl5fX2JkbYqMgY6DjY2Ml5GSkZyaoZyboKipq6isp6mmpJmlr6SVmaWvqaCcmZugnq6anKu0oKamn6OkoZSTm5aWkqmqrZudoKGhm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJFWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR8iX+IfImNh5CLlY+WmKGfmqCrqqavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnamnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1han13fHKFi4SOh5WIk5KXmpieqJufq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopubk4yOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqGaoKKWlJiYlaKmmo2ZpKepp6GgtLKos7ihnKO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFub3NtgYV/hX6Pgo2Jk5CSnaGOmpyjoqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS3ucHOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWlvanyCenJNV3GOgZaFjJyXi5ORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOVjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQipyIn5iIiJaemqGgl6euqa2oqJ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCt7O9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBrbGZ4f3JPQT9/lZGQfIiUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiUhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFZaboJxdHxoZ1tTj4mUiHN+hoF8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp6aHZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnp+hnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt3ZXWLlZiNjnxneIB2eH+JkH2EmJKAcYePfHd7b2t+rX10kIt/eoaSgHx/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcWuHpqrAfnR4Ynt3bnt5iJB5fIuGb22Mknl0eWpqgIJxlpGMgX2Vf0mSmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpK2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVxfp4dhmWhyeWR+b2x/eouJdoKIhnRsmpJ0dHxqap2OTXmFk4mEjmYxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSWlhZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpCZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9xendrfGxxgoGFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8c4utjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXS0hKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVNES4Z1f3x7dX5sdoiIfH2Eg3+MfnWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfHyBf3CBfXpodmxSWExARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktog4h7iXl7cXyPjHp8iYd+l4d2oZqIh4+SlKWNralIhq6vrouBgJOKgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36AdXVzbVxeXltjY1hnZlxUUFBXWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaYyThpSAhIGFkZJ+hYiRgJqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneHf3t2hHxudnVmf5SOh4iIh4iHoKqilomOl396gYh6eXBna3h/e391bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZnbXSbmo6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F9n5ybp6WhmaGXopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlRRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiqKmqbS8uKStrKymqLSrsLaysa27sbO+nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraOyqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisauxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1pjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU48Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUtLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0wrW3wcvItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ube+t7q3uayssKWwqa29sLy6wsGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUlJZWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu7wLu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuonpWWn5mfrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZl6eepqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTk9KS1BLU1FITEFKRkpPX15iZ2lhl7fHsLiyur21scTGta+4sLC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OIkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPM0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CrtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZeXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomHkYZ+gXtyfn+Bh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Oyn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ6grJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfLycnMy8/JxNLK1NfZ19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR6kp6NoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6KdmauVkJCJjJGCjIWIiIGGkJGem5mIhYyBhZd6iImfl5CIjYqLgn2hipGLvKCYk5eZnammpq6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxETUI7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2LnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkZ2Rgot/pZmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSun4qQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqclpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wcfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYX6Rg29td4t4eX96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfn+SpqSfpaKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5Kpr5+RlJCNjoiWjG6Nt4WaxMixm6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmSDR3WCjn18bX2IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZra+kl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJKYlIyKk5OGlJiGg5GQnHSRmbKVlqShiJyak4+KkIqXmomKlo2GfYyYnoqQj5yamZOZmJ+UoJ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramyva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+wqZqZm5SVkZigl5m7u63JoWm2t6qwlZieoquSl72jXqmygomKjJSHkXyOjn2Dho2PlJSIh5KWi4+VjYuMl5mSnZq0lpWrnouclJKNkJKLmJqKkp2Pi4mVn6GNlY2XmZ2TnJielaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDK06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqCfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqahoqOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUY+QT9BPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6roqKep6yvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLEvsO7s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu7+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqpp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsK/mXB7Y1tYXlxNTU5KR0RESEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tLzLu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqKeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhEREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnauruKupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCupIuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlZxgSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimrKutsrGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnAwc21yLvBubW6sa+vsrSno5uqtLSrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrStuaWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkJ2DbXWTopqVnKKfkK6yo6uVqaqYq6+lpaClqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiaqNhqGejKOslKSktse9tMG7wsPIycXCzsjCvbmyr7m0wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKurvryorby0uL7GvLa1uMCwvb+zqbW2q76kj6KXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyinqG1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUdITVFJTURGRkFRS0lBREdBVlJESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwby/uMHDwcjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pqy9sLe3xra0ubi+sL7BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1dNopukm57Fq6Gfq52crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSpra+ipqi9taWxu7e2tcOys7e6vrHDwLi4rrS0tKOcpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsS+x8S9xMq9sLC2rrG1r8DFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq6qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6mxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtb/EvsrFtsDJwrWrtamxuKzAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7mzuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJWTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCotaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaufr7Szqqq3tay7q7OyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWpKCXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MUk9fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeopbSyq6Gttb2vs7i8u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7Spr7K4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2vsbWssLWxv7rFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHlpmMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8LCtbS6xb7MxbnDwbrAusS4wbmytayqure7ur61q66xt5mYqKurq5ytq4+rvp6rr7Gjqp+xrbKurrWxuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLSuo5mdraebl52Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG95b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaUlNTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAv7Wzt8TAzMe8xL23v8DAuMC9sr2uqLq5t7fCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7Gnra+1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgmIWTl5GenJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKu6sba3v72vrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2xsMe/uKS5r6mtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7O0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+ilpWGkJSUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s/SEmQmqmqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK60wsPRxMW/wbK+w8K8v7i9xaitt620ubzAsKyyrqGjp66qp6Wxo6uxqq6qsK6urKuyuqe3sbKpsqmqpaWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLewsaCpop+qrbCrnZ6mp6mao5eYkKComIaDjoqLn6CQjI6XnpKRh4iRlaGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE1GlZasp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CtssTEzs7Dv7+0wcTEusG0ycSsr7ius7nAv7Surqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq5+jnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG3rKyipaKaqaqtqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmkm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1iVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklIRJaQr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG2srS7wb6zsq+trKyot6qmrbCruK6nsLCusau1qrW2p7W3q6ykqaqco56zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uPkJKNhYeWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0MC/vbq8w727w8HAv6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq20sa+xuaq4rqqvt6uqnqmroKOhta2poZ6vsqG1qp6op6qjqqGhrK2ova+rrqyhp6efq5mPr6KYoqCopp6nm5ipsKiin6yhoZKhoqKmmJmopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGWiZGdkJOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub+/vcm8wrmxsLWyury5wLO0vK25rKO1pqessba4sqanurWttLyvu6WtrbWqrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rs7CtnamjoK6cmrKilqSbpKSfpJqZp6qlnpqpoZuRm6CknZiWqKmRmZmSkIuCj4V9j4J/iJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRmpKVh4l+gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttZ3ldXlZDWHttVGFQUllLS01wdF1JWltnWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfnqmko6GqpLaysaSpsaetucG9trCkuayoqLDDycjMwbe9v7W4wbrItsS2tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgrrS1qKyerrGjnKWnqaOdnKSvpq+hn6upp6GpnKOooK27p66xrqGqoqOtnp6sppifm6Gim5+amaKqopqao6OVlpOeoZablaWsi56Rj5GMgop/f4+AepqUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJmQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJpcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5emo6Gfp6O3r62ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbDsrC6sbLAtru+t6q5uL2qpLSmqKqvrbiwqJi4vKOtvrSzoa63tKamp7CzoJ6kpaehpJmerKionqCqr6egppeiqJ+wuJ+jsa+hq6GtpJumpqmampueopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Ph32HfoKNfHuhjI2IeYSNhYqNjYWJk5qOiZWfiJCVgoyWjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7O0qam6xbayrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzr6WYu7akq7q1rp6wuK6ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6Sht7ChprCrn6ujr5ebqqWon5ianaOTmpuZnKWpmZubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qcpKGioLeqrqC7uKWsvcWzsK6jtbCsrK60w8O8s7+6t7Gzubi6uLuvrsCztLmwv8C4rb26taWisqmnqbKqrbGfmb+1pKe1taidsryop6Wpr6yZo6ecpKWUmKGxpZmfo6ipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5yfkZqblp+hqZuamKCUkJOWmY2Tk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0rKequrenrMTBtrCso7aup66ut7+/vLLBt7Cusra2uLa2rqq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAqqelr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae1pq+qrqGhnZ2hlKCmn6GgmpuZm5KYnJOlnKuhl5aclJKMlZeLj5iaqJ+RiImKiHiFdoGCgZ2HioKJfYCFiIeGkISWlJCOkJGQkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1pfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqbm8u7qtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qqCfr6Oprpyiv6Cxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6W6p66ioZqanZmepJqknZeel5uTmJ+SqJWpp5qTmpqRi5WZjZSUmqimjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkZaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGVaSUZMTU9ZUVBWYWWBVUFWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GZqbGvn7m/taC0wru9urGmtq+oraW3uLe3rbuurKqrtqqzuK2ms7Wyrqmwtraxs7W6pqmftaidnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIUmFvdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Kgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7Wiqbi2tqinrLayrrSts6Gpn7OqnqGjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6edk5+fmJCep6mjta+joqKdlpeXl6OIoI6SmYagh5OcoH+lf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oG+Ih4R+jn1/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhqcXCIWV5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C+qqW3sKmspbK0rq+zt6qppbCtpbSznK21trWmp6izsK2yp66dqqCyqJ+iopmhoZqts5OjpKW1vKasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJOTo6SmobejpKCjmJWSl5OciK+Ql5SJqYuWoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2R/wJy/eYSEeZGEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdcUEFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKoscK9srW/tbe+waqns6ysqaeus6mvtrSnp6W0pae4r5yzsrarpaSnsa6usKaqnaeksKOhn52Wmp6crauTnqKfs7qiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoaGwop+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJydlJmllHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnaOkqrG3rLW9v7C2xLK3usGmqbCrrqipsK6jsLqvo6StsqOouKies7Owo6Wgqq2vrK+mp5+jorCbopqWlZaamqullZuhnrOzoaucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpp+an6GVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXN2U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqCvqaeyrKq7tsKwu8KtuLa/qqytra2mrbGpoa68qqCntKyjq7WlprKzp6Sinaeqsqiwp6Wen5+ulp+YlJWVl52soJmZpKi0rqGpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqibpZmcnKKglpORk5Odg9WTmblwsMF+xYZ81pSbu3yalaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKiltKqltKmkvLfCsLnAsbW0urO1p7GworCypp+ttqiap7mto6+xoLO0sKGknp+nqbCotKikm52dqpaYl5WXlZagqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeji4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsK2jqrytprSmp7a7vLK6v7e2s7m5sqW0s6GxsaKfq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaielZOXmJKSoaaflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoImSmoqif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhpmZdq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZOLmVkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwlrTCraizqKmyurezuL65t7G0u7WkuLKetKyfnqisn5SntauosbGrrbSkm6mgn6ihtaamqaKZnZSkoZOSm5iRlKKkmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZOemp2gmJmblpehoJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6CJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19LVjZKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLu0n7CknqSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2UoZifn5Kel5yVnaGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCurausp7epuK+1wLS7r663tqvAtaipoJulpKGckaqpp7WjsqeuqqCXnKegpKu5naOtm5aZjqSilYydoJuYnJ6RkpSqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOQmaKWoJuWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXioyniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGLbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1lbWURBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsKyqq6uxp7ivtsSwubCtua6twLGro6Keo6Gbm5Cpo6qypLWmraWelpqqmaasuZ2jrZiUoJCln5KMnKKdmJ2akZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqehlKKanJeVo5ePr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZp7gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62YnaSkooqSkqWbpaqblqilpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Fzalpem4lhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydHh9fmJbd3SBaFBcboN9fItrWGx6gnJKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwaKbtbq1o6ylrqentbGsyKuvsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnZGQmJyvsr+sm6eep6KIk5GpmqijmpqsoKOam6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2NgnqlhmxqfJB8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKyt6CqprKnpbC0qsiqrLCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEr5qrnaqfkJeWp52qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipWPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXmIcmlzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rauusrKgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6KzyLOfqqSqlpaXmqadqJqeo6uUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saIyXkaN3a2qLmaOemXNsbnqDjYd6WGVehoJebYuJgXZcaHN3d5KAh4Jud4J4f3NteYR0doiIjoN8aodZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pa2jjo6aoZmTkpqfmZmklXulraKotMS4paKnr56dlJ6inqOboqmpkp6hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH1rpbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpCfoJibn5yHpqykq63AwLGgqa+pl5GenaGZoaOqpJOgoZ6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4d2dmt8iG59hZCRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrprKsrKqiqqevqaCnm5mkl5yir5+gnqino6Whn7Csmp2Vp66ssKqorJ+UkpufpJKPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2wqKyqnKiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+qoaGn3aYknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6OirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKiinp2wrJealqmnrqyop6iel5Sao6GRk6Csm52moq+spKy1qrnNsq2mrayXlZydopieraydl6CZnp6psqqrqpysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoKVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbZuVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKaikJqiqJ+gpZywpqSosay2yLK1qquplpGdnKGYn6SznZqhlJ2ep6yspa+braqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiIegepiWmniqyXSZo5WoqZGTmoyAnImaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGYlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjn66rnaagrJqeqaWdp7WfopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOysqmsqJOJl5ylmqGjrqWXoZWZnKWmrJuwnq6pp56so7esobG4r52arqaysrKjk5amopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWchZ+ErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5OMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmKmklKK1oqKVl6GptLikm6Kdo5KPobGYnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56ZmZqmpKqbsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+inYWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqCgtqejqaexo5Sso46kraOdkJqaqrOzpJyknKmRlJetn5+dpqOcp5y1maKqpLarw7CpqqmhjISOm6KgpqOVmpqcmZuZp6Wnma2or6Olm62mvayUvbCsnqGvsrmqsqWaqLCippd5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4nZ+RiZSSgHmvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5WOmY18fISYgGtuf2N/dG6AemBnZXFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklomakK6wrKaeppusl5ePrKGgnaWhmaScrpihqKa2qcCvpamjnouAjZuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmI+nm4yXkZiYfHqQnn9ldX9jhXh0gHxhamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnLO0qZ+joJ61maC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKpsqm9r6Wonp2PfYyblqCgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRrooFvq4RsnH96srDHg2mrsL2seHeivrxzgJaOppyRm5GZnnuCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK2pua2oo5qXk3yHmZGmmpKPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4mWlphxaWmEh2ZwhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmSmKF+iJCWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTJvreqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLqrrJqbk5J7hJaNpZiNkZGZlI6YlqiVoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnJSQmZOZkY6VhYGkmpeWjouTk4uPhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+clKGWmpijg4mWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6hr6Otn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6eZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qdnp2clqudk5mhm5SQlqqZjZiZl5CWnpGIoJ2VlYWSjJCNlIqAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSl5Sik56Yo4WKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566tqSlmZuNiHmBlIyak4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mZdwgJiol21/oqiKZZylnJGXmJaMkpyRhp2aj5WDkoeOjpKJhHdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3unm5tmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGyp5urp6yXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilKehnY6WkZ6Eda2PiKabqZGXpImcu7SnoJmYi4l0d5ONlpOKk5GRlI2QlKCPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoJeZlJiWgpGXl4SamWJ5h5CEjY+RioNtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmEop+ImH+UjIWFmmuOjYZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpqytq6isn6iwpqappZmUr8i/saKXqKm1npCEnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopWfoZGMkomGgJGnjYeinaSUmJ6Hn7qyp52bko6FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKOchJqBjo+Hi5pxj5OFaHd0fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJaioLCnqKilq5+jt7CpqqaalKCjpKukl6aruKOwgKGonaWenYmUvJqUjaGSno95hJaWkYirmZubmaKFjot3mpyPn5CInqWclpqYh6O5raSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoIyqrYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2mef5JrZ5eFl7eJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJXUG93Zm10c2tqb15rcW1raVhpT15YRjlBNEhEX2s0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaukh5qQipmpmZqbkoimsaehlZqIiYBpboiIi46OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+GqKuDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxxf5qkYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZcaV5jTEQ9RDZRQlpyMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVdjYFplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSjt5mrm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZmhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2noIeXjomSo5Scm42Lqailno+Xh4R+anuHf32QjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6mIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbJ5omo1umpl6gIunfXJodKuDnoN0qmiVml2bhXaEnWeqaoC4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qRbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljX2ZYYkJRRk83V0NSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbWbp4hjlJqrubGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioOVo5yKlI+GjJ6SnZ2JkKmjoJqMkYqAgGmAh3l/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OipICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF4fpi0oqOrqISZfJt9nZp/dKpaXW97lot4nmJMfnt6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRhUV9XXVVXQFlGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqCbc5GQgYmalaGbhY+pnJuVi4uKfINshIZxgaGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp2ZgKRvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdWuQs4xggpiJc6qyp7x/d4Ntfr6mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEa2dmZG91d2dgY1NcZlFRYklXSlRhV1NbZWpbZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamgmaqKmpiYk5mTkqGYj4iGe3B9hGh9j4OUmoF3kI2PiW9/hY+SkmyXk3yJkpOlloOPqpuUkouFiXmDdoiAboKfhneAk4aImaKXepSjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa0tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9tF9qdmt5h2ZqZ2N1dXBuVl5UWWlQUmhJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmKmYjZGLgYh6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpfW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dnWlNtSVlPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinuGcYCIaIuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaKskYaQioKKfoCAj3NpkKaEfYaUjYmZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6lsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDpo2rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtmdGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpmmjn+mpo6BjomFlHaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/XoB/i3d0cpR1bnlubYZshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN5fJh4hVxrWHmPaW54cnJveHhwXWuHbmpnVltgV1xma2RWYlVfUV9weHlsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunmqmYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58p6GLhpCQhZWDho6Yd3KEqoaNkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXd6mnuCioF1gYWCZ3eJhWphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHqWW1xqZ252W3t5eHVuc3OCZ1xti2trYlpaX1pZbHFcX2FaX11mdH57dXB0Y2tra3x9c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN9gYx2hYuChZeKcW+AcpiGg32Sg4SGioF6gYWMnKGRg6aiiHiOl4mVioucmISDeq2CkZealYqenYiIoaufoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJOUnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnYmEk359in9/dW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX16mWtyaGF0inF+end3cHd0gV1eb4dobl9eWl1dVGhyVmRcXGJsaHV7fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDe46ZiYaDhIdueYGAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4ern4Ryi5CGkpGLnZJ9jnuqhI6TmJaPnJaHhpuln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2DpHp8jpCRhpiroZ6UnZCOqo2Qf52MiJOZnoKOl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaEfoWElG54dXSRoYqLhZqDhIxzf4h7fHJxeoeCeneKjYORpo6Fg46Ag4qJineGiYqMfnBsf4J8bmhsbWhfen9pfXx2dXZ1e3dcX3B+bnVgY1tdXlJnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1tiomet5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYONgoKDbnx/eXOBhX6LkX1qaH2CmImBiI58fYaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdHSCcHdhfYCNhnGLlXyIjHGMf4KFho5od3F4i5eRj3+WfYeKcYGGenxwd3qKg3l5j4uClKWSi4SPeoaGh4V2goSJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZoCBa259aG9xbH54h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveoiMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4p/iYKBf3J/e3R2g4V+ipF4Z2N9hpeKgYqMeH2AjYN5l4KWmZeNl6CcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2cfYGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgHZxfW57ZIB8ioVwh5N/kYJsh4KBgImEZXVue4WRl4t8kneLiHt/hXt6cX13iIR4g4+IipehlIGCinaIhIKCd3yDioZ4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyPbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5yul6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGLfXyEfIGDgXh0eXpzfYCEgImLgGRffYuVh36EhnR9fop/fZmFl5WYjaSimX9zh3uTkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmHqHiI+Jb5edmqSUlYuMnoyGgpKcf5KSlYeZiHyKiYF6cXlrdWx7fot+bYWSgpR4cIGDfX6Kf2RxaXt/lpeEfoxzj4eCeIV8dXd/fIR/e4KLg4uSo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG50e4hrYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH18jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId357inx7gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4NzeoCHeo+SiZOSnZOmnZWCfYF9jYqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMeod7fYuFd35xcIGGhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhaX19ha1pQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaIF6d3VvjoV0gYKDe3WCiYV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8doV4eX9zc3uGa3Nwem2KdoCBiG9xW1l+kY2HgH9/dnWAgICghpGLk52YoZWYeIp/gIyJnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjZqRfIqAg251cGxtb3B7hWlzg46Yi3F3gHWCiIJ4ZnJudYCZjnuHg3mTkHl1h3NviHqEi3mKhYKHjZqih3uDdYGLf3d5bmyChIJec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWGFgYW5YUVRaZmdjdXCEgmJda25kYmZrkm5gZ2ZgZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbXZtiHaDfoBubVVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhI+KfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkYORgolxg5GYkJyPkIyMj413e5KReo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYNvdYt5iIt5h3yAi4+dnYR8enaBi3x3cGpsgoR7YHlxbm1zdFZecGJyYWBsbnpxaHBmZnN0aHFrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpFqX2hlW2dwfXBscXSKfXZ8hYB1dX6LenuFgHiIg3OGhX6MjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHBwhXRwcoRva2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ+lpaJjY2Iko2InH+OgHd6jH6JjIqcm5yblZJ5jHZmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3p5W4B5j4+Ben1+f4aOenpncmpyio6JgYWEfJSKa31+bX+KfYqFfIN5gI6UmZmKfHV3g5B4cm1ncYCFbmt1cGhqdW5UX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPZGFnYlhpc3Nua3J3jH10eoaCdXZ+i3OAhn96iX9yiYeBkYuIfH6YdmVzbn1liH5vcGyAWWxueXlzYXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR3cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqRnZaDgJWQhYmQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXByblpjcmBiVm5ZXHhOTUxkZ2Fed3OJblxcZHleX2RlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NndXF5bYt7bnRxgVdxenZ5cmR3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGptfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2SiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5WPh4qGiY2IgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hI2FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdeYnJzhWpbXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdnaKho6ZgYyCe5N1bHd1eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjICBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1g4V1gn+JkZydhZSOn36IYoCTiIWIhIqOgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SIfm9fcW+Ee46LgXt+kId5cINleYGJhYqBeoN8fpKNj5KEbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIFtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1elpgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabloaTjZyAiGZ9k4KAhoSKiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goCEg39qXXB3en2LiIV7gI5/fXGAaHiBhomEgneCen+Wi4+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRnYVpsbm17b1lbXmxjWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBlcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfIZ/eHiJioSVgG+Kh3F0fXtqeYaDpZGFk4yDfm5+gnWCd4WZmJOKko+UhYdwe5KDfYOEioRvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHmBaltvfHJ/h4OIfYWIeohxgG1wgoWNgoNxg3d/mIuMhHdtbX2Ef3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19acGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4J/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+f4WCmYqBfI2NaXhya2tmX2FveW1fYm95XWRsg3pgcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyCeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG5aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1tZXHV/dWlZYltnZW5iaUxXZlE9XmZdXXZmX3VxW1lVb2RaZXF5W2heYGdtZ2praXB4fY5taoGEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h5fnJndoh+fZdvcIZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3pqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKBdG5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlZWmBxgHVhXV1hZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl5f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9LZnZMXm9VVFlzbmJRT3R5YlNYWFxhcIJzW2FcaGVkY2pkUVtxSURkYlxjcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgIJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh5eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoezcop5cI52fYiQgXqUioB1dHV+d4BvcH9uhXSUhnh0bGB6gXmIjmVxgm9ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVlhdYHKEb1xgY21kY11uYlRdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoSAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZodyYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fHpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYGZfXFZ8Xk9WZXBZW2poXVhnYV9yZmtocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHt4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHlkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2Ad3dzd297dmVqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZveIukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Ylttempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFwaGdhV2ldXGtpSkRrWmJkVlhVeVpOV25qWV1sZV1aZWNedWZtZHJmc3B0gXhwmYV2f394f3yFh311dIKHgJWCbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn58bISGlIByj4JxhYJ+goBwZmxnV11bXFtUZXBlX1hjcnVpdXBkZWJXW1tof3Bvcn9ziWRleX9qdHZ0dISFeIGEendzdW5renBhaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXcnCOp32EfHaWkHN7cnt5bHp6j4N2lnuHhoOHhH11cXNtaHVdbWlfbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHdxe2V9fn53dW5jZWFshnxta1ZqY3JUTGprUExOcEhee2ZiTlZ1ZUtPU1dga3d+Zl1nc2llX1ZiV2JwXUtLa1hkYVVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaX9pbG9/Z2xhaXp6a3R1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWG9oj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR4j4VziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2NibXx8a2tVaWJnVExtaFBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vub1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXJ0fGlqXWx4d2h1d3Juh3x+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4eHgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWh5d3NwZIN0eXl0cWRhZG1yfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gXl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Nxd3VsYltudHVodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Hgoh6dm9xfHFhd2NZbm9gb3CAe3JlcYBkXm11aWNmd3lya22AdHJ7cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGFud3lsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdga3ZjanVqaV9bbXRybXR0dGuGfX+AfHdvbmxkaXFjW2tyZHR2jnNcV1NkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J6entkZnZoXmNbYWhcXndpV2JecGhhd2Fbe3ZqanJveHRzdGhxgpWDhn6EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVhgZG1jWGBhYl2MamRkbXl4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIGCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5c3Vven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5vaGlzcXRxdXZrbYWTgYl7hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAe3V/g36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtb3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zrc3VvbXh2a2iFjH+JeodtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGpua2pfWGBmaHVdZFZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIi4eGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uNiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk4qHlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKMi5KRkZKRd4aTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYlyipKQkoBziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj3NwjJCMdHeIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pd2t6kIZ0d4ePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI57ZWuGfnF1ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2heaGVnY26ChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvXnJsXGltZ2Voa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaF5odWxdbXVuZmJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWdvbV9rc3VsWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01WYmhtc3Bwc25SUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRhZWVubW1paFRNTk9QUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tEQ0ZMWmhsaG1sbWlnY1tVUk9OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVBUVVpka21nbGxramppaGlnW0xKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5CSlljaGxrb2xtbGppamtpX1RJRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs6Rk5NYW1wcHRwamtpWEtCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTs7S2Bte3NqW0c9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo5OEJqbUg5Nzw8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD08O0dcOTw8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/PkE8RV49Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLYz08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+DgHp8d1Y8PT89PT5GaXRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B8XT5AQ0BAPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHiIiIioqMiomJjHo+OTg4Ozw+Pjk6Ojs4OTs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFAQj5AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJTEpKRkdHREZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxOTE5KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE5MT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5SUE5NTUxMSkhHRUlJRUpIR0pKSUpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1NTUU5PTUtKR0VCR0pHTEpGS05LS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi418WFdTU1VTTkxLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toWFdrYUVSUVFQSTs7UlNSYHVcVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGRVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBZWltbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE1HTVJVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUExLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRD9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tLTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTU5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2loaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhIUU1LS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1NUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQTk9PV1FcW1tcXF5fYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVFJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OS1N1TkNCRlBQSEpLSUtQT09PTU9aYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0lJSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl1ZXV9eVV5dXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVBYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmRjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZqY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x5e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8ent8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFwcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnJzc3Jxb3p/b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF5e3BycXBxl4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycX2eenBxb4agfG9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcp2fdnB0nJ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwl6yQbn+jn35wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCOsah6iKagfXBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nzc5yzpqSnsaJ2c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4d3eBq52htqaip4R6eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e5KmmaOxoZuklHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19lZ6KlKyenp+agH9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCUo5yUnJuXjpuDf4GAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAfpqyqaObn5+lp5F9fH1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgYSVr6aepZ+fnqSorZ+Rh4F/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChomWprGpnpuln56foJ+jqKijl4eBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OFipmjn5mYmJ2dnqGfm5ydmZOMhYODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYeMkZWYmY2VnZuYlI2HhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYGDi5ach46bmoyHhoiIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKBhIuKko6FhIODhYWFg4SEhYWDgYKAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYGBgIiRgoKDgYKAgIB/gYCAgH+Af36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGBgoKFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiIiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBgoOEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+f4CAgICAgIB/gIJ/gIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fH9/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF+f4B8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7e36Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH9/fH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYKEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoODg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBg4KAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4GChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vLu/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0q2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtcqavLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqrDEooyAjcWdl5WcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzwJ6IrNa6l6GdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbunq5ulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbTBoJ2Wp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1qO0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bJ2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbTJjaGfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qzwqSqo6HDoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9ipj5Cs18KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cG/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpGXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoaCZkZKalpeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWnp6alo6CgoaCfmpOmr5uamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpqakpKOioqGenZqjioebnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKmrqSkpKSioaGem5ufoFuGnJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgqrSwoqOioJ6cm5qaqXBQi5ubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKuTnK6goJ6dmpmaoplTWo+cnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCjoWiXrJ+dm5qbnKpzVl+Pnp6enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enah0aKSjm5ubnJ+ha2JikZ6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qngmyBp5ubnJyikmxkY42fnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmapoR2cJOam5ydnYJqZWWMoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmaaNdXx8jpqdn5Z4Zl9ljaGdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmclZSde3+coqCGjH9gZpGgnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn6mcimttrqqhZ3+LemeXn6Cgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6aliHBfaqSUmFZne318nZybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampepmWdFSHSZg4VPRWB1gJSRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrYQ9Ojx4jHZuUTk1XnaCh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+mKNaXmxQeaGWg1NjakZneIGCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fp2MWZijb7a8sbyCeZp9TnV+hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2geIzczLPWsZ64vGVicmFgiIuOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjIuLiJKKmmizybTI1K+uuqd0i6lqWIiLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6Ganpyjo5NvqZuRwr62sZiNd13KmlWCj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqbOgh5B5lKyUjI99eXJnnZxjeJ2ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epqo54V4ONe3qAcG5rc3Z8fXagqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhqZ58aEtpdG5weGpoZGprbnqElqSjoKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqGjp6Gmrqanp6+EbGJLXXNub3dnYmNlX15qdH6Om6Khn52go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmtsLO1vLKWb2VcR1Z2cnN8Z2FkalpaYGNteH+KmaKioaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qorra4vMHDva+Ze2VkW0BdbG54e2thX2dbWGBeYWZwc3mBk6KonZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuzusbQ2tXGuKiWfWdiY1U9XmpsdnFyZGJjWVdcX11dYWhqa257kqWup6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vdLg4dC6pZKDcmFZW1tPP1dyaV5bbmxeXVdZWFpaWFlZW2Ryhp26yL63oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7zDyM7U0MCjfmFVU1VYUUZJgm56g39eVlhXXFtdWldgfJyyvMDGx7e3t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFyMjFv8WtimVWWFVRSWt1o6yjT1VcX2FcXWyQscS8va6psrertbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TDxsbAsZTEyNK7i2ZVVlFWZqKunU5WV1hbZ4ezt66wrbKmqqqqq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTAtrO+xsiwgFpUU1CZsZFHT1ZZcY6mvLClrbS1rK+lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcDCwsOhblVKjbaFRUtafqGip7Syray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTIy8asc192X0tXlre5wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPGxcjM1MyGSUxXoMnByM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbKzHtHhc7Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcC/wMelSp/SzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4vMDFr0+ZzcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjru/u8O1use3trm7vLi5tbrEyKpQkcm/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmszL3Ht7m4rba0t7mztbK6xcqeUojKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1652hL3Iz8LAuK61tbu9t7mxvsPHk1iDzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3aw0dHMysS1ur/EyL6+tL7Av4JmeMvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V2p8zMy83KxsLDy87BvLi8urB9d2u8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6zbw762vsC+vrqmnKqzt8PApnt5e57ExsvIwcPAwMnKwb+7ubGjkYV6r8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbdtrs69trnAvKp9bmhubXSCl5l0en6avr/GwLnAvL7FxL29uLKupKeSkp3Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d212e3FvalxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoKzvba1waSGaVpeYE5TW1xwdXmEo7i3wrqzu7e7vb+6u7uvoqitnqSBvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4i6GwtZxqZmdWWV9JSU1QVG55iamwt765srWyvLm8trm+tZaqvKuxd6zKxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxgY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmHe3aMoZhfU0NZVUhialVPRUpjkKSur7a6tbSyrLy5uLW4wb2Nor6vsHany8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQl6EsbWztbK0r6y7uri2ub/Fd4q0p55mqr+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dYSkpZeI6DY0FUo7mztLKwsa2wubi2u7e7vZKjs66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PTg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxUElJS2icgFpFVK+7sayzr66srba2srS1rqmnn5qbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OTw5OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t/UVhJS2FKVo5iZWSCr7WqsrSuqquvsLKzraWdkZeTjpegn6KgnKOkn56olJuWl4yXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yp9PQXOYc1BuSkxjZnV0YFxic5Gyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFpmfW9yW1FrY1xmYmBskbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXY2BkaVpaV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJITk5ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz9GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5iSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+MiISDiIeDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bV0tbN1NbX1NPR09TU08/SxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83LyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX1tPW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHLz83T1tLR1c3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNyszS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Ix8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBfX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9w8jJzsXDx8DHzcjEzMvMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vcHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8ws7Dxr6+tcG9xLu9x7vDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MbV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xu7awt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8x7nDtq2qqLCywLa4vbCxp7Gztbu8rK62pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlXV1tBTEtNSkVBQ0BGQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpaWlxlbm9oZmhpa25yga26sLWupaSmppqgpKCZnKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0vK+4ubayvMGywa6lqKOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqaot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhrb3KFqqWrpZ6coKSUnaSal5Ghoqmjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGorKm6qqSnp6insq2gqKefnKSmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVFlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+VlZqglZqimJWMnaGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXklXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRmZmZoaWtyjaeckpOTmpaaoJWVkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5KTj5OVlp6WmJOXn52hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmZiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlRLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgJSRk4uQkpOZl5yVlZufnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGFjZGmAkZGHj42SkJKck5WWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnJ+in5+XmJOJnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxcGBbV1ZWUkZQT0haXE9SSlRMU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXFxdXl5fX2JkbYyNgo+Ejo+NmJKTkpyaopyboampq6msp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK64pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9RTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZakqKedmJCPmp6ul5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVlcXF1han54fXOHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJmZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHRugoaBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVWWVtdampwa32De3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+XioCUiV87Vm98jJSJgIySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBsbWd5gHNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkVEQ0lOT2hZT1FTVFVaboJydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHp6aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgHx/dGZ2fIZsb2hzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmW5od36CbWpkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjnp3iX6JiI5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOKgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOh4iIh4iHoKuilomOl396goh5eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElMTEtOVmBjf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2inZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYaIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEQ8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKeoo6eaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWUF9VSUtLQUA/R0tGRUQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ube/t7q3uayssKWwqa29sLy6wsKsmbqok62Pl5eqiH2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqb36OhICNhG56c3iHYrmhmaKIlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLy3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qqGrjqSotoiBgXNgY2NfWGJgamdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj48SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+c316a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLSkhGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7Wz8nM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9hWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLL0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/iIGGe4dyg5KLjn1xeHVscXh+cXtueHNsaYFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4uMko+WhHmFkJCNiomHkYZ+gXtyfoCBh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI2Hj4B4hJSYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zp6+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlnt9amlcW1FUVF9IQ0ZJSD5BPT03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpORl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHp9gpGJhIV6hId6dX51bXx9hn5zfpKekZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+pjo/Dob2LnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPioeWm52PlZaQipKThYCLiJKNioqclpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMz9fQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfX6SpqSfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiJqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnl6mZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+s8XHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIaLiYWEkqe8ramyva+lrrOzqKOisKyKmrWeorilla2kl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho6PlJSIh5KWi4+VjYuNl5mSnZm0lpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u728xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgU1FHRD89Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLSsq7O2jKiyrq69q5u6pKituberpqaioaOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKebsZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81tDNxMqJdnVkX1xiXU9LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnuCf3F+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762zrLFvsO7s9HJyMG1d3tvX1pebFROSURNS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu76nur++vMO4rMGprLO7vaqwqaSlo6yutK22taCgrp+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOpqKKyrai7wMSvpbO3zMC5rsOzu77Bua3CwsHAmXB7Y1tZXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtPNzs3LvMK3sLq8tLzKvMPBtre8rbTAubytr6igqae2ra6psreanqyip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmWaZo5+zpZajlqytq6ecn6eXmJaYlaGkqKaetqypurzDtaa0tsvBuKq2rLO7uK6ouLq9uINucFxaVldQR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycWdeXFBSTUVRUVBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjKycjMzse+urOvubjAwc21yLrAuLW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC/uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpaClqpOSmZyJlZyinpaxp6qrure9s7Kuvrm2n6OnqKWmnJysqamNZWhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG7w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1u6uprayvo6KYqrS6pqqnrKqdqK+npKurvryorLyzuL7GvLe1uMCwvb+zqbW2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn5+lpKqSlpWghJCen5yVqaWiobS1urWtqLWysp6coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/uMHDwcjEv83Gu765srC4s7/DyLXAsLy3ubenpKurrKGgmqqqxKKlqaymnqyvrKKqqL+4pqy9sLe3xra1ubi+sL7BtrSytK++o5ajlpOblK2fkKGhpaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqaCbq5+hjZqVn4SOoZqbkqWkmpissbaxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57Fq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKmuoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rrS0tKKcpJWRk6Ctn5ihnaioq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OZt6Ofs6KhnLCYoI+alJ6Cj6CXlo2ipJWQpq6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLC2rrG1r7/FtbqxsLq2rZqpsamqmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5mnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKGTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhcaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDFvsrFtsDJwrWrtamxuKzAxLS3rq23uqWZq7Krqpifppetu7WbqLCbrZ+utLKnqrqzp7qzuLK4wKq3ssK8tMWnva6tt7Wpp6yhl5aRpaShoZeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6xsqWppaKempqalZion56Yop6usqKmjZivmaWsmJufppKdj5WYmoaWn5SMkJyelIupqauip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqevr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qralrbutwcO3uKqtsryjla2wrbKXpaiRqrmqoKewnaqfsLSzqqm2tqy7rLOyubesubDBub2+psKrsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWpKCXmYuWmZSWl52TiJCbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhSUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvKGqsKqjsbippbWyq6Gstb2vs7i8ur23tsHCv8nEucXDwcC5xb7BuK+2p6u3sry/v7WqrrK4n5esraitl6ipjqe7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6Gfkq2gmpmHlpmMnZqdk4qNlpeal6emo6CelpaXlIGQlYV7j5OEjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVJoXE5ZXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLajrKmlrq62qq60uaamsLjGt7G3vsHCtbS7xb7MxbnDwbrAusS4wbmztayqure7ur61q66xtpiYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6yp7WvtLq8ybKqtbSxtK+upqCzn5morKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5ieraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpeRi5SSnpqlo6OhmZaTkpZ7jJGFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejq7S3yrq0u7q/vrW0t8PBzce8xL23v8DAuMC9sr2up7q6t7fCt6yusriVl6auq6ejs6qUr7qkrbKxpqeisrOxsrG1sbeyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmJSxnaebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgl4STl5GenJiXloiWj5eaqJ2koZOWkpCWd4WRh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2krK2rpqOwsrOqtrC2n6u1usi5rsG7w7ezsrXCw8/EwMK+tL3BwLq/vbPEqKq5sba3wL2wrLOznaCnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraanrLClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGkJSUnpuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamvpKejs7SxtLWxsaGrrb3Muq7Bu8axtK20wsPRxMa/wbO+w8K8wLi8xaitt6yzuLzBsayyraGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpJ2XnpirnaGnqKGspqKsq7exsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI6XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GpsZyoqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcTEusG0ycSsr7eusrrAv7SurqulqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWjqaisrKqsoKimprGyo6aloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmknJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6Siqa+Yqaittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrrBusLErrG1srS7wb6zsq+tq6yotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irpp+rq6i5tqmpqamhqZ+tm5GooZ2go6Kmoqqdm6a0rqelqaKjl6Wmp6qcoqOjoJmYn5GOj5iNfoeNh4WenoiFi4uPj5GNhYeWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdRRTuVja+gpaqsmaqkra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0MC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWopK2zsrivoq21sa+xuaq4rqqutquqnqmroKOhta2poZ6vsqG1qp6oqKqjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGXiZGdkJOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessba4sqanurWttLyvu6WtrbWrrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rtK+tnamjoK6bmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZmSkIuCj4V9j4KAiJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltoWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycjMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6aqq661t7Sqnbq7qLG/srqgr7S2qayerrGjnKWnqaOdnKSvpq+hn6qpp6GpnKOooK27p66xrqCroqOtnp6sppifm6GinJ+amaKqopqZo6OVlpOeoZablqasi56Rj5GMgop/f4+Be5qUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKyL+3wr6vtL62xLbDsrC6sbLAtru+uKm5uL2qpLSmqKqvrbiwqZm5vKOtvrSzoa63taemp7CzoJ6kpaehpJmerKionqCqrqegppeiqJ+wuJ+jsa+hq6GtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Ph32HfoKNfHyhjIyIeYSNhYqNjYWJk5qOiZWfiJCVgoyXjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLXFx8C2v8K5sLW8tr67v6+svrCzv7K9w7mpu7q4p6i1qKerr6uzr6WZvLakq7q1rp+xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6SitrChprCrn6ujr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6g32DinmPl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmleZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5Xl5tUUVYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra60w8O8s7+6t7Gzube5t7qvrsCztLmvv8G4rL26taaisqmnqbKqrbGgmsC1pKe1taiesrypp6Wpr6yZo6ecpKWUmKGxpZmfpKipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY6GeYR6g4V9nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmleak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqORjaSnm56enaO1rKequrenrMTBtrCso7Wup66vt7+/vLLBt7Cusra1uLa2raq9s66ysb2/uK68u7Gln7aqpaWzqKqtnp3Aq6ilr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImKiHmFdoGCgp2Ii4KJfX+FiIeGkISWlZCOkJGQkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamNrc1pfWV1tZGFOaVhaYFZKR0lLTVJYPjlfbGlIQ1VTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7qtwLKurq62rrK4s6irubGvrrO2urawuL2spp61qqCgr6OprpyiwKCxo66vrbeutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6p66ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnSBgYqYhYd8iYmFhYqMipKElJyTko+QkZaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuurKqrtqqzuK2ls7Wyrqmwt7axs7W6pqmftaidnqihqKyap76YraOurrS1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXWBhio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6GpnrOqnqGjm6WmmKu6laWlr7K2ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+joqKdlpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtpbK0rq+zt6qppbCtpbSznK21trSmp6izsa2yqK6dqqCyqKCjopmhoZqts5SjpKW1vKasp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CjmJWTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYPUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6W0pae3rpyzsraqpaSnsq6usaaqnaeksaOin52Wmp6drquUnqKfs7mjqqmira6loZ2bmqKnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aWkpeSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKnqbCrrqmpsK6jsLqvo6StsqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuWlZaamqyllpuhnrOyoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qqytra6mrbGpoa67qqCntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqpudlZigpaeanpyin5ugo6SjlZuel5mdoqmbpZmcnKKglpORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurO1p7Gwo7Cypp+ttaeap7mto6+xoLO0sKCknp+nqbCptKikm52eq5eYl5WXlZWgqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6agm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m6s6W0tKGxsaKfq6+kl6a5raSxsJy0uKqgpp2hqaSyqKyppJmbmqielZSXmJKSoqeflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7G0u7SkuLOes6yfnqirnpSntauosbGrrbSkm6mgoKihtqemqaKZnZSkoZOSm5iRlKKlmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZSemp2gmJmblpehoJOXkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0nq+knqSnp52TqrCpr6m1rKqvoZihoKalpLqio6uglpuRoqCUk56Zk5een4+Ni6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2VoZifn5Kel5yVnaGVlo6rnI+ubXK0cqmMdoqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW7sK64tqrBtaiooJulpKGckaqpp7WjsqivqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVlxqeV5qYWVnYm14b1lbWUNBQHJAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0I5p5ueobyil7HDsK2qq6yxp7ivtsSxubCtua6twLGro6Keo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5qeqKOznqOljqeilKKanJeVo5iQr6CSlKmehZCZtX+PkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZqjbV0cnF3toxegHp9imiDeW15Y4uscHWFf1lbp2pFZVpUZmBjXmNRaGdxbXVCTVBMRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqWbpaqblailpZuZoKimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmbpXiHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYGNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUk9ERU47SEg9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOZmaKnrKKfq6KasZuUp6CWlJ2fnZexpJehqJmckZ2coqOYpaGanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiWmqChmpyUoZ6NgnqkhmxqfJB8gHWKioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2tvem1gY11waE1YWmZqYFdacHpubWZTT0ZTOU9ZTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrbCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJeWp52qm5ygrJihmpuhpK+moaWon66Yl6ecmZqgnp6cr6CcoaaVl5KYk5+glaKdmKCOlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZido5aak5GejX+OZqGzr4WKhHZ7kop9dnl6b2Z6kYGAiWt1gXmIc2lzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUERfVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqrorKtvKOzm5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqadqJqfo6qTnp+doKmvqaWjq6Kum5+goJiknpyfna+jmJ6ok5eWm5CjmJennJqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIjoN8aodZXmx1ZF1ziWlrfHFrY15STldKZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2wvLGppqOtrrCerJago52imZmmq5yto6WoqbKtnpWjj6Kvpba5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokZ6hnaCqsKqrpKqgqpunn6egq5Whm6WwpJebqpWgnZqRpJadqZeefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJujIFvynp/m3eRg46BdnqBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprCrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOpo5KgoZ2dra6prKejo6ehpqWdraiRpJqorambnKmbrKCVlaSVoKKWnH/OlHh6pIF5lZabX66PXo6ngaKgfaeWm3Srg4CvXmONqnunh4WgdZeTiLNjgquGoY6Ns2qFr3R9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hZCRfm2DkGFybHBoYF95ZFxxaGpkZmBSVFJXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrprKsrKqjqqavqqCnm5mklpyir5+gnqino6Whn7Csmp2Vp66ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+UoJ+cna2vp6upnKeopKKrkqyylqWiqqqdo6akobCgkpmmmJ+Zk5SRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdkWFNcYVlRU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2rqiwpqiqpqyrq6eio52ZoZSgpaufoqWgqKiinp2wrJealqmnrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqKmxopKWo6SZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCo32pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxqY11XYGlYWFVMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK6prKKnpqmqq6mkpqCbpJ2cpqeno5ysmqKsoaOfr6Kcm5OrpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqhs62hqrOxoZqop66utqKSlqKmmJqRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG9bZmpycGWBa15hWWNtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuKyqoKWaqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7WfopeTqaq1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtcOys6qtqJOIlpykmqGjrqaYoZWYnKWmq5uwna6opp+so7esobG5r52arqaysrKkk5enopmejoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KLdXtzhX9xXW5ueHJqgW9bZF9obmJkXUxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6qp52mppqjp6GzrqKpp7KgmKmklKK1oqKVl6GptLmjm6KdopOPobGYnpunpaGir66dpKiitrLEsa2pramRh4+bp5yipJyll56YmZqmpKmar6KupaaYr6S7rKG2t62dnbSxt7Cyppedrp+inYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2UjXh9eY+Cbmp5aXlyboB1XmVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqrS0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISNm6GgpqKVmpqcmJuZpqSmmKyorqOlm62mvayUvbCsn6Kvsrmqs6aaqLGippd5qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmYCsiYWuhZ+UqqGhl4afgJmVgHuSfquAnZqWi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI17e4SYf2xuf2N+dG6AemBnZXFuaGdoQlphWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbSfmqygrbilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKaeppqsl5ePrKGhnaWhmqScrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6mn7Ktp6iXdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZeYfHqPnn5ldX5ihHh0gHxhamZxbWZlZk9WZFxCVV8+Sig+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqS2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iaoZ6kn5mjo6WZn6Opsqm9r6SonpyOfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp66rKurlICpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpx7ZH57ZI5neYJ7YGtla2piUGFbU2pcQFVhQ04pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubK9sqKdrqWlsqadjJilv6q4sqihv6anspyesZy6qJ+tr6WmlJSwrJeMgpuRrqWirKCjnKqgl4qjkqaep5yaoaiimZ6hrK2pua2oo5qXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7Sqr6mfuaatrZlzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCWd2eIeGmOa3l/eWRsY2ZsYktkWEprWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytp42XrqmPi4WVlq2epqqgnaOjoJGLpJKnmaiZlqOqoJacpqansLqrrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2qprairLaViqCopbadiZajmYepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjnNqkXdxi3h3fHpqbGRjb2RVYVlAaltIY2FPWStGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam1p6mRmK2ii4eJj5uolaykn5innp6SlKOXqJqomZSmoaOQmqeZoba7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKyoqLK3n627mJGlpKa2opKep5+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmoh7c5dzeot/cnx/am9kXnBqYVtgWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKKvsqyuo6mmrZ+ntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuaejlJmqnI6Giomco4+unqKVp5+gkpaYm66LqZaPqJmojJipj5+6tqSlmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyn3d5n6mwuZR1q6OeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoCAYWmHipSSi1p1lJBoaI+Pc3ummppmepqIhHmZaoSLg295gGtxZV92cGxraFtnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqK6jpq2kkpartrCyp5urpqyXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2OiKaaqZGXpImcurSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7unoH6nonqirbWAjo2lnoOLhpCxqq+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXl4SamWN5h5CEjo+Ri4NtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+Ui4WFmmuOjoVseHtxcWdkeG9qbGpbZWtqZXRcXklUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWhmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isn6iwpqappZmUrsi+saKXp6m2npCEnaycp6KgjZC+npmNn5qgkHyGjpmYiKycoZWfoJGNk4mGgJGnjIainaSUmJ6Gn7qyp52bko6FcHWQiZWQipSQj5uLj5GfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgrCsgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6Ocg5qBjo+Hi5pxjpOFaHd0fHdoaHZxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq5+jt7CpqqaalKCjpKukl6WruKOwgKGonaWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPno+HnqSclpqYh6O5rqSanIyMfmJtj4uTkI2QjY2YjI+Rn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbVtvjH1nWmCDf2JXUG93Zm10c2tqb15rcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRoLa7q62imZigoqWtrqGdrrajqJOhoKCnnJqOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5qPipipmZqbkoimsaeilZqIiYBpboiIi4+OiouNkoyQkaKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+0dHNbnrKDamJvdHZxaW9Ya2xycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3tK2toJqinaOjpq6dnLKurJOYoJihpJmalJ+rm4uIkniLhXGAlo6Kj6GQkpSdl32QiY6ooIeYjoqRo5Scm42Lqailno+Xh4R+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkJRRk83VkNSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJqrubGvrJ6mnJypn5+vnJ6xqa2dl6OaoaCZlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkYqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbnN9lXCadGukXZV2SGVkYXRxfn5uZmBsaXZ7ZGViUl9XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCumYRUXqCms7mysqmaooycq5ycqpSirKSiqI+enZ2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcn+IkqGbc5GQgYiZlaGbhY6pnJqVi4uKfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm3B6e5hsnHx4l3NuqaRnYWV6cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0r7Ojm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI2PiW9/ho+SkmyWk3yJkpOlloOPq5uUkouFiXqDdoeAboGfhneAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJqQe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t2hZttdniYapl7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVk1ZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+TobKqrq+1oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg41/mKB5dY+IjIFphIWSgoyFnY16jYuWppODmKmYjZGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6euo6mwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJicc3SJfZB7ZIKHlYqJlpmCfIiHl6iRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lIZ4qXOlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnnq2MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3JicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2opq6kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5KHhpOOfXuChpmmjn+mpo6BjoqFlHaCh5JvbIupgIOLlI6JnJ+JjJSqop+PgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d0cpR1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bm1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaLoaKapqSYpZyroqGEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7mI90coNwloV7fZKLhoaQhXl+gIeapY58p6GLhpCQhZSDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+fqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFufqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenFnaGV7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3x4dWRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6dl56YqKOifoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gIx2hYuChZeKcW+AcpiGhH6ThIOGioF6gYWMnKGRgqaiiHiOmIiUi4ucl4WDeqyCkZeZlIqenYeIoaueoaGji4iTm5yjmZaqoaemoJKbh5WNe3eNjYOnfn+SkZKTnLKmm5WekI2ykpeEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGEeW2DhH16mWpyaGF0inB9end3cHd0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH9+f4V7bYKMhnx5eHt9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiUmJiUmKSgnnuAmquOn42GoJyLnpZ9eZSDe46ZiYaEhIZueIGAc4GIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4esn4Ryi5CGkpGLnZF9jXuqhI2SmJaPnJaHhpumn6GanYaCkZqZmJCapp+lnZ2Qln+PiXV7ho2DpHp8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF+g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqDhIxzf4l8fHJye4eDeniKjoOSpo6Fg46Ag4qJineGiYqMfnFtf4F8bmhsbWhfen9ofXx2dXZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbXVueXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZWpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1si4met5qho5+RkZWXi5qfn557eJ6nkZyKh6SUi5iZeXqNhXyJkYOMgoKCbnx/eXOBhX2LkH1raH2CmImAh418foaEhn2PgpCcnZKJqZ2AcIyLjJOHoaKKhYx9qJGIkJKXk5aTeIyjn6Cdlpl/gJCamJKMmqOho5qXkZp9jIN3f4KOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfYCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36WfYeKcoGGe3xxeHqKhHp5kIuClaWTi4SPeoaGh4V2goSJiHxnc31/eXtxbGtnX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZYCBa21+aHBxa315h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjo+Xj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2g4V+ipF4Z2N9hpeKgYmMeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabh4yJg6aVhZOLlpeTkneRnaChl5OWeX6OmJeOlpqdpJ2YkpSaeI2EgneDlo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8kneLiHt/hXx7cX53iIV5hI+JipeilYGCinaIhIKCd3yCioZ4YXp5fXR/eGdtZWF/amp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodWlub2d/fYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Ml4eGn5OXmX14qpyKmXqXnYuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqnj4yOipOhkoORkJSXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl42VlXOMjYlrhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx7fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfoxzj4eDeIZ9dnd/fIWAfIKMg4uTpI94g4F0iYd9gHR2gYmFcGJ8dnpxfW9ib2NkfGNub3ZzeHdzdGF1YG9sdW1vXFxfXl9qXlBdWWNhaG10e4hrX2lmamNod4huZmxpamxngH17d26QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGip6LlZh+d66ZjZd9n5ORlpSId357in17gHZ4f4BwdHR8b4Z9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiZOSnZOmnJWCfYJ8jouSpImOio2Ym42GkZiTlo+KiIySnJKPi4xug4+PkYiemaKhl5aJlpFuh5iDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx4fZmTfYOIc5CJgHOHeW5/fYCFe4WLiIOLlaiMeod7fYuFd35xcIGGhGRpeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtcllaX19ha1pQV1hlY2dxcX6HZl1qaWdiZ3GNbmRpZ2RpaYF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgY+dh5OddYGqlZOOh6GMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgYCghpGLk52YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi4yNjJyJjY+DbYmLkJCKnZahnJeUhZiHaoOigmWFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIg3mTkHl2h3NviHuFi3qKhYKHjZujh3uDdYGLf3d5bmyBhIJec3VzcXB4Wl5xYXBrXnBqfXtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda25kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNg3+XlIOQoHWLoJSShoubjJWOi3pyeHSCcHKFc3F1iGtvbXZtiHaDfoBtblVRgauVh4J3f3dzgnqCoYKTgpWUmZyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4edhI+KfHOLhYmOiJyan5uVlH+TfmiEm4ZnhaCHkYORgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWdzbHOHlYp+h4V6k45xeYNvdox6iYt5iH2Bi4+enYR8enaBi313cGpsgoN6YXlxbm1ydFZecGJyYWBsbnpxaHBmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgHiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXRwcoRwa2p3boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDlHeVkpmckZl7lHOFkJ+hk5ORiZKblIZ+lpaIjY2Iko2InH+OgHd6jH6JjIqcm52blZN5jHVmh5CGa4eihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuNiIqTkYl5hXx+bHtlcm9ra3p5W4B5kI6Aen1+f4aOenpocmpzio6JgYWEfJSKa31+bn+LfouGfIN5gI6UmpqKfHV3g5B4cm1ncYCFbmt1cGhqdW5TX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaBdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW9/c2VleXF9bXl9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqQnZaDgZWQhYmQgJGKiZZ+h3p1f4l4h4SOnJuYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2HkIGPhH2BeH6QlZOYkHRyd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXBybVpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3BzanCBbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaLm4mOapmQkJ6WlIGJcYWJoI6Fi5WKjJiUfI6TiIOJkHuQi4WPgX92eIOEcoiCk5yXlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySg4V9f4OAhIqCdWFza4iAj4qBfn6RkHxtgWt4hY6FkYJ7gHx+kZKQlohucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfH+HdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGaooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2Ryf2lmbXh4XF95e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2uaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh0g4V1gn+JkZydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0d3ZrY42Bj3+FfnyEf4SIfm9ecXCEe46LgXt+kId5cINmeYKKhouCeoN9f5OOj5KEbm55i351bW5sbHt+Y2lsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxnYmp1elpgeHx6bXF/ZWRoZ1edj15xc5a8xIR2cZSKkH9zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5OIdYmFdnZ9gXF1hoGelYaVj4KCcX+Hc4N6iJabloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqNhYqBin95goCEg39qXXB3enyLiIV7gI5/fXKAaHiChoqFgneCe4CXjI+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZY6xsndKYlqk2dCXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSVgG+Kh3F0fXtqeYaDpZGEk42Dfm5+gnWCd4WZmJOKko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foR1Y3BzgGh5cW91mI2Fgop7dniAhHmBalpvfHJ/h4OIfYWIeohygG1wg4aNg4Nxg3iAmIyNhHdtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFbW1lrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2xvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+gIWCmYqBfI2NaXhya2xmX2FveW1fYm95XWRsg3phcXZfZWXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt1ZnmCg6iMg4+Mg31tf3R2gXiEm4+Lj5GSjIuGfnuSh3iAhI2DbIBzaX9+eG18e4GKg3hheYSBcWRxaX5tdHF0gZuLgH+EfnN1fYBzgG5aa310eImCinuGf3yIeHlwa4eCjoKJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pyZUxbc3JlW0pxeHBeW1tZXHV/dWhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaHB4fo5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvYGFsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZhvcIZ9aHd5bmV6iISlh4GHjYp+bn52fn97ipiGgZOQl4iLhIl8j4hxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l7dH1sV219dXOKgYZ3h3WBiXp3cm2If45/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3lrWFlZWmBxgXVgXV1hZ2RoaGZOWmhOQWFkXGB2Ylx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcnBjZl5ZZ19wcGBhaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N3fpCPgneVjZSPh4KIeomJa3h5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3N9YVV1e3FziYOCfIJwhop3d29vgoGLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFlzbWJRT3R5YlNYWFxhcIJ0W2BcaGVkY2pkUFtxSURkYlxjcV9cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd6k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3GAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdpCAZ3BuX2RcWGVZbXNhYWFxbGxoiW5gc2lZXmRtgHep2qrHhoezcop5cI52fYiQgXqUioB1dHV+d4BwcX5thXSUhXh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdH+Qi4NylYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsfllWcnxvdIOGf394a4iGc3hqdH+Cgnx5fHd7coqAfHNndGRti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN1d1lRVlhdYHKEb1xgY21kY11uYlRdckdDZl9eZmldWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVWp0ZGBbaG9wZ4dyYXFmV11ja398ys6HuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7am11Y4R2koF2b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB4bXtcWHB9bHN/inyBbm6Jf3B2ZnZ+gH6AdXtxenOGe3lxZXJgbYyCbHNYa194XUlvbE1XVl9UVXxrYU9UdnNRUlRWXWJ0hWhcYGtqZmJZbmFYY3BHQWhdYGZfXFZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3eHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bWJ0h2l0fHJ6hId7fo2AeHhzd297d2VqbmCHdY6AcmliX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQh3KTh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qCdGx0Ylttemp0e4t6gWZ0hn1tcGd0fnd8fnF7a3l7gXl3cGVsYWyJfm1uVmtgeFZLa2xPUk9pTll9Z2JOVXZsTVFUVV5mdoNmXWFwaGdhV2ldXGxpSkVrWmJkVlhVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZXBlX1hjc3VpdXBkZWJXXFxogHBvcoBziWVleX9qdHZ0dISFeIKEend0dW5renBhZ2tnhnSNg21mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2lnuHhoKGg311cHJtZ3VdbWlfbHVkZ2Zpem97cllngXZ1Z3CAeIJ2YneFi3yUgG6Lam16gHBlcmVga3hmcnaJen1hdYN2aWtxdHpveHhyfGV9fn54dm5jZWFshnxta1ZqYnJUTGlrUExOcEhee2ZhTlV1ZUtPU1dga3d+ZV1nc2llX1ZjV2JwXUtLa1hkYVVUVXNXTVl2ZVpfa2BcWmNlX3dnbWJwaXRvcX51dJmBeICAeIB+hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amhtaGBiV19baYBpa2+AZ2xhaXp5anR1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRoZlhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kI54dW59bXF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2J3hIR4j4VziHFweX9xYnBoW253ZHBzh3t4YXKAcGdpeHNxa3d2c3Vignp+d3VwY2NjbXx9a2tVaWJnVExtaVBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vvb1dKU2hYZ15YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZcXGuBZXJ0fWlqXWx3dmh1d3Juh3x+fnp2c2x6Z2l3Z11kc2h6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBve2Z4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXZjdYWKe4eHgH93cnV+c2BwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIN0eXl1cWRhZG1zfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3lbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9gImMhn52doZ4hox9dHV1gnl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66Me3uGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15YWlxse2Nxd3ZtY1tudHRodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc31hY2lcVVheYmSQpWh5dIKFkHhsbnhmd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR1ZXKDkn+Hg4h6dm9xfHFhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpza22AdHN8cnFiXmVtb31laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doJ4fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFhgbHZkanVqal9bbXRybXR0dGuGfX+AfHdvbmxkaXBjW2tyZHR2jnNcV1NkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHtsZXZXW2ptYnBygHpzZW9+W2BvcWJeaW99bGpyfXFwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmFe2uEfYCFmX2ChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVlhVZ2l0aGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZGtvYV1ubWRzeIhrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SJcmpneW5lcnVxemt5c3Vuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3BuUlplamVxc4B2c2JsdlVicWtbXm5kfGVrdHxxcnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAenWAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2xleGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3R6dGpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5CLipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6GjIWKioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2NiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIeFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OSkpKSkpSSkZSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKTlIOFlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOg5KRkZONdYmTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkY5vf5KRkXx0iZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkHhqhJGKc3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pe2dxjoRydYePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI55XGh1cGRviI6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qKhmRpa1xnamuDhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnduY3VsW2p1bmVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Bnb29mbHJ0amJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGJnanJvcXNtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SX2NlbW5uamhSUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9NTVVja2dsbW1nZVlRT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFRUtSXmhtZ2xtbGpqZmJcVVBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhGRlNbXWFmam5qb21ramtrampmWktKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz9AQ1NeY21sbG53cmppa2hfVE1GRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tCTmJtcHpza2pgS0ZCRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTw6Pk1gdHBjTkM/QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTs6NjhXZkE4ODs8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PDw8OkRZOTw8PT0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8Rl09Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213STg7Oj09QTxLYj08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndONzg4Ojs+PldpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUlye1o6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WHuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUNERURDV3WGh4d+WEdISk1MTk9PTEhHSEhISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7enx9fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbUFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NjY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNTE9JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTkxKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyLi4qNck5SUE5NTUxMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0VCR0pHTEtGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1FTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpVRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpLVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdOSEdAQTw5Nzc2OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25xdHd4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVES01SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJTEpESUlGR0dDQztBQEI+QEBCRURJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDRUVJRUlKTEZJSUdGRkNCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTE9NTk5NS0hISU9SUVNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJDQ0NER0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1DQj5APTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEJBQUM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lKSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8QENCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5uXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBBQkA+Q0ZHQkZDRkVFRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRHRkxIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGS0lKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQkJHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tZWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENRYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTR0pPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNCRlBQSEpLSkxRT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cm1uXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Fha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhRUExOT01NU1JST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUE5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeV1RQWVJWV1dXWF9bZ3JeW1tZXV1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVJTUklITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFpVVFJVU1RVV1hXXVpeYV1bWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZ21zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUVVRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUldWVVdbWVpfXVVYXlxeXVtdYWFeW2JiY2dmZGRiWF9gYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFdWVlZZVFhYVVJSWVdWWl1ZXV9eVl5dXmBcW19fX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcW1pXW1tcWVpbZHFtaGReW1lWVVdRTE1WUk1OUk9RUk9MUFNSVVpVU1BQTFBYV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF5WXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1FOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVlXUE5SWlNSUVNSVFVUS1JWVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl5eZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFlbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF9eYlxgVV1eYmt5dGx9a1pVWVVRUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUVdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFliZmNmZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUFdWV1dXVlNVVFhcXF5gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYF9lY11laWRlaV9mXmNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1gWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NeYWZlWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1hXXFlXXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9en16e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fXx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7eXx9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzdHJxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnBxc3Bvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3F0c3Jxb4aEbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF4g3FycnB3nX9ucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcXahiHBycI+hfW9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb5Wqf3B3oKF9b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwj7GecIGloX1wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCMtqqRm7KmenFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdaCno7OopqV4dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCqJ+jsaObpI96eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fI+jkZOlnKChlnt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19jqCYlpmclpCZgn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCPsaqln6GfoaGDfoGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAg6SuoaehoKCorJ6Ffn1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AhY+nsaScp6GgoKKjq6mcjIKAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoubqaqjnZqinZ+hoJ6foqWhlYaBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4KEh5CYmJaXmZyMlJ+dm5yalIyIhIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KBgYSGjpaXlYePmpyWjomHhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBiJKXjpSak4aHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCgoeSloqEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBgoKGlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf3+Af35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4foGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX59fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH18fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX19gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn99i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt8fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx9fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIi4mFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH+Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3t8e3t8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoKBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYSEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCgH5+foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX98fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf3+Dgn9/gH+Bf4B/fHp7enx7fIKAf4J/f4CAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Bg4ODgH9/gYGAgoGBgYCAgICAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoCAf36AgX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYCAgICAfH9/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH5/gIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoGAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoCAgIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4ODhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEgoGCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4ODhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWGfXeFhISEg4KBfX9+e3x7fnt8fH1/fn19f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH98e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWChIWGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhIaHhYWEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeFh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHh4eFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYiDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhoWGgoODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag397gH19f4J+f4F+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2MmqqpqampqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7WoqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qxz5iHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZs8iZkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbS+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm1v56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatcaWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbPRmpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qw2aWrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9XMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubi4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm4uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlJqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpSZmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkKGsl5ebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmp6Wlo6CgoaGfmZmalpibmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpaWkpKOioqGdnJyiaombnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKltqmjpKSioaGempmlgVaOm5qamJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgp6qwqKChoJ6cm5qdolldlJqbnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKaigKuln56dmpmZp39VZpWcnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgoKCfqnd2raKenJqanKRrYWmVnJ+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaiMaYyrnJubnKCXbmlrlp2dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qjkXl1n5yanJ2giGtpa5KfnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZqao5R4fIWYmpyemX1qZ2ySn5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmqCci56AfpignIWNgWZtlKCdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqcp6GRcWWmrKFogY15a5efnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYoa2Sd2VmppeaWGd9f3idnqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6eleE5KcJuEhFJEYXiCnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampermU43PHSSfXBTPzZheo6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrXNUcFd8sKmZWmduSGt9iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+lqRchZt8ysWxxZ1+nXpQeIKCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpKRcs/XzdWmnLm8a11yXWeAhY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gnyZd5rRvcfTx8G0nHelqGNiioqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLiJKMm2+ippW5rKKhiYV2YciLWoiKiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoJ2Ek3yPpY2Fi3d1cGyml2GBj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nln5YcoZ5eYBta2l1eH94eqChpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpqKerqYVwUmB0cXJ6aWZiaWtwfIWiqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKjsJhwaU9WeHZ0fGhhZGZfX259iqCkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCjp6Kmraewsql8aWNJUnN1eIFoYGNqWltia3WDkZ2hoJ2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmttbq8vayKbWdhQlpucH1+bmFfZltZYWFocHh/jZqgoaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qnrrnBxszFt6WOcmhpWj9TcG9xbHRoYWFaWF9jYWJqcXZ7jJ+nnZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKq0v87Z2866q5yIb2BhYlNDSnlrYGJtbFtbV1pZXVtaXmNmZmh3j6Wvp6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vM7a3dTApIp2ZV1ZWlxTSkNtapSelFZUWFddXF1dWFVXW2l+larBx7q2oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9wMbO0c23knVkW1laV1NJVW+qs6ZOVV5hYl9fX2Z3kKe6vsHFxbS2tqmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsG+vMzEsJFvXFVYU1BTobWbTllbXV1gbY6qusG1uamnsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZK/v87OvJVpWFdaTJm5k0xUWVdgf6a8sKarrLKmqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAt7O8wca+qXlYVVGKt4ZMU1VdhKCmt6+lrbS0ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e9lmxSWmlaUVJklKufprSyray4tbKsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGyc7KnFZIT1Brrbu3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnL0dOkUkxgsMfAyc3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbIzopJk87Mx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcDAwMWqTqTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24vMDEr1OczMTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEyapUk8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmty73Ht7m4rba0t7mztbK7xcqfVYvKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1692hL7Iz8LAuK61tbu9t7mxvsPHlFyGzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tL6/v4VqesvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLi8ua+CfG28yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uqzbw762vsC+vrqmnKqzt8PApnx6fJ/ExsvIwcPAwMnKwb+7ubGjmIp+sMjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtrs69trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGvp6yXl53Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x2e3FuaVxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoKzvba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uvoqyyoqiCvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6GvtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZavwLC1eKzKw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2Np8KysnanysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FeI64qZ9mq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSkpZeI6DY0FVo7mztLKwsa2wubi2u7e7vJKks66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjk7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE0/U3hxUElJS2idgFpFVbC6sayzr66srba2srS1rqmnnpmbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t9UVhJS2FKVo1iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXSYcVBuSkxjZnV0YF1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFlmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1dfX19PX0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrNwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Jx8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDJxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9x7vDurS9xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7Gztbu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaSnp5qgpKCanKWrrqSooquqrKuwpKafqq20trG9ua+3sKiuuLSzvLi0vK+4ubWyvMGywa6lqKOrsbKzqL2qq6irrK61s6WorqGkr6mypqiorqaot6yxsre6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXV1hQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGorKm6qqSnp6insq2gp6afm6SmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVVlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnKCin5+XmJOKnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxb2BbV1ZVUkZQTkhaXE9SSlRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbYyNgpCFjpCNmJKUkpyaopyboampq6msp6mmpJmlr6WVmaWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK63pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dmJeVhIB2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han54fnSHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJiZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWViHyDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHVvg4eBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3h0ZFdNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH54fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdampwa36Ee3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk390b2BcT1NSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d+c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bmdfXUhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hiXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjXp3iH6JiY5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOLgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT06ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh6eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnpuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2hnZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoiShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKenoqeaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtLQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ubi/t7q3uayssKWwqq29sLy6wsKsmbqok62Pl5eqiX2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNhG56c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDln13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLHr565qqGrjqSntoiBgXNgY2NfWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttXmFdWl9hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIyJfIGEc3uKg4V7iXSBioeVf3N7eWxtdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NG3r8O8xLmltrrDooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KiouQh3yEgnB/iIGGe4dyg5KLj31xeHVscXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfZF5YYVNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkYh/b3Zya3N9e3Z7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBZVVpUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zpq+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlXt9amlcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX11bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOMlJSUj4uPiYeWm52PlZaQipKThYCLiJKNioqdlpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqmygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlFHRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqq+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdnVkXlxhXE9LQ0xARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO6x7u6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dntuXlpdbFROSUNMS0pJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IycrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6yutK22tqCgr5+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZebpaOpqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9ycTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2ip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaZo5+zpZajlqytq6ecn6eYmZaZlaGkqKaetqypurzDtaa0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcbFyMfOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKycjMzse+urOvubjAwc21yLrAubW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC+uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq6+lpaClqpOSmZuIlJyinpaxp6qrure9s7Kuvrm2n6OnqKWnnJysqamNZWhiYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1uquorayvo6KZqrS6pqmmrKqdqK+npKuqvryorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn56lpKqRlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensKsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEv83Gu765srC4s7/DyLW/sLy3ubenpKurrKGhm6urxKKlqKymnqyvrKKqqL+4pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqKCbq5+hjZmVn4WOoZqbkqWkmpissbaxqqWpraycmKChko6QlamflGplW2JeUEpJS09NSEZDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm53Eq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKquoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJmhnamoq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OYt6Ofs6KhnK+YoI+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZlxlYU1KS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLG3rrG1r7/FtbqxsLq2rZqpsamqm56moajCrZussZyqoq6wqaSnvbemtrq8r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5qnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUl5SagJKhlo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2dcaGZLSkxLU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrFtsDJwrartamxuKzAxLS3rq22uqWZq7Krqpigp5etu7WbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6ysqWppaKempqalZion5+Yop6usqKmjZevmaWsmJufppKdjpWZm4aXn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfemVqXWxrT1FOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qrelrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoKewnaqfsLSzqqm2tqy7rLKyubesubDBub2+psOrsLeuqKqrpp2YmKqhoqCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWo6CXmYqWmZSXmJ2TiJCbmZSOqamnoKSbmJuTh4+Zi36MloaOm2tqbmJublhSUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC5xb7BuK+2qKu3sry/v7WqrrK4n5esraitl6ipj6e7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSonqSXkJifsqqzqqqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6GfkayfmZmGlpiMnpqdk4qNlpeal6emo6CelpWWlIGQlYV7j5KEjJdmbXNocHNfR1lmVkRDTlhEWjlIQjY+XVJoXE5aXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS3wbmztayqure7ur61q66xt5mYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6xp7WvtLq8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5mdraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpOZjZ6cmpeRi5SSnpqlo6KhmZaTkpZ7jJCFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6yusrmVl6euq6ejs6qUr7qkrbKxpqeisrOxsrG1sbiyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquZyVj46LmZ2imJGYqKOgl4SSlpCdnJiXloiWj5eaqJ2koZKWkpCWd4SQh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMK+tb3Av7q/vbPEqKq5sba3wL2wrLS0naGnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGjpSTnZuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa/wbO+wsK8v7i8xaitt6yzuLzBsayyrqGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqoop6boqyVpZ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI2XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcPEusC0ycSsr7eusrrAv7SurqymqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqqhk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCIhZ2gjYuPjZuQkoyEjZmlnJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCYqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS7wb6zsq+trKyotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irp6Cqq6i5tqmqqqmhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeNh4WenoiFi4uPj5GNhIaWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+gpaqsmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWppK2zs7ivoq21sa+xuaq4rqqutquqnqqroKOhtq2ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeViH2NhoSFpJaGg4KMh5CPkYWGlaGXiZKdkZOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NUlpnTkxWWWVYR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46xoKSlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqmoqb2rtK+tnqmjoK6cmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZqTkIqCj4V9j4KAiJ6Ph4B+jIeSj5CFgZSblIaToo2UkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsZmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqqOdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6sppefm6GinJ+amaKqopqZo6OVlpOeoZablqasi56RkJGMgouAf4+Be5qUjIl9f4yHkJCMioaSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6yZn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6sbLAtru+uKm5uL2qpLWnqKqwrbmwqZm5vKOtv7S0oa63taamp7CzoJ+lpqihpJmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Qh32If4KOfHyhjIyIeYSNhYqNjYWJk5qOiZWfiZGVg4yXjZF9hHtzcHxxc3RgeXhqb3FxcGt/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7K9w7mpu7q4p6i2qKersKyzsKaYvLajqrq1rp+xuK+ppaevspuhpKCko6GWm6+moZ+jqK+hoKKTo6SitrChprGrn6yjr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6hH6EinqPl4qNh3qCiISJjY+FjpOYjI6WmYqPl36Gl4yPeoB6cHF2bm90X3h3ZW1sbGtqhG9mcmlrZmleZHSBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Gzubi6uLqvrsCztLmvv8G4rL26taais6qnqbKrrbGgmsC1pKa0taiesrypqKWpr6yZo6ecpKWUmKGypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY+GeYR7hIZ9nY2Jiod6gYSHiYmShZaTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqSnm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBt7Cusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Aq6ikr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GhmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfYCFiIeGkYSXlZCOkJGRkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwbKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqrpyiwKCxpK6wrreutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6qK6ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTko+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9urGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7W1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vb2tp7ewpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKanmKu6laalr7O3ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqepvsOvsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqhopqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKnsMK9srXAtbe+wquns62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2bmqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3q7O9vrC2xLK3usGnqbCrrqipsK6jsLqvpKSusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrOzoqucoq2toJ2Zl6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qautra6mrbGpoa+8qqGntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqZqdlZigpaebn52in5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurK0prGwo7Cypp+utqiap7mto6+xoLO0sKCknp+nqbCptKmknJ2eq5eYl5WXlZWgqZyZlqetsKijno+toqaVnpecoaWhmaKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m5sqS0tKGxsaKfrLCkl6a5raSxsJy0uKqgpp2hqaSyqKyppJqcmqielZSXmJKSoqeflpKlqrCmopaTrZ+kkZSgm6Smn5WbpqahmqKfrZqgnp2QlZuhnpymlZ2WmaKflZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52VoLmwl7TBraizqKmyurezuL+5t7G0u7Skt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWkoZOSm5iRlKKlmpKPpq2vpqCVmamfoY2RopmopaCUmaWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV5xc15KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmpq/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0n7CknqWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56Zk5een4+Ni6iwr6adlpuopp6LkqSXqKunlJapp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo+rnI+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY1xfb3piVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpyeu6GcssCurqurp7epuK+1wLW7r664tqrBtqmpoJumpKKdkaqpp7WjsqevqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmZScrKmVi5OlmaWtopCWqrKjn56mq7CYoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYWx3bllbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueoryhl7HDsK2qq6yxp7ivtsSxubGtuq+uwLGrpKKeo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enk5CWpJykrJ6QoKirn5ufqKOznqOljqeilKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZFlTZmBjXmNRZ2ZwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqabpaqblqmlpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXmZgS1pXZ2NfT1ttdWlyUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqu0o76xsqagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOamqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHWJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11wZ0xYWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVl5KYk6ChlaOel6COlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZieo5aak5GejX+OZqGzr4WKhHZ7kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3VkeWZgaWVjZGZrWWx7b2lqXFJMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp+doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5eWnJGkmJeonZqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoR8aoZZXmt0ZF1ziWlrfHFrY15RTVdKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2xvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjj6Kvpra5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWgnZqSpZeeqpiefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eRg46BdnqBgHlxen+HcXiFjZN5bniUY2ZfeWRgZYJjXnRnbGRiV0tVSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKCWlqWVoaKXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Srg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i3YYOtWaLNbpB1e9p7f5lwfoiSdn5le4h2dmt8iG99hZGRfm2DkGBybHBoYF95ZFxxaGpjZl9RVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrprKsrKukq6awqqCnm5mll5yir5+gnqino6ahn7Csmp2Vpq2ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+VoJ+dna6wp6upnKeopKKrk6yzl6Wiqqqdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaufoqWgqKiin52wrJeal6imrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqeno5ysmqKsoaSfr6Kcm5Oqo7Wwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlaKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG5bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqKm1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtMKxs6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7Okk5enopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KMdntzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpp7KgmamklKK1oqKVl6GotLmjm6KdopOPobGYnpunpaGir66dpKiitrDDsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2Ujnl9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqLO0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLaqwrCpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6KwsrmrtKaaqLGjp5d6qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI58e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomaj66xrKaeppqrlpeOrKGhnaWhmqScrZigqKa2qL+vpamkn4uAjZuan6aekpSampSamqalpZuqrKykpZ+qqL6klsOsqqKhq7K5qq6mn7OuqKmYdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHqPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoaaYrZGYjqiaoZ6kn5mjo6WZn6Oqsqi7r6SonpyOfYublqGgmY+RmpuSmpipoKKaqa6opqajpam7nqDGpqSooau0tayupp67rKyslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKCjm6iel4qjkqaep5yaoaiimZ6hrK2ouK2oo5uXknuHmZKmm5OOkZiYj5iTqZuhmaqpoaqnoaOqu56oxKKgrqOqs7Sqr6ifuqeurppzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlphyaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epqqgnaOinpCKpJKnmaiZlqOqoJacpqanr7qrrJqbkpJ7hJaNpZiNkZGYlI2XlaiVn5iqpJuxpp6iq7mfr8CnpLKlrLCxqq2rpreirbeWiqCopbadiZajmYepmpCUnZKpspmao6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmZeWjouTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjXJpkHdxi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpLS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5uolaykn5imnZ2RlKOXqJqomZSmoaOQmqeZobW7qKuYmY+Ne4GUjKGUipWRlZCQk5elkJ+bqqCctqOep6u3p67BrqO2pq+vsKypqbK4oK68mZGlpKa2opKep5+NqZ+Nkp+jrK+aoKOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmYh7cpZzeot/cnx/am9kXnBqYVtfWG1jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOvsqyuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco5CunqKVp56gkZaYm66LqZaPqJmojJipj5+5tqSlmJqMiHmClIybk4qVkpSQjZKXoo2en6men7ijgISvtaKvr3WkvaOyn3d5oKqxupR1rKSeiYCqf2RcYnagjqSehJd9bpOznKOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lJBoaI+Pc3ummppme5qHg3iYaoSLg295gGtxZV92cGxraFtmZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mJm56Mq5milKagnI2WkZ6Eda2OiKaaqZGXpIiburOnoJmXiol1d5ONlpOKlJGQlIyQk6CPm6GnmZyyloCMm7Wds4ySj7unoH6nonqirraAjo6mnoOLhpCxqq+MipajmnmAi6yGnJ2hp6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWJ5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+TioSEmWuOjoVseHtxcWdkeG9qbGpaZWtqZXRcX0lUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpiXh6qboJSen5GNk4mGf5CnjIainaSUmJ6Gnrmwp52bk46FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgq+sgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWSho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6OchJqAjY6GiplxjpOFaHd0fHdoaHVxaGhrXWNwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkIaqmJmamaCEj4x3mpuOno+HnqSclpqYhqK4rKSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbFtui3xmWmCDf2JXUG93Zm10cmtqb11qcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWjqJKhoJ+mm5qOmbSZkIufjJWLdYGUkoyKppWTl52dfpKFhaujh5qPipipmZqbkYelsKahlZqIiYBpboiIi4+OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZiylXF8l5+zdHNbnrKDamJvdHZxaW9YamxycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7KurZOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GPkZOdmH2QiY2ooIeYjoqRo5Scm4yLqKilno+Xh4R+a3uHfn2PjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeZXKh+eLtqfalbjoRds2dcbnJ6eGtpXHBqeHljYGZYYkJRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56xqaydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJCTmI96ioSVo5yKlI+Gi56SnZ2JjqijoJqMkYqAgGmAhnh/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbXJ9lG+ZcmqjXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl9XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRTXqCms7mzs6maooycq5ycqZShrKWiqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yQkZaIcn+IkqCbc5GQgYiZlaGbhY2onJqVi4uKfINshIVxgaGMeIaNiIeTmZZ8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm294epdrm3t3l3NuqaRnYWV5cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3j4yOiG9+hY+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneAk4eImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGeYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVkxZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg4x/l6B5dY2Hi4Bng4WRg4yFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZaIiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJibc3SIfI96Y4GGlImJlZmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjomYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhH6Yk3R0hXKSg2x/i5GHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlmVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZmxxdW5aW2JsZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYVlaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gYx2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOLm6CQgqehh3iOmImVi4ucl4SDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3cHd0gV1eb4Zobl5eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR3anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2Gn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYaCkpqZmJCapqClnZ2Qln+PiXV8h46EpXt8jpCRhpiqop6TnY+Nqo2RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSooqLhZqEhIxzf4h8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWhfen9ofXt2dXZ1e3dcX3B9bnRfY1tdXlFnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J0bWxVY3F5ZXB6e3Nlam1si4met5qho5+SkZaYi5qfn557eJ6nkZuKhqSTi5iZeXqNhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImAh418foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx9qJGIkJKYlJaTeIyjn6Cdlpl/gJCamJKMmqOhpJqXkZp9jIR4gIOOhqB/foyMj3yYpKKik5mQj6aMjoCakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIuClaWTi4WQe4aGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoJtc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6Xf4yiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgYmMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh4yJg6aVhZOLl5iTkneRnaCgl5OWeX6OmJeOlpqdpJ2YkpSaeI6EgneElo2dfoGJjYxyl6OfopOZjo+hi4qClpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3aIhIKCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R2fXF8YmNhc251cm1hWmFeW2xlUmNYYWFpbHZ5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaIc3RuZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqWnIuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipOhkoORkJWYkYuBj5ifmpKPkHN/jZKUiZ2dnqaYmI2VlXKMjYlrhZePmXqHiJCJb5eem6STlYqNnouGgZKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW1vXFxfXl5rXlBdWGNiaW10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6inh4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9npOQlpSId357in17gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Ym42GkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBth5iDZoWYjpN6iISQinCVmpSjkpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4CAh3tkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFd35xcIGGhGRpeXR1cHxiX3Bha3RecGp7eXlsc3BleF1ubHNtcllaX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6CMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiVhZiHaYOigmaFnYqQfouDi4F3k5iSn5GQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHSBh4J4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYKLf3d5bmyBhIJec3RycHB5Wl5wYHBqXm9qfHtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThouajJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J3f3dzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4iehI+KfHKLhYmOiJyan5uWlH+TfWeEm4ZnhaCHkYORgolxg5GYkJuOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB3gox8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi312cGpsgoN6YXhwbmxydFZeb2JyYF9sbnlxaHBmZ3N0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eVkpmckZl7lHOFkJ+hk5OSipKblIZ+lpaJjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN5jHVmiJGGbIiihJGIl4KFY4yRmY+VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+foWNenpocmpzio+JgoWEfJSKa31+bn+LfouGfIR5gY6UmpqKfHZ4g5B4cmxncYCFbmt1b2hqdG1SXm9kcFlfa3F3Z2trYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uvm6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlouQnZaDgZWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6PdYl1bYWIin2KooOQiZyEhV6Lk5iMj4mOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gH+Ei354ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH+CeX+PlZOYkHVzd4iNdXNwZ3Z6hGN1bnBiaXZnUWBxZ2xVX250eWFyZF9ofXByblpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapmQkJ6WlIGJcYWJoI6Fi5aLjJiUfI6TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWGfm+EgYmGmKGCk4ueg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzdmtajHySg4V8f4OAg4mCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kJKQlohucXmMhnVscGtzeYJgdWpuXWt2X1FkcWlmU2BwdnRgcGBdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqHc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGZooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBpYGZhf9W2jpCmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjYGBio17j419iIR6dHqDe3GHgZaajpOUgYh0goV1gn+KkpydhZSOn36IYX+TiIWJhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0dnVqYo2Bj3+EfXyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KEbm95jH51bW9rbHt+ZGlsalludlpSaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXR4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qemp+GiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWNnZ1edj15xc5a8xIR2cZSJkH5zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1h4KelYaVj4KCcX6HdIN7iZecloaTjZyAiGV9koOAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3Zya2qNhYqBiX54goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqEg3iDe4CXjI+MfW5seol9d3RvaWh9d2VecmNYcHNTVG5zaWJOZ3R4ZmBeXVhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfl5+ZhYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFkZI6xsndKYlqk2dCXcnuRi5F4f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYaEppGEk42Dfm19gnaCeIWamJOLko+UhYdvepKEfoODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BzgGh4cG50mI2Fgol6dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aNg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfnJhWnhaWXJtTlhyc2ZgSm12dGFeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3lgcHZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt0ZnmDg6iMg4+Mg31tf3R1g3mFmo+Lj5GSjIuGfnuSh3mAhI2DbIBzaX9+eG18e4GKg3hieYSBcWRxaX5tdHF0gZuLgH+EfXN1foBzgG9ba310eImCinuGf3yIeHpxbIiCjoKJcYF4f5WKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl5YHN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn52foB8i5eGgZOQl4iLhIl8j4lyfH2FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l8dH5tV21+dnOKgYZ3h3WBiXp3c26JgI5/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeEf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdGBzb1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5COgneVjZSPh4KIeomJbXl5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3R9YVV1fHJziYOCfIJwhop3eHBwg4KLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW1fc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh1bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdX+PioNzlYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGFieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsf1lWcn1vdIOGf394a4iGc3hrdX+Dgnx5fHd7coqAfHNndGVti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgYmxkY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dxYHFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB5bXxdWHB9bXN/inyBbm6Jf3B2Z3d+gH5/dXtxenOGe3lxZXJhboyCbHNYa194XUlvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGppZWJZbmFYY3BHQWhdYGZeXVZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3aHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBcmFrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFsf4GPhnKUh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGh1fnd8fXF7a3l7gXl3cGVsYW2Jfm1uVmtgeFZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFvZ2ZhV2ldXGxpSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxmV11bXFtUZHBlX1hjcnVpdm9kZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bHp6j4R2l3uHhoKGg311cHJtZ3VdbWlfbXVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgW6Lam16gXFlcmVgbHlncnaJen1hdYN2aWtxdXpweXdyfGZ9fn54dm5jZWFthnxta1ZqYnFUTGprUExOcEhee2VhTVV0ZEtOU1dhand+ZV1ncmhlX1ZjV2JwXUtLa1hjYVRTVHNWTFl2ZVpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeICAeIB+hYR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amltaGBiV19aaYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnppa3pqX2VuaIF3kIRnZVhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbHt8a2tVaWJnVEttaVBHUmxFYXhlYU1Ucl1LTVVZZGt3emVfbXBpZFxWX1VvblZJU2hYZl5XTFRrVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXaAgXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paW1ViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6aGp4Zl1kcmd6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXl1cWRhZGxyfWpsVGleXlVMdGNRR1diR2N2ZWBLVHBYSk1YWGdrdnpkZW1wZmNaWF1YdmZTSVxjWGhYWEhWZFBIYnlbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4mLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVpdWVbZ3RmdnaRel9dU2VmaoKBc31hY2lcVVheYmSQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8cnFiXmVtbn1laVRoWVpVTnlgUktaWUhjdGNgSVRtVEpNWlZpbHJ7Y2xsc2NhWVpbYXdcU0pjXVhpU1ZHWGBOR2p2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcVlNkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5B0a2p5bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW97a2tzfXJwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFJJUFpVa2trfGVtb3FhW1pYWWxwV1JPZldWaFNURllcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uEfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SKc2pneW5lcnVxemt5dHVuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5ke2RrdXxycnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWGVTU0hZWlBOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35thIB+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXhib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpgS1htZF94aG59ZGBVXlRddFtUUl9mTlxhVFNKW1lRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5KPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoeIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIyHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjYeFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yPjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSkpSPjpSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk3yGlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPfo+SkZOIc4yTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJB0dpCRkHh0ipGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkXxofZGJdXaJkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6QgGJqin5sdIiPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53XmpmaWNsio6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLhmRvbVtpcmuBhoOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvY3FvYWpzcWVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGNla25zcHJ1bGNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGBiY21vcHBtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01PX2hmbG5tZ2VRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFZkbWZqbW1qZ1xTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHR09VYGhuaGxsa2pqaGRfVk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVNeYmZoam1sc3BqaWpsa2pmWEpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4/P01ZXmptbG55c2pqbGZcUkxFRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o+R1lqb3dwa2lZR0RBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0RYbWxfSEE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzdTYz03ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8RVw9PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj09QTxKYTw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndNNzg4Ojs+P1dpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5GanVNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUpzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZGR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1JTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fX1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pJQEZBQUBGSEVKT0hRUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9BQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRU1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVETE1SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZGRENJSUhLSkdLUk1CTk9NUU9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2ppaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dXZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpgXVVYXlxeXVxdYWFeW2JiY2dmZWRiWF9hYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVlRXXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWJiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8eXx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzdHNzcXB1d29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3Jzc3Jxb5CDbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF2jHVycm99oHtucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXKdlXFxcZWie29wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb4+viW95oqJ6b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwiLKmdoqspHtwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNs6ikprGodnFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdqGho7Smm6R8c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCp5+cp5+jo5J6eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIuhjo+YmpmblXt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1/iKeno52gmpOYgX9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYCNsqepoqChq6aEfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIB/iqmun6mjoKGlqaSMfnx+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+BiJWqr6ScpKGgoaGhqaugjYGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoODhoybpqOdnJqfk5ihoJ6dnqGglIWBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChIyUlpeXmZiHkJ2bm5yYkYuHg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgoOEjJaZlYmSmZySi4eFhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBhI+XlJaZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4SRloiEhYODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYeRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJKAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+Ti5CBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX58fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+BgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKCgYCCgIKBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fnx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY6Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY6Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15d3R0gICCgoKCgoOFg4SDgoOEhISEhISBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHp9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSEgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWFgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX19bU09PT09PT1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLe909PT09PT09PT09PT09Pb4uLi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6Oiq9PS0tLS0tLS0tLS0tPR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tPT0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Mmqqpqampqampqampqaiw0tLS0tLS0tLS0tLT0tLg6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0tTU1NXV1dXW1tbW1tbX2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/Pz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0NChlsvSx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/KnJaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzv5ugqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZssyjoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZmMfJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmzyJyVlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWat7Gar7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbexnpuinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qyyZ2ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9evjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD01NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Njc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLQDs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT5IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUE/Sk8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QUNDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODY3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a3tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3trW1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDQ3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKinqKilpqioqKeop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qopaanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenp6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uanKKgmpaVlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSnaCXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanp6ainp2foaCXmKiilJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmpqalo6CgoaGfmqB0j5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaWspqSlpKOioaGdm6aCYZSZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKktrWlo6SioaGem5yjXWaamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgpqWTsaKhoJ6cm5qnhVVunJmanJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCteoytn56dmpqcpmddcZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCfqY1pnKednJqan5dqZ3Kdm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaSWdH2pnJqbnKKLa2lwm52dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qglnt3kZ2anJ6cfWppcpuenJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmaoKB6ioWQmZ2ekoBrZnOan5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmpugl6B9cpmlm3iOhmlym5+dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZmcq5+KcWCnqZ1heol5dJ6enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn62NcGBpopCTVF95e4WgnqCgn56dn6Ggnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6endEVGbpeAe1A+W3aEnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5apmkxERnCVgnFSRzhgeI6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCVrHVdeF+Dtq+lYnZ+S2p+iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/kqhgjrOMzsOswKWAlXpSeoKBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foqXctDWydetn7qzY2RwWm6Bho2Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2Rf5DNtcLOyL+slHyqrF9oiYyOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLiJKLmHWYoo20qp2eh4JwaM2AYIuLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoZ2KkHqGo4yEiXd0bXaji2aGj4yYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nmX5bZoZ4eH9tamh1dn13hKOhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWqqKeqrIdxVlt0cXJ5aWViaWlwfIujqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmZ6lpaKisJ5xa1JSdnd0e2hhZWZeX298i6CkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqiwsqyAaGZLTnB1d4BpYGJpWl1ia3WDkZ2hoJ2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mttry+vayNbmhjRlVub3x8bmBeZlpaYWJncHh/jpqgoaKYlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7zGy83Gt6aPc2hqXEJOcG50bnNnYmFZWF9jYWJqcXV6jqGonJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKu0wNTd28u5q5uHcGBgYlVGRXVuYF9tbVxbV1pZXVtbXmJkZWh4kqevpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS0t8XS2dbJrpF4Zl1aW1xUTEFraoyYj1lUWFdcXF1dWFVYYHKJobLFw7SyoKeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHHzdDEoH5pXVlYV1NJVGyns6hOVV5hYl9fX2Z6lq+/vr7AwrK1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsC8uczJuZdzXFVYVFFSnLOfTllcXl1gbY6qu8GytqemsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZO/vMvQv5hqWFdZTJK3lk1VWVhgf6a8sKarrrOnqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAuLO8wcW/qXdXVVGKvY9NU1Zbg6Cmt6+lrbS0ra+lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e7jWNRYX9lUFNgjaqfprSyray4tbOrqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGys7CjVJJUFFmp7q3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnM09OWTU1cqsfAyM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsfKzX9Jj83Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcHAwMemTaTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24u8DEsFOezcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3tri7vbm5tbrDyKtUl8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7q0t7O7xcqgVY7Jv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncGtzZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K92hL7Iz8LAuK61tbu+t7qyvsLIlluIzcLCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRud2NnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tb/AwIdofc3Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLm9u7GBem3Ax8TAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bw762vsC+vrqmnKqzt8TApnx6fJ/ExsvIwcPAwMnKwcC8urKlloh5s8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZur869trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGupquWlKLKw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oz0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoK0vba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uupa2yoaWHwcXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZmxvq6zeLDJxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2PrMS0tHenysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iJBuTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/GfpO6q6Joq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vZSntK+nd62wqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxT0lJTGmdgFpFVbC6sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGdEU5x+UFhJS2FKV45iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJuZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTg7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXWZcFBtSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmaGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotXU0pmpFlmfW9yW1JrZFxnYmBtkbWwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVqcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojs5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkQ7Qz5GPD45Nk5+qrKno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIyMrEzMzMzs/Fx8i2v8rA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUy9DU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOztDL0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9xb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJy8vPy87N0M7TzMbJz83Ix8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxfenyhkYuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHaDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2hwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlma25ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubayvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVlbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmJOKnpGNkpOWkJiYk5yho52koaKVoKKlppujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZyjlZugo6GXoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWV9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mfnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiZlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io16kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdampxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhCPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSAjZyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcYB8aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh5eW9na3h+e350bGVeW1teal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSUlLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZGBbZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnpuOkpWYo6KmtrCdkZmoh5aPjYGIbHNzfYB9cmlgXWJgYmhkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKJlXp6fYV/aGFoXGVjXmRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKebtqiMpI6Rkp+GeIKDdlpiZVdmYmJkYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wsKsmbqok62Pl5eqiX2CfWtXZGJZa2VqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lLSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIsJ65qaGrjqSntoiBgXNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36DgIN4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttX2FdWV5hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNwZV5eXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfY11XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4fJ21jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiPg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGfJuIlI+uqpSVmJ+Zp661vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlXt9amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlve3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY+KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WMgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPgIOIhaSGjJCzmJ2SlJehoZ6ZkpydqLK5rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXlhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29teIt4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iJCliY2TqZqXk5aZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyZn4qQkJyamZOYmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlBGRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdXRkXlxhXE9LQkxARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5KZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXlpdbFROSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZugoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Kuvrm2n6OnqKWnnJysqamNZWhjYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsPIycXCzsjBvbmyr7m0wMLKtsaxwLy1uquorayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucopqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEvs3Gu765srC4s7/DyLW/r7y3ubenpKqrrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqaydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpJS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr7KyLa4tbSws7S3wca2vrC4tLq2oKetqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZVtkYExJS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xMq9sLC2rrC1r7/FtbmwsLq2rZqpsKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSU1LU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZion5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBxsG6qralrbutwcO3t6qtsryjla2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnoKSbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC4xb3BuK+2p6u3sry/vrWprrK4n5esraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2VoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6emo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZ11GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6Wmp6qcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWppK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop5+nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiZKdkZOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqZqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIaTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZDWHttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpLaysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQl15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O3r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WdnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiZGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i2qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpuanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Bq6ilr7KprLW7nqmpq7GlmJ6pnaekkZimraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGZnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlZCOkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwLKurq62rrK4s6irubGvrrO2urawuL2tpp61q6CgsKSqrpyiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqJ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+puMK4vbytp7awpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKammKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqgoZqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYm6OplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xmp6crquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ2mp5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqipsK6jsLqvo6SusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZaamqyllpuhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmgpaSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZaQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKikm52eq5eYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKnm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJmbmqielZSYmZKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5iSlKKlmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknqWnp56TqrCpr6q1rKqvoZihoKalpLqio6uglpuRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmpoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm14b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxurGuuq+uwLGrpKKeo6Kcm5CppKqypLWmraWflpmqmaasuJyirpiUoJCln5KMnKOel52bkZWSr7myrJWXo6enk5CWpJykrJ6RoKirn5ufqKOznqOljqehlKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52rpL2moKqXlJyQoZqRj6KooZOdmJOXlLK1t62YnaOjooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fWJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuws6u0o76xsqagoqido5uZmaymr6Sktamlm5eVoZqmrai9p6imlZOblZ+ZkpekqaiQnZGPmJywsr+sm6edpqGIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11waE1YWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlZ+WramlwJ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnKqekJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZiepJaak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3RkeWZgaWVjZGZrWWx7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbCmrb6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlrfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjkKKvpra5pa6jjo6aoZmTkpqgmZmllXulraKos8S4pKKnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopOmrau3s6euopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF5lJabX66PXo6ngaKgfaeWnHSrg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6Whn7Csmp2Vp66tsauorKCUkpufpJKPnqWYnaejnq6kq7CpwMezqKmxrpaSnZuhl5+pqp+UoJ+dna6wp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52wrJealqinr6yopqmel5Sao6GRk6Ctm52mo6+so6y1qrrOsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kcm5OqpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosq23ybK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZuflI+lrJGZm6ejoKmmrqGkp6qwtcKys6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKK1oqKVl6Kptbmjm6KcoZKPobGYnpunpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46kraOdkJqaqrS0pJ2km6eRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6Kwsrmrs6aaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXl1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRYWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmZlgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuYmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6XkZ6Eda6PiKaaqZGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWlFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaSUmJ6Gn7qyp56bko6FcHWQiZSQipSQj5uMkJKfkpehpZaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWiqJKhoJ+mm5qOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmZqbkoimsaeilpqIiYBpboiIi46OiouNkoyQkqKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARF9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7GtrJOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GQkpSdl32QiY2ooYeYjoqRo5Scm42LqailnpCXh4V+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56wqKydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGcc5GQgYiZlaGbhY6pnJqVi4uLfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJmFmamgoaSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneBkoaImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2lJVk1ZVFZdaGtuVmdXTUpCSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaW1loZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6dpmXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlbYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dG90Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaenoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRrammAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXqqhI2SmJaPnJaHhpumn6KanYaCkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqEhIxzf4h8fXJye4eDe3iKjoOSpo+Fg46BhIqJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbGxka2pogYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enJlam1si4met5qho5+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4aHh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaChmJOWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNYYGFoa3Z5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5igmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6GMlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAd3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqSfIqAgm51cGxtb3B7hWlzg46YinF3gHSCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h5b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHOLhYmOiJyan5qWlH+TfmiFnIdnhaCHkYSRgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6MjYR7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHh6jX6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgoWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4WgkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6Pdop2boWIin2KooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEc4eCk5uXlJeGjHWHf3CEgYmGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBio17j419iIR6dHuDe3GGgJaajpOUgYh1g4V1g3+KkpydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpSanJpYlFicndsYmVeWmqDbXNiW2dfZGxgblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXV4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5zaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmSjYZvbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYWDpZGEk42Df29+gnaCeIWamJOLko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aOg4Nyg3iAmYyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViHyDeG52h4WDl3duiIRsdXt0ZnmCg6iMg4+Mg31uf3R1g3mFm5CLj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hieYSBcWRxaH5tdHF0gZuLgH+FfnN1foBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaUxXZlE9XmZdXXZmX3RwW1hUb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6fnJndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn51foB8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOKgYZ3h3WBiXl4cm2IgI+AhHJ+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhXUnRhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJziYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVVlR3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdYCQi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp3dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGf394a4iGc3hqdH+Dg316fHd7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3cGdefIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inyBbm6Jf3B2Z3Z+gH6BdXtxenOGe3lxZXJhboyCbHNYa194XElvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piXn54eYqEZnF9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2x5d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnJ7a3l7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFpTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1aHCAeIJ1YXeFi3yUgW6Lam16gXFlc2VgbHlncnaJen1hdYN2aWtxdHpweXhyfGV+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEhee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTVh1ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeH+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19baYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHVig3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXhmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1Vvb1dKU2hYZl5YTVVsVEtbeV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnhaXmBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXdcU0tjXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5veXl6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0lydFhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVxemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RQSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHZaXmVsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnV1XF5lbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FERERERTkvMDAwMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlZWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OTkpKRkpSIjJSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZCSkZKTkHeMk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQd4mSkZOAdY6SkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJJ5bo2SjnR2jJGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkX9neJKHdXeLkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6PgmFphnpodIqPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53YGtiZ2Rui42NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2RvbltqcmyBhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndwY3BwZGtycWRoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGRlaW1zcHJ1a2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWBhY2xub29rWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QXmlmbG5rZ2NRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFVkbWZqbWtpZlxTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHSU9VYGhuaGtsa2lqaGRfV09OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRFJdYmZoam5sc29qaWpsa2llVUpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PktWXGltbG55c2pqbGZbUUpEREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o9Rllrbndwa2lZR0RCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0Zbbm1gSUE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzhWZD84ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E8RFs9PT07Oz0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxJYDw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTUZGdndNNzg4Ojs+PlVnQDs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRLOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2KChIODg4B9XT5AQ0BBPUlzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg399hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKi4FHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1JTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlBRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUVFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk1MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo4ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJEREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QEBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFSEtGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEdKTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDREVJR0tKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpHSkhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExNTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRUVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLTElMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VDRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJR0ZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVtSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXmJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVddVlRQWVJXV1dXWF9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVtVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZW1dVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXl9eW2BcYFVcXWlqcn1zbGdcVVhXUE9SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFpYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl9cW11YW2BhXmBkY2RlZWZiWWNlZWlnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZnamdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cW15eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmhqZ2NhYlxkZ2BcaWliaGlmZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX15bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGlnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJiYuMjIyMjI2If39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyMj5CQkJCQkIx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV0dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHt8e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3Nzcm9+e29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3VycnJwc5h7b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0lXxwcm+IoHZwcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCUoXVwc52gdnBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxb4mxkW5+pKB2cHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwg7OpfJCvo3dwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNsaerqK+kdHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdZ+iorOlm6N6c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiApZ6apZ+ko496eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fYqikJCXmpeZknt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+hqappJ6gm5WVf39/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCKsaipoqGhq6OCfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gICAiqeun6ijoKGlqaSMf3x+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CBiJaqrqSbpKGgoaGhqaqfjoGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoyapqOdnJqglJmhoJ6dnqGfkoSBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4qSlZiXmZiIkJ2bm5yYkImFg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYKDjJaZlYmRmZySi4eFhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOCgoGBhJCXk5aZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4WRl4mEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZOAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+Nl4KCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJObhYKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSSkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fHyLnI2AgoGBgoKFlJSLgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjI+BgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhoaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHiImIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4ODg4WJiomHhYeFhIWFgoCBhISCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFhoiIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4OFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn5/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fH17enl5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2Pjo2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+AgH9/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJi4mFiJKPjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enp5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4CAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKBgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fn5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgYCAgH1+fn+AfXx+fICAgYCAgICAfIB/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICBgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+AgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4WEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYaGhYWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4WGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOCfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgn1+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqbO09LS0tLS0tLS0tLS2ZE7REREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKSnzdPS0tLS0tLS0dHR0tmUQEhJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM7T0tLS0tLS0tLR0tLZmU1UVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLV1dXV1dXV1dXU1NTV1dDLy8rKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6znqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWroZqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ai5uhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5nIedlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqKPnIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6SlrJuoiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izLa1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nAo5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqKOrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKjJkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKinqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGempubnZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpWXlpqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJaeopKYmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpKWop6ainp2foZ+eqZ+QlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaSlpqalo6CgoaGep3mOj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSrsKOkpKOioaGcopZhkZWZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjqrCroqOioaGemqZzX5eamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoa2SqKWhoJ6cm52fXWSam5manJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCol4Gsn56dmpikiFhmmZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCgo6Rvm6SdnJqapXliZpicm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enp6neYekm5qcnaB4a2aTnZydnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5ucon6AnJmbm52VdWpnj5+dnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmamqp/fYmTnJybiHFoaI6fnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmZiif4aCgpmenIFwYmiOn56dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmXoJubfHqbo5uAh2tlkJ+enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZm6mciGduraqMaIOBbJSfnqCgnp6dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6CmiHRfZZ6Wgldye3qbnJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5WinnRSTW+VhHhJWXB3kZSRjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGPp5VTOUB0iXFnRTpVb4GHhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAiqh5TmhUdIt3ZU9VQ193foCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKgX3WMYn+nnohdhntRa399hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2MlmO51I+9uqm3h3R8aVl/hoqOi42QmZyUlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLh5KJlYKBz8Sc1a2asJ5fgnFUepGJiZCPjY+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZujoZxuj7qkuNGxqK6TbLOnVXSUj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqbCjdI2VfrG8s6uVh12WxGxvnKKhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6iqr5KLdnunl46Pf3pqbZF6b5ajqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOhoauUfFtpkX57gHJva3Nxe3uUnaKioKGfoaGooJyeoaWhoKajop6koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmraenoqynfWxTW3dvcXZrZ2RqZm54gY+eoKGgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaioZ+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mutLe2ubauj2pjT1Zua2tzaGJkYltgZm92gI2bo6WhoaKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqptMLGxsjHv7OmknViYEpPb3FtdGdgZ2dYXVtgZ2xvdX6Jk5ykn6GhmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuywNjh3tXGt6qdkXxnYl9GUmpucXhoYGJpWVteW1xdYWJhYGZ8ob29qKSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1tr/J1dbHrZiOgnVlYGNcQVFsaHV2bWJjZFpZWltYWVtZV2eNtcC/tq6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHI0M2tgGZdWVdcVUJKcWhtZ3JnYV9YW1dZV1RTYo68wri3u7C1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxcHBwL2OZlZVV1JIRHRrYmBvZ1lbWV1bXlhjjLrFvqWlsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZTHyraFXlZUT0diaICLjFZVXWBhXWKDscG5rrKnq6ioqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAtrXJz6NrVVVRU1+YqaVRVlteXmaVwLemq7O1ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7dm5raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPKun1VVFRMj62eTVRXV2iWu7Sxray4tbKsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8XHw8fCi1hRS4awk0lPVWigwb2/uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxMPFx8mndE16sopHTnitzM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMDGy8OTZH1kS4PJycvQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcDAxJNQSXPJzsTI0MGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4u7/FeUmgzcS/v8m/sMG/ure7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEypdNpcjAv7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7mztbK7xcqfUKTJv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJuYFxUSEtLREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K52hL7Iz8LAuK61tbu9t7mxvsPHmFGizsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRud2NnYlxjUUtVSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3ex0dHMysS1ur/EyL6+tL/Aw41Vls/Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V3qMzMy83KxsLDy87BvLi9uruBXYvMxsTAwL/EwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApnt5fJ/ExsvIwcPAwMnKwb+7urKuemx6x8bFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtr869trnAvKp9bmhubXSCl5l1en+cvr/GwLnAvL7FxL29uLGxoIZ7cbzIw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdYK0vbW1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7utrqKfioOvxcPDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR3i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+sq2wqZeUlcfHw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2hsbCko3q/yMK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FjLW/rq1urL64tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vp6wta6vfqywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/U3lxT0lJTGidf1pFVbC6sayzr66srba2srS1rqmlnZmanJ6nqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGZEU5x+UFhJS2FJV41iZWWDr7WqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp5OQXaZbk9tSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWU0pmo1lmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2N3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrKno6OioJ6lq6Wel5yUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzTx76/wMK+x8bCt8PKycPBxr66tbq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjFwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoWepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NHXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysHHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpCLgHpydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIx8rEzMzMzs/Fx8i2v8rA0s3Mz8bKyL/Ew8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czQztTX1tPV0M/S09HJ09HI0NjX2NHX0dfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUy9DU1dbO0tDY2NfYy8jOxMnPzMrMwMrAyMrOztDL0M7OzM/PyMzQ0MvOysPKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZW5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJz83Ix8vFx8HGyszNz9HH0M/NzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8vOwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxbzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxeenyhkYuSloZ6gIWFf3V4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NbXzcrOxcnFx8G5xb2rrqVfZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrEz83Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhXV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrraSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubWyvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxsre6uruyvL6+vsS/tcHBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGoq6i5qqSnp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJagoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clqq6zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6utpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmZOKnpGNkpOWkJiYk5yho52koaKVoKKlpZujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8issbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmaWvqaCcmZuhnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZujlZugo6GYoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpaman62hlZalqKedmJCPmp6ul5moqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoKUfn50io16kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSKgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqinZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3t5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcX98aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLG6xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnqyhprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQamhvg4F0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilYmOl396goh6eW9na3h+e350bGVdWltdal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYmMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZF9bZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnZuOkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYB9cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK0opSkqoiZiZKJlXp6fYV/aGFoXGViXWRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgIuFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayys5iWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKabtqiMpI6Rkp+GeIKDdlpiZVdmYWFjYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkM7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wcGrmbqok62Pl5eqiX2CfWtXZGJZa2VqZVdcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIr565qaGrjqSotoiBgHNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4J4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTuMC4vbfGwLu5ysq6trm1uLmyt7W0rra2mGR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHtsXmFdWV5hWmNjUVtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaGxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3rIy1p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNvZF1dXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKKOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556b2ZeYl1XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3mEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMc29kYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdvZV5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHi5OboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLycnMy9DJw9LK1NfZ19jX1dvX09nb1dDb2tHWyNTLlXp8amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7ibfFpMHJuIKVm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWJiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8e2hqZmBUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hHt+gZGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/DoLyMnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+cmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXlta2ZXYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXJ5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KfkKOuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aWdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqdopKpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpGykWSkzceVjoaHiY+SjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWRfXl5PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqiZra+kl5WVlJCLmJmWoMCOo8m4q5qipa2ZkZqcsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrSeorillaykl6mtt6ako5+ZqZiqo6+wqZqZnJSVkZegl5m7u63JoGm2uKuwlJieoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYqMlpmSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL06JxfGpeW1VfUlBGRD49Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLi4uQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqJdXRjXVthW05LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZifl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXVlda1NNSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmW96Y1lXXFxMTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbizp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINub1tYVVZPRktTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC4s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLmmq6utsbGjobKytKRycGZdW09RTEVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOxwq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Ktvbm2n6OnqKWnnJysqamNZWdhX1JMTUdHTkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsLIycXCzsjBvbmyr7m0wMLKtsaxwLy0uquprayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLe1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUZITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkREnG9iR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/t8HDwMfEv83Gu765srC4s7/DyLW/r7y2ubemo6urrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpHS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xMO9wLa/wrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6atqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6yq6mioqWllZWdmYuPkZOkn4ljZVtkYExJSktORkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcKzwsS9xsS9xMq9sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6atsKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSUxKU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDEvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZeon5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBNTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3t6qtsryila2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepJyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnn6SbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFZXRFleXk1MUk5fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwMC4xb3BuK+2p6u3sry/vrWprrG3n5erraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2UoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6amo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaStsLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrLC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyeo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZl1GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipKKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhc4hpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWopK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiJGdkJOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5KeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIWTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZCV3ttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpbeysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSJkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQV15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O4r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WcnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiJGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLXFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i1qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpyanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdWlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gkn7arpaW0qaqunp3Bq6ilr7KprLW7nqmqq7GlmJ6pnaekkZimraKYnqSpoZuinJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGYnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlY+OkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7quwLKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqr5yiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqZ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+pt8K4vbytp7awpaukt7Oxs7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGkm6anmKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmsprO0rq6zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqho5qts5SjpaW1vKesp6uqrailoaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums6ysqaevs6mvtrSnp6a0pae4rpyzsraqpaSnsa6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqmpsK6jsLqvo6SusqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpqhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmhpqSPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5WWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q+RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKiknJ2eqpeYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mZeji4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOD1WUVpXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJqcmqielZSYmJKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezt7+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5mSlKKkmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknaWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11hcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmqoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm13b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxubGuuq+uwLGrpKKeo6Kcm5Cpo6qypLSmraWflpmqmaasuZ2jrpiUoJCloJKMnKOel52bkJWSr7mxrJWXo6enk5CWpJykrZ6RoKirn5ufqKOznqOljqeilKGanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueo+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qHjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHRCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqaa1qKefm5ago52spL6moaqXlJyQopuRj6KooZOdmJOXlLK1t62YnaSkooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Byalpem4phY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxmopocox9hZVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuwsqu0o76xsqagoqido5uZmaymr6Sltamlm5eVoZqmram+p6imlZOblaCakpekqaiQnZGPmJywsr+sm6edp6KIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11waE1YWmZqYFdab3lubWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqpq2jo7arn5mWlZ+WramlwZ6ro5WSnJeemJOUop+eoqeTkZmop7LEr5qrnKufkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2hzf3p1g4eCa3RkeWZgaWVjZGZrWWt7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWztZ6VlJ2ZmbCmrr6gq6KQkZ2amZORlaGcl6ichJ6qq6KzyLOfqqSrlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaJ3a2qLmKOemXNsbnqEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZefo52imZmmq5yto6WnqbKtnpWjkKKvpra5pa6jjo6aoZmSkpugmZmllXulraKos8S4pKGnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpumn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxi6KIgp99lZiIncC9gpadnY2dwsF7gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO5w7Swr8CpqJSjr6mwrq2msrSvqaWmprGrn6uYmqKfnJqqp6KdrKKlqKWktKSdopOmrau4s6evopGRmZ2lkpGgoZibn52Hp6ykq63AwLGhqa+pl5GenaGZoqOqo5OgoZ2dra6prKejo6ehpaWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF4lJabX66PXo6ngaKgfKeWm3SrgoCvXmONqnqnh4WgdJeTiLNjgquGoY2Ns2qEr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoeSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6WhnrCsm52Vp66tsaqorKCUkpufpZOPn6WYnaejnq6kq7CowMazqKmxrpaSnZuhl5+pqp+VoJ+cna2vp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnaOOo6OirK+2rqixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52vrJialqinr6yopqmel5Sao6KRlKGtm52mo6+so6y0qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kdm5OqpLWwr6Cpm52WlKajkJqiqKCgpZywpqSosa23yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX1+UqYOjiIegepiVmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZyglZClrJGZnKejoKmmrqGkp6mwtcKys6qtqJOJl52kmqGjrqaYoZWYnKWmq5uwna6opp+spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZGLn36alpaKdp6YiqSYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKO2oqKVl6Kptbmjm6KdopOQobGZnpynpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6KupaaYr6W8raG2t62dnbWyuLGzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5uVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tJ6Wp6SttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46krqOdkJqaqrS0pJ2knKiRlJeuoKCdp6Sdp5y1mqGqpLasw7Cpq6mhjISOnKGgpqKVmpqcmJuZpqSmmKyorqOlm62mvqyUvbCsn6Kws7mrtKaaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6eVmICsiIWuhZ+UqaChl4afgJmVgHuSfquAnZqWi6p4nZ+QiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6mklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+ZmIyIsFt9tFukg2vIomSfgHu8WHa0WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsna+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voNro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy5qJ6tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbW1linhvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1lcZ353pl9hcY6RbmVkgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2fopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTkoqPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmJuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqeKZZylnJGXmJaMkpyRhp2akJWDkoePjpKJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62kkpartrCyp5urpqyXdIydr5+oqqeTl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6WkZ6Eda6PiKaaqJGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6CmmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yxeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqeppZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaOTl56Gn7qyp56bko6FcHWQiZSQipSPj5uLkJKfkpegpJaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2UkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkU0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLGqq6ealKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSblZmYh6O5rqWanIyMfmJtj4uTkI2QjI2YjJGSn4+UoKGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8rK6imZigoqWsrqGdrrWiqJKhoJ+mm5mNmLSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmJmakoimsaeilpqIiYBpboiIi46OiouNkouQkqKMlJ6gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinaOjpq6cm7GtrJOYoZmhpJmalJ6rm4uIkniLhXGAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42LqailnpCXh4V+a3uHfn2PjYOLkJCJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRU83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKwrJ2mnJypn56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iI6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1FbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZSiq6ShqI+fnp2amZWYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfINshIVxgaGMeIWNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRgV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhSWU9TUWFmZWpSY3d5d0lGRWNdZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoKSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhniAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2hJVk1ZU1ZdaGtuVmdXTUtBSU1LSEpPQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSVlPXUhYaWlzallrVlFSRVZcTFhTYVVpa193dHp9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6caiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1JXm5udmBbcVlbYFpndGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xla2NVYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eYN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnJCCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIBYcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaXl1mdH56dG90Y2trant9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOifoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gYt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn6SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dU2hyVWNcXGFsaHV8fHNvcGRraml/fG55gHFqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npeioZiVmJmUmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYWDkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIVydGB/g4+GdYuYgYOPgoaFfoWDlG15dXSSoYqLhZqEhIxzf4l8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnRgY1tdXlFnblRkWl5ia2l2en5xbGxka2pngIBsc4FsbHRveW+FeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enNlam1si4met5qhpJ+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58fYaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4KakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5nd3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4WGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xa314hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKRpKWdjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeH2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaGhl5OWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpWZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHuAhXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc250cm1hWmFeW2xlUmNYYGFpa3Z5hnFjamNtZWh9g2xodWhsb2mAfIF5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5ifmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXlrdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogXx6d26QiHOBhIR9dIGGiXqDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ6KipGGip6LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnJOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIB6d3VvjoV0gYKDe3WCiIV3hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCdh5OddYGqlZOOh6GNlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjJ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h4b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVNaZmdjdW+EgmJda21kYmZrkm5gZmZfZ2uBdXFzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdygnqCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHKLhYmOiJyan5qWlH+TfmiFnIdnhaCHkoSRgolxg5GXj5uOj4yMj414e5KQeo6LjJGWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYN7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2g5+Dk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgYWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mei5uvm6CQgoV3iJV+fYqdh4WgkY+FjJiEko6HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoSihZJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boWIin2Ko4SRiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH5+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNf5qIhHtyd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaKmomOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWHf3CEgYmGmKGCk4yegolhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxkpGNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBiY17j419iIR6dHqCenCGgJaajpOUgYh1g4V1g3+KkpyehpWPn36IYX+Th4SIhImNgICDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpTaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgn1/h3V5iYGSlnyIhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmnyMmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8ioZ9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecl4aTjZyAiGV9koJ/hYOJiXKBfWd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5yaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp5j5ZvenNwbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmRjYZwbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXppeYWDpZGEk42Df29+gnaCeIWamJOKk4+UhYdvepKDfYODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4WIfYWIeohygG1wg4aOg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBen+Bf4J/doGFiZeKcYKNcXuGfHp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2MaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSXjX+Tjo1/bmyFjYx1fY9/hYGViHyDeG52h4SClnduiIRsdXt0ZnmCg6eMg4+Mg31uf3R2gnmFm4+Lj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hheYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcoF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbcnJlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHtyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2Fsc2FocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGl4Z0j4yKd3BshYOHdHmJeIl8k4h6fnJndoh+fZdvcIZ9aHZ5bWV5iISlh4GHjYp+bX12f4B8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOLgYZ3h3WBiXl4cm2IgI+AhHJ+fX2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5dop3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SDdJCMiHJycIR7g3N1hnSId5SIeXlxY3eGeYCSaHKEdWZ3dmNqfIOInoKAf46OfXF+c4R4f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJyiYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFlzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4ePgHqTioB1dHV+d4BvcX5thXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13em2GdX+Qi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp2dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGfn94a4iGc3hqdH+Dg316fHh7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtiV1dWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fin97koV6eXR5dXR6am11Y4R2koJ3cGdefIF5i4llcYFqanFjWGx7hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inuBbm6Jf3B2Z3Z+gH6BdXtxenSGe3lxZXJhboyCbHNYa194XElvbE1XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4Z7fY2AeHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2t6d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnF7a3p7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9oTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fISJjoOBg3t+i4N7d3x3d5mdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5qenBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFVXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfGZ+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEdee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTFl2ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBd3+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19aaYBpa2+AZ2xhaHp5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2B2hIR4j4RziHFweX9xY3FoW252ZHBziHt4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXdmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1VubldKU2hYZl5YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ5/eoiHhGxygnl2gYCCdG6Gb3yAdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juhnt+fXl2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKeoeHgH93cnV+dGFvbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnlaXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj62Me3uGkH5mcYh6dH19dnJvhmx7fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4B5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7hHp0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB4eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBfHNlcYBkXm12aWNmeHpzbW6BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXZcU0tjXVhpU1dIWWBOR2p2WF9hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJc4uGc3F2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmhe3uAiZV5ZHWIeXN5dmtzcH9reXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfH+AfHdvbmxkaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5venp6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqaXJvd3RzdGlwgZSDhn6EdnJqcHttZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0hydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9h22PhnFvd3p8dIKCfYuPg4KWdHiClIWBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF6bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpsh32AfIh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVyemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYh7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RPSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rkohyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3pzeWxtcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl7gHece3psYWVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3Zwa3lpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFi36IeodtcWZve2xxbGJYX2hob3OAdHNeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKh455bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQiZCOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OTkpKRk5KGk5STlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkY6RkZKThXyUk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKSfISSkZJ4f5OTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJKCbY2SiXF/kZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkIRnfZKAdH6Qj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Phmhwj3x0e46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI6BXWl2bWV7jYyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLiGdmbV5pZ3SGhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dndxYHRuYXB0amVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Nmbm1dbHVwZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWZqb3Fxc3RlWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05RX2Nlbm9vbmJPUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTVBfaGdtbmxnYVJNTk9PUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tIRklOWGZtaGxtbGpoY1xXVVFPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQlBaW11kaW9pa2xqaWppa2tjUkhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PUxeZ2xrbmtvbWlpamxlVElDREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tHXW1tbnhxaWpoVkhBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pjs6T2lwenNsY0k9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo6QVd0cVg/Nzw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD47O1dfOjo8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E7Rlg7PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTtJWzo8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXdNNzg4Ojs+PlBgOzs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5CXWpBOz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPkZudk06PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8/V3yBXD9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlHSEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Njg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhEQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj9APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDR0ZJTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PUE5KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQkVERElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0dHRkpHREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0hFQ0hJSUhJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RESkVFSkxMSkxMR0dNSUdJS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5LTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0xKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI8QkFCRkRIR0xIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD1DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMS0lLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MS0hKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJTWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd+dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhlfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdXWFJdWVddVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlFXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRYWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVFNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkI67zsvLzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fYCCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h5eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt8e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e3x8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJwcHFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNyc3RzcXODcW9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3dzc3Jvg5Fvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJxkYRwcnCXj25wcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCIpHVve6SQb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcIGvjG2Hp5JwcXBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJxfa6icI+mlXFxcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGCsqmQobGScHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nyc5uqorOnq5VydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHd9p6CjsJ+coYF7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIiml5usoKOiiHp6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+iKCRkJ6blZiPfn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYGGqKmhmp6ZmJR8gIGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GAgpWwpaahn6KqpYl+fX1+f39+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CCh4+hsqqepqGfoKKoq6CUi4SBgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhouaqa6po5ykoZ+ioaCipKOej4KBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4yZnZmamqGbnaKgnJ2ak4iDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYSLlJaZmoySnZualoyGhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOBgoGEkJiViI6amo6Hh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCi5aNk5eMg4KDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKBgpCThIKDgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgIB/iI9/gYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CKkoCCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgI6Yg4KCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KBlZqGgoKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgIuVko6AgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjYmFjYKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Ag4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgIGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+f35/foSSjY2Mj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHt7en1+f4CEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CMjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj4yKiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yHhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4aEhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fH+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS2ZE7REREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tmUQEhJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tLS0tPZmU1UVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU1NTU1dDLy8rKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDOztLUz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dO5n9DRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM2zl5q6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWvoKKnstGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XoceGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKTapJm11NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp232KKZtdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg0taimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpBQ0ZEQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iydTVopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7fQ1qOZttfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRptqimrTZsaSn1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKbasYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR09HD1NLSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0+QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk2Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIQEU9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDxEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysqKagnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhn5aTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoJ6bk5GQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoZ6ptZOQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqSkpKOioaCdraOWk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6qpo6SioaGdo42Km5mZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoqKsr6GhoJ6cmqdzgp6cmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGhoKGhp6Kkn56cmZqgYXyfm5uanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCgn6eWpZ+dm5qek1l5oJubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZ2kjpuenJqapIZYdKGbnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqZpI+QmpubnKR5X2+inZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbnJuampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZmqOOjZWZm52geGlpnJ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZiljYqPlpudnHhqZZSfnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZiWpY+EiZKdnZR3amSPoJ6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYlp+MgIKKnp6JdGhii5+enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeeinl6eZychGxiXo2gnJubnp2dnZ2hoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaLmZOEd3eYnodtYV2Kl5KRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkJGOjZmbiXKQnJyEe3Rkg42Fh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoKAgZKdiHhah5OWbG57c4GHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3KYlHRkT3WLjGBccXODe318ho6Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIiYR/gn59oIdfS0l0g3xaSmFreoSEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLh5KJj554SUJFdHhtVT5MZHOLi42JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZyin6CUYVNbSnRyY1dGRVNsf5CRjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqa+khFaCjVR0fGxcWW1VX3eWn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epo3RqwL1Qf5OHb197a1Zum6GhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhoZtlh8a9Zamhk5decYNdYJecmaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ+ZX421vpvKpJOpdWivcleNm5ufnqCfnp6go52XmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mtsbKvq6OjpG2ClZWoxp2SoYRGrI1YhqGfnZ6lpKWgpLOllZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqnuMG+uba3s66sra+EfXtsrbugnJqAV4OBZ4OooZeepaKZlrC+oJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt8/e3tjNyby3ubqviXhkaqejmpaKe2hrcnZ6h4uFhYR2b424qaOrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1trvD1+DYzsa9uraumnhqUGOUhIOEenJtaGhua2xsa2ZfWneytKq1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9v8TUz7muqaSelIBkX0pcfG5wd29paGJdX15hYF5aVG63sqq0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFyczGoZGOiHxoV1hJU2tlZm5oYmVgWVtYWlpZVWyzuaKmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbAwq+UdG1kWlZXRU5nYmFqZGBnZllaWVhYVGazvLKmqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTHuoBZU1NXVUBPZmRhaWRgZmlbWFdYU2KpuLO1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxMKyeVFLTk89UWNiZW1mX2RoXllXV2Squ6q4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwr2CT01NQE1nXmdramBiYV5cWWSlwbu6vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXIv3xTTkVHb2BhYWxiXF1eW12bx8LEx8G8vrSxsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcOuf1RNSGpjXF9uXVRaWVuSyLe/v8DAuru9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBw7uGVElZXm15gVBQU1aGyMOvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMTBuotXR05/lZJFS1p+uMu+sMG/ure7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2pmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjru+u8O2uce3tbe6vLq5lm5KeJ2RQFqQtrzBvrnGvMK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXisy73HuLm4rbaztrmztrS0hnybiVagv8C+vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1611gr3Iz8LAuK61tLq9t7ixv7+blYGXzcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGYcXWw0dHMysS1ur/DyL6+tL/Dr3xptczFwr7BvL/DzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhXN0qMzMy83KxsLDy87BvLi8url1WLbIxsTAwL/EwMrKw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApXl3ep7ExsvIwcPAwMnKwb+7urC2dla1xsXFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCl5hzeX6avr/HwLnAvL7FxL29uLKvrm5UqcXGw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVpeYE5TW1xwdHiEo7i3wrqzu7e7vb+6u7utr6xsV5zFw8PDvry/u7u4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVG55iaiwt765srWyvLm8trm+sbSob1+KwcPHw8C9v7mzr7K9uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNopdgU0NZVUhialVPRUplkKOur7a6tbSyrLy5uLW4wbq6nH9serzCx8K/ubq1rqWss7GmsK2onqCgpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTkpAZVlCUHiAk2hMQ16DsbWztbK0r6y7uri2ub/Es5+WgnqovLu4tbKxra2fpKannaSlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIR7WEZCUYhYSUpZeI6CYkFVpLmztLKwsa2wubi2u7e6v62xsqqfoLmuqautq6OooZ2dnpeYoZWSlpeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUaE1AVHlxT0lJS2idf1pFVrG7sayzr66srba2srS1rqminpubnZ6np56gqKmfoaeWm5eXj52Uj5CWjpebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZEU6GEUFhJS2BJWI1hZWWEr7WqsrSuqquvsLKzraWdkZeTj5ignqKgnKOkn52olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhWUmRNSkhHT1JOSk5IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/y55OQXWcb1BuSkxjZnZ1YV1ic5Kyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWUktmo1hnfW9yW1JrY1xnYmFtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxmW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2R3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe/sKyxrq2pqrSxsKirqLK2uLO4rbK0pKCdpZ+soaGioaCamJaWn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VebVtSYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dMW1NaTExRWVJIT05ImayqqaSfn5mSkZOYmJaWlYyIi46VnZydnZ6XnpmnoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wry3vrOztaKsoqmosqmqqKeompmemqqnoJmnoJ+fp6ilpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkNSeKmtqaqln56eoqOdnp2anJuUk5WUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6OdrKi2sa2jsKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OioJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLayqrqyrru3v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURUTURDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6WlpOOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19HXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT1tjO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FhX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1c3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMnAyMrNztDL0M3Oy87PyMvQ0MvOysLJx8nMy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFx8HGyszN0NHH0M/OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4OTg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PTg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGx7/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMW/wcfMzMzPwsvMycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb299udHIycrPy83EusDDu7u7ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nCu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAysPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc3Dxr6+tcG9w7u9xrzDurS8xsTCw7fAtra+v7vMw7y2usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRUdLQUVCRkpAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2srqVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMi5tLu3wcK9t7zGwcO8ta6ytbq/tMW3u7WruL2+wL2xu7awtrqzxby3r7u/tbe0xby+wsXAw8XGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6uMm2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a8x7nCt62qqLCywLa4vbCxqLGztbu8rK61pq62rruysaq5sK27rru4u8DAvrnDv8bDxcG8xsLIy7jFx8W/x8PDusTGwrvGyczLs7nDvbuziXN3dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk9OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0va+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK21tKaorqGkr6mypqiorqaot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZga29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLa8sqylr7OtoaORaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBhXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpujmJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqKyrmaCfnpmdn6WamaObnJ6wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6y6urGinqmrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqehmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSsqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZlX2FWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendzZWFcW11YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEs8K/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVSVFJVYGBfYGFfYWFiZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaqeqKKfrqypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwcGBbV1ZWUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+Njk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbm4iBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboaipq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGgm5SQjJmOjJGMko2WlZCeoqGknZujlZugo6GXoqijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTU4Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqmor66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZalqaedmJCPmp6ul5ioqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQU1FMTFdNSk1PUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qmo7GrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXV1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrehnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucnVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjYKUfn5ziY56kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTlJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7Sppqaoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdpraso6CPlZaSkH13fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWtxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIWMfYmBkY2Ql5qYk4uQiZ2In5iHiJaemqKgl6euqa2oqJ6XrbOipq6ZrKuYqLSiqa2jk39zbl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyEiYiVhJuNgoSSmpafnZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+ip6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2nnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS09PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsK2uq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVNTkhOSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woq2qqLWvrqy0v6u8w7+lopqVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqSorp+ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnGHfId8dIyujomAaGdiam5ybXCDdWlwWHVwjpuSd2x/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhKRklHP0JBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepaefr5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjnp3iX6JiI5zi5eQhHpdZHJ0enx3im1oamJ5b4aQgnpvgXd0hHpwdHl4a25pXXaHfYd8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIl7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYOIf4iEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GGgneHf3t2hX1udnVmgJSOhomIh4iHoKuilomOmH96gol6eW9na3h+en9zbGVeWltdal1hZmBZT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsZeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Kfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoiglYaSiY6PlqS1qZuNlaKDh5ODfoBramt8gIGCdGJeZF9bZ2tdbGteV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKqWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYo6KmtrCdkZmoiJaPjYGJbHNyfH99cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKKlnp6fYV/aGFoXGViXWRjXmZnX1pPRElIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6eaqa+tsrm3uKebtqmMpY6Rk6CGeIKDdlpiZVdmYWFjX2BmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gYx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoZ/homFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe4wbW+r7d0sbOlusWksMa5sbOxtKiktbaqsaCilpqikqWwraatrKekmKCstLqiqbK6tbu+zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy6wsKsmbqolK6Pl5iriX6CfWtXZGJZa2VqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3iHYrmhmaOJlZSWk5STjZCWkoeGe4aBjZWKgYSBinp8i4eGfYqDgYqDlX13eXVlT1xkR0VMO1FjYVteU0Y/O0hQRVtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0tMU1pUXpOvuLW6uMm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqu9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfpJSip7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcPIsJ65qqGrjqSntomBgHNgYmJeWGJgaWZSWGBWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWZmZGOl5KWlo6Gh32Gg4yWi3+Df4J4e4uDh3yLeYGKgpd/c316a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLSkhGSEhIR0JJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJ2tcF6irJyYoKObpJ6qpZSgn5CUjpaYl6ifpZ+empmDpJ2spaqwrbewvbnU0c7X0MnM0szPzsrHwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZgHpsXmFdWV5hWmNjUVxgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmpimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+WkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwqLS01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3D0NK4sMO8xLmltrrDooNwZF1dXllgWFlmWlFdV09QQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMm5uXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdHRxdLWxcDOx8fDqL63z556b2ZeY15XYFNdWlBRVVBOSD5ARkFCRTxAQj9FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NXX1cnU2s3J19fRyqzDw8yMc3BjYWBYVFpUXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5SYio2IiIuJfoJ4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuPi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qbkquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eXdvZV5aU1ZSW1dGR0pJRUU9Ojc6QEFCOkdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWXl4mPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1dvX09nb1s/b2tHWydTLlXp8amlcW1BTVF5IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+EfHyEmI6Hi36GhoB3gnlve3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJGKjZGCjIWJiIGGkJGenJmJhoyBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PT08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36AfoB8hXt+gZGJhYV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKScfYmEfYlyjIp+c6aanJiThXuPkIiEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZaNi5WfnZSglJGOjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSvoIuRi4WLgZKGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gX2Ge3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWip2QlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZueopKpr6CRlZCNjoiVi26Nt4WaxMiym6Glm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ+Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3SBaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg+NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCDfGxvi395fHh4fISHi32Ko7Ooo6uzoZanoKWklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5WWlJCLmJmWoMCOo8m4q5uipq2ZkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyalI+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvc416fYF7eIaLiYWDkqe7raiyva+lrrOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZiqo6+wqpqZnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi5CVjYqMl5iSnZmzlpWqnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL1KJxfGpeW1RfUlBHRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgY3BKQIuKf4Fyhod9gYl1goqDf219fXx/cHeHd46ChnuNj4yGjJqrwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaudnKSYm5iXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkZqWnaeasZqRq52Omo+SjpWQkJaXj5GgkYmVm6OslJaPlJyelKCem5igoZWanqenpKGksLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVthW05LQkxARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5antMbJv8LMwcO5yLy6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm6CqnKKclZ6wtKeLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY+RoYyMlJGPiZefmJOZlJemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6pt7XJw762zrLFvsS8s9HJyMG1dXltXVlda1NNSUNMS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHqNoZaomZqYur7HyMrC0snKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6uutK22taCfrp+mopijtL2pm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllYXVxMTE1KR0RDSEJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY6Xjp6SiYp/iJ+ThHiFf5V+f5CIipGAlaGarqakmMO+yMPIxdPNzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdq7e4qaWvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmZaZlaGkqKaetqupurzEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeplo2Qg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKupp6+wl6OvpKikpbTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFFRO0hLSUZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eZoKKor5mQl4eLp5aOiJKFn4iEnZePnqCao6S1yLSpxrvDw8jKycfMzse+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSrqaaurJmkrqWlqay6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrure+s7Ktvbm2oKOnqKWnnJysqamMZWZhX1JMTUdHTkpWTD1NRE1JSkFDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRayVnKGfu66ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLIyMXCzsjCvbmyr7i0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKuqvbyorbyzt73GvLa1t8Cvvb+zqLS2q76kj6OXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjaShlJyjnqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLWys5+coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HDwMfEvs3Hu765srC4s7/DyLW/r7y2urempKqrrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ejlpOblK6fkKGipaOjn5C+pamdqKydnaGbpp+9opmjnqKpq6Gdl42VnpOfh4+FjZKepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWpraycmaChko6QlqmflGlkWmFdT0pIS09NSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqqyXtrCjqrO2xMK9v7bAwrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqyum5uemaagvqGdpJirq6umoZmNmp+SnomOWH+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpq6yq6mioqWllpWdmYuPkZOkn4ljZVtkYExJSktPRkVBRko/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6qkn6Oframsnbuwqay1ssfDwcKzwsS9xsS8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2qoqWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLmgoaSSrq+spaafkqGelZ6PkY6VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+OoKGTi6assKWnopygnpOSm5SFi5KNnJ6AY2ZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZayq6aipbKsrqm7sq2wtbTGv8TEtcDFvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6yhl5aRpaSiopeYpK64rbG1tqCfqKSZlJWTpKC3oqSllq2xsqWqpqGempqblpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6GZnpaMj5mQgYaWiZSfeWVpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaudua+rpKq0t7Gwubewt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSOqainn6OcmJuTh46Zi36NloWPm2tpbWFtblhRUVpVQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHCv8nEucXDwMC4xL7BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8rrG4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+opJ6UoZibqLWpl5mSkp+ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWWlIGPlYV7j5KDjJdmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa6zuaansbjGt7G3vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvZ6rrrGjqp+wrbOurraxubapra6wp7aws7u8ybKqtbSxtK+upqGzn5qoraCllZWambGjraClr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmay4o5iUkY+YnKGYl5Ssn52UgZOZjZ6dmpaQipSTnpqlo6KgmZaSkpZ7i5CFe4yLg4yTa254bnV8YUZgallJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZegsKixqaylo66utam3tLijrLS3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6ytsbmVl6auq6ejsqmUr7qkrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoayom5ydm5SquZyVjo6LmZ2imJCXpqGfloSSl5CdnJiWloiXkJebqJ2koJKWkZCWdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5GZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3wL2vrLOznKCnsK2lprClnrK1rKuysKypqLS5rLSytayzrKmsqKypua6xsMe+uKW5r6mtraaorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmpqSpLSaj4mNiJKjoJWNlJ2glJOFjpSTnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoqmvpKiks7SxtLWxsaGsrb3Muq7BvMextK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzBsKyyraCkp62pqKSwo6qxqq+rsa6vrauzu6e3sbKpsqmrpaWjrbqsqrHCubSsuqioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6mZo5iZj6CnmIaDjoqLn6CPi4yWnI+PhoiRlaCdlpiVhpaTk5elnJ2cjJGQjYp/f4iFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlOY1xOVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6u9ybyxvrfDr7Gts8TEzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Ourqulp6qwqaeosaW0raqwrq2xr7Oss7ukuLSsrK6nq5+jnrC3q6qturaktrWkqaesrKqtoaimprGypKaloaGrlqmglJqgpp6koqqkrKKeprG3rK2ipKKaqKqtqZyhpaSkmaCZlY+YnZSBgpCIhZ2gjYuOjJmPkIuEjZiknJKRm4yTkpKUo5qbmouOi4t8h4GCg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVlRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqmttau2saukq6qpvMHAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsq6tq6yntqqlra+rua+osLCusau1qra1p7W2q6ykqaqco52zs6iopLS0oLauoamoq6isp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6SmpqmcoqSjn5mZn5GOj5mOfoeNh4WenoiFiouPjpCNhIaVo5qOjZuRkpGPkp+XmZaNioN/dIeBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUV1RHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJi8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Gxr7iuoravycfI0cC/vbq8w766w8HAv6+ys7K1vbzBsrKzq7OppbWopK2zs7mvo621sa+xuaq4rqqutquqnqqrn6Ogtq2poZ+vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKiin6yhoZKhoqOmmJqoppeXmJ2PioeViH2NhoWEpJeFgoKMh4+OkYSFlKGXiJGdkJORjZGdlZePioWGeHSBf311eXqAe3R0e2qCh6N1aV5lbIJ1Z4iLfFJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE86V0I0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNDCvcC+ub6/vMm8wrmwsLWyury5wLO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlqSbpKWfpJqaqKqlnpqpoZuRmqClnZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd8enVwcX5phnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RltAKo+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1uLSqnbq7qLK/srqgr7S2qayerbCinKWoqaOenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppefm6GjnJ+bmqOpopqZo6OVlpOfoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTVxebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk9M1FcPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfKx7+3wr6wtL63xLbDsq+6srPAtbu+uKm5uL6rpLWnqKqwrbmwqZm5vKOuv7S0oa64taemp7CzoJ+kpqehpZmfraipnqCqr6egppejqaCwuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhqb3BxcGp/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXFx8C3v8K6sbW9t7+7v6+svrC0v7K9w7mpu7u4p6i1qKersKyzsKaZvLakq7u1rp+xuLCppaevspuhpKCjpKGWnLCmoZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImLj4Z6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZW1sbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5XV5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5ZG04NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGioLiqrqC6uKasvcWzsK+jtbCtra+0w8O8s7+6uLGzubi6uLqvrsCztLmwv8G4rL27taais6qnqbKrrbGhmsC1pKe1taiesrypqKapr6yZo6eco6aUmKGypZmfo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2UkqOopJCJio+GeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhoamdncIZnaGlkZmlqYGpiamdbZXtjYFNzVFxbU0xKR0lPU0AhKmhdakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWdPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8C/vLHBtrGusra2uLe2raq9tK+ysb2/uK68vLGln7arpaW0qaqun53Bq6ilsLKprLW7nqmqq7GlmJ6qnaakkZmnraKYnqSpoZuinZegnae2pa+qr6GhnZ2hlKCmn6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqLiHmFd4KCgpyIi4KJfH+EiIaFkYSWlY+OkJGRkYyTe4OVjYVzfX1meG9ramxndXNrY2dkZHaAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0hLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1m6OfkIusoZiYoJaltLGhsb23obHGvLqxsaS3rKuuqbm8u7qtv7Gvrq62r7O4s6isurGvrrS2uravub6tpp61q6CgsKSrr52iwKCxo66wrreutZ6tr6ytopqdp6mlnpWbqKWfmaSiqZ2aoJuUnJ6sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY98gnOBgYuYhYd8iYmEhYqMipOEk5ySkpCQkZaOkH+AjI2DcIB+ZnltaGtqZ3Fya1xoZGNzgWFmaGpubGdramhtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJKhmo2OsJ2ak6GaqbKvn7i/tqC0wru9ubGmtrCorqW3uLe3rLquraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqa2ap76YraOur7W1rayfsa2vqaKcnKOrqJuVnKejnZqpoqSWmqCckZykq6qpu5+npKCYmZmdoY9roZaZnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQf2eGgGh1aWZXXGhzbk5QamRncoRnX2Rmbm1qXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NlmBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky6MpJmGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukt7Oxs7C4raqnrLSmsLWjqLi2tainrLezrrSts6Kqn7SrnqGknKanmKu6laalr7K3ra6kqa6rrKWhn5ygp6ebl6GlpZubp6edk5+fmJCeqKqjta+jo6OclpeXl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIhHJ4jY6FiKF2iY1pl4hmfXJ4oXCIh4R+jXx/oaCgmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprO0rq6ztquppbGtpbW0nK62trSlp6mzsa2yqK+fq6GyqaCjo5qho5qts5SjpKW2vKesp6uqrKiloaCYoKajmZmmo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoGmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm6CdrquUnaGftLqjqqmira6lop2amqGnn5ebqKCfmJ6np5Gcp5uUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaGeHlkV1nGB+Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZWDrKelnqOlqrK4rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrSzoqucoq2toJ6al6CiqJ2ZnqSfnJqhp6SPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4Gme4KGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKq7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2sopqZpKi0r6Kpj6moqpuelZigpaean5yin5ugo6WjlZuemJqdoqqbpZmcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuhk5ixqKils6qltaikvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqitsKmjno+soqiWnpecoaWhmKKhoaGaoqKnm56hnpWZm6agnKeVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpkZlhBT2tfbGhPVUdJOT1WUltYWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrytprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2iqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq7CmopaTrZ+lkpShm6Smn5SapaahmqOfrZqgnp2QlpuhnZyllZ2WmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfY6ehpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa16vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaVNZUTtCREFMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyurezuL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyvpqCVmamfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52hmJmclpaioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rrammtLC3sLW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjVFpRPj5tbzNCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doZuYnJ+Qk5SrtbCnmZScrKqXjJOlmaWtopGWqrGjoJ6nq7CYoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbKspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKMnKOel52akJWSr7mxrJWXo6enlJGWpJ2krZ2QoKirn5ufqaOznqOljqeilaKanJeVo5iPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4uGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbZ0cnB3toxegHp9imiDeW55Y4uscHWFf1lbp2pFZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6noaqXlJ2QopuRj6KooZOdl5OXlLK1t62YnaOkoouSkaacpqublqikpZyaoaimp6OpoZGtnpeknpeXl52ej7ColJynoo5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx7gnNJSm+GcE51TUVXXWZgTFtYZ2NfT1ttdWlxUlBERU48SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+qKmmlZSclaCakpekqaiQnZGPl5ywsr+sm6edp6KJk5Gpm6mkm5uroKOZmqOnrKOfq6KasJuVp6CWlZ2fnZexpJihqJmckZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11wZ01ZWWZqYFdacHpubGZTT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC5As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAqLShnaSlnKOVlqCqpqyjo7ern5mWlp+XraqmwZ+spJWSnJeemJOUop+eoqaTkZmop7LEr5qrnKqfj5aWqZ6rnJygrJihm5yipK+noqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgamVjZGZrWWt7cGlqXFNMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6grKKQkZ6amZORlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKmvqqajq6Ktm5+goZmknpyena+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaN4a2qLmKOemHNsbnqEjYd6WGVehYJebIuKgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmSkpugmZmllXulrKKotMS4pKGnrp+elZ6jnqOco6qokp6hnaCqsKqro6qgqZumn6ihrJahm6WwpJecq5WhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KIgp99lZiJnsC9gpadnY2dwsF7gnuSjZrDwH1qpbFvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCroKuYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq63AwLCgqa+pl5KfnaKZoaOqo5OgoZ2dra6prKajo6ehpaaeramSpJuprambnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeTiLNjgquGoI6Ns2qErnR9l4e4YYOtWaPNbpB1e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Cj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOT42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+cna2vp6upnKeopKKrkq20l6aiqqmdo6alobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVgb2lpbmZjV1NdYVlSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJialqinr6yop6mel5Sao6KRlKGtm52mo6+so6u0qrrNsq2mrqyWlJydopmfrqydlqCZnZ+psqmqqpusq6SjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGVh65ffKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVMTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKekkJqiqKCgpZyxpqOnsay2yLK1qqyqlZGdnKKZoKWznZqglJyfp6yrpK6araqjoquis66iqrOxoZqpqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4qaxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZmpzcWaBal9hWWRtXF5ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKys6qtqJOJl52kmqGjr6aXoZSYnKWmq5uwnq6opp+so7etobK5r52brqeys7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ+ErH2alGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppujp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa2pramRh5Ccp5yipJyllp2YmZqmpKmar6KupaaYr6W8raG3t62enbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmVkJptcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4anlzboB0XWRkbm1mZ2BKW1lYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKiRlJeuoKCepqOcp5y0mqGqo7arw7Cpq6mhjISOnKGgpqKVmpqbmJuZpqSmmKyorqOlm62nvqyUvbCsn6Kwsrmrs6eaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZSSgHmvXaOBfKanZJ2AfJd0a69dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2N+dW2AemBnZXFuaGdoQ1phWz1LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKefp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamkn4uAjpuan6aekpWampSamqakpJqprKykpaCqqL+ll8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsVt9tFukg2vIomWfgHu7WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmPnX5kc35ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+poo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Oqsqm9r6Wonp2OfYublaCgmZCSmpuRmpipoKGZqK6npqajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwrJeMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5uXknuHmZGmm5OPkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYF6anFpZ4mWlZhxaWmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2Tj6KYmJmSl599h4+VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBojLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epquhn6OjoJGLpJKnmaiZlqOpoJacpqaor7qsrJqbk5J7hJaNpZiNkZKYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkY6VhYGkmZeVjYuTkoqPhoR9Z4p/dIJ2dIeMcadte5SRlJKBgY6QkI+dlKGWmZeig4iVjXJpkHdwi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqyloJmnnp6TlaOWqJqomZSmoaOQm6iZobW7qKuZmpCNfIGUi6GUipWSlZCQlJelkJ+aqqCctqOeqKy3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSJmYd6cpZzeop/cnx/am9kXnBqYVtfWW5jUGBlUFo6R0dFPjI9PjcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj5+5tqWmmZyNiXmCk4uak4qVkpSQjZKXoo2enqmen7ikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJaMkpyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmIipSSi1p2lZFoaI+OcnqmmplleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk5OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qilKehno6XkZ6Fda6PiKaaqJGXpImcurSooJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgpGXloSamWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH+TioODmWuOjYVseHtxcWdkeG9qbGpbZWtqZnRcX0lUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1haWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1npCEnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gn7qyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKmJGLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6KbhJqBjY6FiplxjpOFaHd0fHdoaHVxZ2hrXmRwbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6OvgKGnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYh6O5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onWAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWjqJKhoKCmm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipipmJmakoimsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwc5SIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42MqailnpCWh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeaXal+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU83VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9iYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZyJkKmjoJqMkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVXQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6SiqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfIRshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Fm3B5epdrm3t4l3NuqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYklXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yIkZKkloOOqpqUkouFiXmDd4iAboKfh3eAk4aImaKXe5SipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjICMpI2Wg66hlHa1tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXioBvTGajknCbh3Kke3l0YYOCa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUtBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMhox0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqiQgaKskYaQioKKfoCAjnNoj6WEfYaUjYmYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpyffKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlcYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx7b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZimjn+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpZyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aZpI58p6GLhpCQhZaDho6Yd3KFqYaOkp2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J1gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqeiiHiOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4eTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoB7coKAeH99f4V7bYKMhnx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npeioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYaDjpudkoern4NyipCGk5GMnZF9jXqqhI2SmJaPnJeHhpumn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ6MiZOanoKOl36GjoNvd4VxdWF+go+GdYuYgIOPgoaFfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiIqMfG9rfoF8bmhsbWdeen9ofXt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pogIBsc4FsbHRveW+FeW2HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlam1ti4met5qhpJ+SkZaXi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gZCamJKMmqOho5qXkZt+jYV4gIOOh6B/fYyNkHyYpKChk5mQj6aNkIGbkYmTl5t9kpJ+h46BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfHxxeXuLhHp6kYyDlqWTi4aQfIaGh4V2goSJiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrZGxoZoCBa25+aG9xa354hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmtveYmNnrKRpKWdjpCYj4adoZudfHaloY6YgIyiioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loGVmJaNlqCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6OeoZOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCioZ2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWl9g2xodWhsb2mAfYF5bZCGcYCDg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qp2KmXqXnYuMmJB5e4GLfXyDe4CDgXh0eXpzfYCEf4mLgGRefYuVh3+Fh3V9fop/fZiEl5SXjKShmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5OSlYaZiHyKiYF6cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dniAfYaAfIONhIyUpI95hIJ0iYd9gHR2gYmEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2pmamNpd4huZmxoamxogX17d2+QiHOBg4R9dIGGiXqDfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2Z2Z25sYXlpa317eHBheG2LgJmZqqCjqJ6Ki5KGip6LlZh9d66ZjZd9n5SRlpSId357inx7gHZ3f4BwdHR7b4V9gYCKfnxhXH6QkoaAhIRzeoCGeo+SiJKRnJOlnJWCfoF9jouSpImOio2Ymo2GkZiTlo+KiIySnJOQjI1ug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CVmpSikpKJi5qMgn+Rnn2Sj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiYSMlaiMe4h8fouFeH5xcIGGhGNoeXR1cHxiXnBga3RecGp7eXhsc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GObmRpZ2RpaIF6d3VvjoV0gYKDe3WDiYV3hXx4hIV6gIp3f4t7e3J4g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlZOOh6GNlpOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1l+ko2IgICAdnWAgICghpCLkp2YoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYmLkJGJnJahnJiVhZeIaYSjgmaFnYqRfouDi4F3k5iRnpGQiYmVjn9+kJh8kY2PjZqSfIqAgm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2yBhIJecnNycXB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk25gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIaMf3t2in9qcWN8Y4Z8b3FtdGpob2x2eF9xf3l7dHV0gIJ+pJWarZ6mloWMhH+XlIOQn3WLoJSThoubjJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzgnqCoIKSgpOTmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHOLhYmOiJyan5qWlICTf2iFnIdnhaCHkoORg4lxg5GXj5uOj4yMkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx6iX2CjJCenYV8fHeCjH13cWpsgoN6YHhvbWxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHSKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4ZnJqg2CIfm9va3tgam50f3VfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHdzgHBvhXRwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN2g5+Ck3eUkZmckJl7lHOFkJ+hk5OQipOblIZ+lpaIjY2IkYyInH+OgHd6jH6Ii4qcnJ2blZN6jXZniZKHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqTkYp6hXx+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenpoc2pzio6JgYWFfZWLa35/boCLfouHfIR6go+VmpqKfHZ4g5B5c21ncYCEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY193YGBWa19ed1BOS2FnY116cYl0XFxldmBhZWWPZGBlYlhpc3Nua3F2jH10eYaBdXZ+i3OAhn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WmxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76FzbHWEdoSihZJvlpCVoJWcgZJxhoujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZnNqf4mOiYKCgIyWhWuBdm6IkIKPhH6Ben+QlZOZkHRzeIiNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmBiV25aXHhOTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRxgVdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXeKmoiNaZiQj52Wk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uQi4WPgn92eIOEcoeCk5uWlJiGjHWHf3CEgomHmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6OgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qBfn+SkH1tgmx4ho+GkoN8gH2AkZOQlohvcXqMhnVscWxyeYFgdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hiaVhtVlx1TUtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm9pc3iKfnNzgX56dnqIc4WDfYCHdneKho6YgYyBe5N2bHd1eXiTdG54e31ZeoZxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCneG9xd3xxkpCMh2qZjomckoyGe2mIi5qHgZKRhoeYjXyNjYGBiY17j41+iYV6dHuCenCGgJaZjpOUgol1g4Z2g3+Kk5yfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEfoOHfm9fcnCFe46MgXx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm96jH51bm9rbHt+Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanR3hn9xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xc5e8xYR2cZSJkH5yl4yGnZOMiHRriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4ODcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+HjI99aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCDgn9qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHmDfIGYjI+MfW5se4l9d3RvaWh9d2VdcWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aWBlcntaYHJ8eWdwemFlZY6xsndKYlqk2tCXcnuRi5B4fpWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4uHfGV9foN2Y3BzgGh4cG90mIyFgop7dnh/g3mBalxwfXKAh4WIfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXJgWXdaWXFuTlhyc2dgSmx2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaXhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3duiIRrdXt0ZnmCg6eMg4+MhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBygG9bbH50eImCinuGf3yIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhxWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZlX3RwW1lVb2RZZXB5WmheX2dtZ2psaXB4fY5saYKEf3lugHt9gX+CenWCgYyThXCAi253foB7e4iTiX9oe35qdHtyhntzd31/jHl4hH58a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvX2Fsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmKeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iIWlh4GHjYp+bn51f4B8i5mHgpOQmIiLhIl8j4lxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnOLgYZ3h3WBiXp4cm6JgI+AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQWFkW2B2YVx0bVhYU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx9cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g39+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ/c4R4f5GQgniWjZSPh4KIe4mJbHh5fnVoemlrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJyiYOCfIJwhol3eHBwg4KMfn15fnx1joWCdWlxaWyIgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxkcV5dd2hVV1Z3XlxlbmhWa15hamdlb29pcHd7k25piIx5fnN7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR5gHZvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thXSUhnh1bGB6gnmIjmZxg29ndW5bbX2BkJOAgXmSk314e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdIOGfn94a4iGc3lrdH+Dg316fXh7couAfHJndGVti4NtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG5mZmtxaHB2eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R2koJ3cGdefYJ5i4llcYFranFjWGx7hpyJg4Jzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW99Z2hyYm54cWpscXh9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXN/inuBbm6Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwc3eGeG6VinR/enh+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dXl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl1cm9oeWFqbWBtdmpna2x6d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0fIt6gWZ0hn1tcWh1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZtZHFmcnB0gHdwmoR2f354f3yFh311c4KIf5WCbnN4enpzc4WHiYiEeIB9do9/fYSJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdXBkZWNXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3BiaGtnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNp3yEfHaWkHN8c3t5bXt6kIR2l3yHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXd0Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExOcEdee2ZhTVV0Y0pOU1dgand9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVXNXTVh1ZFpfa2BcWmNlX3dmbWJwaXNvcn50dJmBd3+AeH9+hoR6fXaChH6YhW5ydHt6dHGFhY+CgHqLdXSRf32BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1taU2JuZVtYYXR7amhtaF9iV19baYBqa2+AZ2xhaHl5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3j4RnZVhid2l+hnpvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW252ZHBziHt4YXKAcGdqeHNxa3d2dHdjg3t+d3ZwZGNjbnx9a2tVamNnU0tsaFBHUmxFYXhlYU1Tcl1KTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUtceV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXqAf4eGenl6g36Bk4RxdHR+end0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1paWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Juhnt+fXl2cm16aGl3Zl1kcmd6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnX211ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwcmJxcYR7dWRygGxhbHpvamh5d3RyZoV1enp1cWRhZG5zfmpsVGlfXlRMc2NRR1diR2J2ZWBLVHBYSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYmRegGlqX290eW1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWHBtW19XW1xse2Nwd3ZsYlttc3RndXZxbYV5f4B5d25vdGVpdGVbZ3RmdnaRel9dUmZmaoKBdH1hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp0iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3fGtubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2Rabm9hcHGBfHNlcYBkXm52aWNmeXp0bW6BdXN9c3FiXmZub31laVRpWVlUTnhfUkpaWUhidGNgSVRtVElMWlZpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2t2gZB4bYN+gIGSiISBdnWJdIyGc3F2doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpaV2hjbWVcXHKJZlJybVtaWFhgbHZkaXVqal5abXNxbHR0dGuGfH6AfHdvbmxkaXFjW2tyZHR2j3NbV1RkYHJ/fnKCXGFjXVNaYFxkk59lcnGFhJF0bGp5bG9vent7cYB2f3J6enpkZXVnXmJbYWhcXndoV2Jdb2hhd2FbfHZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXXGptYnBygHpzZW9+W2BwcWJeaXB8bGx0fnJxeGtwYFxlbG17YWdUZ1VXUlB2W1NQWlJIY3NiYEdWa1FJUFpVa2trfGVtb3FgW1pYWWxwV1JQZldXaFNURlpcT0hydVhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gYCBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1NdW1VnYmxsW1xxjGROb21cVlhVZ2l0aGJ0ZWVdWm51bnB1dXpsh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWY2N3fHxwhVxjX2NUW2BaY5aVY25wg4WKc2poem5lcnZze2t5dHVven51X2ZyY1teV2JkWWF1ZlVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxc4B2c2JsdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF5mVGVVVlBVblhRV1RQSGVyX2FGV2pPSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2lRWWZUU0haW1BOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaXZ2f35tg4B+h5d7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Md3hue41gZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX19UZ2Bsb1xebo5oTWlsYFVWU29mc2tleGRlXVlwdG1ye3hzbYh7gHece3psYWVsbV5gbmplcHl+Z1pWWGBreHt7b4NeYl5nVllgWGSciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiZFhlcWNUXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3OAdHNeaW1TZXBlVWJuYXlicHV7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWnV1XV9mbWhYYmFbXo5xY2dqd3Fzbmh2c3mDc4KDe4iNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOQipCNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIiIiJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IjYmQiYuQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MiY+GjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4yJjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjoyNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6ent7fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9fHx9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3x9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOkI+NioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5SSk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKSkZKSg5CTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKSi4qSko16kZKSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZKId5GShHePkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4tuipF6dYyQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+PimiAj3Z1iY+Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2JaXeMdXWGjY2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4BobYFxc4GFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1aGBnYGRpbmdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGZfa2xgamhpZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXGN0bWVxcGVdWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SaHBsYXB1a1RQUVRQUE5OT01LTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRmbG5jb3NyV05OTk9QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJTWFoa3Fxb25ZTE5SVlBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQUtPR0hOYWhmcG9raGNeY2hXSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+QFReWV1obWlubWxqamxsVkZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8RVlmaWtvam1tamprbFdCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PE5pbm9rbWxpaWxVQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo4N0lpb21wbmtrVzw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PEpncndzbFw/PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV0dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/PkdbeXJUQDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj0+QD1nXDk8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdnZNNzg4Ojw/P1NVOTs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89Pj9CVVs6Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPz5aYz47PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXVMQUNFQD8/UHJ2TD9DRUlKSUlNTUtFREZHSEZHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WHiIh/WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVXSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEhHSEZGRkhKSUlJSUhdb29xcnR2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA9PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhYaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk6P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM1Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njo5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozs4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4B/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNCQUJDQj9AREhEQ0VERUVCRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcXR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQEFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT05MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozs9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT05MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LSkpKTU1MT1BOSElLTE9RUVBRT09KSEpKTUpMRkdIR0ZHSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NUkxQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0hHR0hGPkBCPT89PUI/Q0NGVk5GTk9QVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1ZrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JWVlhVVFZUT09NSkxLSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpUU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnt4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hDREhHSEtHREJBREFPUU1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJsTUc+Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVUV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1ST2FXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3R2eHd5ent9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVVRTU9OTElISktJSEZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNWVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fX19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI9WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XV1ZZWVZRUVFPQD47PT9BQkFDQEJFREFAR0hHSEZGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRWVFdXVUxMS0k9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHB0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT01JSklHQ0NDREhKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFua2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETkZBQ0tLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRkpKTEZISUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmZrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD86Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSElGRURFSUpIS0lHSFBLRElNTFBNT05PT05LSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhERUdDQkBCRD1CQT5APTo6PT87Pj5AQj5BQkRHS0ZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS1BTTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj49Oj46QEI+Pz9DRUZERkRESEZERUNERUVHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSVNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2lpaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklJR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNIRUNFRUZHR0dJRkhLSENJSEdJSEZESEtJR0tITUxKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWlxaWVxeXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkI/QEI/PURFRkRDQ0JFRURGQkVGSENESkVFSkxNS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBBQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTUlMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0RJS0xIRkRHS0xIREdIUEtMT0tMV0xJRkVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtMSktLSUdFSURDRERCR0pEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0lIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tNTEpKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0xLTk5VTk9LS0xHR0tQVFNOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUlZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0hneGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f3Bob1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlJSS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVWVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVlROUU5NTlFUUFVRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFdYVVNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWVFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hSVVVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV9iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UU1hTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUVdWV1ZXVlRWVFhdXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWJjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWlpXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVlkZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkI67zsvLzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fICDgoKCgoKAfH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z4e3h5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enp5eXl5enp8e3x8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3t7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8ent4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3l7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4OEhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRfdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB3fHt7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnV9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycnFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeG9wcHJycnJxcXBwcXFxcnJzc3NzcXFycG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNycnJxhXNvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXJyentxcXiWcW9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnB+lnFvg5xyb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcHake26Qn3ZvcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFwdqqIb5mhem9xcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnB2q5VxnaJ9cHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdHqronueon1ydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh4lLKlpKunfnt7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fX+mpqKypKiLent7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX1+hqico6uanpt+f39/fHx9gIOCgIB/fX19fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGNo5OgrZ+hn4R/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIqejJSunJabh31+fX5/f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+Dg4B+iKWimZ+blpyUg4WJjYV/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhIuQlpikrqaim52gp6mhoaCSgX+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChJSpsLCknaKdnp+hoqOfkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgpSfn52ZoZ2doJ+dnZOHh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgo2UlZefnZ6hnpuViIeJiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhISEhIiTlp2Xmp6ckoSDhYWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgouVl4uRnJaEgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4CAf4eSio+ShYGDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBfoKJjIKCgoKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgIqOgIKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhISDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCPjIOBf359fH2MnI2AgoGCgoOAj5OBgoKCgoODgYGBgoOFg4ODg4ODhISCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgYKZmYSBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODhY2NhYKCg4OCg4ODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYWFgoB+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGhIB+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhoaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQjIeGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomKiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFg4SEhYSEhoSEhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICBgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn5+f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4CBfn19f4CBgH9+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gIB/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGChISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBf4KCf4GAgX+Af3+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KEg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHiIiGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eX2BgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpaAfX5/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+DhHx8gYKEgoB/h4N9g4F/goKBg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoGCgICBgYB/i5SQjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WFhoeEhYCGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg4CBgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjYyMj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1/gICEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYaGhoeFgYSRj42KiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeHi4uLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoJ/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99fYB+fH9/iYN/foOQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo6KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCCgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/fn+Af31/f39/f4B+f3+Afnx9fHx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGChIODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+fn9/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXl4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgICAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYGBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foCAgYGAgICAgYKBgIB+gIJ/foGCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoCAf32AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx6d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoOFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICDg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBf4GAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8foB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WChoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeGg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KDhIOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoGEhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3t7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhIGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fXyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXW19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTVybu9vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDP0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF08iUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slMmarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaanl4icnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XosDJmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKbWlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp27s5/Dm9qto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg082Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNXN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jIj6eaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWUjKelqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKihko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPS1LnH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhn5eSk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJeanZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGgmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWkpKOioaGenJuVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6OkpKSioaGem5qZmJmZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5uam5ucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoZ+fn56cmZminZubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6Cfn6CgoKCem5mcsZ6am5ybm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZydpKKfnJqZo6yenJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqbm6mjm5qanKOLnp2dnZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZm5qmopqZm56XdJ6cnZ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZqZo56ZmZuhjmSbnZ2fnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mZmZiYmKGal5qco4JcmKCdnp6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJiilZSbnKN4WpCinZ2enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXopGOnZuhcVuFpZ6enJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaMkp2OiJmVnG9idp6WlZKRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2QkI+LkY+LjI+QkJGOioiWjX6Lio50aGmLiIyFh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJh4SBhoKAgomVkIl6in+FdmpkgoCHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N8jYyEeouEhXNqYIaKeX18ho2Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiGhIiIioR/gn96e4aHfneHgIJvZ1uCi4KEhYqPi42RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjYuLh5KKh4aWiHZsgYV+aGNYf46Oio2JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqGanZyioZWPoYtzbH6YiGVgWYGRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqamnoqWoqayqqa+gnaaRfHuLnZpyYl+Hl5SXn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurquqrKShoqWpp6eoqKmcjXh7lo6WeHBtk52XnqGhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mopKemmZ2kpqKhoKSminpmYY2DhWNwc4udlp+amaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraemnJ2mnHpmVk5+e3lOX2p4mpucmZufnqCfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqusbOuq6KhrJJrUUpJd3RvRVFha5CjnZ2fnZ6koqKhoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Ciqqqnr7e2tbW2s66rr6uCXEhDR3JpZkNGWGZ+n5qcm5aip6WnqZ+jm56hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyuL29vLu6v7SusbyecVBXTURvYV9IRE9gb5WWk5qWo6uotq2io6SrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1trzByMC7vca6ubi8jWFZjnJDbGBfTlJXWmaRn5aipKinoLqmqqu1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9w9TWx8DCvLu6uohWe8KqTm5uZ1FbZF1ciKyop6yii5S1pqu0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMLV4NrKtby8wMCSUIvAv2F9gnldSmlwU3qzuKicgm+WsKOmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PCy9vZyrPBvMDGpVWCoqJwnI+FfEV3jlVrq7CUemNxq7Smqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTNz8O9uLi+xa9jdHtri7eSiJlXe49da5CFcmFajbe1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExcvCq6mtsreecHFtXKS4kIidaGdyaGhqZV5XaKS6tbOsqaKhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XLy6+XmZydjnZwY2CqqoyLlHBgZGdhXVxYVYu7vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx87Dm4aIg3lnX01goZmHjItzZWBeWFdYVWe0ycC8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIyrR+cWpdUVBCXIyCf4J9b2ZbWFRVVVSJwsDAurq9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8LBkl5STUhLQVV2aW5zb2hnXVhUVlNgqcC4ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xq9uSUZESEBNZFlgZ2ZiaGRZU1JbjL+/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpmZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8LXjbq+usO1uce3nGBBQEU7SlxTWGFhYGdoXFJTfrTFvMG/vMS3tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHWqy73HuLm3rbePUEBBOExYU1NdX15laF1TYaHByMPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncWtzZmJtYFxUSUtKREpDQ0c+OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE16xygL3Iz8LAt621rX1PPzhNVVJTXmBbYWJeVYy4vcfLx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKWbnKu0tHMysS1ur+ugkw8TFdPVF9gWVpbVm+3vcDDzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhHBypszMy83KxsLCyb51R0deUFJaYlZRUlyiwr/FwMrJwsPDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7ua3bwr62vsC+vrqmnKqzt8TApXZ0d53ExsvIwcPAv8nLpmxLXVJQVmZOSlmPxMDAwb/Kx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCmJdwd3yYvr/GwLi/vL3Ew7yodGZYVmNwTVuQwMS8vb+/w8K+vse8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVleYE5TW1xvcnaCoLi3wrqzure6vL66vbGNbmZ0hG+Zv8TCvbu+urq4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVGx1h6awt765srWxu7i7tbnAr592eZqtvcPFw8C8v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNoZdfU0NZVUhialVORElkjqGsr7a6tbOxq7u4uLS4wbu7gnWbt7zBxsK+ubm1raWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve292cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9tTUpAZVlCUHiBk2dMQl2CsLWztbK0r6y7ubi2ub/Ct411hK61uru4tbKxrayfpKannaOlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIV7V0VCUYhYSUpYeI2BYUBWpLmztLOwsa2wubi2u7e6vrGsqqSurbiuqaqsq6OooZ2dnZeXoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUZ0w/VHlxTklJS2idflhFWLO7sayzr66srba2srS1rqiinZubm5ynp56fqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZFU6GEUFdJS19JWItgZWaEr7WqsrSuqquvsLKzraWckJaSjpefnqGgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUmRNSkhHT1JOSk5IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMa/y55OQXWcbk9tSk1jZnZ0YF1ic5Gyr66ztaqmrKuim5mUjZCVlpiXm5+hoZudpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotWUktmo1hmfW9yW1FrY1xnYmBskbSwsLispqGcnZqUl5qZj42QlZGLjY2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOLeFRqcXd2b2R3dlhXYmBkaVtbVmetrqyvp5+eoqCWkJOboJuYl5GSn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbVpRYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35ugnBgY1dMW1JaTExRWVJIT01HmqyqqaSfn5mSkZOYmJaVlYyIio6VnZydnZ6WnpqmoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpuIYVdeZWBXTVFGPT9AQ0Q/PkJRd6mtqaqln56eoqOdnp2anJuUk5SUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6Odq6e2sq2isKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLWyqrqyrru3v7u6q7itq6q4urW8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWlmXFRJREA/SoeepJiDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURBRlF3sq+nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjqmVDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzMrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFxsHGyszN0NHG0M7OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBwaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsm9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCtru7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nBu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAycPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXt3cnRmaVphbm1aXFhSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7u9xrvDurO8xcTCw7e/tba+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRUdLQUVCRkpAOTo2NDc4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2rraVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK9t7zGwcO8ta6ytbq/tMS3u7WruL2+wL2xurawtrqzxby2rru/tbe0xby+wsXAw8XGx8vFwMXGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7PCurDAsb68vLa8x7nCt62qqLCywLa4vbCxqLGztbu8q661pq62r7uysKq5sK27rru4u8DAvrnDv8bDxcG8xsLIyrjFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTc1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0vK+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqWot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/w8DAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpuimJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmaCfnpmdn6WamaOcm56wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKivs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV6dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZkXmFWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbCurLSeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendyZWFcWl1YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaqeqKKeraypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbnIiBcoiDe3RpaWpsZ2prbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboampq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMko2WlZCeoqCjnZujlZugo6GXoaijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaedmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xqpF+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio5ydl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoKKWlJiYlaKmmY2ZpKaopqGgtLKnsrehnKK2rKmtpLKyprW8taursaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20t8Cvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmJ+jnpCTmJaFjYKUfn5ziY56kIeTkJCcm5qakZaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTVJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraehppKdpraso6CPlZaSj354fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWMfYmBkY2Pl5qYk4uQiZ2In5iHiJaemqGgl6euqa2oqJ6XrbOipq2ZrKuYqLSiqa2jk350bl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyDiYiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNzdX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXuVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAcmhhXV1KV1BSSEtYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS05PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fX57dm90dIWCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVMTkhNSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo62qqLWvrqy0v6u8w7+lopmVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98c318cXBudW2Cfnd5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSEhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorp6ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnGGfId8dIytjomAZ2diam5ybXCDdWlwWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhJRkpHPkJBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjXp3iH6JiI5zipePg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl4a25pXXaHfId8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GFgneHf3t2hX1udnVmgJSOhomIh4iHoauilomOmH96gol6eW9na3h+en5zbGVeWltdal1hZl9ZT0tOV1JRSVBKRE5HQ0pEQkFEREE7Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoigloaSiY6PlqS1qZuNlaKDh5ODfX9ramt8gIGCc2JeZF9bZ2tcbGxeV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYpKKmtbCdkZmoiJaPjYGIbHNyfH99cWhfXWFfYWdkYGdmW1FFSktQT0lJTEZGTENITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG58YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2jnpCjoauvrLK1opSkqoiZiZKKlXl6fYV/aGFoXGViXWRjXmdmX1pPRElIU05GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6iaqa+tsrm3uKebtqmMpY6Rk5+GeIKDdVpiZFZmYWFjX2BmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe3wbW+r7d0sbOlusWjsMa5sbOxtKiktbaqsaCilpqikqWwraatq6ekmKCstLuiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKawqq29sL27wsKsmbqolK6Pl5iriX2CfWtXY2JZamVqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZWKgYSBinp8ioeGfIqDgYqDlX13eXVlT1xkR0VMOlFjYVteU0Y/O0hQRFtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wLy3tbu7tr20urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfo5Sip7G0p7KzvbbBvtPJydPGwsXMwsrDwL69v7u8t7SvuLe2w7rGvcPIsJ65qaGrjqSntomAf3JgYmJeWGFfaWdSWGBWUVVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLS0hGSEhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqDpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrGwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZf3psXmFcWV1hWmNjUVxgU1BLQ0JFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmlimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+VkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwp7O01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3C0NK4sMO8xLmltrrDooJvZF1dXllgWFllWlFdV09PQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZeMm5uXi42VkZqOfYmLhI6KiouQh3uEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtteHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5uRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdLRxdLWxcDOx8fCqL63z556b2ZeYl5XX1NdWk9QVFBOSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqCLjJmTk4yLk4+WhHmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ2Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NTX1cnU2s3J19fRyqzDw8uMc29jYF9YVFlTXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5OZio2IiIuJfoN4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDxBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGubbGzdLQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eHdvZV1aUlZRWldGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoKJhoWJgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1NvX09nb1s/b2tHWydTLlXp7aWhcWlBTVF1IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEmI6Hi36GhoB3gnlue3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJCKjZGCjIWJiIGGkJGenJmJhYuBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hXt+gZGJhIV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKOcfYmEfYlyjIp+c6aanJiThXuOkIiEaEdwoKSdjIuQkoWJipGSlY+cmpKUkZaNi5WfnZSglJGNjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Ozw2Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZudlJKAi4h/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuPj41bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaSnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGe3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZudopKpr5+RlJCNjoiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ6Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMC+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rPg3OAaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5SWlJCLmJmWoMCOo8m4q5qipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe9tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+krbOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZepo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi4+VjYqMl5iSnZqzlpWrnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzt6vCyMS1ur27xcjHwtGhxsnNzcTW1tDL1KJxfGleW1RfUlBGRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKf4Fzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYmpeXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIiPl42LlZeUkZqWnaeasZqRq52OmY+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVpgW05LQktAREY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm5+qm6GblZ6vs6eLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefmJOZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6ot7XJw762zrLFvsS8s9HJyMG1dXltXVlcalNNSUNMS0pKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHmNoZaompqYur7HyMrC0sjKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6yttK22taCfrp6mopijs7ypm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnZ+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllXXVtMS01KR0RDSUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY2Xjp6SiYp/iJ+ThHeFf5V+f5CIipB/laGarqajmMK9yMPIxdPMzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdqre3qaSvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmJaZlaGkqKaetqupurvEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzg1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEallJyWoZeplo2Qg4elkoiBh4KchIOVkJCUjpqin6++rqHGvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFBRO0dLSEZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eYoKKor5mQl4eLp5aOiJKFn4iEnZeOnqCao6S1yLSpxrrDw8jKyMfMzsa+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSqqaaurJmkrqWlqKy6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrura+s7Ktvbm2oKOnqKWnnJysqamMZGZhX1JLTEdHTkpWTD1NRE1JS0FDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRauVnKGfu66ZlJ6Mk6qbkZKTiaqNh6KejKStlKOjtsa9tMG6wcLHyMXCzsjBvbmyr7m0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKqqvbynrLyzt73GvLa1t8Cvvb+zqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjKShlJyinqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLSysp6coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJabmo+qlpanppWtrJmiq7bEwru+t8HCwMfEvs3Hu725srC4s7/DyLW/r7y2urempKurrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdl42VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbkqWkmpissbayqqWpraycmKChko6QlqmflGlkWmFdT0pHS09MSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqauXtrCjqrK1xMK9v7bAwrvIwr7KyLa4tbSxs7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqWllpWcmYuPkZOkn4liZVtkYExJSkpPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6ukoKOframsnbuwqKy1scjDwcKzwsS9xsO8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLigoaSSrq+spaafkqGelZ6PkI2VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+On6GTi6assKWmopygnpOSmpSFi5KNnJ6AYmZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZWyq6eipbKsrqm7sqywtbTGv8TEtcDEvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlJWTo6C3oqSllq2xsqWqpqGempqalpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6CZnpaMj5mQgYaWiZSfeWRpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaqdua+ro6q0t7Gwubevtri3xL3Dx728w8HHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFtblhRUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaefnKGpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCwMC4xL3BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+oo52UoZibqLWpl5mSkp6ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWXlICPlIV7j5KDjJZmbHJocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa+zuaamsLfFt7G2vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubapra6wp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmau4o5eTkY+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqlo6KgmZaSk5Z7i5CFe4yLg4uSa254bnV8YUZgallJSFlaPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6utsbmVl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoKyom5ydm5SquJuUjo6LmJyimJCXpqGfloSSlpCdnJiWloiXkJebqJ2koJKWkZGXdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3v72vq7OznKCnsK2lprClnrK1rauysKypqLS5rLSytayzrKmsqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmZqSpLSZj4mNh5GioJWNlJ2glJOFj5SSnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoamvpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpaWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnZirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6iZo5iYj6CnmIaDjoqLnqGPi4yWnI+PhoeQlZ+dlpiVhpaTk5eknJ2ci5GPjop/f4eFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzuEfEY/V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Gts8TDzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Otraulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq5+jnrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp2koqqkrKKeprG3rKyipKKaqKqtqZyhpaSjmKCZlY+YnZOBgpCIhZygjYuOjJmPkIuEjZijm5KRm4yTkpKUopmbmouNi4t8hoGBg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SiqrCXqqmttau2saukq6qpvMDAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsa6tq6yntqqlra+rua+osbGusau1qra1p7S2q6ykqaqco52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqSjn5mYn5GOj5mNfoeMh4SenoiFiouPjpCNhIaVopqOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC/vbu8w766w8HAv6+ys7K1vbzCsrKzq7OppbWppa2zs7mvo662sa+xuaq4rqqutqyqnqqrn6Ogtq2ooZ6vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoaCop56nm5mqsKiin6yhoZKhoqOmmJqopZeXmJ2PioeViHyNhoWEpJeFgoKMh4+OkYSFlKCXiJGdkJORjZGclZePioWGeHSBf311eHqAenR0emmCh6N1aV5lbIJ1Z4iLfVJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE86VkI0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHDvcC+ub6/vMm8wrmwsLWyury5wbO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd9enVxcX1ohnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsJmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur63rbm2v62is6aqq6+1uLSqnru7qLK/srqgr7S2qauerbCinKWoqaKenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOpopqZo6OVlpOeoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enFwcHN4aYF0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTV1ebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk8MlBbPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wr6wtL63xLbDsq+6srPAtru+uKm5uL6rpLWnqKqwrbmwqZq6vKSuv7S0oa63taemp7CyoJ+kpqegpZmfraionqCqr6egppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhpb3Bxb2p/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBaWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8K6sbW9t7+7v6+svbC0v7K9w7qpu7u4p6i2qKersKyzsKaavLekq7u1rp+wuK+ppaavsZuhpKCjo6GWm7CmoZ6ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImKj4V6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZWxsbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5Xl5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhELjwyYlYsMpWioZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6uLGzubi6uLqvrsCztLiwv8G4rL26taais6qnqbKrrbGhm8C2pKe1taiesrypqKaor6yZo6eco6aUmKKypZmeo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2TkqOopJCIio6FeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhpamdmb4ZnaGlkZmlqYGliamdbZXtjYFNzVFxbU0tKR0lPU0AhKmleakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWZPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBt7Gusre2uLe2raq9s6+ysb2/uK68vLGln7arpaWzqaqun57Bq6ilsLKprLW7nqmqq7Gll56qnaakkZmnraKYnqSpoZyinZegnae2pq+qr6GhnZ2hlKCln6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqKiHmFd4KCgZyIi4KJfH+EiIaFkYSWlY+Oj5GRkYySe4OVjYVzfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0FmSCU1m6OfkIusoZiYoJals7Ghsb23obHGvLqxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrrS2urawub6tpp61q6CgsKSrrp2jwaCxo66wrreutZ6tr6ytopmcp6mknpWbqKWfmaSiqJ2aoJuUnJ2ssKa5qK6ioZqanZido5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY97gnOBgYqYhYd8iYmEhYqMipOEk5ySko+QkZaOkICAjI2DcIB+ZnhtaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWSBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKhmo2OsJ2ak6GZqbKvn7i/tqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqaybqL+YraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+npKCYmZmdoI9roZaYnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQgGeGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKanmay7laalr7K3ra6lqa2rrKWhn5ygp6abl6GlpZubp6edk56fmJCep6qjta+jo6OclpeYl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIg3J4jI6FiKF2iY1pl4hmfXJ4oW+Ih4R+jXx/oaCgmYB7h550iI52m4psh4GCbWhlY3pscWFUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprK1rq+ztquppbGtpbWznK21trSlp6mzsa2yqK+fq6GyqaCjopqhopuutJWjpKW2vKatp6uqrKiloaCYoKajmZmmoqSYnKSplpSjnJSTpKWmobejo6CkmJSTmJOciK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2lk4CmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm5+drqyUnaGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5qUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKUY21tp21bhKBFaGeHlkV1nGB9Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZSCrKelnqOlqrK3rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZeam62llpuhnrSzoauboq2toJ6ZlqChqJyYnqSfnJmhp6SPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKm6tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2soZqZo6i0rqKpj6moqpuelZegpKeanpyin5ugo6WjlpuemJmdoqqbpZqcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QaWhkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltaiku7fBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqetsKijn4+soqiWnpeboaWhmKKhoaGaoqKnm56hnpWZm6agm6eVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnuFf6Rvm6qma4aEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRTUWpjZlhBT2tfbGhPVUdJOT1WUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2hqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq6+mopaTrJ+lkpSgm6Smn5SapaahmqOfrZqhn56QlpuhnZyllZ2VmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZiK6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyuri0uL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyupqGVmqmfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52gmJmclpeioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFpMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC3sbW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adl5unpp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09iUmtlYmxaY11gcHtjVFpRPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZSbrKmXjJOlmKSsopGWqrGjoJ6nq7GZoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbGrpKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKNnKOel52akJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5yfqaOznqOljqeilaKanJeVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9iWiDeW15Y4uscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL2moaqXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoamnp6OpoZGtnpeknpeXl52ej7ColJunoY5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE50TUVXXWZgTFtYZmNfT1ttdWlxUk9ERU08SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+p6mmlZSclaCak5elqaiQnZGPl5ywsr+sm6edp6KJk5Gpmqijm5uroKOam6OnraOfq6KasJuVp6CWlZ2fnZexpJihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkZOYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZHd9d2twem1gY11wZ01ZWWZpYFdacHpubGZTT0ZTOU9aTVJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwZ6rpJWSnJeemJOUop+eoqeTkZmop7LDr5qrnKqfj5aWqZ2qnJygrJihm52ipbCnoqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWOm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6j4p8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4eCa3RkeWZgamVjZGZrWWt7cGlqXFJMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrb6grKKQkZ6amZSRlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKqvqqajq6Ktm5+goZmknpyena+jmJ+ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaJ3a2qLmKOemHNsbnqEjYd6WGVehYJebIqJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY11STlhKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOco6qokp6hnqCqsaqro6qgqZumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp99lZiJnsC9gpadnY2dwsF7gnuSjJrDwH1qpbFvjIBvynp/m3eSg46BdnqBf3lxen+HcXiFjZN5bXaTY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq62/wLGgqa+pl5KfnaKZoaOqo5OgoZ6era+prKajo6ehpaaeramSpJupramcnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoI6Ns2qErnR9loe4YYOtWaPNbo91e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+dna6wqKupnKenpKKrkq20l6aiqqmdo6elobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJealqinr6yop6mel5Wao6KRlKGtm52mo6+so6u0qrrNsa2mrquWlJydopifrqydlqCZnp+qs6mqqpurqqSjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKajkJqiqKCgpZyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqglJ2fp6yspK6arKqjoquis66iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZWpzcWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKxs6qtqJOJl5ykmqGjr6aYoZWZnKWmq5uwnq2op56so7etobK5r52br6ezs7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppqjp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa6pramRh5Ccp5yipJyll56ZmpqmpKmar6KupaaYr6W8raG3t62dnbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4aXlzboB0XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKmRlJetoKCepqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpqKVmpqcmZuZp6WmmKyorqOlm66nvqyUvbCsn6Kws7mrtKeaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2J+dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrbilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKafp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamjn4uAjpuan6aekpWampSamqalpJqprKyjpKCqqL+kl8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmOnX5kc35ihHh0gHxhamdxbWZlZU9VZFxBVF8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+ooo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuRmpipoKGZqK6npaajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwq5eMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5qXknuHmZGmm5KOkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2VkgI2Tj6KYmJmSl599h46VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epqqhn6OjoJGLpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkI6VhYGkmpeVjYuSkoqPhoR9Z4p/dIJ2dIeLcKdte5SRk5KBgY6QkI+dlKGWmZeig4iUjXJpkHdwi3h3fHpqbGRkb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqykoJmnnp6TlaOWqJqomZSmoaOQm6iZobW6p6uYmpCNfIGUi6CUipSRlZCQlJelkJ+aqqCctqOdp6y3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSImId6cpZzeop/cnx/am9kXnBqYFtfWW5jUGBlUFs6R0dFPjI9PTcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj565tqSlmJuNiXmCk4uak4mVkpSQjZKXoo2enqmenrikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJWLkZyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmHipSSi1p1lZBoaI+OcnqmmZlleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk1OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUEo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56NrJqilKehno6XkZ6Eda6PiKaaqJGXpIiburSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgZGXloSZmWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH6Si4ODmWuOjYVseHtxcWdkeG5qbGpbZWtqZnRcX0hUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1hbWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1no+Dnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6Kbg5qAjI6FiplwjpOFaHd0fHdoaHVxZ2hrXmRvbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYhqK5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onaAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWWfbFtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWiqJKhoJ+mm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipiomJmakYelsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwcpOIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnJizlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRopObmoyKqKilno+Wh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU43VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJyIj6ijoJmLkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoGdbXJ9lG+Zc2qkXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVWQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgIiYlJ+ahI6pnJqUiouKfINshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Emm94epdrm3t3l3NtqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYUhXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6OiW9/hpCTkmyXk3yIkZGjlYOOqpqUkouFiXmDdoiAboKfh3eAk4aImaKWepOipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Wg66hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpGWioBvTGajknCbh3Kke3l0YYOBa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhxUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WnVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqeQgKGskIWQioKKfYCAjnNoj6WEfYaUjYiYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpygfKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlbYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hFtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpJyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqYaOkpyQiJ6eh4ybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J2gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGg36ThIOGioF6gIOLm5+Pgqehh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoF7coKAeH99f4V7bYKMhXx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npaioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXhoODkH+AhoSGfIaDjZudkoeqn4NyipCGk5GLnZF9jXqqhI2SmJaPnJeHh5umn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiJOanoKOl36GjYJvd4VxdWF+go+GdYuYgYOPgoaEfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiImMfG9rfoF8bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pngIBsc4BrbHRveW+EeW2GgHaCgH2EdnGCjYd+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlaW1ti4met5qho5+SkZaXi5qfn557eJ6mkZuKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2Bl4iBiI58fYWEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gJCamJKMmqOho5qXkZt+jYR4gIOOh6B/fYyNj3yYpKChk5mQkKeNkIGbkYmSl5t9kpJ+ho2BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfH1weHuLhHp6kYyDlqWTi4aQfIaGh4V2goSIiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrY2xoZX+Ba219aG9xa314hnpri4FzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmpueYmNnrKSpaWcjpCYj4adoZudfHakoI6Xf42iioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlaCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCiYV2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWh9g2xodGhsb2mAfIF5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamJjdVaDaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDe4CDgXh0eHpzfYCEf4mLgGRefYuVh36Fh3R9fol/fZeEl5OWjKOhmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF5cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dXiAfYaAfIOMhIyUpI95hIJ0iYd9gHR2gYiEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2plamNod4huZmxoamxogXx7d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2V2Z25sYXloa317eHBhd22LgJmZqqCjqJ2Ki5KGip6LlZh9d66YjJd9npSRlpSId357inx7gHZ3f4BwdHN7b4V9gYCKf3xhXH6PkYZ/hIRzeoCGeo+Rh5KRm5KlnJWCfoF9jouSpImOio2Ymo2GkZiTlo6KiIySnJOQjIxug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiISMlaiMe4h8fouFeH5xcICFg2NoeXR1cHxiXnBga3RecGp7eXhrc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GNb2RpZ2RpaIB6d3RujoV0gYKDe3WCiYV3hXx4hIV6gIl3f4t7e3J5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlJKOh6CNlpOQgHR7doV3eH9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYiKkJGJnJahnJiVhZeIaoSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJh7kY2PjZqSfIp/gm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2uBg4FecnNycXB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk21gZmZfZ2uBdXFycIuAdX+DgHh1gIuAeIV/d4eGd4OFe4aMf3t2ioBqcWN8Y4Z8b3FtdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOQn3WLn5SThouajJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHKKhYmOiJyan5qWlICTfmiFnIdnhaCHkoORg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx7iX2CjJCenYV8fHeCjH13cWpsgYJ5YHhvbWxydFZeb2JyYF9sbnlwZ3BmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4Z3Jqg2CIfm9va3pgam50f3RfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN1g6CCk3eVkZmbkJl7lHOFkJ+hk5SQipOblIZ+lpaIjY2IkY2InH+OgHd6jH6Ii4qcnJ2alZN6jXZniZGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenloc2pzi4+JgYWFfZWLa35+boCLfouHfYR6gY+VmpqKfHZ4g5B5c21mcICDbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY194YGBWa19edlBOS2BnY116cYl0XFxldmBhZWWPZGBlYVhpc3NtanF2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WWxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76Fza3WDdYSihZJvlpCVoJWcgZFxhoujl4mOlouQnZaDgJWQhYmPgJKKiZZ+h3p1f4l4hoSNnJuYmI6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlZOZkHRzeIeNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHhNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtzd4t9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRwgFdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXaKmoiNaZiPj52Vk4GJcYWJoI2Ei5aKjJiUfI2TiIOJj3uRi4WPgn92eIODcoeCk5uWlJiGjHWHf3CEgomGmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQlohvcXqMhnVscWxyeIFfdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hjaVhtVlx1TEtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm5pdHeKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHd1eXiTdG54en1YeYVxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNtb2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY57kI1+iYV6dHuCenCGgJaZjpOUgYh1g4Z2g3+KkpyfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyOkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SIfm9fcnCFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm95jH51bm9rbHp9Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xcpa8xIR2cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4OCcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi498aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCEg39qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGYjI+MfW5te4l9d3RvaGh9dmRccWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aF9lcntaYHJ8eWdwemFlZY6xsndKYlqk2dCXcXuRi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qHfGV9foN2Y3BzgGh4cG90mIyFgop7dniAhHmBalxwfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXFgWXdaWXFuTlhyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcHd/h25sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaHhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3duiIRsdXt0ZnmCg6eMg4+LhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4KKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBzgG9bbH50eIqCi3uGgHyIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZmX3RwW1lUb2RZZXB5WmheX2dtZ2psaW93fY5saYKEfnlugHt8gH+CenWCgYyThXCAi253foB7e4iTiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iISlh4GHjYl+bn51f4B8i5mHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnSLgYZ3h3WCiXp4cm6JgI6AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQGFkW2B2YVx0bVhXU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g35+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ+c4R4f5GQgniWjZSPh4KIeomJbHh5f3Voe2lrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJzioSCfYNwhop3eHBwg4KMfn15fnx1joWCdWlxaWyHgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxjcV5dd2hVV1V3XVtlbmhWa15hamdlb29pcHZ7k25piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIjmZxg29ndW5bbX2AkJOAgXmSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdISHf4B5a4iGc3lrdH+Dg316fXh7couAfHJndGVtioNtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R1kYJ3cGdefYJ5i4llcYFranFjWGx7hpyIgoJzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWpscXd9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXOAi3yBbm+Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwcneGeG6VinR/end+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYqDZnF9aGprWlZveIqkgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl0cm9oemFqbWBtdmpna2t5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0e4t7gmZ1h31tcWd1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxZZWNedGZtZHFmcm90gHdwmoV2f353f3yFh311c4KIf5SCbnN4enpzc4WHiYiEeIB9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3FhZ2tnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt6kIR2mHyHhoKGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcneKe35idYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExPcEdee2ZhTVV0Y0pOU1dganZ9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVHNXTFh1ZFpfa2BcWmNlX3dmbWJwaXNucX50dJmBd3+Ad39+hoR6fXWChH6XhW5ydHt6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIWEbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1paU2JuZVtYYXR7amhtaV9iV19aaYBqa2+AZ2xhaHl5a3R0dG6FgXp/fXZ1bnpoanlqX2VuaYF3j4RnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW253ZHBziHx5YnOAcGdqeHNya3d2dHdjg3t+d3ZwZGNjbnx9a2xWamNnU0tsaFBHUmxFYXhmYU1TcV1JTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlIF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1pZWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Fthnt+fXl2cmx6aGl3Zl1kc2h6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwc2JxcoV8dGRygGxhbHpvamh5d3RxZoV1enp1cGRhZG5zfmpsVWpeXlRMc2NRR1diR2J2ZmFLVG9XSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUhXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXh6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrX11dc4VoWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYV5f4B5d25vdGVpdGVbZ3VmdnaRel9dUmZmaoKBc31hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2RabnBhcHGCfHNmcoBkXm52aWNmeXp0bW6BdXN8c3FiXmZub31lalRpWVlUTnhfUkpaWUhidGNhSVRtU0lMWlZpbHJ7Ymxsc2JhWVpbYXZcU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpZV2hjbWVcXHGJZVNybltaWFhgbHZkaXVqal5abXNxbHRzdGqGfH6AfHdvbmxkaXFjW2pyZHR2j3NbVlNkYHF/fnGBXGFjXVNaYFxjkp9lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZXVnXmJaYWdcXndoV2Jdb2hhd2Fbe3ZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXW2ptYnBzgXpzZm9+W2BwcWJeaXB8bGtzfnJxeGtwYFxlbG17YWhUZ1VXUlB2W1NQWlJIY3NiYEdValBIT1pVa2trfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LaWNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1JdW1VnYmxsW1xxjGRPb25dVlhVZ2l0aGJ0ZWVdWm51bnB1dXprh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxdIF2c2JtdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF9nVGVVVlBVblhRV1RQSGVyX2FGV2lOSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2hRWWZUU0haWlBOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaHZ2f35tg4B+hpd7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Ld3hueoxgZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX15UZ2Bsb1xebo5oTmltYFRWU29mc2tleGRlXVlwdG1yenhzbYh7gHece3prYWVsbV5gb2plcHl+Z1pWWGBrd3t7b4NeYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3SBc3JeaW1TZXBlVWJuYXlicHZ7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWXV1XV9mbWhYYmFbXo5xY2dqd3FzbWh2dHmDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMC8sgKSgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwcHBh+qaSkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQio+Mjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4qGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEiYeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpKTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpOTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZGQkZGSjZCSkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+Pj4+Ij5B9jJCQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+OjnuNjHaKj46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIyOc4eKc4WOjI2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4NugoJwf4iFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1cWZtanFzb2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdsZ2lmcm5oZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxlZl5ybF1eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QU2FiWWtkVFFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BZaGhiaWJRT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQ0ZKTWNya2dwalVOTUxNT09PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkA/QEJQbHNtaXNxX09LS1JMSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz49QklCPE9pcG1kcnRmRUpeVEZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7OztBWVE+RWZtaWBwcWlSYWZFRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTpHW1NTY2pqbnFtamhtVD5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODpNY2NpbGpyb21rbGNAPUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT5dbW9wbXFubGtsTzs+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT8+Q0tmcnFvcG5qa108Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg8OUtrcm9wbmtnRzs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXZNNzg5OEpscnJwbVM7PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l7d1Y8Pj89PUpmd21SPT0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BBPkV0Vjs8PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVNQUNFQEBBTnZqSEBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcEJERURDWHWGiIl+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhEQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktHRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozw9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXRzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBREFPUE1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1FRVU9MUlNUV1hUVFhSTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01LSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHBzd3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETUdBREtLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLRElNTFBNT05PT05LSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTUhERUdDQkBCRD1CQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSFNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0NCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0tPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0hJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkM/QEI/PURFRkRDREJFRUVGQkVGSENESkVFSkxNS0xMR0dNSkdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWx2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXW1tcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtLSktLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MS0hKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdISktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tNTEpKR0RKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0tLTk5VTk9LS0xHRktQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f29nb1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWFFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltZWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hRVFVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVtcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV5iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UUlhTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWFlZWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUVdWV1ZXVlNWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWlpeXV5eYVxbW1pcYGFeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW15gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fXx8fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2QRigqKioqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkJQ7FhoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJwcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXFycnFxcXBwcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwdXJwcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXF6cW+Ldm9wcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcY1zc5h4cHFxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnFwl3t2oH9wcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Sfgnukh3F0dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHd3d3d4f6eMiKaQd3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t7fH1+qZKGpZV6e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fHx/fIKrnIqilX19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgICAgIKAmq+op6eVf39/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIWspqWvpp+Cf35/fn5+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn5/gX9+j6mZoqqbo49/gH5/gH+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBg4OCgYGfoZOfpJifmICAhI6Cf4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGDi4uFgZidip2qm52ahIibkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GFlZuMkp2Tna6Zk56fn5qIh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKNpaqsqaOdpZmdpKKdkIeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOTpqihnJ+am56fnpaEhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoSRl5aYnZmcnpyajICAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4ONkpaal5ugnZOEg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mXiISChYaQlpmXnJ+biIGEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhIqTmZWanJCCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGCg4eSjZGOg4GBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgIGCgISJiIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODgoSDgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fn1/g4SDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Ag4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/f4CBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYOCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWCiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GAfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjoyIh4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoGAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkoyMjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjI2OjY2HhIaGhYSEhIOCg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5/foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1+gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIuNi4mHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiYuHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fX9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6PjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhYWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhICAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXW19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVybu9vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slcObvLiZtLOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaafqI6AjcWdmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ajKOJrNa6mKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5m4urrZulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqClpJyWp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg1aS0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNfK2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nDj6Gfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTk6irop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqrjY+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1sC/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyBc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWmpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo57amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJibm5ycoZ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJSZmZiVm6aWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4SMlouMipGci46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomQjpaCjH6OkoyIhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9ho2Zm5CEjHuNio+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHqJlZGQgoVphoWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNm5aLkYh/X4aFiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqCZnZuioZWQm6yRk5uYe1mGj4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hmqCsio6hn3ZZg5mNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKKmpIWGp6N0W3OgmZ2Yn6GiqaegoqKurKuqp62vqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhpZyCgqGicmNmmZ+elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6WSgH6dnXFoX42ioZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGuinx+pZ5valyEpKWinp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66ruYN3fbKmbGlYfqWio5qcnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLh6cnGwr2dmVIGlnp+WlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSud25lrLdrYFKNraWlnZekpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb62qX51aaK2dWBWnLWurqqqp6ynp6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+t6aJfn2Vo4Rtaqq8rK+vtKmqpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DybCWiHuGjJGJeYChuLCfmrCurKStsLSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTEubTAt7S7xcudgnhmdoSGfGx8hqa2qpmit7CmsLu1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysfEw8TCxL64vcq9iW5hU2J9fmlVZ3CNs6qdprSzrLLAtbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMfKzsrJx8jHv8bLpHleTkhUd3VeRFlieae3wL6+uay5wbq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfBzNXXzcvKzsXJvIprUEU/TnBoWD1OXGyVxMzGxrCZusS7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIxsnV29XNycnFyad2WkxXRUpoXVY9SVZje7zQxrCQibnCu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDy9nTyMPCwcaiaUxilWpIYVZYQU1VXmmv1r2TdoW8uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrRwb3P07y0vL29rmxGgL6PSmBXWkRUX1tfosaje2iTw7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2lmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8LWi7q/wtm5oaWvtLh3SYOrjkxoZWNCVXNgV5GfgmxlqMa/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHOpy77czZqPlqKwgU1xfnBXf3hxTlaBZVV4dmtjbsHGxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2Ktwf7zI1N6yhIWPmX1VY2ZWcpmCfm5VdGNaY2JhXIXSx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vcfKysPHydKUbHGt0dDb1JJ2fH90XmJdTpWlg4SJVF1dXFlZWGGq0snHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvG08O6vrzEvre8wL/J0MfIysrAgm5vo8vLz+C4c2prZ2BgV1WooYCDkl5YWVZRVVJ5xsvJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uarbw762vsC+vreimKavs8LAo3RydJnEx8rW14ZXVVFPUEVbn5F5g4lnWlRPTk9WnMnLxsLAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xrVsq828tbnAvKd6bGduanJ/lZZtdHeVvb/GwdWoVUJAPkI5Wol9cX9/aVtTTExOdrfAwcK+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfX1pTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM6xdoCyvLW2waGFaVpfX0xSW1ttbnJ9nbi3wri9u3NENTU5NFJyampzcGRfV0xLXKDAurm3tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLKpoR3iqGvtJhoY2ZVWWBKSk1QVGpzhKOvt765s7aeaDcwNTNGXVVeZGJgYl1PTHa0v7iyrrK8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeIe3aNoZReU0JZVEhibFdQRklji5+qr7a6tbSyrZRQMzExQVBGUVdYWGBgUFyYubq0raWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWdYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI5rTkpAaFhCT3eDlmxMQld+sLSztbK0r66td0wwMD9FO0VWV1FYXVF8sLKxrKyepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWNiYR5VkZBUohXSkpWdoyAYT9Vp7iztLKwsa2wuaR7QC0+WnuXp6KSc1Valausq6OnoJ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmVaE1AVnpuT0lJTGaaf1dFVa+7sayzr66srbW3oGZnk6mnn5qbnqB/d52ep6mfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqmvWRFVaKDUFlJS2FKWIljZmaBrLWqsrSuqqqusK2rsKecj5aRjZaeoKCfmqOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMbAyppOQnedbk9vS05iZnVyYF9mdI2wr66ztaqmq6qinJiSjI+UlZaXmp6ioZucpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxohXUktmol5pfnJ2WVJrY11pZmVqi7SwsLispqCbnZmUl5mYjo2QlJCKjY2TmKKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqONeVVscnV1bWJ1clhZYF9kaV1gWGKsrqyvp5+doZ+WkJObn5qYlpGSnpuho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35vgW5gZFdNW1JYS0tRV1FJUk9Dl6yqqaSfnpiSkpOYl5WUlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5yIYVdfZmBWTU9FPD4/Q0M+PUJRd6itqaqln52doqOdn52Zm5uTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BeZV9QRUU6REBGPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCjoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6q7itq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpYFVORD5KXH1wYkE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIREA/TIqhqZqDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPx8q/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiU0tJREI/RFaz0r2ysKacnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURAR1F5sq6nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RViCqqifmJWXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw9ODc4NTU7PkA9OTw8ODs+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF6SkhDPViMoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1NLV1crAysLFzMLIycPMw8XIysrPys3M0M7TzMbIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PDtaqYpaGZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFBCO0M+OzY3Ojg6OjU3PT1BPDo8PDk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son66VeG9zdYKSmY2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaXH08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrGyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fWiDhKWrk42Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb3B9udHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxfen6kkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvDurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzszBxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraVfZXWGk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7WruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCZW2lxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx7+5uLWwq62nnqKpp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCxqLKztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupaSnp5qgpKGanKWsrqSooquqrauwo6afqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr+/xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbYiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpZ6boaWUnqWbmJGho6qjo6ClpqemraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvcC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RIRUtGPD0/PTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqJ+VlZqhlpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8K7ur2XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaeck5SUm5ibopeWkZyioqienJ2lp6KlnKChm5mvrq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKenKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sLu2ur3AuLOxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5SXl6CXmZWXoJ6hnZagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqqs6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFiZWqAk5OJkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqqyejHJxb2BbV1ZWUkdRT0haW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGHj5COmpOVkpybo5yboaipq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcoKGgm5SQjJmOjJCMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761s6uvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uPiZKNl5GXmaKgm6CsqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefoqy1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOX+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Sio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WIjIaQipeJlJOYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqupLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI6KlJGUnqGPm5yjoqSYpZeinJWNh5majHSNg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTVJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso6CPlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKPgpeGjZ2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuxopqYhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKRfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkRERElOT2hZTlFTVFVaboNzdn5qaVxVj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuViYiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ6dmIynpJOhoJaen6SAcmhhXF1KV1BSR0pYUk9KTE1SSkpKTFBJTFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyGdG90a3FsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV+cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhtfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnaimXl+hoGFmYWbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMyME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1JRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPRElIU09GSExGSkdFRkhBS0VDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKawqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWU0lHRkxRR0NHSUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaKIlZOWk5STjZCWkoeHe4aBjZaKgISBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauon5WWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7SvuLe2w7rFvcPIsJ65qqKrjqWotomBf3JfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3psXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuJfIGEc3uKg4Z7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLizu721scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydHHzM3C0NK4sMO8xLmltrrEooJvY1xcXlhhWFllWlFdV09PQkJIRUJJO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhI6KiouQh3yEgnB/h4GGe4dyg5GLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKyzp7C2qqy8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56b2ZdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoZ+gqKWqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29jYF9YVFpTXFBKR0lKSkA7OjtFQkQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJOZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZvZV1ZUlZRWlZGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeHF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnqLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbY19jX1dvX09nb1tDb2tHWydTLlXl7aWlbWlBSVF5IQkVJST5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uGgXV6kp6NoHaPdYJ0dYF9dICEb4GPgW+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdW6TlpSVj5iQg4qPlpqXl6Wcl6CXn5OSl6OdmauVkJCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYifl4+IjoqMgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNydHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6emhpZGBUV1ZVTUpETkQ7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bXx9hn5zfpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZeNjJWfnZShlJGNjZCLfpCOjouEiJKVmp+fiYyUkp6Rgot/pZmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHhsamRXYFtUUE5HQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22AfoR9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5bgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmiooaSnZahi4qIjZyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzNDMztfP0dSu1tXY2tja2tfW2dqfb3x1aGdcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4WHiZCSjo2TlImFioqGlpqbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ6Wm4mPh5eXioSOjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U2Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+lrbOzqKOisKyKmrWdo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KWi4+VjYuMl5iSnZm0lpWrnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZGjua6ov7ysrbK5paOnfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFpgW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq5tcG7q6mcsqWkqJSFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcalNNSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy9wbOsu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkq+sq6yXhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXnJWUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8K3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJeXkpalmWWYo56ypZailqytq6ebn6aXmJaZlaGkqaaftqupurzEtaW0tsvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e4tLiyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wfm5aaqJycoaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZeOnqCao6S1yLSpxrrDw8fKyMjMzca+urKuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtra+wb++uLKyw7G5vayjrrSsuKWIm5emm3a+oISYnI6TmZqLrpehnJuXlZufoameqKCZmqmZoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvbm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXBzcjBvbmyr7m0wMLKtcaxwby1uquoraywo6KZqrS6pqmmq6qdqK+no6qqvbynrLyzt73GvLe1uMCwvcCzqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FdYF1KSUZITVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJabmo+qlpanppWtrZmhq7bEwru+t8HCwMfDvc3Hu725sq+4s7/DyLW/r7y2uremo6qsraCgmqqqxKKlqKumnquvrKKpqL64pq29sLe2x7a1ubi/sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWmJdTklIS09MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dNopqjnJ7FrKGfrJ2crp+So56WpaCnqauXtrCiqrK1xMK9v7bAwrvIwr3KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9taWxvLe2tcOys7e6vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqallZWcmIuPkZOkn4liZVtkYExJSktPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6ukoKSframsnbuwqKy1scfDwcKzwsS9xsO8xMq8r7G2rbC1r7/FtbmxsLq1rJqosKmpmp2loafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZmJOipLigoaSSrq+spaefkqGelZ6PkI2UnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbaGZKSUxKU0JDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZWyq6eipLKsrqm7sqywtbTGv8TEtcDEvcjDtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlZWTpKC3oqSllq6ysqaqpqGem5qalpionp6YoZ6vsqKmjZeumaWsl5mepZGbjpOYmoWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBOTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+ro6q0t7Gwubevtri4xb3Dx728w8HGwLnBxsG6qrakrbutwcO4uKqtsruila2wrbKWpaeQqrmqoKewnaqgsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mgmZaSl6aht6mloqKvsbSrsqirn5ugoJuepZuhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUlpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCv8C4xL7Bt6+1qKu3sry/v7WprrG3n5erraitlqeojqe7n6Wts56rorGws6yptrO1va2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5qVjaCmpLSup6GsrK2xp7OtsqmjnJ+oo52ToJibqLWpl5mSkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfR1lmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsHCtbS6xb7MxbjCv7q/usS4wbmytayqure6ur60qq6wtZiYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubepra6xp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWvsbWvo5mdraeal56Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipOSnpqloaGgmZaSk5Z7i5CGe4yKg4uSa254bnZ8YUZhallJSFlbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3ybu0u7u/vrS0t8PBzce7w7y2vr/AuL+8sb2up7q5t7fBtqutsbiUl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbizqa6rsqe4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GorrC1rKSZoKyom5ucm5SpuJyUjo6LmZyimJCXpqGfloSSlpCdnJiWloiWj5ebp5yjoJKWkZGXdoSQh3uFgYSNjG5xd3Z8f11MZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6kra2rp6SwsrOqt7C2n6u1ucm5rsG8wrezsrXCw8/Ev8G9tL3Av7q/vLPEqKm5sLa2v7yvrLOynKCnsK2lprClnrK1rauysKypqLS5rLSyta20rKmrqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqlprmlq7S0pKmrqayvtq6inaOoqpufmZqSpLSaj4mNh5GioJaNlJ6glJOFjpSSnZuYlpWHl5KVmaabn5+NkpGOkXd+joV8fH2HiopydHJ+fX5cU2RvXk5aZl1GRJZbSDtObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqmvpKijsrSxtLWxsaGrrbzLuq7Au8extK20wsPRxcW+wLK+wcK8v7e8xKett6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpqWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaOtrLexsaCooqCrrrCsnZ+nqKmZpJiZj6CnmIaDjomLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjop/f4iGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZitp6KqspypqK+2rLi1rqqlq6q9ybuwvrjDr7Gts8TDzs7Dvr+0wMPEusC0ycSsr7eusrnAv7Surqulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq6CinrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp6koqqkrKKfp7G3rKyipKKbqaqtqZyipaSkmKCZlo+YnZOBgo+IhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmYqOi4t8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqistau2saukq6qpvMDAuLmzvLWms6/EycvRv8G7ucC/w7nBusHErrG1srO7wb6zsa6sq6uotqqlra+rua+osbGusau1qra1p7S2q6ykqaqdo52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjmKSmpqmcoqSjn5mYn5GOj5mOfoeLhoSenoiFi4uOjpCNhIaVo5qOjZuRkpGPkp+XmJaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlFiT0xVVFVQT1hbYlVIUGpUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpaqtmaukrK6ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC+vbu8wr26w8HAv66ysrK1vbzCsrKzqrOopLWopKyzs7mvo662sa+xuaq4rqqutqyrnqqsn6Ogtq2ooZ6vs6G0qp6op6qkqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKmjn6yioZOioqOmmJmppZeXmJ2PioeViH2NhoSEpJaFgoKLho6OkYSFlKCXiJGdkJOQjZGclJaPioWFeHSBf311eHmAe3RzemmCh6N1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHCvb++ub6/vMm8wrmwsLSxuru5wbO0u6y4rKO1pqarsba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKulnpuqoZuSm6CknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn99i4aQj5CEgJOblIWTooyUkouRmpGUh4l+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFQUllLS05xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6apqq+1uLSqnru7qLK/srqgr7S2qayfrrCinKWoqaKenKSxpq+gn6qpqKKqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOqopqapKSVlpSfoZablqasi56RkJGMgouAf46Be5qUjYl8fouFjo+MiYWSmJGHlKOJkpKHkJmPk4GIfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3OObWJqcGBwQVx4a1ZeTlBRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wb6vtL63xLbDsa65srLAtbu+uKm5t72rpLWnp6mwrbmwqZq6vKSuv7S0oa63taenp7CzoJ+kpqegpZmeraeonqCprqegppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWm5+okpiTmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjIyIeYOMhImMjYSHk5qOiZWfiZGVgouWjJB9hHtzb31xc3RgeXhpb3Bxb2p/cmR6bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJQSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i2qKaqsKyzsKaavLekq7u1rp+wuK+ppqevsZuhpKCjo6GWnK+moZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaaqmZycpJWVl5WcjpOXoqmhkImKj4V6hH2EinmOl4qNhnmCh4SIjI6EjJOZjI6WmYqPln6Gl4uPeoB6cHJ3b290X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0tIR1JVRjI5Xl5tUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26taais6qmqLKrrbGhm8C1pKe1taiesryqqKapr6yZo6eco6aUmKKypJmfpKipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmaGUkZSWmY2UkqOopJCJio6FeYR7hIZ9nY2KioZ5gISIiIiRhJSTk4yQlZSNjpR7g5eOi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0tKR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBtrGusra2uLe2rKm9s6+ysb2/uK67vLGln7arpaS0qauun57Cq6ilsLKprLS7nqmqq7GlmJ6qnaakkZmmraKYnqSpoZyinZegnae2pq+qr6GgnZ2hlKCln6GgmZuZnJKZnZSlnayimJadlJONlZeLj5iaqKCRiImLiHmFd4KCgZyIi4KJfH+EiIaFkYOVlY+OkJGRkY2Se4OVjYVzfX1meG9ramxndXNrY2dkZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FnSCU1mqOekIusoZiYoJals7Gisb23obHGu7mxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrbS2urawub6tpp61q6CgsKWrrp6kwqCyo66wrrettZ6tr6ytopmcp6mknpWbqKWfmaWjqJ2aoJuUnJ2tsKa5qK6ioJqanpmeo5qknZeemJuUmqCSqJaqp5qTmpqRi5WZjZSUmamnjo2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2CcIB/ZnluaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GZqbKwn7jAtqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ls7Wxrqmxt7axs7W6p6mftqmdnqmjqq2cqcCZraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+opJ+XmpmeoY9ropaYnHGClpukgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2eGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RlRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOhm6qtq6O9xa+pt8K4vb2tp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKenmay7laalr7K3ra6lqK6rrKWhn5ygp6abl6GlpZubp6edk56fmJCeqKqjta+jo6OblpeYl6OIoY6Smoehh5SdoX+lf6aqnpKRmpGIg3J4jY6FiKF2iY1pl4hmfXN4oW+Ih4R+jXx/oaCfmYB7h550iI52m4psh4GDbGhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk0/R19NRlJWVlFRUldUZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yqK+fq6GyqaCjo5qio5yutZWkpKW2vKasp6qqrKiloaCYoKajmZmmo6SYnKSplpSinJSTpKWmoLajo6CjmJSSl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6qvtrOoqKa1pqe4r52zsraqpaSnsa6usaaqnqeksaShoJ6XnKCer62VnqGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5uUnaGmoqCvop+fo5aWkpeRmIWvamqKjap+Z4SVh61kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaGeHlkV1nGB9aHykp4JZX4uraYCVeHpqpzdKr1tXU21jW0tPWF9cV1Y7TohPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK3rLS9vrC2xLK4u8KnqbCrrqmpsK6ksLqvpKWus6Opuames7Kwo6Wgqq2vrLCmp5+jorCbopuXlZeanK2ml5uhnrSzoauboq2toJ6alqChqJyYnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZCWkJmFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknerZ2uxW6x7j4eUdIhxj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaJuW1NraGBMS1xkWFxaQj6weFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAblZ+UiLOmpqGuqaezrKm7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6OinqiqsqiwqKWen5+vlp+ZlZWWmJ6topqao6i0rqGpj6moqpuelZegpKeanp2jn5ugo6WjlZufmJqdoqqbppmbm6KglpKRk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoN8poKTfJh6qnmNnJB7sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1RamhkUEBYZ1pkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltKikvLfBsLnAsba1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZahq52blqetsKijno+soqiWnpeboaWhmKGhoqGaoqKnm56hnpWZm6agnKeUm5qfoZiPkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20uKqfpp2iqqWyqK2qpJqcmqielZSYmJKSo6igl5Klq6+mopaTrZ+lkpShm6Smn5SapqahmqOfrZqgnp2QlpuhnZyllJyVmaKflZmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6dh5mZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraiyqKqyuri0uL+5t7K2vLWkt7OftKyfn6irn5WntquosbGrrrSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpOQpqyupqCVmamfoo+RopmopaCVmaWonZyknq2doZ2gjZSem52gmJmclZeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rbmVPSkOhXFpMdF5iZk1aYV9ydF9KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC4sbW/ubqzsbe8qbq0n7CknqWnp56UqrGpsKm1rKuvoZihoKakpLqio6ugl5uRoqCVlJ6alJieoI+NjKivr6adlpuopp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYW1ZYlxhcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sa+5uKrAtamqoJumo6GdkqqqqLajsqiuqqCXnKegpau4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZScrKqXjJOlmaSsopGXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsSxurKuu7CuwLGspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2bkJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5ufqKKznqKljqeilKGanJeWpJiPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3p9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNQZ2ZxbXVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZazw7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6moauXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoailpqOpoZKtn5ejnpeWl52ej7CplJunoY5qfmmcpniHc36aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunrai+p6mmlZSclaCak5ilqaeRnZGPl5ywsr+sm6edp6KJk5Gpmqikm5uroKOZm6OmrKKfqqKasJuVpqCWlZ2fnZexpZihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dacHpubWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwJ6rpJWSnJeemJOUop+doqeTkZmop7LDr5qrnKqfj5aWqZ2qm5ugrZihm5yipK+moaSonq2Yl6admZqhnp6dsKCcoqaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGclqichJ6pq6KzyLOfqqOql5aXmqedqJqdo6uTnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmJ+ok5iXnJGkmZionZqXZoOSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOboqmpkp6hnqCqr6qro6qfqJumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr6Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqqWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopOmray3s6evopKRmp2lkpGgoZebn5yHpqukq62/wLGgqa+pl5KfnaKZoaKpo5OgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WVoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC3l56RpKqorbOrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq2kqrCowMazqKmxrpaSnZyil56oqp+VoJ+cna6vp6qpm6enpKGrkqy0lqaiqqmdo6elobChk5qnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZBkb3R1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoaWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6u0qrrNsa2mrquWlJydopmerKydlqCZnZ6psampqZurqaOirJuvsaKorK6lmKaqqamxopKXo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mZaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTb215eHdvbGZlZXFwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC0sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZn6SznZqglJyfp6uro66arKmioaqjs62iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk39we3V9e25bZWpycWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramyraylopyyuayqoaabqKaqrKmmoKalmKujn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrZGZnKaioKqmrqGjp6mwtMKxs6qtqJOJl5ykmqCirqaYoZWYnKWmq5qvna2opp6so7esobK5r52br6ezs7OllJino5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3t9k5KLdXpzhX9xXG1ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKpprKgmamklKO2oqKVl6KptLiknKKdo5OQobGZnpympKGir66dpKihtrLDsa6pramRh5Ccp5yiopyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyuLCzp5ier6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jI2Ti3h9eY6CbWl4aXhzbn90XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqaewo5Sso4+lraOdkJqaqrS0pJ2knamSlJeuoKCdpqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpaGVmpqcmJqZpqSmmKunraKkm62nvqyVvbCsn6Kws7mrtKebqbGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkqeZgpSNl4x7e4OXf2tsf2J9dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilpI6bpKOgr6+qn6Sfna2Znrigo6ugr6qarqGQqqmklombkK6wrKefp5utmJiPrKKhnaWhmaScrZifqKa2qcCvpamjnouAjZuan6adkpWampSamqWjpJqorKyjpJ+qqL6kl8OsqqKhrLK6q66noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+om4uYkZaWe3mOnX5kc35ig3d0gHxhamZxbWZlZU9VZFxCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLy9AVVpYV1dXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5uspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrnq+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop2ln5mjoqWZn6Opsqi8r6WonZyOfYublaCgmY+SmpuSmZeonqGZqK6npqajpam7n6DGp6Wpoau0tq2upp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrt0gJaOpp2QnJGXnHmCkZt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9sqKdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajraGknKqgmIujkqeep5yaoKiimJ6grK2qua6oo5qWknuHmZGmm5KOkZiYj5iTqJmgmKmpoaqnoaOru56pxaOgr6Ors7Wrr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2SjqKYmJmRlp58h46VdmaHeGiNanl+eWRsY2ZsYktlWEpsWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6qpoa6epLKpmJK9ssTIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI2YlaeUn5ipo5uxp56jrLqfsMGnpLOmrLGyq62rp7ijrbeWiqGopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmpeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadte5SRlJOBgY+Pj4+dlKGWmZeigoiUjXJpkHdwi3d2fHpqbGRkb2NVYFlAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW3rq6isKStoKC1sZCOq8a9xLq4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5yolqykoZmnnp6TlaOXqJqomZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2pqbK4oK68mZGmo6a2opKdpp+NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clquckpmhm5SQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaQlJSRin2MlpKSmJOhk56XooSImId6cpZzeop/cXt/am5kX3BpYFtgWm1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2mtLuvrKyio5p6naKxpKWwqZabuaejlJmqnI6Giomco5Cun6OWqKChkpeYm6+LqpaPqJmnjJmoj565tqSlmZuNiXmCk4uak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqxu5R1rKSeiYCqfmRcYnagjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmHipSSi1t2lZFnaJCOcnummZlleZmHgniYaoSKgm55f2twZWB2b2traFxmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhsLGsq6mlqK2jp62kkpWrtrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlZKJk5GQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqirreBjo2mnoOLhY+xqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSVkniWaJN0oJp0fZmEoZ2HmH6Si4ODmWuOjYVreHtxcGdkd25pbGpbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKiwpqeppZmUrse+sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2Gj5mXiKudopafoJGNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiJOPiZOPj5uLj5GekZehpJaerIiftIm0mq2Lyoeqroi3hY2wgrCug6mNppmNnXyoj3J7d5yPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6Kag5qAjI6FiplwjZOFaHd0e3ZnaHVwZ2dsXmNvbGdtWGhHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubCqq6aalKCkpaujlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZmYhqK5rqSZnIyMf2Jtj4qSj4yPjI2Yi5CRno6UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2qroakjaqajJp+onaAmZRrgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4SfamWfbFtuinxmWl+Df2JXUG92ZW10cWpqb15qb21salhpT11YRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqySoba8q66imZegoqatraGdrrWiqJKhoKCmnJmOmLSZkIuejJWMdYGUko2KppaVmJ6ef5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHio2NiYuNkouQkqGLlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXmKfYSafaJwcpOIlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHVxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHfn2PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqeqfq6MfXqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnF6eGtpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJusurKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBh3h/lot7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6efp3ywraOiuJd3o7OipICIlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ9lG+Zc2qkXZV2SGVjYHNxfn5uZWBsaHZ8ZGViUl5XXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaCLeIWNiIeSmZV8k6Ohn6OIroZ9tYSOnp17pZZ6qYGWnZCKoJx8p2h2bX6ZdKFzcXyehplwk4OufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294epdrm3t3l3JtqaRnYGV5cICEa2dmZG11eGdgY1RbZlFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJmFmaigoKONpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoeAboKfhniAk4aImaKXepOipJqgibOhoraLeqynpK6lcKmAmo+GgZySfKSAopmGmHKehKOtroqXjICMpI2Wg66ilXa1tbXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt5h2ZqZ2J0dHFuVl5UWWhPUWhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeHCQoYd5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXebmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcoJscGhreHNrb1JYV1ZmWVJtSVhPXUlYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAj3Noj6aEfYaUjYmYoI6IkqqnnYmmeJacfqWJloyymJ6Qgq+Xn6V4lYh6qXSlj4SabqSijJKEjIO7bn2lr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVydHB8dHFian5uaG1TVltVYWFca01dUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOMlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4V5kIuEf3typoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYZ2bWxnjHN5e5h4hFtrWHmPaG53cnFveHhvXWyGbmlnVlpgV1xla2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpS5qaeLoaKapqSZpJyroqGEhJiskp2giZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6XdnKFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5Omj3dvnZGDepJvfqiFcH2VcWtwfIGfjH+TjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYaPem9lZ2R6g3qWW1xqZ252W3t4d3Vuc3OCZlxtimtsYllZXlpYbHJcX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3lvaGptYIuMqrGikKOhmp6el56ZqKOifoOYrY2flIebopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOLm5+Pgqahh3iOmImVi4ucl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbh5aOe3iOjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfYiLiZCBdmyChHx5mWpyaGF0inB9end2b3Z0gV1eb4Zobl9eWlxdU2hyVmNcXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaXl6cWdpa2WMiJ26n5aioZiVmZiUmaSgnnt/mquOno2Fn52LnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJaPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloCQinZ8h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG54dXSSoYuMhZqFhI10gIl8fHJye4iEe3mLjoSTp4+GhI+ChIqKineGiImLfG9rfoB7bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1pdXlFnbVNlW15ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bWxUY3F5ZXB6enJlaW1ti4qft5qho5+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2LkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+jYR4f4OPh6CAfYyMj3yYpKChk5mQkKeNj4GbkYmSl5t9kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLcoGGfH1weHuLhHp6kY2DlqaTi4aRfIaGh4V2goSJiHplcnt/eXpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Ta2hUZFlfYWhqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l/iYKAf3F/e3R2g4V+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZOLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2YkpSbeY+FgneEl42dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXt/hnx7cX53iYV5hJCKi5iilYGEjXeIhIOCd3yCiYZ2X3h3fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2tkUmJYYGFpa3Z5hnFjamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH14qpyKmXqXnIuMmJB5e4GLfXyDe4CCgHh0eHpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoSSkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnONjoprhZiPmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeId+dXiAfYaAfIOMhY2UpJB5hYJ0iYd9gHR2gYiEbmB7dXpxfW9hb2Nke2Jub3ZzeHdzdGF2X29sdW5vXFxfXl5qXk9dWGNhaG10e4hrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJd+npORlpSId357in17gHZ4f4BwdHN7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FuiJmEZoaZjpN6iYWQinCWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHdHN1a3FudHuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgHOIeW+AfYCGfIWMiIWNlaiNe4h9fouFeH5xcICFg2NoeHR1cHxiXnBga3RecWp6eHhrc3BleF1tbHNtc1laXmBialpQV1hlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiYV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdYGqlJKOh6CMlpOQgHR8doV3eH9yc3uFa3Jvem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5aMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaYSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJd8kY2PjZqSfYp/gm52cGxtb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXl2iHRwiXuFjHqLhoOJj5yjiHyEd4KLf3h4b2uBg4FdcnNxcHB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWNg3+XlIOQn3WLn5SThoubjJWNi3pyeHSCcHKFdHF1iGxvbHVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlICUf2iFnIdnhqCIkoSRg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwdox6iYx7iX2CjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYF9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXlwiHxfXWhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgHiIg3OGhX6MjIR7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoiAjJ5/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNwa2l2boNufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQipOblIZ+lpWIjY2IkY2JnICOgXh6jH6IjIqcnJ2blZN5jXZniJGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9ra3l5XIB5j46Aen1+f4aOenloc2tzi4+JgoWFfZWMa35+boCLfouHfYR6gY+WmpqKfXd4g5B5c21ncICEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cnBwY194YGBWa19edk9OTGBnY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pdop2boaIi32Ko4SRiZ2FhV6LlJeKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepKHhXp+f4CFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlpOZkHV0eIiNdXNxZ3V6g2J0bW9iaXZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHdNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh3e3F1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHaHf3CEgYmHmaGDlIyeg4lhg5WPh4mGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoV8f4OAhIqCdWF0bIiBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQl4lvcnqNhnVscWxyeIFfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtVlt1TEpMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipWFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3txcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g3+Kk52ehpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SHfnBfc3GFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkZOEbnB6jH91bm9rbHp9YmhqaVhtdlpSaXJqYlFicnhsYmVdWWqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsW1xjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpGRg5qfm6CGh3Z2lH5tdpSXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGXjZCMfW5te4l9d3VvaGh9dmRccGJXcHNTU25zaWFOZnR4ZmBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2NmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjIafmKCZhYhufYx2aniYj3+CioOVl4l5jpZvenNwbGpkYHR6aGBlcXpaYXJ9eWdwemFlZY+xsndKYlqk2dCWcXuQi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZGEk42Df29+g3aDd4WbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qGe2V9foR1ZHBzgGh4cG91mIyFgop7dniAhHmBa1xxfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmY2NhHhub3+Ef3d7ZWhqfXFgWXdaWHFuTldyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZl9acGtneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2h6lop+gIWCmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3dviYVsdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dheYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygG9bbX50eIqCi3uGf3yIeHpxbIiDj4OKcoF5f5aLi390bmt3gIB1dVxpaXdwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwW1lVb2RZZHF5WmheX2dtZ2praXB3fY5saYKEfnlugHt8gH+CenWCgYyThXCAi254foB6e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn51f4B9jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5sWG9/dnSLgYZ3h3WBiXp4c26JgI6AhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccVxPXHJwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bVhYU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISJknl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIeomJbHh5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3N+YlZ3fXJzioSCfIJwhol3eHBwg4KMfn15fnx1joaDdmlxaW2IgnJwXWhjc25KZXVMXm9WVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1Z3XlxlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goJ+iYuTf3CAfHh5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f398iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxsf1lWdH1vdISHf4B4a4iGc3hrdX+Dg316fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1dWeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG9mZmtxaHB1eI10a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6FgomNint3f3iEfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYeDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyEin57koV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuh3GBiouHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB4bXxdWHF+bHOAi3yBbm6Jf3F2aHd/gX+BdnxxenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBaW2poXVdnX15yZmtncmdwcnaFeG6VinR/enh+eYKHgHVzgIaFjoJwcHt4dnR5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYFtgIKRh3KUiIyHg4iFfXl0cm9oemFqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0Ylxve2p0e4t7gWV0hn1tcWd1fnh9f3J8bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk9oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOV25qWV1sZVxaZGJedGZtZHFncm90gHdwmYV2f353f3yFh311c4KIf5SCbnN4enlycoWHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhoJ+gX9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoB0iWVleH5pdHZzc4OEeIGEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt7kYR2mHyHhoOGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAd4J1YneFinyUgG6Lam16gHBlcmVgbXlmcneKe35idYJ2aWtxdHpweXhyfWZ+f395d25jZWJuhnxta1ZqYnBTS2lrT0xPcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNXTFl1ZFpfa2FcW2NkX3dmbWJwaXNucX50dJmBd3+Ad39+hoV6fXWChH6XhW5ydHt6dHCEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paU2JuZVtYYnN7amhtaV9iV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3J1eI5/d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoXG93ZHFziHx4YnOAcGdqeHNya3d2dHdjg3t/d3ZvZGNjbnx9a2xVaWJmU0ttaE9HUmxFYXhmYU1Tcl1JTVRZZWt3emVebXBpZFxWX1VubldLVGhYZl5YTVVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebWxcYVZcXGuBZnJ0fWpqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt9dXVidIWKeoeGgH93cnV+dGFwbFlxdGJxcoV8dGRyf2xhbHpvamh5d3RxZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1diR2J2ZmFLVG9XSkxYWGdsdnpkZW5wZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB9f4iLhn11doZ4h4x9c3V1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2FlXWVWWVlWY2ZrYF1cc4VpWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJhd2Rbb3BicHGCfHNmcYBkXm52aWNmeXp0bW6BdXR9c3FiXmZub31kalNoWFlUTXdfUUpaWUhidGNhSVRtU0lMWldpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG5gZ2JsVFtaV2hjbWZcXHGIZVNybltaWFhgbXdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZnZnXmJaYWdcXndoV2Jeb2hhd2Fbe3ZqaXJud3NzdGhwgZSChn6EdnNqcHxsZnZXXGttYnBzgXpzZm9+W2BvcWJfaXB8bGtzfnJxeGtwYFtlbG16YWdTZ1VXUlB2W1JQWlJIY3NiYEdValBIT1pWa2xrfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p1aGJ0ZWVdWm51bnF1dXprh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1tmamZxdIF2c2JsdlVicWpbX25lfGVsdXxycnNqbWBZZGpqd15mVGRVVlBUbVdRV1RQSGVyX2FGV2lOSFhUVm5pZHxpa3drYVdcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39tg4B+hpd7f4iBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmltYFRWU29ndGxleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbl9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfGxxbGNZYGhpb3SBc3JeaWxSZXFkVGJuYXlicHZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlb11jR1lpTUlfS1htZGB4aG59ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLy8sgKSgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0dHBh+qaSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQio+LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoWJiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoeFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4yNiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiYqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OKioeHiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cnBxa2xycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZWpmaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxdXmJpYF1eWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUFxXXmxXVVJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQYFddclVPT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0xjVFt0VktQTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDR2ZUVXVTSlBMSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9KY1tVcEtERkhHRkdCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PlVkYl5nT0FFRUZERkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PjxIYm1oZmxgRkM/TENDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3PT04OVVscmtqcGtONUpYPkBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdXN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0NAT0I8WG5xbmxzcVtDY1U9P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT9SWUpSa29rZ3JyZl9qSDs+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6O252R0FiXVxpbmhjcW5rbGY+OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWlE8PD1LTkhIdnZNOFdqaGtuam9xbm1sVjo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUg8X4CDgHp7d1Y7Q2BzdHJvdXFub2BBPz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2WDhIODg4B9XT4/R2h4dXJzcG1sTD5FQkJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R+goKBhH59hHVMQkNDT2x3eHt6cV9FRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERUVDZIKHh4iFXkZJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gIB4gISFg4SJbUFBV3WFiIeHh4mCV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVW2GiIaHhoeIiYh8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoGEhISCgoaGhoSChoWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Bg4OCg4SEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLjIuKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dnd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0NGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTUtSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEtHREFBREBPUE1TZHN0dXVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHF0d3l6e3x9fn19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcnZ3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxcnR5e3t7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHF1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNCQUhKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSkxLTV1SSUhETUdBREtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0hISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkBCRDxCQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS09VV1ZVVFhgXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU9PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVZUUVRRUkxPUVBPVFlaWlxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NHSEhHRkpHQ0dJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJobWdiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0dFS0pHSEpJSUtISkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VoamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDQ0JFRUVGQkZGSENESkVFSk1NS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj8+Q0ZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERURDQUI8QkFCR0RHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkhHSkdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUpHREZHRUZKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2JiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJS0pJSURGS0tLRkZJSk5KTkxITE5ISEY+R0dMSUtLSkxLSUdFSURDQ0VBRkpEQEpMSk9bY1lfXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdJR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmFkZGJYT1FRUltTW11dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1hYldfX1RQTlBRWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tNTEpKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRXT1NUUFBPTlBVVFtYWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUVZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFRT1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUVRQUFBRS0hmeGxjeHJtWktNVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvX19fY2JaXmNkZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT0xLU1NTT1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUU9KSVFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUExOVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lSVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRT1FYVFJRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNRVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpfX2BVYVxhYV1gYl9cYF1jYWNnaWRlYFljYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUU9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUl1YWl1eXGBhYFdiW2NiXmFjX1xiYWJfZGdqZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVZWVlVV1lbVFNWXlldXWBdYmNfWWBbZWJfZGReXmNjYV1lZ2pkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpeXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdlaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFhYWF1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXGJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFVeW2BhXFRVWFBVV1VTVlZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWV1ZWVlNWVFhcXF5gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQV1ZYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXV1ZWFZXW1xgX11fWlpeXV5eYVxbW1pbX2FeYmRjZWZlZmJaZGZnaWdjX2NeYWZlWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVhXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2QRigrKysqJWOSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkJQ7FhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3l7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fX56e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHl5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3x8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7e3p5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgoGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJzcoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Vzc3R2c3Rzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd3dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fYN6hoh5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh4eHl5eXh6enp6enp7e3t8fX58e3t6e3x7kn+Mknl7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fXyahZCaf359f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgH9+gIKBgaKHk5+FgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foCAgICDpomWood+f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5/gH9/f4SojJSjiX6AgH5+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQioqLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgYGCgoF/hamRkKKJfoGBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoWFg4OWq6OhoIeBgoKCg4KDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAg4SBjaypq7ClkoeHhomIh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhISBgoKbqJ2lqqCgi4aJk4uIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEi4qEhaSdlKCil6GVg5GYhoWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKHl5KDmZeOnJ+XnpmRnZKAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOTqZiUlpCgppeYnqGci3+Af3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiIeeq6mfmqGrlpmfnZmHgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLhI+goqCcn6OZnJ2ck4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI+Bh5GSk5acmZucmpODgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19fIKXi4GDg42Qk5eXnJ+ZiYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Lfn+AfYeLfoSEg4SCiY6SjomOnJSDg4KCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYqAi4V9homBf4aFhYWGh4N+fn2Dh4SEg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYOCgX9+goeGhIF/f4CAgICAhISDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/f35+hYKAgICAgICAf4GBhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/fn+Af4CAgICAgICAgYB/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgY2IgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOCg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf39/f35+fn5+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4KDg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgIGBgYB/i5SPjIuOjo2Ih4eFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUkYyMjY6OioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LiYaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIqHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f35/f359g3x8fX18f319fX17fH5+f35+fn9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqIiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/f4B/fnx6fH19fn19fn6Mhn19fnx7g4J9fX18fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/f3+Af31/f39/gIB+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCgoKEgoGBgICCgYCAgoKDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8e3l2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4WHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/f4CAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4GAgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX99foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnh3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYGAgYKBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHZ4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgIGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhYSFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhYSEhYSFhISEhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1+gYB+foGCgICBhIeGg4OGhIWEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR+gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFhISEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4OFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH98e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhoaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn17fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhYaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fX18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J+gIF9foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+fHt6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM3BlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWwpqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2Ym5yHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mpidkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqChrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sju56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iy8WWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jLm5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqqmrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKfPkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp6gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinZubpKGlqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJ6ZmZ+gpqajop6elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6Cqnpmcm6qkoaSfoZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGqsqGkoqOroqWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rt7WksrGwm6KnnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1s7iynra0uX+dqqSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSwrJOxu7lrj7iyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb6zqaWHrsG3YXq+wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+sK+egK28sl5ptsO6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DwrW7lH2qtaVeYaC8u7Ggm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wYd7s8WiYWGGubu2rJujt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwbp9fL/VpmRicrGztKqfp7Syrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMeydHa916RlY2autLe3wL6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPIqmxwstefY2NetcTByMzGxMHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIx8nNyMPIycnFxcPCwqNlaZ/SmmBhXr7Px8vOxLe/v8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDxcTAw8HCwcPCw8GcZGOHx55bXmPEzcXI0MGuvb64ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrSwLvAwby7xb27wcTEo2lkeL2jW1xrxsXAwMm/sMG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8HZirLCu8O1use3trm7wKZ2cnemnWhpgMbAv7vBvrnGvMLAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zRxnagzL3Ht7m4rre1vrGdhYSCk5V7f5nFwL++vby/ycLHyL7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2K1ye7bJz8LAuK+1vr+gjoR9h4SPgYSZsMLCv769vMfGy8rEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi6vcfKycLIydKWb3Cp0tHMysS1u8mviHhwZX15hW9zgIi1xL7BvMC/t8rJxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvH0sK5vrzEvre8wb/Iz8bIysrAhHByos3Ly83KxsXBlXBiWU9sc3tXWGhymb/BwL/EqKTIxMPEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uK7cwr62vsC+vbSelKKrr7++o3Z0d6LQycvIwcPDpnhcTUZBX29wSUVYYX2qxb/BsoiZyMPAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7yK1ssc29tbnAvKR2amdsaG98kZRudHmi0cbIwbi/vYdiTEJBOlRoZEU6TlhoksPAtJBynsi+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wNCpcoO0vba1v56EaFlfXktRWlprb3J9o82+urm0vbR4UEBRZUBLXFlHOUdTXHu8uZxyaay8tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLLoIJ2i6Kws5FmYGVVWV9LSk1PU2xzhKXHu6KjrbiwhEVAcJZRRVJRSzpKUlVsqqF/ZHK2r7K8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaKGeXWNoo5bUkFYVEdhbVlTR0ljjaOqw8aZhJCjsKVCR3uaX0JQUU45U1pSYYt/aV+Jt6Wss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uMKwjn94h45oTklBa1dCT3WFmXBNQ1Z9sLvRrnp2gqGmRkhod1hCWFhbPFZjUlpvaGBfobOepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4s5KMiIN3VUVAVIlWSkpTdYt/YkBZqbmyx8+SZ2yDhEtGU1VJZJGfqZ6Xe1FWXlxXcq+noZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrqnmJmWaEw/YIBqTklJTWeaf1ZHWa26sa/SunJbYWRRRVBwlamlnpqcnp+BVFBTU5Svn6eWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wammvWFCXKN9T1pJS2FLW4lmbXOOr7WpvNKXVU9PUG6isKecj5WRjpeeoo5TSVylpJ2olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8XAyZZOQnada1FxTFBhZ3dwX2BrgZmwsK7Gul0+YJSlnpiSjI+UlZeXm5+mi1ByoJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoZXUk1kn15ufXV5V1FrY15qZ2x4jrSvtMJ/hKGfnZmUl5mYj42QlJCLjZCBiqGdl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOPeVdzdXJ0aV9yblhZXV5kZ1liX2isrquwqKOfoqCWkJOboJqYlpGSnpuhpZuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgon5ve2lgY1dNW1JVSEpPVVBHUlNKmayqqaSfn5mSkZOYmJaVlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjn5yIX1ZfZl9VTExEOj4+QkM+PkNTeKmtqaqln56foqOdnp2anJuTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BgZl5OREU8SkVIPD86Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpX1RMRD5LYIJzZUI9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIQ0BATZCnsJyDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtgUktIRENARli20ryyr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KhWUk/QUNBSVN8sq2mmZSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2dDOT0+R1qDq6efl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLB6S0pFP1qNoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkvszV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK6TeHJ2e4uVmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fGaDg6esk46Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWtfeX+mkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraRfZXSHk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCYW2hxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wbqztLXDrqmwkVxqfpKHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqWop5qgpaGanKWsrqSooquqrauwpKafqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbIiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCcoqWUnqWbmJGho6qjo6ClpqemraCdnKSmrbKwtrensKyoqrSrtLqxtrautrqyr7q6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NjY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlpuilpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaedlJWVm5ibopeWkZyioqienJ2lp6KlnKChm5murq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrStnpqkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZagoamkn5+pnZyaq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqZuZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoJ+npqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6OinKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uQipKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Oio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjYeQipeJlJSYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+tn5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso5+PlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmXhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaen6SAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyFdG90a3FsZGxqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZaKgYSBinp8ioeGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXlhhWFllWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFpTXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlZRWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSVF5IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm6UlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkQ7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bnx9hn50fpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdxoaSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRExCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22BfoV9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPh5eXioSPjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZucsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em6Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYaDkqe7raiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZWanqenpKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZimoK6djKqcjpaPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmZ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknmFjZKQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpalrKigkY6SscWnlY58kZV9h5GYjqmZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqytq6ebn6aXmJeZlaGkqaaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqstL7CucC5s6e4tLiyrpWlra+upYuTlaGNdMGafpeZhY6WmYqxlZqZlZKTmZmmo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuaaInJimm3a/oIWZnY6TmZmKrpehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q76lj6OXkaKfvJ+JmqCZlp6djrefqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FcX11KSEZHTVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpanppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpOblK2gkaGipaOjn5C+pamdqaydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mwqJ+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2crqCTo5+XpaCnqauXtrCiqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWRk6CtoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cjp+Xlo6ipJWQpq6zq6mioqallZWcmIuPkZOkn4liZVpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZyqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZSjrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZayq6aipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5aRpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWsl5qepZGbjpOXmYWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+qo6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurpp6YmKuioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSyq6Gttb2vs7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7WprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEtqu8r7G4q62qo7GmnqSqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqGekayfmJiFlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub61qq2xtpmYp6uqq5usq4+rvZ6srrGjqp+wrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZWambKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqloqKgmZWRk5V6i5CGe4yKg4uSa254bnZ7YEVhallJSFlbPXtKR0U2QWJUaVtNXGFKW11aUlJSYmBMS0VfYGBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lo66utam3tLijq7S3ybu0u7u/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bDt6utsrmVl6auq6ejsaqUr7ukrbKyp6eisrOwsbG1sbizqa6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJSbmZSynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrbC1rKWZoKyom5ydm5SpuJyUjo6LmZyimJCXpqGfloOSlpCdnJiWloiXkJebqJ2koJKVkJCWdoSQh3uFgYSNjG5xd3Z8flxLZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2wL2vq7OznKCnsK2lprClnrK2rauysKypqLS5rLSyta20rKmsqKypua6xsce/uKS5r6mtraaorbCmpKSuo6mcnZuasJmio6KjkKyepKCfoqqmprmlrLW1pKmrqayvtq+jnqOoqpugmpqSpLSaj4mNh5GioJaNlJ6glJOFjpOSnZuYlpWImJOVmaecoJ+MkpCNkHd+joV8fH2HiopydHJ+fX1bUmRvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLzAsKuyraCkp62pqKSwo6uxqq+ssK6vrquzuqe2sLKpsqmrpaWkr7qsqrHCubWruaioqKyqqLGlqqSirqqoop6boqyVpJ2YnpmsnaKnqaKtpqOtrLexsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjYl/foiGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFpPY1xOVVZVV1BcYl5TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZetp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOss7qkuLOsrK6nq5+in7G4q6qtureltbWjqaesrKqtoamnprGyo6aloaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmoqOiop8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtNaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCYq6mttau2saukq6qpvMDAuLmzu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlrbCrubCpsbGvsq22qra1p7S2rKykqaqco5+1s6iopLS0oLWtoamoq6mrp6Crq6i5tqmqqamiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoiFi4uPjpCNhIaVo5qOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJjUE1VVFVQT1hbYlVIUGlUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpautmqulra6ztK+qpa+pqbq+u8CxrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vbzCsbKzqrOopLWppa2zs7mwo622sq+yuaq4rqqutaurnqqsn6Ogtq2ooZ+vs6G0qp6op6qkq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhYSEpJaFgoKLh4+OkYSElKCXiJGdkJORjZGdlJePioWFeHSBf311eHmAe3RzemmCh6R1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsC8r6a4qqeusMnGyNHDvb++ub6/vMm8wbiwsLSxuru5wbO0u6y4rKK0pqessra5s6emu7WttbyvvKatrLWrrZypr6Sgpayqp5yeqrOks6iaqqeppKmeo6moqb2stK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4J/iJ6Phn99jIeRj5CEf5OblIWTooyUkYuRm5KVh4h+f3F6eX58aXd8enVxcX1ohnmFiGRgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6mlpKGrpLeysqWpsKesuMG9ta+iua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6aqq7C1uLSqnbu8qLK/srmgr7O1qqyfrrCjnKWoqaKenKWxpq+gn6qpqKKqnKSpoK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI6AepqUjYl8fouGj4+MioSSmJGHlKOKkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYF0a4NnZGhhb3OObWJqcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+oqrjCubKtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+uKm5t72rpLSnqKqwrrmxqpm6vaSvv7S0oK63taanp7CzoJ6kpqehpZmeraeonqCprqehp5ejqaCwuJ+ksa+hrKCspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfHuhjIyIeYOMhYqMjYWHkpqOiZWfiJGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/c2R7bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwpLSzqKi5xLWxrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i1qKersK2zsaeZvLekq7u2r5+xt7CppaevspuhpKCjpKGXm6+moZ+ip6+ioKKTpKWit7ChprGrn6yirpecqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXoqmhkImKkIZ6hH6EinmOl4qNhnmCh4SIjI6FjZOYjI6WmYqPl36Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUnKqdpaGioLeqrqC6uKWrvcWyr66jta+sra+1xMS8s7+6t7Czubi6uLuurcCztLivv8G4rL26taais6qnqrOrrbKimsC2pae0tamesrupp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLiopKeup56loKeSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6UkqOopJCIio+GeYR8hYZ9nY2KioZ5gISIiIiRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqSnm56enaO1raaquremq8PBtq+so7Wup6+vt8DAvLLBtrGusra2uLe1rKm9s6+ysb2/uK67u7GlnrarpaW0qauuoJ7Cq6ilr7OqrLW7naiqq7GlmJ6qnqakkZmmraKYnqSpoZyinZegnae1pq+qrqGhnpyhlaCmn6GgmZuZnJKZnZSlnayimJaelJONlZeMj5iaqaCRiIqLiXmFd4KCgZyIi4KJfH+EiIaFkYSWlY+OkJGRkYySe4OVjoZyfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FmSCU1mqOekIusoZiYoJaltLGisb22oLDGu7mxsaS3rKquqbm9u7utwLKvrq22r7O3sqaqubGvrbS2urawuL2tpp21qp+gsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJuUnJ2sr6W5p62ioZqbnpmeo5qknZeemJuUmqCSqJaqp5qTm5ySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2NzgWFlaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GaqbKwn7jAtZ+zwru9ubGmtq+orqW3uLe3rLuvraqrt6q0uK2ksbWxrqmxt7axs7W6p6iftqmcnqmjqq2cqcCZraSusLa1ra2fsa2wqqKbnKSsqJuVnKejnZqpoqSWmqCckJujqqmpu56mpKCYmpmeoY9ropaYnHGClpukgHWSqaeelJWfkYmXmYCWiqCPeYaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RVRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOgm6qtq6O9xa+otsK4vb2tp7awpaukuLOys7C5raqnrLSmsLSip7e1tainrLezrrSts6Kpn7SrnaGknKenmay7laalr7O4ra6lqK6rrKWhn5yhp6abmKGmpZubp6edk56fmJCeqKmita+joqOdlpeYl6OIoY6Smoehh5SdoX+lf6aqnZKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk4+Rl9NRlJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWym6y0trSmp6mzsa2yp6+fqqCyqaCko5qio5yutZWkpaa2vaetp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJSTpKWmoLajpKCjmJWTmJOciK6PmJSJqYuXopuFsYCjrJyTmp6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFBORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKpsMK9srXAtbe/wqumtK2tqaevs6qvtrSoqKa1pqe4rZyysLWqpaSnsa6usaaqnqeksaSioZ6XnKCer62VnqKftLqjq6mhra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGmoqCvop+fo5aWk5iSmYWvamqKjap+Z4SVh61kcJ2clJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYCVeHpqpzdKr1tXVGxjW0tPWF9cV1Y7TohPV1YvSFNTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK4rLS9vrC2xLK3usKnqbCrr6mpsK6ksLqwpKWus6OpuKiesrGwo6Wgqq2vrLCmp5+jorCco5yYlZebnK2ml5uinrSzoaycoq2toJ6al6CiqZyZnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5aWqZR+a4GmeoKFiJOUknerZ2uxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNMaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclZ+UiLOmpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKyp6OinqiqsqiwqKWen5+ulp+ZlZWWmJ6topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdoqqbppqdm6Kgl5ORk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3h4R9poKTfJh6qnmNnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh22XiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKikvLfBsLrAsbW1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLOzr6Cknp+nqbCotKmknJ2eqpeYl5aXlZahqp2bl6itsKmjn4+soqeWnpecoaWhmKGhoqGaoqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20t6ifpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5Omq7CmopaTrZ+lkpShm6SmoJSapqahmqOfrZqgnp2QlpuhnZyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraiyqKmyuri0uL+5t7K2vbWluLOftKyfn6irn5WntquosbKrrbSjm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknq2doZ2gjZSem52gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3JdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsWxurKuu7CuwbKspKKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mxrJWXo6inlJGWpJykrZ6RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy3lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOhpZ6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeWl52ej7CplJynoo5qfmmcpniHc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIiOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqagoqmdopuamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCWlZ2fnZexpZiiqJmckZ2co6OZpqKanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMmJeHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLShnqSlnKOVlqCrpqyjo7asoJmWlp+XramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6dsKCdoqaVmJOYlKChlaOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nJ+no6GdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmZ+ok5iYnZGlmZionZqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefpJ6hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6qokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZeeqpiefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9FMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYm6OgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajo6ehpaWeramRpJupraqcnaqcrKGWl6WWoaOXnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4d2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil5+pqp6UoZ+cna6vp6qpm6enpKKrkqy0lqaiq6qeo6emobCgk5qnmqCalJSRl6BwhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkJBlb3R1cGBnbWRfb2lpbmZjV1NcYVpRUUI5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqqSjrJuvsaKorK6mmaarqqqxopKXo6SalJKEpGqkdYl6qXR6snGCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqScG55d3dvbGZkZXFwZntoY11XYGpYWFRLTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqhlJyfp6uro66arKqjoqujs62iqrOxoZuqqK+wtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXkoBwenR8e21bZmpycWaBal5iWWNtXF5YSE1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqaWdprWfopeTqKq2sqybppyglZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl52lm6GjrqaXoZWZnaWmq5qvna2op56so7esobK5r52br6eztLOklJiopJqfjoKdTniagX+feoOjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32ZlpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6KptLiknKKdo5OQobGZnpynpqGir66dpKiitbLDsa2qraqRh5Ccp52jpJyll56ZmZqmpKiarqGupaaYsKW8raG3t62enbWyubGzp5iesKKknoWP0bXDt3mHjoWRk49/pniUoneMoJKEpYGKcaqGhLRucmqZo5uVip97lpiGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2knamSlJeuoKCepqScp5y1mqCqo7Wrw7Cpq6mijISOnKKhpqKVmpucmZyZpqSmmKunraOlm62nvqyVvrCtn6Ows7qstKebqbGlp5h6qJB9fLB3ioGkpYibbLFvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJiVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkaeZg5SMlot6eoKWfmtsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62grrilpI6bpKOgr6+qn6Sfna2Znrmgoqqgr6qaraGQqqiklombkK6wrKefp5utmJiPrKKhnaWimqWcrZifqKa2qcCvpaqkn4uAjpyan6aekpWampSbm6akpJqorKyjpKCqqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2hj4OmlZqBrIqEsIWlmaShoY+EoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkZaWe3iNnH5kc35ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5yspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrna+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop6ln5qjo6WZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuSm5ipn6GZqK6npaajpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpamPftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPm5KXnXqBkJt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajrKGknKqhmIujkqeep5yaoaiimJ6grK2qua6oo5uXk3uHmZGmm5KOkZiYj5mUqpqgmKmpoaqnoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eto3JtbW1linhvbYKZcYB5aXBpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5mRlp99h46VdmaHeGiNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6epLKpmJK9scPIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaanr7qrrJqbk5N7hJeNpZiNkZGYlI6YlqiUn5ipo5uxp56jrLqfsMGnpLOmrLGyq66sqLmkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVqqaMkpKMh5KcnJSQmpOYkI6VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCWmJahg4eTjXFpkHdwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWn5GJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4d6cpZzeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKejlJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJmnjJmoj565tqSlmZuNiXmClIuak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqyu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJWLkpyRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgniYaYOKgm55f2twZWB2b2traFtmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+yppqqpquXc4ydsJ+oqqaUlrmgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlpOKlJGQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqjr7eBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgpGXloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6SiYKDmWqNjIVreHtxcGdkd25pbGtbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5GfkpegpJaerIiftIm0mq2Lyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZg5qAjIyDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdtWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqklqWptqOvf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZmYhqK5rqWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21salhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraGdrbWiqJKhoKCmnJmOmLSZkIuejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RgnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpq6cm7GtrJOXoZmhpJmalJ6rm4uJkniLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHf32PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um56wqKudl6SaoZ+Ylpago5mGiY1qiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBhnl/l4x7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8ZGRhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaGMeIWNiIeSmZV8k6Shn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZlwk4OufaSDpp6agaNvXqhndaNjb6VhnNKQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294eZdrm3p3l3JtqaRnYGV5cH+Da2dmZG11d2dgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJiFmaigoKONpKigmKmJmZiYk5mTkqCYjoiGe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoiAboKfhneAk4aImaKXepSjpZqfibOhoraLeqynpK6lcKmAmpCFgZySfKSAopmGmHKehKKtromXjICMpI2Wg62hlHa1tbXJoXOUioGfYJ2WqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtqtLW0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOQgJepoqKljKWnnZylgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+VpqmclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2YoZWIbXJpq2p1oG1upmCbaIqQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAjnNoj6aEfYaUjYmYoI6Ik6unnYmmeJacf6WJloyymJ6Qg6+Xn6V4lYh6qXSlj4SabqSijJKEjIO8bnylr4KGhYaSlpyffKV6caiVoJZnnn1uq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01dUl1JXm1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYqDmKuanqSJmqWdqZyEjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSrpKCQgHWUl4l/gXmUrqN/gZtxj4Z5kIuEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXFobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUl9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyro6GEhJiskp2giZqmmqiYgoGbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSbgH6Jlq2oj5OmkHhvnZGDepJvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIuMqrGhkKOhmp6emJ6ZqKOifoOYrY2flIebopCllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm5+Pgqahh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaugoqKji4iTnJ2jmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkYSFjYiDjZCMfYiLiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNcXGFsaXV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5eioZiVmZiUmaSgnnt/mquOno2Fn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfoiUhG1sfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqamZCapqCmnZ2QloGRind8iI6EpXt8jpCRhpipoZ2TnY+Nq42RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqFhI10gIp8fHJye4iEe3mMj4STp4+GhI+ChIqKineGiImLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl5ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5uipJ+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2KkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt/joV5gIOPh6CAfYyMj3yXpKCgk5mQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLc4KHfHxweXuMhHp7ko2DlqaTi4aRfIaGh4V2goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Ta2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpqWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iFl42dfoGJjYxzl6KeoZOZjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXyAh3x7cX54ioV5hZGKi5iilYGEjXeIhIOCd3yBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmFeW2tkUmJXYGFoa3Z5hnFiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJyul6aono2Nl4eGn5OXmH14qpyKmHmXnIuMmJB5e4GLfXyDe4CCgHh0eXpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnSOjotshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeAfISOhYyUpJB5hYJ0iYd9gHR2gYeDbmB7dXpxfG9hbmNle2Jub3Zyd3dzdGF2X29sdW5vXFxfXl5qXk9dV2NhaG10e4lrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCjqJ2KipGGip6KlZd9d66YjJZ9npORlpSId357in18gHZ3f4BwdXR7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FviJmEZ4aZjpR6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWNioWNlaiNe4h9fouFeH5xcICFg2NoeHR2cHtiXnBha3VecWp6eHhscnBleF1tbHNtc1laXmBialpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooKabh4yKgZCchpOcdYGqlJKNhqCMlpOQgHR8doV3eH9yc3uFa3Nwem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXqLh4SJj5yjiHyEd4KLf3h4b2uBgoFdcnNxcXF4Wl5wYHFrXm9pfHlwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOPn3WLn5SThYqbjJWNi3pyeHSCcHKEc3F1iGxwbXVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlIGUf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox6iX6DjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYV9sbnlwZ3BmZnN0aHFrYXdlXVdmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcnJ2blZN6jnZoiZKHbIijhZKHl4OGY4yRmY+ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9ra3l5XIB5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMa35+boCMf4yHfYR7g5CVmpqKfHd4g5F5c21mcH+DbGp0b2hqdG1TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19edk9OS2BmY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fImch4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pd4x2boaJi32Ko4SRiZ2FhV6LlJeKj4iOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuBdm6IkYKQhX+Ce4CRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaXZnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25aXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHeIf3CFgomHmaKDlIyeg4lhg5WPh4mGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1tgmx4hpCGk4R9gX6BkpOQl4lvcnqNhnVscWtyeIBfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g4CLk52fhpWPn36IYYCTh4WIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrYo2Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cINmeYOKh4yDfIR+gJSQkZOEbnB6jH91bm9qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpKRg5qfm6CGh3Z2lH5tdpOXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGV9k4KAhYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXiDh4uGhHiDfIGXjZCMfW5te4l9d3VvaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2RmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyUjYWemKCZhYhufYx2aniYjn+CioKVl4l5jpZvenNwbGpkYHR7aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQi5B4fpWLhZmRjYZvbIaSknp5koaAhJiKfId/eHiJioSWgG+LiHF0fXppeYWDpZGEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KDfYODiYNugXhogIR4cn9/goqGe2V9foR1ZHBzgGh4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygG5xhIeOhIVzhHiAmY2NhHhub3+Ef3d7ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZ19bcGpneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBen+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjH6Sjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd29cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RvWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHt9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaFloVzjouKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5cZ2ZzcVFbe05ccFxPW3JwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bFdXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpOCc5GNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4mJbHl5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2dUVlZ3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx1dn9taHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyFin97kYV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z7fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyHhIiFfXh0cm5oeWBqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIx8gWZ1h31tcWd1fnh+f3J9bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk5oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHFlX1hjc3VpdXBlZWNXXFxogHBvcoB0iWVleH5pdHZzc4OFeICEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd0Z3CAd4J1YneFinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpweXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paVGJuZFtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2F3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcV1JTVRZZWt3e2VebXFpZF1WX1VubldLVGhYZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYlZcXGuBZnJ0fWlqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVidIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxYWGdsdnpkZW5xZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BicXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHJ7Ymxsc2NhWlpbYXZbU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB3f3J6enpkZnZnXWJaYWdbXndoV2Jeb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIT1pWa2xrfGZtb3FhXFpYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWm51bnF1dXlrh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFhUVm5pZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29ndGtleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdnNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYGhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZGB4aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4GDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Pj4+Ojo2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8wMDAvPkREREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0cHBwuNzU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIWFhoWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQiZCPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4eGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFPTk1PT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0pOSU5OTE1PTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDRVNCVVBIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9GWUNbVj5FRUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUNdRF5hPkFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj06Q2A+XGtDQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5OTpGZ0BcbT85ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0Q7Pj0+O0ZpS1xtPjo8Pj0/P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdcEI+REY/TWRYXWU+PT07PD4+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6Om53Sjc8OUVaY2BgZEk7PD1EOjs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAW1E8PD1MUElIdndPNzg5VGhtZ2hsYEE7TlE5Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQEV1eUg8YYGEgHp7d1xGPUFlcnRsbXJtT0ZmTzo9PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSXN5a2aEhIOCg4B9YFhRRmJxcnFvdXFgYGlKQEJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBHcHR9goKBg359hHRKU2ZYYXFydHZ8dGttY0lKSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVpc32BfH+EfnmGcUJIZG1sdoGGh4eEdGtWSU1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH94gISFg4SKbUBPc4GFh4eHh4iGZ0pMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goOEg4WHhYeCVmyEh4eHhoeIiYh8UUtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoKEhISCgoaGhYOChYWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Ag4OCg4SEhYWGh4iIiIiJi45mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSEpMV3KDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GT1BQVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceYWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRURJTVBHSUtHSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtLTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSUlMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRDxCQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1CTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSElFQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREhERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGR0VJRUZESUlHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OT0tPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NISEhHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhqbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxNS0xNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMSExMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTElJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUdGSklLS0lMSklGRUpHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkZJSk5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpMSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS05JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JaXWJkZ2lqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUUxOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVVSUlhWVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFNSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FUV1VXWFZUWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWVlVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NXVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x8fHt7e3x8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2Ni4mJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjJCQkJCQkJCNjIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3h5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e319enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn59f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAhH+DgX5/f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f3+Mfo2Ffn9/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/gZeClIx+f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKGnoaXlICCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoqhiJmah4eGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGBi6OKmpyJhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODgoCNo4mXnIiEhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgY2jj5aZhIKDgYGBgYB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjoSBgICFn6apqJeCgoGDhoN/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiYSDhJitp6usoI6BgoSQhIGBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmPhYWJpaGZpaObnomClJWEg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2NnZmThIiflJCfnJSdlZKejoKDgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX1+fIKXk6GdjJOSjZialJmhoZuHgYGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlp+Lfn+AfYeLf4SGlailn5KRlY+JlaCdmYSCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGSoIqAjIV9hoiBgIaJnKGikIN/fn6Clp2RgoODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qQgoSKhYOCgX9/g4iPj4aAf3+AgH+CjoaDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiIF/gIB/hoJ/f4CAgICAgICAg4WEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/f3+AgICAgICAgICAgX9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyIgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4OCgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn9/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WFhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8e3l2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4CDhISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoaCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aHh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NPS09PT1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX19bT0tLT09TU09PT09TU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLe909LS09PS0tLS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6Ohq9LS0tPS0tLS0tLS0tLQ3+vr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSko63S0tLS0tLS0tLS0tPS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaiw0tLS0tLS0tLS0tLT09Hf6unp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS09TV1tbW1tbW1tbW1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0tChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6ooKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaakn5aQobSVhp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2aip2gp5m0v8mXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mZ2lnoygxNKSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp29m8XJlNmto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sixp2TlqO7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izbKbrrOdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7usn5qhnJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTmKGpn6KeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqzjZCl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR1sC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46JiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwMS/wc/Pzserr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMTJzMrSz9POvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPFysfK0M3QzMfEwMPCyc3HxcHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLvIxsjNyMPIycnFxcPCwMW1wsnKyL7Fx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5x9DKxMTAw8HCwcPCw76/obfBwcGgusfMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMvUt7vAwby7xb27wcS/v5KnvcK7eqnAycTAwMrAscG/u7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8Hel37JvMO1use3trm7vb2Km73GtmCVwMXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQy32AuMTHt7m4rre1uL21gJG9yKxWfMDGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uyvb67xLa1uLW3wL7EvMLE1qp0d5DGz8LAuK+1tbvDqnmJv8mdVWa1y8PCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOxuby9sry+vMW4sbe5vsrKyMPGy86Kc3SOzNHMysS1usDEzpdxhcHHkFhal87Gwr/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzPzLy6vrzEvre9vLCvv73By8mxenV6jcbMy83KxsLEy9OEbYK/voZeWHrKxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLbAuMvYvb62v8C/r4V2b3t2hJe0mXF5e4+/x8vIwcPBwMnLc2l7ubR8YVdoxsbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xXJ8wcy8trnDrYdnW2NeUFtfcH9vdnySur/GwLnAvL7GwmVhcq2zdWFWYcHHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5xcp0Z4a1vba2nm5qZ1VfW0lMUVNeb3OBnri4wrqzu7e7vr1hWmSgtHddVGfCw8TDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS1t8fGfHRphaW2mGJTRV9RTWllU0xIUHF4iKGwt765srWyvLq7Z1VXmLx+U1BywcTGxMC9v7mzr7G8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDuYV6bm6OoG9PSUJrUkNce4eHW0ZXiKansLa6tbSyrLy6unRVUIW3gUxUgr/Bx8O/ubq1raWttrGmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ur2RgXdyhX5XRkJXiFFLTmF9h35RQ0+GurKztbK0r6y7urqEZlt4n4FccZe5u724trKxraugra6onaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK/oYeDhH1mTEBVenBMSkxOh6tvVj9zvrmztLKwsa2wurerjoN0haWpqamtrrivqqutrKOorLSnnZeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtaqTjZCbY0VWnXlSV0hRYUl8f2Njd665sqyzr66srbeplY2dpKmkn5ycnZ2nqJ6gqKihqbexn5aXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKq5sp6itVFBep13WGtKVWNpdnVkanqdsrSqsrSuqqupkpSrr6edkJeTj5ignqGgnKSlraepoJqWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigsMG5vXxPS2yqXGp+cXZTXm9hYG1ogJaxr66ztaqnoaGjnZmUjZCVl5iYnJ+iopufraqQl5eXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGfnJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaHDwYBVVmZwfXZtZnpyVF9iZGpsYmxwlLSwsLispqGdnpqVmJqZkI6RlZGMjo6UnKOMdpeampeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqesaWQe22GcGJlV1FcVVdLTlVaVE9fWWy0s6uvp5+eoqCXkZSboJuYl5KTn5yhpJiGbHWdm5+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhooRkWl9pYVZOUEY/P0FERUJHUkxPqLaqqaSfn5mSkpSYmJaVlYyIi46VnZ2eeWGGn5mmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5mBX15mYFJFRTxLPEY8Qj8+QEFNeqmtqaqln56eoqOen52anJuUk5WUnZ6Yln10k6Kaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz43Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can6CJdmphV05EP0xffmxfQzwzNUt7qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhvgp2koqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZcWpgVUlFQEFSjZ6kilBHXo2urKGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXGOpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelGVYUExFREFGXr7Ww6OTo7Ouo56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm9y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtcTENERkRLVXi6uKuvr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8K9xNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KjXkU7QUJJWmyarqyom5SXn5yaoKCem5yZlYl3aWNgX19fX15fX11ibHV0cHBvbHJxdZLEx8XU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjsHNEQEE/U22dsKifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMvA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M7OzM7PyMvQ0cvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppap/YmdiaYedn5uVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeYF9eXGJtcm9vc3R2dnmkvcvV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62Jc4SHocOqloyMl5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBgX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raS1c2N/gLaskI6Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb3B9uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGwsWVleou2kIuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr55caXKXlIuIioR4f4aGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xu7awtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFv765t8m2qrGSXG11kY6GiYl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFfZGVjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKvsC8wbqytLTDrqmwjl9vgJCIjpB7eH2JhXp7hIB3bl5dXFxdX2BfX2RiYmNjYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqSnp5qgpaGanKWrrqSooqyqrauwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0tbu1sK60u62nqpFpaYeEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCboaWUnqWbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmysLq6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrOtn6GQZ2yGhoaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlZqhlpyjmZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6u4ubChnqirp5adkGt9hoZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtxjaidk5SUm5ibopeWkZyioqienJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axuLqssbSunpmjqZ+TmY10gISEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbi5r66vqZuYoKiUkImIf4F9d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYl56ji4hziYh/d25jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkY6Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaumlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6impJmlr6WVmaWvqqCcmZugnq+anKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+snpiZnJSTh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Nl5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdpratop6OlJWRjn54fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298i5SJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmWhZOOioZ9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cXSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjZuNkH52hXd7dW5uaVlLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeoiNiol1cHttdHBpbGpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhYuFdG50a3BsZGtqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0ent3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FOR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+DgIN4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyuLW0rra2mWR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Oxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVVxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4dHt9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jTxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnLy8/Iw9HK1NbY19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQD4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eZnKmmpq6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZKVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dYOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rnI+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUkIyPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ+Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPiJeXioSPjYF/h4+liY2TqZqXk5aZoZifmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qzoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O3jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePmI2LlZeUkJqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKPiZefl5OZlZimoK+djKqcjpaPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY58kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwc22yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wcLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ekl5SclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2drqCTo5+XpaCnqauXtrGjqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpZaSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOhnLOnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaS1qZWyrKeipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnZSMjpmQgoaWiZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6GptaqdubCro6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5qSho6Zi36NloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqr6ujsbippbWzrKGttb2us7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4q62qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWWk4CPlIV7j5KDjJZlbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmmrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub20qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZaamrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bnV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lpK6utam3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJWbmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V8flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5r6mtraaorbCmpKSuo6mcnpybsJqio6OjkayepKCfoqqmprmlrLW1paqrqKyvtq+jnqOoqpugmpqSpLSaj4mNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6urayzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqKyqqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKtpqOtrLixsqGpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiXZsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbPk1GlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xr7Kts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGypKamoaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6SIeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SjqrCYq6mttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlra+rubCosbGvsau1qra1p7S2rKykqaqco56zs6iopLS0oLWtoamoq6irp6Crq6i5tqmqqqqiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gIidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9JazdQRTuVjrCgpaqtmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova6srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhoWEpJaFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3R0emmBhqN1aV5lbIJ1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb2qs6+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK27p62wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI+Be5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3ONbWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8MlBbPSOSmayZn5enpKKfp6O4r66ir6+pq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+isa+hrKGspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfXyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/cmN6bGlmZGFmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9aWTUol52lmJyWraCfoaSht6uxpLS0qai5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG1lcmlrZmldZHOAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYlUsMpajoZeUnKqdpaGioLeqrqC6uKasvcWzr66ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKinMG2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6Uk6OopJCIio+GeYR8hYZ9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnZ2hjZmlqYGliaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKepKORjqSnm56enaO1rKequbenrMPBtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelJONlZeMj5iaqaCRiImLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Te4OVjoZyfX1meG9ramxndXNrY2dkZHV/YWRmZmVqamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanpmeo5qknZeemJuUmqCSqJWqp5uTm5ySjJWZjZSUmainjY2KiY98gnSCgYuYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2Jyf2FlaGpubGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCZraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCckZujq6qpu5+opKCYmpmeoY9ropaYnHGClpukgHaRqaeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRnX2RmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy7laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmZCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6aqnpKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GWF5pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrJyTmZ2VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFcXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cer62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWk5iSmYWvamqKjap+Z4SVh61lcZ2clJmllXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK4usKnqbCrr6mpsK+ksLqwpKWus6Opuames7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uhnrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5WVqJR+a4GmeoKFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1tkWFxaQj6weFdYQSNNaUVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinqiqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaWPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoR9poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp+nqbCotKmknJ2eqpeYl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZikjI+cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrZqgnp2QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iZoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopZ+UmaWonZylnqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVoKGJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adl5uopp+MkqSXqKqmk5epp56foaOtpKGeoY2UoZifoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1qdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Rk5Srtq+nmZScrKqXjJOlmaWsoZGXqrKkoJ6oq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIiQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqquxp7mvtsSxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSnraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mwq5WXo6inlJCWpJykrJ2RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy4lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocH90kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpiXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlZ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLSgnqSlnKSWlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYlKCilqOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziGhqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46Bd3qBf3lxen+HcXiFjJN5bXaSYmZfeGRfZIBiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF94ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil6Cpqp6UoZ+cna6vp6qpm6enpKGrkq20lqaiq6qeo6emobCgkpqnmqGblJSRl6BwhYyXdYSoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XYGpYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyqlZGcnKGZn6WznZqhlJyfp6uro66arKmioaqjs62iqrOxopuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWWNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWfopeTqKq2sqybpZ2glZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl5ykmqGjrqaXoZWYnKWmq5qvna2opp6so7esobK5r56br6eztLOllJeno5mfjoKdTniagX+feoSjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKiitbLDsa2qraqRh5CcppyjpJyll56ZmZmlpKiarqGupaaXsKW8raG3t62enrWyubGzp5idr6GjnoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamSlJeuoKCep6Scp5y1mqCqo7arw7Cpq6mijISOnKGgpqKVmpucmZqZpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqiklombkK6wrKafp5utmJiPrKKhnaaimqWdrZifqKa2qcCvpaqkn4uAjZuaoKaekpWampSamqWjo5moq6ujpJ+pqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5fYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20mKCzqKqrna+tnaubla+poo6Im46vrKmnoqeZrpOZj6iaop6ln5mjo6WZnqOpsqi8r6Wonp2OfIualaGgmZCSmpuSmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amspuesZy5qJ6trqWmlZSwrJeMg5uRrqajrKGknKqhmIujkqeeqJyaoamimZ6gq62pua6oo5uXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCrrKOgp6yfuqOkrayspo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYlI2YlaeUnpeoopqwpp6irLqfsMGnpLOmrLGyq62rp7mkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOPmqeZobW6qKuZmpCNfIGUi6GUipWRlZCQk5elj56ZqJ+ctqOdp6y3p6/BrqO3pq+vsK2pqbO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJqojJioj565tqSlmZuNiXmBk4yak4qVkZSQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6n6myu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrquiZZ6fk3N5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ycr5+oqqaUlrigoI+co52Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSooJmYi4l1d5ONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqirreBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fZmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTlp2Gn7myp56bko6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZiXhqK4raWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipiol5makYelsKailZqIiYBpboiHi46OiouNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3uHf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6PiI+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHidequaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIiSmZV8kqShn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6OFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAk4aImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa1trXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6aEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1td2BbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgYOLlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4Z5kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYSCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1sfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2eX5xa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCFg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOj4pshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9qcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3pyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zeb2JxYV9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqgmCIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR5gY+WmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19ddlBOS2BmY115cYl0XVxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXtlh35vcGyAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5uYmY+Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeX+QlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5YanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXB4bIt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5hpCGk4R9gXx/kpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eHiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY58kIx+ioV6dXuCenCGgJWZjpOUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cYNmeoSKh4yDfIV9f5SQkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRab05IT2dlXGducX9rWltjc2BcY2x3ZGVdXFpsbGJtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfICXjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17bllbXm1jWmNvd2RmXF1gbGpjbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeYWDpZCEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHiAmY2NhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneHBaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2xvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDkISLcoF5f5eLi390bmt2f4B1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjoqJd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qbYGCdW5dZ2ZzcVFbe05ccFxPW3JwZFZLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMh3JycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaWyHgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVtioRtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dldQVVheYXGEb1xgY21lZF5uYlRcckdCZl5dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYR5eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhcX2VfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx+d3hzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyIhIiFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1uhHRkdYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXp4cGZsYm6Jfm1uVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWWFjV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxogHBvcoB0iWRkeH5pdHVzc4KEeICEeXZ0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4J1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucX50dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iYWDa3V8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paVGNuZVtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4anN0dG2EgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bW92dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHg2tygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYVZcXGuBZnJ0fWlqXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbXaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIhqc5eBe4udfX6FeoF6fnyGiHNxj66Me3uHj31lcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB5bYN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3t/iJR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB2f3J6enpkZnZnXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tleGRlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Pj46Oj4+OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLzAvPkRERERERTguLy8wMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHBwcHBwuNzU1NTU2JxscHB0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODg4ODg4WFhoWFhYWEg4KCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQiY+OjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoaHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2HhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFAQENEPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj07PDs4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5Ojs8Pzc9Ozo6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PT9APT09P1E+PT09PEFMO0xCOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RAPTw+QEE/QTtaeU89Q0U+RFg8WU47PDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48Oz1APTk6Om93WTc7OjxHXj1gXDk7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFDX0k8O0ZjZ19Xd3dYNzg4OE1iQmVoPDs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQE98dEZGdYaGhoJ8d1k8PT88U2pHZ2s+Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXZ6cHaEg4OBgoB9WT5AQz5Tb0xkaD07PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBQdHN/g4CBhHx8hW1GQkNEQlJpZHNySUBDRUhJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUdsc32AeX+FgH2Gc0ZDRERNZ32HiIh+WEdIUVBMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B6f4B8goSGhYWLbEBAVneGiIeHh4iCWFJeTkxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLTlx8g4WEhISFhoiAVmyFh4aHhoeIiId+aVZLS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKWoOEhIWAgYWHhoOChYWEhYaGhoeIhol7S0lGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklohYSFhH+Ag4OCg4SEhYWGh4iIiImJjI1mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhYSBgIKEg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaIWDgYGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj52hIGCg4OEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89SoGDgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJVhIKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRVqFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDR0dKW4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNBQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRUNJTVBHSUtGSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSklMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0lJR01QSUZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRURERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGSEVJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUExPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSUhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSERESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVllcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQkNEQkRJREdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhGQUdGSklLS0pMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dKRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUZFRFdVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYVGtUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVhzUWh6bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1taXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVU1JVU1RUWFlXXVpfYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWltfXVZZX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFdXVFJSWFZVWl9aXV9fV19dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VWWFZUWFpUU1FaV1ZcXltfX2BWYlxgYV1gYl9cYF1jYWNnaWRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVYWFhVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl5dZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2FfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9fX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x8fHt7e3t6e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjIyMjI2Ni4mJiYmJiYuMjIyMjI2Ifn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+Pj4+PkJCNjIyMjIyMj5CQkJCQkYt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn18f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4B/f39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39+f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGChYeGh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KGjYOMh4WFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgYKCgYiTgJKIgYKDgYGBgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIKDkYeAf4B/i5qAlY5/goKDg4CAf3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKCg4OCg4mZjIOChIGPnIOYkoKCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIODhYWEg4OBgH+Dj5qPg4WEgpKchJeUhIKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gISQiYOAfnx8e3uMnY6AgoKBkZuElZWEgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/hZuUiH99fXyBgIGViICDgn+PnJKYlIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEm56JfoOBfYmJfoKDg4SCiJ+goZOJgYKCgYSHgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKVoIiCjYV+g4V/f4aGhYWcn4Z+fX1/goOHloyDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4uSgoSGhImBf39+goiGhYh/fH5/f39/iJ2ahISEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISCgYCBhIF/f36AioJ+f39/f39/fn+Fno2DhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgIGMh4B+fn+Bf3+Af3+AgH9/gH6Dh4WGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAg4mFgoCBgoKBgYGBgH+Af39+e3mAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4J/gIKFhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4eHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4GChISDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaBgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f4CBgoOEgYKCg4ODhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SGhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N8goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYF/f32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWEhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/fn+Af3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDg4OEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYWEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhIeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4WGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/PztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9KooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNaynqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3InpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoq2alq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJ2tmIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCjnJ2oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonJG5r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqClppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeczaCrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttfFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkM8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqampqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndWhqaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfBy8vIxszKzsXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8C7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcLDv7++xMvIysvJvLzIyMnNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAv8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxru4zt3Ow8TAw8HCwcPCw769wsDAwcLLw8bMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7tsC3wN6ekMK/wby7xb27wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tLe/utDDfYbKvsO1use3trm7vbm6trvFxcq9ucXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubm5v7/XnXeBqcTHt7m4rre1uLq0t7O7xcbLwbzGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLa1uLe6w7/FvMHOxIB3eZTGz8LAuK+1tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub6+sry+vMS3srqwo6e5s73HzKJ0eXqXz9HMysS1usDEyL+/tb/Bv8bGv8vGw7/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Dc28W5vrzEvrigd2tvcWuAlbiHc35/mcrMy83KxsLEy83Fv7m9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLbBiq3YxL62wL6dfWRaZ1JOWFx2fHR+gp/DxsvIwcPBwMnKyMG7u7Czvb3AxcbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7trrAt2VupsnAtreGYmBmVGRdTk5RVGh0e4ikvr/GwLnAvL7FxMC1urKwrb+5v8PHw8O9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri4y7VtZ2+YtbiEWU5GZkxPdGpgT01YdHqOrLi3wrqzu7e7vcG1nr2usLC2s7nBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uM22eXVlc5yiXk5HVXpMSGZ+lINbQ3WJmauxt765srWyvLm/qoi8s7O3n6i4vcPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7bHs4B5cWyLdlFFR3R/TU5PX4qBcEZSfqa0sLa6tbSyrLy5vp93uby5t3aUvbzBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO3vbmNgnp6eWRLR3t8YU1JUWWnpWFOSnCuu7CztbK0r6y7uMGMb63FuK1cdrm2vLy4trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO/nYeHi4haRHaXcltaSV5gUpFxbm2gwbiztLKwsa2wubi/cmegwrKwp6WxrrmuqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtqmWj5OoT0p9s2xqcV1rXnVxY2Nuh7G5sa2zr66srba3tF2Dpauknp2dnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKmzs6KtlUxUcqZzdH2Mc05ubWVwcG6TqLaqsrSuqquvsLChsaadkZiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigrcG/qFdaeHVucVpfZGJcWVtpbGJmc4Oyr66ztaqmrKujnpmUjZGWl5mZnKCiopydpZ6bpJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnZ6/t3hjcnxmZ2VXWlpRSkdLT1BMVWJfm7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeqaedh2FYZmhcTkpGRD5AQkVCQ0xWT32xrayvp5+eoqCWkJOboJuZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgnn9jZWZYSkJJT2ZSS0FDPkBGSUhfo6qqqaSfn5mSkZOYmJaWlYyIi46VnZ2dnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjoIt3a19SS0NEVn+Lf2hGPTo6OThRhaqtqaqln56foqOdnp2anJuUk5WUnp6YlIadmqGaq6SssrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2ir6aho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGRzk1Oz43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can591aV5USkZERmezxMGNXVBJQk97qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqurs7y2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyXaldOS0lISFN90cu0k5yOgpavraGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3NxbnGOpaywub3Fu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyek1xNQ0ZJSVlmkrqsjYO0ubGso56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlycnBseKbBysrFysHT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyca/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ5eSD5ERVdmhqyfnqGtq6OcnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB2cG5xc2+Iw8/NyNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3Lz8bJyL/Ew8fOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGpcEdFRUhihLzEqquqm5SXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHVzcXBvbHJxdY+9ycXU1tfX19PWz9XU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdHLztDAxsPIxs7N0dHRyMzNwMrMxtPOzM7IxMrHx8jMytTU0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjr4Jia2p6nMK/rqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3mcq/0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMysvS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp5Z7iIypzc6xm5qVlJabnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvcvV0NXT09jWzs7Uy83Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7iysr6xu8PDtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFhYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK54ZYODus6qlI2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JxcXJzcW5yeaPF0s7L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raSwZmZ8jNGrkI6Nlo+Gg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299t9DHycrOy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKypF1qc6a4joqSl4Z6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvco/FvMnEy7/GwbC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwra/tbW+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3AxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr5JdbnaokouIi4V4gIaGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J4nLzLv8K6wLeusLGnqq2sp7i1t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL65t8m2qrCIXnGBl42FiIl7eH6GhnZ3gXxzaF1dXV1fYF9gZGFfY2VjX19cW15cXV5aXFtdX2twbmlmam1ucnukxr64t7Svq6ynnqKqp56rrbOtqqyptK63sbKprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsHHyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmwjGhshJKHjo97eH6KhXp7hIB3bl5dXFxdX2BfX2RjYmNjYmBfXVpbWlpdWlpaWlxkbm9oZ2hpa25xgay4r7StpaSnp5qgpaGanKWrrqSooqyqraqwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaVxhb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766ybfBw8G0tbu1sK60u62nqY1pYIaEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmVnZWhqb3KFqaSqpZ6boaWUnqSbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbakoKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PBvb+1uLy9vrzCx8TCw77AxKCDeHFsYWZfa29gVFleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKGNZG+HhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4ecqJ+VlZqhlpyimZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrK1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vcC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLe+t7LBtLG7u6u4ubChnqiqppeekGZ+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKeck5SUm5ibopeWkZyioqmenJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a1oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbq2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smoduf4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5WXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6CinJmZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mp6eyrbG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tLu8tLi5r66vqJuYoKeTkIqAfIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLWeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xaq3t722vbq6tbKrrKaYl56hi4hzhYd+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVFJVYGBfYGFfYWFiZGqAk5OJkI+Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqGilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZVUkdRT0hZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaqklJmam4d/cYiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHj5GPmpOVk5ybo5yboampq6isp6impJmkr6WVmaWvqp+cmZugnq+anKuzoKWmn6KjoZSTm5aWkqmprJqcn6GgmpSQjJmOjJCMkY2WlZCdoaCjnZujlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQjw/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWon5WWl5WGeXSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqKedl5CPmp6ul5ioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThomNg4+LkpWRoJ6ho5iVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopuclpaTgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ2omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6snpiZnJSShnqCbV9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5iajHONg36Nl5aGkZqQlI6Oe5mPnIyCiX+JmJ+jnpCTmJaFjYOUfn50io56kIeTkJCdmpqakZWQnY6io46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRktKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdprWrop6OlJWRjn12fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTiV87Vm98i5SJgIySjJCGhnOKhZaBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uPiZyIn5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqKijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxaminZiDlJuvoZiWhZOOioZ8cnVdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+Ud3V2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6ivraq1vLa3t7PBu7anuci4tqiotbaqsrymnZaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c251cHSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW5uaFhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFVYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6TjY98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWVdZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2Ziam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGBfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHF0ent3im1oamJ5b4WQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1tdVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGTh3qFdmt/jJGCfYqEjox4g4BzoYSLfXyBfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqcdG18gYaHfY5oZ2h4fm6Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzc6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8OTg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYOhlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbISBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUZCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3aVkquyiI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg2PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6O3xai2yce1vrm0qKO0rbGxm5mSmp+Jp6+rpZR2n6SXoauxs5iWqq2orra7srqsr7Wisauxtbu3tK61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hIeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWkr8a5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSAinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlZJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7m2uLmyt7W0rra2mGR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0FFRkQ8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHta+5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/h4GGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfn+Bh3mEdYWTkYl/b3Zya3N8fHZ8c4F3cWuAc3Job3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1dlZFhla1NYXVxgY11jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWqVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzc/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4c3t9g4d3f3qHkZaAg254cG11f3Z4fXOFfHlth3Z0bn12hHV5e521jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKOxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xe4Fxg4eBbo56dHd8fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46TkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIuGe5uIk4+uqpSVl56Ypq61vamtvcbLyMnLy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXR5kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhpd6iIifl4+IjYqLgnyhiZCLvKGXk5eZnKelpa6eqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DCoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6Rgot/pZmIhI6ChoSApYaKi7iYnZGVlqGmoJ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dIOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhYCLiJKNiYqdlpmjo4aSnZahioqIjpyQg4iPgIOHhaSGjJCzmJySlJehoJ6Zkpydp7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gXyGfHt3hoR/c3CFgnp1dnZ0hIKEfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjISnkYSZk4SZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4iPh5eXioSPjIF/h4+liY2TqJmWk5aZoZifmZOcm6KztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHin2Ko7Ono6qzoZann6WklpWuooOQuJWSs5mMoaCMpJuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJKYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIqXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vnpuhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmbWdo7ikla2klqmtt6akop+ZqZipo6+wqZqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KXjJCVjYuMl5iSnZm0l5arnYublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyrq68qpu7pKitubirpqaioaOjqK+ysaqcnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEwq2ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3IyMrB0snKwsy8wbOtu76nub+9vMS3rMGprLK7vaqwqaOlo6yts622taCfrp6lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK+yMPHxdPNzs3Lu8G3r7m8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzDtKaztcvBuKm2rLK6uK6ot7q9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLuqsLLHwLilq6utsbGjobGytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpPSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwcy2yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMC6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrunrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OXkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Snl6SfnsOsm5ekl5mpnJaamo+qlZWoppWtrZmhq7bEwru+tsHCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+3pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpSclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opijn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlYlZMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMO9v7W/wrvIwr7KyLa4tbSws7O3wca2vbC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9taaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmZ+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTZ6foZiew6elorOhnLKnk6qkoKSfrKmsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/EtbmwsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbamt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfo5+boMOopKqyoaO0qZWyrKeipLKrrqm7sqywtbTGv8TDtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrqyp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnpaMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaqdubCro6q0trGwubevtri4xL3Dx728w8HGwLjBxsG6qrakrbutwMK3t6qssbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5uTh46Zi32LloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKujsbippbWzrKCstL2us7i8ur22tsDCv8jEucTBwMC4xL3Bt6+1qKu3sry+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4rK2qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWXk4CPlIV6jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub60qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtbCvp6GzoJqoraCllZabmrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4opeTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bXV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVEpEmZagsKixqa2lpK6utai3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6eisaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1rLGuqqejtp+fp7KgpJScmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNyakpDQ5CZpa6lra6rp6SwsrOqt7C2oKu1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5sKmtraaorbCmpKSuo6mcnpybr5qio6OjkKyepKCfoqqlprmlrLW1paqrqKyvtq6jnqOoqpugmpqSpLSajomNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZaRztObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s8R0iPm6qqoqmwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqK2qqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKspaOtrLixsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiHVsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRaPkxFlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGyo6aloaGslqqhlJqgpp6koqukrKKfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOCgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6OHeGpeYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGP0hGRJaSr6SjqrCYq6mttau2saulq6qpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqmra+rubCosbGvsqy2qra1p7S2rKykqaqco56zs6iopLS0oLWtoKmoq6irp6Crq6i5tqmqqqmiqaCsm5KpoZ2gpKKmo6mdnKa1rqimqaKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuVjrCgpautmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsKmjn6yioZOio6OnmJqopZeXmJ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6Smq6OmpKymtLKxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVwcH1ohXiEh2RgZ2NyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RFg+Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVl5Sfopablqasi56RkJGMgoqBgI+Ae5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXJ4aIBzaoNnZGhhbnOObWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8Mk9aPSKSmayZn5enpKKfp6O4r66ir7Cpq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+jsa+hrKGspJympqiampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32Hf4KOfHyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bwb2l+cWN6bGllY2Fmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJyWrKCfoaSht6uxpLS0qqi5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpn5eanaWTm5yanaaqmZycpZaVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsa2log21mcmlrZWhcY3OAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYVQsMpajoZeUnKqdpaGioLeqrqC6uaasvcSzsK6ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKim8G2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGVkpWWmo6Uk6OopJCIio+GeYR8hYV9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdlb4RnZ2hjZmhqX2hiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGROJzKepKORjqSmm56enaO1rKequbeorMPAtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelZSOlZeMj5iaqaCRiIqLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Se4OVjoZyfX1meG9ramxndXNrY2dkY3R/YWRlZmVpamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kw6CypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanZmeo5qknZeemJuUmqCSqJarqJuTnJySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnhuaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCYraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCdkZujq6qpu5+opKCYmZmeoI9ropaYnHGClpukgHWSqqeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRmXmRmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmJCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6ernpOSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrZ6Ump6VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflJrY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cfr62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWkpiSmYWvamqKjap+Z4SVh61lcJ6dlJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWaHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK3usKnqbCrr6mpsK+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uinrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d/lJaXqZR+a4GmeoGFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinaeqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaiZn5yjn5ygo6SjlpufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yalqWQjZyNpHuOhqOCpYJ6rHmPnVWve4l+n2q5Wrl3hoN8poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp6nqbCotKmknJ2eq5eZl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mpikjI+cjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2hqqSxp6yppJqcmqmelpWYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrJqhn56QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioOog5mZoYmSmoqif5KYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfY6dh5mZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSUnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYyCp4aWoKGKl5eIo4KRh5SqfICLnXlvsVqng4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifn4+NjKmwr6adl5uopp+MkqSXqKunlJepp56foaOspKGeoY2UoZifoJKdl5yVnqCVlo+rm4+ubXK0cqmMdoqmc7R5dLOAkqSikpyNiaSHj3a4b4x7i6Jra7ZZoYZll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpKu5naOtm5aZj6Wjlo2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKjoJ6nq7CYoaOQmaKXoJuWm5ehk5ypnJSRq5mH1JKau3Oww4DDhn7Vlpy4eIiQmIyXiYyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2pqquxp7mvtsWxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirZiVoZCloJONnKOemJ2akJaTr7mxq5WXo6inlJCWpJykrZ6RoKirn5ufqaOynqOljqeilKGanJeVpJiPsKCSlaqehZCZtYCQkYy4lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWeDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssqqesq6m7rrDFr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56rpL6moaqXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vb7Aum6Sg3GUhmByalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxmolocox9hpVnan5xdHh9fWJbd3SBaFBcboN8e4tqWGt6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwaOatLq2oqylrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrKi+p6mmlZSblaCZk5ilqaeRnpCPmJ2wsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlJ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWhufXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpuUoJ2OgnqlhmtpfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGltabAqLSgnqSlnKSVlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZipp7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYk6CilqOel6COlpSLio2Ol62PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZk5GdjX+NZqGzroSJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopammpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKK0yLOfqqSrlpaXmqedqJufpKuUnp6cn6quqaWjq6Gtm5+goZilnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpqPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFebIqJgHZcaHN3d5GAh4Jud4J4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6gnZ+qr6qro6qfqJumn6egrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwcF7gXuRjJrCv31rpbFvjIBvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kcq6KlqKWktKOdopKmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2dra6orKajoqegpaWdramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaGgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2mErnR9loe4YYKtWaPNbo91e9p7f5lwfoiSdX9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gn6ino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kqrCov8azqKmxrpaSnZyil6Cpqp6UoJ+cna6vp6qpm6enpKGrkq20lqWjqqqeo6emobCgkpqnmqGblJSRl6BwhYyXdYWoh3GwfJ1yrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuv1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqqfoqWfqKiin52wrJealqinrqyop6mel5Sao6KSlKGtm52mo6+so6y0qbnNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpGBgUqyEf66CmnaugaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XX2lYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOosay2yLK1qqyplZGcnaKZn6WznJqglJyfp6uro66arKmioaqjs62iqrOxoZuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ6UgdK4tLjJgIGyXl+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWGNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwMa5raiyrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWeopeTqKq2sqybpZyglZClrZGZnKejoKqnrqKjp6mwtMKxsqqtqJOJmJ2kmqGjrqWXoZWYnKWmq5qvna2opp6so7esobG5r52br6eztLOklJiopJqfjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKihtbHDsa2qramRh5GcppyjpJyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyubGzp5iesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1laGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamRlJeuoKCep6Scp5y1mqCqo7WrwrCpq6mhjISPm6GgpqKVmZqcmJqZpqSmmKunraKlm62nvqyVvbCsn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqKChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvZ2doQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKLySmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqmklomakK6wrKafp5utmJiPrKKhnaaimqWdrZifqKW2qL+vpamknouAjpuaoKaekpSampOamqWjo5moq6ujpJ+pqL6kl8OsqqOhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbWZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20l6CzqKqrna+tnaubla6ooo6Im46vq6imoqeZrpOZj6iaoZ6ln5mjo6WZnqOpsqi8r6Sonp2OfIualaGgmY+SmpuRmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8rq2slYGpkqOvjpuAhqSXmI+AgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRrqajrKGknKqhmIujkqaeqJyaoamimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mVlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCsrKOgp6yfuqOkrayspo6WramQjIWVlqyepaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMGopLOmrLGyq66sqLmjrriWiqGopbadiZail4apmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmZOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJjpynlqukoZmnnp6TlaOXqJupmZSmoaOPmqeZobW6qKqYmpCNfIGUi6GUipSRlZCQk5elj56ZqJ+ctqOdp6y3qK7BrqO3p6+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZiYlpCVnpGIoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJipnI6GiombopCunqOVp5+hkpeYm66Lq5aPqJqojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKvr3WkvqOyoHh6oKuyu5V3raSfioCqfmRcYnafjqSdg5d+bpOznKOnrquiZZ6fknN5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhZ2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqaUlrigoI+co52RfoiIm52Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSnoJmYi4l0dpONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqjr7eBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6tq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopafoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePomueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4uTkI2QjIyXi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ef5KFhqykh5yRipiol5makYelsKailZqIiYBoboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh5x7gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3qGf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6Oh4+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd2o7Oio3+IlHidequaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGZsaGhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Ccc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIeSmZV8kqShn6OIroZ9tYSOnp17pZZ5qYKWnZCKoZ19p2h2bX6Zc6BzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpnaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa0tbXJoXOUioCfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dJhxUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVcZ2tuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJr6eEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecl3Bnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oGxupmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2SnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6WEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiUoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOro6CQgHWUloh+gXmUrqN/gZtxj4Z4kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlrjIVbeXhxeXBobn6SiXF/dIGPk5NxhYSCZYx/X4F/i3d1c5R1b3lubodthIVed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxmjHN5e5h4hFtqWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9wd3lsanZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjZSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWlke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZmN5g3qWW1xpZm52W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH17dG9zY2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iSm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgoiRiWt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmuBg3x5mWpyaGBzinB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV7fHJucGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1rfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqg42Sl5WPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG15dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG5rfYB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2en5wa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt/eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnpri4FzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOjopshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2llamNod4dtZmxoaWxogHx6d26Qh3OBg4R9c4GGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5COkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKj5GKnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2xtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9rcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3lyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyZn5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eGd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zdb2JxYF9sbnlwZ3BmZnN0aHFsYXdlXVZmYWByU1BOXGZlXXhwiHxeXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6OjoR2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZKblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6UiZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR6go+VmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlfa3F3ZmtqYmZ4cnBwY193YGBWa19ddk9OS2BmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2jHx0eYaBdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5ucGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l3hoSNm5qYmY6Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2tVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOKbVtcZHheYGRlhV9jYl5YanJrbmtydox9c3eEgXh3e4lxg4R9foh7dIuIiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcWhmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWhbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNygX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY18kIx+ioV6dXuCe3CGgJWZjpKUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GEfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJSPkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJpYlFicnhsYWVdWmqDbXNiW2dfZWxfblRab05IT2dlXGducYBsWltjcl9cY2t3ZGVdXFpsbGNtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3Bte4F3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYmFdnd9gXF1hoGelIWUj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en2NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaGFOZnR4ZWBdXFhugG9zWWVhXmpuYHBPWWtRRFNnYVprbm18blpbXmxiWmNvdmNmXF1gbGljbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeIWDpZCEk4yDf29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2OhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneXFaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiJeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYGViXyDeG52h4SDl3dviIVrdXt0ZXmCg6eLg46LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF0gZqKgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZW5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgYyThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjouJdnBshYOHdXmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmZ1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccFxPW3JwZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMiHJyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnYF/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Rne39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHR+d4BwcX9thHSUhnh0a2B6gnmIj2Zxg29ndm1bbX2AkJN/gHmSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Yn16Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFtiV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kY15uYlRcckdCZl9dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX52eH53gYOBe3N+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmLjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hZuIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHJYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVyf4eFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x8i212gHljg4eXhnOSi2+FhYF5gnRjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveImjgYR/cZmTcYB4dYJtgIKRh3OViIyIhIiEfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXt4cGZsYm6Jfm1tVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KJf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxof3BvcoB0iWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4F1YneEinyUgG6LaW16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f394d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoR6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSQf3yBlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYnN7aWhtaWBiV19aaYBqa2+AZ2thaHl4anN0dG2EgXt/fXZ1bXtoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6h3gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXWxyX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4Ryh3FveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bnB3dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYB7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdcWl51gWlebmxcYVZcXGuBZnF0fWlpXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR1c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1wbnaDmHlygYB8f4iLhn51dYZ5h4t9dHV1gnh6eoKMjn1+hIhqc5eBeoqdfX6FeoF6fnyGiHNxj66Me3uGj35mcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFhdYmOQpWh4dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldmxgZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dW9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2t2gZB5bYN+gIGSiISAdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg3yZknmAgHh5fX90iINzcJmie3t/iJV4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdjaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2jnNbV1NkYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGp5bG9wenx7cYB2f3J6eXlkZXVoXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6DdXJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i25ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUWmBZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVveX51XmZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBiX5rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tld2RlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHh+Z1pWWGBreHx7cIRfYl5nVlhfV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcGZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh455bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipGOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aIhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYaFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk4Ojw8Pj07Ozo4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs7ODc4OTs6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT07S2VAPT0+PTw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QD89Pz1reFQ9Q0U/PkA9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD88PD1ATUxGSHd1WTc8Oj09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkBJblA7PWSBgn51enZTNzg4Ojw+Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1d7eVJlhIODg4R8eFI8PT89QkZBRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAWXR3e4KBgYN8gIN7TD9AQz9KUj1NRzw8PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQT9SdXN+gHuAhHt+hmJAQ0NFPk9bTG1oSUBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZrdX5/eYKEhYWGfUpERkRCY36FiIl+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR114f4KDhISGhoeNakFCVnSFh4eHh4eCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTFh/hIWFgIOGh4l9U22Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKXoSEhYR/gYOGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklqhoWFgoCDgYKCg4SEhYWGh4iIiImJjI5mREM9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWeGhYJ/gIOEg4KCg4SGiYqLjIuKiYqLjIlePzc2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaoSBgIGCg4ODg4OFiYqKiYmKioqKi4mJioJINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUF7hICCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89UIOCgYKEhYSFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJZhYKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouJi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERV6GgoOEhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKXYaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlFjgoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1FRUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VRUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE1SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQPkBWVVlbY2BWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp0g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkA/Pz8+a1FKYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1ldHR2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTEhISktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l9e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxKTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkdLTkhESERJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGRktOT0tGSEpGRURESUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHSkZKR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFLSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TkhIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl1cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS05NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTElMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRUpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSkhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpKT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTUtMU1JMR01MSE5KSUhOSEpKSUhOT01OTEpNTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNEQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBFSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZBTEhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLSktLTk5VTk9LS0xHR0tQU1NOUE9OTk5PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdzUWh6bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5NSlN0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUVVVVlNaUU9TUldVVFlWVFlVU1JVU1RUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFJSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VXWFVTWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNYWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZUlNZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZXWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlRWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtaX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pYW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWFhXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1tgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXFxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFxeW1hdW15fYWNiYWFdYltiZGFfY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3d6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x9e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx9e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAf39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39/f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoWFhYWGhoeGhYaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoeCgYKCgoGBgYKBgoKDgYGAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYGGmoiAf4CAgH+AgoGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoGDhIKCgoGBhY6djIOChIKBf4CCgYKCgYKEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChoWEg4F+fXyAk52Ng4WEg4eFgYCBgoOCgoSDg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIWUi4V+fH19fnuNn4uBgoGBi4t/hoSCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hp6Xh31/gH6LhYCRhIGDgX+PkoGTi4CBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEnKCIgYyCfYaFfYKEg4SCgZSYgomIgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGUn4WEiISHgYB+foWFhYSFjoV9fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4iQgYKBgoV/f359goeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgICAiYR/fn1/hYF/f4CAf39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpGRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgIONhoOAfn6Af39/gICAgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgICBhYSCg4KBgYKBgYGBf3+Af39+e3qBi4yJioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgYSFhIKCgoKCgoKAf359fX19f358enyPjImLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4OFhIOEg4KCgoOBfn1+fn5+fn59fX59fX6Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgYSDg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Cg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIODg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgICBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KCgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXp8fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHem19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERAXNLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/Pz9HTz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K4n9HRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdWyl5i4upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3MnaOosdGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwsWIm7bV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8vXpZu11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjU1aKatdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCewteimbXU06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/aopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp602aOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecy9eim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbVsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PTk7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfn5+fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0E+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmZeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZyanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqraioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxop+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKShn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopqYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7G+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLWzv8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBy8vIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJvLrV1snMyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxrnKypzBxsPAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq7tsC52pt+vMK+wLy7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbi9ycqDhKXHusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3ube6u7q7v9Gpe3+Jur/Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyYnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wtrmyvb67xLa3t6aYp6antsTIjHl+hbnJz8LAuK61tby+uLqyvsTEysXBysPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwutHTtLu+vMW6tI5uaHBja3mfrHt7goW70dHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Syxtm8vbvHrY54Y2JqTlJaYH55f4WJvMrMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLi9aXe9zr+4r29ZYmRTbGdTUVFbc32Ej7vDx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7trvBwHRpfau+tnBWSlZqSVqBd3NUUGZ8hZq8vb/GwLnAvL7FxL29ubKwrri3v8PHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJDQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5yb96d2l/qZdWT0p3dE1RbHmDe1BUgomht7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMjAg35zcZNsT0hciWhPT0+Brn1dS3ikqLGyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fEu4yDe3h+YUlgjGpeUU9ega6OXlBOe7a2sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4usGbjIWJflNNiJ54alpWbF51h25veqW8trG0tbK0r6y7uri2usDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO8qpCNlppMVYq9ZHuCiWdie2pibXagvriytLOwsa2wubi2vri7v7Kysq6xrrmvqqutrKOooZ2enpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrCkmqSdTGB+j3lseX1jYWprdHltgqS3sq2zr66srra2s7y1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKm0v7Ozb2GFb2lpV2NdXlNUWWNhXHF7oraqsrSuqquvsLK1raWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpsPDkFV1bmZvZldbUUhFR0lMS05hZXuzr6+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp27soN9YV9tYVRIRlFLSURJR0VKVVlcpbKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopueo6ehf2doX1RHSVZ9fmhTR0NCRkxQU4qxrqyvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhj3dqW1FKRkxxoKegbE5FQkA/QlSDoKuqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHlnXFJNS0pSjdnZwI91ZFZJRFORrKitqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJ5uVk5MTk1WZ6HQu6CXuKaQiZiuuK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVYE5GSkxWa36nuKqGjNTWxr+3qJ+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelFxKQkhMaHmpuKGQf7HLu6+pop6cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKJsSkpMVXWizdK7oaSzqqOcnJygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGsgWVydpCz0dvRva+pmZWYoJyaoKCem5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1eVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGloYKKkrTS0tXCraagl5aYmpucn52YnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp4FsiIfA1cywm5uWlJebnp6fnJSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vcnR2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKxqaH6T1tCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0c/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWlX213qtSqkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxczIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKylV5wd7i0j4uTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4Zgc4OwkoyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL66uMm1qbGGaHOTnoyGiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFfZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqqyptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fOwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmviWtjiZOIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RiYWNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62oqIpjZ4uEiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmyr7q6sbakoKSfprGnq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKKNYXuHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtru7uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnqiqppeeiWWDhYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgm5murq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lpJilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smn1ogIOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkuLCkt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqetsrClq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r66vqJuYoKeTkIp0e4B8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrrKaYl56ii4hyfYh+dm5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Geraypqa2soaKilZijm5yQq6mwm5+in56XmZOJnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdQT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLTE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJmam4h+cIeDe3RpaWlsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6QhJGHkJGPmZOVk5ybo5yboampq6isp6impJmlrqSUmaWvqZ+bmZugnq6ZnKuzoKWmn6KjoZWTm5aWkqmqrZqcoKGgmpSQjJmOjJGMkY2WlZCdoaCjnJujlZugo6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhTVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqairt7asu8q7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSWl5WGeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKman6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThomNg4+LkpWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqbl5aSgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVhcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omqGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCan6KVlJiZlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZnJSShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qYk4qPiZyIn5iIh5aemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH2KiZWLjZGSlouEioiVhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjICUg3yBj5iVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaWFdUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWf25pbm9uWFVXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXltZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKyoqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHN0ZWdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3NybFtdXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3GDnp+RnH92hYWKj4iQaWhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH96gol6em9na3h+en5yamReWlpdalxhZl9ZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCjqGflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gIGBc2FdY15aZmtca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp4en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJaPjoGIbHNyfH98cWhgXGBeYmdjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKynqLSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiZiZKKlnp6foV+Z2BoXGViXWRjX2ZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLO/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq6orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebtqmMpI6Rk6CHeIKDdVlhZFZlYWFjYGFlX1pVSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxWT15VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6CfGpXYmFYamVqZVdbY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNz9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAinp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu8wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oauonpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBf3FfYWFcV2FfaGZSWGFWUlVJRUZOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLSkhGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6t7m2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSgn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXV9bWF1hWWNjUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHta+5sLC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1hmWlFdV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaYFwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW09QVFBOSD5BRkFCRTxAQj5FRT4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yMk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWuAc3Jpb3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbiqpbSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2ZhICFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlth3Z0b312hHV5e521jDxBi8alfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZGR0pKRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoOJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eBbo56dHd9fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+grZyimpmfpZ6frJmLmoyRko2FfYiHg4SLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy9DJw9HK1NbY19jX1dvX09nb1s/b2tHWyNXLlXl7aGhbWVBTU11IQ0VJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgm+ShHR8gYV6doZ7ibfGpMLJuIGWm493cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYyBhpd7iIifl5CJjYqLgnyhiZCLvKGXk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NbZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A9Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKScfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvoIuRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNiYqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqfb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjISnkYSZk4SZjKKWoJmTiZqdopKpr5+RlZCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmWk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSs5mMoaGMpJuvo6SdmJCnlqeZrK+kl5WWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmbOWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdo7ikla2kl6mtt6ako5+ZqZepo6+wqZqZnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnYuclJKNkJKMmZuKkZ6Qi4mVn6GNlI2Ymp2Tm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FQz48Q0FCOD84NzU+Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2i6eyra68qpu7pKitubirpqaioaOjqK+ysaqcnKSYmpeXnqKlpZKkuq6pwLytrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydkp+dm5igoZSanqempKKksLKmwcbDr7C6tsXEwr7NpsfDx8O81dHNxMqIdHNiXFlfW01KQkxARUc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrDxKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoJikn5qgm6CUmJ6mpKampK+tpcDEwq6ot7XJw762zrLEvsS8s9HKyMK1dXltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3HyMnB0snKws28wbOtu76nur+9vMS3rMGprLO7vqqwqaOlo6yts622taCfrp6lopijtLypm6i9waO3t7CrkrCtq6yXhpqqpqWRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOalaCinLWmkJ6XpaOipZ6dppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmW15YVhXXFtLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipB/lqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWwv8Sxvrmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysqqebnqaXmJeYlaGkqKaftqupurzDtaaztcvBuKm2rLK6uK6ot7q9uIJsblpXVFVORkpTTks/QUdEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbe4t7KxtbO4s6umnKuruKqop6+wl6OvpKekpLXAsKqstL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqylmqCllJOZmY6cn6eimbSpqrO8vLyqsLLHwLilq6utsbGjobGytKRwbmZcWk5QS0RQUFBRO0dKSUdIQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZePnqCao6S1yLSpxrrCw8fJyMjMzca+u7OuubjAwc22yLrBuLW6sK+vs7Smo5uqs7SqqKatrJmkrqWkp6y6v6irtbe/wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq6lpJ+lqJKSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMYmVhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqKZqrS7pqmmq6qdqK+no6qqvrunrby0t73HvLe1uMGxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmWj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmaurnp2ko6iRlZWgg4+enpyVqaSiobS0urWtqLWys56coqWal5WYqqGed2BcX11KSEZHTVFJTUVGRkJSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5ekl5mpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqsraCgmqqqxKKlqKumnquvrKKpqL+3pq29sLe2x7a1uLi/sb/BtrSztK++o5ejlpSclK6gkaKipaOjn5C+pamdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylnJWyp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lo8GloKqtn6Spra+ipqe9taWxvLi2tsOys7e5vrLDwLe4rrO1taOdpZWSlKGuoJminamoq6Oaw62pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZiew6ilorOhnLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrLOzwr+yxrO6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7yypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSco66anpuukJ6Tl5SagJGhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+boMOopKqyoaO0qpWzrKeipLKsrqm7sqywtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrmyp7qzt7K5wKq3ssK8tMWnvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqaSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWVnpSMj5yelIupqaqhp6CYnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaudubCro6q0trGwubevtri4xb7Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tq27rLOzuresubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWlpyTiJCbmZSOqaimn6Kbl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKGpvaGqr6ujsbippbWzrKCttb2us7i8ur22tsDDv8jEucTBwMC4xL3At6+1p6u3sbu+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqquzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5iFlZeLnZmbk4qNlpeal6akoqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakramlr662qq+1uqemsLfFt7G3v8DBtbS6xb7MxbnCv7q/ucO3wLixtKupura6ub60qq2xtZiYp6yqq5usq46rvZ6rrrGjq6CxrbOurrayubeqra6xqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako2ipaeyqaKnsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5yTgZOYjZ2cmpWPiZSTnpqkoaGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkq7S3ybq0uru/vrS0t8PAzMi7w7y2vb+/t767sLytp7q4t7bCtqutsbeUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqa6rsae4r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpaWlt6eisrSsp7KnrbC1rKWZoKyom5ydm5SquJyUjo6LmZyil5CYpaGelYORlZCdnJiWlIeXkJeappujoJKWkJCVdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1uci4rsG8w7ezsbXCws7Fv8G9tL2/v7q+u7HDp6m4sLa2v7yvq7OynJ+nsa2mpbClnrK1rKuysKypqLS5rLSytay0raqsqKupuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6KjkayepKCfoqqlprmlrLW1paqrqKyvtq6jnaOpqpugmpqSpLSaj4mOh5GioJWNlJ2glJKFjpKSnZuYlZOGl5OVmaaanp+MkpGOkHd+jYV8fH2HiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrb3Luq7Au8extK20wsLRxcW+wLK9wMK8v7e8xKest6yzuLzAsKuxraCjp62qqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaGnqaKspaOtrLixsqCpoqCrr7Csnp+nqKmZpJiZj6CnmIaEj4qLnqCPi4yVm46NhYeQlaCdlpiVhpaTk5ekm5yci5KQjYl+foeFfHd/h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9yLuxvbfCr7Css8TDzs7Dvr+0wMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq6CinrC3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqukrKKfp7G3ra2jpaKbqquuqZ2ipaSkmKCZlo+YnZOCg5CJhZ2gjIqOi5iNj4qDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gISCfnR3jKSIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ub+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+rubCosbGvsqy2qra1p7S2rKykqauco560sqiopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6mdnKa1rqimqaKjmKWmp6qcoqSjn5mYn5GOj5mOf4eNh4WenoeEioqNjI+MhIaUopqOjJqRkpGPkp+WmJaLioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT16ZVkhteFVkVlFiUE1VVFVRT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuVjrCgpauumqylra6ztK+rpa+pqLq+vMCwrritobavycfI0cC+vbq8wr26w8G/v66ysrG1vLzCsbGzq7OopLWppa2zs7mwo662sa+yuqu5rqqutqyqnqmsn6Kgtq2ooZ+vs6G0qp6op6qjq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsamjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iMfVNYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6SmrKSnpKymtLKxqqSwp6q4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmeo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4KAiJ6Phn99i4eQjpCEf5Obk4WTooyUkouRmpGVh4h+f3F6eX58aXh8enVwcH1ohXiEiGRhaGNyhXptZ3ldXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLO1sb24ur62rbm2v62hs6aqq7C1uLWrnry8qLLAs7qgr7O1qqyfrrCjnKWoqaOenKWxpq+gn6qpqKKqnKSooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqKqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5qVjYl8fouGj46MioSSmJGHlKOJkpKHkJmPk4CIfHlrfXZ5eGN7enFwcXJ4aIB0aoNnZGhhbnOObWJpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8M09ZPSOSmayZn5inpKKfp6O4r66jr7Cpq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegp5ikqKCwuJ+jsa+hrKGspJymp6mampufo5WdnJqdqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfHyhjY2IeYOMhImMjIWIkpqOiZWfiZGVgouWjJF8hHtzb31xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9gW3Jqck1NfmhYWk1QTEpIUFJQSU5cX25URFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJ2WraCgoaSht6uxpLO0qqi5xLWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaewspugpKCkpKGXnK+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaarmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6Ei3qPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3OAX1prdWlaSX1dW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcSzsK6ita+srq+0xMS9s7+6t7Czubi6uLuursCztLivv8G4rL26taais6qnqbOrrrKim8G2pai1tamesruqp6apsKyZoqecpKaUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpqclqCiq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV9nY2Ki4Z5gISHiIiRhZWTkoyQlZSNjpR7g5eOind+e2x0cmxsdGJ4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPAtrCsorWtp6+vuMDAvbHBt7Gusre2uLe2rKq9s6+ysb2/t667u7Gln7arpaW0qauuoJ/Cq6ilsLOqrLS6naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6KgmZuZnJKZnZSlnq2jmJeelZSOlZiMj5iaqKCRiImKiHmFd4KCgp2Hi4KJfH+EiIaFkISWlY+OkJGRkY2Se4OVjYZzfn1meG9ra2xodXNrY2dkY3R/YmRlZmVpamNpcVleWF1tZGFOaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE7M0FmSCU1m6SgkYytoZmYoJaltLGisb63obHGu7mwsaO2q6uuqbm9vLutwLKvrq22r7O4s6iruLGurrS2u7avuL2tpp21q6ChsaWrr5+kw6CypK6xr7ettZ2tr62uo5mcp6qlnpWbqKWfmaWip5yaoJyUnJ2tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUm5ySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYmEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnluaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaWZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+prqW3ube4rLuvraqrt6q0ua6lsrWxrqmxtrawsrW6p6iftqmenqqiqq2cqcCYraSusLa1rKyesa2wqqKbnKOsqJuVnKejnZqpoqOVmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielZWfkYmXmYCXi6CPeYaTjINtaX53g3FshouGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYRmXmRmbmxpXl9fiZCEhmhPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi82NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6qtq6O9xa+pt8K4vbytp7awpqukuLSys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra2kqK6rrKWhnpygqKebmKGmpZubp6edkp+gmZGeqKqjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOSm5KIhHJ4jI6EiKF2iIxpl4hmfXN4oW+Ih4R+jXt/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJysnZmZnZ+rqqiqv8Ousbq8t8C+qqS3saqsprO1rq+ztquppbGtpbWznK21trSlp6izsa2yp6+fqqCyqJ+ko5qipJyutZWkpaa2vaasp6mqrKimoqCZn6ajmZmmo6SYnKSplpOinJWTo6WmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ+XnJ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrSop6a1pqe4r52zsbWqpaSnsa6tsaaqnqeksaSioZ+XnKCfr62VnqKftLqiqaigra6lop2bmqGon5ibqKCfmJ6np5Gcp5uUnaGno6Cwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKelnqOkqrG3rbS9vrC3xLK4usKnqbCsr6mpsa+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZibna2ml5uinrSzoaqboa2toJ6al6CiqZyZnqSgnJmhp6SQnaObmKGfrJ+mpqCboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZR+a4GmeoGFiJKUknerZ2qxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1U5KGXlCpbWNxfoeAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqGuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WlprKzp6Oinaeqsqiwp6WeoJ+vlp+ZlZaXmJ+topqapKi1r6Gpj6moqZuelZigpaian52jn5ygoqWjlZuemJqdo6ubppmbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+utqibqLquoq+xoLO0sKCknp6nqbCotKmlnJ2eq5eZl5eXlpehqp2al6itsKmjn46soqeWnpecoaWhmKKhoqGaoqKnm56gnpWZm6agnKeUm5qfoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOfrLCkmKa6rqSxsJy0uKqgpp2hqqSxp6yqpZqdmqmelpWYmZOToqegl5OmqrGmoZaSrJ+lkpShm6Smn5WbpqehmqOfrZqgnp6QlpyinpyllJyVmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQVRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgtKyfoKirn5WntqyosLGrrbSkm6mgoKihtaamqqOZnpWloZSUnJmTlqOlm5OQp6yvpqCVmKmfoo+RopmopqCVmqapnp2knqydoJ2gjZSfm56gmJmclpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQiJSqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljo+MTAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGknqWnp56TqrGpr6q1rKuvoZihoKako7mio6uhl5yRoqCVlJ+alJmgoJCNjKmwr6adl5qnpp+NkqSXqKunlJeqqJ+foKOto6CdoY2VoZifoJKdl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5cp09iUmtlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qqoJumpKGdkquqp7WjsqiuqqCXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOlmaWso5GXq7KkoJ6oq7CZoaKPmaKXoJuWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGtaVltqel5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaKeo6Gcm5GqpKqypLWnraSflpqqmaasuJyirpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZykrZ6RoKirn5ygqaSznqKkjqeilKGanJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3p9iWeDeW15YouscHWFf1lbp2pFZFpUZmBjXWJRZ2dxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/pZa0w7Ssqqesq6m7rrDGr7W0r7intbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnaSkoouSkqabpaublqikpZyboqmmpqOooJGtnpainpeXl52ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboN8e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdWlxUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSktaqlm5iVopumrai+p6mmlpSblaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gqmqikmpurn6OZm6OnraKfqqGZsJuUpqCXlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1ZHd9dmtwe21gY1xwaE1ZWWVqX1dZb3ptbWZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqSlnKSVlqCrpqyjo7esoJmWlqCXraqlwJ6rpJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6qnJygrJihm52ipa+moqSnnq2YlqadmZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeWZgaWRjZGZqWGt7cGlqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCmoqGdmZeopaimpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqedqJufpKuUnp+eoKquqaWiqqGtm56foZilnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iIj4N7aoVYXmt0ZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZefo56hmpmmqpuso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4pKKnr56elZ6jnqOco6mokZ6hnqCqr6qroqmfqJulnqegrJahm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYmqKgnJuqp6Kcq6KlqKSktKSdo5Omrqy3s6evopKRmp2lkpGgoZecn52Hpqukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ6dra6prKWjoqagpKWdramRpJupraqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ5lZabX66PXo6ngKGhfaeWm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2mErnR8loe4YYKtWaPNbo91e9t7f5lwfoiSdX9le4d2dmt9iG5+hZGSfm2BjmBxa3BmYF94ZFtwaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqorbSrprKsrKykrKawqqCnm5qmmJyisJ+hn6ino6ahnrCsm56Wpq6tsauorKCUkpufpZOPn6WXnqijnq6kq7Cov8azqKmxrpaSnZyil6Cpqp+UoJ6cna2vp6qpm6emo6Grkq20lqaiq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYWoh3GxfJ1xrH6hn4Klj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkI9lb3R2b2BmbWRfb2lpbmZjV1NcYVpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXVxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6OhrK62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin52wrJeblqinr62op6mel5Sao6KSlKGtm52mo66so6y1qbnNsq2mrqyWlJydopifrqydlp+ZnZ+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpF9gUquEf66Cm3augaeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb255eHdubGZlZHFwZntoY11XX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+inrC1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kdm5OqpLawrqCpm52WlKejkJqiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqgk5yfp6uro66arKiioaqis62iqrOxoZuqqK+vtqOTl6SnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXSZo5WnqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn5we3V9em1cZmpycWaBal5iWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylopyyuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdprWeopeTp6q1sqybppyglZClrZGZnKejoKqnrqGjp6mwtMKys6qtqJOJmJ2kmqGjrqSWoZWYnKWmq5qvna2opp6so7esobK5r52br6eztLOllZiopJqfjoKdTniagX+feoSjfIKkhIenn5yek4S4fHx5uYJ+zMXCtniboZCLn36alpeKdp6YiqSYo6h+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGJdXpzhH5wXG1ud3JqgW9aZF9obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJyhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6GptLmkm6Oeo5OQobKZnpynpqGir62dpKiitbHDsa2qramRh5GcppyjpJyklp6YmZmlpKiarqGtpaaYr6W8raK3t62enrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmqZo5yViZ98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIySi3h9eY2BbWl3aXhzbn90XWRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqbO0pJ2mnamSlJeuoKCep6Scp5y1mqCqo7arwrCpq6qhjISOm6GgpqKVmJmcmJqYpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqaCiloWfgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWfmttfmJ9dG5/emBnZXFvZ2doQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qZraGQqqmklomakK6wrKafp5usmJiPrKKhnaaimqWcrZifqKa2qL+vpamknoyAjpuaoKaekpSZmpOamqWko5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqaqZdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OnlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgLFsZ26Zl4yIsVt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJWWe3iNnH1kc31ig3d0gHxhamZwbWZlZU9VY1tBVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCunaubla6poo6Im46vrKimoqeZrpOZj6iaoZ6ln5qjo6WZnqKpsqi8r6Sonp2PfIublaGgmY+SmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmJCBgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srDHg2qrsL2teHeivrt0gJaOppyPmpCVnHmBkJp5Ynx6ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRr6ajrKGknKqhmIujkqaep5yaoaiimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWWGd2iNanl+eWRsY2ZsYktkWEprWTpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvraqnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJeNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMKopLOmrLGyq66sqLmkr7iWiqGopbadiZaimIepmpCUnZOqs5mbo6ygspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4t/dIJ2dIiMcadtfJWRlJOBgY+Pj4+dlKCVl5aggoeTjHBoj3Zwind2fHpqbGRkb2NVYFlAaVpHYmBPWitGPSsmITc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01PUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLu4qqKlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqukoZmnnp6TlaOXqJupmZSmoaSQmqeZobW6qKqYmpCNfIGUjKGUipSRlZCQk5elj56ZqJ+ctqOdp6y3p67CrqO3pq+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMhnWGdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyWoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1iUGBjUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7uvrKyhopl6naKwpKWxqZabuKailJmpnI6GiombopCunqOWp5+hkpeYm66Lq5aPqJmojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSehJd+bpOznKOorquiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2hnF8hoGAYWmIi5WTi1t2lZFnaJCOcnqkmJhkeZiGgXeXaYOKgm55f2twZV92b2traFtmY2Jib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqeTlrigoI+cpJ2RfoiImp6Nq5qjlKeino6XkZ6Fda6QiKaaqJGWo4iburSnoJmYi4l0dpONlZOKlJCQlIyPk6COmp+mmZyyloCMnLWdtIySj72noX6nonqjr7iBjo6nn4SLhY+xqa+MiZajmnmBi6yGnJ2ip6qoh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeYFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5yGmH6RiYGCmGqNjIRreHtxcGdkd25pbGtbZWppZXJbXklUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWVthYWhmWlFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKCVpai1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopWfoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWPiJOQipSPj5uLj5GfkpafpJaerIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqeg6CYgZl/iouDiJhvjJKEZ3d0e3ZnaHVwZ2dsXmNubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilaOptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZuamaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4qSj42QjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaGSfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWsrJ+crbWjqJKgn5+mm5mOmLSZkIuejJWLdYGUkY2KppaVl56ef5KFhqykh5yRipiol5makYelsKailZqIiX9oboiHio6OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RenZmzlm97l56zdHJbnrKCaWJvdHVxaG9Ya2xycmVcaV5iS0Q9RDVRQVlxMjxSRl9KUj08Mzk1Ojo2RDs7QElQP1RNTlFARF9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjaS4ta6toJuinKOjpKybmrGtrJOXoJigpJmak56rm4uIkniLhXCAlo2Kj6CQk5Sdl32QiY6ooYeYj4qRopObmoyLqKikno+WhoN9anqGf32PjIKLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2tpW3FpeHljX2VXYkFQRU43VkJSbTRKWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJynn52tmp2wqKudl6KZoZ+Ylpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlI+Fi52RnJuJj6ijoJmLkIl/f2mBhnl/lot6iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX5uZWBsaHZ8ZGNgUV5WXVRWQFlFUWdEUldbYlheSUQ9QjhAQjpJRThMRFdBVlFbVkRGYlxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaGhraZOdgbGumYRTX6Cns7mzs6maooubqZybqJKhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgIiYlJ+ahI6onJqUioqJe4NrhIVxgaCLd4WNiIeSmZV8kqShn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ5+p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRenG9+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+Ea2dmZG12eGhfYVJbZVFRYklXSVRfV1NbZWpcZFBGQ0tMSktCSkU4UD9QTVdTWE9SUmBmZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36pr7K1sLOjnJiFmKegoKONpKigmKmJmZeYk5mTkqCXjYiFe3B9hGh9j4KTmoF3kY2OiXB/hpCTkmyXk3yIkJGjlYOOqpqUkoqFiXmDdYiAboKfhnd/koaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHFuVl5UWWhQUmhJVUxYUlZcZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRnY2pmb21laW1lopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko2Ig3lqeYZlg4x+l6B5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl5f3yLeXCQoYZ5gJWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VvY2aIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXJqcYFtcGhreHNrcFJYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfX9/jnNpj6WEfIWTjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaUl5ygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVxc297dHFian5uaGxTVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY2AjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOrpKCQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJieoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3lvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cXBvd3hvXWyGbmlnVlpgV1xla2NVYVVeUV9wd3lsanZlampqdXxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ybmp6Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaCaHmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZbHFbX2BZXl1mdH17dG9zY2traXt8cXt4dGRtdGhsfH51eXx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeq2CkZiZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlJqfiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLnouFlH9+jIGBdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiI+BdmuBg3t5mWlyaGBzinB9enZ1b3d0gV1eb4dobl9fWlxdU2hxVWNbW2FsaHV7fHJucGRramh/e214f3Fpb3BsZoF7coGAeIB9gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXuAmaqNno2Fn5yKnpZ8eZSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXuqhI2Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GRind9iI6FpXt8j5CRhpiqoZ2TnI+Nq42RgJ6MiJKZnoKOl36GjYJveIVxdGB/g4+GdYuXgIOPgoaEfoWDlG55dXSToouNhZqEhI10gIp9fHJze4iEe3mMjoSTp4+GhI+Cg4qJiXaFh4mLe25rfX97bWhrbGdeeX5nfHt2c3V1e3dcYHB9bnVgY1tcXlFmbVNlWl1ha2l2en5xa2xka2pngIBsc4BsbHRveG6EeW6GgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enNlam1ti4qfuJqho5+SkpaXi5qfnp17eJ6lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHKAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIp5x/cIuKi5KGoKGKhYx8qJKIj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joR5gISPh6GAfoyNj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfYCNhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxxeXqMhXp7ko2DlqaTi4aRfIWGh4R1goOIh3lkcnt+eHlwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZYCAam1+aG5xa313hnlri4FygYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmN1e3tyYmpveomNn7KSpaWcjpCYj4adoJqcfHakoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqWbh4yJg6aWhZKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5Sceo+Fg3iFl42efoGKjoxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x8cn94iod5hZGKi5iilYKEjHeIhIKBdnuBiYV0Xnh3fHN9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaDaXFuYHlnbGJqdnBmeXx6cWBybIaGkJ2ul6aono2Nl4eGoJOXmH13qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefYuVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SNjopshpiQmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlqdWx7fot+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dniAfYaBfYSOhYyUpJB5hYN0iYd9f3N1gIeDbWB6dXlwe29hbmJke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2llamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXJjh2hxb2V3aG5sYXpoa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JviZmEZ4aaj5R6iYWQinCWmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXyLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW5/fYCHfYWNioWNlaiNe4h9fouFd31wb4CFg2Nod3N0bnpiXm9ganRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoVzgIGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdvbGV7Ym6AeXZxbHd3in+jmKKooaabh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4Wjg2eGnYqRf4uEi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2ttb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiHuGjHuLh4SJj5yjiHyEd4KLgHh4bmqAgoFdcnJwb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJdam1kYmZrkm1gZmZfaGuBdXJycIuAdH+CgHh2gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3BsdGpob2x2d19xf3l7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoKMkqSak46IlZiShIaWmYyTi4mPj4iehZCKfHOLhYmPiJyZn5uWlICUf2mGnIhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox7iX6DjJGfnYV8fXiCi312cGlrgYJ5X3dubGtxclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZmYGByU1BOXGZlXXhwiHxfXWhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIR7eZV3ZnJqg2CHfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+DmoiAi55/ipmTjoSIl42Oj4R2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIJ1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoiZKHbImkhZOIl4OGY4yRmI6UipaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen1+f4aOenpoc2tzi4+KgoWFfZWMbH5/b4CMf4yIfYR6gpCWmpuLfHd4g5B5c21mcH+DbGl0bmdoc21TXm5kcFlfa3F3ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn96iH5yiYeBkYqIfH6YdmVzbnxlh35ucGuAWmxueXlzYHZ6e412cneKd3mfi5uum6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eJi32LpIWSiZ2FhV6LlJeKjomOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFjH55ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmJ0bW9haHVmUmBwZ2tVX250eWByY19ofXFybVpicmFiV25ZXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3e4lxg4R9foh7dIuJiJaGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWR3eYaMaXaAiXJ/nIeYp5yjkoR9cIyUeHmLnYSFoY2OfJWMf5qIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GFgomHmaKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdmJ0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpORl4lucnqMhnVscWtyeIBfdGluXGp1YFJkcWhmU19wdnRgb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW9qdHeKfnNzgX56dnqIc4WDfH+HdneKho+YgY2Ce5N2bHd1eXmTdG54en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJWPkZOEbnB5jH91bW5qa3p9YmhqaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsbGJtaXN2hn9xbn98fHR4hniFgnyAh3V5iYGSlnyJhnaJgW94eXuEk3Bte4F3XoN/dIFtaXpzlHNncoh9cpKRg5qfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8iZidmIeUjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccWJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGpja2lzdoGDcG1+fH90dYN7g4J8goV2fomBlpF4g4p0gYhyeXh+jZBvb3yBcWmBeXp+bWx8dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHR7aF9lcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRjIVua4WSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYWbmZSLk5CUhYdwe5KCfYKDiYNugXhogIR4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2NhHhub36EgHd6ZWhqfHBfWXdaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtocXd/h25rf36AdW+Ce4CBfoN/doGFiZeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4qDoZmckoKGZ4eDb2h6lYh9f4SBmImBfI2MaXhya2xmX2FveG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjIt1fY9/hYKViXyDeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHV3g3mGnJCMkJGSjIuGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dheYSBcWRxaH5tdHF0gZuLgH+FfnJ1fYBzgXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1lvZExacnJlW0lwd25cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi254foB7e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzj4uJdnBthYKGdHmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn52gIF8jJmHgpOQmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4FyYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXN/fX+TiYl6bm5qboKCdW5dZ2ZzcVFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWWhNQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5CMiHJycIR7gnN1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dmNqfIOHnoF/f46PfXJ/dIV5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhsf3lzaXp2gIJ9aGB3h31qa3Rne4BpdoCLkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZHVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2pkUVpwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fnmCgYF8dn2DiIaDcHeDcm52goN9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHV+d39vcX9thHSUhnh0a2B6gnmIj2Zxg29ndm5bbX2BkJR/gHmRkn15e22HdoCQi4R0loqRjoeFhXt/hWx0dn9tZ3ZlbXt1bWp2d39/fGBieIV5aHR1Yn17Z3SGjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXl7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH13gYOBe3N9g4iHg29xf3RxdX6FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hpuIgoFzl5R3f3xtiHGBiouHcZeOkIiFi4N7eX5xcXB9ZmhxYm14cWprcXd8fHlcZHmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1ye3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZvd4qjgYR/cZmTcYF5dIJtgIKRh3OViIyIhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkVrWmFkV1lVeVlOVm1qWV1sZVxaZWNedGZtZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN4enpzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk39yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHR8c3x6bXt7kIV2mHyHhoKGg3x0cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ1Z3CAd4F1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpwenlzfmZ+f395d25kZmJuhnxta1ZqYnBTS2hqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39+hYV6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgot5boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2thaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9njqh3gXp8kI55dW9+b3J1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2lvgH55d2B3hIR3j4RyiHFveYByY3FpXG93ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0trZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFVubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR/eXZ0hYiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gICBc26Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXWt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ4b3qNfHaOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3JrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVlxdGJxcoV8dWRyf2xhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x8dXFuhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2JwdnZsYltsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtbnlnd218hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3BhcXGCfHNmcYBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSiISBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN4dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqal5abXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGp6bW9we3x8cYB3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZqaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGttYnFzgXpzZm9+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1FPWVJJY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIuPg4KXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5ue29md3B6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5waGlzcXNwdHVqbYSTgYh7hXFyZm59cHJvVFtmamZxdIF3c2JsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRVlNQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmt5dW5vaHZ2f39sg399hpd7f4iBin5rk4hyZ3SAe3WAg32Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHxwZnhyeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmd2RlXVhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3ltXHdxbHppdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB+bGZrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYiNfnyKiI56bpCKdGxzgnR/f4iFhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ucUosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2drPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHhoeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiMiY+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gICAf39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fXx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISUdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tKSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZDRkZER0lIQz9AP0BBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAgH+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTs3ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc6OkA/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT8/Pj09amk+PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlJSUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9CREQ/Pj0+PkBAPEp4c0w9Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRUo/PDtSb21nZXhzSDg8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNemM9V4GFhoaCeXJGODg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1Z3e2d9g4KDfoJ+dkc9PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0VAV3V0f4F9goN5gYVyREBAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBOdHJ+fXiChYGDhl89Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4CBgYSFh4aIhEtDRURDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1hzgYSFhYOFiIiNZT9BVnSHiYeHhoeCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSliChYaEgYKGiIp8VGyFh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKY4aGhoOBg4KEhIODhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aEgYOGgIGCg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGg4F/gIOEhISDg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFcoWAgIGCg4OEg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUaAhICDhIWEhISEhomKioiHh4iJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89VIWDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJdh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWGHg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKX4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9APkBAQ0ZKSlBng4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlFRUE1OTUtKR0ZDR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTUtSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/gICAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJbXE97Tk9PTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRExRT2FXUlhRUFNTUlVbT09RVlBNSkNGPjo5NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTElISktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg5R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fX1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9OTUlNTElLTExLR0ZGRUQ8QUE+O0BFOzw4OVRxcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPSEpIQ0lLTUxKRkZGRT9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEtNTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpLREdCPT49Ojo6O0FCPz1CQ0NDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETUZCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVOSENHTUxOTVBNTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lHSFBLREpNTFBOUE5PT05KSklNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj9AQj9AQkVHSkZKR0lIRkZHRUNCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBQT05PT0xLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk9QTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1IR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PU1RPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF5oZWNgZGVoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vc3N5TklIR0lEQUNIRTxARUNFPTg6Pj4+PT1BQj0/PkFCRkNFQkNHRENFRUZHR0dJRkhKSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY11cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF3cXVNSUtISkVCRUdFPEBHRERAOTw+QEA/P0JCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQUFAREFAQj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gYGFhYWBiZGViY2liZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRENBRDw/RUVFQz1BQUNCQUNFQUNEQUFFR0NIR0hHRUpGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxLTEdEQUBEPj5ERUZDQENBRURERkNCRUdDQklGQ0hKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRUVGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFREBBQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTU1GSk5ISUtKSUxKSkpLTU1OTk1NS05NTVtyb29ucHBsa05QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTklMS0lKTUlLSUpLT1BPTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZOSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tLTk1MTEhKSkhKRz9HRk5KS0tMS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJXXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkZIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9EQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNFQERDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFtcXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERWXklHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURAQkNGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpeXmFhZWZjaGRrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0dYTUhISkhHTkxRUUlMS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYERDX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2FUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09MUVROT1FQS0xPR01QUlpaVFFRT1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJiWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmNkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkRCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU9QVVRYWFhbW1VTU1dbV1hXWk9TVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU5TUlhVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWVtgXlZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZZVFdXVFJSWFZVWl9aXmBfVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VXVltcV1FUV1VXWFZUWFpUU1FZV1ZcXltfX2BVYVxgYV1gYl9cYF1jYWNnaWRmYFpjYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUlRWVlhZU1RZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15VVU5WV1deW1hRVVVYWFhVV1lbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVXVlNUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWV9aWVNUVlpZWlZYWVxWVVpdXF5gYV9lZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWU1lYWF1eWF1bVV5fWF9fWFxWUllUWVpaYFhbVFZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWV1VVltcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVlVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlRWVFhcXF9gYF1gXVdgXlteXFteWFZYWFtbX19bXldYXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYWZlWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVtfXlpZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2NiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6ent6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+waGKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCg4ODg4N/fHx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3d6eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXp6ent8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8enx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JycXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYGDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOBhoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH59e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f4CAgIGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4CAf4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoOCgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn59f39+f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhYaGh4eHhoaGh4eGhYSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBho2CgoKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKCgYKPm4WAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICBgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKBgH9/hZabiISChIKBf4CCgYKCgYKEgoGBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFhIODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhIOBgIKDioiGgH19fXt/l5yJg4WEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYSEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCAhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaZkIZ9fn5+h36NnIWBgoCBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4ODg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9+hp6dhoCJgH+HgYCMgoGDgYCAgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoKDgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICDmqGIhYmDg4GAfYGEg4SDg4ODgoCAgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSCgoSHfn59fYSFhYSFhH99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aMgoB/gIWAfX17goeGg4B/fn5+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgH+EjYR/fX2AhoF/f4CAf39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4CAgYWEg4OBf4CAf39/gICAgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CDhYOBgoKCgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEg4OFg4OEg4KCgoOBfn19fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OFgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICBg4ODg4OCgn99fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKAfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foGTkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyAg32Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXt9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+enx7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH+Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX57fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgIF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f35+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGCgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKBgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fn58fX+AgICAf39/fn59fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXt8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fX+Af39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoCAgICAgH1+gH2Ag4J7fn57e317enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgIB/gYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhIODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgYKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eXZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp7fYB+f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4WAfoKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4F/fX5+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn1/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhISGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SEhYOFhYGAg4N/fn+Af3+Ag398gH19f4J+gIF+foF+fn59fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4B/fn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYWGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn5+fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+fHt6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYOBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgoOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdGZrJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3ElIicnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwr/JmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8zSlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjZr5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCew86Lk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/P26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCrkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqefsaSkqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwc7DysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJus7TyMjNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu+wcfBxcPTianPxMTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbezrrq7tr7MtoSe0ry/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK63tbi/z5uBirXBusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube4tK24sra9xcWHgYCfxL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+xtrqxvb67xLa3nH53gnSEk8Gse4GCnMnGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owu9Tau7q+vMaynXdjbGRQW2F9j3qFhpnLztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Sistu/vL26fWRvYGBzW1RVWGx8hoibyMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLfBb2+wzcG0elpKZGNLcH5uYFFZeIKLoMXCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru/x31vdqS/m1VST4NnT1x8gYNsRmuCkKzDvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5x8iCf25/pXNRTGKVX1FRVY6Wdk5li5yuuLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMfIioN4dI1hTGKKcVxPVmSwundWUH6vsLKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDw5GIf395VlGOlGttVmVwZ5R+cW1eh7yzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucOikImQfkpemMN0gYqQXXZ8aWp0irS7tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK7r5SQnZZMYo2UdnCAemNqbHN+enOeurmytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrSmnaqOV4FvbmpcaF9dVlleZ2NpgJe4sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmxwLevaHh4a3NoWV5QSkhKTFFPWmtuoraqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpcTDjmBlY3JjVExGXUlQRk1LS1NeXXy2r6+ztaqnrKuinJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp25sYV6Z2pjVkhQXo57bFNLR0dOVFRkq7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueo6eafWxdVExJVYOqsZ9oUEZDQ0dNXpSwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGhhm5gVVBOT1yr4Nq6j3ViU0hCTYuZmquqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHRZUk9SUl11uNK6oKm5noR5ia7Eo6itqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJxmUElOUF11jbK9qYei3NbO1NnItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyUXUtFTFN1hbO2pJKJxePc0cS1pp+ZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmNKSU1cfqrR0Lags9PMuq+oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKV3XWdog7DS2trWyrqyqqOenZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGqiYGSr87U2drPvK+om5aYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGmlXuTksXW0tXCraahmJWXmZqdoJ6ZnJ2SfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppnZpf5TT1s2wnJuWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFysvMz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Sooahkb3yo2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfLy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raacXm93utCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxMvFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwLTDvrKyjWBygb+wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7rLw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8C4xb2rr35kdZC1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL64t8m1qbCCbXGXmo2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61r7uysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvr+8wLqys7TDrqmuhmhkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62op4dfcY6DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsn6KKYYKHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNn6Gjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadgmWChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyioqidm52lpqKmnKCgm5iurq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6SmndpgYOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWXoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqets7Clq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r6+vp5uYn6eSj4pweoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrq6WYl52hiodxfIh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkI6Uk5SdlZaXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOjJGMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAc2hgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWfm5pbm5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3tycG9sYFtcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHJzZmdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3Nxa1teXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gol6em9na3h+eX5yamReW1tdaVxhZl9ZT0tOV1JRSVBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+Bc2FdY19aZmpca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cWhgXGFfYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFgoaJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKyoqbSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9ZmBoXGViXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rbS/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhhZFZlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbS0wLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BempXYmFYamRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFfYWFcV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXWBbWF1hWmNiUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1pmWlBcV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW05PU1BOSD5BRkFCRTxAQj5FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSW09KR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZFRkpJRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy8/Jw9HK1NbY19jX1NvX09nb1s/b2tHWyNXLlXl6aGhbWVBTU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJuIGWm494cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiZCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiZKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eXdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvn4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqeb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdopKpr5+RlJCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqpmYnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnJm0l5WrnYuclJKOkJKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FRD48Q0FBOD84NzU/Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5paSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr7NpsfEx8O81dHNxMqIdHJhW1lfW01KQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrExKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762zrLEv8S8s9HJyMK1dHhsXFhbaVJMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nusC+vMS3rMGprLO7vqqwqaSlo6yts622taCfrp6lopijs72pm6i9waO3t7CrkrCtq6yXh5qqp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWmkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMSvpbO3zMC5rsSzu77CuK3Cw8LAmW15YVhXW1tLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8tLzLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypZailqysqqebnqaXmJaYlaCjqKWftqupubzDtaaztcvAuKq2rLK6uK6ouLq9uIJrblpXVFRORkpTTks/QkhEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7y/z7bEvbi4t7KxtbO4s6umnKuruKqop6+wl6OupKekpLXAsKustL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfr5yfpZSvrqulmqCllJOYmI6cn6aimbSpqrO8vLyqsLLHwLilq6utsbGjobKytKRwbWZcWk5QS0VQUFBRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK+vs7Smo5uqtLSqqKaurJqkraWkp6y6v6irtre+wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura+s7Ktvrm3oKOnqKWnnJytqamMYmVgX1FLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqOYqrS7pqmmq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7CrmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKKpqL+3pq2+sbi2x7a1ubi/sr/Bt7WztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaymnJayp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXt7GjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lpMGloKqtn6Spra+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtaOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbyxqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSbo66anputkJ6Tl5SagJKhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+utLKnqrmyp7qzt7K5wKq3scO9tManvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWWn5SMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLevqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWl52UiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbippbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SprrG2nperraitl6eojqe7n6Sts56rorGws6yptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ksra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5eFlZeLnZmclIqNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlr662qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytayqura6ub60qq2xtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurrayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5uSgJOYjJ2cmZaRipSTnpqloqGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2up7q4t7bCtqutsbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbG1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SquJyUjo6LmZyil5CYpaGdlIKSlo+cnJiWlYiXkJeap5yjoJKWkJCVdoSQh3uFgYSMi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q/vLLEqKm4sLa2v7yuq7OynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLSytay0raqsqKypuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOpqpugmpqSpLSaj4mNh5GioJWNlJ2gk5GEjpOSnZqYlZSHl5OVmaebn56MkpGOkHd+jYV9fHyHiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e8xKest6yzuLvAsKuxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sbKpsqmrpqWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+nqKmZo5iZj6CnmIaEj4qLnqCPi4yWnI+OhoeQlJ+dlpiVhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalo+YnZOCg5CJhZygjIqOjJmOkIuDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gIOBfnR3jKOIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+qubCosbGvsq22qre2p7S3rKykqauco56zs6iopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mZoJGOj5mOf4eMh4WenoeEioqOjZCNg4aUopqOjJqRkpGPkp+WmJaLioN/dIaBf395dIN/enh/gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra6ztK+rpbCqqbq+u8CwrritobavycfI0cC+vLq8wr26w8G/v66ysrG1vLvCsbGzq7OopLWppa2zsrmwo663sq+yuau5r6mttqyqnqmsn6Kgta2ooZ+vsqK0qp6op6qjq6GirK2ova+srq2iqKigrJmQr6GYoqCop56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoSDo5eFgoKLho6NkYSEk6CWh5CckJOQjZGclJePioaFeHSBf3x1eHmAe3RzemmBhqN1aV5la4F1ZoiLfVJYcF1KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsL0tnOjQ4Xz1hZD9GMUNQW1srSE45VUE0kY+yoKSmrKSnpKymtLKxqqSxqKq4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0p6essra5s6iovLWttbywvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeppKmeo6mnqb2rtK+unamkoK6cm7KjlaScpaWfpJuaqaulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4J/h52Phn9+jIeQjpCEf5Obk4WToYyUkouRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXlsZnhdXVVBVnptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9GakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLK1sb24ur62rbm2v62hs6eqq7C1uLWrn728qbK/s7ugr7O1qayfrrCjnKSoqqKenKSwprCgn6upqKKqnKSooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5mUjYl8f4uGj46MioSSmJGGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnONbGFpb19vP1t4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhZMTNTPWVfREw2S1dlTyo8M09ZPSOTmayZn5inpKKfp6O4r66jr7Cqq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSoqaqwrrmxqpu7vaSwv7W1oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6ehp5ikqKCwuJ+ksa+gq6GspJymp6mampyfo5WdnZqeqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfXygjIyIeIOLhYmMjIWIkpqOiZWeiJCUgouWjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2BmhX5fWnNqcUtMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MjxmZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKirsK2zsKeavrelrby1r56wt7CopaewspugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGrnqyjr5icqqWpnpibnqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6EinqOl4qNhniBh4SIi46FjZOYjY6WmIqOlX6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI5Xl5sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcWzsK6ita+srq+0xMS9s7+6t7Czubi6uLqursCztLivv8G4rL26taais6uoqbOrrrKjnMK2pqm2tKmesruppqapsKyZoqecpKaUmKGypZmepKmpnKKgk6WgpLmopKeup52loaiTn6mioaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV8nI2JioZ4gIOHiIiRhZWTkoyQlZSNjZN7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXpjYVJzVFtbU0xJR0lPU0AhKWleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPBt7CsorStp6+vt8DAvbHBt7Gusre2uLe2rKq9s6+ysb3At668vLGln7aspqW0qauuoJ/DrKmmsLOrrLS6naiqq7GlmJ2qnqelkZmmraKZnqSpoZuinZegnae2pa+qrqGhnp2hlaCmn6KgmZyanJKanpWmnq2jmJeelZSOlJiMj5iaqKCRiImKiHmFd4KCgpyHi4KJe36EiIaFkISWlY+Pj5GRkYySe4OVjYZzfn1meG9ramxndXNrY2dkY3R/YmRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPjlfbGlHQlVTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE7M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6irubKvrbS2u7avuL2tpp61q6ChsaWrr5+lw6Cyo66xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaWjqZ2aoJyUm52tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUnJySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGltq+prqW3ube4rLuvraqrt6q0ua6ls7ayr6mxtraxsrW6qKmftqmen6qiqq2cqsGZrqSusLa1rKyesa2vqqObnKOsqJyVnKejnZqpo6WWmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielpagkYmXmYCXi6CPeYaTjINtaX53g3BshoqGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYNmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrbSmsLWjqLi3tqmnrLazrrSts6Kpn7SrnqKknKeomq28laelr7O3ra2kqK6qq6ahnpygqKecl6GmpZubp6edk5+gmZCep6qjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6EiKF2iIxpl4hmfXN4oG+Ih4R+jXx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJyrnJmZnZ+rqqiqv8Ovsrq9t8C+qqS3r6qsprO1rq+ztquppbGtpbWznK21t7Wmp6izsa2yqK+fqqGzqaCkpJqipJ2vtpWkpqa2vKasp6mqrKemoqCZn6ajmZmmo6SYnKSplpSinJSToqWmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ6XnZ2lrbKpscK9srXAtbe+wqums6ysqaivtKqvtrOop6a1pqe4rp2zsrarpqSnsq6tsaaqnqeksqSiop+XnKCfsK2VnqOftLmiqaihra6kop6bmqGon5ibqKGfmJ6np5Gcp5uUnaGmoqCwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYCUeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKaln6OkqrG3rbS9vrC3xbK4usKnqa+rrqmpsa6ksLqwpKSus6Opuames7OxpKWgqq2wrK+mqJ+jorGdpJ2YlZibna6nl5uhn7Syoaqboa2toJ6al6CiqZ2ZnqShnJmhp6SQnaOal6Cfq56mp6CboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFiJKUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGnta2jq7WkpbOzp6OinaeqsqiwqKWeoJ+vlp+ZlZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5eZl5eXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrLCkmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmelpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyWmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWloZSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5yRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmkmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWto5GXq7KjoJ6oq7CZoKKPmKKXn5uWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpbVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5p5qeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaOepKGcm5GqpKqypLWnraSflpqqmaasuZ2jrpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZ2krZ6RoKiroJygqaSynqOljqailaGZnJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZVpUZmBjXWJRZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKeeoaG/pZazw7Ssqqesq6m7rrDGr7W0r7intbitqaOipp+gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnqSkoouSkqacpauclqmlpp2boqmmpqOpoZKtn5ejnpeXmJ6ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6ooKihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaeRnpCPmJywsr+sm6eep6KJk5Gqm6ikm5usoKOam6OnrKKfqqKasJuVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1xwaE1ZWWVqX1dZcHpubmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6rnJ2grZihm52ipa+moaSon62Yl6admpqgnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3l1g4iCa3RjeWZgaWRjZGZqWGt7cGpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLOgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqeeqZygpKuUnp+eoKquqaajq6Ktm5+goZqlnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYRzdoiJj4N7aoVYXmt0ZF1ziGlrfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6qro6qgqJumn6ihrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+Hb3eFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZecn52Hpqukq62/wLGhqq+ql5KfnqKZoqSqo5OgoZ6dra6prKajo6agpaWdrqmRpJupraqcnaqcrKKWmKWWoaOYnH/OlHl6pYJ5lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4d2dmt9iG59hZCSfm2BjmBxa3BmYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSqpbKsrKykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpugpZOPnqWXnqijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qpm6emo6Grkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkY9lb3N1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62rqixp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrJiblqinr62op6mel5WapKKSlKGtm52mo66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmZjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb254d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK6prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kem5OqpLawrqCpm52WlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquro66arKiioaqis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiaCWlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5WoqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6Se3CXkn5wenR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaWbqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglpGmrZGZnKejoKqnrqGipqmwtMKys6qtqJSJmJ2lm6Kjr6WXoZWZnKWlq5qvna2opp6so7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4fHx5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSZpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjlnt9kpGJdXlyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Oeo5OQorGZnpynpqGir66co6eitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iarqGtpaaYr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph9i4ySi3h8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnamSlZeuoKCep6Scp5y1mZ+po7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaeZgpSNlot6eYGWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWimqWcrZifqKa2qL+vpamkn4yAjpuaoKaekpSZmpSamqWjo5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4yIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omoqXkJWWeniNnH1kc31hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCtnqubla6poo6Im46vrKimo6iZrpOZj6maoZ6ln5qjo6WZn6Kpsqi8r6Wonp2PfIublaGgmZCRmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmI+BgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srHHg2qrsL2teHeivrt0gJWNppyPmpCVnHmBkJp5Yn16Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqhmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXl5iQlZ58h46UdWWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6OjoJGMpZOnmaiZlqOqoJacpaWnr7qrrJqbk5J7hJeNpZeNkZCYlI2YlaeUnpeoopqwpp6irbqgscKopLSmrLGyq66sqLmkr7iWiqGopbadiZaimIapmpCUnZOqs5mboqugspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4uAdIN2dIiMcadtfJWRlJOBgY+Pj46dlKCVl5WggoeTjHBoj3Zvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp6TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+ctqOdp624qLDCrqO4p6+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaKwqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyVoIOGl4Z5cZVyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7quq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJioj565tqSlmJuNiXmBk4yak4qVkZSQjZKWooydnqien7ikf4SwtqOxsHSkv6SyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSdg5d+bpOznKOnrauiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2h3F8hoGAYWmIi5WTi1t2lZFnaI+OcnqkmJhleJiGgXeXaYOJgm55f2twZV91b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqa2jp62kkparta+xpZqqpquXc4ucr5+oq6eTlrigoI+co52RfoiImp6Nq5qjlaeino6Xkp6Fda2PiKaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPk6COmp+mmZyyloCMnLWetY2Sj72ooX6nonqjr7iBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5uGmH6RiYGCmGqNjIRqeHtxcGdkd25pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKGWp6i1no+DnKucp6KgjZC+npmNn5qgkH2FjpmXiKudopWgoZKNlImGgJGnjYainKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GfkZafpJaerIiftIm0mq6Lyoerrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2drXmJubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilqWptqOvf6CnnKWenYmUvZmTjaCRnZB5g5aWkYermZuamqGFj4x3m5yPn5CInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZegoaWsrKCdrrWjqJGgn6CmnJmOmLSZkIuejJWLdYGUkY2KppaVl56efpOFhqykh5uQipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvdHVxaG5Za2xzcmVcaV5iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJuinKOjpa2bmrGtrJOXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Scln2RiY6ooYeYj4qRopObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2poW3BqeXliX2ZYYkFQRU43VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNHVD9ZUlldPkRiXVZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mnJynn56ump2wqKudl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVl455ioSWo52JlI+Fi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX1tZF9raXd8ZGRhUl5WXVRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRFdBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZycqZOhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5WHcoCJkqCccpGQgIiYlJ+ahI6onJqViouKfINshYVxgaGMeIWNiIeSmZV8kqSgn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+EamZmY252eGhgY1NbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UD9QTVdTWE9SUWBlZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKONpKigmKmJmZeYk5mTkqCXjoeFe3B9hGh9j4OTmoF3kY2OiXB/ho+TkmyXk3yIkJGjlYOOqpqUkoqFiXmDdoeAboGfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdmt4h2ZqZ2J0dXFuVl5UWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmb2xlaWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko6Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6mXjJGLgIl6gH2KeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXNrcYFtcGhreHNrb1JYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5COinuHcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKskIWQioGKfYCAj3Npj6WEfYaUjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVyc297dHFian5uaGxTVltVYWFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNjI10hnqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY6BjYmElHWCh5JvbIqogIKLlI6JnJ+JjZOro6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cnFvd3hvXWyGbmlnVlpgV1xka2RVYVVeUV9wd3lranZlampqdXxxcnRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW5qKaLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm56Oc5WLiHF0a4J2c4BZcm6GkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZa3FbXmBZXl1mc317c29zY2traXt8cXt3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHVvdWdrZ2RdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrChkKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiIaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iOl4iVi4udl4SDeqyBkJeZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlZufiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiY+BdmuBg3t5mWlyaGBzinB9end2b3d0gV1eb4dobl9fWlxdU2dxVWNbW2FsaHR7fHJucGRramh/e214f3Fpb3BsZoF7coGAd4B9f4R6bYKMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNno2Fn5yKnpZ8eZSCe46ZiYaEhIZteIGAcoCHfoiThG1rfnmXhoSDkH6AhoSGfYeDjZqckoeqnoNyio+FkpKLnZF9jXqpg42Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GSi3d9iI6FpXt8j5CRhpiqoZ2TnI+Nqo6SgJ6MiZOanoKOl36HjoJveIVxdGB/g4+GdIuXgIOPgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qKinaFh4iLfG5rfX97bWhrbGdeeX5nfHt2dHV1e3dcYHB9bnVgY1pcXlFmbVNlWl1ha2l2eX5wa2xka2lngIBsc4BsbHRveG6EeW6GgHaCgH2FdnGCjYh+e3p8f3uCimBpe2t1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXt/eHKAhX2KkHxraHyAl4iBiI58foaEh3yPgY+am5GIp5x/cIuKi5KHoKGKhYx8p5GHj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIKbkYmSl5t+kpJ+h46BdXSCcHZgfYCNhXGKlXyIjHKNfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4V1goOIiHplcXp/eXpwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9xa313hnpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmJ1entxYmpveomNn7KSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N8hZeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqabh4yJg6WVhJKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5ScepCGg3iFl42efoGKjoxzl6KeoZKYjo+ijIyDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIOCdnuBiYV1YHd3fXR9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBjamNtZmh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGoJOXmHx3qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefIqVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqnj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SOj4pshpiQmXqHiJCJb5edmqOTlYqNn4yGgpKcf5KSlYaZiHuKiYF6cXlqdWx7fot+bYWRgpR3cIKDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9gHN0gIeDbWF6dHpxfG9hbmNke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2plamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpImNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JvipqFZ4aaj5R6iYWQinCWmpShkpKIi5mMgoCRnnySj5KLmY57ioSHdHN1a3FudXyLdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wb4CFg2Nod3N1cHpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGZiZ3GObmRpZ2VqaIB6d3RujoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ6Kj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnpGQiImVjn9+j5d8kY2PjZqSfIp/gm92b2ttb3B7hWlzg46XinF3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwiXyHjXuLh4SJj5yjiHyEd4KLgHh4bmqAgoBdcnJxcHB4Wl5xYW9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJda21kYmZrkm1gZ2ZfaGuBdXJycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoOMkqSak46JlZiShIaWmYyTi4mPj4iehZCKfHOLhYiPiJyZn5uWlICUf2mGnYhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoF3g4x8eWd0bHSHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGlrgYJ4X3dvbWtxclVecGJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOXGVkXXhwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV3ZnJqg2CHfm9va3pgam10f3RfdH14hnh0c4V8eaGQmrGcpo6Din+DmoiAi55/ipmTjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkneUkJibj5h7k3KGkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoipKIbImkhZKIl4OGY4yRmI6UipaMjYqLcXuUiXuOiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen5+f4aOenpoc2tzio+JgYWFfZaMbH5/b4GNf42IfoR7g5CWmpuLfHd4g5B5c21mcH+DbGh0b2doc2xTXm9lcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdWVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eKjH6LpIWSiZ2FhV6LlJeKjomOi4qEiWx7l4J9iIWJkI+GdoV9fWt9Y3h1aW14c1eIepGGhXp+f4CFjH55ZXNqf4mOiYKDgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmFzbG9haHVmUmBxZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXd3fIhxg4R9foh7dIuIiJaGjH5+l3JndXF5bYx7b3RwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSFoY2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcYaJoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYV8gIOAhIqCdmJ0bIiBj4qCfoCTkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscWtyeIBfcmhuXGp1YFFlcmlmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKho+Ygo2Ce5J0a3d1eXmTdW94en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F5cnNub2RyfmlmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGemiIi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+CZn2RgH5/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH91bW5qa3p9YmdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlnyJhnaJgW94eXuEk29ufIF3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiY+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXKBfWZ+i3t5fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94goCFg39rXnJ4en2NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuaGd8dmNbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpF4g4p0gYhyeXh+jZBvbnyBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSLhJmRjIVubIaTkXp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYacmZSLk5CVhYdwe5KCfYKDiYNugXdogIV4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop8dniAhHmBa1xxfnKBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36EgHd6ZWhqfHBfWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoN/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGh6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYKViHyCeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHR2hHqHnZGMkJKTjIqGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgXBbbX91eYuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1pwZExbcnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgI2ThXCAi253foB7e4iSiX9oe35qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFsc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn51f4F9jJmIgpSSmYiKhIl8j4hwe32Ee2h+bGqAe3ppenaCh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG+Ad3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm5qboKCdW5dZ2VzcVFaek5cb1xPXHNwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t2jHlrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnoF/f46PfXJ/c4R5gJKRg3iWjpWOh4KIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qa3Rne4BpdoCLkJR+en1+cHt2e3R+YlZ3fnNzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWhicm5KZHVMXm5VVFpzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4d7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHR+d4BwcX9thHSUhXh0a2B6gnmIj2Zxg29ndm5bbX2AkJR/gXmSk355e2yHdoGRjIR0loqRjYaFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjo2Ve3SAdXF/enxtf1lWdH5wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqX3VkSG5uTFphV1ZWeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnWDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV7amx1Y4R1koF2b2ZefYJ6i4llcoJranFjWG16hpuIgoJ0mJV4f3xtiHGCioyIcpiOkIeEi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGaBdmd0h4uOlXxxh2pufYF5bnxdWHJ/bXSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmtaX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6AcmliXn94eYuEZnF+aGprWlZvd4qjgYR/cpuUcoF5dIJugYKSiHSViIyHg4iFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWNhpZ/b4tmanqDdW10YlxvfGt1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxaZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JwhYJ+gX9vZmxnWF1bXFtUZHBkX1dicnVpdW9lZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW5renFiZ2tnhnSNg21mXl99cHuJfmltd2ZpZFVXcm+Np3yEfHaXkXR8c3x6bnx7kYV3mX2HhYKGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2VgbXpnc3iKfH5idoN2amtxdHtxenl0fWZ+f395d25kZmJuhnxta1ZqYnBTS2lqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn90dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8e3WDgox6b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXJ6aWhsaF9iV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4NmZVhid2l+h3tvaW9nZl1VWG9oj6l3gXp8kI55dXB/cHJ1eY5/eJV1hoJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9yY3FpXHB4ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0tsaE9HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFZubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygnp2gX+BdW6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl50gWlebWtcYVZcXGyBZXF0fWlpXGt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KAYmJUZXBngoV3d2ZoamBXVllnY4+ob353gIuOenBxfmh4b3mMe3ePcoR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLc2NQR1ZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcoh6dH18dnJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1ccoRoWG9tWl5XWlxse2Jwd3ZtYlpsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaReV5dUmZma4OCdH1iY2lcVFhdYmOQpWh4dIKFkHhtb3poeG17hHt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3FicXGCfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNxbVpaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGt6bW9we3x8cYF3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1JQWVJIY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPbm1cVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvVFtma2ZxdIF3c2NsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZXxwZnpzeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmlsX1RWU29nc2xmeGRkXFhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiZmZmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkY+Pj5CPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLi4aOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDo2ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5Ok4/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTtGeV87PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DREQ/Pj09QElIQ1h5b0M+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRU5AOkBlfn54cndvPjk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNe2ZAa4eEhIOCenA/OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1V1eXGBgYKCfISAckI9PT89PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXV0gX98g4N8hYVoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBMc3N/f32DhYaGh18+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4GDhIWGh4eJhEtERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1h0goSGhIKFiIiNY0BCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSluEhoeDgYOGiIl9V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZYeHhoGDhYCBgoOEhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aDgIOEgIGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdoV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUiCg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88V4aDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWOIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUU1LTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSkNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QUEhLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTUxOTVBNTk5NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lHSFBLREpNTFBOT05PT05KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIRENERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNGQkNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURHQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExNS0tISUNFQUVDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkNCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2RlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bXFxbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVlcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1pYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWl5WV1pbW1taW1lbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNWVFhcXF9gYF1hXVdgXlteXFteWFZYWFtbX2BcX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmJhXWBYY2RiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8ent9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7en15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKFhIODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCAjYyBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKBgIOWloOAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKEhIJ/fX18h5qYhoSChIKBf4CCgYKCgYKEgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYODi4iFfnx8fX5/mZqGhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaakYZ8gn+Cin6QmoOBgoGBgoKBgIKCgoKBgoODgoGBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hZ2ehYOLgICFgIGJgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICCmaGHhIWIh39/foGEg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKQnIOAgIGBfn59fYSFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aLgYB/g4uBfX18g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCf3+Fh4SBf36BhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/goWCgoSCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CEhIOBgYGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KBg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgYKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhYSEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYSGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0tTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/O0dXU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR062Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrcuauriZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp68ooyAjcWemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrKCIrNa6maGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUorGorZumspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJrBop2Vp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCexKe0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qombDO2sGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCnkaGfoJmolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeet6Sro57DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmnj4+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1b+/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMjJx8XJx8jHv8XHxMTHyMrTz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwsnBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvHvdTTx8jNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxM2/kMvGxcTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbizrrq7tr/Rn4jAzru/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBQEM9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK23trjEy4yFm8i9u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube5uLC6tLm8ybqDhYa1xL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7mxvb67xLa4pYeAi3uOnMWjfIOFscvGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6OwuMnTtrq+vMa0onhlcmVVYGaHjX2Hh6rOztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs7/LyNu+vb28gWp2YGd2XldWXHOAiYuozMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLXGkHHB08C0fVtMb2FQfH91YlZgfoaRqcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru70pdyg7XCm1hUVo1iUmSAhIVtSXKGl7TCvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz5DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wteYf3KLrnZST2yZWlJVWpqUd0xujqK0uLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucPVnYl9eJVgTmqNdV1RXWy6tXVUV4+4tbKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAyp+JgX2AWFiSj2dxYHdyepd3bmtfi72zsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucWrlYmMeExmoMN9hpuQXX95bHV5ibG6tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO7t5aToIpNaJKTdm95cmhpa3aBd3ilvLiytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsremnaiTWIBwc21ka19ZV1hbYl9sgZu5sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmwwLGzfHh2cnRlV1ZPSUlLTk9PXGtwprWqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamhpsfEpmFmaXJgUk9KcFVWSk9KTFReXYG3r6+ztaqnrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnpy7vH1vaWphVEpXcJyLellMRkdOVFRorrKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk9PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueqauWfWtdVE1NXJ3Ey6lvWUxFQ0dNYZiwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGjim9fVVJRVWnA49K0nYdvWUpFVJGYnauqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQ0ZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjondZUlFUVmiDwMyzmLHIsJSKmLnFoqmtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQSD9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoZ1oUEtQUWmBnLW6p4ez4NvW29rItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVXUxHTlh+k8C4pJCY1eTb0cS0pp+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0dLVztPJvcC/w7vGxcjF0tTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmFKSk5mirrX07+vwNTLua6oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTW2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKR1XWdtjbzY3NrWy7qyqqOdnZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6Osin+Ts9LV2trPvK6om5WYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czRzdTX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGlnICUlsfY09bCraahmJWXmZudoJ6ZnZ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp39sgZTT1s2wm5uWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKpob32n2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWiX294udCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKykV9ygL6wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4NjdY+1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL66uMm2qrCBa3KZnI2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKvr+8wLqytLTDrqmuhmtkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWlxkbm9oZ2dpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqvo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbK0qL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DEt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0tbu1sK60u62op4hgbY2DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+lpaelraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGoq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S4tL7Aq7W7saukrrKsn6GLYYCHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypaapuK2ipqafqKyrmZ+gnpmdn6WamqOcm52vqaunqqusrbGyuK+4ubuwtry8uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadhWaChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyjoqidm52lpqKmnKCgm5iurq2usqCloq6sp6K1sbKyrKivsqe6s6a1oKKem6OiraOiqrWqoqOmnaamo5aZnpeZmp2gmpeenJybrKGrp6Okpq2rs7SqtbCzq7K5tK+pr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6RmnppgYOEf3hvcXRxaWZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoZ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqets7Clq66ysbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrry7tbu8tbi5r6+vp5uYn6eSj4pyeoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZqgZaTlYySlJSbmZ2Xl5ygnKCWoaCmpaSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu6tbKrq6WYl52hiodxe4d+dm5jYWZpaGZnamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtaWVpbV1VYV1RUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlZaXpJmgl5ygpaKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKKkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHkJGPmpOVk5ybo5yboKipq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CsqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tqyrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhJOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc2MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpuNkH52hXh7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4SSeoiNiop2cX1udHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5aXmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAhYuGdW91bHBsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFVUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCdIeMhXlwc3Fub2RwZl9URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWChGyViId7dXh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKS0VLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXI9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4FzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhloqOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+Lm5uknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Jf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIaEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYKAiYyKhJKFgoaIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhoiFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqatrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BemlWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5mfrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7y8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWFcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpZ+fmpmDpJ2spKqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Iz7Sku7C1sJusub2afnhrXF9cWV1hWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5WWh56Zppusr6ivp7O01NTV1tLLz9PVztPPzcXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltcXVhgV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxWX1JdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjHzc/IwsvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XU1lSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVZFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlYyGe5uIk4+uq5SVl56Ypq62vaitvcbLyMnLy8/JxNLK1NbY19jX1NvX09nb1tDb2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19TVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYuUkZ2Rgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk7Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Vm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmeo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKNkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE9FQz48Q0FCOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLStq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKics6WkqZSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJKPiJegmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSERMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gtq6yXh5qpp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu7/CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8K3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1tK6ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK7uK6ouLq9uIJrbVlWVFRNRUpTTks/QkhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5Wlra6upYuTlaGNdMGafpeZhY+WmoyxlZualZOTmpmlo5Wgm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKytsbGjobKytKRvbGVbWU5PS0VPUFBRO0hKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqKatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoamfqKCZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJytqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqoraywoqOYqrS7pammrKqdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wkk6+rmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56co6Wal5WZqqGedl5bX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylm5Wxp5mvp5+aqZ6gjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGloKqtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqppOYtaOfsqGgm66Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORkVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaMmLObo66anputkJ6TlpOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq+ysqerpqGem5qblpion6CYop6vsqKmjJeumKSrl5mepJGbjZOWmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurpp6YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6OwsbSrsqirn5ugoJuepZ2il52js7Can4+TpZqgqZqUop6VmImTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKqjsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sts56rorCws6uptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqWpoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+oo56VoZmbqLWpl5mRkp6ZnqCekKuel5eFlJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpuSf5KXjJ2cmpaQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpaCdlIKRlY+cnJiWlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLOytay0raqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqZlZOHl5KVmaebn56MkpGOkHd+jYV9fHyHiYhwc3F+fX1cU2RvXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sLKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvrfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0rqqwrq2xsLSttLukt7KrrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6qotqqmrq+qua+osbGvsq22qre3prO1q6ykqauco56zs6iopLS0oLatoKqoq6msp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dxeFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCxrritobavycfI0cC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zsrmwo622sbCzuqu5r6mttauqnqmsn6Kgta2ooZ+vsqK0qp6op6qkqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2OioeUiH2NhoSEpJaEgYKKho2MkIODk6CWh5CckJKQjZGclJePioaFeHSBf3x1eHmAe3RzemiAhqN1aV5la4F1Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6i5qqausMnHydHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeqpKmdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSnKGlnZiXqaiSmJqTkIqCj4V+j4J/iJ6PhX59i4aQjY+Ef5Kak4WToYyTkYuRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj06RFg/Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKWwprCgn6upqKKqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWl5Sfopabl6ari56RkJGMgoqAgI+Ae5qVjYh7fouFjo2LioORl5CGlKOJkZGHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1dlTyk7Mk9ZPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOun7ivq6i0u8jLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmfrKipnqCqr6ehppijqKCwuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpmTmZ6TmZahqZCaiY6Qhn2Hf4KOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJCVgouXjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbazrqC3rK6tsLXGyMG3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImLj4R6hX6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsxYFQsMpajoZeVnKmdpaGjobeqr6C6uaasvcWzsK+jta+srq+0xMS9s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio6FeYR8hYV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqX2hiaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enqS1rKequreorMPBt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At668vLGln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqelkZmmraKZnqSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSOlJiMj5iap5+RiImKiHiFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrY2dkY3R/YWRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkE6M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2tpp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWgmaWjqZ2aoJyUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY97gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoY2Fyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGmtq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6qKmftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WWmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGI8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppycp6eek5+gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrq9t8C+qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+fqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSql5SinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6op5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCraeln6OkqrG3rbS9vrC3xbK4usKnqbCsr6mpsa6ksLqwpKSus6Opuames7Owo6Wgqq2wrK+mp5+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WkprOzp6Oinaeqsqiwp6WeoJ+wl6CalZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygo6WjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrK+kmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmdgRU9rX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1iZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5uRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmlmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7KkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Ouu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoKiroJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/ppazw7Ssqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpdmolhZIeOlWtggJVjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKywtKy1o76xsqego6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6mknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhZiVjoqMmJeHlJWKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Plq2Pe5WbgpKBiamohYCYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLGgrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZicoJ2Hpqukq62/wLGhqq6qlpKfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ6lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFxxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLkowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKsraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnJyil6Cpqp+VoZ6dna6vp6qom6amo6Cqkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBFRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPCg9MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZucopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqhlJyfpquroq2Zq6ihoamis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ+VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGYm6aioKqnrqGjp6mwtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWchJ6DrH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1j5Gjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnZumpKGir62dpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iZraGspKWXr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT9AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoJ+dpaOcp5y1mqCqo7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ynvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioCkpYicbbJvoIetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiJOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZgpOLlYp5eYKWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6wrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5moq6uio56pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnqybla6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIublqGgmpCRmpuRmZennqGYqK2mpKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZKmm5OPkZiYj5iTqJmfmKmon6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppiOkZCYlI2XlaeUnpeoopqvpp2irLmfsMGopLOmrLGyq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiXmBlIybk4qVkZSQjZGWoYydnqienrejf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm55f2twZV92b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrigoI+cpJ2RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmZuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRqeHtxcGdkd21pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNlImGgJGojoeinKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rsIekjaqajJp+o3aAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpeeoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlZCGi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6Uo5+gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8k6SgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF3kY2OiXB/ho+SkmyXk3yIkJGjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UorOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/i5KHhpOPfXuBhJekjX+lpY2AjYmElHWDh5JvbIqogIKLk42InJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyPiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Pc5WLiHF0a4J2c39Zcm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoF7coGAd4B9f4R7bYKMhnx6eHx+eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnpZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1sfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8j5CRhpipoZyTnI+Nqo6SgJ6NiZOan4OPl3+HjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l2eX5wa2xja2pngIBrcoBsa3RveG6EeW6GgHaCgH2FdnKCjYh+e3p8f3uCimBpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXmNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+ampGIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXt7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHx1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCUlpWNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjoxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2c3N0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF5bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmJB4e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpOWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2Fub3Zyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZmxoamxngHx6d2+Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId317inx7gHZ3f4BwdHN6b4V9gYCJfXthXH6PkYZ/g4RzeoCGeo+Rh5GRnJKkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2SkJOMmY97iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGp6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZl1paGZiZ3GNbmRpZ2VpaIB6d3VvjoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3R7doR3eH9yc3uFa3JveW2JdoCAhm1wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoGaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHpwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8Y4Z8b3BsdGpob2x2d19xfnl7dHV0f4J/pZWarZ+nloWNg3+XlYOPnnWKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9sbVVRgauUh4J4gHZygnmCoIGRgZOSmJuRmniReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQe46MjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZlXXhwiHxfXGhyYmJlZpFpX2hkW2dwfm9rcXOKfXZ9hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW50f3RfdH14hnh0coV8eaGQmrGcpo6Din+DmoiAi55+ipmSjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZOIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYp6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYp0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn96iX9yiYeBkYqIfH6YdmVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmchoSfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH6LpIWSiZ2FhV6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6OgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn36IYX+Th4SHg4mNf3+CZn2RgH5/goyPkH9tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi459aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fpSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYdwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxfnOBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBf4N/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnV/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGd6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3dviIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGfnuShnd/hIyDa39yaIB+eG18fIKKhHdieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphwcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5dZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5deGhVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGtrWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tmanqDdW10YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6Jfm1uVmpfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYV3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbntnc3iKfH5idoN2amtxdXtxenp0fWZ+f395d25kZmJuhXxtalZpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx4Y3OAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx8a2tVaGFlU0prZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB6aGthb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JthXt9fXl1cmx5aGl4Zl1lc2h6d5KBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUlXZVFIYnhaXV9sW15cYWRef2lqX250eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbaHVmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3FicXGCfHNncoBlXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWldpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXlNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWVJIY3RiYEZValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaFNURlpcT0hydFhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIF3c2NsdlVicmtaX29mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNQSGRzX2FFWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ej25hZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybYh7f3acenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo5xYmdqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkZCPkJCPj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipCLi5CJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiIWJi4aIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhoeHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiOiISGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTo3Ojw8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5O0s7OTo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgYCBgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTpNelI6PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz49QEhHQF56aT0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpLS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFREg/O0BjfHt1c3hsOTk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBFc2I/a4WEhISBeWw7OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP010em2AgIOBe4N+cEA9PT8+PT5DRD88PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhtb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VATnN1gH57g4N8hIRoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBJcnN/fn2EhYWFhl0+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARURmdoCEhYWFh4eJgkpERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1l5goWHhIGGiYmMYUBCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGCEh4iDgYOHiIl7V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZIeHhYGDhYCBgYOEhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aCf4ODgYGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdYV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUeBg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSkxMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88VoaDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWSIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVRwdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4CAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9MSk1MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTktMTUxMTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zb3V0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKSktJSUxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFudnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZJR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMR0ZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eHhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRURUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUhISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NPUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlN0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFRS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUUEtPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXUlNTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VXVltbV1BTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGRgYWBhY2VfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmllZ15dZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWlNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVlYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taW1lbWVleX2BgZGNkZWViZFphZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVlVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlNWVFhdXF9gYF1hXVdgXlteXFteWFZYWFtbX2BbXlhYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBkZF9SWFlQWFZYWFhXVldWXV5eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZWdnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YV1lbWllXWllgXmFiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxmaGhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2RhY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlX2ZnaWhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6ent4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdyc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e316e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhoWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWIh4eHhoaIh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoOEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgoGBj4iBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYOCgISZkYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIJ/fn19iJuVhYSChIKBf4CCgYKCgYKEg4GBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYOCiYiFfnx8fX6BmpiEhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gIOXkYZ9gX6CiX6SmIKCgoGBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/g5uehYSKf4CEf4KJgoGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBmKKHhYSJhn5+foGDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSAgIGBfX19fYWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aOgoB/hYyBfX19g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OBf4CGhoOAf3+BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/g4aDgoOCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISCgIGFhIOBgoGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgoKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+f4B/fX9+fX6AgoODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqIi4mFiJGOi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIOBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fH19fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhIWEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGgoSEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWChIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB9fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KDh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhoaIhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeHh4iGhoSGhYOEg4ODg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeHh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4aGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhYWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNXAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImpzOo6CLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZu5qHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoL6ZkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJu+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZChrKCarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qom6CapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp+vnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbLkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkBCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4bnlqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3NiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvIu7rIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxMjGx8nDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1paWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq8tsfUucu+wbu/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbfTwJjUu7+8u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLe7vcHEube3trW5ubm60rSMuMPCwr7Ht7m4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wuLuyvb67xLa1uLa4wMDFu82ohJXCy8nGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Oxub2+srq+vMW4sbi4tsO5v8PEn4SLucrMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzCvc3EvbvEv7mxlYqOeoiVrZeFjK7GycjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vMbI28K1v7ywjGpxcVhiZniJio2owcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru8vbrSssHJtrSSdHloYn5pW1pccIqPqbvBvb7GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC30LamxraOZ1Jubk9zi393Xll+krG5t7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/tsm0lrGhZ1hVi3BTXXqCh4BNaJi1trKyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbvGspOehVhTZ5xmUldXkql+WFqnw7mzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ure7z7mYk3JSZY58ZlRibaW9hmNTdp67trG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO1uce+oJJkUouZcnp5i3KCknVwdW2iwbiztLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrLAvqycVl6UxJWBmJJmdXV2gH59r7+4sayzr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqnvcm1pFZkhZN+aXRsZ2Nma3VxcJCus7OqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqulqbGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHTlJOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamin7TPwKxdeHV4dGRpWVBPU1JXV2B3hqm1rq+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp6pzc2Zb3p2dGNTTVRIUElQTUxVZGeItbCwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVExTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopuepMqwaGprc2JSU1WFdWpTT0pKUVZZY6evrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGsmHhua2BUTFh6qrCgbFJIRUdMUVaNq6qqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby2vbOztaKsoqmosqmrqKeompmemqqnn5mnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoJ+IbWBVUFFbot3gw41wW0tEQERhlrCtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sqyisKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Uc2JXU1RZbbPcxrCrrIxtVVuBrLCmo6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7q6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXlxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZudiV9TUVVZboe1xbOUntjKrKOwrKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb6/vrW+s62/v8LDx8THxK6+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHh0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5ydm3xTSk9SZ4OitrKlia3Mu7Gso56cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydHZoY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoaVxTkVNVXeTxcqunKOxqaKcnZygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0snP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8XJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZvY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6GseE1JTl6Et9vVuK2qmpSXn5uboKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdLLztDAxsLHxc7N0dHRyMvNwMrMxdPOzM7IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKKjs4tbZW2Jt9fGr6afl5WXmZqdoJyZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3Oy87Ox8vQ0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dW9wbmthZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2po7ObeIqnztSzm5uVk5ebnp6enJSWmJWIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz8zIx8vExsHFyszNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBya21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKujiI2SuNSslI2NmJWQlJKRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfM0MTFx7vHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO1kmiAiMSukI2Ol4+Gg4SEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsW8vMDDxczFxbvAysLFx9LEwMi/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvuYJifo+2j4qSl4d6gIWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/tbW9v7vMw7y1usi6v77Lw8HFwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rrK5vZXaPk4uIioV5gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tL2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29v72xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL65uMm2qq+jZWl1jI+GiIl7eH6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK62sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4va+wp7KztLu8q621pq61r7uysKm5sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvsC8wbqytLXEr6qvm2Fsf5GIjo97eH6Khnp7hIF3bl5dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6mut7S0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqWot6yxsre6uruyvL2/vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w765yrfBw8G0try2sa+1vK6oqZdlb4iDiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+lpaelraCdm6SmrLKvtrensKuoqrSqtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S3s7/ArLa8sqylr7StoKKUbHiFhoaBfHl1c29ta2ppcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqayspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6y6urGinqmrp5edkHF/hYZ/eHJucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgmpiurq2usqCloq2rp6G1sbKyrKivsqe6s6a1oKKem6OiraOiqbWqoqOmnaamo5aYnpeZmp2gmpednJybrKGrp6Okpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqtsrWvn5qjqqGSmY15f4OEf3hvcXRxaGZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn56pnJqaq6evsKqbo6S4qaCfrqi2qqanrbCkt7Ckt6Cim5mZqqagmqy4sKKhpJyin5+TlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tbu8tbm5sLCxqpyZoamVkImMgYB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCmpaSmp5+cn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhoZStsbGfoqOdnpibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu7trOtraiZmJ+ji4hziYh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl5ygpaGtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9xMmssbjCtbzBvLS1q6ymlZmbm4d/coiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHkJGPmZOVk5ybo5yboKipq6isp6ilo5ikrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmprZqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJujlZuho6GXoaijoqiroKuvo623paOjoqytqqirr7K3sr21s6uvmIRzc2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8PIsay4v7e8vru0t6eqoJaWmJWFeXSAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivo6ian6yhlZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cXJiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba3vL7Bw7GwsrittLS7tLalpJ2cl5aSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52nmaClm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXnJGRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmYyZpKaopqGftLKosrehnKK3rKqtpLKypbW8taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsub20t8CvramxnqauurCwoZubnZWThnqCbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZaim5WNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+inpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqCho6OborSvrK+sn5iluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4r7SwycS3ucHOxb6zrLrBq63Draiip5KdpreupaKQlpeTj313fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjZyXi5SQn5idlZSWlI6WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOWjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZmDlJyxpJ2aiJSQjId8c3VdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiFlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpaOf4qUqZeYjX+OhIR9d3FuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3uBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpyPlIF4iHp9d3BwaVhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeomPjI14cn9vdnFsbmtYS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OSkNITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6q7wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAho2IdnB2bXFtZmxrWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dWp5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIRkJBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaOlJmLjYV5hJCYlI2QjI+GcYeCdIeNiHtxc3FvcGZxZ19URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqCVc3iAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdW5jdoN+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltaqusa7BsrvBxpaPjJSQgIh9boGQkomDioePhXWChGyViIl8dXh4bXdud2RpXklQRz5ANzQ0ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwc3p3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CBfnpodmtSV0xARTIxMTI2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3F5dmhta192fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4l+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYaEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gYl6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGZ4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6GgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiaiZKKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hHaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqq2orrW7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hoiFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiqiX6Be2pWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWnpifrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRTUVBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvbnU0M/Xz8nM0szPzsrHv7/Cyr3BvcLAxcTFyr/Iz7Sku7C1sJusub2afnhrXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pOm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5SWh56Zppusr6ivp7O01NTU1tHLz9PVztPPzMXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltbXVdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuQnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PjU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8fHZ8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjIzc/HwcvQ09HU087TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE1Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVVFRkpJRUU9Ojc5QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRWT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlIyFe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/IxNLK1NbY19jX1NvX09nb1s/b2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWIiIGFkJGenJmJhYuBhZd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19SVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuPkI5bg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjooaTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuoYOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6ShiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrWdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJieo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKOkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE5FQz48Q0FBOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLOsq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSofoiGnK29sIKMjIuQg4+DkY96gYeQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQktARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSENMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB7jX94h4KBkHqNoZaompqYur3HyMnB0snKwsy8wbKtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu77CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8G3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZR9iJGZkKqZmJOTj5KVk6Wdk52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK6uK6ot7q9uIJrbVlWVFRNRUpTTks/QUhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4Kcg4OVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5alra6upYuTlaGNdMGafZaZhY+WmoyxlZualZKTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGVbWU5PS0VPUFBRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZKFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqaatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaIm5imm3a/n4SZnY6TmZqLr5ehnJuWlZufoamfp6CZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfuq+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsHGyMXCzcjBvbmyr7i0wMLKtcWxwby0uqqoraywoqOYqrS7paimq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6KYkaKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52lnKiqnpmVj5SbipaJjKSilJ2inqC0r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl5bX11KSEVGTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8DCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKkqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaylm5Wxp5mupp6ZqZ2fjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCTo5+WpZ+mqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGkn6mtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaGdpJirq6ymoZmNmp+SnomOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKOframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrJussJypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaeekqGelJ6PkI2VnZqinqezpqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtb/EvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Grqpefppetu7Sbp7CbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKuhl5eSpqWiopiYpa+4rrK1tqCfqKSZlZWTpKC3oqSllq+xsqeqpqGem5qalpeon5+YoZ6vsqKmjJeumKSql5mepJCajZOXmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKawnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJudpZyhl52js7Can4+TpZqfqJqUop2Ul4mTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBv7+4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sss56rorCws6uptbS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqSpn6SXkJmfs6qzqqqzmp2nm5qVjqCmpLSup6Gsra6xp7OtsaqknJ+oo56VoZmbqLWpl5mRkp6ZnZ+dkKqdlpeElJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G2vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6uqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZWamrKjraCmr5ehpJqako6ipaeyqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpqSf5KXjJ2cmZWQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbiyqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJSbmZWxnqecoKqOqaOem5aYpqWlt6eisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpZ+dlIKRlY+cm5eVlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5CZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsC7w7eysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynKCnsK2mpa+lnbK1rKuxsa2pqLS6rLSytay0rKqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvo6mcnpybr5mjo6Kjkayeo6CgoqqlprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqYlJOHl5KVmaebn56MkpGOkHZ+jYV9fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrb3Muq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6a2sbKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSirqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6mwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesq6qtoaimprGypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6uotqqmra+qua+osbGvsq22qre3prS3q6ykqaqco56zs6iopLS0oLatoKqoq6irp6Crq6i5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dweFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCwrritobavycfI0MC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zs7mwo622sbCzuqu5r6mttqyqnqmsn6Kgta2noZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOioqOnmJqppZiXmZ2OioeUh32NhoSEpJaEgYKKho2MkIODk6CWh5CckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqN1aV5la4F0Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjM4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6e5qqausMnHyNHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqepo6mdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSm6GknZiXqaiSmJqTkIqCj4V+joJ/iJ6PhX59i4aQjY+Ef5Kak4WToYyUkouRmpGVhol+gHJ7eX18aHd8enRwcHxnhHiEiGRhZ2NxhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj06RFc+Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjua2oqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKSwprCgn6upp6Kqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWlpSfoZabl6ari56RkJGLgoqAf46Ae5qVjYh7fouFjo2LioORl5CGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7e3FwcHJ3Z39zaoNnZGdgbXOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy8zJiw6JDQxQmhZMTNTPWVfREw2S1ZkTyk7Mk9YPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmerKipnqCqrqegppijqJ+wuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpiTmJ6TmZahqZCZiY6Phn2HfoKOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJGVgouXjJF8hXtzcH1xc3RgeXhpbnBwbmh9cWN6bGllY19lhX9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFdaUmdPSExFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNioqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9YVzUol52mmZ2WraCgoaSht6uxpLO0qqi5xLWzrp+3rK6tsLXGyMC3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGWm6+moZ6ip6+hoKKTpKSit6+hprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5ScjpOXo6ihkIiLj4V6hH6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2logm1lcmprZGhbYnN/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVENUXWhFLjsxX1MsMpajoZeVnKmdpaGjobeqr6C6uaasvcSzsK+itK+srq+0xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpSWmo2Tk6OnpI+Iio6FeYR8hIV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhnaWdlboRnaGhkZmhqX2diaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGJOJzKepKOSjqSmnJ6enqS1rKequreorMPAt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At667u7Gln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqekkZmmraKZnaSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSNlJeMj5iap5+RiIqKh3iFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrYmdkY3R/YmRlZmVpamNocFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BkRyU1m6SgkYyuoJmYoJaltLGisb63obHGu7mwsaK2q6uuqbi9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2spp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaSjqZyan5yUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY57gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKvn7jAtqC0wbu9ubGltq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6p6mftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WVmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl1fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8K4vb2tp7awpqukt7Sys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppybp6edkp6gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOIhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+eqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSplpOinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6lk4Gnqp+XnZ2lrbKpscK9srW/tbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6np5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSoZWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa6ksLqvpKSus6Opuames7Owo6Wgqq2wrK+mqJ+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+7qqGnta2jq7WkprOzp6OhnaeqsqiwqKWeoJ+wl6CalZWXmZ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW2OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyhmyXh19TtbTIhoCJfGOkM0Kddl1RaWhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCjnp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+j5+kfrB2g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB2c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi6inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W0tKKysqOgrK+kmKa6rqSxsJy0uKmgpZ2hqqWxqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKSnoJWbpqeimqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXWhgRU9rX3FtVlVNL2VjaVNZUTtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3n52UoLiwmLPBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mfn6ihtaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6GcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qbu1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLmio6uhl5uRoqCVlJ6blJmgoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZuZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7OkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivtsSxurKuu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoairoJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolynsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoKG/pZazwrSsqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKWtqqa1qKifm5ago56spL6moaqYlZyRopuSj6GooZOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6RgnGUhV9yalpdmolhZIeOlWtgf5VjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xc3l9fGJbd3SBaFBcboN8e4pqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqkm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6iknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqampCWgmhufHF2kJeUkYSKtKmNhZiVjoqMmJeHk5WKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop6eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Olq2Pe5SbgpGBiqmohYCYloqEjp+Ie4OQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroSJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rautsbKgqqayraKss7DFsKqso7KvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzx7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iMbGhqepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLCfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWdhq1od7nEuHGSoaN7ppiZc6qCfMvAwLtxiqKHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msravqqamprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGfoZiboJ2Hpqukq62/wLGhqq6ql5KfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYF5lZabX62PXY6ngKGgfKeVm3SrgoCvXmSMqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKtraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qom6amo6Cqkqyzlqaiqqqeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1NcYFpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCc9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Oira62r6mxp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKoq66mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCHoJqHpF9gUquEf66Cm3WugaaGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqjn4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpqCbpZ+dpaempJysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquroq2Zq6ihoamisq2iqrKyoZuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkiIegepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOCoI6Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKarrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGZnKejoKqnrqGjp6mvtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esoLG4sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV0jpGjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWvrq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnpynpaGir62dpKiitbHDsa2qraqRhpGcp52jpJ2ll56YmZmlo6iZraGspKWXrqW7rKG3t66dnrazubGzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnIiTkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2Jzsrhod4+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqSdp5y1mqCqo7WrwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ymvayUvbCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoIetfKGPg6iWmYCsiISuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4nZ+OiJOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2UkKaZgpOLlYp5eYKWf2psfmJ9dG5/eV9mZXFuZ2doQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5mnqquio56pqL6kl8OsqqOiq7O6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzf3xgaWZwbWZlZU9VY1xBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBgYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnayblK6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIualqGgmpCRmpuRmZennqCYp6ympKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6trqWnlJSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqJmfl6ion6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eGRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOpurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspY2WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppeNkZCYlI2XlaeUnpenopqvpp2irLmfsMGopLOmrLGxq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHlpa2Rkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq6isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRl6yji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCMe4GUjKGUipSRlZCPk5elj56ZqJ6btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+aW5kX3BpYFtfWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiHmBk4ybk4qVkZSQjZGWoYydnaednrijf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm54fmpwZV91b2traFxlY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrifoI+co52RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGXo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmJuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjY+Si4NucY+IeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRreHpwcGdkd21pbGpbZGppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNk4mGgJGojoeinKOTl56Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkuLGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZmYhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rr4ekjaqajJp+onWAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipipmJmakoelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwcpKHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKekno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpacoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXmjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlY+Gi52RnJuJj6iioJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6ToZ6gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJMf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV5iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTXqGntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYUlXSVRfV1NbZWpbZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF4kY2OiXB/ho+SkmyXk3yJkZKjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHGehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUU9sXmhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5Zyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCDdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3WJfZB7ZYOHlYqKlZmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R1hnKRg21/i5KHhpOPfXuBhZeljX+lpY2AjYmElHWDh5JvbIqogIKLlI6JnJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYJ9e25/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450c4RwlYV7fZKLhoaQhXh+gIaZo4x7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Oc5WLiHF0a4J2c39Ycm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe310fnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gIOKm5+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZlIqenYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHiPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgoiRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoB7coGAd4B9f4R7bYKMhXx6eHx9eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfYiThG1rfnqXhoSDkH6AhoSGfYeDjZudkoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8jpCRhpipoZyTnI+Nqo6SgJ6NiJOan4OPl36GjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l1eX5wa2xja2pngH9rcoBsa3RueG6EeW6GgHaCgH2FdnGCjYd9e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUipiZeHqNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+bm5GIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyMj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHt1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam19Z25wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjYxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB4iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2cnN0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmI94e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpSWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2FubnVyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZWxoaWxngHx6d2+Ph3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXFjh2hxb2V2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpSIdn17inx7gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmY57iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+Bf4GHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGl6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZV1paGZiZ3GNbmRpZ2RpaIB6d3VvjoRzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+imKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3N7doR3eH9yc3uFa3JveW2JdoCAhm5wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0f4J+pZWarZ+nloWNg3+XlYOPnnSKn5OShYqajJWOi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSmJuRmXiReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQeo6LjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbXlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZkXXhwiHxeXGhyYmJlZpFpX2dkWmhwfm9rcXOKfXZ9hYB0dX+MeXuGgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW10f3RfdHx4hnhzcoV8eaGQmrGcpo6Din+DmoiAi51+ipmSjoSIl42OjoR2c3ZzgHBvhXNwcYNvaml2bYJufXxtdHNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZKIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYl6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3B4ZmtqYmZ4c29wY193YGBWa19ddk9NS2BmY115cYp0XFtldWBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdmVzbnxliH9vcGuAWWtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV+fImch4SfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp8amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH2LpIWSiZ2Fhl6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmuBdm6JkoORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhwenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmKnYOEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3CGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4V9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpLZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WCfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J2jpt9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn3+IYX+Th4SHg4mNf3+CZn2Rf35/goyPkH5tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05ITmZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcYCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi499aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18bllbXmxjWmJvd2RmW11gbGljbGlzdoGDcW5+fH90dYN6g4J8gYV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeHp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aXiYjn6AioKVl4l5jpZvenNwbGpkYHN6aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYhwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxf3OBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoJ/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKFZ4eDcGd6loh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGf3uShnd/hI2Da39yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaU1XZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2praXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyAgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoYltiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH5sWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5cZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWVOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ji4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZl9vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJvXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tjUFtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIWDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWDdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmIj2ZyhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfHNndGVui4Rtc1ppXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCa3JXal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpncmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x8i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGprWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p2Wmd9fHhlcn1thHRldYWMhZV/b4tmanqDdW11YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6JfmxtVmlfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pc3VzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYZ3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenl0fWZ+f395d25kZmJuhXxtalVpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3ZmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anNzdG6EgXp/fXV1bnpoanlqX2VuaIF2kIVnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21bbYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx5YnOAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx9a2tVaGFlU0prZ09HUWtFYHhnYU1TcVxKTVRZZWt3emVfbXFpZF1WYFZubldLU2hXZV5YTVVrVEpceV9bX2tdXVtjZWB5aGthb291bm94dXqYfXeAgXqAgIeFenh5g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JshXt9fXl1cmx5aGl4Zl1lcmh6d5OBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dGVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUhXZVBIYnhaXV9sW15cYWNef2lqX250eG5vbnaDl3lygYB8f4iLhX51dYV4h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJuhmx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbZ3RmdnaSel9dUmVma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVx3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3BicXGBfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWlZpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2mFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZm9+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWFFIY3RiYEZValBJUFpVamtrfGVtbnFhW1pYWWxwV1NPZldXaFNURlpcTkhydFhfY21jWGBgYl2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl8h22PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIB2c2NsdlVicmtaXm9mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlOSFdUVm1oZHxpa3drYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmx5dW5vaHZ2f39sg399hpd7f4eBiX5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnlyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybIh7f3acenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNeaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo1wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh455bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhoaGhoWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTk3OTs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5OTk4ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PT9APjxNTDk8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DRERBPj0+QEE/PmpvQj0/Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGREA8PD1ARERFbXlJNjo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAQVhAPlt4fHt5eVM3Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQT9GeFhjhISEg4J7Xzs+PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0p0eICBgoF7g4FoP0FAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFATHN8gHuCg36FhVk+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVKcH1/fYOFhoaHaEFFRURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSE1yf4OEhIKFh4iKVUFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGeAhIaDgISIiYxwTm2Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKU4CFhoKAgoSGh4OAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpdhYWEgIKFgIKCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWCGhIF+gIKEg4KCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCXoSAgICCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOjxqhoGCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+RXqEgYKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QENQgYODhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPjxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERlaDgoOFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCR0dKWYSCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZJSVBggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FER0pMVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GTU9QVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1daWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVU1VUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1TZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZlJRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3p7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9APzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUWFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48Qkc/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTE5OV0tMTktMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSE1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtHSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUZLTUhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9REVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VCRElGQ0ZFQkVHRUVGR0VJTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVtfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01NTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWWltdXltcXmBgYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93SkxMS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJITk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkVGQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0hJTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkNHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KR0hOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0FFQ0hJTUlGQ0ZKTElHRkpNS0ZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFeXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2RjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2FiYWBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RSUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUVRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVWWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcHd5f2NcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1dWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWW1tWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeXGRgYWBhY2RfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVVVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deWldRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVVNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taWllbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNVVFhdXF9gYF1gXVdgXlteXFteWFZYWFtbX19bX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXlxfWVpeXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9fXl9bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYCAgX58fHx8fXyBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4e3d5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGChIGCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SBgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYiRgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKChIKCg4KCi5iHhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChIWEg4F/fnyIm4uDhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCDjYV+fH5/f3+Zj4GCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIOWin2Af4KKf42NgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAgpqNgouCgoOAf4SDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKCmIyEhYeHfX9+gIaFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFhIOSiIGBgIR/f359hYeGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhIaDgYCEjIJ+fX2BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISDg4KAgYWEg4KAfn6Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCDhYOCg4KBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OAgYWEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4KEhIOEg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICBg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIJ/gIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB+fYB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4GBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgYKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/Oz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz8+il8rSxpKr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNeooKugzpmtmrPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3CnJWQobOVhp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbq52fp5m0wMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoMOioIygxdORmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjal8XJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCgtqCUlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonYufr7OdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqOQopqinJyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo4Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqedvp6poKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Nzo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmujpGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1cG91tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc2Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2dna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Nzk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29rb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2trZ2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29vb3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2tra2trb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/Pz9AOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ycnJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2cnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnJ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lSWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mpqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqaop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israahop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoKWorKempaWjo6eklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d3B9eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yjp6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2JsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqWnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclYyHkouYmJWanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkE9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKx8a/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmSiZWRl5WUmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eHp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL63vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWJqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbeyr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL7DwLrEwr7HuLm4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLSysbHysnGz8LBuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysLN2cjLycjMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbG18er1MXEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL66wMrCxtPAlMLDv8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e8trnBurq4uLXEwcTJuYydvLnBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4wLa1wLO1srKqrqa3ua+Lj6+2uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q2ttHAssC3sJ2QjH53io6fjIyltbOyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLnSzLC/rKGAbH1tYGdpeoqOpbezsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v7y+1cWyqYF4fl9sh2pjXmF6kam9trG0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7y/ws29oIBkWoRdVoWKjHxhW5Cvxrm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDo6QD08PDtAPkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6uMjFs4djWWuWXFdkeImLeUqCt8a5sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelraqota/Lx6ZzV12Ej1dWYWaypXZQaLe+trOqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamioK2owsaZYlp/inZlZHp1r6N2Zl93m6+0rq+ztaqnrayjnJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp6lpL3DlVZom5d0i5mJb4x+dX15eqKqs7GwsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopufoaHCyJFRc6W0gISGeGlwcXuDeH+oqbCurqywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ6empqSmZ6coqKfx82PVHaKinNvamBbXVxeZWFujaCqqKqsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmqqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjoMbRk2F8enloYFdMSUtOUE9RXGuDqq+uqaqmoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJibn6Cbn6DEyIdxeHZnVlJSbldXTk1ER2GNrK6mo6OioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxr66tLq6tLu3sLayqrqyrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqGcnqGinpuas51rbHBoVVBcfKaVeVJNZ5SurKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGx8rIzr/I0czHxcfFwbzDwL6+vrW+s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoJ2jn5ydmayVcm1jV05SaLTT06SNpLOupJ+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLNztPMxcfJysHGy8bIyMW/w7OzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKSsmHpmWFNSWHfT17+yr6ednJ2gpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2v8q/0czLz8XJx7/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKrtY9nWlRVVmiTua6kmpWYoJyaoKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/KzdLLzs+/xcLHxc7N0dDRyMvNwMrMxdPOy87IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7QwLzMyba+rqaqqKGksbR/VVBTUmWTraafmJaYmpudoJ2ZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNxMnPzMrLv8m/x8nNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHPz8q9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLGqrK2qpbGpbU1KTliSoJuVlJecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBwaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1sLWooauqrWFIRFGLm42MmJWQlJKRlpaWkIt8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTCyMDHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCt7y8rqWzp7NkSUuCmI6Nlo+Gg4SEgn6FhX9zYFxeXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXEv7Oxt6u5dVd5loyTl4Z6gIWGgHZ4dXJwX1pbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb+9ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr29tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G6x76trrKusIZ4kY2Ki4V4gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tb6yt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8fLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwcC7ucu4rbCxr5d/j5CGiYp7eH6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sbKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8XFw8PKwsnKv8C9wru0trbFsauwrqp8dpOIj5B8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq20trG9ua+3r6iut7S0vLizvK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkr6mypaeoraWot6ywsre6uruxu72+vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yre+xL+7yrjBxMK2uL63srC2vrCqqqqdboODiIuAe36Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaimrqCdm6Slq7KvtrensKynqrSqtLqxtrWutrmxr7q5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMq4vMa5tMW4tMDCrri+tK6nsbexo6Omj3SGhoaBfHl1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloqiem6KbnqqwrbG1oqmqqaurpLS5rbewrLO1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnIubm/uLPCtbK9va68vLSkoauuq5mgn4p/hoZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqKmnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2gmpednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGwMW3wsDHzrfAxL60urqzwLezuryvtbexoZ2nraOXnZiLf4SEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaq6evsKubo6O3qqCfrqi2qaanrbCkt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4wczHxcLDvca4yMyywcPCrr28try9trq7s7O0rJ6cpKyXlI2RhYB9d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2NiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6agqq+mn6KjtqigoaKotKGlqKWwpbCtrLWeoJ2VlKmhopStsbGfoqOdnZibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsbItsbEs8LAxqy4uL63vry9uLawsKucm6Omj412i4d/dW5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVVJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpqSkoqOinKqrpZmepbGpoKCdpauep6Gera2pqa6toaGilJejm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdQT0haXE9SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/Gyc27wcrMyLXKvbG+xMqusrnDt73Cvre3rrCpmZ6gn4qFdYiDe3RpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq6Zm6qzn6Wmn6KjoZSTm5aWkqmprZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirr7K3sr21s6uvmIRzc2hbWFhTVVFFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asu8q7tr+szMfGucHOz8i0xby3u8TJsq65wbi+wL22uaqupJqcnpqJf3d/dndubWhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJOSk5WnqqWamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLWwubXAsa2xq5F9cXJiVlNWTlJJRlZQUlJMTFhNSkxOUkdNSkFDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DLsbi4vL7BxLKxs7mutra9trmnqKGinp6YhYZ5amdsbnFucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyWlpaIopqak4uOi5CapKeclZWXm5CSh5SOjIGLjX+QipKSkqGan6KVlJiYlaKlmYyZpKaopqGftLKosrehnaK3rKqtpLKypbW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPGxre6w8rMxrOtu761uMGwrqqyn6iwvbKypJ+gpZ2bi3+KcF5fZnJwdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQlI6Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY55kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwycS3ucHOxb6zrbvCrK7ErqmjqJOfqLmwqKWVnJ6bloJ9hGdXVl9nZmlnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjJCGhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfYmBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMfCt7O9z7+5r6+2w6irxqqknpqElZ20pp+ejJqXlI2BeHteUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCu7aousi4tqiotbaqs76on5aPgIuVq5makIOUioqDfXZ0Wk1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2cnKSd2h1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmdgXFxKVk9RR0pYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe6sqqdnaypqLOwopuSj5WBj56RloR7jX+CfHZ1blpLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuwp6ybj5acpamloZiakIaTeoqRjo96dYJyenZwcW9aS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpJedjYSLlKGhmZmRlIt0jnqBh46KeHN5b3Vwam5uW05FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYV5hJCYlI2QjI+GcYeCdIiOiXxzdXJxcWhyamFURklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rXlpcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgIh9boGQkomDioePhXWChGyWiYp9d3l5bnhweGZqXklQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYWMfn6Cf3CAfnppd2tSV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1pcXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGRe3KEnp+RnH92hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8gH+AcmBcYl5ZZmpca2teV0tHT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYKCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hYiFioeRenluXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCssrqiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6CemlXYWBXaWRoZFZaY1lWVElHR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4aBjZWKgISBinp8i4eGfYqCgYuElX14eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qjorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0A+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNtc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Gg4yWi3+Df4N4e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop+iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eGxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762ssTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaaYpZWKk5OIkYmPkJKem6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PVztPPzMbDytC/ysnLydLIzc3D0dK4sMS9xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wLGrtaaluKesrqCstKSPsa6bmJiMkZSRhI+bgY2mkZyJg4uEiomEioOUlZiXlJuRm5eZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PWzdLRxdLWxsDOyMjDqb+40J14bGRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmGkJCNi4qIkYd/gntyfoCCh3qFdoWTkYl/b3ZzbHN8fHd8c4J4cWuAcnJpb3F6eXJ7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqaaqsbmrprSjoq2io62hp7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OWrIuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8yKcW1iX15XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBg253cG11f3Z4fXSGfHlsh3Z1b312hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+jo6aypKWzoKKlnqGon6KxnIefkpKTkYuOi4aDj4R+nJuMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzl5qbp5ynvcPFubbFzdLQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUVVQWVVFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKgoh9eYWXl4iPg4eGh3qEeXF6e4SGdnqGjo2deoxwfG9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WanCtoySgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpmfpZ6frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yNlYyGe5uIk4+uq5SVl56Ypq61vKitvcbLyMnLy8/Jw9HK1NbY19jX1dvX09rb1tDb2tHWydXMlHd5Z2daWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChH6EfH2EmI6HjH6Gh4B3gnlue3uHgnR6kp6NoXaPdYJ0dYF9dICEb4KQgm+ShHR8gYV6dod8ibjGpcPJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VoY19TVlZVTUtETkQ7PT08OTo8Pjk+QTY+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af398hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9gYmFfH6Re5CpjpDDoLyMnKOcfYmEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWRWXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f31/e4h7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAi4d/mIeAnJJuiKmFeqCLfJCOg4iEnH6akYmNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWUkIyPioiWm52PlZaRi5OUhoCLiZKNioqdlpmjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKWiZ2QlJeKiqeXcoqyjYSnkoSZk4SajKOWoJiTiZudoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmomPhpeXi4WPjIF/ho+liI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzoZann6WklpWuooORuJWRs5qMoaGMpJuwo6SdmJGnlqeZrK+kl5SWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOhsKyKmrWdorilla2kl6mtuKeko5+aqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkXyOjn2Dho6PlJWIiJOWjJCWjYuMl5iTnZm0l5arnYuclJKOkZKMmJuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVNdUE9FQz48Q0FCOD84NzU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKiyra29q5u7pKitubirpqaioqSiqa+ysaqdnKSYm5iXnqKmpZKkuq+pwLytrbK5pqSofoiGnK28sIOMjIuQg4+DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKjsLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo0PkE9PTU8Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6uutLCpm6Cqm6Gblp+wtaeLo7q7tsG8rKicsqWkqJSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ew66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmGlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtu76nur+9u8O3rMGprLO7vqqwqqSlpKyus622taCfrp+lopijs72pm6i9waS3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tLzLvMPBtra7rbO/ubyur6igqai2ra6psreanqyip6Geq7e4qqWwv8Wxvbmzp6q1s62ul5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56zpZahlqysqqebnqaXmJaYlaCkqKWftqupubvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhHRzk1Rk07Pjg9QEouMzIwMjVCNTVQV048TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Rg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7y/z7XDvbi4t7KxtbO4s6umnKusuaqpp6+vl6OupKekpbXAsKustL/DusC6s6e5tbizr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZUlrCfr5yepJSvrqulmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK6vs7SmpJuqtLWqqaatrJqkraWkqKy6v6irtre+wr++ubOyxLK5vayjrrWsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRE5KS0JDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvbmyr7i0wMLKtcWywby0uqqora2wo6OYqrS7pqmmq6qdqa6no6qrvryorby0uL7HvLe2uMGxvsG0qbW3q76lj6KYkqKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqC1r6Wkkq+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFITUVGR0JSTElCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfEvs3Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+3pq2+sbi2x7a1ubjAs7/Ct7WztK++o5ejlpSclK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7KyLa4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvLm2tsSytLi6v7PEwbi4rrO1taOdpZWSlKGuoJminqioq6Oawq2pnqytm5uemaahvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinLKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbamt7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOppKqyoaO0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Krqpifppetu7Sbp7CbraCutLKnq7myp7qzuLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eSpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7o6Odoaa/p6ivr6GptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC5qbakrLuswMK3t6qssbqila2xrbKWpaeRqrmpn6awnaugsLSzqqq2tq27rLOzubesuLDDu76/psOrsLeuqaurpp6YmauioqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG2nperrqiul6aojqe7n6Sss56sorGws6yqtrS1va6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWpn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKDi5ZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakraqmr663qq+1uqensbfFt7G3vcHCtbS6xb7MxbnCwLq+ucS3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvZ2rrrKjq5+wrbSurbayubiqrq+yqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKjraClr5ehpJqako6jpaezqaGms6yptaWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V6io+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tLmkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7qjrLGzp6ijsrSxsbC1sbi0qq6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqKOenJaYpqaluKeisrWsp7GnrrC2rKSZoKyom5yenJSpuJyUjo6KmJuil4+YpZ+dlIKRlY+cm5eWlYiWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra6rp6Wxs7Sqt7G3oKu1ucm5rsC7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1q6qxsq2qqbS7rbSytay0raqsqK2pua2yscjAuKW6sKmtraWorrCmpaOvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW2paqrqK2vtq6jnaOpqpugmpqSpLOZjomNh5ChoJSMlJyfk5GEjZKSnZqYlZOHl5KVmaebn56MkpGOkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqmxpKmls7SxtLWysqGsrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe2sbKpsqmrpqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpKyVpZ6YnpmsnaKoqqKspqOtrLixsqGpoqCsr7GsnZ+nqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhYaPlJ+clZeUhpaTk5ekm5ycipKQjYl+fYeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKGqs5yqqrC2rbi1rqulq6q9ybuwvbfCr7Gss8TDzs/Dv76zv8LDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLukuLOsrK6nq6CjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKslqqhlJugpp6koqulraKfp7G3ra6jpqKbqqutqZyipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmoqOi4p8hYCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaVdWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqy2saulrKqpvMDAuLizu7Wmsq/EycvRv8G6uL+/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3prS3q6ykqaqco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqaCsnJKqoZ2gpKOmo6qenKe1rqimqqOjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+Mg4WUopmNjJmQkZGPkp+WmJaLioN/dIaAfn94dIN/end+gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlVVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zMzEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrChpquumqulrLC0ta+rprCqqbq+u8CwrrmuobevycfI0MG+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zsrmwo622sbCyu6u6r6mttqyqnqqsn6Ogtq2ooZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnp56nm5mqsamjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSDo5aEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5LeHNTZVNRXk1NUllmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEuLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1srSE05VUE0kY+yoKSnrKSno6yntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr6wvaasrLWrrZypr6Sgpa2rp5yeqrKks6ibq6epo6mdpKmoqb2stK+unamkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joJ/h52PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVZBV3ptVGFQUlhLTE5xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UsZmfoKmmpaCqpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7G1sb23ub21rbm2v62hs6erq7C1uLWrn728qbPBtLygr7O1qqufrbCjnKWoqqOem6SwprCgn6upqKGpnKSooa27qK6wrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaWWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mUjIh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvQFt4a1VeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTmayZoJinpKOfp6S4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwbW2oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6egppijqaCxuZ+jsa6gq6GspJymp6mampufo5WdnZueqaaXnKCokpmUmJ6TmZahqpGaiI6Phn2Hf4KOfXygjIyIeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrckxMfmhYWk5QTEpIUFJQSU5cX25TRFdaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol52mmZ2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rva+0v7C8wripu7q3p6i1qairsK2zsKeavrelrby3sp+wt7CopaevsZuhpKCkpKGXm6+moZ6jqK+hoKGTpKSit7ChprGqnqyjr5icqqWpnpianqWTm52bnqermp2dpZaWmJSdjpOXoqiikIiLj4V6hH6Ei3qOl4qNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajoZeVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjnMG2pam3t6uesruppqWor6uZoqecpaaUmKGypZmepKqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52gkpudl6Ciq5ybmaGVk5WWm46Tk6OnpI+Iio6GeYR8hYV8nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZXpjYFJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKOSjqWmnJ6enqS1raiqureorMPAt6+sobWup6+vt8HAvbLBt7Gusra1uLe1rKq8s6+ysb3At668vLGln7aspqa0qauuoaDDrKmnsbSsrLS6naiqq7GlmJ6qnqilkZmmraKZnaSqoZuinZegnae2prCqrqChnZ2hlaCmn6KgmZuanJKanpWmnq2imJeelZSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkY3R/YWRlZmVpamNob1leWF1sZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI3ODVceU4yPkhpWkxaSlZiZkE6M0BlRyU1m6SgkYyuoJqYoJeltLKjsr63obHFu7mwsaK2q6uvqbm+vbytwLKvrq62r7O4sqerubGurrS2u7awuL2tpp61q6ChsaWrr5+lxKGzpa+yr7ettZ2tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa6qK2ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gnSCgYqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGRAQTFJZEMnNJOim4+PsZ2blKGaqbKwn7nAtqC0wbu9ubGltq+prqW3ubi5rbuvraqrt6q0ua2lsrWxrqmxt7axs7W6qKmftqmen6qiqq2cqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknZmpo6WVmqCdkZyjq6qpu5+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamRmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnZOgnKqtq6O9xa+pt8K4vb2tp7awpqukuLSztLG5raqnrLSmsLWip7i2tainrLazrrSts6Kpn7SrnqKknKeomq69lainsLS4ra2kqK6qq6ain5yhqKecl6Gmppybp6edkp6gmZCeqKqjtbCjoqOclpiYmKSJoY+SmoehiJSeoX+lf6esnpSTnZOIg3J4jY6Dh6B1iI1pl4hmfXN4oG+Ih4N+jHx/oaCfmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFxnXz1LMVVgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSlp6izsa2yqK+fqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amoLako6CjmJWTmJOciK6QmJSJqYuYpJyGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrOop6a2pae4r5yysrWqpaSnsq+usaaqnqeksqSiop+XnKCfsa6Vn6OgtLqiqaihra6lop2bmqKqoJibqKGfmJ2oqJGcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9Znujp4JZX4uraYCSeHpqqDhKr1tXVG1jW0xPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa+ksbqwpKSvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGdpJ2YlZibna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJmhp6SQnaObmKGfrJ+lpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXq5V+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKZgeXF1UpOGXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg5Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAyO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfBqqytr66nrrOqoq+8qqGnta2jq7WkpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZqdlpigpambn52jn5ygoqWjlZuemJmdoqqbpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyik5mxqKils6qltKekvLfBsbrAsra0vLO2p7Kxo7GzpqCvtaibqLquoq+xoLK0saGknp6oqbCptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GaoqKnm56gnpWZmqWgnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5ikjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQk5UX2VQNUc9YU02Mi6inZGlr6ykqrusprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrK+kmKa6rqSxsJy0uKqgpZ2hqqWyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrZqgnp6QlZuhnZyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLiwmLPBrKiyp6qyuri0ub65uLO2vbamuLSgta2goKmrn5WntqyosLGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5eIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi9qru1oLGln6anp56TqrGpr6q1raqvoZihoKakpLqio6yhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5qopp+NkqSYqKuolZipqJ+foKOto6CdoY2UoJifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6WjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9sa+6uazBtqqroZ2npKKdkquqp7WjsqiuqqGXnKigpau5naOtnJaZkKWjlo6eoZyZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5KXq7KkoJ6oq7CZoaKPmKGXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmSmYyXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivt8Wxu7KuvLCuwbKspaOfpKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ6RoKiroJufqaSynqKkjaahlKGam5eWpJiPsKCSlamfhZCZtYCRkY24lXiCk5u1d25sb3NueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZ2dxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYVc4Kk9dXT0rO1ZWJz06PKadoKG/ppazwrSrqqisq6m7rrHGr7W0rrintbmtqaOjp5+gnZiTrKStqqa1qKifm5ago56spb6noaqYlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpauclqmlppyZoKinpqOooJGsnpejnpeWmJ2ej7Cpk5ynoo5qfmmcp3iJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKyws6y2pL6ys6agpKqdo5uZmaynrqSltaqkm5iVopumram/qKmmlpSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6ikm5usoKSamqKnrKKfqaGZr5qVpp+WlJ2fnZexpZmiqJmckZ6co6SZp6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWVlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ2grZihm5yipa+moaSnnqyYl6admZqhnp6csKGdoqeVmJOZlKCilqOfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6grKORkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqKajq6Gsm5+goJiknpyfnLCkmZ+ok5iXnZKlmpipn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jn6ScpKqokp6hnqCqr6qqo6qfp5umn6egrJahnKWxpJecq5ahnpuTpZeeq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrWvqqanpbGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZoqSqo5OgoZ6drK6orKajoqWgpKWcraiRpJupraqcnqqdraKWl6WWoaOYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnR8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyBjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqCnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2up6qom6alo6GqkqyzlqWiqqqepKimobGik5qnmqCalJSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGMkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKipqJqqqKOiq5uvsaKorK+mmqesqqqyo5OXo6WalJGEpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmYaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J1aIyMl46BbJmRbm14d3dua2ZkZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+qraOop6qrq6mkpqCbpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqroq2Zq6ehoaqis62iqrOyopyrqa+vt6SUlqOnmJuSfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe3CWkX1venR8em1bZWpycWaBaV5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKalmKqjn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpGmrZGZnKejoKqmrqGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqpqunKympZ6so7esoLK5sJ6cr6eztLSmlZiopJugjoKdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8ko+Ic3pyhH1wXGxud3JqgW5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2mppqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQorGZnpympaGir62dpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6iZraGspKWYr6W7rKG3t66enrWyubK0qJmesKKknoaP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGfpaGgtaeiqaewo5Sro46kraSfkJqaqrS0pJ2mnKmSlJeuoKCepqScp5y1mqCqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOmmKqmrKGkm62mvayVvrCtn6Ows7qstaicqbKlqZh6p5F9fLB3ioCkpYicbbJvoIete6GPg6iVmoCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6t4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOMlYp5eYGWfmpsfWJ9dG1/eV9mZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmaScrZifqKW2qL+upKmjn4yAjpubn6aekpSZmpSZmaSjo5mnqquio56pqL6kl8Osq6OirLO6rK+oorSwqquZdq9+kIqchYd8uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaShopCEoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmomWj5SVeniNm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEtJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6lnpmjoqWZn6Opsqi8r6Wonp2OfIualqGgmZCRmpuRmJaonqCYp6ympKSipKm7nqDGp6Wpoqu0tq2vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+JppuapaqRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuOmY+Vm3iAkJl5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5uaoKiimZ6grKypuK2no5qXk3uHmZKmm5OPkZiYj5eTqJmfl6ion6mmoaKru56pxaOgr6Ors7WrsauivamwsJt0dqqktoVliZ9vZ6yPio9tb3ekkJqggXWwmpZwkI1ylqejm5iupHJtbWxlinhubYKZcYB6aXBpZomWlZhxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpePlJx8ho6UdGWGd2eManh+eGRsY2ZsYktkWEprWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPIvrSpnr+rrKOgpqufuqOkraytpY2WraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJeOppeOkZCYlI2XlKaTnpenopqwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbaciZahl4apmpCUnZOqs5mbo6yhs5ejoZ6hopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck6CUlpSfgYaTi3BnjnZuiXd1fHlpa2Rkb2NVYFlAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xbq3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqykopqonp+TlaOXqJqpmZSmoaSQmqeZobS5p6qYmpCMe4GUjKGUipSRlZCPkpekjp6ZqJ6btaOdpqy3qK/CrqO3pq+vsK2qq7W7orG+mpKmpKa1opGdpp6NqZ+Nkp+jrLCboaSyqbCZpaGdpKuenp2cl6uckpmim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5KgkZqUnoOGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsruuqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCun6SXqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiHmBk4ybk4qVkZSQjZGWoYudnaednrijf4OvtaKwr3SkvqOyoHh6oayzvZZ3rqWgioCqfmRbYXafjqSdg5d+bpOznKOor6ujZZ+glHR6mpZwgJiol2x+oqiKZZ2lm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+Ncnmilpdld5eGgHaXaIKJgm55fmpwZV92b2traFtlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppqqXc4ucr5+oq6eTlrifoI+cpJ6QfoiIm56NrJqklaiino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+Nmp6lmJuyloCMm7WdtIySj72noX6nonqksLmBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWHmXelm3qHm4GXpoKBe5yyeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmCnZqFmH2RiYGCmGmMjIRqeHpwcGdkeG5pbGpbZGlpZXJbXUhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8r6CVpai0nY+DnKubp6KgjZC+npmNn5qhkHyFjpmXiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPj5uLjpGekZWeo5WdrIiftIm0mq6Lyoirr4m3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaok5nCgn+riJihcZ6AmqV9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZrWGdHXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PD5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ+ipKqilaSptqKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2JtkIuTkI2PjIyXi4+Rn46SnqCZoah+oaeHrZ2glq6QoJ6dkYaCoI2sr4ekjaqajJp+onWAmJNrgat0Tat4h42dkpuoqIKqq36EoXt6p2mef5JsZ5eGl7WInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdoTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZefoaWsq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkYyKppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaGMk52fm6Klf5OBj6OhlKB3nJaQp4OiqICGqq2FpXmLfYSafaJwcpKHlnuejHlth5uLmZGcqZuPh518gqJzdqZmnn53pF6Ye32Sc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2xycmRcaF1hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqinKOjpKubmrGsq5KXoJigpJmalJ6rm4uIkXiLhXCAlo2Jj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uGfn2PjYOLj4+JjpOfgpacoJ2gn4uJd5yYoo2gcqKLiKmInKeRmKmrf66MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3BqeXhhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aXhJKVmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46Vmn+ToZ6gopOYcmifiqCPjHCSjIKpiJmgpKqhqH2wraSiuJd2o7Oio3+IlHideqqafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdZt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHZ7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maooubqZycp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5R8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnpGLop19p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl2jZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Da2dmY252d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkQ4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjYiFe3B9hGh9j4KTmoF3kY6OiXB/ho+TkmyYlHyJkZKjlYOOqpqTkouFiXmDdoeAboGehneAkoWHmKGWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZySfKSAopmGmHGehKKtromXi4CMpI2Wg66ilHa1trXJoXSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXantps7W0xqZzmH56nWqbmqt0gpptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWGdPUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU5sXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bko2Ig3lqeYZlg4x+lp95dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl5f3yLeXCPoIZ5gZSGiJaflH+UpaeclpaEZ254nGyiZHxxpXicmHBop4KYjHyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnJpqmt1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjG97f3NyZKVueKJkZqdomHKLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlVlWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnBnUGpoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5CNinuGcYCIaIuKfJeac3SJfZB7ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfX9/jnNpj6WEfYWTjIeYn42HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4h5qXSlj4SabqWijJKEjIO8bn2lr4KGhoeUl52gfaZ6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf42nn3effYWklZ2gaZqHdatmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpVYGBcakxcUl1JXmxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnhkY25zZFJsZ2hvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Xk3N1hnKRg21/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42InJ6JjJOqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyEgHtyp4xxfX16l5abhI14e35+iJSVk4p3kZmgoYR7fYlrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCgoaOqpx+dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cXBvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9wd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOioiNcoJ8j31+j4R6l450coRwlYV7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Xd3GEqoWNkZyPh56eh4uaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2DjIycnJ+Oc5WLiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKJkKeVhmaNj4Nud4uDb4SMeG5kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mc317c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPjoSofn+SkZKTnLGlmpSdkI6yk5iEpoyMlpygiZGbgomSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImHipGmkYSGjoiDjJCLe4aJh46AdWuBg3t5mWlyaGB0inB9enZ1b3d0gV1db4dobl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob29sZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg4yRl5WOm5aGhpumoKKanYaDkpqZmJCapqCmnp6QloGSi3d9iI6EpXt8j5CQhZiqoJyTnI+Nqo6SgJ6NiZSan4OOl36GjoJveIZxdWF+hI+GdIuXgIKOgoaEfoWElG55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mMj4STp4+GhI+Cg4qJiXWFhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1haml1eX5wbGxjampngH9rcn9ranNueG6EeW6GgHaCgH2FdnGCjYh+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKi5KGoKGKhYx8p4+GjpKXk5aSd42joKGdlpp/gZCZmJOMmqKho5qYkZt+joV6gYSOh6B/foyMjnyXpKCgkpmQj6aNkIGbkYmTl5x+kpF9ho2AdXSBcHZgfYCOhnGKlXyHinGMfoKFhY5oeHJ5jZmSkICXfoiLc4KIfX1yenyMhXt6kY2DlqWTi4WRfIWGh4V1gYKFhnlkcXp+eHlwbGlmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZFheYGdqdniBcWZrY2xnZX+Aam19Z21wan13hnpri4FygYF9gXR2go2Gf3x6gIF9f49pcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialnh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6WTg5GKlpeSkXaRnaGhmJSYen+Ol5aOlpqcpJ2Zk5SbepCGhHmFlo2dfYGKjYtyl6KeoJKYjo+ijIyDl5iDk5aaf5eMe4iMgHZxfW16Y4B8i4VwhpN/j4Frh4KBf4mEZnZvfYiTmY5+lHiMiX2AiH18coB5ioZ6hJGKi5iiloGDjHeIhIKBdnuAh4N0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3V5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkIqmj4yOipKfkIKQj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI6VlnSOj4tthpiPmXqHiJCJb5edmqKTlIqMn4yGgpKcf5OSloeZiHuJiYF5cXlqdWx7f4t+bYWRgpN3b4KDfX6LgGVzan2Bl5iFf450kYmEeoh+dniBfoeBfYONhY2UpJB5hYJ0iYd9f3J0f4WBbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9rdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfYB8jYmRo4iNio2XmYyFkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJl5FvipqFZ4aZjpR6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmo97ioSGc3N1a3FudXyLdG6GkI2RcXSAfIGCiHxlcW16fpuUfoWJdJGLgXSJem+Bf4KIfYWMioWNlqiNe4h9fouFd35wbn6DgWJnd3N0bnpiXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2RpaIB6d3VvjoRzgYGDe3WCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doR3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyHnJ2Jj4aSl5WDiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhpiIa4WkhGeHnYqRfouEi4F3k5iRnZGQiImVjn9+j5h8kY2QjpqSfYuAgm52b2ttb3B7hmlzg46XinF3gHSCiIJ5Z3RvdoKbj32KhXqVknp3inVxinyHjXuLhoSJj5yjiHyEdoGLgHh4bmp/gH5ccXJxb294Wl1vYG9qXm9pfHpwbW1qbXdgcG9qcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYZ/d4eGdoOFfIaMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCb3KFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKLkaOak46IlZiRg4aWmYuTi4iPj4iehZCKfHOLhYiPiJyZnpuWlICUf2mGnYloh6CIkoSRg4lxg5GXj5qNj4yLj413e5KQe46MjZKXjXyIfIBrdmlta2xsen9ieX2OlYF2eoF3g4x8eWh1bXWIlox/iYZ7lJFyeoVxeI57i417iX6DjZGfnoV9fXiBi313cGhrgIB3XndvbWtxclZdbmFxYV9tbnlwZ3BmZnR1aHFrYXdlXVZlYGByU1BOW2VkXXhwiHxeXGhxYmJlZpFpX2dkW2hwfm9rcXOKfXZ9hYF0dX+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqbm5yalZN5jXdpiZKIbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYqSkYl6hXx+bXxlcm9ra3l5W4B5j46Ben5+f4aOenpodGx1jJCKg4aFfZaMbH5/b4GMf42IfoR7g5GWm5uLfHd4g494c2xlcH+Ca2l0b2doc21TXm5kcFpfa3F4ZmtrYmd4c29xY193YGBWa19edk9NS2BmY115cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdXZ+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Fza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY6PdYp3cIeJjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWJkY+GdoV+fmt9Y3h0aW14c1eIepGHhXl+f4CFjH55ZnRrgYuPi4SDgIyXhmyCdm6JkYORhX+Ce4GRl5OZkHR0eIeMdXNxZnR5gWFzbW9haHVmUmBwZ2tVXm1zeWByY2BpfXFyblpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh3fIhxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjHWHf3GGgoqImqOElY2fhIlhg5WPhYiGiYyHgIdofZR/fYOEiY6NgnGGfn9yd2d2cmhzd2tajH2SgoV8gIOAhIqCdmJ0bYqCkYyDf3+TkX1ugmx5h5CHk4R9gn6Bk5SRl4lucnqMhXRscGpxd39ec2huXGl1X1JkcWhmU19vdnRfb2BdaIJxcmpXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX56dnqHc4WDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKTgYl1hId3hICLk56gh5aQn36IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH5tg3yCdGttd3VzdnVrY42Bjn+FfnyEf4SIf3Bgc3KGfJCOg31/kol6cYNme4SLh42EfIV/gZSPkZOEbnB5jH50bG5panl8YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiW2dfZG1fblRab05ITmZkXGducYBrWltjc19cY2x3ZGVdXVpsbGJtanN2hn9xb398fHR4hXiFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj15xcpa8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCJdYV8ipmemYeVjpyAiGZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3ZzbGuOhYqBin94goCFg39rX3J5e36Oi4Z8go+BfnKBaXmEiIyGhXmEfYKYjJCMfW5te4l9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR4ZWBeXVlvgG9zWWVhXmpuYHBPWWtRRFNnYFprbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8goV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniYjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndKYlqk2dCWcXuQio93fZOKhJiRjIVua4WSknp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEkoyDf29/g3aEeYabmZWMlJGUhIhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGh4cG91mY2Gg4p8dniAhHmBa1xxf3OCiYaKfoaJe4lygW5xhYePhYVzhXqCmY2NhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dGBdXFpZdH1zb1dnXWZqcWBvTldoUj9ZZl5ab2pnenFaWllrZVpjcXlfaFxeZWxoZWtpcXd/h25sf36AdW+Ce4CCfoJ/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjIt1fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH1ugHV3hXqHnZGNkZKTjIuGf3uShnd/g4yCa39yaIB+eG18fIGKg3dheYSBcWRxaH5tdXF1gZuLgH+FgHN1foFzgW9cbn91eYuDi3uHgHyIeHpxbImEkISLcoN6gJaLin90bWt3gIB0dFxoZ3ZvWFZ7UllwZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW5jaU1XZlE9XmVcXXVmYHVwWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5saYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iSiX9oe31qc3tyhntzd35/jHp4hH18a4yNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnaFlYVzjoqJdnBshYKGdHmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIgpSRmImLhIl8j4hwe32Ee2h+bGuAe3ppenaBh4ByYHeBfnFkcmZ0gm11e4aVkYF8goFvd3p9dX5sWXCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiIl6bm1qboKBdG1cZ2RycFFaek1bb1xPXHJvZFVLc3hpV1laWmFxgHRgXV1gZmRoaWZOWmhNQGBjW2B2YV11bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N6gnN1h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3mWjpWPiIKIe4iIa3h5fnRnemhsf3lzaXp2gIN9aGB3h31qa3RneoBpdoGMkZR+en5+cHx3fHR+YlZ4fnNzioSCfYNxh4p3eHFwhIKNf355fn12joWDdmlxaW2IgXBvXWdhcW1KZXVLXW1VVFpzbmJRT3N4YFJYWF1hb4JzW2FcaGVlY2tkUVtwSUNjYFtjcF5deGhVVlV3XltlbmhWa15haWdlbm5ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeEcm13g4J9iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RbWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d39vcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn14e26Id4GSjYV0loqRjoeFhXt/hGx0dn5tZ3ZlbXt1bWp3dn9/fGFieIV5aHV1Yn17Z3WGjo2Ve3SAdnGAe31tf1lXdX9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfXNndGVui4Nrc1ppXnRkR21tTFphV1ZWd21iUFJ0dldQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJe2JubVthWlthVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV8amx1Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzlpN2fnxvinGCi42IcpiOkYmFi4N7eH1xcW98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlHtxh2pvfoB5bnxdWXN/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfXpyZnNhbouBanJXal52W0htak1WVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGtqZmNZbmFZZHBHQGdcYGZfXFV6XU9VZHBaW2poXVdoYF5yZmtncWdwcneGeG6VinR/end+eIOHf3Vyf4aFjoNwcHt4dnV6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1pdXVRncmRgWGRxcmaBc2JrZVdbYGp/eL6ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqbmCHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmScYB5doRugYOTiXOViI2IhImFfXh0cm5oeGBqbWBtdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ+b4xna3qDdW10Yl1xfWx1fYx7gWZ1h31ucWh1f3h+f3N9bHt7gnt4b2VsYm6JfWttVmlfdlVKaWpPUU5oTVh7aGFOVXVqTFBUVV9mdYNmXmBwaGdhV2ldXGxoSkRqWWFkV1lUeFlOVm1qWV1rZFxZZWNedGZsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnV11aXFtTZHBkXldicnVpdXBlZWJXXFxpf3BvcoBziWRkeH5pdHV0coGDd4CDeXZzdW1renFiZ2tnhnSNg25mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkHR8c318bnx8koZ3mXyIhoOGg310cHFsZ3RcbGhebHRkZ2Zpem97cllngHZ1aHCAeIJ2YneFi3yUgG6Mam17gnFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenp0fWZ+f4B5d25jZmJuhnxsalVpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2llYFZjV2NwXUxLalhjYVVUVHNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNucn91dJqBd3+Ad39/hoR6fHSChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBpa3CAZ2tgaHl4anN0dG6EgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvaXBnZl1VWG9njqh3gXp8kY55dXB/cHN2eo+AeJV1hoOAhYh2anF1Z2huW2xkXW1yX2dhanhoe21bboJydGpvgH55eGF3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5YnOAcGdqeXRxbHh4dXhkg3t/eXdxZGRjbnx9a2tVaGFlUkprZ09HUWtFYXhnYU1Tcl1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bm94dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVZcXGyBZXF0fWlpXGt2dWdzdnJthXt9fHh1cmx5Z2l4Zl1lcmh6d5OBY2NUZXBngoV3d2doamBXVllnY4+nbn53gIuPe3Bxfmh6b3qNfHePcoR9f3+GbmR1cmRoaFxrYVxvb1xnX211ZHpoXXSAb3JrcXt9dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V9dWVygGxhbHtvaml7enVyZoV2e3t2cWViZW1zfmlsVGddXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmZVSlxjV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG5vbnaDl3lygYB8f4mMhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlWY2ZrX11ccoVoWHBuW15XWlxse2Jwd3ZtYlpsc3NndHVwbIR4fn94d25udGRpdGVbZ3RmdnaSeV9dUmZmaoOCdH5iY2lcVFheYmOPpGh4dIOGkXhtb3tpeG58hXt1iXOAeHx4f2hkdmxgZmBeal9cc2tZZV1vb2J6ZVt3fGtubm93eHN0ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm52aWRmeXx1bm+CdXR9dHJiX2Zub31kaVNnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xjXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGc3F3dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFtaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bm9we3x8cYF3f3N6enpjZXVoXWJaYGdbXnZoV2Jdb2hhd2Bbe3ZpanJud3NydWhxgpWDhn2DdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcWFfanF9bGx1fnNxeGtwYVxlbGx6YWdTZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFgW1pYWWxxV1NPZldXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmnyChHl8h26PhnFvd3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1ZnYWxrWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYV1ubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZYpWVY25wg4WKdGtofHBmc3dzfGx6dHVven51XmVyY1teVmFkWGF0ZVVfYG1kYXFdXX5waGlzcXNwdHZrbYSTgYh6hHFzZ29+cXNvVFxna2ZxdIF3c2NsdlVicmtaXm9mfWVtd31zc3NrbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3dqYVddVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaHZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU29nc2xmeGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nV1hfV2SbiGJrcIGHfXhsa3luXHdxbHtqdnNub3uAclhpbV5ZXVViY1dkcGNTXmFoYWJsWmB+a2Zrc3VubXd2bGmFjH+JeYdtcWZxfW5zbmNaYWlpb3SCdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWtgWWFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59Y19UX1RddVxUU2BmTl1hVFNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmd2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmako+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeHjIeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKh4aOhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeIh4yIiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo5OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0FAPzw7Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPzw7S0c4ODo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+OTdkbDs4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQUA/QEA9PUZJSmt5TTw+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fX5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RCQEBDW0FRdH2BfXtcP0BAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA/QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBvcXBydXR3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFCQEFvY3+EhYKDfmk/QkNFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZDSnaAgoGEe4CFdERERURDV3WGiYp+WEdJSkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSUlRdoF8gISBg4hwRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDQ0RGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSlV4gX6ChIaGh4NVTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKWH2DhISBg4eHiH1/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSUtRdoSGhH6BhYODhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJTEhxhoWBfoGDgoOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNES3uGhIGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1NfoSCg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ozk5OTw/PDxBQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo5Oz8/QUp9g4KEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PTw+QERDVYKDhIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0lJRkdIREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BP0JDR0VohIOFhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCRkZLSnWEg4WFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0RISFBbf4SFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A5Ojw4PT47PUE+P0FDRkhKVHGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUZJSU5UeIWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VWUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PUI/QkNGVk5FTE5NUVZ7hoSFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDR0VERUxYUk1TVFNWWHyGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1dZWFpZeIWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWVpugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjU3OTU8Qj1mdHR2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1lUVFhRTFhZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5MSUhDP0E6OTg4OTc4ODQ3NTc4NTg5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTUpMUkhJSkZBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xIRENKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFREJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSklNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUFCRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZJR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hfXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0JCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCQ0lGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpMRklISkhFS0tMTE5PU1RPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXVpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdKSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRRUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXRydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGVnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViY2ljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3Sk1MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGREdKR0dKRklMSElKTUpNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGViYWNpbmljaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhKSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkNDQ0JFRURGQkZGR0RESkVFSkxMSkxNR0dNSkhKS0dLSklKSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3BNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURDSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hJTUlLSkpLTk9OTk1MTk1MXGhkdV1scVdsTlBRblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSEhOSEpKSUhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b250c3Z0SEtISkNFRUVAQD5DQ0FGQ0hKTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aam9gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVERkFAQUVEQ0dCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1enl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpIRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0JKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eHl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdIRERAREFISUE/SUpHUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSUlHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JRU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1BRWVNeXFxdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VKTlFRTk9PTU5NTkhLQURBQ0RGRENBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVtdXGFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUhISkhHTUxRUUlMSktLTk1VTk9LS0xHR0tQU1NOUE9OT09PSExGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/anR1dV9hdl9ZY1xcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSaHxlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFSS0dneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp+bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHl9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRqaGhlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT05OUUlSbUhpd0tgZHZ1VVdsT25se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWhmZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9QSkhRTlBVTEtLUlNSUlRQVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZ2VjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVlRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVVFOVVNOUE5MUVBLSVFRS1FNS0tPUVRSUVFTU0lJTU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFhXXlpfYV1cW1pdXWBjXF1iYmRnZWVlYllgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hUUU5VUE5RTktTUE1OVVNOUk5NTlFTUFRRU1RVTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NVV1VUWVVWWVRSUldVVlhcWVtgXVZZX11eXVxdYGFeW2JiY2hmZWViWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPV1VQT1RQUFFOTVFRT1JYU1JRT01PU1VOV1FUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZZVFdXVFJSWFZWW19aXmBfVl9dXmBcXGBgX19aYmJkaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU05OUlBSUk9MUFNSVVpVVFBQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ddX1tfX2BWYlxgYV5gYl9cYF1jYWNnaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5f2NcW1ZWWVJOT1dTTlFSUVNUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1xWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRTVVVUS1JWVVpaWlNPU1JVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZW15VVU5WV1deWldRVVVYWFhUVlhbVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ15dZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWlZRUVRcVFRUVVVWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWWBaWVNVVlpZWlZXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZlYl9kYV9hYWJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFlYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZXFpYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhaWV1iWV5WV1pbW1taWllbWVlfX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXVxdXV1bWlxYWl9hXmBkY2RmZmZiWWNmZWhnZF5jYV9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWVlQV1ZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFVXW1tgXl1fWVleXV5eYFtaWllbX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYGZlWmhpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YVllbWllXWlpgXmFiYmBhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gYGBgYGAgX58fHx8fHx9fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3d6enp+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x8en16d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7fH15fXl3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp8fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKCgoKBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjImHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDgoODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKChIKCg4SCg4WFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIKIjoOFhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCBg4KBgIGBf4qZhYGCgoGBgoKBgIKCg4KCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gICAg4GAf357gZiMgIGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgIGJg35+f4J9j5WCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhYSDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGBgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBg4+DgYF/ioSDkoWFhISFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhIWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISEg4ODg4SFhIKFkoKKhoWCgX6ChoeGg4F+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4eSgoaEh35+f3+FhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDh42BgX+Hgn5+foCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4SEhIGAgYuFgH+AgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDgYCDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYKAgoODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiIhoWDgoKEhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoeDf4GEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH+Bg4SDg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+f359foOEg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISCgoOEgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgoSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaHhYWFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHh4iGh4eHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIWEf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4GAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx8e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt8fXp9fn5/gICDh4mJiYqIi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35+fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYB/gIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt8enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH6AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4KBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3p5dHF1bndwdXpydnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enNweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4WFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYGBgoKDg4aDhIOGhIGDiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4GCg4SFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/f4KKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf39/f4SEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4F/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4OFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDfoODfYF9fn59foKDgXx/gH1/gH59fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2d3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fH19fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhIaGhYSEhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICBe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFhoWEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYeGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHiIaGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYWCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af3+Ag397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaEhYOFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgICCgn99fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7O0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8W0nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q4n5qTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GdqJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnp+blq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigaCYm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuahZ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03a0sKacir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCVppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYwqKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh87GkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Bv8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE9Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7iztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7jAsK+1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcK+2MC0sbSyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHD0NK0yLS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v725vsC0v7u8uri+wrzCydXJl87EtLK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxu8W8wcvNwo6nybm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDs6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3uLi7tK+0rLCvpJywtreNibW6sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxr73KsqaorZWLjXZwf4SfjIWht7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqW91KuinZyAbIF0YWNlcoOKm7e1r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqSfwM+pknx3gV5rkXVvZV9ukKC+tLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnsLHmXhjYYpcV4KLkIhsUompw7Otraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6fp56coZ2empqSmZ6coaKgn6fJuYhhWnaXWlhhbZCPfk50tMazp6qsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3pLCmn56dnZeYlZmem5yjn52u0apzWWSMiVhbb2m3rXZaWaC6s66uqaumoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+drM6eYF+Ih3d4hYd1no1ycnOUsK6npKSioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpybnq3JmFZvn5l5kpx/a3p6jaayqqCanZyfnpqXmJeSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqa3zJFUeaCkentuZm+RqbGspJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSqw86KWHqGhG5ocZCur6WdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtc/Pj2R7fW9ulK2tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbTRx4xvdnGEqayhmJaYmpudoZ2anJ6TfXFlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxxKFtbG6QoZyVk5ecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7m9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFlYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dXZ2tvYzM3PyNbVxcO3sLWpoq2suLyhb22Omo2Ml5WQlJKRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3G0NXV2drb2NDKz9DS1MnEuLy8rqW2qr66oXeJlo6Nlo+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83OzszVz9XZ2NnQzNPOztDKw7bEv7Syuq++toh9lYyTl4Z6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0MbV1NbXzszQxsvHycS8yL+usLa0t6+CjI2Ki4V4gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7IysnLycrEz83Sz8/GycTJxMK+u8y6rrK3tLKrjJCGiYl7eH6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTGwMXFw8PKwsnLwcK/xb63ubnHs6+0tq+tppGJj5F8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre6uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzL+8yre+xL+7y7jCxMO3usC6tbO5wrWxsrOnqZODiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu4vMa5tca5tcDDsLrBt7KrtLu2qqyupZuEh4eBfXp1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMjBx7y8xcTPv7rIubnAubTDtrK9vrC+v7iopLC0saGoqZ6IhoeAeHNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwMa3wcDIz7jCxb60u7u0wLi0u72xt7q1paGss6qgp6SUfISEgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvsa4ycyzwsPCr729t72+t7u8tbW3saKhqrOenpabhoB8eHJqbXJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8bFtMPAx6y4ub+4v72+ubiytK+goKqtlpZ/kYd/dW5kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvMyLbKvrK/xcqus7rEuL7Dv7m5sLSvnqOop5SOfYuEfHVpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiprJqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmIRzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLPz8e0xby4vMTKsq66wrm/wb+4u6yyqZ+ipqKUin2Bd3hvbmhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5WnqqSamZmdnZaNjIyUhomNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLSwubXAsa2xq5F9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DKsri5vb/CxbOytLqvt7e/uLuqrKeqpqahkJJ/a2dtbnJucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5Cao6ablZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGftLKosrehnaK3rKqtpLKyprW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNxrStu762ucGxr6uzn6mxvrS1p6OlrKamlYqXdl9gZ3NxdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsKGwrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr6zrbvCra/Fr6qkqZOgqbqyqqiZoKWkoYyHkmxXV19oZ2lnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C5r6+2w6isx6uln5qEl561qKGgkJ+dnJiMg4hjUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrers76ooJiQgYyWrJuckoaZkJKMh4CAX01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqSAcmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrSwo5yTkJaDkJ+SmIZ+koSKg35+eGBLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYaTe4uSj5F8d4Z2gHx4eXhgS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY10j3uCiI6LeXV7cXp0cHR2YU9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIcoiDdomOin10dXN1dGx2bmVVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCCdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW2WiYt+eHl6cHpye2ltXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWdfW1pdU1tmXldRVVlcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4F0ooWMfn6CgHKCgHxreGtTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1tdXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ+hqWIiYCDiIZ5iIt/dYZ4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlH1/koaTln+KgJKbjoSBgoyLgoqOhICKf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8f3+AcmBcY15ZZmpcbGteWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpJ6gJGJkZJ9ioWZkpGDgICLjYmGkYeFiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW2BeYWZjYGdnXFJFS0tQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGCdFhgY1VlYWFiX2BmX1tUSkRFTFZRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6Be2lWYWBXaWRpZFZbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qkorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfXFeYWBcVmFeZ2VSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwbu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JJRUNJO0FEPkFIPz9BNztEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluKesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40J14bGRcYVxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqKeqsbmrprSjoq2io66ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yKcW1iX15XUlhSW1BKR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUlVQWVVGRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdnqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09rb1tDa2tHWyNXMlHd5Z2ZaWU9SU11IQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VnY15SVlZVTUtETkQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWNVXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZWVbW1ZSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6WmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9ZmFcXF1OSVRZQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mLlo6HfYyYnomQkJyamZOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVJdUE9FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKf4Fzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqqebnqaXmJaYlaCkqKWftququrvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhISDk1Rk07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKustL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqylmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6irtre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq6kpJ+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby0uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFJTUVGR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUA+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5uemaagvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLq0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy3uqWZq7Krqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKSdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6qssruila2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNEVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG3n5errqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKCjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6insbfFt7G3vcHCtbS6xb7MxrnCwLq+ucO3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq+yqLWvtLy9yrOqtrWxtLCvqKKzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaSk5V5io+Fe4yKg4qSam14bXV7YUVgallJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VeYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqqmktqCgp7GhpJScmZWxnqecoKqOqaOenJaYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5eap5yjoJKWkZCVdYSQh3uFgYSMi21wd3R7flxLZWxcS05jXD9ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1rKuxsq2qqbS7rLWzta20rKqsqK2pua2yscjAuKW6sKmtraWprrCmpaOvpKmcnpybr5qjo6Kjkayeo6CgoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqYlZOHl5KVmaebn56MkpGNkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe3sbKps6uspqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpK2VpZ6YnpmsnaKoqqKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhIaPlJ+clZeUhpaTk5ekm5yci5ORjYl+foeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLykuLOtrK6orKCjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKsl6qhlZugpp6koqulraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmYqPi4t8hoGBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvSv8G7ucC/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3p7S3q6ykqquco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+LgoWUopqNjJmQkZGPkp+WmJaMi4R/dIeBfn94dIN/end+gYidj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0ta+rprCqqbq+u8CwrrmuobevycfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zs7mwo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+vs6K1qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnqJ6nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSEpJaEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaGeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwsLSxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mdpKmoqb2stK+unaqkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+j4OAiJ6PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspmgoKmmpaGrpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6xrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Be5qUjYh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65srO/tLq9t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsa+hrKGspJymp6mampufpJWdnZueqqeYnKCpk5mUmJ6TmZahqpGaiI6Phn2Hf4KOfXyhjI2IeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrcktLf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rvbCzvrG8wripu7q3p6i1qairsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKGXnK+noZ+jqK+hoKGTpKSit7ChprGrn6yjr5icqqWpnpeanqWTm52bnqesm52dppeWmJSdjpOXoqiikIiLj4V6hH6Ei3qOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmpaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGzppmepaqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6CjrJybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZntjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqureorMPAt6+sobWup66vt8HAvbLBt7Gvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qauvoaDErKqnsbSrrLS6nqiqq7GlmJ2qnqilkZmmrqOYnqSqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq6jmJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkYnR/YmRlZmVpamNnb1leWF1tZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vbytwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+yr7ettZ6tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa5p62ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Fyf2BkZ2pubGZqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+PsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ubi5rbuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSztLG5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK6qq6ain5yhqKecl6Gmppycp6edkp6gmZCeqKqjtK+joqOclpiYmKSJoY+SmoehiJSeoX+lf6esn5STnZOIg3J4jY6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCgmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amobako6CjmJWTmJOciK6QmJSJqYuYo5yGsYCkrp6Vm5+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqihra6lop2bmqKqoJibqKGfmJ6op5Gcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ+elZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6ZoBpeGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGco52YlZidna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/lJeXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAgIiQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6moqpudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3ybl6eQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKikvLfBsbrAsra1vbS2qLKxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqiXnZicoaeimKKho6GboqKnm56gnpWZm6ahnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5mmjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlsK2lqrutp7Wlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+mk5ShnKWnoJWbp6eimqOfrpqhnp6QlpyinpyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOng5qao4qSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDMzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBraiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbKrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoaKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9srC6uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZuZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5qforyimLHCsK2pqqyxqLmvt8WyvLOvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqqmaasuZ2jrpmVoZCmoJONnKOfmZ+akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeWpJiPsKCSlamfhZCZtoCRko24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdXaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGsLa0r7intbmuq6Sip5+gnZmUrKStqqa1qKifnJago56spb6noaqXlZyRopuSj6GoopSel5KYlLK1tq2YnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4loc418hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyK2xtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iWopumram/qKmllZSblqCak5ilqaiSn5CPmJywsr+sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJeHk5WKg5OTkIiNkZSZk5mXmqChmpuUoJyOgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+ipLGxt6CpprOnpbC1qsmsrrKmtabAqLShnqWmnKWWlqCrp6yjo7esoJmXlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDsJqrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCdjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsaytpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlZ2Zma+mrr6grKOSkp6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iYnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbKrqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKKvpra5pa6jkI+aoZmTkpugmJmmlnulrKKotMO4paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrawq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevo5KSmZ2lkpGgoZeboJ2Hpqukq62/wLGhqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfqt6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5Wao6KSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKepqZqqqKOhq5uvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaajkJqiqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqqoq2Zqqihoamis62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpCmrZKanKejoKqmraGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqZmunKynpZ6ro7esoLK5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgW9aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQobKZnpumpaGirqycpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6eYraGspKWXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzboB1XWRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraSekZqaqrS0pJ2mnKmSlJeuoKCepqScp5y0maGqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOll6mmrKGkm6ymvayVvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6p4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOLk4l4eYGWfmpsfWJ9dG2AemBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmqWcrZigqKW2qL+upKmjn4uAjZubn6aekpSZmZOamqSjo5inqqqio56pqL6kl8Osq6OirLO7rLCoorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmoqWj5OUeXiNm3xjc3xhg3hzgHxhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6ln5qko6WZnqOpsqi8r6Wonp2OfIqalqGgmZCRmZqRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuPmY6UmneAkJl5Ynx6Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5yaoaiimZ6grKypuK2no5qXk3uHmJKmm5OPkZiXjpiUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivKmwsJt0dqqktoVliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpeOlJt7ho6UdGWGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY2VraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7g5WNppeOkZGXk4yXlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbadiZaimIapmpCUnZOqs5mbo6yhtJejoZ6hop2hpKGVq6eMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck5+UlpSegIaTi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeQl6yji4iJj5ynlqykopqonp+TlaOXqJqpmZSnoaSQmqeZobS5p6qYmpCNe4CTjKGUipSRlY+Okpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mpKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKqenp2cl6ydkpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZuVnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajk5epnI6GiombopCun6SXqKChkpeZm66LqpaQqJmojJiojp64tqOlmJuNiXmAkoybk4qVkZOPjJGWoYucnKednrejf4OvtaKwr3SkvqOyoHh7oayzvZZ3rqWgioCqfmRcYnafjqSdg5d+bpOznKOor6ukZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXqjl5Zkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62lkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI6bpJ6QfoiImp6NrJqklaiino6XkZ6FdK6QiaaaqJGWo4ibubOnoJiZi4l1dpKNlpOKk5GQk4uPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnpqEmH2RiYGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpai0nY+DnaucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5SdrIiftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ6ipKqilaSptqKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKh+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZafoKWrq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbaF1iTEQ9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqhm6KjpKubmrGsq5KXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhX2ZXYkJQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5qnn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIjJaXhJKUmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNgUV5XXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maoouaqZucp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVioqKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVJbZlBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkoqFiXmEd4iAboGehneAkoWHmKCWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilHa1trXJonSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWWhPUmhJVUxYUlZcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelX+TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlZmWVNtSVhPXEhYaGhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn46HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpWYWBcakxcUl1JXWxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5Oqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cnFvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5WMiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mcn16dG90Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh42AdWuBg3t5mWlyaGB0inB9end2b3ZzgV1db4dnbl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfYeThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumoKKanYaEk5qZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSan4OPmH+HjoNweIZxdGF+hI+GdYyYgIKOgoaEfoWElW55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mNj4WTqJCHhI+Cg4qJiXWEhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wa21ja2lngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhHyJkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5GIj5KWk5aSdoyjoKGdlpp/gpGamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqTl5x+k5N+h46BdnSCcHZgfYCOh3KKlnyHinGMfoKFho9oeHJ5jZmTkICYf4mMc4KIfX1yenyMhXt7ko6El6aUjIaRfIWGh4V0gYKGhnlkcXp+eHlwbGpmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xoZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goR9iJB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYeoCPmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAj4Frh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5ioZ6hZKKjJmjl4OEjHeIhIKBdnqAh4R0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegm5KQknSBjpKUiZ2dnqeZmI6VmHWPkItthpmQmXuHiJCJb5edmqKTlIqNnoyGgZOdf5OSloeaiXyKioF6cnprdWx7f4t+boWSg5N3b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iYd9f3J0f4aCbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2plamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfanJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZSRjY1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R6iYWQinCWmpOhkpKIi5mMgn+Rnn2Sj5OMmo97ioWHdHN2a3FudXyLdG6GkY6ScXSAfIKCiHxlcW16fpuUfoWKdZGLgXSJem+Bf4KIfYWNioaOlqqOe4h9fouFd31wbn+EgmJnd3N0bnpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2pqX3Fpc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2Lj5GEbomLj5GKnJahnJiWhpiJbIalhWeHnoqRfoyEjIF3k5iRnZGQiImUjX5+kJh8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3inVxinyHjXuLh4WKj5ykiXyEdoGLgHd4bWl/gX9ccXJxb294Wl5wYW9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWN9Y4V8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlZiSg4aWmIuTi4iOj4iehZGLfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIkoSRhIpxg5GXj5qOj4yLj413e5OQe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g418emh1bXWIlox/iYd7lJFyeoVxeI57i417iX6EjpGfn4Z9fXiBi313cGhrgIF3XndvbWtxclVeb2JxYV9tbnlwZ3BmZnR1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGlxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFrhGCHfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH9/cIGNgI6JfoR7g5GWm5uLfXd4gpB5c2xlb36Ca2l0b2doc21TXm5kcFpfa3J5Z2trYmd4c29xZF93YGFWa19edk9NS2BlY1x5cYp0XFtldWBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhZFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5OZkXV0eIaNdnNxZnR4gWFzbW9haHVmUmBwZ2tVXm10emFyY2BpfXFybltjcmFjV25aXHdNTUxjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qIm6OElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6OgnGGfn9yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRl4lvcnqMhnVscGpxd39ec2huXGl1X1JkcWhmU19vd3Vgb2BdaIJxcmpXZ2ljaVhtV1t1TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGneG5xd3txkpCNh2qYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hICMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIfnBgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkZOFb3B5i390bW5panh8YWdpaVhrdVpSaXJpYlBicnltYmVeWmqDbnNiXGdfZW1fblRab05ITmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoV8ipqemYeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFg39rX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjpGMfm5te4h9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR5ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2tCWcXuQipB4fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeEeYedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9f4R1Y3BzgGl5cG91mY2Gg4p8dniAhXqBalxyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo6OhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dWFeXFpZdH1zb1dnXWZqcmBvTldoUj9ZZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoOWjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHV3hXqInpGNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIGKg3dheYSCcmRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2JeXtybYmEkYWMc4J6gJeMi390bWt3gIB0dFxoZ3ZvV1Z7UllwZExacnJlW0lxeG9cW1tZXXR+dGhZYltnZm5jaU1XZlE9XmVcXXVlX3RvWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iTiX9oe31qc3tyhntzd35/jHp4hH18bIyNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFloZzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHaBf3Jkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WMg4d4iHaDiXt5dG+KgZGChnN/fn+UiYl6b25qboKBdG5dZ2RycFBaek1bb1xPXHJvZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWmhNQGBjW2B2YVx0bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uKjY+Dan57bXd4dop3fHiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpODc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3qXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h35ranRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96fn12j4aDdmlxaW2IgXFvXWdhcW1JZHVLXW1VVFpzbmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUVtwSUNjYFtjcF5cdmdVVlV3XltlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+ioyTf3CAe3d5eoGLdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aOgHqSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Id4KSjIV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIV6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnl8dIuCfnNodGVui4Nsc1ppXnRkR21tS1phV1ZWd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgomOint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubVxiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX57kYR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi4yIc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlH1yh2pvfoF5bn1dWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3JYal52W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNZbmFZZHBHQGdcYGZeXVZ7Xk9VZHBaW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVyf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR7fox+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoORiHSWiY2IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx8gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxuV2pfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmFxaGdiV2ldXGxoSkRqWWFkV1lVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSChHt+i4N7dnt3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CEeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kYZ4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngHZ1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXxsa1ZpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2NwXUxLalhjYVVUVXNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNvcn91dJmCd3+Ad39/hoV6fXSChH6XhW5zdHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1VWG9njqh3gXp8kY55dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx9a2tVaGFlUkpsZ09HUWtFYXhnYU1TcV1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bnB4dXqYfXeAgXqAgIeGenh5gn6Bk4RydXR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nb353gIuOe3Fyfmh6cHuOfXiQcoR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfmpsVGhdXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x9dHZ1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4foB4d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFheYmOPpGh4dIOGkHlucHtpeW58hnx2inOBeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2Zubn1laVRnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xkXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ3doJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH+AfHZvbmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcnGFhJF0bGx7bnBxe319coF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx6YWdUZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFiW1pYWWxxV1JQZ1dXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26PhnFud3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZY5WVY25wg4WKdGtofHBmdHh1fW16dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ29+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqd19nVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3drYlddVVt0ZFNSV2lSWWZUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7gHecenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nVlhfV2SbiGJrcYGHfXhsa3luXHdzbXtqdnRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcWZxfW5zbmNaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRdZVZhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBVX1RddVxUU2BnT11hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj46OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSHhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4aGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4qKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1c3J2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgICAgYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A/PT5BQD0+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QEA8Q2NEQEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pj0+PDxHe1s+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hERkhEQD48Oz5AREVEQEFGQlFlbnB5cUVERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHVWVhfoWFhYB6VEFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLS0peeoCDg4F8g35jTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS2R/gX6DgX2EgnuAhoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSEtLZn9+fYKEg4GChISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dIS0dqgIKCgoOCgoOCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUJERWaCgoKBg4ODg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOj1DU4GDg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj8+QT9ZhIOEhYWFhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PDs9P0NCQGeFhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/PzxAPkFARUJOfoOEhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDs+QD9BPkFARERIQ2qFgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APj8/QkNGRUxXfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD07PUE9PkBCREZHUW+Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT1AQkdGQEVHRUpRd4aDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkJGVk1ES0xJTlJ6hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxSUlBTVXqGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZYVlhXd4WEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RTVldXV1ltgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+a1FLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0JcXU97Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ01SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+REVDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXltYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZOTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxMTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUpGREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0VFSkxMSkxNR0dOSkhKS0dLSklLS05MTU1MTElMTUxbc2JkcF5sbFVNTmVzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTWlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkFCPT9ARUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JJSEZKREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRURUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQEZFQlZVRVxUXlNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlMSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5OSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZZVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFVTWFpUU1FZV1dcX1tgX2BWYlxgYV5gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVdXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1tbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXV9jZF9SWVlQV1ZXWFdXVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXF1YV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllaWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbW1hYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzM2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eX+DgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHh5eXl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH19fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn19fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4eCgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCkoyCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaGg4KBfn+RmYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhYiCfn1+fYWcjIaGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OJioCAfoWKf5OPhIF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDgoqKg4iCg4WAhISAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODjomGhouDf4CAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SQh4GCgoKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYiDgoKCg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoeCgYKEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH5/hISDg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59fYCEhIKDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGDhISBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOCg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4eAfYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42Ojo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGOi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYSBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5dHF1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7enp7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhIOEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOCfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gX19fHx9gH99fIaDhoaGhoaEhIKFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0M/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dG4oNDRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Szlpi6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q8n6OostGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv8eHmrTV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3ao5i11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvA16GYtNPTr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWq9ihmLTT06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5PToZm11M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ6k2aKZtdfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYv9ehmrPZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8vWsYPF1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU0dDD1NHSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3rqmqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr65vMHBy769ycTAwMrAscG/u7i7vrq1t7O4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u+v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDs6QD08PDs/PkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbq7v723sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4Oz9AQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW51ce1s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLesudmzu621r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK3prXUmcG3srGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCfoqCir6+ssLGqqKqyyZamyLCuraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ6empqSmZ6coaKgoJ2hpK6dn6mso56XhXuMkbGUiLWvqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+do6bOo5uloIl2g3NiaGt9h4Ohs66uqaunoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWen6GdnJibn6CboJ+fl6Kw0auUjoiBYnGObGJdYHigsa+npKSjoJ6lq6ael5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKcus6ihm5jh19Xh4iPj5ywqqGanZyfn5mXmJiSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmcbClWtcapdbVHGbsLOtpJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsmp/PtIFaXH2Ra5CurqWdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaWl0qhqWnWVo62tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWxr82hWmSfrauimZaYmpudoZ2anJ6TfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxtr7Ml1qQopyWk5ecnp+fnZSWmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XHysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLfJzZeImo6NmJWQlJKRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr25zsmhlI6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/ttKzkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubS7k42Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLW0m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szDxsLF0MfOwsTHwMbGxMTLwsrLwcPAxr+4urrJtrO5urOxqZGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS4u8G7t7W7w7aztbaprZSDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6OfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLEsbvDubOttr24rK+xqZ6Eh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7O+v7G/wbmqprG2s6SsraOJhoeAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy1wbm1vL6zuLy3pqOttq2jq6iWfYSFgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6+uL6/uL29t7e5s6Sjrbehopqfh4B9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usC6wL6/u7m0trKio62xmZuDlIiAd29kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLvFub/Fwbq7s7axoKarqZeSgYyEfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLs6+7w7rAwsC6vq+0q6GlqaaXj4CBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrSytbuwuLnBur2tr6msqKqllZiCa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CapKeclZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGgtLKns7ehnaK3rKmtpLKyprW7taursaOIeHFsXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysay0oaqywLa3qaanr6mqmZCfeV9gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKulqpShq7y0rKubo6inpZGOmm9XV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKqtyKyloJuFmJ+3qqOjkqGgn5yRiZBmUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFh36KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEdKTkxNVEtRUU9GSEM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestL+poJmRgY2Xrp2elYmbkpSPi4WGYk1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEzNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrOwo5yTkJeEkqGUmoiAlIaLhYGCfWJLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FocYB+jnBDioSCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnJqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6epsa+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYeUfYyTkJJ9eYd4gn57e3xiS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6CbGljbHmFkJKGa3NsfG5ye4ZobXB/c42JhIV6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY11kH2DiY+MenZ8cnt2cnZ5ZE9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26TjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIc4iEd4qPi351dnR2dW13cWdVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSdmx/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3pxcG9rXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW6Xiox/eXp7cXtzfGpuXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjXp2iH6JiI5zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4J0ooaNf3+CgXODgHxreWxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZmd4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxalpcXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoV0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CNlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn5/cV9cYl5ZZmpcbGteWEtIT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5J6gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdnXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSkRFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ/gI17v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AeWlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfXBeYGBcVmBdZ2VSWGFWUlZJRUZOS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFhfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bWRbYFxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzU5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcW5hXl1XUlhSW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRtY1tXUVRQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eFh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09nb1s/b2tHWyNXMk3Z4Z2ZZWE9SU1xHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4d2VnY15TVlZUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVpaGRVX1pST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZWVbW1ZSVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6VmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ako+KkIqXm4mLlo6HfYyYnomQkJyampOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJKPiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HJyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SMj42Vo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77CuK3Cw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5OWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKystL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmrKutsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlZugoaiep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJytqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5WZqqGedV5aXVxJR0VGTVBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk5LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUxKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKuzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSrs6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpUQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+vrSorrG2nparrqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkp6ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLq+ucO3wLmxtKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQipSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vr6/t768sbytp7q5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5iap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cS05jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7Kxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmtraWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fH1cU2RvXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLO+wcK7vre7xKest6yzuLzAr6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6moqK2pqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaQlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDur+zyMOrrretsri/vrKtraukp6qwqaeosaW0rqqwrq2ysbSstLyluLOtrK6nq5+jnrC3q6qtu7elt7akqqesq6qtoamnprGypKeloaGsl6qhlZugpp6koqqkraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8G7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoq6irp6CrrKm5tqmqqamiqqCtm5KqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaEioqNjY+LgoWUopqNjJmQkpGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLvBsbGyq7OopLSopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6qjqqGirK2ova+srqyiqKigrJmQsKKYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYGLho2MkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5ka4B0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mepKmoqb2stK+tnaqkoa6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6wraCro6Svn5+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh8fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLu+t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsK+hrKGtpJymp6mampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrG8wrmpu7q3p6i1qairsa2zsaibvrimrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hoKGUpKSit7ChprCrn6yjr5icqqWpnpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR31dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepaGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGyppmepampnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIiRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qquvoaDErKqnsbSrrLS6nqipq7GlmJ6qnqilkpqmrqOYnqWqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1tZGBNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OUROPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p62ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+OsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppycp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ11MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CjmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCraelnqOkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnq+ol5yin7Szoaqboaysn56al6Cjqp2ZnqWhnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6wd1dYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl5+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVxKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhmJOnq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOnm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6Kcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+RlJWrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0cqNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCsK2pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp6yjpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6VlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqukq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPRDVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqaiin56wrJibl6ior6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqqqKOhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5efKhVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqOsoaSfr6Kdm5OqpLawrqCpm5yXlaajkJqip5+gppyxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqihoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXVxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7WfopeTqKu2sqybppyglpClrZKanKaioKqmraGjp6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKumpJ6ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmamklKK1oqOVl6KqtbmknKOdo5OQobKZnpumpKCir62cpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGsoqSXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maGqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKCjm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eWBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqho56pqL6ll8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLFsZ22Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKG9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYk42XlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZOqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZSQjZGWoYucnKednrijf4OvtaKwr3SkvqOyoHh7oay0vZZ3rqWgioCpfmRcYnafjqSdg5d+bpS0nKOor6ykZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgY2RjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOTh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfGlFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkouFiXmEd4iAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilXa1trbJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWp4h2ZrZ2J0dHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiFlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uaGxTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1sfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yOhpuFhY51gIx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4KIfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5i4Z6hZKKjJmjl4OEjHeHg4KBdXl/hoNzXnd3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmqKTlYqNnoyGgZOdgJOTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3Jzf4WBbF95dHhwe25hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpShkpKIi5mMgn+Rn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgXSIeW6AfoGIfYWNioaOlqqOe4h9foqFd31vbn+DgWJnd3N0bnphXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZGQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3iXRwinyHjXuLh4WKj5ykiXyEdoGKf3d3bWp/gH9ccXJxb293WV1vYG9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfHOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qOj4yLj413e5ORe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIlox/iYd7lJFye4Vwd417i417iX6EjpGfn4Z9fXiBinx2b2hrf4B3XndvbWtwclVdbmFxYV9tbnlwZ3BmZnN1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGhxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIKNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Ba2l0b2doc2xTXm9kcFpfbHJ3ZmtrYmd4c29xZF93YGFWa19edU9NS2BlY1x5cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbG9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjV25aXHdMTExjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuJiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5ec2huXGl1X1JkcWhmU19wdnRgb2BdaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGl5cG91mY2Gg4p8dniAhXqDa1xyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBsTldxc2ZgS2x3dGFdXFpZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uIgX2JeHpybYmEkYWMc4J6gJeMi4B1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XmVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4eSiX9oe31qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXp4c2+LgZGCh3N/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFxgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan57bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p3eHFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHlsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgYmNint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVxf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR8foyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kY56dnF/cHR3epCBeZZ0hYOAhYh2anF1Z2duW2xjXW1yX2dhanhofG1bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1TcV1KTVRaZWt2e2VfbXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcYR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1zfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJvhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4fn94d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2iXOAeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d3ByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGt0b35reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319cYF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZVa1BJUFpVa2trfGVtb3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fWx6dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlPSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygY2LdndseoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtpdXRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2dsPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHiIeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKjYiQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IiIyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHh6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdXh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHSEVEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6PTxAQkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBREVDQD1IREFERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FBQ0ZKSElGSEhKSEZBQF9oREJBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMS0xIVF9ocXtXTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLTExgWGd/hIaEfnl/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT215g4SDf4CBhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hQdYKBgIKCgoODg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERU12gX+BgoODgoOFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxETniCgoODhISEhomKioiHh4iJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49QEBPf4KDhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFBP2KDg4WEhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4/PzxAPkFAREFNf4OEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz9BPUBARENHQmqFgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT5APj8/QUJFREtWfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs4PD07PUE9Pj9BREVGTm6Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT5AQkdGP0RGREhNdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkNGVk1DSktITE95hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxRUVBSU3qGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZXVldWdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1RTV1dXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaW1NTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f397eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0JBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0eHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NER0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1lgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QkFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFzb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0RESkxMSkxNR0dOSUhKS0dLSklLS05MTUxMTElMTExbc2JkcF5sbFVNTmVyXWdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHBxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURHS0pLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRURAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSUNFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlLSktLTk1VTk9LS0xHR0tPU1NPUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVVZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVVRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSVFVXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV5WV1pbWltbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXlhYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2FfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzQqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5eX+DgoKCgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl4eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnt5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4ODgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4OEg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4GCg4ODgoKEhIODg4KChIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYGBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CBgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGCgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoeNh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhIOBh5mMhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KFhoKAfn5+j4l/f39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODg4qGf4GAhYGAgIKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WEj4KFg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaDgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIWRg4SDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaBg5CEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEiJKRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf32AhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fICDg4KDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCf4GDhISBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBgoODgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWFgICDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHiIiGhoeHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhISFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNi4yOjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MjIuMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLioqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgX+Af35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChICDgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgoCAgX5/gH6AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICBgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXl7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgYKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fXx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYGBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSEhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4iGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIeGhoeFhYeDhIWEh4aGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoKEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag397gH19f4J9gIF+foF+fX59fX97f3x7enl6enl6enx5enp7e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tHtzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZo0KSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaePS4wMDAwMDAwMDAwMCposqurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamro0s8Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKycrKysrKysnJycnJyc3T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn08iUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Ccq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6u1lYecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv77ImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3TlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvEsp/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWrdCLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TK26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCbkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiMydkY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbu1vL23sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLets7Gvsa61r6+ztaqnrayjm5mUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK2pq+zq6mqtLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpKGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PUI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCgo6Cir6+sr7GstqiusbCoprGuraywp5+eoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ2empqSmZ6coaKgoJ2ioJ+en6mrp6ypqrSsq6zKwKSrqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+dpJ6bnZyloqSjoqqwrKao1LSlrK+uqaunn56eoaKdnp2anJyUk5WUnp2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubn5uenJ+lpqWgo8i0sq6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKgn5KZn5mSmpifmY+JorGzqKCanZyfnpqXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmqCavqOSjpaMgouaqbCqo5+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NXT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+8wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5anr8usjI2Ri5mvr6adnZ2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/Dw8jOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaear8TGpYaGoK+snJWYoJyboaKfnJ2alYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWyo7fLu5uUqquhmJaYmpudoJ6ZnJ6TfnFlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxuKq7zq+jnpyWk5ecnp+fnZSXmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAycHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLmvv8qhl46NmJWQk5KRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr24t8Osko6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/triwkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkVKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubSukY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLa1m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtMSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTHwMbGxMTLwsrLwsPAxr+5u7rJtrO6u7SzqpGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS5u8K8uLa8xLe0t7mssJWDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usG7vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLFsbzEurWut766r7G0raGEh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7PAwLLAwrurqLO4taavsKaKhoiAeXNucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednJycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy2wrm1vb+0ub25qKSvua+lr6yZfYSFgHlwcnRxaGVkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6/uL/Aub6/uLi7taWlrrmkpp+iiIB9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usG7wb/AvLq2uLSkpa+zm5+Hl4iAd29kYmdpaWZnaWdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQq6iwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLzGusDFwry9tbizo6iurJqWhI2DfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGGkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcn6GgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLtK+7w7vBw8K8v7G2raSorKmbk4OBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLfoyQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKefo6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrWztryxubrCvL+vsauuq62omZ6Fa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKiclZWXm5CSh5SOjIGLjYCQipKSkaGan6KVlJiYlaKlmYyYpKaopqGgtLKnsrehnaK3rKmtpLKyprW7taursaOIeHFsXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysa21oau0wbi5rKipsaysnJOje15gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCin+KmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3d7eio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKymqpSirL22rq6dpaqqqJORnnBXV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZOdlIOWjpCPg4Z9knhyb4WNfomAkI2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2op56XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKmtyKymoZyFmaC4q6WmlKOioZ+UjJNnUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaOem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEZLTkxNVEtRUU9GSEI8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestb+qoZqRgo6Yr56gl4udlJaSj4iKY01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cWdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qq7SypJ2VkZeEkqKVm4qBlYeNiISFgWRLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm1sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6ipsa+xq7y4rLu+ubOtqJuxp62ckJadp6umo5qckoeUfY2UkZN/eoh4g4B9fn9kSkZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42IhIV6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5WWmZeel4yDiZ+RipKNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKjmZqTlo51kH2EipCOfHd9c3x3dHd7Zk5FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH59g3RmZXR+hIOFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaJhoCQh3VpaW5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY+RjZKJc4iEd4qPjH92d3V3dm94c2lURklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqSdmx/e3xtcW1wf3pzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3lwb25qXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iQh3aDhW6Xiox/eXp7cXt0fGtvXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGEmYSbnGGGqp+dioKQjXp2iH6JiI1zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXd0hHpwc3l3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1bnFyZWZfW1pdU1tmXldRVVhcVkdKS0RMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEkI55g4J0ooaNf3+CgXODgX1semxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoKFcYSFR2uAd3F5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnFwalpcXFtjY1hnZVxVUFBXWVBETExGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxgZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CMlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn6AcV9cYl5ZZmpca2teWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5F5gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdmXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0dFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNk9rInZZzVpeIj4icj3yGjI+KinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSURFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRYmRXenVxgZR9hIaTdoZ+gIx7v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AemlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlWWndqcH+PhIGOhW56cniHYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu4tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfW9dYF9cVWBdaGVSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afXdpW15aWFtfWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamlpYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOmp6NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEon9sYVpbXFdfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5GLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW08zU2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcG1gXl1WUldRW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXRsYltYUVNQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrJyimpqfpp+frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NbY19jX1NvX09nb1s/b2tHWyNXMk3Z4ZmVZWE5RUlxHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uGgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKilpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4dmRmYl1SVlVUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KdkZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2Mm6ScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhYSApIaKi7iYnZGUlqGmoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVoZ2NUXllST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGOg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5bg6KRgo2fk5WMhoiMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZGRaWlZRVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGxkGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKKImZ6VmomPhpeYioWPjYF/ho+liI2TqJqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWlqShh52ako+KkIqXm4mLlo6HfYyYnomQkJyamZOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo66wqpqZnJSVkZefl5q7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJKWjJCVjYuNlpiTnZm0l5WrnYqclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paSofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q6tsG8rKmcsqWkqJSFjqnEw6SCi4+HiISGlZSNeoONkY+RooyMlJKOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HKyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXmFjZKQnp+Tj5SMj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqKalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77BuKzCw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbO/uryur6igqai2ra6psrebnq2ip6Geq7e4qqWvv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9h5GZkKqZmJOTj5KWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpqK+vmKOvpKekpbXAsKystL7DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI6WmoyxlZualZKSmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmq6utsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+urOuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlJqgoaiep5+ZmqqZoaeemJCNkZ2DbnaSo5qVnaKdkK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJutqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNhqKfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wcLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KXkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKShlJ2inaC1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5SZqqGedV5aXVxJR0VGTFBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/DyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk1LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVpLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYVZLopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7S3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawqypnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJbTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKnk6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r77EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaOTr6+spaefkqGelZ6PkI2VnpqinqezpqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUtKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwbSrtaiwuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKempqblpeon6CYoZ6usqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTU9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC5qbakrLutwMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesubDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSss6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpVQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sby+vrSorrG2nparraiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLSywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkZ2ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLm+ucO3wLmxtKypura6ub60qa2wtZiYp6uqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtK+up6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YEVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLitCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y2vb+/t768sbytprq5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKQlI+cm5eWlYiWkJiap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cSk5jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5r7a2v7yuqrKxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmsrKWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnJqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fHxcU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLK+wcK7vre7xKest6uyt7u/r6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6mpp6ypqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaPlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmJRc3FcSzuEfEU/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKsraukp6qwqaeosaW0rqqwrq2ysbSstLykt7OsrK6nq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6koqukraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8C7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoqqirp6CrrKm5tqmqqamiqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaDioqNjY+LgoWUopqNjJmQkZGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLWopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6mjqqGirK2ova+srqyiqKifrJmQsKGYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYCLho2LkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5kaoB0Z4iMfVNYcF5Kd3NTZFRRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzuqy4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKiaqqepo6mepKmoqb2stK+tnaqkoK6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAVnpsVGJQUVhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upp6GpnKSooa27qK6wraCro6Svnp+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh7fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1BRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLq9t6i5t72qo7Soqaqxrrqxqpy8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqrqagppijqaCxuZ+jsK+hrKGtpJympqmampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKfmhYWk5QTEpIUFJQSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9YVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrC8wrmou7q3pqe1qKirsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hn6KUpKSit7ChprCrn6yjr5icqqSonpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OHi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR3xdW1hPTkpISFJVRjI6Xl5sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxXlMsMpajopiVnamepqGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G3rL26tKWis6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZo6ecpaaUmKGzppmepampm6GglKWfpLmopKetpp6loaiTn6mhoaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIeRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysL3At668vLGkn7aspqa1qauvoaDErKqnsbSrrLS6nqipq7GlmJ2qnqilkpqmrqOYnaSqoZuinZegnae2pq+praGhnp2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1sY2BNZ1daYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BjRiU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxaGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p66ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFgU2JoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIY0InNJOinI+OsZ2blKGaqbKwn7nAtqCzwbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxtraxs7a7p6mftqmdn6qjqq2dq8OZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknZmpo6WVmqCdkZyjq6qpup6npKCXmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0M3RFRnXUpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2E8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom6++lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppybp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ11MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVfNzAojaaXhJ2snZmZnZ+rqqiqv8Ousrq8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CkmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5XYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+tsaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ2oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXU2xjWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWCraelnqOkqrG3rbS9vrC2xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnrCol5yioLSzoaqboaysn56al6Cjqp2ZnqWhnZqhp6SQnaObmKGgrJ+lpqCaoKGVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1NrZ19MS1xjWFxaQj6wd1dYQSNNaEZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGoj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hYN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyikpixqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijno6soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rum6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpJqdm6mflpWYmZKTo6qhmJOnq7CloZaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2ToLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqOZnpWlopSUnJqSlqOmm5SQp62vpaCUmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe4CLnXlvsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RklfQzE9N6KcmZm/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOi6mwr6adlpqnpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHSTmH+yaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpyduqKcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+Rk5Wrtq+mmZObrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn7Vlpu4eYmRmI2XiYynh3mitnR9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrZmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGam5eVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolynsG7vJl6gbKocIB0kbmDe4aGioaNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrOrqqisq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnqOkoouSkqacpaudlqmlppyaoamnpqOooZKsnpeinpeWmJ2ej7Cpk5ynoo9rfmmcqHmIc36bjnV6ZYd7vr/Aum6SgnGUhV9yalpdmolhZIeOlWtgf5RjbZt2YpRrgJqVlGVeX2Jxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKGfqqKarpuVpqCWlJ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeTkIOJtKmNhZiVjoqMmJaHk5WJg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5mrnKqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio6Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhYWakYaFiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6UlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJiknpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5qZ4yXkaJ3a2qLmKKemHJrbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnYycwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGNeZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvqqanpbGroKuYm6KgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScraiRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtrKykrKawqqGnm5qmmJyir5+hn6ino6Whn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq2jq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6Wlo6GqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6iqqK6rq6aio52ao5Wfpqufoqagqaijn56wrZiblqinr6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqpp6OhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5ee6hVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKsoaOfr6Oem5OqpLawrqCpm5yXlaajkJqip5+gppuxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqehoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKaqrKmmoKakmKujn66rnaahrJqeqaWdprWfopeTqKu2sqybppyglpClrZKanKaioKqmraGip6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKympZ2ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaWvrq6ppp2lpZqjp6CyrqKpp7KgmamklKO1o6OVl6KqtbmknKOdo5OQobKZnpumpKCir62co6iitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGso6WXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGepqGgtaeiqaewo5Sro4+kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maCqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKGkm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBvZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46apKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqhop6pqL2kl8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrIqEsIWmmaOhopGFoFtsaoGzYH+te3qCgLFsZ22Zl4uIsVp9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylo6SipKm6nqDGp6Wpoay1t66vqKG9r66ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpipL+9fX6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtlamliUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKrup6pxaOhsKSrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9ub3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomVlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2VsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYlI2XlaaTnZanopmvpp2irLmfsMKopLSmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZKqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjYuSkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqJ+MkZ+jrLCaoaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjI+NlYuBfmaNh3WHdnmIhHScaoeRlZWSiX2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kXnBpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZOQjZGWoYucnKednrejf4OvtaKwsHSkv6SyoHh7oay0vZZ3rqWgioCpfmRcYnafjqOdg5Z+bpS0nKOor6ykZZ+glHR6mpdwgJmpmGyAo6iKZZylnJCXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV91b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrifoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmAi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGoJeZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkeG1pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOpZZnlKR5tIyfn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1gYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgap0TKp4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnudjHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSiIGAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpwMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkXiLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIi5x9lZ+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbTRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFkfGlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG5xYGRlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHiceqqZf6KPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhplvkoKtfKODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFFQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqZqTkouFiXmDdoiAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi3+MpI2Vg6+ilXa1trXJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15pdWp4h2ZrZ2JzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJentUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7ltj4qiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FmYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYKHlYqJlpmCfIiFlqaQgaGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bXylr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uZ2xTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkY25zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e319iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gHmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYgoGbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6CLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Rjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH5vhYmEe31zfnlyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiHg36Sg4SGioF6gIOLmp+PgqaghniNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdj42xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJyio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZipoJyTnI6NqY2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yNhpuFhY51gYx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1hamh1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/b4uKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmPkKaMj4GbkomUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4OJfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8c39qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KdoJKYjY+hjIuDl5iDk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY1+lHmMiX2BiX18coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9fop/fpeElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmaGTlYqMnoyGgZOcf5OTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeYh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbF95dHhwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXVteXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGinqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+RhpGRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpOgkZGIipmMgn+Sn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgnWJem+Bf4GIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXW9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmRpZ2VpZ4B6d3VujoVzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZCQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknt3inVxi3yGjXuLh4WKj5yliXyEdoGKf3d3bGl+gH9ccXJxb293WV1vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmFda21kYmZrkm1gZmZfZ2uBdHFyb4uAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J4gHZygnmCoIKRgZKRl5uRmHeReoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qNj4yLj413e5ORe46LjZKWjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIl4yAiYd7lJFye4ZxeI57i417iX6EjpGfn4Z9fXiBinx2b2hqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZnN1aHFsYXdlXVZlYGBxU1BOW2VkXHhwiHteXGhxYmJlZZFpX2dkW2dvfm9rcXOKfXZ8hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZWLjImLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIGNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Baml0bmdoc2xTXm9kcFpfbHJ3ZmtrYmd4c29xY193YGFVa19edU9NS2BlY1x5cYp0XFtldWBhZWSOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5OagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbW9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjVm5aXHdMTExjZWFddnOKbVtcZHheYGRlhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWMf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyTkYGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiFiIyGgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl1X1JkcWhmU19wdnRgb2BcaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX57dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4OZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkIqFe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4iMf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdqaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXFlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmRnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5VvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKCiINugHdogIR4cn+Ag4qHfGV9foR2Y3BzgGl4cG91mY2Gg4p8dniAhXqDa1xyf3OCiYeKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaV3BsTldxc2ZgS2x3dGFdW1pZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWlhrZVpjcHlfaFxeZWxoZWtpcXd/iG9sf36AdW+Cen+Cf4J/doGEiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKVjH6RjIt/bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2IeXtybYmEkYWMc4J6gJeMjIB1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XWVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWBgY2ThHCAi253fYB7e4eSiX9oen1qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnN/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFwgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan17bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRf39+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx3hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4l4eXFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hcIJzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x0eoWNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhXt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH52gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYKHgHVxf4aFjoNwcHt4dnV6hoWHjIV6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F4gYR6fYt+d3dydm97dmVqb2CHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt4cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF9dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeHZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJthXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR8fYyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR8gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa2+AZ2tgaHl4anN0c22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1Tcl1KTVRaZWt2emVebXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXZ/gXmAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH6GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6Gbnx/c4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d29yfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+f4GTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZValBJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGppdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlOSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg399h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygY2LdndseoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenhrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFmZ3RcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKCeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGkpSUlJSUlJCPj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46Mjo6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYuGjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKi4aOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dDREVDRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMSktJSEZFR05HT2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS05MS01MSElPcHCAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT1FUT1hsc3qBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hLVHBlfIOEg4KCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkRdfH+CgoKCgoKFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP2aDgoODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEd4ODhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REZJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4+Pzs/PUA/Qz9LfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz5APD8/Q0JFQGiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT0/PT4+QEFEQ0lUfoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD06PT88PT5AQkRFTW2Eg4SEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDk/PT0/QUVFPkNFQ0dMdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QUFFVUxCSUpHS015hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVEREtXUUtQUE9QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lKT1NSUVVWVlZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1NSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaWlJTUU9SUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7enZ5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx5eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBQUlFQTU1OTEpMS0xOT1BRTE5OTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZKTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktLTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE9Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QD9CRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A9PD06Ozo6QERBP0JDRUVJRkpKTEZJSUdGRkRCO0JDQz4/QkNDREdMTkhLTkhESERJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFRUJCQUVAREI+Pz46Ozs9Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdERUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRENCQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJHQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSEtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmhjaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhJSUdISkZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0NES0RESkxLSUtMR0dOSkhKS0dLSklKSk5MTUxMTElNTExbc2JkcF5sbFVNTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLR0dLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKT1BRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZESEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURHS0pKREVJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVDREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJhYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGJhZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmFkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9OVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBJS1F/UUl8WVlyc1dQbUhxbm9hVlJycXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdmBZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZ2tRck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fW9+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym93UWRkSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofGlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUFFTUklJTU5PUVJQUFFUVlJYV1xXU1NRUVVVVlRaUU5SUVdVVFlWVFlVU1FVU1RVWFlYXlpfYV1cWlpdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1VZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1FUVFFRUVZXVVlaW1lTVVJUWFdXWVtTT1JUV1VUWVVWWVVRUVdVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNSWE1PUFFUWFVUVFNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYGNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVRUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNXUVNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV1VVlpbWltaWllaWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYaXFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6eXp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3p8en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn1+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKAgYGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaFg4WDg4SEhIWFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoWFh4eGg4B+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhoeHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFh4OAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoWEg4SCgYGBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4WDiIiDgYGBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOKjYKCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIeGg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf31+g4ODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB+fX59fH1+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjY2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGTkYyMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNjIyOjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH6Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyKiIqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fX5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChICCgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH5/fH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoWGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCposqurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyc3T09LS0tLS0tLS0tPS0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1dbW1tbV1dbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9GdkLmcvLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6yspo6AjcafmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GeqKGJrNa6mKGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnaSqrJulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6tpJyVqJCahZ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWraezq59/n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TI2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCXj6Cfn5iolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybrKWrop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8+pjo6t2MKPjbvV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1L+/1dLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ozw5Ozs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY0Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXVlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSUdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BP0pCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtq6mur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2s7S1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTExCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2srSrsrSuqquvsLKzrqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpKWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqa6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJqakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSpsa+imZydnqGZm5uamJmblJWblpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir6+sr7Gstqetsa2mprCuraywqKCfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmZ6coqKgoJ2in5+en6msp6ypqrSrq62rpaWrqKqsqqWgnpmSkpSYmZeWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKeompmdmqqnn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZyloqSjoqqvrKepo6ChrK6uqqunoJ6eoqOen56anJyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8bEvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6/uLK4vMTBwbq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzyMTLysrOxcq/vr+8wcfEzMzIycDDv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSsm5aployWjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0s3Lz8XJyL/Dw8jOzM/Qz8zKyM64t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLFsrapoqWmoaKrtaeasaCYnYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdTOy87IxMnGxsjMytPT0dXP0szSwbnFsqWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqrMOnqamhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzs/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0tHP0Mq9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp564trW1raWtrr60scDZ0tfa3NfPzcvE09DCwrKrra6sprOyuauyvMaioZyWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rEx8DFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaKZlpGVlpKLlI2akZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzc3QydbWxcS4sraqpK6submxssSslo2NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/GusS+xsm9wsfJzsTCx8DHzcfDy8rLz8fDw8/IxsHFyMO+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/scHKx7q9qrGyp6Wdop2YkJqQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3H0NXW2drb2NDK0NDS1MrFur6+sKi3q765uLOlkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz83W0NbZ2NnQzdTOz9DLxLjGwba1vLHAtrqtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcG9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73LxMHFwsbIxsjG0MbCzMiyx8rDzs3BxcPAvbO3sLOoqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cfW1dbYzszQyM3IysW+ysGytbq3uravkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wzu77AuMe5tLu2wMK8uL3GwcO8ta6ytrq+tMW3u7WruLy9wL2wuravtrqyxby2r7u/tLa0xb2+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwsO3w769trm+x7+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/IysbKxsTAvc+9s7i9ube2m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxq7W5u7TCurC/sb29u7a8yLnDt62qqLCywLa4vK+wp7GztLu8q621pq62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8TDusTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szExsHF0MjPw8THwcbGxcXMw8rMwsTBx8C6vLvKt7S7vbW1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RiYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6iuuLS0vLizvK+4ubWyvMGywa6lqaKrsbKzqLyqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yri/xcC8zLrDxsW6vMO9ube9xbi1uLuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSttrmysLq5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVlfSE5oT1RIRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8e7tsPGs73Fu7avuL+7sLK2sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLO1rrO1rrCqn52eo6KypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKurrCu7XFuLXAwbPBw7usqbS5t6ews6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKivs6e6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrG3sLq2ub2/t7KxlIV5dWVfZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LnDx8C2vL22w7q2v8C1ur66qaawurCnsa+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnZuaqqavsKubo6O3qqCfrqi2qaanrbCkt7Ckt6Cim5iYqqahmqy4sKKhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb+/ucDBub/Aubm8t6emsLulqKCkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbGtrLWeoJ2VlKmhopSssbGeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcW11YTkxRR1JhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK7wsDBvbu3ubWlprG1naGJmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCcpKqdp6GerK2pqK6toqGilJejm5yPq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Hu8HHw72+trm0pKqvrpyZh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmJugnq6Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcoKGgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOjoqytqqirr7O4sr21s6uvmIRzc2hbWVlSVVJGWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTU3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xLzCxMO9wLK4rqWqrqqdl4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1dXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJKSk5Wnq6WamZqdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q66nsLSwubXAsa2xq5B9cXJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72yurvDvcGws62wra+qm6KIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKeclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVlJiYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy0w7m6ramrs66unpanfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCPmpyioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCKmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyY1ZNUk9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMG4r7Swysa5usLPx7+1r73Dr7HHsq2nq5Wkrr+3sK+fpqysqpWUonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpGPg4Z9k3hyb4WNfomAkI2Pl5mYk4qPiZyInpeHiJaemqGgl6evqa2pqJ+XrbSipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBurG1sMnDubS/z8C6sbG4xKuuya6no52GmqK5rKanlaWko6CWjpZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ4iH9gSlFueIqShHyEjImEf39ufn+Ud3V2eISNmXBRjYiKh3x+eJR2aHeFiH6KiJWKjZCSlouEioiUhJqMgYSSm5aenJSko6ippaOem7CroaSkkKaqlqGqnKKmqIh0bGVeW0hRUVJNSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5t6mqt7ittsCqopuSg4+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho+AdX94c251cHSNjoF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ2WkpiGk6OWnIuCl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZudnqKdlo2KpJuPnZeOlpiPdm1sZWJaWFhUUUpTVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6ipsa+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkZWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2VgEqSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfm1obW5uV1VXVFFRWk9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voqyqqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qTl492kX6Fi5GPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmpF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nZFdRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6yn6a6rquysMOyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3Z5d294c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3lwb25qXlpcXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7Bs7vBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cnx0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+dioKQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bnFyZWZeW1pdU1tmXldRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKugsamvwLK7xrqWj5GUiHqGdmuAjJKDfouFkI55hIJ1ooaNf3+CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUktphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIh62wr4qAgJOKgouChJGph4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd35+cnFwaltcXFtjYlhnZVxVUFFYWlFETExHT0lERkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpehnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WIiYGDiIZ5iYuAdYZ5X2NXTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxfao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQfHKEnp+RnX52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZWPhomIiImIoqujlomOmIB7gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFNRSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+Lm5qknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKcjoSBgoyLgoqOhICLgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbnWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKowcOuyK94upSafIyhnpiEk4WCj6Gfk5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramt9fn5/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgIGLjYmGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4J9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8nRz76boHBpq6mfhJOShZyhmpqap5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkpqoiJeQjoGIbHNzfH16bmZeW19eYWdkYGdnXFJFS0tRT0lKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGkJCPgoOAiYyJhZOFg4aJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jEv7elo7CyrK2qo4uWmIWmpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN8ZV5mWmNgXWJjXmZnX1tPREpIVE9GSUxGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGBc1hfYlVkYGBiX19mYFtVSkRFTFZRSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRYmRXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XUF9VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6SupLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AemhVYF9WaGNpZFZbY1lWVElIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eCjpaKgYSBint8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby9wby4try8t761urPGYXWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+wLy8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG9dX19dVV9daGVTWWFWUlZJRUZOS0E+SEU9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Wi3+DgIN5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVVLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7t7q2ubm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDpJ2spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr7BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW15aWFteWGJiUVtgU1FLQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXlpZVEhLT1BKS1FMVFFITEFKR0tQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OJkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbXFdeVlhkWU9cV05RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4b2RbYWBLUFJVTllfUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaisr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXN7vsuaf42yhHZyhXdpYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoaSkZ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8yJcG1gXl1WUldSWk9KR0pJSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXZ5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWzoKKln6GpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4OqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRsYltXUVNQWFVFRkpJRUU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5GejH6HkoOJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgnFuYz1eaHJwcXBueHeCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk4+uq5SVl5+Ypq61vKmtvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V4ZmVYV05RUlxHQkVJST5BPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4F3hqKQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCWn5OSl6OemquWkZGLjpODjIWJiYGGkJGenJmJhYuBhpd7iImfl5CJjoqLgnyhiZCLvKGYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hXt+gpGKhYZ6hYh8dn51bX19h350f5KekZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZKOjpGMf5CPjouEiZOWmp+fiYyUkp2Rg4x/ppmIhY6DhoSApYaKi7iYnZGVlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZeSjJOUhoCLiZOOioqdl5mjooaTnZagi4qJjp2Qg4iPgIOHhaWFi5CzmJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29td4t4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eWmISAj4uZiI6QqpeXpKKImZ6WmomPh5iYioWPjYF/h4+liI2TqJqXlJaYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fIWHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlZmGhJGQnHWRmLOWl6Whh52ak4+LkIqXm4mLlo6GfYyYnomQkJybmpOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7raiyvbClrbOzqKOhsKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq3uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNlpiTnZm0l5arnYqclJKOkZKMmZuKkp6Qi4mWn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbStq7O2jKizra29q5u7paiturirp6aioqSjqa+ysaudnKSZm5iXn6KmppKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcXBfWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrsLy9qq6ro6Oep6uutLCqnKCqnKGclp+wtaiMo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+djKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOgoJikn5qgm6CUmJ6lpKampK+upsDEw66ot7bJw762z7LEv8S8s9HKyMK0cnZqWlVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaompqZur3HyMnB0snKws29wrOtvL6ou8C9u8O3rMGprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2uLCslLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qn5GlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpaOipZ6dppielZebpKOpp6KyrKi8wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p3X1ZVWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPNzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psrebnq2jqKGeq7e4qqWwv8Wyvrq0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlqurqaebn6aXmJaYlaGkqKWftququrvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1hVU1NNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qin6++r6HHvMTEx8bOzs7Syr67trG6u7y+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+vmKOvpaekpbXAsaystL/DusC6tKi6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boaCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSurqulmqCllJOYmI2coKeimrSpqrO7u7uqsbLHwLmmrKutsrKjobKytKRta2NaV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKosJmRl4eLqJaOiJOFoIiEnZePnaGbo6W1ybWpxrrCw8jKycjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubSzxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqq2jo5+kqJGRmZyHlJ2inpaxp6mruba9srKuvrm2oKOnqKWmnJutqamLYGNfXk9KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlZ+Mk6uckZKTiauNhqGejKOtlKOktsa+tMC6wsLHycXCzsjCvrmyr7m1wcLKtcWywby1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbyorb21uL7HvLe2uMGyvsG0qrW3q76lkKOYkqKgvZ+JmqCZl56ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5eJjKSilJ2inaC1r6Wkk6+rmaqqnZ2jo6iQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXlxJR0VGTVFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJabm4+qlpWnppWtrJiiq7bEwry+t8HCwMfEv83Gu725srC5s7/DyLW/sLy2ubampKusraGhmqqrxaKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjn5C9pKmeqKydnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylnJWxp5mupp2ZqZ2fjZiUnoOOoJqbkqWkmpirsbWxqqWqrqybmKCgko+QlaielGVfV2BcTkhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCTo5+WpKCmqayYtrGiqrO2xcS9v7W/wrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6quoKWpra+ipqi9taaxvbm3tsSztLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqioq6Oawqypnqyum5uemaagvaGdpJirrKymopqNmp+TnomOV3+Wn6WhoLiqppOYtaOesaCfmq6WnY2Yk5yBjp+XlY6ipJaQpq2yqqmioqWllZWdmIuPkZKknolfYlhiX0tISkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6foZmexKilorSinbOok6uloKOfrKmsnbuwqKy2scfFwcKywsO9xsS9xMm8r7C2rbC0r7/EtLmxsLm0rJmosamqmp2loafCrZussZyqo66xqaSovbant7u+r7fErbSzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6QkI2VnpqinqezpqaMmLOboq2anZuskJ2TlZKZf5Ghlo+Nn6GUi6arr6SmopygnpGRmpOFi5GNm51/X2RaZmRKSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoqS1qpazraehpLKsrqm7sq2xtbTGwMTDtcDEvsnEtb/IwrSrtaiwuay/xLO3rqy2uaWYqrKrqpifppetu7SbqLCbraCutLKnq7mzqLq0ubO5wKq3ssS+tceov6+utrWpp6yhmJeSpqWiopiYpa+4rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblpion6CYoZ6usqKmjZeumKSrlpmeo5CajJKWmIWVnpSMj5ydlIuoqaqhp6GYnpWLjpmPgYWUiJOed2JnXGppTU9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7pKOdoqa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6mssbqilK2xrbKWpKeRqrmqn6axnaugsLSzqqm2tq29rbSzubitubHDu7+/psSrsbevqaurp5+YmauhoqGRmKKxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ugoJuepZyil52js7Can5CTpZqfqJmUop2Ul4iTlpKVlpyTiJCamZSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjYxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKqsKyksriqpra1rKCttb2vs7i7ur63tsDCv8jEucXCwL+4xL3Bt6+1p6u3sry+vrSorrG2nparrqiul6aojqe7n6Wss5+sorGws6yqtrS1vq6wsbWssLSzwbvGt6y9sLG4rK2qo7KmnqWqn6SXkZqgs6qzq6qzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKudlpeElJaKnZick4qNlpeal6alo5+dlpWXkn+PlIV7jZKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BLTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelraqmr663qq+1u6emsbfFt7G2vcHCtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZiYp6yqrJurq4+rvp6srrKjq6CxrbOurrayubiqrq+xqLWvtby9yrOqt7WxtK+up6G0oJuoraCmlpaamrKiraCmr5ehpJqak46jpaizqaGms6yrtqWvsrWvpJmdrKeamJ+amau3o5eTkY6XnKGXlpSqnZqRf5KXjJ2cmZaQipSTnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqq2mpK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb+/t7+8sb2tp7q5t7bCtqussbeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaijtqCgp7GhpJScmZWxnqecoKqOqaOem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCck4KQlI+cm5eWlYiWkJiap5ykoJKWkZCVdoSPh3uEgYOLimxvdnR7flxLZW1cSk5kXD9ie0dJOEdnV2VcTF5jTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5Gapa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OxnKCnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnZybr5qjo6Ojka2fpKCgoqump7mkrLW2pausqa2wtq6inqOpqpugm5uSpLSZjomNh5ChoJSMlJyfkpCDjZKSnJqXlZOHl5OVmaebn56MkpGNkHZ9jYV8e3yGiYhwcnF9fH1cU2RuXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpamls7WytbaysqGrrr3Muq3AusextK20wsPSxca+wLK+wMK7vre7xKest6yyt7zAr6uxrKCjp62qqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypqLKmqqSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeUhpaUk5eknJycipKQjYl/foeFfHZ+hYSFcnFwiHVrX1lgbmJRc3FcSzuEfEY/V3RYYVpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKtraukp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6quoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6jpqObqquuqZ2ipaSkmJ+blo+YnJKBgo+IhZyfi4qOi5iNjomCi5eim5GQmouTkpGTo5mbmoqOi4t9hoGBg3pzf4KAfHJ1i6SHeGteYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtOaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsaajrLGYq6qttqy2sqymrKqpvMDAt7iyu7Wmsq/EycvRv8C7ub++wbnBucDErbG1sbO6wL6ysK6sqquotqqmrq+qubCosrKvs623qre3p7S3q6ylqaqcpJ60s6mopLS1oLeuoKqoqqirp6CrrKm5tamqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6imqqOjmKWnp6qcoqSjoJmYoJGOj5iNfoeMh4OdnYaDioqOjY6LgoWUopqNjJmQkpGPk5+XmZaMioN/dIaBf394dIJ+eXZ+gIedj29yZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJi8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrrmuobawyMfI0cC+vbu7wb26wsC+v66ysrG1vLvCsbGzq7OppLWopa2zs7mxo664srCyu6u6sKqutquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OomJqopZiXmJ6PioeViH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXNzeWd/hqR2aV9la4B0Z4iMfVNYb15KeHNTZFRRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnrKSnpK2ntbOyq6Wxp6q4vsC8r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essra5s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6meo6moqb2stLCunaqkoa6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WTooyUkYuRm5KVh4l+f3J7en58aHh8eXRvcHtnhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Svn5+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjYh7fYuGj42LiYSSmJCGlKOJkpKHkJqQk4GJfXlrfnZ5eGN8enBvb3F2Z4BzaoRoZWdfbHONbGFpb2BvPVp5a1VeT1BRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPmVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaOfqKS4sK+kr7Cpq7jBubOtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srO/tLq9t6i5uL2qo7Soqaqxrrqxqpy8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qPiZWeiJGVgoyXjZF9hXxzcH1xdHRgenhobW9wbmh9cWN7bWllYl1lhX5fWnNqcUpJf2lYWk5QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaSiuKqxpbS0qai5xLWzrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbCzvrC8w7mou7q3p6e1qKirsa2zsaicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GUpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqOlomNhniBh4OHi42FjZOYjY+WmYqPl36GmIyPeoF6cHJ3b290X3l3ZGtra2hngm1lcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZ1tIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiprqG7uKWsvcSzsK6ita+tra+0xMS9s766t7Czubi6uLqurb+ztLivv8G3q726tKWis6uoqrOsrrKjncO3pqm3t6ufs7uqp6aor6uZoqecpKeUmKGzppqepampnKGglKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycmqKWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSOjpR7gpePi3d/fGx1cm1sc2J5dGhmaWdlbYRnZ2hkZmhpXmViaWZZZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6WnnJ6enqS1raequrenrMPAt6+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLS6nqipq7GlmJ2qnqilkpqmrqOZnqSqoZuhnJignae2pq+qrqGhnp2hlaCmn6KgmZyanJOanpWmn66jmJeflpWOlZiMj5iaqKCQh4qKiHiFd4KCgpyHioKIe3+EiIaEkISWlY+PkJGQkYyTe4OVjoZzf31neXBra2xndXNrYWdkYnN/YWRlZmVpaWJmb1peWF1sY2FNZ1dbYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoJqZoJeltLKjsr63obHGu7qwsKO2rKuuqbm+vbutwLKvr662rrO5s6erubGvrrO2u7avub6spp61q6ChsaWrsKCmxaGzprCzsLettZ6srqyuopmdp6qmn5Wcp6agmaWjqZyan5yVnZ6tsKa5p66ioZqanpmfo5qlnZefmJyVmqGTqZetqJuUnp2UjZWajpWUmKenjY2KiY57gXSCgouYhYZ8iYiEhIqMiJKFk5ySkZCQkZePkH+BjY2DcIJ/Z3luaGtqZ3Fya1toY2Fyf2BkZ2tua2ZqZmRsXG1tdnFhU2JoY2VaSUdMTU9ZUVBWYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2blKGbqbOwn7nAtqG0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2lsrWxr6mxtraxs7a7p6mgtqmdn6qjqq6dq8SZr6awsbe1rKyesa2vqqKbnaSsqZyVnKeknpmqo6WVmqCdkpyjq6qpup6npKCXmpqeoY9ro5aZnXGDl5ylgXaSrKielZeikoqYmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQgGeIgGh2aWZYXWl0bk5QamNmcYJmXmRmb2tpXVxeiZCFiGhPS0M4RVRnXUpIUFBVVkxIU2FwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxTmE8Ky+OpJqIlbGbnZOgnKuuq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKicl6Gmppycp6idk56gmZGfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1iI1pl4lmfnN5oG+Hh4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVReNy8ojaeYhJ2snZmZnZ+rqqiqv8Ovsrq8uMG/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaikmpmno6WZnKWqlpOjnJWUpKamobako6CkmJWUmJSciK6QmJWKqoyYo52GsYGlrp6Vm6CXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5YYU9WTkZVXFhRUFKLXFdbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaWzQxIY+nlIGnqp+XnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5r5yysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6ShtbqiqqigrK2kop2bmqOqoJibqaGfmJ6oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elpuol3GuoaR+d7p8bKGPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraH+ReHpqqDhKr1tYVG1jWkxPWF9cV1Y7TohQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraeln6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6Oquames7Kwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoaqboaysn56al6Cjqp2ZnqWhnZqhqKSQnaObmKGgrJ+lpqCaoKGWlZGXkZqGtZu1eYaqmraZd4ezm7d/lJeYrJd/a4GmeoGFh5GUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbmNxfIaAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YtMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kota2jrLalpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6Cwo5uapKi1r6Goj6mnqpudlpigpqman52joJygo6WklpuemJqeo6ubpZqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2yXh19StbTIhX+JfGOkM0KddVxQamhkUEBYZllkYUpITWtKW1NPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLquo7CyobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpmirJ6bl6musamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoJiQkpWQnYiybmi1cauIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1g5HS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe6rqSysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKqhmJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaKelZmWkpuFrHx4qHajj4uHqXCui4SohJqao4uTmouifZKXh66Ef4KzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2Un7exmbPBrKiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWntqyosbGrrbSkm6mgoKiitaemqqSZnpWlopSUnJmSlaSnm5SQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpWfnJ+gmJiclpehoJSYkaadh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFeq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTZKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6KdmZi+rZizwq6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+UqrGpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ6alJihoZCOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4umdLR6dbSClKaklJ2NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1pRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpucuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurp7ajs6iuqqGXnaigpau4naOtnJaZkKWjlo6doJuYnqCRk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaKXoJuWm5ehk5ypnZSQqpmH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qfobujmLHDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOemJ+akZaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5ufqaSynqOljqeilaKanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsG7vJl6gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeW15YouscHWFf1hbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/p5azwrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyZoKinp6OpoZKsnpeinpeWmJ2ekLCplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpdmolhZIeOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwqSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OamqKnrKKfqqKarpuVpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVjoqMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5F9gHWJi4Jygnh5dnWKgHuJanOCdIN1ZHd9dmtwemxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkZmoqLLDr5mrnKqej5aWqZ6rnJ6hrZihm5yhpa+moaSonqyZl6admZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohoCXloqEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kIGAiWt1gXmIcml0f3l1g4eBanRjd2VfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua+/rautsbKgqqayraKss7DGsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhZ2qrKO0x7OfqaSqlpaYmqeeqZygpauUn5+cn6quqKWjq6Gsm5+foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYJebIuKgndcZ3N3d5GAh4JveIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2ln7q9uq+ss7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnulrKKotMO3paKnr5+dlZ6jnqOdpKqokp+gnZ+qr6mqo6qep5umnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN7ppiYc6qCfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1rpbJvjYFvynp/m3eRg46Ad3mBgHlxe4CGcHiFi5N5bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84lqK5w7Swr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ2crK6oq6ajoqWfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfaeVm3Srg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKuWaPNbpB2e9t7f5lxfoiSdX9le4h2dmx+h259hZCRfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6cm62upqmom6amo6CqkqyzlqWiqqqepKenorKik5unm6GblZSRl6BxhoyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiIqQj4Nsj45kbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5afpqugoqagqKijn56wrZiblqinr6yop6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnZ2psaepqJuqqKOhqpuvsaKoq66mmqerq6uzpJOYpKablZKFpGqkdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIyLl46BbJiQbmx4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwrqCpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKW0nZqhlJuep6upoq2aq6ihoamis62iqrOyopyrqbCwuKWUl6SomZ2SfKpsnoSIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5yRe2+VkH1ueXR8em1bZWpycWaAal5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKqjn66snaahrZqfqaWdp7Wgo5iUqKu2sqybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXoZWXm6WlqZmunKumpJ6ro7asobG5sJ6csKi0tLWmlpmppJuhj4KdTniagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jpGilnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GyrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJ2ll56YmJilo6eYraGsoqSXr6W7rKK3tq6enrazurO1qZqfsaKln4eP0bXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2Vip99l5mHh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod4+TpJd9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKjmZWjqaetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2mnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOWmpqcmJqXpaOll6mnrKCjm6ymvayVvrCtn6OxtLuttqmdq7SlqZl7qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBuZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySm4SpxsO2wbSfmq2grrmmo46ao6Ogr66pn6Oena2Znrmgo6ugr6qarqGRqqmllomaj62wrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZmpOZmaWjopinqqqho56pqL2kl8Otq6OirLO7rbCpo7WxqqyZdq9+kIqchYd9uq2JmGSwjGWWrX2hj4Onl5yCrYuFsIanmqSiopGFoFxsa4KzYH+te3uCgLFsZm6Zl4uIsVp9tFykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl46nmYiVjpOUeXeMm31jc3xig3h0gHxhamZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Im46vrKmno6iZrpOaj6maoZ6lnpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpuSmZeonp+Xp6ylpKSipKm6n6DGp6apoay1t66wqaG+sK6ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2teXiivrt0gJWNpZqNmY6Umnd/j5l5Ynx6ZIxneYF7YGtla2phUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqems6adjJelv6m2r6ehv6amspuesZ25qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkZiYj5eTqJielqinnqimoaKrup6pxaOhsKSrtLWrsqyjvqqwsJx0dqqkt4VliZ9wZ6yQio9ubnelj5qggXaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvboOZcYB6aXBpZ4mWlZdxaGmFhmdwhmRdimNpb1pdZ354pmBico+ScGZkgI2SjqGWlZeOk5t6hY2TdGSGd2iManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrayspo6WraqQjIWVl62fpqqin6SjoJGLpZKnmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZGYlI2XlKaTnZanopmvpp2irLmgsMKopbSnrLGyq6+uqrymsLmXi6GppbWciZaimIapm5CUnZKqtJmbo6yitJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo6ckp6UlZOegIWTi3Boj3Zvind2fHlpbGVkb2NVYVhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam0paeRmKyji4iJj5ynlq2koZqonp6TlaOXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6rrLa8o7G+mZKmpKa1opKdpp6NqZ+Nkp+irbGaoaSyq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYuBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGRl5GfkJqTnYKGl4V4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBkT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKKxpKaxqZabuKWilJipnI6GiombopCvnqSWqKChkpeZm66LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednrejf4OvtaOwsHWkv6SyoHh6oq21vpd3rqWgioCpfmRcYnafjqSeg5Z+bZS0nKOor6ylZqChlHR6m5hwgZmqmWyAo6mKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKJhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnaI+NcXmhlpVkeJiFgHaXaIOJgm55f2pwZV92b2trZ1xlY2Fhb1JZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4udr5+oq6eUlrmfoI+cpJ6RfoiImp6NrJqklaeino6XkZ6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6no3ulsbqDjo+nn4SLhY+xqa+MiZaimnmAi6yGnJ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlZiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJp0e5mCnJqEmH6RiIGCmGmMjIRreHtxcGdkeG5pbGpcZGlpZXJbXEhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eppZmUrcW8r6CUpae0nY+DnKucpqKgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOp5iNnXyoj3J7d5yOppZolaR5tIygoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+Yl4COlJyJmJKLfIWTho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmNubGZsWGVGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6ipKmhlKOptaKvf6CmnKWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x3m5yOoJGInqOblpiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjquajJp+onaAmZRrgat1Tat4h42dkpyqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jHtkZ4tzmX15l2xdfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q66imZafoKWrq5+crbShp5Ggn5+mm5mOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqykh5yRipiomJmZkYelr6ailZmIiYBpboiHi46OiYuNkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OjqYCGrK+HpXqLfYSafaJwc5OHlXuejHlth5yMmpKdqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOSiIGAtqhkgca4fHCVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJvc3VxaW9Ya2tycmRbZ11hTEQ9RDVRQVpwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJigpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLkJCJjpOegZWbn5ygn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfXqgmXmjk3iAc5eIjJx9lZ+HnI6anaeIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnYJzqmeUml2bhXaFnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmVWYUJQRU83VkJSbjRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtkY2loZ2tplp2JqracqIljlZysu7Kwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJ2JlZCGi52RnJuIj6ihn5qMkYqAgGmBhnl/lox7iI2OiI6VmX6SoZ6gopOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPnp2YiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp+c6paXW97l4t4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9saHV7YmNfUF1WXFRWQFlFUWdFUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTXqGntLqzs6iaoouaqZubp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B+p2h3bX6Zc6BzcXydhZhvk4KtfKOEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqKPdWuPs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+DbGhmZG11d2ZfYVJaZVBRYUhXSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS36pr7K1sLKjnJiEl6agoKKMpKefl6mJmZeYk5mTkqCXjoeGe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYOOqZqTkoqFiXmEdoiAboGfhneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUi4KfYJ6XqW15loegm3Whh3egfpCWi4FvTGajknGbiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdmt4h2ZrZmJzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1LSEtOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2JsKiFZUCUobOsr6+1oqKPf5anoqGji6SmnJumgpqXlo2XkJCbko6Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG1vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6JjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlFSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZqhoYCVmJONmo+Ll5COinyGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiUoJZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian5uZ2xTVVlVYGBca0xcUlxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZ2lhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJapqp6op66jmYiBlqmZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhX6Xk3N1hnKRg25/i5KHhpSQfXuChZekjX+lpY2AjYmElHWCh5NvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1xfX16l5abhI14e319iJSVk4t3kZmhooV8f4lrjIVcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh3dJR1cHpvb4lvhYZfd2l4jmeCg4aPqpx/dH2XaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbWlnVlleVlxka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdpdWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giZmmmqiYg4Gbi36WlIeOiomMcoJ8jnx+j4R7l450coRwlYZ8fZKLhoaPhnl+gIaYo4x7p6CKhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOokXhxn5OEfJRwf6qHcH2VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiHF0a4N2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyDjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNj4Nud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Rtc3KDZlxtimtrYllYXVlYa3FbXmBZXl1lcn57c290Y2pqaXt8cnp3dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqKOhfYKWq4yflIeaoZCklX97mIR8kpmJiIaGinJ9gIt2hYuChJaKcm+AcpiHhH6Tg4OGioJ6gISKmp+PgqaghniOl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaroqinoZOciZmQfXqQkIapf3+SkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdg4mSimx9jnd3ZoOGkYt8iZ6Fh4uPiIiBhYSRd3x7dZukioiLoIyHln+AjYOBd3F1hoV/eYmIi5GnkYSHjoiDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXt/mKmNnYyFn5yKnZZ8eJSCe46ZiYaDhIdteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkYapnoNyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iY+Fp3x9j5CRhZipoJyTnI6NqY2SgJ6NiZSboISPmH+Ij4RweYZydWF/hJCHdoyYgYOPgoaEfoaElW56dnWUpIyOhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+Cg4mJiHSDhoaJem1qfH97bWhrbGdeeX5nfHx2dHZ1endcYHB9bXRgY1pbXVBmbVNlWl1hamh1en5wbGxjampngH9rcn9ranRud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t2aGmDZWpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ylkJuJhqSTipiZeXmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh32PgI+bm5CIppx/cIuLjJKGoKGKhYx8p5CHjpGWkpWSd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWPiKKBfo2NkHyXpKCgkpmQkKWMj4GckYmUmJx/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9oeHJ5jZqTkYCYf4mMc4OJfX1yenyMhXt7ko6El6aUjYaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Bam19Z25wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGlsYl9xVnRvbG5geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbfHWjn42Xf4yhioialnd7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSYen+OmJePl5qdpZ6alJWde5KIhXmHl46ff4KKjo1zl6KdoJKYjo+hjIyDl5iDk5aaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZvfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9f4p/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqBj5igmpKQknSAjpKUip2dnqeZmI6VmHWQkYtth5mQm3uIiZCJb5edmaKTlYqMnYuGgZOdf5OTloiainyLioJ6cnprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI50koqFeol/d3mBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbGB6dHlwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22LgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY6JiIySnZOPjI1uhJCOkYmemaKhmJeKl5Nwi5uGZ4iaj5R6ioWRi3CWmpOhkZKHiZiMgn+Sn32Sj5OMmY98i4aIdHN2a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcW16f5uVfoWJdJKMgnWKe3CCf4KIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXm9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7e3N5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadICplJGNhqCMlZOQgHN7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaMi42OjJ2KjpGEboqLj5GKnJahnJmWhpmJbIelhWiInoqSf4yEjIF4k5iRnZGQh4iUjX9+kJl8kY2QjpqSfYuBhHB2cGxub3F8h2pzg4+ZinF4gHWCiYN6Z3NvdoKbkH2JhXqVk3t4inVxi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9ccXJxb293WV5vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Zrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eMgHt3in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7dHVzf4J+pZabrZ+nloWMg36XlYOOnXSKn5OShYqajJWOjHpyd3SCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKRgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXOLhYiPiJyZn5uXlYGVgGqIn4loiKGIk4WShIpxg5GXj5qNj4uKjo13e5ORe46LjZKXjXyJfYFsd2pvbGxte39ien6PloF3eoF4g419emh1bXWIl4yAiYZ8lZFye4ZxeI57i457iX6EjpGfn4Z9fXiBinx2b2dqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZ3R1aHFsYXdlXVVlYGBxUlBOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10f3RfdHx4hnhzc4V8eaGQmrGdpo6Cin+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJl4OGY4yRmI2UiZaLjImLcHqViXyOiYuUkop6hn1/bXxlc3BrbXt6XIF5kI6Be35/gIaPe3ppdWt0jJCKg4eGfpeNbX+AcIKOgI6JfoR7g5GWm5uMfXd4go94cmxlbn2Baml0b2doc2xTXW9kcFpfbHJ3ZmtrY2d4c29wY193YGFVa19edU9OS2BmYlx4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkYqIfX6ZdmVzbnxlh39ub2uAWmtueXlyYHZ6e412cnaKdnqfjJyvm6CQgoV4iJR+e4ich4SekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkeHB8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi52Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkpCGdoZ+fmx9ZHh1am96dFiIepGHhnp/f4CGjX96ZnRrgYuPi4SEgY2Yhm2Dd2+Jk4OShX+Ce4GRl5SbkXV0eIeMdHJwZXN3gGBzbW9haHRmUmBwZ2tVX250eWFzY2BpfXFybltjcmFjVm5aXHdNTUxjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyikoR8cIyUd3iJnIOEn42OfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6fhIlhg5WPhYiFiIyGgIdofZR/fYKFio6PgnKHf4Byd2h2cml0eG1ajH2SgoZ9gIOBhIuDdmJ1bYqCkYyDgICTkn5vg216iJGIlIV9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl0X1FkcWhmU19wdnRgcGBdaIJxcmpXZ2ljaVdtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp9iZmIiXuff4OZf4J5cXRub2RyfmhmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHi5mGgZKRhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoH+IYX+Th4OHg4iMf3+CZn2RgH5/g4yPkX9tg32DdWxtd3V0d3ZsY42Bjn+Ff3yEgIWJgHFgdHKGfZCOg32Akop6coVne4WMiI2FfIV/gZWQkpSFb3B5i390bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqDbnNiXGdfZW1fb1Rab05ITmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFtaHpzlHNnc4d8cpKShJqfm5+Gh3V1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1elpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+HjI99aYF+hHZncHl4c3d0bGuOhYqBioB5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmEfYKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fIB0dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYx2aXeXjn6BioKUl4l5j5VvenRxbGlkYHN6aF9lcXpaYXJ8eWdxeWBlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koeBhJiKfIZ/eHeJioSWgG+LiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZGVhYhwe5KCfIGCiINugHdogIR4cn+Ag4qIfGV+f4R2ZHFzgGl5cW91mY2Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX1yb1dnXWZqcWBvTldoUj9YZl5ab2tnenFbWlhrZVpjcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fW9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYx+bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hnyIn5KNkZOUjouHf3uShnd+g4yCa39yaIB+eG18fIKLg3hieoWCcmRyaX5udXF1gpuLgH+FgHN2foFzgnBcbn91eYuEi3uIgX6JeXtybYmEkYWMc4N6gJeMjIB1bmt2gIB1c1tnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW9kak1XZlE9XWVcXXVlYHVwWllVbmNZZHF5WmhdX2dtZ2lraXB3fY5taYKEfnlugHx9gX+CeXSBgY2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHp4hH18a4yNhJueloyBgGyNfWtofo2Len5+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdm9shYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CHjYp+b4B3goN/jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCiIFyYHeBfnJkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnOAfn+UiYp7b25qbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoamdtbGhwd3yTbGiEinx8cH5+e4GAgXp2f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/god/g359em2FjIiZo42Eg3t1i3hrbISHkHh+e4KRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknx3hpKCc5CLh3Jyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB4iH1ra3RofIBpdoGMkZR+en9/cXx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbmhWa15haWdlbm5ocHZ6k21piI14fXJ7fnmCgYF7dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZXmRugHep2qnHhoeycYh3b4x0e4WNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbX2AkJN/gHmRk355fG6Kd4KTjYV1l4uSj4eFhXt/hGx0dn5sZ3ZkbXt2bWl3d39/fGFieIZ6aXV1Y357Z3WGjo2Ve3SBd3GAe31ugFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnp9dIuBfnRodGVui4Nsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVmpfYG5lZmtwZ3B2eI50a46NdX52eH53gYSBe3N9g4iHg29ygHRxdX6FgomNint3f3iDe3yGh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fXpdZXqAeGp2eGaDd2d0h4yOlH1yiGpvfoF5b31dWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWtncGdxc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoNwcHt4d3Z5hoaHjIZ6fH90i359hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/d76ue6C2bmFzhWhze3F4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4RvgoOTiXSWio6IhYmFfXh0cW5oeV9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXRldYWNhpZ/cIxna3uEdW51Yl1xfWx1fYx7gmd2h35ucWl2f3l/gHN+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHBmcnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdn17bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWJXXFxof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXV9dH58b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Ma217gnFndGZhbnpnc3iLfH5jd4R3amxydntxe3p0f2d/f4B5d29kZmJuhXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+ZV1nc2lmYFZkV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJvaXRvcn50dJqCd3+Ad4B/hoR6fXWChH6XhW5ydHx6dXGEhY+BgHqLdXSQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3V8enWDgYt6boRzeYR9goN2b2ppZVZdW1paU2JtZFtYYXN7amhtaWBiV19baoBqa2+AZ2tgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnGAcXR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56d2F3hYV5kIZ0iHJveYByY3FpXXF4ZXJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt2emVebXFpZF1WYVVubldLU2hXZl5YTVVsVEpceV9bXmtdXVpjZWB5aGxgb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtzlYF7gp+Gfod9gH6GgoCKe3aEq59/eoeHg2tygXl1gH6BdG6GbnyAc4qAanBuZGRYX1pZWlRhamdbWl91gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBogoV4eGdpamFXVllnY4+nbn53gIuOe3Fyf2l6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3Jrcnx+dXZidIWLfImIgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2deXFRLcWJQRlVgR2J2ZmFLVG9YSk1YWGdrdXpkZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYnhaXV9sWl5cYWNefmlqX250eG1wbnaDl3pygYB8f4mMhn11dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZma4OCdH5iZGpcVFddYmOPpGh4dIOGkXlucXxpem58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZHODkn+IhIl7d29yfnNieGRccXFicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFhUTXZfUEpZV0hidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNR2l1WF5gbFtbX2JiXIRpZ2FueHltb2p2gZB5bYN/gIGTiISBdnSIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeWg3yZk3mAgHh6foB0iIN0cJmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3Bxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWhxgpWDh3+FdnNqcX1uZndYXWxuY3J0gXp0Z3B+W2BwcmJga3J+bW11f3NyeGtxYVxlbG16YGZSZVRXUVB1W1FPWFFIY3NhYEdWa1FJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXl4bHBpdXmHe2uDfX+EmnyDhHl8h26Ph3Jvdnp9dIKCfIuPg4KXdHiClIWBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2p0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXZrbYSTgYl8hnFzZ3B+cXNvVFxna2ZydYF3dGNtdlZicmxbX3BnfmZtd35zdHNrbmFaZGpqd15lU2NUVVBUbFZQVlJQR2RyX2FGWGlPSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5hZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+He3+GjHSBhnN9gnZupItygY2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmFjH+JfIltcmdxfW5zbmNbYWlpcHSCdHNeaW1TZXFlVWNvY3tkcnd8d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyPh5GbhYB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlJCPj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj42LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIWJioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSJhoaHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeOiISFiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiISKkI+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MioqOio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgYCAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9/f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERUVDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dCREZERENBVnSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktJSEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01NSUZKVmyBhoWEhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREFDRkhJSEhIS01MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS09VZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZFZnqDhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo6Ojo8ODk4OTk4Nzc6Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEQFF/g4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEdoODhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw7Pj4+Pzs/PUA/Qz9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJTEdHR0ZIR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo+Pz5APT8/QkJFP2iEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj4/PT4+QEFEQ0lTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTU5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdnZ4ent4eHp6fHx+fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PT5AQkRETW2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0dDSEpHTEpGS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDtAQTs9PDg/PT0+QEVFPkNFQ0dLdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFFVUxCSUpHSkx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEtQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVVWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdPSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnd1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lHQkFCQD9FRkVIRExvcHZ6eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0xHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0dDRDtBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGS0NGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDREZMTkhKTkhESERJTE5NSElMR0ZGSUlMTktKSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1d3ZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz46Ozs9Oz0/REI/QUNGR0tGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURFSUlIS0lGSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWdxcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHS0ZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYW5qbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoaGdrZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQkJHQ0NERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVVlaWVxaWlxfX15gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpJR0tLTUxKSk1LTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQkNEQUFFR0NHRkhGRUlGQ0dKR0dKRklMSElKTUpMS0dLSUhLS05RS1JRTFNNSk5NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpJSUtHSkpPS01LSUxISk1LWmZKZFxLbFJHTk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1VgeHZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkZGR0RESkRESkxLSUtMR0dOSUhKS0dLSklLSk5MTExMTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3FOS3J5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURCSEhHREVLSEdLTU1JTExGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUVFMSE1NSE5KSUhOR0pKSEhOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19kW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUUtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHREVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmRfWl1gY19ZX2JbYF5bVVlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRUlEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREBHSEE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYUFJSU1xUXF1eXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUExMS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYl1iYldfX1RRUFFSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhMQkRBQ0NGREJBQ0RATEhCTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXWGRWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUE9OT09PSEtGYEVEXkxEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFVUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUUtJWnhdVHhkaFhRU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cl9gYGJiW2FhaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFTTEhneGxjeHFtWkpMVHlwdW11Ym52UGRkSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnblh1dWp2dXCAYXNofWlseHxvX19fY2JcXmRlZmlqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dPVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW58bHF2dXheX19iXl1fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhfWnB6e19genNjcm94cWhkfGlye11US2xfdnVsanZ8e21+eWt8cF1eXmJbXmJkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NTWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VRUldbV1hXW09SVFdXWFFdWFZdVVNPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSlJRS1FNSkpPUVRSUFFTUklJTU9QUVJRUVFUVVFYV1xXU1JRUVVVVlRaUU5SUldVU1lWVFlVU1FVU1VVWVlYXlpfYV1cW1pdXWBjXF1iY2RmZGVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFJSUVZWU1haW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVVRUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2dmZWViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1FYVFFRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFdVWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNkaGdlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlRTWE1PUFJVWFVVVVNVWFdbXl1cW1ZST1VWVltbVlFTVlVWWFRTV1pTU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVVZWVFdaWF1eXFxeVlNOVFZWW1tVUVRUVldYUlNYW1NSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFZcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFVYWFhTVlhbU1JWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWF9ZWVJUVVpZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxXV1dWVlddWE9VXFleXV1UU1hTV1VTUlNXUVNWVFhYWF5eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tdX19aX1xWX19aXV5ZXlZTWVhZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl5eXt4bm9vcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHl7enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH18fXx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx4e318fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgIGBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKCg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgIGBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4OChIKBgoaFhIWEg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiYiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoOFhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SEhYWDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4OCg4WJiomHhYeFhIWFhISGhoOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFh4iIhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICCgoKAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgYB/f4GCfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX5+fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foCAgH9/gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhYOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoOCgoKBgICAgYGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bf39+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgIGAgYB/i5OPjIuNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEhIODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp8en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfn6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg4CCgoKCg4KDgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYODgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt8enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgYF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f399fXyAgICAgH9/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fX1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYeFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fwd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4KCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEf319fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYWFhIF/goR/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4GEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFhIWFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYaGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn2BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB+fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+gIiHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhYaGhYWDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaGhoWEgoOCg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYOCgoKCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGh4WGhoeHh4eFhIaFg4GBgYCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGiIWFhIOFhYeFh4aHhYaGh4aGhoSDhIWCgIGAgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYGAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx+fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaChIWEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8PClLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q+pKCLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GbuJuHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7CbkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6qq6+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuZlqKarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA0YWVpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ+gn5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYw6erpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh83NkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTo8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njc3ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc3Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5uLOysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHExLu7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZl5KTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaWn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmemqqmn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqyrru2vrq6qretq6q4urS8rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2v8m/0s3Lz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGVlIyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7apqKihqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzc/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm56jp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuyzrmrn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOyszMz83Ty8XIz8zIx8rExsDFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2bkZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzMzPydbWxcS4sraqpK6submwttWhlY6NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsbIzsTCx8DHzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q766t8GukY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8rDv8O7ycbIusfGxMrAvcHLxsXDvcW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qwkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe5tLu2wMK8t73GwMO8ta6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2r7u/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwrKynnqKqp56rrLOtqaups662sLKprqassry6tsO5urqxqrW5u7TCurC/sb29u7W7x7nCt62qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+4r6iuuLS0vLizvK+3ubWxu8Gxwa6lqKKssbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSstrixsLq5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKeusqe6s6a2oaKemqOiraKhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56onJuaqqavsKubo6O3qqCfrqi2qaamrLCjt7Ckt6Cim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCtrLWeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2toqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6Wmn6OjoZSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZSloZ6SkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlpWHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpyioaOYpJahm5WNh5iajHONgn2NlpaFkJmQk46Oe5mOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQn5edlZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHiJaemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QU1JSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPREpIVE9GSExGS0dGRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5dX15cVV9daGVTWGFWU1ZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLSkhGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW11ZV1tfWGJiUVthVFJMQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbW1ZeVlhkWU9cWE9RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtUXlFcWk9PU1BPST5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIcG1gXl1WUldSWk9KR0pKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNsYltXUVNQWFVFRkpJRkY9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJxcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZmVYV05RUlxHQkVJST5CPj04Oj5APD5IPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4J3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGkJGenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9QD49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dn51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZOWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZOOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJKOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyra29q5u7paitubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+cjKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLws29wrOtvL6our+9u8O3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qnpGlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTEx8bPz87Syr+7trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIiEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+amqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzsjCvrmyr7m1wcLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG0qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC1r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/DyLW/sLy3ubampKusraGhmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pKmeqKudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylm5WwppmvpZyZqJyejJiUnoOOoJqbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY6ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilorSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS9xMm8r7C2rbC0r7/EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6PkI2VnpuinqezpqaMl7Kboq2ZnJqsj52SlZKZf5Ghlo+Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwrSrtaiwuay/xLO3rq22uKWYqrKrqpifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6usqKmjJetmKSrlpidoo+ajJKWmIWVnpSMj5udk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js7Can5CTpJmfqJmToZ2TloiTlpKVlpyTiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksriqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+4xL3Bt6+1p6u3sry+v7SprrG2nparrqiul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKqclZaElJaKnZick4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZeYp6yprJurq46rvp6srrKjq6CxrbOurrayubiqrq6xqLWvtby9yrOqt7WxtK+upqG0oJuoraCmlpabmrKiraCmr5ehpJqak46jpaizqqGms62qtqWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t7+8sbytp7q5t7bCtqussbeUlqauq6ijsKmUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLKnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5kXD9ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLDp6m5sLa2v7yuq7Kxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2fo6Cgoqump7mlrLW3pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaabn56MkpGNkHZ9jYV8e3yGiIhwcnF9fH1cU2RvXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKast6yyt7zAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStrLiysqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaTk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRc3FcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMLDur+zx8Oqrretsri+vrKtraqkp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4uTkpGTopmbmYqOi4t9hoGBg3pzf4KAfHJ1i6SHeGtfYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbnBucDErLG1sbO6wL6ysa6sqquotqmmrq+qubCosrKvs623qre3p7S3q6ylqaqco56zs6mopLS1oLeuoKqoqqirp6CrrKm5taqqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqQkZGPkp+XmJaMioN/dIaBf394dIJ+eXZ9gIedj29yZ2Zwd1xhc4hrT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqymrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wsC+v66ysrK1vLvCsbGzqrOppLSopa2zs7mwo664srCyu6u6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXNyeGZ/hqR2aV9kaoB0Z4iMfVNYb15KeHNTZFNRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essre6s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6ido6moqb2stLCunaqkoK6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyVkYuRm5KVh4l+f3J7en58aHh8eXRvb3tmhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGspbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sr24ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Sunp+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBvb3F2Z39zaYRoZWdfbHONbGFpb2BvPVp5a1VeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srPAtLq9t6i5uL2qo7Soqaqxr7mxq5y8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppijqKCxuZ+jsa+hrKGspJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYl1lhX5fWnNqcUpJf2lYWk1QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWiuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbC0v7C8w7mou7q3p6e1qKirsa20saicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGtramdngmxlcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqurb+ztLmuv8G3q726tKWis6uoqrOsrrKkncO3pqm3t6ufsryqp6aor6uZo6ecpaaUmKGzppqepampnKGflKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGhmaWZjbYRmZ2hkZmhpXmViaWZaZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLW6nqipq7GlmJ2qnqelkpmlrqOZnqSqoZuhnJignae2pq+prqGhnZ2hlaCmn6KgmZyanJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBra2xndXNrYWdjYnN/YWNlZmVpaWJlb1leWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGu7mwsKO2rKuuqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spp61q6ChsqWrsJ+mxaGzprCzsLeutZ6trqyuopmdp6qlnpWbp6agmaWjqZyan5yVnZ6tsKa4p66ioZqanpieo5qlnZefmJyVmqGTqZetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iYiEhYqMiJKFk5ySkZCQkZePkH+BjY6Cb4J/Z3luaGtqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXFhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7nAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqmdn6qjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKeknpmqo6WVmqCdkpyjq6qouZ6npKCXmpqdoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hPS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKquq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKebmKGlppycp6idk56gmZGfqKqjs6+joqOclpiYl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX97h550iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqv8Ovsrq8t8G/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaijmZmno6WZnKWqlpOjnJWUpKamobako6CkmJWTmJOciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5rpyysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6Shtbqjqqihra2kop2bmqOpoJicqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Okq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6OquamdsrKwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoauboa2sn56al6CjqZ2ZnqWgnZqhqKSQnaObl6GgrJ+lpqCaoKGWlZGWkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6CwpJybpKi1r6Goj6mnqpudlpigpqmbn52joJygo6WklpufmJqeo6ubpZqcmqKgl5OSk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2uWh15StbTIhX6IfGOkM0Kddl1RamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLqupLCxobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpijrp+cl6iusamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoZiQkpWQnYiybmi1cqyIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4ZhlohdWcqdb8CAdE1LtVNVxmRWUmpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKuimJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaOflpmWk5uFrHx4qHejj4uHqXCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5eIal2vd5Wfj3dsNXnIrrNgRFVvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWotqyosbKrrbSkm6mgoKiitaemqqSZnpWlopSUnZqSlqSonJSQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpSfnJ+gmJiclpeioJSYkaeeh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFtNdF1iZk1aYV9ydF9KVTVKmpFYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+Tq7KpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yWnqGWl4+snI+ubnK0dKmMd4umdLR6dbSClKakk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOtnJaZkKWjlo6eoZyZnp+Rk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaGXoJuWm5ehlJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaSfmZ+akJaTr7mxq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKljqahlaGanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyboamnp6OpoZGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpem4lhY4eOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fIpqWGx5gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OanKOnraKfqqKarpuUpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOCdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkJioqLLDr5mrnKqej5aWqZ6rnJ6hrZihm52ipa+moaSonqyYlqWdmZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaSqlpaYmqeeqZygpauUn5+dn6quqKWjq6Grmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+aIWKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJveIJ4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGnr5+dlZ6jnqOdpKqokp+hnqCqr6mqo6qeppulnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKqBfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+Ad3mBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ6drK6oq6WjoaSfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h2dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6dnK2upqmom6Wlo6GqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhYyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnp6psaeoqJuqp6OiqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKWznZqhlJyep6qqoq2aq6egoamisqyhqrOyopyrqbCwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXopWYnKWlqZmunKympZ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaavrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJyll56YmJmlo6eYraGso6SXrqW7rKK3tq6enrazurO1qZqfsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOVmpqcmJqYpqOll6mnq6Ckm6ymvKyVvbCtn6OxtLuttqmdq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmpsfmJ9dG1/eV9nZXBvaGdoQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgoqugr6qarqGRqqmlloqbkK6xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinqqqhop6oqLykl8Otq6OirbS8rbCpo7Wxqq2ad69+kYuchYd9uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgLJsZm6Zl4uIsVp9tFukg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl42mmYiVjpKTeHeMm3xjc3xig3d0gHxhamZwbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iZrpOaj6maoZ2knpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp6yko6SipKm6nqDGp6apoay2t66wqaG+sK+vl4KqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2seXiivrt0gJWMpJqNmY6TmXd/j5l5Ynx5ZIxmeIF7YGtla2piUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAurK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqinnqimoKKqup6pxaOhsKSstLassqyjvquxsZx1dqqlt4VliZ9wZ6yQio9ubnelkJuggnaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCWlZeOk5p6hY2TdGSGd2eManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkraytpo6WraqQjIWVl62fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrK+uqrynsbqYjKKppraciZaimIapm5CUnZKqtJqcpK2itJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkp6UlZOdgIWSi3Boj3ZviXd2fHlpbGVkb2RVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp6TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56atKOcpqu3qK/Cr6S4p7Cwsq6rrLa8o7K/mpOnpKa1opKdpp6NqZ+Nkp+irbGboqSzq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpGfkJqTnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqJabuKajlJipnI6GiombopCvnqSWqKChkpeZnK6LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednbeif4OutaKwsHWkv6SzoXl7oq21vpd4r6ahioCqf2RcYnafjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McnmhlpVkeJeFgHaXaIKJgm55f2pwZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4ucr6Coq6eTlrmgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPkp+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MiZaimnmAi6yGnZ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZXFaXEdTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmUrcW8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjZCdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsV2RGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6ipKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi46Qno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xraFdmTV1YRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZafoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuOkaCLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtycmVbZlxhTEQ9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOegZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUJQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX6SoZ6goZOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V7YmNfUF1WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKOEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211d2ZfYVFaZVBRYUhWSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKefl6mJmZiYlJmTkqCXjYeFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkoWHmKCVeZGhopmfibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdHBtVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJumgpmXl46XkJCbko2Hg3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6So6ablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3Nqb1FWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaafin+WqZydo4uhoZqhoYCVmZSOmo+Ll5CNiXuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWTjIeXn42GkKilnImmeJabfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ21TVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmYiBlqmZnaKJmqScqJ2EjJqQhpyRhZKNjIx0hXqIg2+NhX2WknN0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Imp2Ii5KqoqCPgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmlnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roqCDg5aqkJ2fiJmmmqiYg4Gci36WlIeOiomMcoJ8jnx+j4R6lo50coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh52choqaqJ+gqoOJjZWbf36Kl62okJOokXhxn5OEfJRwf6qHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoNud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKKhfYKWq4yfk4aaoZCklX97mIV8kpmJiIaGinJ8gIt2hYuChJWJcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeZk4mcm4aHoaqfoaKji4iTm52jmZaroqinoZOciZmQfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x6dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHN7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXp+l6mNnYyFn5yKnZZ8eJSDe46ZiYaDhIZteIB/coCHfoiSg21rfnqXh4SDkH6AhoSHfIeDjZudkYapnoJyio+GkpKLnJF8jXupg42Rl5WOmpWGhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpipoJyTnI6NqY2SgJ6NipSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW96dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhY+BgomJiHSDhoaJeW1qfH97bWhrbGZeeX9ofHx2dHZ0endcYHB9bnRgY1pbXlFmbFNkWl1hamh1eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeHmMhXuJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpSRd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWQiaGBfo2Nj3yXpKCgkpmQkKWMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9qeXJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQfISFhoR0gIGFhXhkcHp+eHlwa2pmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnd6hYd+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZaRkHWRnaGhmJSXeX+OmJePl5qdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KdoJKYjo+hjIyDmJiElJebf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZ3dwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnZ3fHN9dmZrY2B+amt2c3N1fXB7Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnFleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqAj5igmpKQkXSAjpKUip2dnqeZmI6Vl3WQkYtth5qRm3yIiZCJb5edmaKTlYqMnYuGgZOdgJSTloeZiXyLioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWZ0an2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ8f3FzfoWBa2B5dHlwfG5hbmJke2Jub3ZzeHdyc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4ibkJV7ioWQinCWmpOhkZKIipiMgn+Sn36TkJOLmY98i4aIdHN1a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEd31ubX6DgWFmd3N0bnphXm9ganReb2p6eXlscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4uTgI2EjIF4k5iRnZGQiYmUjX9+kJl9ko6QjZqSfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9bcXJxb292WV5vYG9qXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx3eF9xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShYqajJWOjHpyeHSCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLj413e5ORe4+MjZKXjHyJfYFsd2pva2xte39ien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fXiBinx2b2dqf4B3XXZubWtwclVdbmFxYV9sbnlwaHBmZ3N1aHFsYXdlXVVlYGBxU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Fqg2CHfm9va3tgaW10gHRfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqViXyPiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5uMfXd4go94cmtlbn2Bamdzbmdoc2xTXW9kcFpfbHJ3ZmxrYmd4c3BwZF93YGFVa19edE9NS19mY1x4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh39ucGuAWmtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4J+ioeKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeMdHJwZXN3gGBybG9haHRmUmBwZ2tVX250eWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6ghIphg5WPhYiFiIyGgIdofZR/fYSFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlvcnqMhXRrb2lwdn9dcWduXGl0X1FkcWhmU19wdnRgcGBdaINxc2pXZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXuff4OZf4J5cXRub2RyfmhmbHZ2W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKRhoaXjHuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH6BhIyPkH5tg32DdWxtd3V0d3ZsY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFb3B5i350bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqEbnRiXGdfZW1fb1Rabk1HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYmlzeVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmot7ioZ8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5gICIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgW9zWmViXWpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYt1aXeXjn6BioKUl4l5j5VvenRxa2lkYHN6aGBlcHlaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koeBhJiJe4Z/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZKWhohxe5ODfYKCiIJtgHdogIR4coCBg4qIfGV+f4R2ZHFzgGl5cW91mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX5zcFhnXWZqcmBvTldnUj9YZl5ab2tnenFbWlhrZVljcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eG58fYKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cbn91eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bmt2gIB1dFtnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE9XWVcXXVlYHVwWllUbmNZZHB4WWhdX2dtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjYp+b4B3goN/j5uJhJaTmYqMhYl8j4hwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251e4aWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRucVZqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4iIa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoGMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbWdVa15haWdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnt/hGx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358Z3WHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnp9dIyCfnRodGVuioNsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVWpfYG5lZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNint3f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinOFjI6JdJmQkomGi4N8eX1wcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2d1iIyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ6fH90i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4Rvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXRldYaNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2f3l/gHR+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkXR9dH58b359k4d4mn2Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneGi3yVgW+Ma217gnFndGZhbnpnc3iLfH9id4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+Zl1nc2lmYFZkV2JwXExLaldjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njqd3gXp8kI55dnGAcXV4e5GBepd2h4OAhYh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kIV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhHx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt3fGZebXFpZF1WYVVublZKU2dXZl5YTVVsVEpbeF5bXmtdXVpjZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3aEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3JrcXx+dXZidYaMe4iIgYB5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZzZ4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGdrdXtlZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYXdaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31lcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOPpWh4dIOGkXlucXxqem99h312inSCeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk3+Ig4l8d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldpbHF8Y21sc2NiWlpbYXdcU0tjXVhpU1dHWWBNR2l0WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHJ2doJ4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIN0cJmhenp/iZR3Y3SGeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+e3ZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gHN6enpkZXVnXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3J/bW52f3NyeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpVa2trfGVub3FiW1pYWWxxV1JQZlZWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Jvdnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYeCdW+hlnN6houGemR2iW5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBndXh1fW17dXZwen92X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol8hnJzZ3B+cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH50dHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygI2LdndseYtgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyAc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjICKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxTUmBmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1EREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlJSUlYqFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46PjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yLjY6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4aHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4iGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS01UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkVKYniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP12Eg4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9Ed4KDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFgoSDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSkhIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZW1xZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXd1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESERJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRURDQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1qbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQz1APkFCRkNFQ0NHRENERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkZCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRUlMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Vfd3ZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RESkRESkxLSUtMR0dOSkhKS0dLSklLSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOS3F5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHREVLSEdLTU1KTExGSk5ISktKSUtKSklLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSE5KSUhOR0pKSEhOT01OTEpOTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eZGNiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSU5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJWVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYV1iYldfX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTkhMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXV2NWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSEtGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9wgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRSUFFTUklJTU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlVSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF5ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXllZVFhdXF9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5fWlhWW15cXGFhX11bYGFiZmJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5ent9fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgYGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIaGhYaGhYWFhYSFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYODg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOGhYOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaEhoSChoaCgIWEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fX18fH2Af4CAfoB+foGUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goGCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBg4OAf4KBhYODhIGBg4CCg4GBgICBgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYSFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaGhoWEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIaFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0s+hlsvRxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8WqoKufzpmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6uxn5WPobSVh52dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gep52fp5m0v8mWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7WkoIufw9KRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvFmcXJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A9PD09QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuXn6KVlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDs7OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03mbsLOdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8+PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haKCo5uinZyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyasqCpoKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BQ0JAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiM+wjZGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8OT0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1cC91tTTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD1CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo8Pjs6ODo7Pz8/QkJBPkE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY7PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5Ojw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT4/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw/Qj86ODc3Nj0/P0A9QEA/Pz09Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj08P0A/PDU2NzY8Pj8+PEBAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQT8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQ0BDQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo7PD47PT07Pjw6Ozg5Ojg5QUFCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCOzk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz07Pz06OTk6PDk7RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2O0RBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Njg1OEA+QDs8OTw7PD46Ojs5Ojs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg6ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3NzY2Njg3ODQ7Pzs+PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg2Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2NzU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc2Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODYzNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzg2Mzc2Nzo2NjY1OT4/Ojw/Oz85Ozo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTw/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3ODc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc4OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs9Pjo7Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRURLUE48OTg4NjU1Mzk1NjY3Njg3OT46PT46PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+Oz08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODU3NjY6PT88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBODw7Njo1NjUzNDY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6eoKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eWlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ycnJycnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpeXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXkpSUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZyam5ubm5uZmJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb64trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5uam5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrOvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/Ojw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4Ojo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBRQD87Ojg6ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTL0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxcm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhYmNjamJmY1pZWVxZUU5FPTs4Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwcq/scK/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njo6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G7u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozo2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs6Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm+urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1u7a5xLi0vLa6vcG8u762v8G/vL+6wMvCx8jAv7y8wMXCx8vIwcPAwMnLwsC7u7C0vL3AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+ytLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLaqr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFvru/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGsq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZGYkJaVmJafmJuZm6OZl5SVmp2gnaeopaCjo6Gjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/NzQ5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKeonqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSkqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlXFNaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmdmqqmn5mnoJ+fp6ilpJ6dqqKinpufqKClp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopicm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREFEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Wvs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijoqGknqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUM/QUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ+lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jBwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qretq6q4urS8rq24oqWinqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6on56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk9Pjw8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8Oj1BP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwL6+vrW9s62+v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9PD0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHR19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czP0MzSz7/HxsrDzMzLzs/Fxse2v8m/0szLz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0NDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazpLaqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jNw8jOzMnLv8i/yMnNzc/K0M3Oy87Ox8rP0MrOysLJxsnMyszR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzNDw9ODY4NTU7PkA8OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuxtqmjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vM0NHTys7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvN0NHGz87NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa25oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6tuLvBxcmhl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qsXd1sexkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vK/Yw3V9koyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq603BWjo6Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9vblYf5KGiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+5uLWwrKynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxqrW5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vbetd5OJj5B8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquprKqwo6afqq21trG9ua+4r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuvspKEiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKOFh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE9QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8tayrsaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09KRkxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLT0xNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkIqMZE1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYWFgmRLSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB+fn9iSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dHd5ZE9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94cmhVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvX0pQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1remxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIl7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWhmZp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqekh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W/v7+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ7hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrm0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCMiZKOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1vi397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnZSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaSzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq2+q5u7paetubirpqaioqSjqa+ysaqdnKWZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywa6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC+u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUlISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr+7trG6u7u+z7bEvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra+upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjCvrmyr7m0wMLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pamdqaudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05eUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqZqZmJOio7igoaOSr7CspaefkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalZaUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzo6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmam6mgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE9ZXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6srrKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaizqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWkJiap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2bsJqjo6Ojka2fpKCgoqump7mlrLa2pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rquxr66ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvs623qri4prS2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm5taqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKifrJmQsKGYoqGoqJ+onJmqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKho6MkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRXk1NUlpmTk1WWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWsrZypr6Ogpa2rqJyeq7OltKiaq6epo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eRjY+Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKSooa28qK6xrqGro6Svnp+tppefm6GknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp5bFVeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJf2lYWk1QTEpIUFJRSU9dX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saicv7imrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKkncO3pqq4t6yfsryqp6Wor6uZo6ecpaaUmKGzppmepampnKGflKWfpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZSTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFBzVFtbU0tJR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Cusra1ubi1rKq8s6+ysb3At668vLGkn7aspqa1qquvoaDFrKqosrWsrbW6nqiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJegnae2pa+qraGhnp2ilaCmn6KgmZybnJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlIQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGvLmwsKO2rKuvqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spZ61q6CisqWrsJ+mxaGzprCzsLeutZ6sr6yuopmdp6qlnpWbp6agmaWjqZyan5uVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuVmqGTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaGxqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7jAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqqeoKqjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKaknZqqo6WWmqCckpyjq6qpup6mpKCXmpqeoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXGl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2rq6Whn5yhqKebmKGlppycp6idk56gmZCfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98iJ50iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqvsOusrq8t8G/qqS4saqsprO1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqqClpZuipZ6xuJWmp6e3vqasp6mqrKeloZ+ZoaijmZmno6SYnKWqlpOjnJSTpKamobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbi/wqumtK6uqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqels6WioqCXnKKgsq+Wn6Shtbqjqqihra2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksLqwpaWvs6OquamdsrKwo6Whqq2wrK+mqKCjorGcpJ6ZlpmdnrCpmJyioLWzoauboa2tn52Zl6GjqZ2ZnqWgnJmhp6SQnaOal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Goj6mnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKglpOSlJOdhNWTmblxscJ/xod91pScu32cl6iSjp2NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLfBsLrAsre1vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpSZm6ehnKeVm5ufoJiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlp7a7vLK7v7i3tby8tKa1taOzsqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaKelZmWk5uFrHx4qHejj4uHqnCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhtq6goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpalopSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclpehoJSYkaeeh6l+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKimtLC4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5yVnaGVl4+snI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurp7epuK+1wbW9srG7uKzCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk5ypnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62qqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKirn5yfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4uGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlppyboamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fItqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysn6OanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKmtabAqbShn6WmnKWWlqGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWPm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpauUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaN4a2qLmaOfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCgrZehpJ6impqnrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqokp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKmwr62msravqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OgoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G0qKuplZGdnaKZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mop2zuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmeq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchYd8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm31jc3xig3d0gHxhamZvbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLassqyjv6uyspx1dqqlt4VliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYF6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCTcGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkplV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKppraciZejmIapm5CUnZKqtJqcpK2itJiko5+io56ipaKWrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd2fHlpbGVkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dl62ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am9kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoXl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6hpKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVvn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yMmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0Q9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6OaoqCZlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYOpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhsaZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhndOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkYWHmKCVeZKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKOtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3igfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboOLd21kZWN6gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeYk4mdnIaHoaqfoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo6Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHR7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkoapnoJyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChoaIeW1qfH97bWhrbGZeeX9ofHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXhkcHp+eHlwa2pmXn5zaXx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheX2dpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlp+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+amt3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSTloiain2LioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohqX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GlqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn36TkJSNmpB8i4aIdHN1a3Fvdn2MdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp7eXlscnBleV5ubHNtc1haXV9haVpPVldkYmdwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVidW+EgWFda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZOSmJuRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe4+MjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBwU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Jqg2CHfm9va3tgaW10f3RfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyOiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGFVa19edE9NSl9mYlx4cIl0XFtldWBhZGSOY2BmYlhpc3RubHF2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbn1lh39ucGuAWWtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlxb4RvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVXm5zeWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnKJbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt7bnRwgFdwenZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJaNgJqIhHxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxc2pYZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnRub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkXGZucYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEk29te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVi4GEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SDcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxbGpkYHN6aGBlcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4iem5aNlZKWhYhwe5OCfYKCiIJtgHdogIV5coCBg4qIfGV+f4R2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdrcmBvTldnUj9YZl5ab2tneXFbWlhrZVljcHleZ1xeZWxnZmtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZ4aDb2d5lYh9foSCmIqBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eW58fIKLhHdieoWCcmRyaX5udnJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV+dGhZYltoZm9kak1XZVA9XWVcXXVlYHVvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cWdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjYp+b4B3goN/j5uJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXGBd3WNg4d4iHaEiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgHRgXV1gZ2RpaWZOWWdNQGBjW2B1YF11bFhXU3RgWmRvcldqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f352j4aEd2pxaWyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSUNjYFtjb11dd2hVV1Z2XVtlbmhWa15hamdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7aHSFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnx/hWx0dX5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoKEhX98fnp9dIyCfnRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXKEb1xgY21lZF5vY1RccUZCZV5dZWddW3tiUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50a46Ndn92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSDeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWGx6hZuIgoFzl5R4f31vinOEjI6JdJmQkomGi4N7eX1xcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2h1iYyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN0hWldYGxqZmNab2FYYm9HQWdcYGVdXFZ7Xk5VZXBZW2poXVdnYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYeNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2gHl/gHR+bXt8gnt5cWZsYm6JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoNmXmBxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4SHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ3YneGi3yVgW+Mam17gnFndGZhbnpoc3iLfH9jd4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d+Zl1nc2lmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5GBepd2h4OAhoh2anJ1Z2duW2xkXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kYV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhXx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVVaZWx4fGZfbnFpZF1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR+enZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1xnX210ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZmRaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRodGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem99h312inSCeX15gGlkdmxgZl9eaV9ddGtZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHF2doF4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gXR7entkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3N/bW52f3NxeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpWa2trfWZub3FiW1pYWWxxV1JQZlZWaFNURVlbTkhydVhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXh1fW17dXZwe392X2ZyY1tdVmFjWGF1ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH5zdHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhrYlddVVt0ZFNSV2hRWGZUU0dZWU9NeHZbX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZGBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1ERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlZWUlYqFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46NjY6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yLjY6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIeHi4aJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhoaOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WGh4yJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6JhoaGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6Ni4qMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/f3+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn1+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8+P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlMTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERERDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkNDVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxHUmB8hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+PDo8Ozw7PDw6Ojw4Ojo7Ozk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pk93gYKDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA+Tn2Cg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQUBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9MfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmeDgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVdVdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTExIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPklNRlVvdXV2dHR2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QEBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTkhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGR0tOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZJR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhES0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHRENEREZHR0dJRkhKSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIRkhGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmljaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lGQkhKSUdISkZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RES0VFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkZDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBsa01PUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVdsTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSERGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5bY1leXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYldgX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTklMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSExGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09MUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUFRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWhiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlJKS3JvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1tbXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVlJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cW1pcXGBjXF1iY2RnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTktNT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FTVFVPTk5RVFZVUlNSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aYmNlaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1FUUVJZT1FTU1ZbVVZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhTVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYl1gVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZYW1laWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWldUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19bXldYXFxcXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eXt9fHx8fHx8fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6enp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH18en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn18fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fX18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp6e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgoGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgIGBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgoCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR0d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKBgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhYWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoKDg4OCg4OEgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFhIOEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDgoSEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iIiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiJiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhISFhIOCgoKCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGhIKCg4SCg4SFgoGCgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoWBhIWDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWGh4iHhoCBgYWDg4SFhIeIhYOBgICBf4GMhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358f4eDg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+gYODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoWDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYKAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn5+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIyLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgH+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgX+Af35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAf31+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4GCgoKBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhISDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeGhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhIB/gYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX59fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwgoOTzdKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4m7C3nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4nFnpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjTvpihnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pK2cobSZlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6mQm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmsK6fgJ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEnIK4r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ+Zp5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgwaKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdjFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXS1MfD1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXNjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TFycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVpqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJSQjI6PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJaVn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosamqqKenmpmdmqqmn5mnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBnV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/T08zKwsXGxsrHzr/I0MvGxMbEwLvDwL6+vrW9s62+v8LDxsTHw62+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMzdPNxMfJycDGy8bIyMW+wrOzx8TLysrOxcm/vb+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR0tTU0s/Rw9DT1tfV1tLLyc7Qy8bN0snS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnDy8vLzs/Fxse2v8m/0szLz8XJx7/DwsfOzNDQz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HH0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHHxc3M0NDRyMvMwMrLxdPOy87IxMnGxsjLytPT0NXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzc/K0M3Oy87Ox8rP0MrOysLIxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vLz9HTyc7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtamYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6submxssChl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHwsjIws/Avby/sMHKx7q9qrCyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q765ubOlko6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTCysnBwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8W/w8TFx8vFwMbGu8fLv8/Jx8PGwcO3w769trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLKzsLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVtbW1xYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xgnpya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIR5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaSrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGjpZujq6WipKqjq66krbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKefo6y0q62nsLSwuLXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFpZWVlcXF1haoB6f3aJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn5ziY16kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUtLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eho7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WMfYmAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ6WrbSipq2YrKuYp7Ohqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtPSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFh36JiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7GroaSkkKaqlqGpnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyip52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2cnKSd2d1hISEhHqViYiKjIuAf4OKjH+Tg3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgn5WdnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ7c4ytjYiAaGZiaW1xbW+DdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6Jh45zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIh4mIoaujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4SCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Ql6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mehJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrrO1opWmqomaipKKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CGeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/uLq4uq2tsaaxqq6+sL28wsOsmbuola6PmJiriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVlT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6Weo5Oip7CzqLGyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5SWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBKUFJVTlleUF1dTVFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQm5iZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnqLh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYaIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoJ3haGQi3l6d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl4+JjoqLgnyhiZCKu6GYk5eanKimpa2ep7W/v7+4xsnNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfYmFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApIaKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4J+dYOGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZKOioqdl5ijooaTnZWgi4qJjpyQg4iPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eXioWPjYF/h4+liI2TqJqXk5aYoZifmZOcmqKytKWjvMG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doCDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqijnJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJuampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmZuKkp6Qi4mWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaSzuKzCyMS1ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq69q5u7paetubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtARUc+QUBDOzo1PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywK6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjarDw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY2RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0tKQUI9Q0Q8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC9u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXhpqppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3Lu8PCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKGjqKWetqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTEs/QUhFRUhHRzk1Rk07Pjc9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr67trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2cn6eimbSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0hLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKyMjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjBvrmyr7m0wMLJtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW2q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFBJTUVHR0JTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJmpnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAssDCt7WztK+9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69oZmjn6Kpq6Gdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSU5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+drqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6mtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbi5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafBrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7t6yztq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqJqZmJOio7igoaOSsK+spaafkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tcaov6+ttrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalJaUpKC3oqWllq+xsqerpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9NTlQ9QkFOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptaueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psOrsLauqKurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KwsbSss6esn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptrS1vq6xsrWssLSzwbrFt6y9sLG3q6yqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE5aXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6rrbKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaezqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHV6YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7KhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJuUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1raqxsaypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2eo6CgoqumprmlrLa2pausqa2wtq6inqOpqpugm5uSo7OZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCrsK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqWjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOEcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rqqxrq6ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnp7KypKeloaGsl6qhlZugpp6loqukraKfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvsq23qri4prO2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhteVRkVlFjT01WVFVQT1hbYlVIT2lUVlNHT1hVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKmttquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGira2ova+srq2iqKifrJmQsKGYoqGoqJ+om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRX01NUlpmTk1WWWRYR1JoUVE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWmraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWrrZypr6Ogpa2rqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY6Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3tsVGFQUVlLTE5ydV1IWltnWUVVZVBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn7+9qrPBtLyhr7K1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svnp+tppefmqGknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fouFj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp4bFVdTlBSS0lNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoJiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppikqaCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjZF9hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJfmlYWU1QTEpIUFJRSU9dX25TRFhaUmhOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XrqGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saibv7emrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYJ6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnauepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKjncO3pqq4t6yfsruqp6Wor6uZo6ecpaaUmKGzppmepKmpnKGflKagpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenq8PAtq+sorWup6+vt8HAvbHAtrGusra1ubi1rKq8s6+ysL3At668vLCkn7aspqa1qquvoaHFrKmosrWsrLS5naiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJihnqe3pq+qraGhnp2ilaCmn6KgmZybnJSanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkIOWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1daYFZJR0hLTVJYPjlgbGlIQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoZqZoJeltLKjsr63obHFu7mwsKO2rKuuqbm+vbutwLKur662rrO5sqerubCvrrS2u7avub6spp21q6ChsqWrsJ+mxaGzprCysbettJ2sr6yuopmdp6qlnpWbp6agmaWjqJyanpuVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuWm6GTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaWtqZ3Fya1toY2Fxf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUZMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rLuvrKurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6qjqq6drMSZr6awsbe2rKuesK2vqqKbnaSsqZuVnKaknZqqo6SWmqCckpyjrKupup6mpKCXmpqeoY9ro5aZnXGDmJ2lgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZXXGl0bk5QamNlcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5ramnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsLW5ra2jqKyrq6Whn5yhqKebmKGlppycp6idk56fmZCfqKuktK+joqOclpiZl6OIoY+Sm4ihiJWfooClgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98h590iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpb26GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprO1rq+ztquppbGtpbazm6y1trWlpqmzsa2yqK6eqqGzqaCkpZuipZ6xuJWmp6e3vaaspqmprKeloZ+ZoaijmZmno6SYnKWqlpSinJSTpKanobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5uZWm8krxuaHltcY/YfVJrYrayfX5wlHWaoaqQVk5XYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqelsqWioqCXnKKgsq+Wn6ShtbqjqaigrK2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVGxjWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbqwpKWvs6OquamdsrKwo6Sgqq2wrK+mqJ+jorGcpJ6ZlpmdnrCpmJyioLWzoaqboa2tn52Zl6GjqZ2ZnqWgnJmhqKSPnKKal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYepmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNweoWAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7t8KwvMOtubbCq6ytr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Gojqmnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKgl5ORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlqLa7vLO7v7i3tby8tKa1taOzsqSgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaOelZmWk5uFrHx4qHejj4uHqnCui4WohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyure1ub65uLO3vrWmubWhtq2goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpaloZSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclZaioJSYkaadhql+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKintbG4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5uVnqGWl4+rnI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurqLequK+1wbW9srG7uKzCt6qsoZynpKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH05Sau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX2MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZGmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKiroJyfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aMe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLiotbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlpp2boamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVsgJmVlGVeYGNxmolocox7hpRman5wdHh+fWJbeHSBaFBcboR8fIpqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysoKOanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgXmkhWxpe5B9gHWJi4Jygnh5dnaKf3yJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnprC1qsmrrbKmtabAqbShn6WmnKWWlaGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SfmaGOmJWLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhYWakYeGipWPm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp+d3l6b2d5kYCBiGp1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraOss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ+VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpayUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoWTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNrbXqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIFud4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlqfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCnrq6wvbGqqKWusLCgrZehpJ6impqmrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqpkp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF7gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKqwr66msrWvqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OhoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNzpTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWrprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJLBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtm52no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qKuplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wqmp2Tfaptn4OIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mopyyuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmqppyhkIOeTneagoCeeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaCir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaSmoIiQ0rXDt3mHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+oGJzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmdq7Smq5p8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchod8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIaomqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm3xjc3xig3d0gHxhaWZvbWZlZk9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2OfIualqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqZ2apquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXknuHmZGmm5KPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLWssqyjv6uyspx1dqqlt4ZliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6qkm5mvpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkpkV0lqWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeNppeNkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKpprWciZejmIapm5CUnZKqtJqcpK2itJiko5+io56jpaKXrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd1fHlpa2Rkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCMe4GUjKGUipWRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dmK2ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiHmCk4ybk4mVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoHl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5lwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZF92b2trZ1tlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l0dpKNlpOJk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnelnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCm5mEmH6RiIGCmGmMjIRqeHtxcGZleG5pbGpbZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKucp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6hpKmhlKOptaKvf6CmnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMfmJtj4uTkIyPi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKprg6NucqVvn4GbZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15eY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfaNenJmzlW97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0M9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU43VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZ2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYKpiZqhpaqiqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QjpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhsaZSdgbGumoRUX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMd4SMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWpTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqFiXmDdoiAboGfhneAkYWHmKGVeJKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKKtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYZ2XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamatzgZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUWdJVUxYUlVcZ2tuVWdXTUpBSU1KR0pOQVFKUGRjam1ldXNzfnh7bnSJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZT+UorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCQoIV5gZSGiJWelH6TpKablpaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmGbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhOW0hXaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6WDfYWSjIeXno2HkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhYeVl56ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gZ5mHdaxmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xbUVtJXWxtdl9bcVlbX1pnc2Rtb3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpbn6TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351e4J0bWxmjHN3e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFRdUV5vd3lrandkaWpqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dhoubp5+gq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboKKd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXV1kcn16dG90YmpqaXt8cXp2dGRtdGhse391en17eXqAgH9vhomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoKGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoOIhox/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2BsZ3R7e3Jub2NqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5eioZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjJqckoapnYJyio+FkpGLnJF8jXqpg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjXh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZWboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChYaIeW1qfH97bWhrbGZeeX9nfHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3GCjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI6bm5CHppt/cIqKi5KGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqVmZ1/k5N/iI+DdXWCcXdhfYGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXdkcHp+eHlwa2pmXn5zaHx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheYGdpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WMlZ6afW+LgZCThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KJhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+aWp3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF4bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgHhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSUloiain2LioJ7cXprdm17f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5gbWJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohrX2lkamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXFih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5GkmpOBfYB8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5NwjJyGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdHN1a3FvdX2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp6eXlscnBleV5ubHNtc1haXV9haVpPVldkYmVwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2trX29odH9rcW5tcWdva2V7YW1/endwa3d3iX+jmaOooaabiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3qGbHJveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZuXoJKWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIemhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3B8hmlzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVhdG+EgWFca21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWN8YoV8b3BsdWpobmx3d19xfnl7c3Vzf4J+pZWbrZ+nloWMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKSmJuRmHeQeoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4poiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe5CMjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBxU1BOW2VjXHdviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4ZnJrg2CHfm9vantgaW10gHRec3x4hndzc4V8eKCQm7Gdpo6Cin+CmYl/ipx+ipiSjoSHl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF5kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGBVa19edE9NS19mYlt3cIl0XFtldWBhZGSOY2BmYlhpc3Rua3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh35ub2t/WWtueXpyYHZ6e412cnaKdnmfjJyvm6CQgoV4iJV+e4ichoSekI6FjJeEk46HgXV3b3lxb4NvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoeUi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am95dFiIe5KHhnp/f4CGjX96Z3RqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFybltjcmFiVm5aXHdMTEtjZmBddXKJbVtcZHleYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt6bnNwgFdwenZ5cWR2eYaMaHaAiXGAnYeZqJyikoR9cYyTeHiJnIOEn4yOfJaNgJqIhHxzdnBzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTe42Sh4KIkHqRi4aPgoB3eIOEcoeCkpuWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajH2Tg4Z9gIOBhIuDd2J1bYqCkYyDgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxcmpXZ2ljaFdtV1t0TEpLZWZeYXFzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qc3eKfXNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdG53en1YeYVxgG5neHaRgmR2hoVxipeGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHipmHgZKQhoaXjXyMjICAiY17kI19iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJiRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEkm9teoB2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI6WgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hoGdk4WUj4SDcoGKd4Z+jJufm4iVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCi4B5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFlqbW18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcW1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxa2pkYHN6aF9lcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCEk42Ef3CAhHiGe4iem5eNlZKWhYhwe5OCfYKCiIJtgHZogIV5coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXWdqcmBvTldnUj9YZl5ab2pneXFaWlhrZVljcHleZ1xeZWxnZmtpcXd/h25sf36AdXCCe3+Cf4J/doGEiZeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZ4aDb2d5lYh9foSCmIqBfI2NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCan9xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeLi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV/dWlZYltoZm9kak1XZVA9XWVcXXVlYHRvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx8gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNg5ueloyBgGyMfWtofo2Len1+g5SCfn2KiGt2cWdoYltiZ3JvYGFrc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKHdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjIp+b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoamdtbGhwd3ySa2iEin18b35+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2EjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9wcF9gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0hnSId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WCfYRxh4p4eXFxhYSOgH96f352j4aDd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIN0XGFcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XVtlbmhWa15hamdlbm5ocHZ6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXNhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F5bYmGdHpsdoKEhX98fnp9dIyCfXRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYHKEb11gY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50ao6NdX52eH13gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSCeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpR3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmhxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOlX1yiGpvfoF5b31dWXN/bnSBi3yCb2+KgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVdXFZ7XU5VZXBZW2poXVdnYF5yZWpocmdwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoWHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRnc2VgWGNxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXVldYaNhpeAcIxna3uEdW51Yl1xfWx1fYx7gmd1h35ucWl2gHl/gHR+bXt8gnt4cWZsYW2JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoRnXmFxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGVtZHFncnB1gHdwmYZ2f353f3yFh311c4KIgJWCbnN5e3pzcoSHiYiDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ3YneGi3yVgm+Mam17gnFndGZhbnpoc3iKe35idoR3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNkX3ZnbWJwaXRvcn50dJmCd36AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5KCepd2hoSAhoh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFyY3JpXXF4ZXJ0iHx5Y3SAcWdqeXVzbXl5dnllhXx/eXdxZGRjbXt8ampUZ2FlU0lrZk9HUWpFYHdmYU1Tcl1KTVVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZV95aGxhb292bnB3dXqYfnZ/gXmAgIeGenl6g36Bk4NxdHR+enZ0hIiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cWx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1tnXm10ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3t2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZ2RaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYmNdfmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoGMjnx+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJuhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11cc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9+iH12inSCeX15gGlkdmxgZl9eaV9ddGtZZVxvb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfHRncoBlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNnV1hTTXZeUElZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2FiXIRpaGFueHltb2p2gZB5bYJ+gIGTiISBdnSJdIyGdHF2doF4fX1+jJB/fpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZcXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubWtkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH19c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHpzZ3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVNWUU91WlFPWFFIY3NhYEdWalBJUFpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPgoKXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3JjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl1fW17dXZwe391X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2c2NtdlZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF5djm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jjn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbXxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYmKioqKioqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpOOiI6OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSJhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYWEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPztBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZEVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9DdoSDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUZDQkFDVW9wdXd4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtHQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHQ0JBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNOS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZFRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5JSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUUxKS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0hDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkdLSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUpISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tKTExJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxMS0xHQ0NBRTw/RUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JQTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFtLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERERkRDQ0JFRURGQkVGR0RESkVFSkxLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtpamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk5ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz5DR0RFR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTElISk5LSE9cV15PXFxgXk9YWVNcXGJeTVhaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExMQUNEQURJRUdHRktKS0dFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTElKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUhEQ0JDRkdFR0dJSkpJSERGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lKSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9ZX1tdVVhYT1xcUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZDQVVVRVxUXlNWX1hOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1RRUFFSWVNeXFtdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUhKS05MTEtNS0pKR0VKTlFRTk5QTU5NTklMQkRBQ0NGQ0JAQ0RATEhDTExQT05MRk1GRkhJR0ZMS01PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVtdXGFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSExGYEVEXkxEZmJDTFpIXlxzbU9NVm1YS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9YYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fW9+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTUtGYF1HQUVNTUhLS0hKUE9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFBSS0hneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSVJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTT1RQUlRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVBWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtaVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFNZW1dVT1JOU1hVU1FUUVFZT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1FWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWVpaYVhbVFZYW1laV1hZWldWXV5gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmF4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFhdW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2VnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3M2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5enp6enp4b29vcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z5fHp6enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp8eX19e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en57fX19fnx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX19e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIh4iHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4ODg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt6fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAgoGGgoSDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaFhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18h4aFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8ODo8Pjs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0M/XdLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztHU1NPPztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STztO4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7u4na+3l5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPgInJnaOostGSfX6vsdLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqfQ08KGmrXV082ensTQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pKycntHWo5i01NPAoKDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6W32KKZtdTVsKKp1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1Ojo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bptmimbXU1aShudTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKDZopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87PDk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ2o2qOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgv9iim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdXWsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvdXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PDo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PTs8Pjo8Ojo9PTk8PD08PT08Oz1ESERDQTw8PDw+PkA7ODw4MTU6QUZFV661tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzo6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjo+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ2PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1N0JGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCMf4eNjIuLh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNTZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjI0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtq6WppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ozs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVRhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8Oz5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7WzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpiUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S9wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc1NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzU7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVX1lMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw76+wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ozo6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojw9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa8vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3wL/EvMLFxcfHysnGz8LBuK62tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oz48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjs/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipaqsr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJiamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dvfG91cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NjpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqmamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg7PT47PDw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqSeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo9Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pzk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Gbnpqjp6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJuakY6RlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJWalpicpKGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlXFNaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpaCsoaGioJ+amJaVn5ubmKShoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWfnpmSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKenmpmemammoJmnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ6foqOen56bnZyUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1xRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenZ+lpqedoKCssa+npKSjoZ+mrKafl5yUkZmdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrru2vrq6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfnpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5OOjZCMgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM08/T08zKwsXGxsrHzr/I0MvGxcbEwLvCwL6+vrW9s62+v8LDxsTGw62+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1dXT08jMx83NydLMzdPNxMfJycDFy8fIyMW+wrOzx8TLysrOxcm/vb+8wcbEzMzIyb/Dv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0srS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnCy8vLzs/Fxse2v8q/0szLz8XJx7/DwsjOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWZoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHGxc7M0NDRyMvMwMrLxdPOy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnZ3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jOw8jOy8rMv8m/x8jNzc/K0M3Oy87Px8rP0MrOysHIxsnMysvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ09fa3NbPzcvD09DCwrKrra6sprOyuauzt6mjn5yWlJecnp+fnpWWmJWKbF9fXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvMz9HTys3R1dLV1crAycHFzMLIycLMwsXHysrOyszM0M3Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzM3PydbWxcS4sraqpK6tubmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O/wMfLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk7Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKm3q7+6ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NHMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ozw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3u7avkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7ta6ytrq+s8S3urWruLy9wL2wuravtrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Hhnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo5Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6vLvKt7S7vbW1q5GJkJB8eX6Khnp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbW9oZ2dpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6lqKKrsbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDx8W6vcS+ure9xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXV1cXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+lpaelrZ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sbekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLGtrayxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD1APTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8TGs77FvLewub+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrLG1oqmqqauspLW4rbevrLK0rrO1rrGqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK64ubuwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCxLytqrW5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpqGkm5+gmpitra2vsqCloq2rp6G1sLGxrKeusqe5s6a2oaKemqOhraKhqbWqoqOmnaWmo5aYnpeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn56hnJahoaijn52onJuaqqausKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYq6ahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnKOqqrCtqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBusDAubq9t6iosbumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFpbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSro6Wwp6Wjq6utpaiurq6rqKmps6Wmq6+0sa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uramp7K1nqKKmIeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GdrKypqK2toqGilJeimpyPq6mwm5+in56XmJOKnpKNkpKVj5iYk5uhopykoKGVoKGjpJqjq6WipKqjq66lrbGppqWmprWmqaits7W0ubqvqayei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PTY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtr3Hu8HHw72/t7q1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OkoJSTm5aVkamprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaijoqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWVlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbMtbG9xLzCxcO9wbO5r6Wqr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqaatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloZ6RkJKSkpWnqqSZmZqdnZaOjIuUhoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y0q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMs7m6vsDFx7a0t7yyurvEvsKxs62wrrCsnKKIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkqpynmaClm5KPnqKal5aEg5Gao4+TopyVlZaHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKaopqGgtLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy1xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaCOmpuioKOYpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmPnIyCiX+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCcmpmZkJWPnY2ioo2JmqChpKOborSvrK+sn5iluaalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhITVNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWjrb+4sbCgqK2sqpaVonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqGgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raeolqalo6CXj5ZpUE5SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZKTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+Zsp+imo2glpiUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnKSeGd1hISEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpqbo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hYWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c42Ig4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZF0c3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjpqRdmx/e3xtcm5wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5b4WPgnpugXdzhHpxc3l3a25pXXeHfYd8iIePgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgXODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSgHt1i3Z8eG1vd359cXFwalpcW1pjY1dnZlxWUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iYqAdYV5X2NWTEM2MC4vMjMxMzM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgJqWgqChmJWbmqWtk5m7sae7yMSnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3h9d3xxaWNcWVlcaV1hZ2BaT0xOWFNSSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSBgoyMgoqOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWEtIT1NRTk5MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn2Fk5J6gZKJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNze3x5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJiNeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO2o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtPRElIVE9GSExGS0dGR0hBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj3yGjI+LinuJg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQTg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q4uaicuKqNpY+SlKCGeoGAcldfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKt7zEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7qiqbK5tbu+zL/Fxb29s8K4uri/uLu4uq2tsaaxqq6+sb28w8Otmbupla6PmJmriX6AeWhVYWBXaWNpZVZbZFpXVUpHR0xSSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU3Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5SUjpCXkoeHfIeBjpaKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNVFpUXpSvuLW7ucnAu73Kzby9wby4try7t761urLGYXWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9dXl5cVWBdaGZTWWJXU1dJRUZPS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGOl5KWlo6GiH2Hg42Win+DgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7trq2uLm0uLW1rre3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW11ZV1tfWGFiUVxhVFJMQ0JGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iYeMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVpaW1ZeVllkWlBdWE9SQ0JIRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6Li4uQiHyFgnB/h4KGe4dyg5KMj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSRhI+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsbmrprSjoq6ipK6jp7KgiaablZORipKPiIKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tgXVxWUldSW1BKSEpKS0A7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW52f3Z4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2ZobG5pboGDiZKMnp+gnpGXmaCjpKaypKWyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNrYVpXUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4eGh3uFeXF7e4SGdnuGjo6eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnZ5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiHg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09rb1tDa2tLWydXMk3V3ZmVYV05RUlxHQ0ZJST9CPj04Oj5APD5JPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZGLjZODjIWJiYGGj5GenJqIhYyBhpd7iImfl4+JjouLgnygiJCKvKCYk5eanKimpa2ep7W/v7+4x8nNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETkQ7PT09OTo8Pzk+QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bn19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZOOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Rg4x/ppmIhY6DhoSApIWKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d1dXRnZmJUXVlST05IRExDPj0/OTk7Ojo6PD42QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoR+d4WboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOioqdl5ijo4aTnZWgi4qJjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVdDQElEPz8/OjQ5Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hYKEfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiI6Qq5eXpKOImZ6VmomPh5iXioWPjYF/h4+kiI2TqJqXk5aYoZifmZOcm6KytKWjvcG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tMSFRaQkJIRDxCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fIWHin6KorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWRmbKWl6Whh5yZko+LkYqXm4mLl46GfoyYnomQkJuampOYl5+UoJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ06bOzdTS0NbY09DYum92clleU11VTkdJTkVBQ0U1Pzs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eYaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5iTnZm0l5WrnYqclJGOkZKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKvCyMS1ur28xcfHwtGhxsrNzcXX1tHL1J9td2VZV1FcUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwcCvvca7s7TAvbWtq7O2i6iyrq6+q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKkuq+pwLytrrK5paSofoiHnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42MlZeUkZqXnaibsZqRrJyOmo+SjpSQkJaXj5GgkYmVm6OslJaPlJydkqCdm5ifoZSanqalpKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tHNxcqFcG9eWVdcWUxKQktBRkg/QUBDOzo1PkE+PTU9Nz4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6lwKSrsLu9qq6ro6Oep6uutbCqnKCrnKGclp+wtaeMo7u7tsG8rKmds6WkqJSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSHl5+hs56UmZOfoJeknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSENNS0xKQUI+REU8NUFFPDszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6ousC9u8S3rMGprLO8v6qwqqSlpKyus622taGgsJ+lopmjtL2qnKm9wqS2t6+slLKsrKyXh5qqpqWRgoyTpZaKgXWKknmFjpKQnqCTj5OLj42Uo5mXnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMOvpbO3zMC5r8Szu77Cua3Cw8LAl2l2XlVUWVhKSkxJRkRESURDQkRMOjRESTo7ND04Ri4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtre8rbO/ub2ur6igqai2rq2psrebn62ip6Geq7e4qqWvv8WyvbqzqKu2tK6ul5alrKefkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39oa1dUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUsuMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+wmKSvpKekpbXAsaystL/DusC6tKi6trm0r5alra+upIuTlKGNdMKafZeahI6XmYyxlZualZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7uqsLLIwLmmrKutsrKjobKytKRta2NZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCao6S1ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istri/wsC+ubOzxbK5vq2kr7WsuaaIm5emm3a/n4SZno6TmpqMrpehnJuXlJqfoameqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm3oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLKtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2ucKyv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZymopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLays56do6Wbl5SYqqGedVxaXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJaamo+qlpWnppWtrJmiq7bEw7y+tsHCwMfEv8zFu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6gkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqrqybmKCgko6QlaielGVfV19bTUhHSU5MSEZESUE+UUlBPEdJSVxST0s9SU9VNUJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCSo5+WpKCmqayYtrGjqrO2xcS9v7XAwrvIwr7Jx7a4tbSxs7S3wcW2vrG4tbm0n6asqqydnp6lpMGln6mtoKSpra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma6VnY2Yk5yBjp+XlY2ho5aQpa2xq6mioqWllZWdmIuOkZKknoheYVhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOok6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC1r77EtLmysLq0rJmosamqmp2loafBrZussZuqo66wqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52TlZKZf5GglY6Nn6CUi6Wrr6WmopygnpGSmpOFipGNm51+X2RZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/HwbSrtaiwuay/w7O4r622uaWYqrKrq5ifppetu7SbqLCarKCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpedoo+ajJKWmIWVnpOLkJudk4qoqKqipqGYnpWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpVZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6Odoaa/p6ivsaKqtaueurGso6u0trGwubewt7i4xb3Dx729xMLGwLjAxcC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegt6mmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6Kcl5uShY6Zi32LlYSNmWhma2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk5NUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7ur63t8DCv8nEucTDwL+3w7zAtq61p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpbSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6qclZeElJaKnZibk4qNlpaalqalo6CdlpWXk3+PlIV7jZKCi5RkanFmb3FeRllnVkRDTVdEWjlIQjY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1BMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLiytKypura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsbWvo5mdrKeal5+bmau3opeTkI6YnKGXlpOqnZqSf5GXjJ2bmJaQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqqympK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y1vb+/t768sbytp7q5t7XCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrG1q6SZoKuom5yenJSpuJyUjo6Kl5uil4+XpJ+blIKQlY+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUtQS49RUxRPDNya0lDQ5GZpa+lra+rqKWxs7SruLK4oay1ucm5rcG7wrizsbXCws7Fv8G9s7y/vrq+vLLDqKm5sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2wta6jnqOoqpugm5uSo7OZj4mNhpChn5SMlJuekZGDjZKSnJqXlZSHl5KVmaecoJ6Mk5GOkHd9joV8e3yFiIhwcnF9fHxcU2RvXk5YZlxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkc+M0JIUyw+kGs7R0iPnKqsoqqxpKmltLWytbaysqKsrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKestqyyt7zAr6uxrJ+jp62pqaWwo6qyqrCrr66wrquzvKe2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7CsnZ+mp6mZpJmZj5+mmIeEjomLnaCOioyVmo2NhIWPlJ+clJeVhpaUk5eknJ2ci5KRjol+foeFfHZ+hYOEcnFwh3RsX1phbmJRcnBcSzyFfEY/WHVYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODxCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Gss8PDzs/Dvr+zwMHDub+zx8Orr7etsri/vrGsraukp6qwqKipsaW0rqqxrq2xsbSstLykt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqZyhpKOkmKCblo+XnJOCg4+IhZugi4qOi5eNjomCi5ejm5CQm4yTkpGTo5qbmoqPi4t8hoGBg3pzf4J/fHJ1i6SHeGtfYG1lV2SGY04/Z5NMRWJ5V2JZUmVVTlZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRv8C6uL++wbnBucDErLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrGusq23qri4prS2q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqrqqqiqqCtm5KqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6mboqOjn5mZoJCNj5iNfoeMh4OdnYaDiYmNjI6LgoWVopqNjZqQkpGPk5+XmZaMi4N/dYeBf4B4dIJ+eHZ9gIedj29xZ2Zvd1xgcodqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVlNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGIwMj9mPU5YPkMsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u8CwrbmuobawycfI0cC+vLq7wb26wr++v62xsbG1vLvBsbGzqrOppLSppq6zs7mxo664srCzu6y7sKmttqyqnqqrn6Ogtq6poZ+ws6K2qp6op6qjqqGira2ova+srq2iqKigrJmQsKGYoqGnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGeHSCf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFJYcF9KeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLOyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6Ogpa2sqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyUkYuRm5KVh4l/gHJ7en58aXh8eXNub3tmhHeFimRhZ19yhHpsZnhdXlQ/V3tsVGFQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaasuMG9ta+iua2oqLDCysnMwba9wLS3v7rItMK0srG0sby4ub21rbi1vqyhs6errLG2uLWsn7+9qrPCtL2hr7K1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svn5+tppifm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouGj42LiYSSmJCGlKOJk5KHkZqRk4CJfXlsfnZ5eGN8enBub3F2Z39yaoRnZWddbHONbGBocGBvPVt4bFVdTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbPAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq62taemp7CzoJ6lpqiipZmfraiqnqCqrqagppikqaCxuZ+jsa+hrKGtpZynp6mampufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjpF9hXxzcH5ydHRgenhobW9vbWh9cWN7bWllYVxkhH5eWXNqcklIfmlYWU1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qqi5xLSyraC3ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7C9w7mpu7q3p6e1qaissq20saicv7imrr24s5+xt7CppaevsZuhpKGlpaCXm6+moZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqWpn5eanqaUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBh4OHi42FjZOYjY+WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGpramdngmxlcmprZGdXYXJ/XllrdWlYRX1eW1hPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcSyr66itbCsra+1xMS9s766t7Czubi6uLqurb+ztLivv8G4q726tKWis6upq7StrrOknsS3p6q4t6yfsruqp6Wor6uZo6ecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaGZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gIOHiIiRhZSTkoyRlZSNjpR7g5eQi3d/fG11c21tdGJ5dGhmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Gusra1ubi1rKq8s6+ysb3At668vLCln7aspqe1qquvoaHFrKqosrWtrLS5naiqq7GlmJ2qn6elkpmlraKYnaSqoZuhnJihnqe3pq+qraGhnp2ilaGmn6KgmZyanZSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIaFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNqYWZjYXN/YWRlZmRoaGFlblldWFxsY2FNZ1daYFZJSElLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mzo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhko2uoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm+vbutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2sr6yuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaa6qK6ioZqbnpmfpJqlnZefmJuWmqGUqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJOFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2pua2VpZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6awsbe2rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqeoY9ro5aZnXGDmJ2lgHaSrKmflpeikoqYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eYuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINmXWRmbmtoXVtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrGbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSztLC5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/lainsLW5ra2jqKyrq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZmKOIoY+SmoehiJWfooClgKitn5SUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GV11oWmtqWohwa3lyh2iHhFleRk4+Rl5NRlJWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprS1rq+zt6uppbKtpbazm6y1trWlpqmzsa2yqK+eqqGyqaClpZyipZ6xuJWmp6e3vaaspqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWUmJSdiK6QmJWKqoyZpJ2GsYGlrp+Vm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuCbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY/YflJrYrayfX5wlXWaoaqQVk5XYU9WTkdWXFhQUFOLXFdbUEFcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqwtrSoqKa2pqi5rpyysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqaigrK2kop2amqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99Znujp4JZX4uraHyMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6OquamdsrKwo6Sgqq2wrK+nqKCjo7GcpJ6Zl5men7CpmJyioLWzoaqboa2tn52al6GjqZ2ZnqWgnJmhp6SQnaKal6GgrJ+mpqCan6GWlZGXkZuGtZu1eYepmraZeIi0m7d/lJeYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXVCpbmNweoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWBUNTAcl6CVibSmp6GtqaizrKq7t8KwvMOtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbKzqKOinairs6mwqKafoKCwl6Cbl5aXm6GxpZybpKi2r6Gojqmnqpudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKgl5ORlJOdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1QamhkUEBYZ1lkYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTw3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqrGptKmmnZ6frJiZmZiYl5mkrp+cl6itsamjno6roqeVnZiboaehmKKio6GboqKonJ6gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm+fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGlQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGmsK2lqbutprWlp7a7vLO7v7i4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaampOVpauimJOmq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn52mlJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4KClWySW7BXS5p1mHlmYK1ednaGZ5eIal2vdpWej3drNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub+6uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqTl6WonJSQp62wpaCUmaifoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiclZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB+gpVuk12rXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbWRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW/uruzsri8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLqjo6yhl5ySo6CWlZ+blZqioZGOjKmwsKadlpqnpp+NkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4eSa5hdrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqSbscCurqurqLequK+1wbW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn5+RlJWrtrCmmJObrKmWjJSmmqWto5KYq7OkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo+von6NdYerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYWNmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNj85p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaetuZ2jrpiVoZGmoJOOnaOemZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGanJeVpJmQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3toxegHl9iGeDeWx6YouscHSFfldbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqitq6q7r7HGr7W0sLmotbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqacpqudlqmlppyboaqmpqKooZGsnpeinpeWmJ2ekLCplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phZIePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqV2x6gnJJSm+FcE5xTURWXGZgTFpXZmNfT1ttdWpxUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUtPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6mknJysoKOam6OnrKKfqaGZrpuUpqCXlJ2fnZixpZmiqJmdkp+dpKabqKSbnpucm5GXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnh6dnaLf3yJanOBdIN1ZHd9dmtveGxfYltvZ01YWWZqX1dZb3lubWZTT0ZTOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXl6GYraqmwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZihm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSalaKkmKSgmaKPmJWLi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6cGd5kYGBiGt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWWt7cGpqXFNMUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr+hrKKRkZ6ampSSlqKdl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqZygpayUn5+dn6quqKSiqqGrmp6foZiln5yfnbCkmZ+plJmZnpKmnJqqn5yYZoWTfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbnqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4Fvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziWlqfHJtY11RTlZKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrOunpakkKOwpre5pa6jj4+aopqTkpugmZmmlnukq6KotMO3pKGmrp6dlJ6jn6SdpKqpkp+gnqCqr6mpoqmeppulnqegrJeinKWxpZidrJain5uTp5mhrJqgf72EiXO0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46AdnmBgHlxe4CGcHiEipJ4bHWRYmVed2NfZYFiXXRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvq6anprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrq24tKevopKRmZ2mk5GgopicoJ6Ipqukq62/v7CgqK6olpGfnaKZo6Sqo5OhoZ2drK6oqqWjoqSfo6ScramSpJuprqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdX9le4h2dmx+h219hI6QfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylrKawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ6Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiq6qepKino7KilJuonKGclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLiuv08bHsrOfnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaioqJuqpqOhqpqvsaKorK+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwcnW1sChmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyoZyrqrGxuaaUmKWpmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hWGNtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjItJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7ago5iUqKu2s6ycppyglpCmrZKanKejoKqmraCipqmws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56ErH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhH5vW2xud3NqgW5aZF9obmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSGLh5mprKSruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ybo6eitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYraGroqSXrqW7rKK3tq6enra0urO2qZqgsqOmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI2BbGh3aHhzboB0XWRkbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJColknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmJ+po7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oytbutt6merLWmq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGWfmlsfmJ9dG2AeWBnZXBvZ2doQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiQpKbySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK6xraegqJutmJmPraKhnaWhmaWcrZefqKW2qL6upKmjn4t/jpuaoKaekpOZmpOamaWjopinq6qhop6oqLykl8Osq6OirbS7rbCpo7axrK6ad69/kIqchod8uq2JmGSwjGSWrn2hkISnl5yCrYyGsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtlo2lmIiUjZKTeXeMm3xjc3xig3d0gHxhaWZvbmZlZk9UYltBU109SCg+OT00ISEtJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46vrKmno6iarpOaj6maoZ2ln5mkoqWYnqKosai7rqSonp2OfIublqGgmY+RmZuRmZeonp+Xp62lpKSipKi6n6DGp6apoay2t66wqaG/sLCwmIKqk6OujpuAhqSXmJCBgLjDuoSPnZSFqJmeg6yMhK+KqZ2apquSf9a9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4VvnX96srHHg2ursb2seXiivrt0gJSMo5mNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdr6ems6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2grKypuK2no5qXknuHmZGnm5OOj5eYj5iTqZielqionqimoKKqup6pxaOhsKSstLWssqyjv6uzsp11dqqktoVliqBwZ6yQio9ubnelkJuhgnaynJhxkY5yl6qkm5mwpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2Npb1pdZ354pmBicpCScGZkgIyRjp+VlZeNkpp6hY2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fpLSqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVl62fpquin6SkoJKLpZKmmamalqOpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZanopmvpZ2hq7mfsMGopbSnrbGzrLCuqrynsruYjKOppbWciZejmIepm5CUnZKqtJqcpK6itZmlo6CjpJ6jpaKXrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdIN3dIeMcadtfZaTlJSBgY+Pjo6bkZ6TlJOdgIWTi3Boj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYV5NVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXmBhYl1eVVFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp6Yp56atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpaa0opKdp5+OqaCNkp+irbGboqWzq7OapqOfp6ygn56dmK2ek5qinJSQl6uZjZmal5CXn5GHoJ6VlIaUjZCOlo2Cf2aOiHWId3qJhHScaoiSlpWSiX2MlpGSlpCekJmSnYGGl4V4cZRyeYl/cXt+am5kXnBpYFxfWGxiT19iTlg5RkZEPTI8PTcuKiUrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCotqqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6Giomco5Cvn6SWqaChk5eZnK6Lq5aPqJmnjJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaednbeif4OutaKwsHWkv6SzoHl7oq21v5d3r6ahioCqfmRcYnegj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlwgZmqmW2ApKmKZZylnJGYmZeMk5yRhJ2bkJWElIiPj5OLhnlskYh2h3F8hoGBYWmJjJWTjFt2lZBmaI6McXmhlZVkeJeFgHaXaIKJgm55f2twZWB2b2traFtkY2FgbFBZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXV9nZ2dYUUo8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWdIucr6Coq6eUl7mgoI+cpJ6RfoiJm56OrJqklaiino6Xkp6Fda6PiKaaqJGWo4ibubOnn5iYi4l1d5KNl5OJk5CQk4yPkp+NmZ6lmJuxlYCMm7WdtIySj72non6no3ulsbqDjo+poISMhY+xqq+MipajmnmBi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgpGXloSammJ5iJKFjpCTi4RucpGIeoJxgYGGgId0iIaXk3iWaJN0oJp0e5mCm5mEmH6RiIGCmGmMjIRqeHtxcGdleG1pbGpbY2loZHBaW0hTS1BARTUtWVNUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpae0nZCDnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhqmPqpqNnXyoj3J7d5yOppZolaR5tIyhoKiqlJrCg4GriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfIWUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOptqKwf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x2m5uOoJGHnaOblpiXhqK4rKWZm4yMfmJtj4uTkIyQjIyXi4+Rno2SnqCYoad+oaeHrZ2glq6QoJ6dkYeCoY2tsomkj6ycjJp+onaAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX15l2xdfZhvYVRyhl1gbXqEYFllgn6FgZlyqKprg6NucqVvn4GbZ2SebFpsiXtlWV+CfmFXUG92ZW90cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU5NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8q6+imZaeoKWrq5+crbSiqJKgoKGnnJmOmLSZkIuejJWLdYGUko2KppaWmJ6ffpOFhayjh5yRipiol5makYelr6ailZmHiYBpboiIi46OiYuMkYuPkaGKkp2fmqGkf5OBj6OhlKB3nJaQp4OjqYCHrK+HpXqNf4SafaJwc5OHlXuejHlth5yLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgca4fHGVtoxygZukZHSsq2F+ap2zfm5+iYSPg4yYcYCjbHKjcp6CfaNenJmzlXB8l56zdHJbnrKCaWJxdHVxaG9YamtxcGRbZ1xhS0M9RDVRQVlxMjxTR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARF9eW1pXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4tq2uoJqhm6KjpKyamrGsq5OXoZmhpZqalJ6sm4uJkXiLhXGAlo2JkKGQk5Sdl32Rio6ooIaYjomRopObmoyLqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ygn4uJd5yYoo2gcqGMiamJnaiSmaquga6NfnqgmXmjk3iAc5eHjJx9lZ+Hm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXaEnWiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE42VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11YZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIBye5eIi5aWhJKVmI96i4SWpJyJlY+Gip2SnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6foZOYcmifiqCPjHCSjYKpiZqhpauiqn+xrqSiuJd3o7Oio3+IlHideqqZf6KPn52ZiZhyoX6IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4t4nmJNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUWdEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbGumoRTX6GntLqzs6iaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniVhZCbi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6om5mVioqKfINshIVxgqGMeIWMiIeRmJR6kaOfnqOIroZ9tYSPnp17ppZ6qYKXn5GMo59/p2l4bn6ZdKBzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iKdKqyqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZeYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSktBSkQ4UEBRTlhTWE9TUWBlZWpTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobWiYm3+wrFRdS36qr7G0sLOinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoiFe3B9g2h9j4KTmoF3kY6PinCAho+TkmyYk3yIkZKjlYOOqZmTkoqFiXmDdoiAboGfhneAkYWHmKGWeJKho5mfibOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3KbiXSle3p1YoSDbn6hbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15qdmt4h2ZrZmJzdG9sVVtSWWhPUWhJVUxYUlVcZ2tuVWdXTUpBSk1LSEpOQVFKUGVjam1ldXNzfnh7bnSJentVUU5tXmhca2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laW1lop2JsKiFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aAiZSVj7lukIqiYn2Zo5eJbnNrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWFNsSVhOW0hXaGhzallrVlBSRVZcTVhSYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRtjKeupamwsaWfi3+WqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6aDfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V6mIl7qXWokISabqWijJKEjIO8bXylr4KHhYeVmJ6ifqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gaJmHdaxmnq2MtnN2voykk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUVtJXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqudgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3R1hnKRg25/i5KHhpSPfHuBhZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gp1xj4Z5k46HgXtzqY1xfX16mJabhI14e319h5OVk4t3kpqhooR7f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnFvd3hvXWuFbmlnVlleVlxlamNVYFRdUV5vd3lranZkaWpqdXxwcXRzYW90YnR7gXh1eYJ1f4B/gXmLhYJ+e26AbWR5bl5XbmdodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaObpqSZpJ2roZ+Dg5aqkZ2fiJmmmqiZg4Gci36WlIeOiomMcoJ8jnx+j4R7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dh4uap5+gq4OJjZWbf36Kl62okJOokXlxn5SFfZVwgKuHcX6VcWpvfIGfi3+RjYpnbV2EjY6dnqCQc5eNinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBboKKd21jZWN5g3qVWlxpZ252W3t5d3Rtc3KDZlxtimtrYllYXFlYa3FbXmBZXV1lcn16dG90Ympqant8cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZwdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7KikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIaGinJ9gIp2hIuChJaKcm+Ac5iGhH6Tg4OGioJ6gIOKmp+PgaWghniOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKki4eTm52jmparoqioopOdiZmRfnqRkIaqgH+TkZKTnLGlmpSejoywkZiEpo6Olp2hipGdhIqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYmIi5GnkYSHjoeCi4+KeoOIhox/dGqBg3x5mWlyaGB0inF+e3d2b3Z0gV1eb4dnbl9eWVpcU2dxVWNbW2BsZ3R7e3Jub2Nqamh/e214fnBob29rZoB7coKAd399f4V7bYOMhXx6eXx9eoR4TmR2anNucXtlbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYeDhIZteIB/coCHfoiThG1sfnqXh4SDkH6AhoSHfIeDjJqdkoapnYJyio+FkpGLnZF8jXupg42Rl5WOm5aFhZumn6KanoaDkpqZmZCZpqGmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZySnI6NqY2RgJ6OipWcoISPmICIkIRweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyNh5yGho91gox+fnNzfIqFfHqOj4WUqJCHhI+BgomHh3OChYaIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcYHB9bnRgY1pbXVFmbFNkWl1gamh1eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2Fd3GCjYd+e3t9gHuCi2Bpe2t1aGqDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqOhXyKkYOMgoKCbHt/eHKAhX2KkH1raH2Cl4mBiI58foWEh3yPgY+bm5CIppt/b4qKi5KGoKGKhYx8qJCHjpGWkpaSd4yjoKGdlpuAgZCamJONmqOipJuYkpx/kIh7goaQiaGBfo2Nj3yXpKCgkZmQj6WMj4GckoqUmZ1/k5N/iJCDdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqTkYGZgImMc4OJfX5yenyNhnx7k46El6aUjIaQe4SFhYJzf4CEhXhkcHp/eHlwbGpmXn5zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWhUZFheYGdpdXmBcWZqY2xnZX+Aam19Z21wan13hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoNudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWjn42Xf4yhioiblnh8hod+hIp+iIKAf3B+e3R1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aVhJKKlZeSkXaRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImI+ff4KLjoxzl6KeoJGXjo6hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIF9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5+lXmNi32CiX59coB5i4d7hpKLjJmkl4KEjHaHg4B/dHh/hoJzXnZ3fXN9dmZsZWF/aWp3c3R1fXF8Y2Rhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamJrZmh8gmtodGhsbmh/fIJ5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuKmHmWnIuMmZB5fIGMfX2De4CDgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5egmpKQknSAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqRm3uIiZCJb5edmqKRlIqLnYuGgZOdgJSUloiain2LioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiFgI91koqFeol/d3iBfoeCfoWPh42VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohrX2lkaWNod4dtZmxoaWxngHx6d26QiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3h4bmyIa2hfaXFih2hxb2V2Z21sYXpoanx7eHBhd22LgZmaq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8npORl5SJd357in18gHZ4f4BwdHN6b4V9gYCJfnxhXH6PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJiKl5NwjJyGaImbkJV7iYWQinCWmpShkJCIipiMgn+Sn32TkZSNmpB8i4aJdXN1a3FudX2LdW+GkY6ScnSAfIKCin5lcm56f5uVfoWKdZKMgnWKe3CCf4KIfoaOi4aOlquOe4h9foqEdnxubH6CgGFmd3N0bnpiXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcX+HZV1paGZiZ3GNbmNoaGVpaIF6d3VvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t7e3N5hGtrX29odH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmaOooaebiIuKgY6chpKadH+olJKNhqCMlpSRgXR8doV4eH9yc3qGbHJveG2JdoCAh25xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ6Kj4aSl5aFiJOYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIimhWiJn4yTgI2FjIF4k5iSnZCPiIiTjX9+kJl9ko6RjpuTfYuBhXB2cGxub3F8h2pzg4+Zi3J4gHWCiYR6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnyMiIWKj5yliXyEdoGJfnd3bGh9f35bcXJxb293Wl5wYHBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFNZZWVhdG+EgmFda2xkYmZrkm5gZmZfZ2qBdXJyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4eLf3x3i39qcWN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShouajJaOjHpyeHSCcHKEdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZygnmBoIKQgZKSmJqRmHeQeoKMkqOak46IlJiShIWWmIuTi4mOj4idhJGLfXKLhYiPiJyan5uXloGVgGqJn4ppiaKJlIWShIpxg5GXj5qMjouLjo13e5ORe5CMjpOYjXyJfoJsd2pvbGxte4Bien6Ql4J3eoJ4g419emh1bXaIl4yAiYd8lZJyfIZyeI57jI58in+FjpGfoIZ9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BOW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfm9scXOKfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Jrg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+ipiSjoSImI6Pj4R3dHdzgHBwhXRwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cmtkbnyAaWdzbmdpc2xTXW5kcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19edE9NS19mYlt3cIl0XFtkdWBiZWWOY2BmYlhpc3Nta3F2i3x0eYeCdnd+i3OAh396iX9yiYeBkIqIfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSekI6FjJeEk4+IgXV3cHlxb4NwbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHaDdYShhJFulY+Vn5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am96dFiJe5KIhnp/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJvZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFzbltjc2JjVm5aXHdMTEtjZmBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3eEgXl4fIlxg4V9fYh7dIuJh5WGjX9+mHNndXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn4yOfJaNf5qIhXxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaKmoiMaZePj5uUkoGIcIWIoI2Fi5WKjJeTe42Sh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjHaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml1eG1ajX2Tg4Z9gIOBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIlucXmLhHRqb2lvdX5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaIRxc2pXZ2lkaVhtV1t0TEpLZWZeYXFzhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgn97dnqIc4WEfH+HdnaKho+YgY2Ce5N2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp8iZmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3twkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXyMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0eHZrY46Cj4GFf3yEgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaHd5X2dpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRjXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWlticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYGSlXyJhnaJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYeQg4qNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiHGBfWZ+jHx5f4CIjI99aYF+hHZncHl4dHh0bGqPhouCi4B5goGFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV6c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBPWWpRRFNmYFlqbW18bllbXWxiWmJvdmRnXF1ga2lja2pzdoGDcW5/fIB0dYN6g4N9gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVqaneEc2yTjYafmZ+ZhYdufYt1aXeWjX6BioKUl4p6kJZve3Rxa2pkYHN7aGBlcXpaYHJ8eWdxeWBlZY+xsndLYlql2dCWcXqQio93fZOKhJiQi4Vua4WRkXp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCDk42EgHCAhHiGe4iem5aNlZGWhYhwe5OCfYKCiIJtgXZogIV4coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4p9d3mBhXqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Vnem5dWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdqcmBvTldnUj9YZl5ab2pneXFbWlhqZVljcHhfZ1xeZWxnZmtpcXd/h29sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmIqBfI6NaHhza2tmX2FveG1fYm94XGRrgnlhcXVfZWXU6r2LMjo+i45/cXmFh42NdYKWjH6SjYt+bWuEjIx1fY9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo6LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCa39xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCGgHR2f4F0gnBcboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bWp2gH90c1tnZ3VuV1Z8U1lvZExacnJlW0lxeG9cW1tZXXV/dWlaYltoZm9kak1XZVA9XWVcXXVlYHRvWllVbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9gX+CenWCgY2ThHCBi254foB7e4iTiX9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZ3JuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjIp/b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9g4FweHp8dYBtWXCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoa2dtbGlwd3ySa2iEin18b35+e4GAgXp3gH+Ki4NxfIdvcniDf3uJjI+DaX17bXd4dot2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZ19wb19gZ3Bmam6JdGF0b1thZGp1eoC/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0h3SId5OIeXlwY3eHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkpV/fH+AcXx3fHSAY1Z4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353kIaEd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJ0XWJcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XltmbmhWa15hamdlbm5pcHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm53goJ+iIuTf3CAe3h5eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGVZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39wcX9thHSThXh0a2B6gnmJj2ZyhHBodW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1pgV1ZVd21iUFJ0dlhQVlheYHKEcF5hY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtbZ2tgVmpfYG9mZmtwaHB2eI50a46NdX92eH13gYSBe3R9g4iHg29ygHRxdX6FgYmNinp2f3iDe3yGh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIaDdIWGhHiKe2JubFtiW1thVmlzYmBbZ25wZodyYXFlV1xia398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpV3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmdxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOln5ziWtvfoJ5b31eWXN/bnSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3NhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZXBZW2poXVdnYF9yZmtncWdwc3eGeG6Vi3R/enh+eYOIf3Vyf4eFjoNwcHx4d3Z6hYWHjIZ5e390i319hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1tcXVRnc2RgWGNxcmeAcmJrZFZaX2p/eL6ue5+3bmFzhWhzenF4gYV6fYt+d3dydm97dmVqb2GHdY6Ac2piXn55eYuEZnF/aGtrWlZvd4mjgYV/cJmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYaOhpeAcY1oa3uEdW52Y11xfWx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh7aGFOVXVrTFBUVV9ndoRnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGZsZHFncnB1gXdxmYZ2f353f3yFh311c4KIgJWDbnN5e3p0c4SGiYmDeIF9dY9+fIWKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkoByjoFxhoJ/g4BwZmxnWF1bXFtTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Zpem97cllngXd1aHCBeIJ3YneGi3yVgm+Na257g3JndGZhbnpoc3iLe35jd4R3a2xydXxye3t1f2h/gIB5d29kZmJthXtsalVoYW9SSmhqT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFpfa2BbWmNkX3ZnbWJwaXRvcn91dJmCd3+AeIB/hoR6fHWChH6XhW5ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Ad3ujpYp5h4WDa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF5aaX9pa3CAZ2xgaHl4anJzc22DgHp/fHV0bXpnaXlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJOCepd2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanloe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFzY3JqXXF4ZXJ0iHx5Y3SBcWdqeXVzbXl4dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVElbeV9bX2pdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenh5g36Bk4NxdHR+enZ0hIiRfYF8kWtylYB7g5+Ffod9gH6GgoCKe3eEq55/eoeHgmpygHl1gH6BdG6Gbn2Ac4qAanBuZGRZX1pZWlRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGt2dWdzdnFshHt9fHh1cmx5Zml3Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cX2PfniQc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXpoXXSAb3Jrcnx+dXZidYaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d3e3p2cWViZG1yfWlqU2ddXFRLcWJQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RbV11Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sWl5cYmNefmlqYG90eG1wb3aDmHpygIB8f4mMhn11dYV5h4x8c3V1gXl6eoGMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXmVWWVlXY2ZrX11cc4VoWHFuW15YWltremJwd3ZsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9/iX52inSCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2J6ZVx3fGtub3B4eXR1ZXOEk4CIg4l7d3BzfnRjeGVccXFicXKCfHRnc4FlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVRtU0pOWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbX2FiXYRpaGFueHltcGt2gZB5bYJ+gIGTiISBdnSIdIyGdHF2doF4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cZmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNybltZWFdfa3ZkaXVqaV1ZbXNwa3Nzc2mEfH5+enZubWtkaXBjW2pyZHR2jnNbVlNlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHp0Z3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVRXUU91WlFPWFFIY3NhYEdWalFJUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp8dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnVvYWdla1JdW1VnYWxrWlxxjGRPb25cVldUZmlzaGJ0ZWRcWG50bG91dHhqhnx/e4d2j3NjZGtuYFxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2dGNtd1ZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2FGWGlPSVhUV25pZX1qbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF1ejm5iZmt5dm5vaXZ2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jjn+Mk3J8ipGEh5+Ge3+GjXSBhnN+g3ZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R8bWNmZ2hTX15VZ19rb1tebo1oTmltYFVWU25mc2tleGVkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXh0bnxrdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNfaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJiI15bpCJdGtzgXR/f4iFh5GElo95fYyPh5GbhIB8jYVzgIFzdHlzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5vckosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2hrPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYqKioqKioqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOPiI2Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf3+Af4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+AgICBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH9/gIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5PT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn9/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTkxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwcHJ4eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz88ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQkI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTkpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pz08Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgIB/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQUA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQDtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAPz1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHt8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9REJERkZEVniEhIKCg4KGiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs8PTo+PDo8Ozw8PTw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSUxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYSGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQUBDRUNDQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpKRUpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXd4ent4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT5AQkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEtHTEpGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh4enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQT0lOT1dWWFpaZHF0d3Z0dHZ4eXl7e3x9fX1+f319fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXx9fX1+fX19fn1+f39/f4CAf319fn5+f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt7e3t9fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFJSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87Qkc+XHR1dnZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNSTk1MSUhIRj8+PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05OTVBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTFBQTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJAQEdKRU1PYmVQTU9NV0tMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHV4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tIQ0NLS0xOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxMTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUpIS0lHSFBLREpOTFFOT05PUE9KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISUhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZWVFlgX11pYG5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFRkFCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlWWF5aXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QUI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlFPTVFXWlZaWVdaXlpYYWBhYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TkhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhKSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWlxfX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVpamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUtKR0tLTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFiYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUxMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1KWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSktKRkI/QEI/PERERkRDQ0NFRURGQkVGR0RESkVFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTUxbc2JkcF1sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUtKSklKTU1OTU1NS05NTltycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBcYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHTEtLTklJSkxJS0pJSUtMTU1MSUtLSlNrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISUxNSUhKSktLSUhJR0tLS0tHSEpJS0tMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISkpISUtITEpJR0hISkhISEVGS0hISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKU19ZYFhgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZER0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKR0BHRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKR0ZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9YX1tdVVhYT11cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNXYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5NTklMQkVBQ0NGQ0JAQ0Q/TEdDTExQT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVpYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9NVm5ZS0NQX1RrVmdKXVhVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHN6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPR01QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUVJUWVdXUFRQUFBTTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2NlZ2pqZWdiY2RsbXBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1NXUGFeUlZRWVNNUEpTVFZYV1dPVVBPTlJLTHJvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcaHNfXFtbXV1fY1pfZGRlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpVUlpdVVVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1NQUVVVVlNaUU5SUldUUlhVU1hUU1FVU1VVWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNnaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVdZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVVYU1dYVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SU09NUFNSVVtVVFBQTFBXVVBWUVJSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXV9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOU1hVU1FSUFJaT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWdeXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTVRQUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlNUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVlRWWVdMUlpWXFtcUlBVU1dVVVJPVlBTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZlYmBlYV9hYWJiX2BeVlleWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV5gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2JiYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFVVWVBUVlRSVVVRVFVXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxiWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZW1laWVlaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZGFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXl1fWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZqZGZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVXF1dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGpnZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNoaWdkYGJgY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4OCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+wqKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3Qqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXp6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCg4ODgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4fHp5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eXt4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eXx6fHd8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp9fHp8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgYCAgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXl5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgoGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoKBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSDg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoOEgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoOCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX+AgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgIGBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGCgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f39/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4SDgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgYKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEhISFhYODgoGCg4GAgoOBg4WFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhYWEhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgoODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6QjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYGBgYGAgICBgYCChIODgoOCgoKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiYeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SEhIOCgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhoWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGCgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIGCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWEhYWEg4SFhYaFhYWEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoKCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHh4aGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSFhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFhISDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaFhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWFhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKiYiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SEhYSDg4SDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChYiIiIeHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f4CAgH+FhoaFhoaGh4eIh4aBgoSEg4OFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgISEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYODf35+f358fH+Dg4KDgoOBfn1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn+AgH59gH9/gICBf4CAgYB/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYGCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKiIeKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4KDgoKCgYKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCg4WDgIGDgYCCgIGBgYOCgoOBgYJ/gYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKGhIWEhIWEhYaFhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8g4OEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoaIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIGCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiKh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjoyIh4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKTkYuMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHt8en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjoyKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gICAgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gYGDh4SIjYyKiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYqHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhoaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+fn1/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIODgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGDgoKEhYWCgn59fXt7fHx6d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GBgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CBgYGBgYKBgIB/f39+fX9+eoGSi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBg4OAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChYN/gIB+goOBgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOBf4GEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fIGBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhISEhIWFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4F/fn1+fX2Cg4F9e399foB+fXt8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4WGhouKhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgYGAgYGAfX9/gX6Afn1+gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYmHhYSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4aGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFhISEg4KBfX9+e3x7fnt8fH1/fn18fn6AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeHhYWFhYaGh4iGhIaFhoaFhYOFhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoeFhoaFhIOFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4eHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fX5+e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeHh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYeGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGh4aGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhIB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFg4SEgoWDhIaCg4WFhYaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af35/g397gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p6enp5e3p6enp6enp7fHl7fXx8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8ODo8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ozo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb3NvZ19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqIoL+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTTnqvqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz0/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1N+sKyrq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJehbKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STz8mUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4nayeq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4rClIecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjQ1LvImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pa2cntLRlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCfk6W8s5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bp9CLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKHQ2qWZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ6gkqeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGjpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqtackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk7PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw6Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUtPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX0xIUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXFlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmFaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yYGhfY1NRWFRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NtaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJacnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbWFfZGBQT0FAPDs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFdWVNhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ6OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpeUlJGUmpiTj5OdlpKLkX56fH90a2xuY29saHF3bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MrGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZWZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIuLjI2SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlpZ11pb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmBndWdpaXRteGxdZFtVX1lMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8jKx8zIx8jNxszPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0MKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs7Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/t7yxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLe2uLa3wL/EvMLFxcfHysnGz8LBuK+1tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAuK+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1urW5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenJ2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHFzd3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXIur2+trGnpJ6hqbGutbi2srCrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3Zve291cm1iXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyxrrKppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlxdnNtdGlrXVtqVFxcT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw7PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUUNNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+nn6iqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJSQjI6PkJOQlpWWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeYN8dn95YnZsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqSmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfX2AdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6xqqWqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Ganpqip6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJqakY6SlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2ysLSpsa+imZydnqGYm5uamJmblJWalpicpKGgmqOgmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5SZkpKcmKGdqqKmoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp5+fo6CXkZScoZyamJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJWVn5ubmKShoJ2joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj83NTg9Pj9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56boZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWgn5qSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vLKytKGroqmosamqqKenmpidmammoJmnoJ+ep6elpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODY3PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ+foqOen56bnZuUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK6trOpsq2qsrSvs66prqOdq6a1sayir6Wgoq+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKGcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubnpqenJ+lpqedoKCssa+npKSjoZ+mrKefl5yVkpqdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8vSxr6/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrrq2vrq6qresqqq4urS7rq24o6ainqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5SPjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/S08zKwsXGxsrHzr/I0MvGxMbEwLvCwL6+vrW9s62+v8LCxsTGw62+uLG4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBPDs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeSkI+Mh4SEiYeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrOytPX0dfS1NXT08jMxszNydLMzdPNxMbJycDFy8fIyMW+wrOzx8TLysrOxcm/vb68wcfEzMzIycDDv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTs5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOeoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0cnR1dbZ1dfS1tjO0snO0czO0MvSz77GxsnCy8vLzs/Fxsa2v8m+0szLz8XJx77CwsfOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09DH0NjX2NDX0tfZ1dXMzs/JzNHLzs+/xcHGxc7M0NDRyMvLv8nLxdPNy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzo9NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6ZnZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dXN0dDY19fXy8jOw8jOzMnMv8i+x8jNzc/K0M3Oy87Ox8rPz8rOysHIxsnMycvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnpWWmJWKbF9fXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08rL0NHTyc3R1dLV1crAycHFzMLHycLMwsXHysrOyszMz83Ty8XHz8zHx8rExsDFycvMz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozo7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrnL1dbZ2tvYzM3PydbWxcS4sraqo66tuLmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nKz8fDw8/IxsHGx8O/wMbLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qr65ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrCv8O6ycfIusfFxMq/vcHLxsXDvsW8vL/CxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaylpZifmKyjoKWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NLMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcXCvcbAt7vEyb/Cybu3urrFw768wc3Cxr69tcC9w7q8xrrCubO7xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3AxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3uravkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrvBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7tK+ytrq+s8S2urWsuLy9wL2wubautrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Ghnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqessru6tsK5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHHy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6u7vKt7S7vbW1q5GJkJB8eX6KhXp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq20trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6kqKKrsbKzp7yqq6irrK20s6WoraCkr6mypaeorqWntqywsre5uruxvL2+vsS/tcHAx8i3v8DEt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDxsW6vMS9uba8xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+kpKekrJ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sLekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLCsrKyxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BsYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8PGs77Fu7avuL+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippuen6OloKeemqKbn6qwrLG1oqmqqauspLW4rbavrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+fnZmdn6WamaOcm52vqKunqqusrbCyuK64ubqwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCw7usqbS5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpaCkm5+gmpitra2vsqCloq2rpqG1sLGxrKeusqe5sqa2oKKemqOhraKhqbWqoqOmnaWmo5aYnZeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK4s66pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+6qqawurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn52hm5agoaijn52onJuaqqausKubo6O2qaCfrqi1qaamrLCjtq+jtqCim5iYq6ahm6y4r6Kho5yhn6CTlaGUlpabmJeWl5yVn6idqaOhnKOqqrCtp7OrqqassrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NTUzMzk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tbnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBur+/ubm8t6emsLumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+lpKOlpp6cn6Sfqq+mn6KktaegoaKns6Glp6SupLCsq7SeoJ2UlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSrpKSwpqWiqquspaiurq6rqKmps6Wmq66zsa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc1NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uralp7G1naKKmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFNVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWpJmglpyfpKGspaOjoqOhm6qqpZmepbCpn5+cpKqdp6Gdq6upqK2toqGhlJeimpyPqqiwm5+in56XmJOKnpKNkpKVj5iYk5ugopykoKGVoKGjpJuiqqSipKqiq62lrbGppqWmprWmqqits7W0ubqvqayei3Jwb2BbV1ZVUkZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtbzHu8HHw72+trq1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OjoJSTm5aVkaiprJqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaiioqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbLtLC9xLzCxMO8wLK5r6Wqr6uel4aBd3hvbmlubm5xZ2hpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTk9RWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqqatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloJ2RkJKSkpWnqqSZmZmdnZaOjIuThoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y1q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZQU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMtLm6vsDEx7W0tryyurvDvsGws62wrrCrm6KIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkq5ymmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjICLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKanpqCftLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPRE5OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzsq62oqy1w7q6rqqrtK+vn5enfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaGOmpuioKKXpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmOm4uCiX+JmJ+inpCTmJaEjoGTfn5ziY56kIaSkJCcmpmZkJWPnY2ioo2JmqCho6OborSvrK+sn5iluKalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0ODg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+0r73Dr7HHsq2nrJWjrb+3sK+fp6ysqpaUonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSVk46WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeIJ6hZOdlIOVjpGPgoZ8knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqCgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg0NDg3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raanlaWko6CWjpZpUE1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk5LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoeFlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Td3V2eISNmXBRjYiKh3t+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoB7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnGSeGd1hIOEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ60qa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGk6SWnIyCloiPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoaPe3Z6b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2dzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpubo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkZSAe4p6hIB+foBlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c4yIg4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2woq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH13dHd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZFzc3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorp6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cZ+Uc3iAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjZqRdmx/e3xtcm5wf3pzdW1idoR/hoCGkZGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Xiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnWhmXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5boWPgnpugXdzhHpxc3l3a25pXXeHfYd8iIiPgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MTA0NjQ2NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgHODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d3oZmIho+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSf3t1i3Z8eG1vd359cXFwalpcW1pjY1dnZl1WUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iIqAdYV5X2NWTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlXBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiQgJqWgqCgl5WbmqWtk5m7sae7yMOnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GHgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3l+d3twaWNcWVlcaV1hZ2BbUE1OWVNSSVFLRE5HQ0tEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSAgoyLgomOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01RSUlLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaSjrJOotqKnwcKux694upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlWxvdYmLgZWMjY93kIRxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWUxIUFNRTk5NR0lRRERORkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6FlJJ6gJGJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8QFI1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpeXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNzfHx5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUdHTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJmOeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5PEZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbSssLeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO1o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtQREpIVE9GSExHS0hGR0hBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj32GjI+LinuJg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0pHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbPAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxspiWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q3uaicuKqNpY+SlKCGeoGAclhfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUtIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY1OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpLRUZXVFBej6StpLK0w7a4wczKt7zEvbO0wri4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7mhqLG5tbu+zL/Fxb28s8K4uri/uLu4uq2tsaaxqq6+sb28wsKtmbupla6PmJmriX6AeWhVYV9WaGNpZVZbZFpXVUpIR01SSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5STjY+XkoeHe4eBjZWKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0pMVFpUXpSvuLW7ucnAu73Kzby9wby4try8t761urLGYHWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y9uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9cXl5cVWBdaGZTWWJXU1dKRkZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGPl5KWlo6GiH2Hg4yWin+CgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7t7q2uLm0uLW1rre3mWR1qZ6tcF6irZ2YoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nL0czPzsrHwMDCyr7BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW1xZV1tfWGFiUVxhVFJMREJGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZaRm5KFiop/iYaMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOm56Nj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVlaW1ZeVllkWlBdWE9SQ0NJRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6KiouQiHyFgnB/h4KGe4dyg5KLj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSShY+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN8fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsrqrprSjoq6ipK6jp7KgiaablZORipKPiYKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tfXVxWUldSW1BKSEpKS0A7OjxFQ0U9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW51gHZ4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZKMnp+gnpGXmaCjpKezpaSyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNqYVlWUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4iGh3uFeXF7e4SFdXqFjo2eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnV5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiIg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NfY19jX1NvX09nb1s/b2tLWydXMknR3ZWRYV05RUlxHQ0ZJST9CPj04Oj5AOz5JPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNUxHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZCLjpODjIWJiYKGkJGenJqIhYyBhph7iImfl4+JjouLgnygiJCKvKCYk5eZnKimpa2ep7W/v7+4x8nNzsTNytHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoJ1dWNlYV1SVVVUTUtETkQ7PT08OTo8Pzk+QTY+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEw5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bX19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2NnKScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZKOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Qg4x/ppmIhY6DhoSApIWKi7eXnZGUlaGmoJ2dnaOutrm0q8DGytDHx8zP09LS2NLV18DX2Nnb2Nra2dnX3LZ0dHNmZmJUXVlST05IRExDPj0+OTk7Ojo6PD02QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoV+d4aboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOi4qdl5ijo4aTnZWgioqIjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNx8bPy8/MztbQ0dSt1tXY2tja2tfW2dmca3hwY2NZWVVRVVdDQElEPz8/OjQ4Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hIKFfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiY6Qq5eXpKOImZ6VmomPh5eXioWPjYF/h4+kiI2TqJqXk5aYoZiemZOcm6KytKWjvcG+x8XFyMjJwsrSzc3UqNLR1tbW2NrU09rOf256ZF9bWltMSFRaQkJIRDtCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fISHin6LorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqmarK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWSmbOWl6Whh5yZko+KkYqXm4mLl46GfoyYnomQkJuampOYl5+ToJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ0qbOzdTS0NbY09DYuW51cVldUl1VTkdJTkVBQ0U1Pjs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxLPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eIaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5mTnZm0l5WrnYqclJGNkJKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKzCyMW1ur28xcfIwtGgxsrNzcXX1tHL1J5sdmRZV1BbUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTDpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fX1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbWtq7O2jKiyrq29q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKjuq+pv7ytrrK5paWofoiHnK29sIOMjIuQg46DkY96gYiQjY6ciIiPl42LlZeUkZqWnaiasZqRrJyOmo+SjpSQkJaXj5KgkomVm6OslJaPlJydkqCdm5ifoJOanqalpKKjsLKmwcbDsLC7t8XDw7/NpsfEx8S91tHNxcqFb29eWVdcWUxKQktBRkg/QUBDOzo1PkE+PjU8Nz0zMzMyNDFBMTdAQk0+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6mwKSrsLu9qq6ro6Oep6uutbCpm6CqnKGclp+wtaeMo7u6tsG8rKmdtKWlqZSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKQoZSHl5+hs56UmZOfoJeknpqfm5+UmJ6lo6ampK+tpcDEw66ot7bJw722z7LEv8S8s9HKyMK0cHVpWVVZZ1BLSENNS0xKQUI+REU8NUFFPDszPTlCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WiouIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6nusC9u8S3rMGprLO8v6qwqqSlpKyus622taCgr5+lopmjtL2pnKm9wqO2t6+slLKsrK2Xh5qqpqWRgoyTpZaKgXWKknmFjpKQnZ+Tj5SLj42Uo5mXnJSUo56qnpGlmoyPj4+Vloh8j5aTk6OblaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMSvpbO3zL+5r8Szu77Cua3Cw8LAl2h1XlZUWFhJSkxJRkRESURDQkRMOjRESTo7ND04RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZraekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtra8rbO/ub2ur6igqai2rq2psreanq2ip6Geq7e4qqWvv8WxvbqzqKu3tK+vl5alrKigkY6TssWnlo58kpV8h5KZj6mYl5OTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39naldUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+vmKSvpKekpbXAsKystL/DucC6tKi6t7m0sJalra+upIuTlaGNdMKafZeahI6XmYywlZqalZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacm5WapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7ursLLIv7imrKutsrKjobKytKRtamJZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1K0M1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCbo6S0ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istre/wsC+ubOzxbO6vq2kr7WsuaaIm5imm3a/n4SZno6TmpqMrpehnJuXlJqfoKieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm2oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlKCMk6uckZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLJtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorL21uL7HvLe2ucKzv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLaysp6do6Wbl5SYqqGedVxZXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvKDsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJebmo+qlpWnppWtrJmiq7bEw7y+tsHCwMfDv8zFu725srC5s7/Cx7W/sLy3ubalpKurraChmaqqxKKkqaulnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqraycmKCgko6QlaielGVfV19cTUhHSU5MSEZESUI+UUlBPEdJSVxST0s9SU9VNUJGOT5HRzVDYVpLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCTo5+WpaCmqayYtrGjqrO2xcS9v7XAwrvIwb7Jx7a4tbSxs7S3wcW2vrG4tbi0n6asqqydnp6lpMGln6mtn6Sqra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGun5minqmorKOawqypnqyum5uemaWgvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma2VnY6Yk5yBjp+XlY2ho5aQpa2xq6mhoqWklZWdmIqOkZKknoheYVhiX0tISkpORkVBR0s/PktCOjlKS05dUVFJPUxXXDlGST1ETUg4SGJbS0NMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOolKuloKSframsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC0r77DtLmysLq0rJmosamqmp2loafBrZussJuqo66xqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWjrKGfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqrj52SlZKZf5GglY6Nn6CUi6Wrr6WmoZygnZGRmpOFipGNm51+X2RZZmVJSExJU0FDQElIOztHPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsmVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+boMOppKqzoqS1qpazraeipLKsrqm7sq2xtbTGwMTCtMDEvcnEtb/HwbSrtaivuKy/w7O4r622uaWYqrKrq5ifppetu7SbqLCaraCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpecoo+ajJKWmIWVnpOLkJudk4qoqKqipqCZnZWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzs6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjIzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6OdoabAp6ivsaKqtaueurGspKu0trGwubewt7i4xb3Dx729xMLFv7jAxcC5qbakrLutwMG3t6qtsbqhk62xrbKWpKeRqrmqn6axnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6KbmJuShY2Zin2LlYSNmWhma2BsbVdQUVtVQUJFVEA8O0lBODpYUGReUFdXRVlfXk5NUk5eS0o+WWNeT0hQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmM/MTY0N2dZYEYoPzhsfWdbVjuJe2NDPqefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7u763tsDCv8nEucTDv7+3w7zAtq61pqu3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56sorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpLSuqKGtrq6xqLSts6qknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6mclZeElJaKnZibk4qNlpaalqalo6CclpWWkn+PlIV6jpKCi5RkanFmb3FeRllnVkRDTVdEWzlIQzY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1FMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX15fVDE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbekrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLixs6upura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsravo5mdrKeal5+bmau3opeTkI6YnKCXlpKpnZqSf5GXjJybmJaQipSSnpmkoaKgmJaSkpV6i4+FeoyKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYF9RTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqq2mpK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y2vb+/t767sLutprm5trXCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrK2q6SZoKuom5yenJSpuJyUjo6Kl5uhl4+WpJ+blIKQlI+cmpeWlYiWj5eap5ykn5GXkZCVdoOPh3uEgYOLimxvdnR7flxMZm1bS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYFxeUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUsQS49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7SruLK4oay1ucm5rsG7w7izsbXCws7FwMG9tL2/vrq+vLLDp6i4sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2xtq6jnqOoqpugm5uSo7OZj4mNhpChn5SMk5uekZGDjJKSnJmXlZSHl5KVmaeboJ6Mk5GOkHd9jYV8e3yGiIhwcnF9fHxcU2RvXU5YZVxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEoqOkc+M0JIUyw+kGs7R0iPnKqso6qxpKmltLWytbaysqKsrr3Muq7AusextK20wsPRxca+wLK+wMK7vre7xKartquytrzAr6uxrJ+jp62pqaWwo6qyqq+ssK+wrqy0vae2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7Gsnp+mp6mZpJmZj5+mmIeEjomLnaCOiouUmo2NhIWPlJ6clJeVhpaUk5eknJ2bi5KQjol+foeFfHZ+hYOEcnFwh3RsX1pgbWFRcnBcSzyFfEY/WHRYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0VGNjtCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Grs8PDzs/Dv7+0wMHDub+zx8Oqrratsri/vrGsraukp6qwqKipsaW0rqqxrq6ysbSutb2kt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqp2ipKOkmKCblo+XnJOCg4+IhZugi4mNipeNjomCi5eimpCQm4yTkpGTo5qbmomPi4t8hoCBg3pzf4J/fHJ1i6SHeGtfYGxlV2SGY04/Z5NMRWJ5V2NZUmVVTlZVVlRPXF1hVUtNaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWS4wSmdBQTs7Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRwMC7ub++wbnBucDDrLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrKvs623q7m4prS3q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm5tqqqqqqiqqCtnJKqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6qcoqOjn5mZoJCNj5iNfoeMh4OdnYaDiImNjI6LgoWVoZmNjZqQkpGPk5+XmZaMi4N/dYeBf394dIJ+eHZ9gIedj29xZ2Zvd1xfcohqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVVNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGEwMj9mPU5YP0MsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u7+wrbmuoravycfI0cC+vbu7wb26w7++v62xsbG1vLvBsbCzqrOppLSppa6zs7mxo664srGzu6u7sKqutquqnqqrn6Ogtq6poZ+wsqG2qp6op6qjqqGira2ovrCsrq2iqKigrJmQsKGYoqCnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY2LkIODk5+Wh5GdkJOQjZGclJePioaGeHWCf3x1eHl/eXJxd2Z+hqR2aV9jaYB0ZoiMfFJYcF9LeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wwp6q3vcC7r6e5qqausMnHyNHDvL++uL2+vMi6wLevr7Oxurq3wLKyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6OfpK2sqJyeqrKktKibq6epo6ido6moqb6stLCunaqkoK6cm7OilaSbpKagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4aQjY+Df5OakoWTooyUkYuRm5KVh4l/gHJ7en58aXh8eXNubnpmg3eFimRhZl9xg3lsZnhdXlQ/V3ttVGJQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHaUkyNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaast8G9ta+iuaynp7DCysnMwba9wLS3v7rItMK0srG0sb23ub21rbi1vqyhs6errLG2uLWsn7+9qrPBtLyhr7O1qqyfrbCjnKWpqqSenKSwpbCgn6upp6GpnKWpoa28qK6xrqGro6Sunp+tppefm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouFjo2LiYSSl5CGlKOKk5KHkZqRk4CJfXlsfnZ5eGN8enBubnB1Zn9yaoRoZGZda3KMbGBocGBvPVt5bFVeTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWdZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr6+pq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbLAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq+2taemp7Czn56lpqiippmfrKipnqGqrqagppikqaCxuZ+ksa+hrKGspJynp6iZmpufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWfiZGVgouXjpF9hXxzcH5ydHRgenhobW5ubWd9cWN7bWlkYFtkhH5eWXNqcklJf2lYWk1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxlYzI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qai5w7SyraC4ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7G9w7mpu7q3p6e1qaissq60saicv7imrr24s6Cxt7CopaevsZuhpKClpaCXnK+moZ6jqK+hn6GUpaWiuLChprGrn6yjr5icqqWonpeanqWUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBhoOHi42FjZOYjY6WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGtramdmgmxlcmprZGdXYHJ/XllrdWlYRX5eWlhPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcOyr66itbCsra+1xcS9s766t7Czubi6uLqurb+ztbivv8G4q726tKWis6upq7StrrOknsO2p6q4t6ygs7yqp6Wor6uZoqecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaCZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gISHh4iRhZSTkoyQlZSNjpR7g5eQi3d/fG11c21tdGJ4dGhmaWZjbYNmZ2hkZmdoXWRhaGVaZXpiYFBzVFtbU0tKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmBzQjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+soraup6+vt8DAvLHBt7Gusra1ubi1rKq8s6+ysb2/t668vLCln7aspqe1qquvoaHFrKqosrWsrbS6naepq7Gll52qn6elkpmlraKYnaSqoZuhnJihnqe3pbCrraGhnp2hlaGmn6KgmZyanJSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIWFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNrYWZjYXN+YWRlZmRoaGJlblldWFxsY2FMZ1daYFZJR0lLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhkoyvoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm9vLutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2rrqyuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaW6qK6ioZqbnpmfpJqlnZefmJyWmqGUqpetqpyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2ptamRoZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8RU1hODo/MjQ5QDM3ODE4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnY+Psp2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4ube3rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6ewsri1rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqdoY9ro5aZnXGDmJ2lgHaSrKmel5iik4qYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eIuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINlXWRmbmpnXFtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEVHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSys7G5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/laiosbW5ra2kqKyqq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZl6OIoY+SmoehiJWfooClgKitn5WUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GVl1oWmtpWYdwa3lyh2iHhFleRk4+Rl5NRlNWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6tnZqZnZ+rqqiqvsOusrm8t8G/qqS3saqsprO1r6+zt6uppbKtpba0m6y1trWlpqmzsq2yqK+eqqGyqaCkpZyipZ6xuJWmqKi3vqatpqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWTmJSdiK6QmJWKqoyZpJ2GsYGlr6CVm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY7YfVJqYrayfH5wlXWaoaqQVk5XYU9WTUZWXFhQUFOLXFdbUEFcRFBOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaivtKqwtrSoqKa2pqi5r5yysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqqigrK2koZ2bmqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aWk5iSmYWva2qMjqp/aIWWh61mcqCflpupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99ZnujpoFYXoqrZ3yMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraeln6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6Oquamds7Oxo6Sgqq2wrK+nqKCjo7GcpJ6ZlpmdnrCpmJyjoLWzoauaoaysn52al6CjqZ2ZnqWgnJmhp6SQnaKbl6GgrJ+mpqCan6GVlJGXkZuGtZu1eYepmraZeIe0m7d/lZiYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXU+pbWJveoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdLOWBUNTAcl6CVibSnp6GtqaizrKq7t8KwvMKtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbO0qKOinaiqsqiwqKafoKCwl6CblpaXm6GxpZybpam2r6GojqmnqZudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1RaWhkUEBYZ1ljYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2p7KxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqbCptKmmnZ6frJiZmZiYlpijrqCcl6musamjno6soqeVnZeboaehmKKio6GboqKonJ6gnpWZm6ehnKeUm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4RhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGhQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk1UX2VQNUc9YU02Mi6jnpGmsK2lqbutprSlp7a7vLO7vri4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaZmZOUpauimJSnq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn5yllJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4GBlWySW7BXS5p1mHlmYa1ednaFZpeIal2vdpWej3drNXnIrrNgRFVvXWdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA8VV9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub66uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqSlqWonJSRqK2wpaCUmaieoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiblZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB9gpVuk12rXFuTf5F/aGeqY3J6gGqYhnFdq1qJoI9rbWRPSkOhXFtNdF1iZk1aYV9ydGBKVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MFRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW+uruzsrm8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLmjo6yhl5ySo6CWlZ+blZmioZGOjKqwsKadlpqnpp+MkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4aSa5hdrWBOoXyHkVJzo2x5fn1umIZvXK9WPJx3ZVRvbi5bp09jUmtlYmxaYlxgcXxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi5VXmJMNUZNXjgxQTilmpyeuqSbscCuraurqLequK+1wLW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn6CRlJWstrCmmJObrKmWjJSmmaWto5KXq7OkoJ6orLCYoaKQmaGXoJuWm5eglJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo6von6NdYerfb5uc7x0soN1eICJbZqIcG2NpHS9XXd9W2F5vGpaVlxqel5pYWNmYm55b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvU11gSzU8TFstNj85p5qforyjl7DDr62pq62xqLmvt8Sxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaesuJ2jrpiVoZGmoJOOnaOemZ+akJaTsLmxq5WWo6enlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGZm5aVo5mQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3totegHl8iGeDeWx6YouscHSFfldbp2lEZFpUZl9jXWJQZ2ZxbnVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOsqqitq6q7r7DGr7W0sLintbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spL2noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqabpauclqmlppyboaqmpqKooZGsnpeinpeWl52ej7CplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phY4ePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqWGx6gnFISm+FcE5xTURWXGZhTFtXZmNeT1ttdWtyUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZURUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6iknJysoKOam6OnrKKfqaGZrpuUpqCWlJ2fnZexpZmiqJmdkp+dpaabqKSbnpucm5KXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnd5dnaLf3yJanOBdIR0Y3Z9dmtveGxfYltvZ01YWWZqX1dZb3pvbmZTT0ZSOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDUkdLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsirrbOntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXlqGYraqlwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZmhm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSZlKKkmKSgmaKPmJWMi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6b2Z5kYGBiGt1gXmJcWhzf3l1g4aAanNid2VfaGVjZGZqWWt7cWpqXFJLUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr6hrKKRkZ6ampSSlqGbl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqJygpKyUn5+dn6quqKSiqqGrmp6foJiln5yenbCkmZ+plJqZnpKmnJqqn5yYZoWUfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbXqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4FveIJ4gHJteIRzdoiHjoN6aIRYXWp0ZF1ziGhqfHFtY11RTVdKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9eWlRPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrSunpakkKOwpre5pa6jj4+aopqTkpugmJimlnukq6KotMO3pKGmrp6dlJ6jn6OdpKqpk5+gnqCqr6mpoqmeppulnqegrJehm6WxpZidrJajn5uTp5mgrJqff72EinS0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46Ad3mBgHlwe3+GcHiEipJ4bHWRYWVeeGRfZYFiXXRobWRiWExVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvqqenprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrqy4tKevopKRmZ2mk5GgoZeboJ6Ipqukq62/v7CgqK6olpGfnaKZoqSqpJShoZ2drK6oqqWioqSfo6ScramSpJqorqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdn9le4h1dmt9h219hI6QfmuAjF5wanBnYF94ZFtxaGpjZWBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylraawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ+Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmnm6aloqCqkqyzlqWiq6qepKino7Kik5upnKKclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPSg+MSkzVkBGIRxHO0MxLiuv08bHsrOgnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrJiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJqqpqOhqpqusaKoq6+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk6NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwcnW1sCgmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoqyZqqagoamhsq2hqbKyoZyrqrGwuKaUmKaqmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hV2NtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMS89LTRPVFEdHDs8RjIsJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7WgpJiUqKu2s6ycppyglpCmrZKanKejoKqmraCjp6mws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmtnKulpJ2ro7aroLG4sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56DrH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhX9wW2xud3NqgW5aZF5nbmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtTHBs2P0csLSCLh5mpq6SruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ycpKiitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYrKGroqSXrqS6rKG2tq6enra0urO2qZqgsqSmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI6CbGh3aHhzboB0XWRjbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlVRT1FbVSUhMkFIIyolknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmaCqo7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mmq6Cjm6ymvKyUvbCtn6Oxtbutt6meq7Wnq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGXf2psfmJ9dG2AeWBoZW9vaGdoQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK2xraegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuaoKaekpSZmpOamaSjopinqqqgop6np7ykl8Ksq6OirbS7rbCpo7ayrK6ad69/kIqchYd8uq2JmGSwjGSWrn2hkISnl5yCrYyFsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtlo2lmIeUjZGSeXeMnH1jc3xig3d0gHxhamZvbmZlZk9UYltBU109SCg+OT00ISEsJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46urKmno6iarpOaj6maoZ2kn5mjoqWYnqKosai7rqSonp2OfIublqGgmZCSmpuRmZeonp+Xp6yko6Sio6i6np/Gp6apoay2t66xqqG/sbCwmIKqk6OujpuAhqSXmJCAgLjDuoSPnZSFqJmeg6yMhK+KqZ2bpquSf9W9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4RvnYB6srHHg2ursb2seXiivrt0gJSMo5mMmI2SmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdrqels6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adppuaoKiimJ2grKypuK2no5qXknuHmZGnm5OPkJeYj5iTqZielqinnqimoKGqup2oxaOhsKSstLWssqyjv6uzsp11dqqktoVliZ9wZ6yQio9ubnelkJuhgnaynJhxkY5yl6ukm5mvpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2NqcFpdZ354pmBicpCScGZkgIyRjp+UlJaNkpp6hI2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fo7OqmJK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpquin6SkoJKLpZKmmamalqKpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZamoZmupZyhq7iesMGopbSnrbGzrLCuqrynsryYjKOppbWciZaimIepm4+UnZKqtJqcpK6itZmlpKCjpJ+kpqKWrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdYN3dYeMcadtfZaTlJSBgY+Pjo6bkJ2Sk5Kdf4WTjHBoj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYl9OVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXmBhYl1eVVBLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKC3sZCOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqomZOloKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp2Yp56as6Kcpaq2p67Br6S4p7Cwsq+srba+pLPBmpOnpaa0opKdpp6OqaCMkp+irbGboqWzq7OapqOfp6ygoJ6emK2ek5qinJSQl6uZjZmal5CXn5GHoJ2VlIaUjZCOlo2Cf2aOiHaId3qIhHScaoiSlpWSiX2MlpGSlpCdjpiSnYGFl4Z6cZRyeYl/cXt+am5kXnBpYFxfWGxiT19jT1g5RkZEPTI8PTcuKiUrKSYdJjQxNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVVQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCntaqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiomcopCvn6SWqaChk5eZnK6LqpaOp5injJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaacnbaifoOutKKwr3Wkv6SzoHl7o621wJh4sKahioCqfmRcYnafj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlxgZmqmW2ApKmKZZylnJGYmZeMk5yRhZ2bkJWElIiPj5OLhnlskYh2iHJ8hoGBYWmJjJWTjFt2lZBmaI6LcXiflZRkd5eGgXeXaIKJgm55f2twZWB2b2traFtkY2FhbVFZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXV9nZ2dXUUk8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWc4ucr6Coq6eUl7mgoI+cpJ6RfoiJmp6NrJqklaiino6Xkp6Fda6PiKWZqJGWo4iauLOnn5iYi4l0d5KNl5OJk5CQk4yPkp+MmZ6kmJuwlICMm7WdtIySj72non6no3ulsruEjpCpoISMhY+xqq+MiZajmnmAi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgZGXloSammJ5iJKFjpCTi4RucpGIeoJygYGGgId0iIaXk3iWaJN0oJp0e5mBm5iEmH6QiYGCl2mMjIRqeHtxcGdleG1pbGpbY2loZHFaW0hTS1BARTUtWVNUNikhMDk9Pjc0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpaeznI+Dnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2FnrixqJ2ako+FcHWQiZWQipOPjpuLjpGdkJWeopSdqoaftIm0mq6Lyoirr4q3hY2whLOzh6mPqpqNnXuoj3J7d5yOppZolaR5tIyhoKiqlJrCgoGriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfYaUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePommdgZ2WgJmAiouDiJhvjZKEZ3d0fHdnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBKZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOotaGvf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x3m5yOoJGHnaOblpiXhaG4raWZm4yMfmJtj4uTj4yPjIyXi4+Rno2Snp+XoKZ9oaeHrZ2glq6QoJ6dkYeCoY2us4mkj6ycjJp9onWAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX56mGxdfZhvYVRyh11gbXqEYFllgn6FgZlyqKprg6NucqVvn4GaZ2SebFpsiXtlWV+CfmFXUHB2ZW90cWpqb11pb2xqZ1dmTVxXRThBNEZDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8qq6imZaeoKWrq5+crbShp5GgoKGnnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhqykh5yRipiol5makYekr6ailZmHiYBpboiIi46NiYqNkYuPkaGKkpyemqGjf5OBj6OhlKB3nJaQp4OjqYCHrLGIpXqNf4SafKJwcpOHlXuejHlth5uLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgcW5fHGVtoxygZukZHWsq2F+ap2zfm5+iYSPg4yYcYCja3Kjcp6BfKNenJmzlXB8l56zdHJbnrKDamJxdHVxaG9YamtxcGRbZ1xhS0M9RDZRQVlxMjxTR19KUj08Mzk1Ojk2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4taytoJqhm6KjpKyamrGsq5OYoZmhpZqalJ6sm4uJkXiLhXGAlYyJkKGQk5Sdl32Rio6ooIeYjomRopObmoyKqKekno+Wh4R+anqGfn2PjYOKj5CJjpOfgZScnpufnouJd5yYoo2gcqGMiamJnaiSmauugq6NfnqgmXmjk3iAc5eHjJx9lJ6Gm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXeFnmiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX2ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE43VUJRbTRKWlpeTlpEQDE1MTw7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11ZZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7Gvq52lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIByepaIi5aWhJKUmI96i4SWpJyJlY+Gip2SnJuIj6iin5qLkIqAgGmAhXl/lot6iI2Oh46VmX2SoZ2foZKXcmifiqCPjHCSjYKpiZqhpaqjq3+wrqSiuJd2o7Oio3+IlHideqmYf6KPn52ZiZhyoH2IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4x5nmNNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs399mZKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUGdEUlZcYVheSUQ9Qjg/QjpJRTdMRVhBV1JbVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbCumoRTX6GntLqysqiaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniUhI+bi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6onJqVioqKfINshIVxgqGLd4SMiIeRmJR6kaKfnaKHrYZ9tYSPnp17ppZ6qYKXn5GMpKGAp2l4bn6Zc6BzcXydhZhvk4Kse6OEp5+bg6RwX6lodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iLdauzqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGima5rTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZfYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSUtCS0U4UEBRTlhTWE9TUWBlZGlTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGdobWiYm3+wrFRdS36qr7G0sLKinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoeFe3B9g2h8j4KTmoF3kY6PinCAho+TkWuYk3yIkZKjlYKNqJmTkoqFiXmDdoiAboGfhnd/kYWGl6CVeJGgopmfiLOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtr4qXi3+MpI2Vg6+jlXe1trbKonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3GbiXSle3p1YoSDbn6gbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15pdmt4hmZrZmJzdG9sVVtSWWhPUWdJVUxYUlVcZ2tuVWdXTUpBSU1LSEpOQVFKUGVjam1ldXNzf3l7bnSJentVUU5tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2Ir6eFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l6B5dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWjJGLgIh6gH2LeXCPoIV5gJSGiJWelH6SpKablZaEZm54nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aBiZSWj7lukIqiYn2ao5eJbnRrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GKl22hb1KIj26gXmSnVItdVJhtbXNrcYFtcGhrd3NqblFWVVVlWFJsSVhPW0hXaGhzallrVlBSRVZcTFhSYVVoal53dXt8cH18coN7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52mmaZ7ZXRtjKeupamwsaWfi3+VqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIqKfJebc3WJfZB8ZYOHlYqJlZqCfIiGlqaQgKGqj4SQioGJfYCAjnNpj6aDfYWSjIeXn42GkailnIimeJWbfqWJloyymZ6RhK+Xn6V6mIl7qXWokYSabqWijJKEjIO8bXylr4KHhYeVmJ6jfqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gZ5mGdKtmnq2MtnN2voykk1mDpo2rYXZydG97dXBian5uZ2xSVFhUYGBcakxcUVtIXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3OEfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqqdgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+MhH6Xk3R1hnKRg25/i5KGhZSPfHuBhZekjX+kpI2AjYmElHWCh5NubIuogIKKk42Im52IipKpop+Pf3STl4h+gXmUr6R/gp1xj4Z5k46GgXtzqY1xfX16l5abhY54e319hpOVk4t3kpqho4V8f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnJvd3hvXGuFbmlmVlleVlxlamNVYFRdUF5vd3lranZkaWpqdXtwcXRzYW90YnR7gXh1eoJ1f4B/gXmLhYJ+e26AbWR5bl5XbmhodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9gjpS5qaeLoaObpqSZpJ2roZ+Dg5apkZ2fiJmmmqiZg4Gci36WlIeOiomNcoJ8jnx+joR7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhI+PhJWCho6Yd3GEqoWNkZuOh52dhoqapp+gq4OIjZSbf36Kl62okJOokXlxn5SFfJVwgKyHcX6VcWpwfYGfi3+RjYpnbV2EjI6dnqGRdJeOinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBbYKKdm1jZWN5g3qVWlxpZ252W3t5d3Vuc3KDZltsiWtrYllYXFlYa3FbXl9ZXVxlcn16dG90YmpqaXt7cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZvdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIeHinF9gIp2hIuBhJaKcm+Ac5iHhH6Tg4OGioJ6gIOKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIWHoKmeoaKji4eSm52jmparoqioopOdiZmRfnqRkIaqf3+TkZKTnbKmmpSejoywkZiEp46Olp2ii5KdhYqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYqIi5GnkYSHjoeCi4+KeYOIhYx/dGqBg3x5mWlyaGFzinF+e3d3cHd0gV1dboZobl9eWVpcU2dxVWNbWmBrZ3R7e3Jub2Nqamh+e2x4fnBob29rZoB7coKAd399f4R7bYOMhXx6eXx9eoR5T2R3a3NucHplbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeCjJqdkoapnYJyio+FkpGLnZF8jXupg42RlpSNm5WFhZqln6KanoaDkpqZmZCZpqCmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZ2TnY6NqIyRgJ+OipWcoYSQmYCIj4RweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyOh5yGhpB2go1+fnRzfIqFfHqOj4WUqJCHhI+BgomIiHOChYWIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcX3B9bXRgY1pbXlBmbFNkWl1gamh0eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2FdnGCjYd+e3t9gHuCi2BpfGt1aGmDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqNhnyKkoOMgoKCbXt+d3KAhX2KkH1raH2Bl4mBiI58foWEh3yPgY+bm5CIppt/cIuKi5KGoKGKhYx8qJCHjpGVkZSRd4yjoKGdlpuAgZCamJONmqKipJuYkpx/kIh7goaRiaOBfo2Nj3yYpKCgkpqQj6WLj4GckoqUmZ2AlJR/iI+CdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqUkYGZgIqNdISKfn9ze3yNhnx7k46El6aUjIaQe4SFhoNzfoCEhXhkcHp/d3lwbGpmXn1zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWdUZFheYGdpdXiBcGZrY2xnZX+Bam19Z21wanx3hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoRudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWino2Xf4yhioiblnh8hoh+hIp+iIKBf3B/enN1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aUhJGJlJWRkHWRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImY+gf4KLjoxzmKOeoJKYjo6gi4uDmJiElJebgJqPfYmOgndyfm57ZIB9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5/lXmOi36CiX59c4F5i4d7hpKLjJmkl4OEi3aHg4GAc3h/hoJzXnZ3fXJ9dmZsZWB/aWp3c3R1fXF8Y2Rhc291cm1hWV9dWmpjUmJXX19nanR4hnBiamJrZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2p5uKmHmXnIuMmZB5fIGMfX2De4CCgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkIKPjpOWkIqAj5egmpKQknOAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqSnHyIiZCJb5idmqKSlYqLnYuGgZOdgJSUl4ibin2KioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiGgY91kouGe4l/d3qCf4iCfoWPh42VpZF5hYJ0iIZ7fnFyfoSAa2B5dHlwe25hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohqX2lkaWNod4dtZmxoaWxngHx6d26PiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2V2Z21sYXpoanx7eHBhd22LgZmZq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8n5ORl5SJd357inx8gHZ4f4Bvc3N6b4V8gICJfnxgW36PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyEj5eRlI2IiIySnZOQjI1uhJCPkYmemaKhmJiKl5NwjJyGaIqbkZZ7iYWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdXN1a3FudX2LdW+GkY6ScnSAfIKCin5nc256f5uVfoaKdpKNg3WKe3GDgIOJfoaOi4aOlquOe4h8foqEdnxubH2CgGFmd3N0bnphXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcH6HZV1paGZiZ3CNbmNoaGVoZ4B6d3RvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t8e3N5g2pqX3BodH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmKOooaebiIuKgY6chpKadH+olJGNh6GNlpSRgXR8doV4eH9yc3qFbHFveGyJdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ2Kj4aSl5aFiJOYjpaLio2OjJ2KjpGDbYmLj5GKnJahnJmWhpmJbIimhWiJoIyTgI2FjIF4lJiSnZGQiIiTjX9+kJl9ko6Rj5uTfYuBhXB2cGxub3B8hmpzg4+Zi3J4gHWCiYN6aHVwd4KbkH2KhnuWk3x4inZyjH2Ij3yMiIWKj5yliXyEdoGKfnd3a2h+f35bcXJxb293Wl5wYXBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFJZZWVhdG+EgWFda2xkYmZrkm5gZmZfZmqBdXFyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4aLgHt3i39qcGN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShYubjJaOjHpyeHSCcHKEdHF1iGxubHRsh3aCfX9tblVRgauUh4J4gHZygnmCoIKQgZKSmJqRmHeQeoKMkqOak46IlJiSg4WVmIqSi4mOj4idhJGLfXKKhYiPiJyZnpuXloGVgGmJn4ppiaOKlIaShIpxg5GYj5qNj4uLjo13e5ORe5CMjpOXjn2JfoJsd2pvbGxte4Bien6Ql4J3e4J4g419eml2bXaIl4yAiYh9lZJze4ZyeY98jI98in+FjpGfoId9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BNW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfW9scXOJfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+iZiSjoSImI6Pj4R3dHdzgHBvhHRwcYNvaml1bYJufHxtdHNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFj52hk5OQiZKak4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR7jndpjJSKboumh5WKmISGY4yRmI6UiZaLjImLcHqVinyOiYuUkot7h32AbXxlc29rbXt6W4F6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cWtkbnyAaWdzbmdpc2xTXm9lcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19ddE9NS19lYlt3cIlzXFtkdWBiZWWOY2BmYlhpc3Nta3F2i3xzeYaCdnd+i3OAh396iX9yiYeBkImJfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSdkI6FjJeEk4+IgXV3cHlxb4RwbW1+cmNkd3B8bXl8amhsY6Sawdyu76JzbHaDdYShhJBulY+Vn5OagJFwhYqhlomOlYqQnJWCgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQd4x3cIqLjoCNp4eUi56Ghl6LlJeKjoiNioqEiWx8l4N+iYaLk5CHd4d/f2x9ZHh1am96dFiJe5KIhnt/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJwZHJ2f19ybG9haHRmUmBxZ2tVX25zeWFyY2BpfnFzbltjc2FjVm5aW3ZMTEtiZWBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3aEgXh4fIlxg4V9fYh7dIuIh5WFjH9/mHNodXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn42OfJaNf5qIhXxzd3Bzam+BbGpsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaJmYiMaJePj5uUkoGIcIWIn42Fi5WKjJeTe4ySh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjXaIf3GIhYyKnaWGl46ghIphhJWPhoiFiIyGgIdofZSAfoOFi4+Pg3KIgIByd2h2cml1d2xajX2Tg4Z+gYSBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIpucXmLhXRqb2lvdX5dcmhtXGl0X1JkcWlmU19xdnRgcGBdaIRxc2pXZ2lkaVdtV1tzS0lLZGVdYXFyhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgX57dnqIc4WEfH+HdnaJhY+YgYyCfJR2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp9ipmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3twkpCMhWmYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hYh5hoOOlqCiiZiSoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag46QkX9uhH6EdWxtd3V0eHZrY46Cj4GGf32FgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaXh6YGdpaVhrdVlSaXJpYlFicnhtYmVeWmqEbnRiXGhgZW1eblRabU1HTmVjW2ZtcH9rWVticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYCSlXyJhneJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYePhIqNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXB+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot7ioZ8eomLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEc4GKd4d/jJygnImWj56BiWZ9k4J/hYKIiHGBfWZ+jHx5f4CJjZB+aoF+hXZmcHl4dHh0bGqPhouCi4F5g4GFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV7dGJbcGJXbnFTU25zaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBQWWpRRFJmYFlqbWx7bllbXWxiWmJvdmRnXF1ga2lja2pzdoGCcG5+fIB0dYN6g4N9gYV2fYiBlpB4hIt1gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraneEc2yTjYafmZ+ZhYdufYt1aXeWjX6AiYOVl4p6kJZve3Rxa2pkYHN6aF9lcXpaYXJ8eWdweWFlZI+xsndLYlql2dCWcXqQio93fJOKhJiQi4Vua4WRkXp5koaBhJiJe4Z/d3eJioSWgG+LiHF1fntqeYWDpZCDk42EgHCAhXiGfImfnJiOlpKWhYhwe5OCfYKCiIJtgXZogIV5coCBhYuIfWZ+f4V2ZHFzgGl5cHB1mY6Gg4t9d3mBhHqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Zoe29eWHZaV3BsTldxc2dgS2x3dGFeXFtadX5zcFhnXmdqcWBvTldnUT5YZV1ZbmpneXBaWlhqZVljcHhfZ1xeZWxnZmtpcXd/h25sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb2+BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmImBfI6NaHhza2tmX2BveG1fYm94XGRrgnpgcXVfZWXU6r2LMjo+i45/cXmFh42MdYKWjH6SjYt+bWuEjIx1fY9/hIGUiHuCd211hoSDl3duiIVsdXt1ZnmBg6aLgo+LhH5ugXZ5hn2JoJOPk5SVjoyHf3uShnh/g4yCa39xaIB+eW58fIOLhHhieoWCcmVyaX9udXJ1gpyMgYCGgHR2f4F0gnBbboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bmp2gH90c1tnZ3VuV1Z8U1lvZEtacnJlW0lxeG9cW1tZXXV/dGlaYltoZm9jak1XZVA9XWVcXHVlYHRvWlhUbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9goCCenWCgI2ThHCAi254foB7e4iTin9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZnJuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9rhIKHdHmJeIh8kod5fnJmdYh+fphvcYd/aXZ5bmZ5h4SkhoCHjIp/b4B4goSAkJyKhZeTmoqMhYl8kIhxe32Ee2h+bGqAe3pqe3eDiIFzYHiCf3Jlc2d2g251fIaWkoJ9g4FweHp8dYBtWHCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bb1tOW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXWJoa2dtbGhwd3ySa2iEin18b35+fIKAgXp3gH+Ki4NxfIdvcniDf3uJjI+Dan17bXZ4dop2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZl9wb19gZ29mam6JdGF0b1thZGp1eoC/nKakyLhxhYJyknt3hZKCc5CLh3Jyb4N6g3N0h3SHd5OHeHlwYnaHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOBdYd8g5aThnuZkJeQiIKJe4mJa3h5fnRnemhrf3lzaXp3gYR+aGB4iX5sa3RofIFpdoKMkpV/fH+AcXx3fHSAYlZ4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353j4aEd2pxaGyHgXFvXGZgcWxJZHVLXW1VU1lzbmJRT3R4YVJYWF1hcINzXGJcaWVlZGtkUVtwSUNjYFtjb11deGdUVlV2XltlbmhWa11gamdlbm5ocHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDb3eEcm53goJ+iIuTf3CAfHd4eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGRZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3N9dn9vcX9thHOThXh0a2B5gnmJj2ZyhHBodW5bbX1/kJJ/gHiRk355fG+KeISUjod3mY2TkIiGhXyAhW10dX5sZnZkbXt2bmt3d4CAfWFjeYd6aXZ2Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1phV1ZVeG1iUFJ0dlhQVlheYHKEb11hY21lZF5vY1RccUZCZV5dZWddW3piUVVbdFtaZ2tgVmpeYG9mZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgYmNi3t3gHiCe3yFh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIWDdIWGhHiKe2JubFtiW1tgVmlzYmBbZ25vZodyYXFlV1xia398ys6HuaFqbW2Ja3GDcXuDiX56kIR5eHN4dHR7amx1YoN1kYF2bmZffYJ6jIplcoJranFjWGx6hJuIgYFylpV3f31wi3OFjY+KdJqQkomGi4N7eX5xcG98ZGdwYW14cWttcXh+fnpdZnuBeGp2eWaDd2h0iIyOln5ziWtvfoJ5b31eWXSAbXSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3JhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hWldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZG9ZWmpoXVdnYF9yZmpocmdwc3eGeG6Vi3R/end+eoOIf3Vyf4eFjoJwcHx4dnZ6hYWHjIZ6e390in19hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1pcXVRnc2RgWGRxcmeAcmJrZFZaX2p/eL6ue5+2bWFzhGdzenF4gYV6fYt+d3dydW97dmVqbmCGdY6Ac2lhXn55eYuEZnF/aGtrWlZvd4migIR/cJmTcoF6d4VwhYWVi3aYi46JhYmFfXl0cm9oeF9pbGBtdmtoa2t5eHt3W2d+fXlmc35thXVldYaOhpeAcY1oa3uEdW52Y11yfmx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh8aGFOVXVrTFBUVV9ndoNnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1pWV1rZFxZZGJedGZsZHFncnB1gXdwmYZ2f353f32Fh311c4KIgJSCbnN5e3p0c4SGiYmDeYF+dY5+fISKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkn9yjoFxhoJ/g4BwZmxmV11bXFpTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeXxoc3VzcoGDd4CCeHZydW1qenFhZ2tmhnONg21mXV99cHuJf2lteGdqZFVXcm+MpXyEe3aWkXR9dH59cH9+lIh5m36Jh4OHg311cHFsZ3Rba2debHRkaGZpem98clpogXd1aXGBeIJ3YneGi3yVgnCNa257g3JndGZhb3tnc3iKfH5jd4R3a2xydnxyfHt1f2h/gIB5d29kZmJthXtsalVoYW9SSmhpT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFlea2BbWmNkX3ZmbWJwaXRvcn91dJmCd3+Ad39/hoR6fXWChH6XhW1ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Bd3ujpYp5h4WDa3R7enWCgIt5boRzeYR9goN2b2poZVZdW1pZU2JuZFtYYXN7amhsaWBiWF5aaX9pa3CAZ2xgZ3l3aXJzc2yDgHl+e3V0bXpnaXlqX2VuaIB2j4RmZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJODe5d2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanlofG1bboNzdWtwgX56eGF3hoV5kYZ0iXJxeoFzY3JqXXB4ZXJ0iHx5Y3SBcWdqenVzbXp5dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4e2ZfbnFqZF1WYVVublZKU2dXZV1YTVVrVElbeF5bX2tdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR/end0hIiRfYF8kWtylYB7gp+Ffod9gH6GgoCJe3eEq55/eoeHgmpygHl1gH6AdG6Gbn2Ac4qAam9tZGRZX1pZWVRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGp2dGZzdnFrg3p9fHh1cmx5Zml3Zl1kcmd5d5KAYmJUZXBogoV4eGdpamFXVllnYo6nb353gIuOe3Fyf2l7cX2Pf3mRc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXtoXnWBb3Jrcnx+dXZidYaMe4mIgoF5c3aAdmJxbltydGNxcoV8dWVzgG1hbXtxa2p8e3ZzZ4d3e3p2cWViZG1yfWlqU2ddXFRLcWFQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RaWF1Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sW15cYWNefmlqYG90eG1wb3aDmHpygIB8f4mMhn12doZ4h4x8c3V1gnl7eoKMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXWVWWVlWY2ZrX11cc4VoWHBuWl5YWltremJwd3ZsYVlscnJmdHVva4N3fn94dm1uc2RodGVbZ3RldXaReV5cUmZna4OCdH5iZGpcVFddYWKOpGl4c4OGkXlucXxqem9/iX53i3SCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2N6ZVx4fWxvb3B4eXR1ZXOEk4CHhIp8eHBzfnRjeGVccXFicXKBfHRnc4FlX253amVoe311b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVNsU0pOWldqbHJ8ZG1tc2NhWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbXmFiXYRpaGFueHltcGt2gJB5bYJ+gIGTiISBdnSJdIyGdHF2dYJ4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cJmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNxbltaWFdfa3ZkaXVqaV5ZbHJva3NzcmiEfH5/e3ZubWtkaXBjW2tyZHR2jnNaVlRlYXKAf3KCXWJjXVNZYFtjkJ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlheGFcfHZqa3JveHRzdWlxgpaEh4CFd3Rrcn5vZ3hYXWxuY3JzgHp0Z3B+XGBxc2Nha3OAbW52f3NyeGtwYVxlbGx6YGZSZVRXUU91WlBPWFFIY3NhYEZValFKUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp9dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnRuYWdla1JdW1VnYWxrWlxxjGRPb21cVldUZmlzaGJ0ZWRcWG10bG91dHhqhXx/e4d2j3NjZGtuYFxtbWNzeIdrWVRWY2R4fX1xhl1kX2NUWl9YYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzaHB/cXRwVFxna2ZxdIB2c2Ntd1Zjc2xcYHBof2dueH5zc3NqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2BFV2lPSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3VaX2VraVlhYF1ejm5iZmt5dm5vaXV2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jj3+Mk3J8ipGEh5+Ge3+GjXSBhnN+gnZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R7bGJmZ2hTX15VZ19rb1tebo1oTWlsYFVWU25mc2tleGVkXFhvc2txendya4d6f3acenlrYWVsbV5gbmplcXh+Z1lWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbn1rdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKfIlucmdxfm50bmRbYWlpb3SAdHJfaW1TZXJlVmRwZHxlc3h9d2twbWtgWWFmZ3RcZFVgVVJOV2RRTltOT0hkb1xiRllpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2c3uDcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5KElo95fYyPh5GbhIB8jYVzgIFzdHhzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dlkKGgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX12QpaOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiY6PkJCPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOPiI2Mjo+Ij5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqHjouHjYeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSMi4aPhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/f39+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gYB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJQUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU5NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUtPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9PTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRVFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FBQUBCQT87Pjw+Pz88ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+BgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH9+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUNEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJEQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFR0ZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+AgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVWyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4eIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhEQkA1Nzg4PTo8REJERkZEVniEhIKCg4OFiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQT88OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjXo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs7PTo+PDo8Ozw8PTs6Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ojs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg5Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYWGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4+Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4eIiImIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpJREpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW9xdXd4eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT1AQkNETG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0tKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkNEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5PUHmGhYeGhYaHiIiIiIiIiIiIiIiIiYiUnIyKiox9YYqLi4dsW2RVOlhYWFNRPkBWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWllXV1d6a1haXFxeU1BQT0lOT1dWWFpaZXF0d3Z0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lSTk9RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZFRkZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt6e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz89PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8enx7fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fXx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEVDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fX19fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkVQUFVZU1RPSk5PVVNTXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05NTFBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RQT1BPUU5RT1BPTEpMTE9QTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDP0JFREFAR0hHSEZGSEpNTERHQ09SQzhFTVNdZ1NRU0FHVU9PUVBQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NPT09MTU9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CRD49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NVktMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8endzeHR4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEE9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BSUEtHQ0tIQ0NLSkxOT05JSklHRENDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWdubGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUlIS0lHSFBLREpOTFBOT05PUE9KSklNUlVVUk9YZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISEhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFR0FCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlXWV5bXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QEI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlJPTVFXWlZaWVdbXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhLSENJSEdJR0ZESEtJR0pITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWl1gX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREdERURGRkhIRkhHSUtKRUpISEtIRUZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBfYWBiZl1kYGZoYGVpamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIREZFSUhGSUhKTUhISkpJTEpFSktISUpKR0tKTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlFQ0dJR0dKRklMSElKTUtNTEZLSUhLS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUtMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhJSUdISkZES0pHSEpISUtHSkpOS05MSUxIS0xKWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSkpKRkI/QEM/PERERkRDQ0NFRURGQkVGR0RESkVFSUtLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTUxbc2Jkb11sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURCSEhHRERLSEdLTU1KTExGSk5ISktKSUtKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBdYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3Vob11gc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEpISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGpPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN0dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW11cG5zc3Z0SUtISkNEREVAQD1DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklISUtJS0pJSUtMTU1MSUtLSlNrYllpXl5pYnJyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpJS0tMSklKTE1TW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVHSUpISUpITEpJR0hISkhISEVFS0hISk5LSE9cVl1PXVxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0dFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKVF9ZX1hgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZEREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZDR0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhJR0BHRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNFS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRUBFQkhIQUBGRUNTXVleWF9YX1tdVVhYUF1cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNWYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgXmJjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5MTklMQkVBQ0NGQ0JAQ0Q/TEdDTExPT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVlYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9MVm5ZS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVNUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHJ6fX1+gYOEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdJTVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlFxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoODgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPSE5QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUlJUWVdXUVRQUFBSTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBZYFpYS1RXUGFeUlZRWVNNUEpTVFZYV1dQVVBPTlJKTHJvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NtYF1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFKTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHdeWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JrZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhaWlRRUldbV1dXW09SVFdXWFFdWFZcVVRPWFJXWFhZWmBcaHNfXFtZXF1fY1pfZGRlZ2RkY2JaZGJnZmZtbm11ZmZnY2BmXl1nYGRsZ2Vna2hwemhnZ2t1amhoaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVFQUFBTVVJYV1xXUlJQUVVVVlNaUU5SUldUU1hVU1hUU1FVVFVWWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE1RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVWU1haW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVZZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1lbWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTU5RVFZVUlJSVFdVWl1cWlZWUVJXWFVbW1ZQU1VVVFVYU1dYVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFtiXF5dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SUk9MUFNSVVtVVFBQTE9XVVBWUlNSWE1PUFJVWFVUVFJUWFhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOUldVUlJUUVJZT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjXlxiYWJfZGdpZWdeXGRgYWBhY2RfYl9aWl5bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTlZRUlpSVFVUWF1XWFhTV1xYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW1+bFtVWlZRUVRcVFRUVVRWWVdMUlpWXFtcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllZWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5eZGNgXGdlaGZlYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntpWVlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVNXUVNWVFhYWF5eWF1bVl1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV9gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1cGlaXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFRVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxhWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoX11dW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZWllaWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFhcW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXV1dWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYWFxcX11gX11bYGRcXFhaYmVjYVJcWU9YVlhZWFlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYmNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXW1xbW1lbW2NgY2NjYGJkYWBjXmBcXl5eWVhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNpaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlZNWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PYWiUrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5etUExsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXp6eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDhHdzc3Nzc3J8hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z5fHp6eXl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9enp7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eX14fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX15fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5enp5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKAgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYGBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/fn5+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoOEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISBgoKCgYGCgoGBf4CBg4GAgIB/gIKCgoODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIKAgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SDhYOBgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGCgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgICBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4SDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4KCgoGAgYCAgICAgICAf4CAgICFhYaFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4iFg4KAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/gICBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SFhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aGhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn58fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX5+e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgICAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH19fHx+foqCe3p7enh6e3p8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUkYuMjI2PioaGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fXp8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p7fX1/hoSCgICBfX59fn99i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fH5/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+LioqMi4qIhISFg4SDg4OCgoKCgoKCgoGBgYCCgoGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5+f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjYuKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCMioiIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeHi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+EgoSIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYmHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6AfX1+foCAfoF+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt7enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoWEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYGEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgYKDgYKCgYCBgXyAf36AfX59fn+AgIB/fn9+fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B+fX18f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn9+fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t4enp3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoCBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+eoGRi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAfn99foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoKBgH+AgoOCgIKChYN/gIB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAf4KChIGBgoKEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoKBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX5/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgoGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBfn+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4F/gIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0fnZ1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgX+Bg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBfoGEhIODgoR/gYSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYSDg4OCg3+BhYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4CEg4B/fn1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fX59foKDgXx/gX1+gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWEgoWGhIWFg4KDhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIiIWDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3prc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX17fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXt8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fH5+fHx8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eGhoeGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn99f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFhoWFh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYB/gYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXl6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHh4iIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeGhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKDhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoODgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p5enp5e3p6enp6enp7fHl7fXx8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYWFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnt9gX+Ag359gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzExMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2RhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDY5IEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2CisyODAgMSA2NDAwMAorMjgzIDEgODUzMzMKKzMxNyAxIDEwNjY2NgorMzE4IDEgMTI4MDAwCiszMjEgMSAxNDkzMzMKKzMxMyAxIDE3MDY2NgorMzEyIDEgMTkyMDAwCiszMTcgMSAyMTMzMzMKKzMzMCAxIDIzNDY2NgorMzUwIDEgMjU2MDAwCiszNTUgMSAyNzczMzMKKzMzMyAxIDI5ODY2NgorMzI1IDEgMzIwMDAwCiszNzYgMSAzNDEzMzMKKzMzNSAxIDM2MjY2NgorMzUxIDEgMzg0MDAwCiszNTAgMSA0MDUzMzMKKzMzOSAxIDQyNjY2NgorMzI5IDEgNDQ4MDAwCiszNTAgMSA0NjkzMzMKKzMzMCAxIDQ5MDY2NgorMzU5IDEgNTEyMDAwCiszMTYgMSA1MzMzMzMKKzM0NSAxIDU1NDY2NgorMzU3IDEgNTc2MDAwCiszMjUgMSA1OTczMzMKKzMzNiAxIDYxODY2NgorMzM5IDEgNjQwMDAwCiszMTIgMSA2NjEzMzMKKzM1MCAxIDY4MjY2NgorMzM4IDEgNzA0MDAwCiszNTMgMSA3MjUzMzMKKzM0MCAxIDc0NjY2NgorMzMyIDEgNzY4MDAwCiszNDAgMSA3ODkzMzMKKzMzOSAxIDgxMDY2NgorMzMzIDEgODMyMDAwCiszMzMgMSA4NTMzMzMKKzM0NSAxIDg3NDY2NgorMzQwIDEgODk2MDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmFmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsNDQzIEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2Cis1NjMgMSA2NDAwMAorNjM1IDEgMTA2NjY2Cis2MzQgMSAxNDkzMzMKKzYyOSAxIDE5MjAwMAorNjgwIDEgMjM0NjY2Cis2ODggMSAyNzczMzMKKzEwMzYgMSAzMjAwMDAKKzEwNDAgMSAzODQwMDAKKzEwMDkgMSA0NDgwMDAKKzEwMjAgMSA1MTIwMDAKKzEzNTcgMSA1NzYwMDAKKzEzNTMgMSA2NjEzMzMKKzEzNTEgMSA3NDY2NjYKKzEzNTEgMSA4MzIwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODI1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE2MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTQgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorNDEgMSA0MDAwMAorNDEgMSA2MDAwMAorNDEgMSA4MDAwMAorNDEgMSAxMDAwMDAKKzQxIDEgMTIwMDAwCis0MSAxIDE0MDAwMAorNDEgMSAxNjAwMDAKKzQxIDEgMTgwMDAwCis0MSAxIDIwMDAwMAorNDEgMSAyMjAwMDAKKzQxIDEgMjQwMDAwCis0MSAxIDI2MDAwMAorNDEgMSAyODAwMDAKKzQxIDEgMzAwMDAwCis0MSAxIDMyMDAwMAorNDEgMSAzNDAwMDAKKzQxIDEgMzYwMDAwCis0MSAxIDM4MDAwMAorNDEgMSA0MDAwMDAKKzQxIDEgNDIwMDAwCis0MSAxIDQ0MDAwMAorNDEgMSA0NjAwMDAKKzQxIDEgNDgwMDAwCis0MSAxIDUwMDAwMAorNDEgMSA1MjAwMDAKKzQxIDEgNTQwMDAwCis0MSAxIDU2MDAwMAorNDEgMSA1ODAwMDAKKzQxIDEgNjAwMDAwCis0MSAxIDYyMDAwMAorNDEgMSA2NDAwMDAKKzQxIDEgNjYwMDAwCis0MSAxIDY4MDAwMAorNDEgMSA3MDAwMDAKKzQxIDEgNzIwMDAwCis0MSAxIDc0MDAwMAorNDEgMSA3NjAwMDAKKzQxIDEgNzgwMDAwCis0MSAxIDgwMDAwMAorNDEgMSA4MjAwMDAKKzQxIDEgODQwMDAwCis0MSAxIDg2MDAwMAorNDEgMSA4ODAwMDAKKzQxIDEgOTAwMDAwCis0MSAxIDkyMDAwMAorNDEgMSA5NDAwMDAKKzQxIDEgOTYwMDAwCis0MSAxIDk4MDAwMAorNDEgMSAxMDAwMDAwCis0MSAxIDEwMjAwMDAKKzQxIDEgMTA0MDAwMAorNDEgMSAxMDYwMDAwCis0MSAxIDEwODAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NjAgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorODIgMSA0MDAwMAorODIgMSA4MDAwMAorODIgMSAxMjAwMDAKKzgyIDEgMTYwMDAwCis4MiAxIDIwMDAwMAorODIgMSAyNDAwMDAKKzgyIDEgMjgwMDAwCis4MiAxIDMyMDAwMAorODIgMSAzNjAwMDAKKzEyMyAxIDQwMDAwMAorMTIzIDEgNDYwMDAwCisxMjMgMSA1MjAwMDAKKzEyMyAxIDU4MDAwMAorMTIzIDEgNjQwMDAwCisxNjQgMSA3MDAwMDAKKzE2NCAxIDc4MDAwMAorMTY0IDEgODYwMDAwCisxNjQgMSA5NDAwMDAKKzE2NCAxIDEwMjAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzYwMjcgMSAwCis2ODc5IDAgMzMwMDAKKzUgMCA2NjAwMAorNTMyIDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNDU4IDAgMTY2MDAwCis1IDAgMjAwMDAwCis0NzUgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEyNjIgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1NCAwIDM2NjAwMAorMjcgMCA0MDAwMDAKKzY5NzEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzYwMSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzI3NiAwIDU2NjAwMAorNSAwIDYwMDAwMAorNjU4IDAgNjMzMDAwCis1IDAgNjY2MDAwCisxNjgwIDAgNzAwMDAwCis1IDAgNzMzMDAwCis2MTAgMCA3NjYwMDAKKzI0IDAgODAwMDAwCis2NzI4IDAgODMzMDAwCis1IDAgODY2MDAwCis3NjQgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI2NTYgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0NjIgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTQ1OSAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis2MDggMCAxMTY2MDAwCisyNCAwIDEyMDAwMDAKKzcwMzggMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNzIxIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMxMDIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNzUyIDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MTUgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNzU1IDAgMTU2NjAwMAorMjUgMCAxNjAwMDAwCis3NjU3IDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzg1MiAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszNTM3IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzY3MyAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxNzc0IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU1NCAwIDE5NjYwMDAKKzI0IDAgMjAwMDAwMAorODAyOCAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis3MTUgMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzM5NSAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis3MzYgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTc1OSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis2MDUgMCAyMzY2MDAwCisyMyAwIDI0MDAwMDAKKzc2NTEgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNjE5IDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI3ODggMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNTU2IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEzMzUgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNTIxIDAgMjc2NjAwMAorMjQgMCAyODAwMDAwCisyMjc0IDAgMjgzMzAwMAorNjc2IDAgMjg2NjAwMAorMjUgMCAyOTAwMDAwCis2MjI0IDAgMjkzMzAwMAorNTc5OCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0NDggMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk1MCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTIxOCAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMzE2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzU4MCAwIDMzNjYwMDAKKzI2IDAgMzQwMDAwMAorNjY3MyAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0NzMgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjQ2NyAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCis0MjkgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTQyMCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1ODMgMCAzNzY2MDAwCisyOSAwIDM4MDAwMDAKKzg0OTIgMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNzIwIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzM2MzUgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNjIxIDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE5NjkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNDkgMCA0MTY2MDAwCisyNSAwIDQyMDAwMDAKKzc0MTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorOTQ3IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzM3MTMgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNzE0IDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzIwMDMgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNzUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis4NDcwIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzczNyAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCis0MDk0IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzEwMTkgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMjE2MCAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis4MjggMCA0OTY2MDAwCisyNCAwIDUwMDAwMDAKKzkyODIgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNjU1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzM0OTEgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNjUxIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE5MDYgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNjYyIDAgNTM2NjAwMAorMjQgMCA1NDAwMDAwCis5NzI0IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzYxNyAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwCiszMTQ1IDAgNTU2NjAwMAorNSAwIDU2MDAwMDAKKzU3OCAwIDU2MzMwMDAKKzUgMCA1NjY2MDAwCisxNTkyIDAgNTcwMDAwMAorNSAwIDU3MzMwMDAKKzU2OSAwIDU3NjYwMDAKKzI1IDAgNTgwMDAwMAorMTAwMTUgMCA1ODMzMDAwCis1IDAgNTg2NjAwMAorNjA5IDAgNTkwMDAwMAorNSAwIDU5MzMwMDAKKzM2MTggMCA1OTY2MDAwCis1IDAgNjAwMDAwMAorNzM0IDAgNjAzMzAwMAorNSAwIDYwNjYwMDAKKzE3NDggMCA2MTAwMDAwCis1IDAgNjEzMzAwMAorNTUwIDAgNjE2NjAwMAorMjQgMCA2MjAwMDAwCis4ODA2IDAgNjIzMzAwMAorNSAwIDYyNjYwMDAKKzQ5OCAwIDYzMDAwMDAKKzUgMCA2MzMzMDAwCisyOTEzIDAgNjM2NjAwMAorNSAwIDY0MDAwMDAKKzU5NyAwIDY0MzMwMDAKKzUgMCA2NDY2MDAwCisxMjM1IDAgNjUwMDAwMAorNSAwIDY1MzMwMDAKKzM2MiAwIDY1NjYwMDAKKzI0IDAgNjYwMDAwMAorNjU5MiAwIDY2MzMwMDAKKzUgMCA2NjY2MDAwCis0NjggMCA2NzAwMDAwCis1IDAgNjczMzAwMAorMTkyMCAwIDY3NjYwMDAKKzUgMCA2ODAwMDAwCis0MTkgMCA2ODMzMDAwCis1IDAgNjg2NjAwMAorODQzIDAgNjkwMDAwMAorNSAwIDY5MzMwMDAKKzIzNyAwIDY5NjYwMDAKKzI0IDAgNzAwMDAwMAorMjY4NyAwIDcwMzMwMDAKKzUgMCA3MDY2MDAwCiszOTkgMCA3MTAwMDAwCis1IDAgNzEzMzAwMAorMjAwIDAgNzE2NjAwMAorMTQzIDAgNzIwMDAwMAorMjUgMCA3MjMzMDAwCisxMjYwMyAwIDcyNjYwMDAKKzExMzkgMCA3MzAwMDAwCis1IDAgNzMzMzAwMAorNTYgMCA3MzY2MDAwCis1IDAgNzQwMDAwMAorMjczIDAgNzQzMzAwMAorNSAwIDc0NjYwMDAKKzQ4IDAgNzUwMDAwMAorNSAwIDc1MzMwMDAKKzEwMiAwIDc1NjYwMDAKKzUgMCA3NjAwMDAwCiszOSAwIDc2MzMwMDAKKzI0IDAgNzY2NjAwMAorMzYzNSAwIDc3MDAwMDAKKzUgMCA3NzMzMDAwCis0NiAwIDc3NjYwMDAKKzUgMCA3ODAwMDAwCis2NDcgMCA3ODMzMDAwCis1IDAgNzg2NjAwMAorNjEgMCA3OTAwMDAwCis1IDAgNzkzMzAwMAorODI0IDAgNzk2NjAwMAorNSAwIDgwMDAwMDAKKzY5MSAwIDgwMzMwMDAKKzI3IDAgODA2NjAwMAorNDU3MyAwIDgxMDAwMDAKKzUgMCA4MTMzMDAwCis0NzMgMCA4MTY2MDAwCis1IDAgODIwMDAwMAorMTYzNyAwIDgyMzMwMDAKKzUgMCA4MjY2MDAwCis0NTEgMCA4MzAwMDAwCis1IDAgODMzMzAwMAorOTY5IDAgODM2NjAwMAorNSAwIDg0MDAwMDAKKzIzNCAwIDg0MzMwMDAKKzI0IDAgODQ2NjAwMAorMzM2MSAwIDg1MDAwMDAKKzUgMCA4NTMzMDAwCisxNjggMCA4NTY2MDAwCis1IDAgODYwMDAwMAorNjYyIDAgODYzMzAwMAorNSAwIDg2NjYwMDAKKzEyOSAwIDg3MDAwMDAKKzUgMCA4NzMzMDAwCis0NDMgMCA4NzY2MDAwCis1IDAgODgwMDAwMAorMTgzIDAgODgzMzAwMAorMjMgMCA4ODY2MDAwCisyNzY5IDAgODkwMDAwMAorNSAwIDg5MzMwMDAKKzE4MiAwIDg5NjYwMDAKKzUgMCA5MDAwMDAwCis4OTAgMCA5MDMzMDAwCis1IDAgOTA2NjAwMAorMTcxIDAgOTEwMDAwMAorNSAwIDkxMzMwMDAKKzU5OSAwIDkxNjYwMDAKKzUgMCA5MjAwMDAwCisyMzYgMCA5MjMzMDAwCisyMyAwIDkyNjYwMDAKKzIzMTYgMCA5MzAwMDAwCis1IDAgOTMzMzAwMAorMzMzIDAgOTM2NjAwMAorNSAwIDk0MDAwMDAKKzc1OSAwIDk0MzMwMDAKKzUgMCA5NDY2MDAwCisyMTAgMCA5NTAwMDAwCis1IDAgOTUzMzAwMAorMzI0IDAgOTU2NjAwMAorNSAwIDk2MDAwMDAKKzk4IDAgOTYzMzAwMAorMjMgMCA5NjY2MDAwCisxMTA3IDAgOTcwMDAwMAorNSAwIDk3MzMwMDAKKzQyIDAgOTc2NjAwMAorNSAwIDk4MDAwMDAKKzE0NSAwIDk4MzMwMDAKKzUgMCA5ODY2MDAwCisxMDkgMCA5OTAwMDAwCis4OSAwIDk5MzMwMDAKKzI0IDAgOTk2NjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliYWNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTc4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCkBAIC0wLDAgKzEsMTY3IEBACisxMjU3MSAxIDAKKzk4ODEgMCAzMzAwMAorNSAwIDY2MDAwCis1NDQgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI2NDIgMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzUzMSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTM1OSAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTUxIDAgMzY2MDAwCisyOCAwIDQwMDAwMAorMTA3OTEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzY1NSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzc2OSAwIDU2NjAwMAorNSAwIDYwMDAwMAorNzExIDAgNjMzMDAwCis1IDAgNjY2MDAwCisyMDA0IDAgNzAwMDAwCis1IDAgNzMzMDAwCis2NTcgMCA3NjYwMDAKKzI2IDAgODAwMDAwCis4OTY5IDAgODMzMDAwCis1IDAgODY2MDAwCis2MzAgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI3ODcgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0MDQgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTUxOCAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis0OTMgMCAxMTY2MDAwCisyNiAwIDEyMDAwMDAKKzk5MDAgMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNjIwIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMwNzIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNjY4IDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MjEgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNjgyIDAgMTU2NjAwMAorMjYgMCAxNjAwMDAwCis5NTYwIDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzY2NyAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszMjQ5IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzU4OSAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxODE2IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU0OCAwIDE5NjYwMDAKKzI2IDAgMjAwMDAwMAorOTkxNiAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis2MjggMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzAzNCAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis1OTAgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTU4MSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis1MjQgMCAyMzY2MDAwCisyNiAwIDI0MDAwMDAKKzgxODIgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNTUyIDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI0MTIgMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNDg5IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEyMjcgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNDMyIDAgMjc2NjAwMAorMjYgMCAyODAwMDAwCisyMDE3IDAgMjgzMzAwMAorNTE2IDAgMjg2NjAwMAorMjYgMCAyOTAwMDAwCisxNjYxOSAwIDI5MzMwMDAKKzY3MTAgMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDI1IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NjQgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzExMjkgMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTE1NiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis0ODYgMCAzMzY2MDAwCisyOCAwIDM0MDAwMDAKKzEwMzA0IDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQxMiAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNjA4IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzM5NyAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNTE0IDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzUzMyAwIDM3NjYwMDAKKzI2IDAgMzgwMDAwMAorMTE2OTggMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNTQyIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzMzMzQgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNTQ3IDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE4MDkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNTUgMCA0MTY2MDAwCisyNiAwIDQyMDAwMDAKKzk0OTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorNjU4IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzMyMzIgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNjAwIDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzE3NjYgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNTUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis5OTUxIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzYyNCAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCiszNjE3IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzY0NCAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisxODQxIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzY0OSAwIDQ5NjYwMDAKKzI1IDAgNTAwMDAwMAorOTkwMSAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis1MTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMjgxNCAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis1MTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTUyMSAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis1MDkgMCA1MzY2MDAwCisyNiAwIDU0MDAwMDAKKzEwNTc5IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzU3NSAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTYzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MiBAQAorMjggMzIgMAorMTAgMzIgMAorNDc4MCAxIDMzMzMzCis5NjAgMCAxMDAwMDAKKzQ4MCAwIDY2NjY2CisyNDYgMCA1MDAwMAorMjY0IDAgODMzMzMKKzExNjAgMCAxNjY2NjYKKzQwNCAwIDEzMzMzMworMjM3IDAgMTE2NjY2CisxOTMgMCAxNTAwMDAKKzkzNiAwIDIzMzMzMworMzg0IDAgMjAwMDAwCisxOTkgMCAxODMzMzMKKzI3NSAwIDIxNjY2NgorMTA4NiAwIDMwMDAwMAorNTIwIDAgMjY2NjY2CiszMDEgMCAyNTAwMDAKKzI3MCAwIDI4MzMzMworMTIzMiAwIDM2NjY2NgorNTU5IDAgMzMzMzMzCisyODcgMCAzMTY2NjYKKzI3NCAwIDM1MDAwMAorMTA4NCAwIDQzMzMzMworNDg1IDAgNDAwMDAwCiszMDcgMCAzODMzMzMKKzI4NCAwIDQxNjY2NgorMTA1MiAwIDUwMDAwMAorNTA0IDAgNDY2NjY2CisyOTggMCA0NTAwMDAKKzMyNyAwIDQ4MzMzMworMTE4OSAwIDU2NjY2NgorMzU4IDAgNTMzMzMzCisxNzIgMCA1MTY2NjYKKzE4NSAwIDU1MDAwMAorMTExNSAwIDYzMzMzMworNDYzIDAgNjAwMDAwCisyMTggMCA1ODMzMzMKKzI1NSAwIDYxNjY2NgorMTE1NSAwIDcwMDAwMAorNjIyIDAgNjY2NjY2CiszNTYgMCA2NTAwMDAKKzM0MSAwIDY4MzMzMworMTI0MCAwIDc2NjY2NgorNjEwIDAgNzMzMzMzCiszNDEgMCA3MTY2NjYKKzM4MCAwIDc1MDAwMAorMTMyNiAwIDgzMzMzMworNjIwIDAgODAwMDAwCiszOTYgMCA3ODMzMzMKKzM1MyAwIDgxNjY2NgorMTE5NiAwIDkwMDAwMAorNjIzIDAgODY2NjY2CiszNzUgMCA4NTAwMDAKKzM2MiAwIDg4MzMzMworMTE5MiAwIDk2NjY2NgorNjU0IDAgOTMzMzMzCiszNTkgMCA5MTY2NjYKKzM1MiAwIDk1MDAwMAorODI4IDAgMTAxNjY2NgorNDM2IDAgOTgzMzMzCis0MDEgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YzY4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmM2I5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MiBAQAorMjkgMzIgMAorOSAzMiAwCiszODQ2OSAxIDY2NjY2CiszMjcwIDAgMjAwMDAwCis0NDMgMCAxMzMzMzMKKzI0NiAwIDEwMDAwMAorMjE0IDAgMTY2NjY2CisyMjgwIDAgMzAwMDAwCiszNjggMCAyMzMzMzMKKzIzOCAwIDI2NjY2NgorNjg4IDAgNDMzMzMzCisyODcgMCAzNjY2NjYKKzIzNCAwIDMzMzMzMworMTcyIDAgNDAwMDAwCisxMzYzIDAgNTY2NjY2CisyNzMgMCA1MDAwMDAKKzE2NiAwIDQ2NjY2NgorMTgyIDAgNTMzMzMzCiszNzMxIDAgNzAwMDAwCiszNDkgMCA2MzMzMzMKKzIxNiAwIDYwMDAwMAorMjI5IDAgNjY2NjY2Cis2MDYxIDAgODMzMzMzCis0MDggMCA3NjY2NjYKKzI3MSAwIDczMzMzMworMjQxIDAgODAwMDAwCis3MDA0IDAgOTY2NjY2Cis0NDIgMCA5MDAwMDAKKzI2MSAwIDg2NjY2NgorMjI5IDAgOTMzMzMzCis3MzU0IDAgMTEwMDAwMAorNDA0IDAgMTAzMzMzMworMjY0IDAgMTAwMDAwMAorMTk4IDAgMTA2NjY2NgorNDU0MiAwIDEyMzMzMzMKKzI4NiAwIDExNjY2NjYKKzIwNSAwIDExMzMzMzMKKzEzMSAwIDEyMDAwMDAKKzMzMjkgMCAxMzMzMzMzCisyMTYgMCAxMjY2NjY2CisxMzYgMCAxMzAwMDAwCisyMzUzIDAgMTM2NjY2NgorOTg2IDAgMTQwMDAwMAorODA4IDAgMTQzMzMzMworMzE4IDAgMTQ2NjY2NgorNjIgMCAxNTAwMDAwCis1NTY0OSAxIDE1MzMzMzMKKzE2MDYgMCAxNTY2NjY2CisyOTM1IDAgMTYwMDAwMAorMzU2NCAwIDE2MzMzMzMKKzMzMjQgMCAxNjY2NjY2Cis0NTQzIDAgMTcwMDAwMAorMTc0MCAwIDE3MzMzMzMKKzI3MzcgMCAxNzY2NjY2CisyNzYyIDAgMTgwMDAwMAorMzE4NSAwIDE4MzMzMzMKKzMyMzggMCAxODY2NjY2CiszMzk1IDAgMTkwMDAwMAorMzQyMSAwIDE5MzMzMzMKKzM0ODIgMCAxOTY2NjY2CiszMzcwIDAgMjAwMDAwMAorMzY1NiAwIDIwMzMzMzMKKzM1MDkgMCAyMDY2NjY2CiszNjg0IDAgMjEwMDAwMAorMzczMiAwIDIxMzMzMzMKKzMzNjYgMCAyMTY2NjY2CiszMzc0IDAgMjIwMDAwMAorMzIwMiAwIDIyMzMzMzMKKzM0NDkgMCAyMjY2NjY2CiszMzYwIDAgMjMwMDAwMAorMzM3MiAwIDIzMzMzMzMKKzM0NjAgMCAyMzY2NjY2CiszNTExIDAgMjQwMDAwMAorMzQ3MSAwIDI0MzMzMzMKKzMzMzAgMCAyNDY2NjY2CiszMzc3IDAgMjUwMDAwMAorMzc0NCAwIDI1MzMzMzMKKzM2NjcgMCAyNTY2NjY2CiszODY3IDAgMjYwMDAwMAorMzc3NiAwIDI2MzMzMzMKKzMzMjkgMCAyNjY2NjY2CiszODc2IDAgMjcwMDAwMAorMzM4NSAwIDI3MzMzMzMKKzM1NjYgMCAyNzY2NjY2CiszMzAxIDAgMjgwMDAwMAorMzU3MCAwIDI4MzMzMzMKKzMxMzIgMCAyODY2NjY2CiszNDg3IDAgMjkwMDAwMAorMzI3MCAwIDI5MzMzMzMKKzM0NzIgMCAyOTY2NjY2CiszNDg3IDAgMzAwMDAwMAorMzUwMyAwIDMwMzMzMzMKKzM0NDMgMCAzMDY2NjY2CiszNTI4IDAgMzEwMDAwMAorMzI1OCAwIDMxMzMzMzMKKzM3MDcgMCAzMTY2NjY2CiszMTIwIDAgMzIwMDAwMAorMzM0NyAwIDMyMzMzMzMKKzMzNzIgMCAzMjY2NjY2CiszMTYxIDAgMzMwMDAwMAorMzM5MyAwIDMzMzMzMzMKKzMzOTkgMCAzMzY2NjY2CisyOTA1IDAgMzQwMDAwMAorMzU0MyAwIDM0MzMzMzMKKzMxMDMgMCAzNDY2NjY2CiszMDk5IDAgMzUwMDAwMAorMzQ1NyAwIDM1MzMzMzMKKzMxOTEgMCAzNTY2NjY2CiszMjkwIDAgMzYwMDAwMAorMzMxMiAwIDM2MzMzMzMKKzI5NTUgMCAzNjY2NjY2CiszMzQxIDAgMzcwMDAwMAorMzEwMiAwIDM3MzMzMzMKKzMxODYgMCAzNzY2NjY2CiszMTgwIDAgMzgwMDAwMAorMjgzOSAwIDM4MzMzMzMKKzMwODkgMCAzODY2NjY2CiszMTEwIDAgMzkwMDAwMAorMzE2NSAwIDM5MzMzMzMKKzI2ODQgMCAzOTY2NjY2CiszMDgyIDAgNDAwMDAwMAorMjY5NCAwIDQwMzMzMzMKKzMwNTEgMCA0MDY2NjY2CiszMDAyIDAgNDEwMDAwMAorMjkyOSAwIDQxMzMzMzMKKzI2NzYgMCA0MTY2NjY2CisyNDExIDAgNDIwMDAwMAorMjg3NCAwIDQyMzMzMzMKKzI1NzIgMCA0MjY2NjY2CisyNDIwIDAgNDMwMDAwMAorMjUwMCAwIDQzMzMzMzMKKzIxMzcgMCA0MzY2NjY2CisyMzQ0IDAgNDQwMDAwMAorMjAyOCAwIDQ0MzMzMzMKKzE3NTQgMCA0NDY2NjY2CisxNjI3IDAgNDUwMDAwMAorMTM3NSAwIDQ1MzMzMzMKKzEwNjkgMCA0NTY2NjY2Cis4MDEgMCA0NjAwMDAwCisyMTY4OSAxIDQ2MzMzMzMKKzI2MSAwIDQ3MzMzMzMKKzc2IDAgNDY2NjY2NgorNDUgMCA0NzAwMDAwCiszMzQgMCA0ODAwMDAwCis2MSAwIDQ3NjY2NjYKKzE1NzcgMCA0OTMzMzMzCisyODAgMCA0ODY2NjY2Cis3MiAwIDQ4MzMzMzMKKzQ3OSAwIDQ5MDAwMDAKKzIxODEgMCA1MDY2NjY2Cis5MTkgMCA1MDAwMDAwCiszNDkgMCA0OTY2NjY2Cis1MzQgMCA1MDMzMzMzCis0ODYwIDAgNTE2NjY2NgorNzU5IDAgNTEwMDAwMAorNjc3IDAgNTEzMzMzMworMzEwMSAwIDUzMDAwMDAKKzQ5OCAwIDUyMzMzMzMKKzMyNyAwIDUyMDAwMDAKKzIxMyAwIDUyNjY2NjYKKzE2NDAgMCA1NDMzMzMzCisyNTkgMCA1MzY2NjY2CisxNjIgMCA1MzMzMzMzCisxNDggMCA1NDAwMDAwCisyMTMwIDAgNTU2NjY2NgorMzk3IDAgNTUwMDAwMAorMTkxIDAgNTQ2NjY2NgorMTgwIDAgNTUzMzMzMworMTc1NyAwIDU3MDAwMDAKKzMzOCAwIDU2MzMzMzMKKzE5NCAwIDU2MDAwMDAKKzE0MSAwIDU2NjY2NjYKKzExMDMgMCA1ODMzMzMzCisyODkgMCA1NzY2NjY2CisxNDkgMCA1NzMzMzMzCisxNDggMCA1ODAwMDAwCiszOTE0IDAgNTk2NjY2NgorMTAyNSAwIDU5MDAwMDAKKzcxNCAwIDU4NjY2NjYKKzQyOCAwIDU5MzMzMzMKKzQ2MDQgMCA2MTAwMDAwCisxNDU2IDAgNjAzMzMzMworNjk5IDAgNjAwMDAwMAorODkyIDAgNjA2NjY2NgorNDUzNSAwIDYyMzMzMzMKKzEzMDEgMCA2MTY2NjY2Cis3MDggMCA2MTMzMzMzCis1OTIgMCA2MjAwMDAwCisyMTc1IDAgNjMzMzMzMworNjAzIDAgNjI2NjY2NgorNDExIDAgNjMwMDAwMAorMTgxMyAwIDYzNjY2NjYKKzUwNTUgMCA2NDY2NjY2CisxNTM4IDAgNjQwMDAwMAorMjIwMSAwIDY0MzMzMzMKKzYyNDkgMCA2NTMzMzMzCisxNDIwIDAgNjUwMDAwMAorMjI1NCAwIDY1NjY2NjYKKzI0NDEgMCA2NjMzMzMzCisyOTMgMCA2NjAwMDAwCisyMDYyIDAgNjcwMDAwMAorMjEzIDAgNjY2NjY2NgorMjQ1NSAwIDY4MDAwMDAKKzM0NCAwIDY3MzMzMzMKKzIwNCAwIDY3NjY2NjYKKzM5MjAgMCA2OTMzMzMzCis3NTEgMCA2ODY2NjY2CiszNzYgMCA2ODMzMzMzCiszMzcgMCA2OTAwMDAwCisyODgyIDAgNzA2NjY2NgorNDU3IDAgNzAwMDAwMAorMjIyIDAgNjk2NjY2NgorMTg0IDAgNzAzMzMzMworMjczNCAwIDcyMDAwMDAKKzQ3MiAwIDcxMzMzMzMKKzE4NSAwIDcxMDAwMDAKKzI1MCAwIDcxNjY2NjYKKzI3MzUgMCA3MzMzMzMzCiszMDEgMCA3MjY2NjY2CiszMDcgMCA3MjMzMzMzCisxMDkgMCA3MzAwMDAwCisxODUyIDAgNzQ2NjY2NgorMzIyIDAgNzQwMDAwMAorMTUzIDAgNzM2NjY2NgorMTk1IDAgNzQzMzMzMworMTUwNiAwIDc2MDAwMDAKKzM1MCAwIDc1MzMzMzMKKzE3MCAwIDc1MDAwMDAKKzE0NSAwIDc1NjY2NjYKKzIxMjMgMCA3NzMzMzMzCis0MzAgMCA3NjY2NjY2CiszNjQgMCA3NjMzMzMzCisxOTAgMCA3NzAwMDAwCisxMjk2IDAgNzgwMDAwMAorMTk2IDAgNzc2NjY2NgorODU4IDAgNzgzMzMzMworMzg2NSAwIDc5MzMzMzMKKzY5MyAwIDc4NjY2NjYKKzE2MDYgMCA3OTAwMDAwCis0ODg0IDAgNzk2NjY2NgorMjgyMSAwIDgwMzMzMzMKKzIyMTEgMCA4MDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNSBAQAorNDIgMzIgMAorMTM4NiAxIDAKKzI0MDEgMSAyNDAwMAorMjMyMSAxIDQ4MDAwCisyMzY3IDEgNzIwMDAKKzIzNzAgMSA5NjAwMAorMjMzNCAxIDEyMDAwMAorMjM5NiAxIDE0NDAwMAorMjM3NSAxIDE2ODAwMAorMjQzMSAxIDE5MjAwMAorMjQyOCAxIDIxNjAwMAorMjMzNCAxIDI0MDAwMAorMjI2MSAxIDI2NDAwMAorMjEyNCAxIDI4ODAwMAorMjE1MiAxIDMxMjAwMAorMjI5NSAxIDMzNjAwMAorMjE4MyAxIDM2MDAwMAorMjM5MyAxIDM4NDAwMAorMjQwMCAxIDQwODAwMAorMjI0NiAxIDQzMjAwMAorMjI4OSAxIDQ1NjAwMAorMjQwMCAxIDQ4MDAwMAorMjMzNSAxIDUwNDAwMAorMjI5NCAxIDUyODAwMAorMjI2MCAxIDU1MjAwMAorMjIwNiAxIDU3NjAwMAorMjE4NSAxIDYwMDAwMAorMjE1NSAxIDYyNDAwMAorMjExOCAxIDY0ODAwMAorMjA5NCAxIDY3MjAwMAorMjA1MCAxIDY5NjAwMAorMjA1OSAxIDcyMDAwMAorMjAzMCAxIDc0NDAwMAorMjAyMiAxIDc2ODAwMAorMjA3OCAxIDc5MjAwMAorMjA4MiAxIDgxNjAwMAorMjA5NCAxIDg0MDAwMAorMjExMSAxIDg2NDAwMAorMjA0MyAxIDg4ODAwMAorMjAyMyAxIDkxMjAwMAorMjAyNCAxIDkzNjAwMAorMjA1NiAxIDk2MDAwMAorMjEwOCAxIDk4NDAwMAorMjEzOCAxIDEwMDgwMDAKKzIxNDAgMSAxMDMyMDAwCisyMTExIDEgMTA1NjAwMAorMjExMCAxIDEwODAwMDAKKzIxMzcgMSAxMTA0MDAwCisyMTU3IDEgMTEyODAwMAorMjE3NCAxIDExNTIwMDAKKzIyMDAgMSAxMTc2MDAwCisyMjAzIDEgMTIwMDAwMAorMjIzNyAxIDEyMjQwMDAKKzIyNjEgMSAxMjQ4MDAwCisyMjE1IDEgMTI3MjAwMAorMjEzMyAxIDEyOTYwMDAKKzIwOTEgMSAxMzIwMDAwCisyMDg4IDEgMTM0NDAwMAorMjEyMiAxIDEzNjgwMDAKKzIxMzkgMSAxMzkyMDAwCisyMTQ2IDEgMTQxNjAwMAorMjIzMSAxIDE0NDAwMDAKKzIyODIgMSAxNDY0MDAwCisyMjczIDEgMTQ4ODAwMAorMjMwNCAxIDE1MTIwMDAKKzIyOTIgMSAxNTM2MDAwCisyMjU1IDEgMTU2MDAwMAorMjE4MSAxIDE1ODQwMDAKKzIwODEgMSAxNjA4MDAwCisyMDEyIDEgMTYzMjAwMAorMjAxMSAxIDE2NTYwMDAKKzIwNjYgMSAxNjgwMDAwCisyMDY5IDEgMTcwNDAwMAorMjEyMCAxIDE3MjgwMDAKKzIxNDEgMSAxNzUyMDAwCisyMTQ4IDEgMTc3NjAwMAorMjE4MSAxIDE4MDAwMDAKKzIxNzYgMSAxODI0MDAwCisyMjQwIDEgMTg0ODAwMAorMjI5NyAxIDE4NzIwMDAKKzIzMjUgMSAxODk2MDAwCisyMzM2IDEgMTkyMDAwMAorMjMyOSAxIDE5NDQwMDAKKzIyOTkgMSAxOTY4MDAwCisyMzIyIDEgMTk5MjAwMAorMjM0NyAxIDIwMTYwMDAKKzIyODcgMSAyMDQwMDAwCisyMjg2IDEgMjA2NDAwMAorMjI2OSAxIDIwODgwMDAKKzIzMjAgMSAyMTEyMDAwCisyMzA1IDEgMjEzNjAwMAorMjM4NCAxIDIxNjAwMDAKKzI0MjkgMSAyMTg0MDAwCisyMzcwIDEgMjIwODAwMAorMjM2NSAxIDIyMzIwMDAKKzIzNjEgMSAyMjU2MDAwCisyMzcwIDEgMjI4MDAwMAorMjM5MyAxIDIzMDQwMDAKKzIzNDIgMSAyMzI4MDAwCisyMzI1IDEgMjM1MjAwMAorMjMzNCAxIDIzNzYwMDAKKzIzMTYgMSAyNDAwMDAwCisyMzE3IDEgMjQyNDAwMAorMjMwNSAxIDI0NDgwMDAKKzIzNjAgMSAyNDcyMDAwCisyMzMxIDEgMjQ5NjAwMAorMjMzMiAxIDI1MjAwMDAKKzIzNjEgMSAyNTQ0MDAwCisyNDE3IDEgMjU2ODAwMAorMjQzOCAxIDI1OTIwMDAKKzI0MDMgMSAyNjE2MDAwCisyMzg2IDEgMjY0MDAwMAorMjM4MiAxIDI2NjQwMDAKKzIzNTAgMSAyNjg4MDAwCisyMzU1IDEgMjcxMjAwMAorMjM4MyAxIDI3MzYwMDAKKzIzODQgMSAyNzYwMDAwCisyMzgzIDEgMjc4NDAwMAorMjM3MyAxIDI4MDgwMDAKKzIzNzQgMSAyODMyMDAwCisyMzQ3IDEgMjg1NjAwMAorMjM1MyAxIDI4ODAwMDAKKzIzODEgMSAyOTA0MDAwCisyNDAxIDEgMjkyODAwMAorMjQwMSAxIDI5NTIwMDAKKzIzODUgMSAyOTc2MDAwCisyMzgyIDEgMzAwMDAwMAorMjMyOCAxIDMwMjQwMDAKKzIzMDMgMSAzMDQ4MDAwCisyMjcyIDEgMzA3MjAwMAorMjI3MCAxIDMwOTYwMDAKKzIzMTIgMSAzMTIwMDAwCisyMjczIDEgMzE0NDAwMAorMjMzMCAxIDMxNjgwMDAKKzIzMzkgMSAzMTkyMDAwCisyMjk2IDEgMzIxNjAwMAorMjMxNyAxIDMyNDAwMDAKKzI0NDAgMSAzMjY0MDAwCisyMzUzIDEgMzI4ODAwMAorMjM0NiAxIDMzMTIwMDAKKzIzMDMgMSAzMzM2MDAwCisyMzA4IDEgMzM2MDAwMAorMjI4NyAxIDMzODQwMDAKKzIzMTYgMSAzNDA4MDAwCisyMzY3IDEgMzQzMjAwMAorMjMzNSAxIDM0NTYwMDAKKzIzNTAgMSAzNDgwMDAwCisyMzk1IDEgMzUwNDAwMAorMjQwOCAxIDM1MjgwMDAKKzI0MTMgMSAzNTUyMDAwCisyNDE1IDEgMzU3NjAwMAorMjQ2OCAxIDM2MDAwMDAKKzI0MzcgMSAzNjI0MDAwCisyMzcyIDEgMzY0ODAwMAorMjM3MSAxIDM2NzIwMDAKKzIzNDEgMSAzNjk2MDAwCisyMzI4IDEgMzcyMDAwMAorMjI3MyAxIDM3NDQwMDAKKzIyNDQgMSAzNzY4MDAwCisyMjMzIDEgMzc5MjAwMAorMjIyOSAxIDM4MTYwMDAKKzIyNTIgMSAzODQwMDAwCisyMjM2IDEgMzg2NDAwMAorMjIxNyAxIDM4ODgwMDAKKzIxNzkgMSAzOTEyMDAwCisyMjUxIDEgMzkzNjAwMAorMjE5MiAxIDM5NjAwMDAKKzIxOTkgMSAzOTg0MDAwCisyMjEyIDEgNDAwODAwMAorMjE5MCAxIDQwMzIwMDAKKzIxMDIgMSA0MDU2MDAwCisyMTIwIDEgNDA4MDAwMAorMjE2NyAxIDQxMDQwMDAKKzIwMjQgMSA0MTI4MDAwCisyMDEwIDEgNDE1MjAwMAorMjA2NyAxIDQxNzYwMDAKKzIwMzUgMSA0MjAwMDAwCisyMDUxIDEgNDIyNDAwMAorMjAxMiAxIDQyNDgwMDAKKzIwNjYgMSA0MjcyMDAwCisyMDI1IDEgNDI5NjAwMAorMTk4NyAxIDQzMjAwMDAKKzE5NzIgMSA0MzQ0MDAwCisxOTY2IDEgNDM2ODAwMAorMTk5OSAxIDQzOTIwMDAKKzE5ODcgMSA0NDE2MDAwCisxOTIyIDEgNDQ0MDAwMAorMjAyMCAxIDQ0NjQwMDAKKzIwNzIgMSA0NDg4MDAwCisyMDIxIDEgNDUxMjAwMAorMjAxNyAxIDQ1MzYwMDAKKzIwOTkgMSA0NTYwMDAwCisyMDY0IDEgNDU4NDAwMAorMjEwOSAxIDQ2MDgwMDAKKzIwOTMgMSA0NjMyMDAwCisyMDkwIDEgNDY1NjAwMAorMjE0OCAxIDQ2ODAwMDAKKzIxODQgMSA0NzA0MDAwCisyMTc5IDEgNDcyODAwMAorMjE1MiAxIDQ3NTIwMDAKKzIxNDMgMSA0Nzc2MDAwCisyMTU5IDEgNDgwMDAwMAorMjEyMyAxIDQ4MjQwMDAKKzIxMjkgMSA0ODQ4MDAwCisyMTQ3IDEgNDg3MjAwMAorMjE5MiAxIDQ4OTYwMDAKKzIwNTEgMSA0OTIwMDAwCisyMTE2IDEgNDk0NDAwMAorMjEyNCAxIDQ5NjgwMDAKKzIwODggMSA0OTkyMDAwCisyMDczIDEgNTAxNjAwMAorMjE0NiAxIDUwNDAwMDAKKzIxMzMgMSA1MDY0MDAwCisyMDczIDEgNTA4ODAwMAorMjA1OSAxIDUxMTIwMDAKKzIwNDQgMSA1MTM2MDAwCisyMDEyIDEgNTE2MDAwMAorMjAzNCAxIDUxODQwMDAKKzIwNTMgMSA1MjA4MDAwCisyMDEzIDEgNTIzMjAwMAorMTk4MSAxIDUyNTYwMDAKKzIwOTQgMSA1MjgwMDAwCisyMDc2IDEgNTMwNDAwMAorMTk2OCAxIDUzMjgwMDAKKzIwMjggMSA1MzUyMDAwCisyMDMxIDEgNTM3NjAwMAorMjAyMCAxIDU0MDAwMDAKKzIwMTkgMSA1NDI0MDAwCisyMDMwIDEgNTQ0ODAwMAorMjAxNSAxIDU0NzIwMDAKKzE5NjIgMSA1NDk2MDAwCisyMDcwIDEgNTUyMDAwMAorMjA4NyAxIDU1NDQwMDAKKzE5NjQgMSA1NTY4MDAwCisyMDY5IDEgNTU5MjAwMAorMjAzNCAxIDU2MTYwMDAKKzE5OTQgMSA1NjQwMDAwCisxOTg1IDEgNTY2NDAwMAorMjAzMCAxIDU2ODgwMDAKKzIwNjYgMSA1NzEyMDAwCisxOTU0IDEgNTczNjAwMAorMTczMyAxIDU3NjAwMDAKKzE2NDkgMSA1Nzg0MDAwCisxNjUyIDEgNTgwODAwMAorMTYzMSAxIDU4MzIwMDAKKzE2NTYgMSA1ODU2MDAwCisxNjcyIDEgNTg4MDAwMAorMTY2NyAxIDU5MDQwMDAKKzE2OTYgMSA1OTI4MDAwCisxNjcyIDEgNTk1MjAwMAorMTcwMSAxIDU5NzYwMDAKKzE2NTEgMSA2MDAwMDAwCisxNjc0IDEgNjAyNDAwMAorMTY5NSAxIDYwNDgwMDAKKzE3MDIgMSA2MDcyMDAwCisxNzA3IDEgNjA5NjAwMAorMTY5NCAxIDYxMjAwMDAKKzE3MjcgMSA2MTQ0MDAwCisxNzMwIDEgNjE2ODAwMAorMTcwOCAxIDYxOTIwMDAKKzE3MDQgMSA2MjE2MDAwCisxNzM1IDEgNjI0MDAwMAorMTc1OCAxIDYyNjQwMDAKKzE3NTMgMSA2Mjg4MDAwCisxNzQ4IDEgNjMxMjAwMAorMTc2MyAxIDYzMzYwMDAKKzE3MzcgMSA2MzYwMDAwCisxNzgzIDEgNjM4NDAwMAorMTgzOSAxIDY0MDgwMDAKKzE4NjEgMSA2NDMyMDAwCisxODMyIDEgNjQ1NjAwMAorMTk0NyAxIDY0ODAwMDAKKzE5MzkgMSA2NTA0MDAwCisxOTI2IDEgNjUyODAwMAorMTg5NiAxIDY1NTIwMDAKKzE5MDkgMSA2NTc2MDAwCisxODY5IDEgNjYwMDAwMAorMTkwMCAxIDY2MjQwMDAKKzE4OTYgMSA2NjQ4MDAwCisxODgzIDEgNjY3MjAwMAorMTkwMyAxIDY2OTYwMDAKKzE4OTUgMSA2NzIwMDAwCisxODY1IDEgNjc0NDAwMAorMTg3OCAxIDY3NjgwMDAKKzE4ODEgMSA2NzkyMDAwCisxODYxIDEgNjgxNjAwMAorMTc5MSAxIDY4NDAwMDAKKzE3ODcgMSA2ODY0MDAwCisxNzk4IDEgNjg4ODAwMAorMTgxMSAxIDY5MTIwMDAKKzE4MjQgMSA2OTM2MDAwCisxODk1IDEgNjk2MDAwMAorMjA3OSAxIDY5ODQwMDAKKzIwMzQgMSA3MDA4MDAwCisyMDM4IDEgNzAzMjAwMAorMjAxOCAxIDcwNTYwMDAKKzIwMzAgMSA3MDgwMDAwCisyMDY3IDEgNzEwNDAwMAorMTk4MiAxIDcxMjgwMDAKKzE5MTEgMSA3MTUyMDAwCisxOTA0IDEgNzE3NjAwMAorMTg3NCAxIDcyMDAwMDAKKzE4NzYgMSA3MjI0MDAwCisxOTQ0IDEgNzI0ODAwMAorMTk3NyAxIDcyNzIwMDAKKzE5NzcgMSA3Mjk2MDAwCisxOTc5IDEgNzMyMDAwMAorMjAxMiAxIDczNDQwMDAKKzE5NjEgMSA3MzY4MDAwCisxNzczIDEgNzM5MjAwMAorMTc4MCAxIDc0MTYwMDAKKzE4MDEgMSA3NDQwMDAwCisxODkyIDEgNzQ2NDAwMAorMTg2OSAxIDc0ODgwMDAKKzE5MzYgMSA3NTEyMDAwCisyMTU0IDEgNzUzNjAwMAorMjIyNiAxIDc1NjAwMDAKKzIxNTkgMSA3NTg0MDAwCisyMjUzIDEgNzYwODAwMAorMjI4NiAxIDc2MzIwMDAKKzIyMTQgMSA3NjU2MDAwCisyMTExIDEgNzY4MDAwMAorMjAyNyAxIDc3MDQwMDAKKzE5OTQgMSA3NzI4MDAwCisxODgyIDEgNzc1MjAwMAorMTg4NyAxIDc3NzYwMDAKKzE5OTMgMSA3ODAwMDAwCisxOTYyIDEgNzgyNDAwMAorMTk4MiAxIDc4NDgwMDAKKzE5NjYgMSA3ODcyMDAwCisxOTYyIDEgNzg5NjAwMAorMTkyOCAxIDc5MjAwMDAKKzE4NzggMSA3OTQ0MDAwCisxODU3IDEgNzk2ODAwMAorMTg4NSAxIDc5OTIwMDAKKzE5MTkgMSA4MDE2MDAwCisxOTA0IDEgODA0MDAwMAorMTkwOSAxIDgwNjQwMDAKKzE5MDkgMSA4MDg4MDAwCisxOTMzIDEgODExMjAwMAorMTgyNCAxIDgxMzYwMDAKKzE3NTYgMSA4MTYwMDAwCisxNzMzIDEgODE4NDAwMAorMTcwNSAxIDgyMDgwMDAKKzE3NTUgMSA4MjMyMDAwCisxNzU2IDEgODI1NjAwMAorMTcyNSAxIDgyODAwMDAKKzE3NjEgMSA4MzA0MDAwCisxNzM2IDEgODMyODAwMAorMTcwNiAxIDgzNTIwMDAKKzE2NjIgMSA4Mzc2MDAwCisxNjA0IDEgODQwMDAwMAorMTYxMyAxIDg0MjQwMDAKKzE2OTIgMSA4NDQ4MDAwCisxNzM2IDEgODQ3MjAwMAorMTc3OSAxIDg0OTYwMDAKKzE3NjggMSA4NTIwMDAwCisxNzU4IDEgODU0NDAwMAorMTcwOCAxIDg1NjgwMDAKKzE2NDIgMSA4NTkyMDAwCisxNjQ1IDEgODYxNjAwMAorMTU4MSAxIDg2NDAwMDAKKzE2NTEgMSA4NjY0MDAwCisxNzMxIDEgODY4ODAwMAorMTc0MyAxIDg3MTIwMDAKKzE3MTcgMSA4NzM2MDAwCisxNzE1IDEgODc2MDAwMAorMTY0NiAxIDg3ODQwMDAKKzE1NTEgMSA4ODA4MDAwCisxNTYzIDEgODgzMjAwMAorMTY0OSAxIDg4NTYwMDAKKzE3NDIgMSA4ODgwMDAwCisxNzI0IDEgODkwNDAwMAorMTY3NiAxIDg5MjgwMDAKKzE2NjQgMSA4OTUyMDAwCisxNTg3IDEgODk3NjAwMAorMTQ5NyAxIDkwMDAwMDAKKzE1MDMgMSA5MDI0MDAwCisxNjQ0IDEgOTA0ODAwMAorMTY1OCAxIDkwNzIwMDAKKzE2ODAgMSA5MDk2MDAwCisxNjExIDEgOTEyMDAwMAorMTY5NCAxIDkxNDQwMDAKKzE2NjggMSA5MTY4MDAwCisxNjc3IDEgOTE5MjAwMAorMTYwNCAxIDkyMTYwMDAKKzE1NjcgMSA5MjQwMDAwCisxNjM5IDEgOTI2NDAwMAorMTU1MiAxIDkyODgwMDAKKzE0ODYgMSA5MzEyMDAwCisxNDk0IDEgOTMzNjAwMAorMTQ4MCAxIDkzNjAwMDAKKzE1MDkgMSA5Mzg0MDAwCisxNDU3IDEgOTQwODAwMAorMTQyMyAxIDk0MzIwMDAKKzE0NTkgMSA5NDU2MDAwCisxNDQ0IDEgOTQ4MDAwMAorMTQyNCAxIDk1MDQwMDAKKzE0MTMgMSA5NTI4MDAwCisxNDk4IDEgOTU1MjAwMAorMTQ1NSAxIDk1NzYwMDAKKzEzOTMgMSA5NjAwMDAwCisxNjM4IDEgOTYyNDAwMAorMTkxOSAxIDk2NDgwMDAKKzE5NzkgMSA5NjcyMDAwCisxODk0IDEgOTY5NjAwMAorMjAwMiAxIDk3MjAwMDAKKzIwNjIgMSA5NzQ0MDAwCisyMDk4IDEgOTc2ODAwMAorMTkxOSAxIDk3OTIwMDAKKzE3MzggMSA5ODE2MDAwCisxODkwIDEgOTg0MDAwMAorMTk3MSAxIDk4NjQwMDAKKzI0MjkgMSA5ODg4MDAwCisxODYxIDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNGExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACitrb2dPx8XY1Up2Q3VzWNPVSXZKfn1LdVldwcjE9PT0ythJcnRCUlTz+cfaxtZUxfns7OP/1U9lYn3Z/u3p6+HBW3NnZ0T05eDg4OXGXkxMS39lWlFJ2ffx81B2eG5tcFXk7eT+3GBoFxRmdvno7+bnw3VnbX90ZXdYW99fWNjE1M/P2MFY0NZ5ZX9ncVLb+OX/4fhUR2VzRnxPwvXJ0FnfWXXC5u+V5shKaxARa3f465CX58d3YmltTPnk5uzk2EN6fHlicMPl4+fh6Phbdnh4SkL0//X+9F1xZ2F1X9374OPlwsZWZXxVwVRPcElwYGRx0PTB9+TYTEJGS3JldnR5c2dmfXNP1EJxUtzcRnHczU5OTXF3WsL75+X79NlzaWHY++Po6u39W2ViZtzk6ZeV6O/4WXhkeHxK9+fk6JTq4thzeGdmZnnE/NlQTGRme0/azPbx0UBxYG96QM7l/8vaX31ibEPw5ef53UZmaW1iZFvN5OVWRkhyfHxkdlzYx19F29ZJcGF+0Pb64+fwUnx/YG9w8e2U7fj0RGRua2Td5JeWlevu/dVwcENE2PbxzcnE9vHdW8fDU397UtPczM9U3FNX1FDVzsnI1XZGRVb3+M1dcUtyY2dV5O3nxtRIYGtuY353w/vJU0FDd3hjZmR4fntmZ2d8TGRmfNP1xdX299BNf2dnZ0bn6ZeRkZfhQn1M3O2Xk5yTle3UeHx19OX18fzSxdvA8VN1XHFmZ3tYxEFzS3dbV01eWHN2cmF9Rc3g+PH/U3J9YGVyT+Xp4Of2XHRqEGpk2eHm+sx2Zm9qYEPR8/BTTnN6f3hjZ2B92d/B5+TnyHh6fED85OXi/9hVc39I1uTu6Ori5uH42F5RxPb3wsbx8vPY0MzOz8NEeWdmc0TZ8v7m7ufHX1rfV012fU/TWETcychXeGJrbUzf/uXATmRpFxMVc9bb3U12Tn9kY3p1R1DO/fz58FB2fmVAzOTh5P/7wtXTdVDw98/G9OD/0F15Y2Rwze3t7+HwXGRhRcr65vnQRFpeVMbglOrk9Vp1cmR8V8T64+uX4PzwUHthY0jM8PnES3Nja2kVYnfW0lde1Hxua2oVa2FBzcPfXVNkbG59xff/+spBdX5yclj85/XIw/3n/eTk8ddERcfVz+Ht4MpGQkRJ1tbGwtvd3VNV091cdUpCXF9dVV5AUNj4+szLzER9Z0jl7ZWW6u/k8fr/8eXn5uT+4e7g+9t+axViWsn67O7wZxYdEBdrZ3N5ZG8UERIRb2FxV9TRRnxhFRdpZVLA9//890lkZXBE3cHL13d0SFzGwffn+PDH3dtXdnxmZVXy5fv75+VRSktT9uCVl+/DQHN5ctTllJTs4+Tk4+b3wNXw5OHol5Xv+8L2wNrExVNYcVLD3NxacX17Y2Jsek5Kc3lvFWtgcV9VQXtpaxcUY0hAfWZkX9rIzdRXUXJB19/NyM9efk7G0dr28f3+8/daQ9Hw5uX09fnCTnZc11fF+OHg4uVHZm1iReXrkZCRlfzIxkHT5O3o4uDs91BTU8z3UVDEz9rFwt9naGJlfHZFcXhjbmtvbXxGRndkfHVmaGR6c3BLUEt/R1NBdGFkTcLbxMHIRnx0XPLtleDMWVZT39/Dy83C2Mv4+8DK0n1tYUjZzufs7eDOTXxxckpaxMfL5OHk5eTx0vXj7+iUl+79X0tfz/fY2MLaU9jFUUlFd2VkZHh4fX9hb2NkfnN6e0p9bhMSam14UPb+8txHSklexfHl8NL0zVFaREbW9eXnzdDbSGRsaXteXNv65fNEeXJibn1bVcDe9OPm5/tX18fE7ZSXnZPp+sPI5uXn6eT5/dfBzdTe887cd3pFXkhSTndBfXBBc3h+bGoVanxAd1xPenh6dFxzZmVmfktI9/vDUUFPWNb2+PL1x1tDdmdJ2fb588fQRnXR1kBS3FTXVMf28FB5Z3ZxTfb9/ufg7eHeQHBzTlfL5eT6/cvxwczl/MT++v7KzdZU193z+eb6ytNaeGVwXt9V1ttYS1J2f01XV8nTWEdKQX5gYGJiWPDl+cbTUGVhdnHR/8nCz3FjZmRmZWV/c0rSVXJsamhnTf3hydXXdk13bGZQVcDzxtrA/u/r4/rA2vP64+P5+OH64uzn4OPIzfDRTF3F+OX08cj+89Hfw07Xydj3W2Z5cmB+fGdmS17a0k5KSEBzfHx/amF3cXRIfNrZZExxZnBYX/73U3F5fnp3zfz/7f1QZGhpc1nJ5v3FxcrI/t53d9BUVfD788fRRllKcEPz8/bMRUlc0vPg5eXm4/3Lzlh1xczD//D84+D3X3l5dc/tlJTnRnJ8ZUxRRM/429jef2Zlf0tCd3N8dUJ0Qn1gckl8WVlC9NZ+c2BqZUFU0FpCTUbdVl7NWHVWRndbc3xAT0LWTHLYyfH4zkBbUs7+//rWRNjUxePh75Tg8s5cxufk4/7WQFna/+fs4/Lz1WVgenpF2Pf45PfFzt/GVXVwRtn65PdAfnZwdtfeVvbMUEtlZnBISXJ5dnVMfGFtaxMRFGpgZXh9f2NtbWNkU//n5clIeHl+1/H1zObg+/7z/ebg7erv5/nm4frw/eXj6O+VlO3j4MnSxcXw5eTl+sBCcnZweXh9SVzeyvJTZ2dydFHe3/b499FQd3NfysJDc2Vnenp7cGVlfXtkemV8c2BsY2dsaGF7YWBiahVsYX59Z3PS/uDm9trFx/Pk5f3n6e7g4eHj6Orq6unj7Ojv5vn+5efh4u7j+f/ETX18ZWVycUREfWFhfnx/SUTc9fv6z3xsYXp+d0dXzfTN2ll+c0xHQ0TRUEVGTnZ8f3XezdrYW3Nkb25taRRoYGFiaRUWFhVpYWdkcF/VUERLTdH94uns7eqRlpGQk52dnJyfkpCQlujg5+fg4+H7yXVnZ3BJ387d1tRSRnxjYGR+c3VP1MP29sFQfXNX3tXcUUVU097K30BOc395eWRkZmZhY2Jiel9cREV8Z2ZgZnxgbGJubmkVa25sZ3xzcEJTw9zf3l7Rz/D55PP94ef65OTs7uuWk5CXlO7o6OqUlZaRl5Xk29TaxMP0y/Px//ncdH1wXM3z8fn9zMxUVk1zSV9MdUt8enpkZ21pb2xnZGBsFRERFW5jZmR6ZmxpFRRpfkxTVkVY0d3VWEBHVPLk5ffGxs/EwvL98PLz9cnY0dz3y/b8/Pz/5uHl9s7I9Pzm4+Pj6eqV7/754e3m5eX65eDu7+fz8ufm5Of98/XPwlV9bWgVFWhtb2oVamgVEBYVaW5qahYWFG98THZCU1TXX3N7ZH1Z199SXNFWUFlxcE3c+ef2x/X8+uTh5/j+++zo4/7E3NFT0NTY8eXn/ld0R1rJ5uDt5vj69NNHRtv38+Xh5f/z/Pn08fD77Ozo4v7yy8rAXnR6Z3p5f3BnYXx7cHNkfmdsaRQXEx0QF2ttb2JhbW1ib2Jhd9few0F0RXFa30Re08bl5/3w9PP29/zZUMr+4eL78vLw/ubg5/7k+Pvn8fT88frv7Ozu6JXt80R6XMPw7eTOyNFXx1TR/OTj4uPh9cvFWFhxZHxxcEx1YWoUbmd0cmNgbhcVFxdrbXh5ZWFpbGZjYWZpbX59RkB9fWRkZHt8clbz5ODl21fYzv/k5P7P8PP2/NnF8/rpleP/8fXL9ffK8OHi4+n7z/77+/30y8nxysP3z9r95eXn/fb65O3o4/FfUVVb0VNxcXJ5dHR+fHdGd2FqERcXFmoXEhMRFG9jYWFmZGJjZmJxwcDI2FHR0VDW1ExKUc78+/deTkpwXMXKz8312VZZRtT95uzj/Pnn5+Lm+efm4u3p6ODm5vvxzMfD/Pvm+vfCQlrR9P71/vr55v3WW1La3tFeSWdgYmx4Z2Z5fUd1Z2FjYGFhYGFmZXl+SH5kc0pdXk5wZXZIc3F3cHtne0l3c3dJVNZOf2RJ38Tz99dbUt7/5/709fzywsj3++Lh5uT8/vzk6JeV4ePg5+T68vqVlZeWlOjk5ubn5cn19MLHd2BifH98dGdtFBcUaGFra2NkcWZ4eHVEeWRpbmJkdVjFdXNxYXxlfnZfydreQ35jYE/X9t1Y1HZFdnt8cFBRys1CcX1aXcfNy+X54ebk4Pri4+Pt5+bk5+Lp7ODt5+Dm+Ob9+fr65cBTX/Xj7+zh/lV/eXxfRkFUX0luERIXZ31DQnBweGRhZH56fHBBdGRnZVNEdU98cHl4fEZSTdLB9MdMcXnWyfTMWlt/ZGFlRktaXN3BWnB618rK/cXPVElU0/r58Pn45c/D3v/j4+/n4eHx98nm7ePi4Ozk9Nv07euV4+TyV9ZW39vW01LSWHhtaG1gZWFkdX94ZHZAdnxkcHRkbWlie3V5Z3tjY2Z8RVHD1F9Ycn97XvDl+VFBcGFmf1XT0URA1kpyenTM9fP1ws7Z2sD/5ebj5+Hk5P724ePu7uDh5efk7e7m5vv48cZdQfP5//jZ1kBbW1L3wMTHUHd9ZGthc0zDUHV/e3lz3dVER3NnYGBpZ0F0TXFia2tpbnJDSVh1cnN2eHXO9/L2UEhJQn1IQXNd3tzS1XNldE714+bl8sNQ2vHH9P3x/f/OUPLm4uri+Prm5+Lr4u3s+vHK9sH44f/kyXZ+fnl3yPf0/dNHTHBgYXd23cFAQnZkYn50c9XRWV1ccWR8enZEemRnYWJiZ2N5Q0t0cHtjdFLR91BBdnhnZkJKTEB9f3t6Y3lfwODn/ffx/P3v7u3s+v3MzNTd+eTt4O3r65Xs6+vi7+Pg+/PFUsz2+/7aWnJ9ZXNTVsTRVE1+YWl6TMDz9cZFTX1yQUBNQkhIcXF7fkBT1UNMcHJkbGNgYGBkenNwZGVH0cTRRnJgY2J4SHBzRFhMSnV1w+Tj6eP/w8NV1vD6+fn9wtNCeUDJ9Prs6+3t4eft4efj6O7j4vL0+v782k1hZntkQtNQRNzL2sRIdtvS0tXaQnxKf0FU1NnA901xfmB9c0dU1kJhZG9vYGFlZUZDdX1iZUvVwcLEdE12dFpweGRxSXhlYnt1QtvB/cTA98n7+/jk5efxwFxH39r4+Ofk+uf74+/v4u/r6ebyx8rD8c5fcWxnZ390Xt3a9/331F7T/efk8fndR3h4dEdddVFaeWxuaWNyW0NQdnpkZHt+W3FH0Nd0eWdlQtZLQFpzd3RdS1N1Q9xSdmV9cV7w9cTER0xN3dPl7PrlydRMT1DC4+zk5/VTRsn/++3k7+/ky8Hx/eLp5f1XcmV/SHHNyPXOVktw1d724/v22XxgYEldw/TJzFxyZHVPXsba1U9nY2FxdUHS0VRwYxVqaWVW0F52Zm1gStLAyc3fSmZrZkrR/PPz2X1sb3DG+u/s7PzTQlPSxODr6uDx11rF/OCVlZaW7vzazfXn4OT2W2ViZnZFw/XOxkp+fkzX9ODg81Z9ZGd32ff0TXhib2lve0bw+9t3YGsUbnNa29fRXnhiFWB32/jIXHF8c3zZ/u3i/vTa2EdcxfT7919we2RgTfXz8MnN3tPR2vH74+LwWHZAQF/2/ubl8/z8997J4eDn33J5e39wy+bn8trG3VTcxP79+PNBcnhxS9nwy95KTk11S3fF8cnce2ZtbGJlQ0dCS3R8ZmF7S0xwQH1nY2RLVtjH2lJCQ1zW08XY09xPf2V5S974/MNRWVBdU/fg7OLj5cNGTcfy4ebh5vL19/P44e3g/sjXTHt9cdv9ycPeyPTJ9vjk8MXNxEN6cXRFWWV4e3l/fkNG0cFdQnNlYnp/ct1GcmVnf2RxRNjxRHRBdmdkTVP29NfWQ1/c+eb85/DYWnlnZ3d3V8NBdnxPXNX38u3mw91fQELSzvDl8szW1sTy5Pvk5/DM09JU28/z4eXDQFzA8P764+P82VledUPcy/3AW3hhZHfe8Ofn8UVjaWlicnFBSXtuFGx4QtDT0kR5Z3p0fUxS09JOeGNlWt3x98PLxVt1QULR211RTHBneNfK5u3t4/ze1vXy/uLt7+bPWE7c9OHu4Of+w15CR0bbwsLZQH5mcNH+4eX49VVMTtTUzcnT13NmYGVE2v/zyNZOd3x1RllQdHB6bWlve0fBVUdHQllf28LaxtzbRXl6eVrf/OTk/sPVREZf0cZWR3JgbG961fvm5fPfRXVI0c31z/HAdXt4RtPz5+fn/PHl+eXm4Ob78s/G2sDy5/rHVdVHRdHJ5fr03NF0ZGV/Wczx9/fad3FMc0hBQ31lbBYXam9y1UB3SHJ4cH1dzt5UVlh5ZXdN0PHM0dJ1eF/cwvzk8tFbeH53cNf//s/CyMrl5OTt7OX199dIUlHS/fn19/LA9Pn85eT+zdBFcUBId9z210p0cnRV2/Lh5dxRQHpgZ3PS9sbL9ttd0NFc19R0fWBqamlub3BKfHdJXsb0/Ofn8crOwMbQ1dfC2EFHQnRax8Pe3l9LfmVleHhlTtFWRUZcx9rcy/r4zdVSTXB8cFTw8cr55Prl5+3t5vnw8vn9983C981cTVhX38X19cjcQdfC2VJc0tJQRljH39LB989RTnlkYW1tb2xvenFnenNKVtvc3sFSdUZGSHh/SURfdE9SR1vd2lfSUHNLUFTb2tv3/fbJ/uXm4eHt4uf3xPbRdndIUtldRMTCwf76+vnJ9fTxz97fXU5wc3J3Q0hX2N3O9N1Y3dZYU1DQ31fAxNRd1s7B0kBKcXlkY2R/ZXBMR0N1TNzTQVzT39vDzsLVWElxcHNE19LGxd1U10twQEFIdEhPd0Dfxs3H9P3+5/rw09jAT3ZxXd7e0NXMyvD///r8/fb/5/D18P3EXl9Q1tBFVVfX0kBAdFTE19je2lXYwlfP2NjF3d9NcXh+eGJhZHp7en5ke3JwR0Vd1tzcXcXbXVNPcXh/fnBTW9fSz8pXWkJXzc7I9/P98/bB8OX45+T58cvA1NZU1trbzNXVVV5RXkFb3MLG2tDDylJHTndNSE93cnVARlLE3MzNwf768vbKw9vRUtjw8sDdVUh6YWd6d3V0Qk12d09IS19S0tJX0VNU3s3D1lJZXVp3fX9FQkxHSEBMQkVfUltQR0FcUNLC8/bz8s7C3FPVw/D3w1RUw87EzPz65OH48Pzw/OT69dvdU052cUNTW1nQUF3T0NPeyc7N2ltOU9bQ2FdYV1h3cHlkeHB9fn18eHx8emR6c1pAd0pV3NLKyszZXUJDQUZfUFNFTUxc2dnSwPPw9MrG9/vh4+f6+/7CV1tEX9ffU053QFBV38XJ8fPxzN7Y3dPdx/XJxVZBc3ZJcHRLWkZDUdzYxPT+/Mvd2sv98szbVVN0cXJ9dENaTXZ9f3xzS0dGVdzQUnd2WdbE287w3050TEBNQV9Td3FwfXlkendSVtjNzcr38MzFzMPDxNdU28PbxMTZ11NbxMXQz/z58/j7/vjn4Obm/cZXcXRNR0DR01HRXlhcVtza9vDC39zEy8Fe289bdUNxZ2FjZ2RneHlzdnR1dHVOcHxLd3xC09r18vXUQnVAX19WxsHE0V51c3FCUdrL9fP88f388vrl/PL9zdlVVFVYQU52dF/S2N3f3VJEU93exvH98/LI2FRbWVtQVNLT29BDdXdP183/4ef5/PL2ytzYw8PYU0h/Z2BnZXh8c3BDSnZBSkpDW19X3cnzy95dQHR+fExTU9RfQFlxcnB+e3TRzvfBwcPExM3AyfDy/d1PR0tY3NrJ8PPJwNzXW1xUx8zJ/fz48/H48vTA1lFV2N/Y3VXUUUFAX1DGyfXE0NJXxPXN09vPzF5xf2VgbGBkZXtzd3Jyf3xDRlBV2cvAV9XSV8XSUkdMUdFXWtfeXUV0Rl/S8/7//Mnd9cfRw8jz+P3Nx1FYX0BfUNDdX0NYQ3dEQF3C28bPxl5fUNHI0FTWwcXX3NzW0cfWXtRU2fTx8PDByv7y/fHw8MrEQmRkfHl8TF5dT3N5cH12QUFYXtdVQEx3dFzRUVpOdUdBTEBEWVfTU01CUVJB0tpX0cLx8svC983H2t7T2N/QxsP2wEHXXVHd0sfY2NTA1lPWUcH28vbN1NHEVMPfVMTY3NDVXtnEyfTDzs3P2txR1dxIQndzcntlZX1lfWVjYGB5d0lH19HeydjLw9jx/8zURXVTWltRUF9dXElKcUpd1s7M9vnl//j79PLwwtxWW1BdSFDZ3dVDdHB0UNhV3d1Rx8bS1tTWzM1ZTnd1Ud/S2vbl5cja0F3T2cL28PH+8M3LzdnE0kBOTnZweX53dHR0fX58dEd1fHZMQltGRlPYwffDQXR/fUpNR1fEwdFeQ0JE0NnQ2M3F0tDdycja8Pjz9vTB0FBd2vfJxlJWy8TZ0kVZ1tfb3Nb3/8LH1E1BWVXZ38HwzNzfSHJDdVrYy/j+2d7H2cjL2sbQUlVxZX9nZ31nYWRnf0pzdnxlQ9DcwM325fLL89NHX0tA09HGy1NCTHRAUlTYwMrzxdn3yv3k8cPz8PH0WnZIdVrT0VxYVtVfR1h1QFh3SdjL8vnfU152d0Zc1/Xz9cXawMbKx93F/fr58lZfUFDYyMnSwtFKS0p2dVhMd3lzT0h3fX55fX11Q0FRUFpQVEXR3UBAWcD/9tBBcXl3dV7Hxfb82lDX3ff//vv45+Hlz8TVUtDQwsJQXlZ3cVFXVdZbSUTB8vDExdpUR0BU2NrK/N1U31lW11lN2vT0995VXFpZ0svJ019GeGRzfXRKcnBKfHt/eWV/dnNLTF9d38PT28/1z99dXcDCyffdQENLc0BX2s7L9dvc28PO8PL74+b45fbV01BHW1hfUUZ9c3RDWVtBSU5W29DPy9bH0lJHT17AztPK9Mfb28PJ8+fm8/DOW0BMR1lT1NdNe3JyfndZVlnVxN93cXR6e39yfnxxT0h2QURIQFZWUtLK/fX2ytlVWUROX1DBx1XQ2dVf3vfz++Hn/PTG3sfOy/T0yPXfRkhYQUtXVEFNU9LQ3d3a1V9RUUNNVNxWVcfZ3s3KyfT02NBTdEp1RdTFxMrywFx0SHV2R1dRU19MS3ptYWRlf3d3SnRDX19V38THycPMysTP0F5ZTXZK0d/AzcvBU1bYwNjy5fr8yv/L1NDDwNr2ysnQ0V9PWlzV1MzA1FhGXEt2SVpDQdLB2V1V1lNXxPTOzP3k8vT0219IRVJUxvLL0dVNcnxNRUPVxNF0d09+YWFyfXhIVVlzcnJ2dElPSF3R0dRXV1pMR9VQRNvzyMXBxtvcwc7P9eXh5f/8/snE9vH2+uX2997U1VbQ1VXWwdFEdXl4ZXxaR1/O8vTEV9LH1dPEwcL29vDHQ0x3cEp3TdLa1VJZ1dVYU19MV8fd3F92cmVjZXpxRURHT3FydFpdTkHL98v02FJVQ0FVWlbZ2N/W3MLM9cvYwPHy5Pr0zPXEzcrD8PjwxN/b1FtQWHB0V8TGUEx3eWZ9d3XS9/fB0tHU2cjbV8P65P3w8cZdRNdeRNXfx1VSx8XRUnd9c0VXUFpAdH1lYWNmfHdJcnxDdXZLdnNOzfb12N9ZdHN0SErX9/bR2f/x9MfF0tn3wfbw8/L988jY3/jh+vLw5uX/w1BFQcXS1Vl1dnttYmFlRcP39PTz9cLd1FfD+PPPzvXfXXN9fH5cVURG1crC3lNBcHdaR1pCd0lDeW1uYn9wfU5QV1tYR0NB0vfz/v3M3V13fnJayfTPzvXw9M5QR1be8fXx+/r6/c9XW1rC8fT98OXl/sNRXkXUW1nXXnVzZGNneF3X2fL299nTXVtY2vn09v3y99pfd092R9dS393Mzd5ZSHZwRkhDWXFwc3tnZGR3RndCR0p8f3lxdFrJw/P4xkV2cnt7edH3x/Xx/fHK3lBQVfX2+ODn5+Xx3tZUyvjl4Ob7+fn31VDfysXY0kFxemFgZGRJVlfE28HPyMjHwcn+//bHVN9HcmRgZnBNRNLfy8jG1ElBRlTR0tVCSXtnbWlhdE1GX3VKd0p0dd3K+P3y8c/fUkl+f3xaUNvA0Mjz9FZa1d3K9uTg4eDn9FxNTVXB9vn9/fzK2lTS9/3N2MVETnZlZmR8QlZdUUVd29jS3fT+8MLBzt/Iy1FNdUtBU1XCyvT321J0SV1dV1FRREllbm5tZ3deX1BBdnB9e31fxMHa39nQUUdITk5f19RSV9VSVtBbTEVZUdjw5u3v7+HwwsnO9vvh4OHk/8TVxsba2VFSRHRzeXp9dUpFWUxDX1HY2cL++/DI2dBVWV5XTnV2c0ZEVsTNxMnUSUROcU5KW11JcmVgZ3p5RFRR0ldYUnZ319BV2tBdX0FYW0pbVVnW3tTe0dPP10dRWF7BzfLj7ezj+PDD0M3x8+Xk/vZXUthTUdNcW1BFQEh2Q0ROQUR1dEJUzPX85P/y8cza3VdWVklMSndFX9XG9srE0tVQdnFEUdzWU0pnY2FmYH51dXRITUh3SkFcWVpfQEhGXllUxlNc1VlaWVfW1tNWWUhMVM7l4Ovu4eb7x8nz+OPt7e3n98fcV1hF3d/R31BGR0xwX1JJQ3ZyR13UzMjB29jMxdjN1F5TTnl2cUpVUd/32VtEdnJ3dVfR2FJ/emVjYXJyS0VHXdVQU9ZRU97dVdfd0dfY3NdXUkBfXEVR09dTUEx1RNPF/+Hh4uX5ysXL8ubk4OP69dLTTV9ZREVa3ldVXdbdXFZTRHx5dHRe2szJw8TT3sDO8vHJwVZHTF1UUsXD2ENyfnl/fERS3snCRX93cnl/dEN9cU90dnJ3WkRBWHV9TEh/T9ZWXltQXl/V2sDE31NcSEDWVv3u7uLn5Pjl+vvi7Ozj5vnMwt1SUl5NQ9RVV1RWxM7TU19PdkJIc17fVE9MT0tUxdvT0dlFSHRB1F7A99pcSkp5cHRxXsXAQ3Fwf3hlf3dCWkBFQdLc1sHfxVBFX1pZdU1TV0BwSkBF0N/ExNvRQ0Zd0s/84+Hk5Pz1x/fx/Prk+szOx9rRVNFW38XSX0Dd39XZ3NxRTHN/d0Nb3dve0dHfyfbK8crMVEN2cNzD3MXEy1RDcHBTRFPQ30RyfGV5eWV+dkt2cXB3WkZCQljVU0Zyc1pJcHdOcHp2SllQ3/bE3UdFR9z75Obg7Ozh5uTh4O/t5eX/9dzYxd/SwsjGzMPdwvTBxNXQ0HFlZXF1cnNwcHdNWtfDwPTEWl9CfHNS29dT1lZMSnd1UtbV0UxKdmFlcXRxdkBIdHdHXNPP2Mbf2dNDTU5AR0BQSXZ2dltQxcHSUEBOf3bUwP/55+Pj4+Ht4+Lj5/rA3VhBWXVe0NTW383R3vXz8/XLxdNcTE13dnVzcH9xdljb9Pj/98XZ1U9NWl7VUVNXV1tJQtDSXl5Gd31/c3ZwdXJ5cXR2cUDc0kRQVE1HQU51cXFwfXNzcnND18/N0N9YQEdGV8Dy8v/n4u3t7+7r7+Hj/NjIy9rU091X3c339PX++vv0wNJBXUVzfnN+YWdgZXZL0s33w9/ER09Kd0pOWENS0tDb0VPfxNVBW3N+Sn5zcH9nZHFySF/cz/TL0sTcVsHWVlR1fnh/ZX5JVsbBzNdeTX53RkHSzsz2+Pvl4u/v7O/g5P/Az8DT2NVKStDXVM79+Pjm+fb309TQRUNOZW1nYG9+R8H2///J8t9W0tbf2t11XNdKQFXf0NnZRF5KfnNwc3JlY2Z9YWFNVlTEytXV0VNEXl1OdmRgZ2BgfFlTVsJRWkdIT1PG9uX75eDj4+Pp6uiV6+Dn5P/28vXF31jd3FTF8OTk4+fz9MdRdEhMZWFva2hpY39T0dv329vUW1xc11FSSHF1fHFMU9zT99tARXZzdUt8e35hZWZmcEPU2/P0w/XA0tRQQHFNZWJkZ3xCV1zayVLQVk7QzM71+PDJ5efm4unu6ZXg+uTKxcnEV8XdS0NHTtb/5+bi4f79xVpQR3l/f2xoYGZ6Rl1SxsjAxsTUyfHdxM1SdExDRtLAxcHeT3B2eHhzZWF6Z25sY2F2V1THyMfXVFBFRUtzdnhvbmZmeUxe1sDa1MbZwP/4/fzn+Pjj4uuXlpSV7ufk+//7+/TAz9ZNR1jW/Pr+5fjN2FRFVlNPeWFjaWlubXpzcUJVXkfZ3czzwFNV10J1Q1DFz8LSUXZlfnl5QkB+eHlgYmV+WMfJyM7EW0VQUtjN1XB/eWFhZmV0R17Q2tXdzM795fj19vn8+efi6ZXr5uT+z/Xx8f/w31NXWnFEw/34+Pnyy9tX1sfJ9V19f2ViYmZld19U09jb0Mj///XIxtTZUVvX0NrGR3dycmVkZXh8eGdjYmJuZENe3NVTWUROdUPU2lRJfXpkbmNgZ0tbRVPG2NXO/fz7+Ofh4+Dt65WWlu7t4+f//f729PfNxNrU0ff8+OfyzMDTW0JZ1lRFfGZvaWtqbGZF0EPZwNlXxvTFy9rfUUNPd0zV2NtDSURPfH5yfHJyZWFhen5wUMXP0tLXWF5f2vXOxVl9ZGFtYHtN0NhXV9zaw8Dy+f/n+PXL8fv47eju4+fk8M7Yz8rbzNBF09rI9ubj5+X13VFS1VbY10RyYmNvb2dK2cH131LPw97N/v/MxEd0dHBQ38/HVVh8cGViZHN8YmJpFGJjZEXf09PTc3xNR9j39Vd2eGxvbWFP39Ff3El0yPXx5u3i4frLz/7m6JaUlOvnyvP5yvnh/9FbRkXI/uTu7uLn2HV1REVUzdV/bWoUFWxkUsFTW3BlSsH38v7/zExlZ2V8V8Hw2lRYZmZlfXRHXXlsFRRif9Pz/vj9zHZ+QsX8/PDQdmRvbGNy0drFQXd6Z1rP4eLh4vnFR1zK5uqV6uL6y0xSzvnm/vdQc3xI2P/rlevv5MlMcVXA8PTaTGRibmF7VfD3x0JLdEnZ9+fn9NJ3emRkdN318slBdn9gZHFAXHluFhAUbmFC9//2XHdOfX3d9/HHU31jY2BmSMLa1HFhfExexPjt4uf2x/H65OKWlZXo+fLy8v3g7+XJWnxIzfPy6JTq7czQ28bTzfDTQXJtFWlmZ0PSQ05kYX1DVNLy8dhEZWZ/XkbcwlbQSXplc0BR00R4YWoVbHJG1f3z89x/cVBWxfLx0FBzYWB5RNHKUkJxY2d0VsH45fb21UfU9/rn6e/m5PfBzPb/4+3HWktzSFP/4evr5ufzzszy/P3620J9e2djddXP8UFLdHBwQ8vx5PBQQHZxftfN0cBddHJ/eX1QWlZwbWsWFRVjdEzT1UN1S09e9cLGy9V9bGd4e1Lcx9J3ZWdyTsf0/+H+yVDN/Pnv7ujq6PjK+f/h4uLs+N53SdHF++Lp4uXM2PfJ+uT098V3bGtiYH1EU0N8ZmtsZnPCzPHCQn9ldnHW98TbUUxnYX9xwdxATX5jFGhjf8TAxNvXR0Df0vrmzfbTSWFmcnTNw9XQXXxvZXfd5fzk/MZWUcv35u/s4/rwUFfO9+Lg4eXbRHND0PLs7+P4/vDL+ubv7uH0SHNhYn1H2N9AfGVgbGVI2/H3zFhNSnJYxc/2xnF/f2JnSlnTXklnb2gVbHpxdHd4eH97SNXSyfXDQXdxZHhBUlZXQnlkZnlY2frn5fn++PPl4u/v7uD9+vHA8vjh4+znzsBW0ffk5Obh//vy/eLs7+L7yE5xZWNkcX16emxqaGlnd1re39JeTE5JV8/MV19Ff312cVfHz8VYfGxiYGF0R0t1QHBzU9PL//7331FIS0p8RV9NdH1hbXpyQsny8vT28fX5+ubi5vL2zdfYxdzw+fryyMXQz8L0+fzy/vD3+Obj7ent+vDFWU9xf3R3cnpmYGZ7cUNV3dzZV0dYV9XdwdRXVVtGT0xPWlxJf2Fvbm1iYXx9f3Zyc0JW19bF21FAcXJyfnJ1dnN8f3lzSFPY9vn///Pk5uDt4uzg4OH58/P88/P9z8fPyvTx/fz6+vv5+OXk4+/g5/nLwVxPd3N5ZGdvb29obWNlenh3SUtBUlHd0VNU19TWV15QRXV9dn1le3t7e2V/SEJITkVY1t7b0t/aWVhPdnVIdHx0dntyfXFdVMT18s/B8P/n4ebk5ub++/zx/sva1dVXWdrexvP08frg5Prh5u3s7eHm5sraU0xaQ35+cX5kent9SnRbX1VfSlld19jZw83O0V9cRF5AcmdhZm1gY2F+eXh5dnN4c0JBXEdBVlJMdE90QU99d3J9emdzSV3byfT/+fvn4u/r6O7p4+X58/Dw8NpSV1fe2cDx/Pn9+/Lz/P3n4+zm+eT13VdHSn95Y2xpaGJjZn90QHZ3S0pZRl7R31XZ9N3SUFvc0VJKf39mZmR6fXFHRkF2Q9VT29nNx19bS3FDTV5BSHF8fHhzfVjY2trRVNTB/OTj5uPv4ub4+PXLwNVRU0hLSV3Y9f765uf6+Pv65uHg7eD48PT39/fKWXR9ZGNgZX9yTl5dUF5S2fXxzd/SXEJOdHNydnB/fXN7YWBmYGFgZ2BmYWBkcEx3Xc3YXl9CdXN2c31kenx6fnTYxvb8/fHz/Ofs6O/p6ODh+ubn+vH1wNXWVdLX28728/D0/vj5+uPg5eHn5fnxy81fcXB+YWdnYWZ+dndBQkFGRllFWNDW01JeWkhMT0lKSX5kfHh6c3FwdEt0dXBzd3VHWNXa297F3dpfdHJyfmR5cnd0V97J9c7L8f7k/v/l/v78/MvAwMHU2cze1N7YxdxY2MfO9ffP8f/74+nu4ODk+vz9w1dIdnF9c0teTltV0ERYTUVX3FNT0tbUV1NCd393cXBkZ2ZgZHpkYGZgZnplZH1ycEpSUFFTXUVPTHZwfXx2Tk9Vx8TP//n19ffx+efh4+zs4uLj4fjw9MBUX1NcVNvLz/Xy/PH98Pf++Prn5vjw/fzwydjXTXNycXV3SXB9c3V2c3RNcUzQVlTWUERHdH9kZX9+fnl4c3t6c31zd3FzS09IWtdRWVBFT0RCSkhKSU13S1JTU9TUVcPC3sP39c38+uTm5uTn/vbI9cDS3EZMRkRH1tzH9v32/fn5+/rk5+f+/PP89vbKxcfcUN/M0NHUU0RFSktIdnRaVtzJwN/R13VzfmZsYm1pYGRlZHllf3B/f3dwcHJ5d3BycUVCdndDdEtbXdDZ2VxW0NPFy8/J9fng5uDs7OPh5uT98/fIxtvYx8TdUFTF2vXw8/j75fr99vD29cPIzNjaxNpWUFPVUV50Q152dnRMdEtOS09HU9zF1VdGQ0pwfmRmZmR7fmR6fHJ2Tk1fVF1FUV1PRkZBWUR2dnBydF3DxN/TV1LTVlZXVdnI/v3+/+X+/fDxytrHxNBMWFbWXEROXdzA8uXg5uT65/j09PfD9P/4/PD39/bx88PYXVLU3FBHRtHWW1NfXkdRVldfQXF3dnlkYWBtY2NiY2Vnen59d093cEtJfXtyc3V3cXNxcFhd2d/FzdffxN7Q2Mby++X+5OHm5ebn+Pz3/vnywsHC29VfS0Nb1PXy/vnm5Pvk/M7B39Pf3tDdxc72zMnN3UFPRUxKdHNJRUx2SlxCWVtWWE1MQ098fn9+Z2FhZmZ9c1rVRFDZ2EBDQUpwd3dKd3J1XlDQ3t3RXFbW0FtGXMTTzvXIycj9++fx8vb2zsjPzsTQUlZZdlpEVN3I8vrn5OTk887w/fPy987K9fj65/3y8szExFlMWUFT0NZxTF5GXttVRkJPTUl2Zmd7ZGdnbG9pYmRxdnNDSXd1dmd7enllf2VmeEtG1cXV01DVUMfVUdzJ8f799P75+Ofu4eXn4eTl/8jOy8XW0kF1Qd7K8Pzl5PnO9ffQ0sDM2M30zMryzf3/3NXVXkxNTXV0R0NQWHFKXVhU3VNEQUdzSHZlenN6ZHllZ2R5eUVTXlNGd3Z0cHR3c3BOcXZDQUPX31FUXVte1l1X09/S9PHK/Pj9/OT6+PzK2svP2djdWkxAQ0XUUtz2+fz+/8L19/fx/PX0/fz8+vP2/vn4/f3Dx9jb0NpWQV9bQVfEVNDS3lhadXx6Z2FhYW9vYmdneHtwSktwSnBmZHp6Zntlen58fEZDSEfdVkTQ3NJWVND39fXz5ufg7O7u7+zm4vv2yvbb09zcX11cWcrFwsj0U1LT3Nbc097zxsb189rL8ffPzsTf9NPX1lNAUVlGQlxOU8lU29FBcnVIc3x/ZnhyZH9yfnlJRFLVXXBKQnF3dnJ8cHBzcXV5SF9T1FxERl3R1tLXVs/OwfT98Pbl5ubm//fw9NvTVkVNQVtBXl3czfX28cVZWNPH3MLI8Pz8+eTl8PD4+f35+/v/8vfIxNvAydBQ39jf2NrWUnBnZHhhbGBmZmFnZ395ZH50cHxze3p+ZGdzfH5zcXp/SU9CW15R0VHS39ndzff++Pr/5+3l5eHm5ODh5+f6wMHN0FZRWUJV28LMxVlRUE12T3NwWNfDyszU9ffC39jXzvb9+f/O1PTJzMvEQVTZ397aRUJecXJzZG9gYX5yfXh3S3VGXnF8TktfRHRlcHZJXdRwckBH09RZXcdS1t5Sdlzd2/fx9/L68Pzy9dHM9/f3wlFeRkvX0FxLUNTJ8s7c39VUVV9Mc01czfP/9Pz9/P3z9PD6+Obh5Pzl+vr++/bQ1tzR1ddeW0B0ZWVia2hjZ2Rlenl9f3xzZWZnfmR4eGd6cn90X3VycE91U8bPyMjc2cDd2/X//eHj5uHn8v7l/fDyy9PQVFNU0NDE0lHW29vC98PF00x3TnJ9SEFb3vXDyMHFzvH18vDCzfHx8f/w9/78w8fRU1/f0dZdd3hlY2NkenhwSXZPW0BNWUBJSXBnZX55cUFMQVFaWEZbT1Df2MbHVFzWVdHb9cLz/fLz8vTAy83Y3ddIcX13SFJZWldcWdnN28j3zNDUT3FORkHdw8TL8fP0+eTn4efl5Pv8+OXl+uDh5fv9zMPA19LURnlkYmlpbGNmZGV7ZHh8cXJzcXJ6ZGFgYGZ+d0RMSUlCS1nWwsDLysbR3NnHyPbl5+bk5uT65eXz9MLURUN0cVhX1dzZUlLV09zb29BURXZyfHhyTUdbVlZZXNPO//7+/v/y8fL+/Pzk4ePm5P/398nLwlVMfWdgYGRke3l5f3BycUFZWkNBSXN8e2VleHJ0TEJCTU5cVN3OwMDH3NRX2cHO9v34/vz2y/b1xt9TTnR+e312cUJHRFJUUlbbxcTd3VNFS3dKWFHc3N/Aws7L+eTn5ufn4eX65Obg5uHj7ODn+v/KzdZBcmRibmxiYWZkYGRlent9d3Vwfnl4Z2JnZmdlfn5zdUlQxNrM8PXL9/TBzMj85fv45+Dh5+fn+/HDwFVGdEhOdHd3cXZ1SVnQ08TP0lFaRXV8cExERUReR1pR0PTx8fbx8/Ly+OXn4efl5Ofh4eTk5fPaVU9+emRmZXtlZHp+e3N1SUBAd3J8fn9+e3N0cnB3dUhE1MH19/bw8cvM9fb08fH38/P9+vzI9MzWRHF5e2Vle394Z2R7eHlDV9Hb09TXQEpbR0BV2cTMzcv28/P85eT65ef55ePs7+/h5+bl+Pv58vfKzFZ1fGVkZGZkZGBmZ2d7cXZ3dn96ZWRhZX99dkt3fHR1dVPb2Mvx9PH3yPf/8vLy8/Ll5eTh5vrz8d5YX0VLQ0x3dHZyfHNzdkdfQUl1dndzeH99cnFAQEBZU9LAzc728fT18vj75Obn5OXl4OH65ODk/PXH2FdPdHZ+ZGV/eWVyQkRfWkJJfXp9f359d0BESElfUlFRxvb39Pz+8/7++PrwzPTIzM/08fb0y9NCdXByf3t7fmRnZ2FhZXp/dnN9cn1ycHJ1TEVEQ0VUUFTAyPL8+Pv4/uXn5ubh4+3j5uPg4eDm+vTTXVBAcHJ0d35lZ2dlZHt0d35yd3J6f31zdHFwdHdwTl5S1Pb//P7++OHk+uDg5uTk+vn+5ebg5fH39dBbXU91TEp1S3h5cH55cndzemdmYGZneHd3enl3eWRne3Z1cUdYRFDezMrO9vn+/Pnl5OHh7eP/8/fZ1UVb3N9UU1BYW0tIWlle1VFWR0NQVV1bQENEdUhAW9fL8/zy9vD89/P65uPk5ebl/vvy981VU9dPfXZ3dUhxf356Z2V7en5NWHV+e3t+cnl3RXRxRUF3dkxT19RQ1sTVU8XJ9vT3w8TI9v7n+fz4/M9TTX94dk9ZXXdLWURKSV1SW0VCTkNLQ1bSXFxWSXJyfE3W3sv45Prn5/764O3v7OLg7O7j7eL5/PLD2NReVMHF09RHcH9lZ3p8cnJ0fGR6ZmNlZWV+fntkemR7f3h7f358cEtHVffI98rawcrawcHF28fN3dZaQV5VXl1bXFNR3cbw9M3a31xSXVHV3NjBylVAS0BHU1Taz/L8+OT5+/rm5fr5+uXh5uDm/Mrf13RLQFHT2NPD2tVGTFpxfXxzfXJ/c3RJfUlRTkpyfXdNSEVSWXZLT3xxdEFR2N/fz8ZRxNhFW0dEX0Bzd0x2ckx2enplf0pYRlfHV0JUUEXVUFbHw9zGxVZfV1lV0dTD8Pj74eLh5+Dk5OX9+Ofk/+Tn/fb1xsjPwPH9//Dz88jM21JdTXN3S0p3RFpaWE9wfXpnen9wd0F2c3J4ZX95ZXJySUVTXtZRX0BBSXBLS0FZUV3Q1FJNRHV2REdX29JW01RcRlRHR1Nd08PQVtRSXkXcV9HY3vDn+v/+//D08MzJyvb75/3K9ffNwMraxcTazfHZ1sDAUl5SXlfW08PyzMz29tvZ0dHUUVDfz1NBUlNEUl5CTk5D0NlYSEBIfnllZmBhZn9weHhwc398fnx3TkDS0lhCWURNTXVwcUtMVddWVt/Q3d/WUtfcx/b29PX3z8/MwNrL9PH+/vL8+Prn5vr9/Pfz/fHK9dnZxttQUdzTw8PBxsjDwNzWQl5RX9RTWlbWQl9WWUtbR1/S39vP2UNAQUF+f3l/cXdzd3BkeXB8ZXBzWlFTXNZQRVNZQnNKSk1JWkbWUHRMXEVGUVzR19HQ3lpJTVtHS01ARFDRVczAxPXxxNrByPfw8/L59M7N8fHx/P7x+fvk4eX5//r4//HM2crMzc3b3sPLx9jMxN/1wsDfU1hSWUp0Qnx7fnp8fWVmZGRnZXJkeXF0S3d4e3B0cHZKfkBeXF1ES0VfRkRbRUlUXdzE0lHQXV5dVVFAVFzByszB9MHJy8vRUNbV9M7a28vAys/B0NbSxfLx9/P/9/TOzNrB0tr2w8H09cnx8ff0983z+vD298ba2tZSRVlF0t9bQUR1SEB1d3VwfkpwfnNxf3Z3cUpNS3RZXllYXkBbWkBNSnBxTXd3c318dnZ3fX5zdU9IRkFdWF9TUFhGU9Hexc3L9sv18/zw8Pnl5uPh+v738f/wzvfz8fn/8PD+/OXl8cv398L1zsv0ytjG21ZV3tNW0lxYU0FPV9FYR0xyfH9leX96eXdweX58f3ZJdE1eQkFdQEpEQU5eXkVXXHVCUkdDXl5aUFBR0ldHXVRCdHRxcElKTkRPdEFfRV3U2sbP2sHD29/B9c/JyvbO8P3k4efm4uLh5uXl/vv9/vPIz8rKw8DDy9rB3cDE0sXD2dXX0tdYUl/a2VZXXkBKdHR2cEJOWU99fXJzfHN8fn59e3xkZ3l6fn1yf3h5cnFNTkFEQUZDWkRDQFhd3VlFXFnR397R1FDU3NnQ1t3bx93b3tjA9v76+vrl+/r45OX7++Hh5+T4+f7+8Pr/9Pf98c/bUF5RUkBTQ3ZKUVBWUlpEXkVAVl9CRlNATEt0SFtBTUVMdkJWVtZVVFRVREx2fXp3XFpOdEp3SnJzcH14SkJOcXxwcn15e2V6Z3FGWklHRkdZXNbawcf8+vrw8PP39fHx8fz2+Of+8f38++Tk5eX78/n48Mn28vbK9d/S3tbO8Mv18ffKzcHQUVJd19VbR0FHS3Z9ZGRkenFxfXZ2dn96emR4cVjWUFlfWkZLSEFNWtfE29ZXVF9fT05IdnN3SnB/eXxycH5xdHZLUd3dVdXZwcLa9vbPw/b08fHy5ODm5eLh5P77/Pzz/Pj72l7UT3RH19XYxcfPw1PRxFTUw/b2yfD2/PNRVtvT3srOz8zA3PfFd3N9eXJEXkR3SnNMf2R8cHh9SnN0fXByXHF9d0B1d3Zzc31xc0R5ZXh+ZXFKT3VPRk9cQlxWXU1c3dnQzfD8+vP9+/r9/ufg4eno4uL78vv98eXl5eX6/P3/9srG2NDa2tfRxlRQXnZJWEVY29zdxN5U0F9LSUR1SlVBSHVKcEZCTVfVQFrTUFRTRHVPc312cmR/S31NR0VCWkpwSnBlfXJlf3h+fndycEdxc0NbR9bd01TcVN3O3dDByc3+/P338vX3/ML0++f55+X48PbO8PfewvP58Pj5/PT0w/f2y/Xy//zk+Pvz9d7NwtDU2NFR0UF1c313TnB+eHB8f092cnh4e3x/eXlycnRGTkh0dXdHXExFX3VGQXF9e2RmZWRmZnp7SkRPSnR1dFBQWlDS0/P89/T39ML4/vz/+/zg4ufm5vry5v/98M7b98na11NOddPV1t3a3vHN093EWlHBxcnew8L298LAz1lQydDV10RD1UVxTHdnc3d2W3VIQkZadkVKeU9PQ0h9dUJeVlvUQXZNSUpyZmdkZ2RkeGBgYGd+eXxJQltaX1RKSEDUxt7D9vL/5eHh5ebg7ezg4OHm4ebl/87MxPX08fH3z8PB2N9eU1FUXFBURVhW2sjNwPXxycTD3kZLSXdOdnl8SXJ0XEBOS0t1RUp2fXJkf05xfndwdV1JRdVSdllEdHJ9enJ7Y2xtYmxzSHRxcHh3dHV3RnR3VtPYxtvZ9/f8++Hl5+/o7uD6+OT7+P7l8/rn5Pv1VtXSVN3W1FnU1t7cV0DTw8jy/PHB8/3l/vTe2NVX2t9cWtLSyvbSQlhNXdddSnRHR19fcHtxckDVXHB2QU5Od2VhYm5gZ2VgZmVmZ2Rpa2pqbWZgYH13dXdGT0Be0vbn+PDk4efm7eHm4O7ql5Xqlerp6e/n//H//eXPxMHTTVjcVVbXwcHxxsHGx1XfxVBaU9rI/fT19/Xaz8HTR0VeWVBAXlZZQVbWU1lYRFxTWF1YQU1Md3d0d3RGWVhSRExNS3lnYGFmYWNtYW1ob2NjZHh3WlXW3tnS0NNW18PAzvzg4+iVlerq7uzi5+Tm+/3l/c3I8sr0xdzDyML3887C2MxdW8/f0vjz+u3i5uzt5P7y/Mrwxs/0XnBFSXdLc0lbXUfTVHd7emxuaWlgYWZ4Qk91d0Z1dXB9dnN5ZXJ5ZmBlZH9+ZUh1dkPXUF5VUkNaRFHH2Nr95Pnl4uLg7ODt7ePm4eD7/fH38f71/Pv99/DK10ZAcXl7enF2dUXHz8PP9sPOzMLy/v/x+fn0ycrN8/f0+P/K2szfWkF3ZXpmY2ZmZnp8ZWVxcmV4eX12dn56eXh5c3BycH55c3xle3pnZmZibGBkeH5wQdjawfD9/fLw9PD8/+Tg4+zr6+ro7OPs7efm5/78//XWV0VY0dFFV9Zd3dvTVtLd3sHeV9nH11fe0sPD3MXKysbJ29jT1UdPfX18cHBwTUl0Qlt0dn9/e3N+e3t5fnB3cnB+fmV3eWR9cmV5eGFhYWBgcnp6dEN1Vt5X1VRARsZeWt3e3f7+8eft4O+U7uiU6OHv4fL8+vHz/Mj5+PTOztRX3UV3X1xIU1VFUcDY9/jy/OHl/+b+zfLz2cPAXFnXd3BNfGd6ZGdzfGBnem1hZWNmeWV5S3Z5dU5zWl5+dkR0cHR4ZXxmYHx2f0pJdUpDc3xKcX5IW0De2N3C/ff08ff1+fn3/vv7/fr99/XJ2ff2x8zIz9vKx9bRUU1ZVVFX3t3c/vjw5efy+vrx9vP12vb2yPbL3MvI3M3xw9HfWHB0fGZ+cXFwe2JtZm1vZ2JrbWJjZ2VgYHl/eXF+eE1EUd3a3NbTVFbZUENVwsPD39naxcHL/cjFxsrIztvbxPH28f/39fL4/fD199He1dFTSnl3T3Z2dExwQU5GR0NK1cP28vL//OT4+f/w/OPi4u3u7OLs4efzV1fA19TX2t3VXnR1Sn5/fH9/eHpkenxkfnlhfnl/fnZ2f3lwf3xlYXZNQUHd28X18cPz/f35//3w+/nw8v3M8cr3/PLw9vn2x9jRX1FITltdXFTK9Mz0w97bVNLe0F5f0VRX3lRbXdHQ1t/W3vb3xs7IyPTx/fv7++Xh5Pvk+fPy+vvwzMHFwNBRVEZ2d0RbW0VaRl9bdnN2d0pMTUxCQVHH3NDXUFlTUEF0SENLQERYWkJPRl5YXNXR3drX1FFR1VFUVFTHwM/w9szQ09TRV1pc3NdU0tLJz8jK9vz/5ODm5/n88fTwyMDC2M31z/Py8sjSUVZdUEFbX1PcVNnazdrdxsjbzMPBxFNe1cPG0kJPWl1DTUdHT1pRR0FEQlhUTUtY1dPMx9vb2tXU3tRSV3Fnf3pkZGRlcHJ8SkZ5eXByfH19cUVGSk1URlXB39/P9PH+/cHP9tXSw8zPzvX98vfO/uX18fLw/PL09crMxcPFwf3xy8LB9c7EXEFbdn1Ld0dPS1HXXlLZ9PXF0lLZVF9TQHVFVdjZ31PW2FBZUllKTnRzZ2dhemRjfEd1SUxLXlpFZGR8d050ZXp8fXx7eGVxd0XFwlFUU9VcREFa2c7w+OXl5uf6+PbYwfX19MzYx9vf01VU1FHUxf3+98nAzMfcXERNRNbYXVLX1NjXUk9BQV9dR3dyXdxQcXxwRUFGVs30/P/2yl50dUl1Wtbfw/TN2ddOcHx4ZmRlYGBhZ35lb21nZmdzdEhaT0hAdGdhZ2d4SnBO29vG999Y01VFU8bQwfbK/frxyf31zfvk/uHi5uPi/c7I3tzL2FX28/f98NRdUEx3RHRyW1dU19Z1f35nZXd8S9FRQXRyfntkZH11S1/E9fHN0drRUlDWUUJHXN/11lLUXtdX0FfezMbAwEJ1cWdgY21tZH52UFRLXtVKT0NyfHFyc1BZdlFbdUFDSFzY3svl99vKx9PcXVXK9vPl4Pj54ef65PfP8PDL+OT9+vz3wsdT3s/H1cncQUx1fHJ+ZUp0TF/SX9Td3lZTd3l/Z2R+cH9KT05NWndMU0dF0NLX3FdeRUN8T0l/Q93Y9fz+//P21NVbdUVfUlnQ1tbFUF5XUFbM9/3zzPXCXUdNUlNe0trL9cPKwFTY3FBSUdfF9MPc8fDEy8rZ2tBW9PHIzvrxx/fIwMHY0snx9P/g8Mn0VE10ZXpCRk3Uwlld31h1Q3Nbw9BbUUR/fnNkZ3hkTNLFxPLIWVtAcXN2fELd19LOzdbB9cPx9/X64eXk+/jz8PDF39PSx/b0/+Xl5eX9yd/Z3MbVxfTA9t/Q0lJwQkFIQHR1Rl5IRVFTc0Za18HP9PH8zsHVU0XW0cLN8/jm4OTl8PfB9/XLwMHb3lxPdHJ5eHdL1FPHyvHM39RadmVzdnR2SUfSVNHWXkRHV9DeXdbJ8M/fwMFQV9HY/fbl7+vt4OH59PT19vv55O3s5vj11F3eVFfBUFf198nL33B+cX1BVVzC+8RAS3xibWdjZXN9UvPZ2cTZ38zYVcnIVMLywvT131jf3ML7+v3j5/T+8VVaW3x5f3thSkl0XUJN1FdKWtdRX/Dc0M7TTkp3fV3HwvDk9v3m/c/CVUbe9cXK5fL65fD09Mbd9ffJ8vnK//LBUlFYQ9PC2sfWSEZBd3l9eX1ISXFbVF7ZwNxMRXVzd3Z/c395fXFkZ3BydltUW9vM2cH33F1XSnBOT3ZW0N//4fHM99FGXFZLW1BE1llkZ2RmZHZ0dtzH3/by01NcXEXVVlH39cn99sbM1l1QydlVzczDwldbW0HU1vXb199bX9VXUFxTUUFQUFDV0vXF2sBRRnF8dHB2SnBKf0pNf3B3dEtNQkt2THNLfWFiaWpqa2hieXB+RUlxcHFPQ0ZQ0dLVWsfSxcfHwPP5+Pz///z79cvY29bUW1hRUkJaUVxYdVrU3VXb01ZRVlFX3dbVVlJYXkFMR1FRWnR5fHh7ZXdDRFXEwsfURFPQ0Fbe0NjMyszKysHOw97SxFFVxN9McnhlenplenN5fEpCS3dzf0tOfXl6YWNjY29ubW1me3lzTU/Uz8vb3Mzfz8jJzfbx/Obm+/j7/uHm+vPwzsXYwNbXx9FRQ3V8cHNH19dOT1tER05OfUdBSVnVT1lcV9lSQFtQQ1jQVHdE0ltc19xX0838yMPd1d/EUNXEV9HZwt7aV1bR2URZWXZ0dEp9T3N2RUFzWVJCWt3TQFx3fXZ3ZXJ7YWF4eX9ATUHY9Nv29srN9vX0/fH55vr2+/vx8vr28P719fHI3dFfRFlEdVpVWNXTQUhSQkJW0d3bzc3121ZQ2t/RxMHZwMXRzM7B29RNREZ1S1JeWtFSV8bdTF9fRlpTWcDxxfT//PH48sjwzdbGz9HR0Ux0REpPV9vH8f3Yzs1EcExye3t4fnVKckhNcEjT01f28ffk/vDPyNDEzPP0+OT+5PTx/fbRwfbK28fNxPTI8cnF297OwdDTUVPcx9rS3d7R2tddVFHQ0MD0ytBS19pSWdPc0t7Kz8ja0t3dVt3F09vFxNNQRk5DX13O9/z65+bm5/XE3l9b1tPd0N/f09FQVNbSw/DJ09NdTXN2ZHh+eHVETUtRwMj58vP0+8b0x8nd8cvO9vHw8vjb9MrE3c/F2sHP9f3fVtr6R87w2Pz311pRfHx0Rl5QXtPD0F7W3VdVx8LYxMLP2dDAy9/Tz/Hz8Pzw9cDe0tteTUVeVNVcdVzcXcPw9//n4Of98fTP39n2xE1exdLe3NPfx9vazlNITHZ0UVh1c0xMRdR0f3B1TUVFU1NbXvXy2VPd3cfw8vn9ysjKx19SXF/C8PbO9cPI8sDW0FDWwNZNS31nck53c3d0Q1xdUNJQQFRXXtXY18TKz8v2ytnCwcD12NPFUEhPR3Z2WVpZWUp2SEFC1trTzMZU0N/W1VTRxcrI9vzKwcXT01R1c3J1SHBxdEp3f3F0dV9V2NZXX3N0TnRBdE7RxNrD9dhFXlhb2VJ1fExaQkhJWN7Q1NtGSkZe3VFZdHhxdE11cnN1W1THzsPa2sTMyNFcV9v38fz8//P9/P79ytjD9cHTcHtnfHhnZ2Zmf3J8dnhgZ3x/c2VgY2V6enJ9fHJycF1VWdbB2Pb001TazdnLzcP8+fjl/87Yx9TAwEB1Rlddx/XAz8JT3MFdU1ZLT01+ZGBlZHx0eUFHQFHMV3FwZGFlYhVpam9hcH9wdXJ/TUZI2dvcx/XF3sj3yvzl5u7s4OLp4Ofm+ufl8dLQxtLM99leSX1kc35hZGFvbWJibWFnYHh5eU9PZXx8ZHl0emVkYGFmfH3V3lLe31/XyNfW30VPV9Ne0M7Yyfnl7Ovt7+rs4O/s4frx2dvJyMjyyNvDUVnB00xEfHp4Z2NibBVqY2xgeWdtbGNtZ2RkeGZnfE9R3ffO2/TJwv7y9/Pz9vz8/P/45frj7Ozo7+Ty8cTF9M3eV0tDQFBX0M5QRV9LTnZ/cmFiY2NnYmBlYWd2SFhXRHdDTHJ0cnJ/ZmZhfkhwXNxZ0Nnb8vrh5+fm4+zj4uLt4+yVl+rr4OXn5fj//cva39da1FpcXXBlenxkfnJlYGJiYWFnenFCSdrw8PfE1NPe1VbQxlNT1NX1/fnk+f7++fr++87VRUBQUNFARtbV3PDx/v/Pw8fYVNRdRUxDXt3My/PJ0FJTVtXT0FxHdnZHTXd4f39wQ1Pa3llb0FRc3MfG2Mjy+u3s4uLk/vrl++Tk/fLwzPD4+vz/+v78+Pj/9t3SX0tISUx9enBzW9rM8c3A2M30wcvdWlN2S0FDQ3BbUF/dxPDyxs/H11hGT35kZXpxWtbP29dU18DYwsRG11NT3N/MVd7NxvL+5ODk5f78ysj8yNvAxs/29vLxwFZeWVheWXZwcHJAU9LV19zf9/z+5+Xl/PTBUd9QQF3c2/X55+Hh+v3588PRRXZ3cnt9QV1Y1dJUxvf98/z7/PLeVNVLdkNHWlLV39nO0E5bUlxaRU9zeGVlf2Rkf3hzdV1SX83cVd9NR0xLQFD0y/X//uPi+ufn5P/09tZT1FHJ9/Dzw8vPxt9e2VxyTXFzcXx2ZU/QUcfE9fzCyPb1wMX1Uk5QRVjUUVZMR1bQzN7Pz97Kxk13cX1hYX95dExX2VXczcLFxsrTX9LQ2cLw/c/bx8TLwMXEX0ReRF5eQXx8TEp3dEJDf3ZCXFZBR31leHJ2dk1FSEPX3sr99sjBzvTOxdhRQHJKUN3FxvXPw/Xz8c7dX3J5ckpZT0NGdkbR3sjb28HT2NPV3l9HdHtxQ0BISF5NQVTZwF9OS35+cHd8ZntmYH5yR0B0WktFVVTf09rQXNXTz8rJ8cnB9vvn+/fCU1vW28BU19JF1sbYxdfTUkFER013d3xmZnt5en5NdUlQ3MPAwlVDc3N9ZHh5eHpzUtZRwMfU09PVSUFYTUp3dUl2Q9ZHTFje2cD2yN3TU1BW09hNTk1YUlnc1kFcXV5MQNRBd3F8ZGdnZWVlf3NxT1BMeHl/Z2VzcnJ3W1bb8Ofg5fn6/Mnz/PTw8//K9fbJ8fH1zNzJ8PHGx8xTUtzUSHB2fX9HXVLXWVRQdUfQUlRFT3l5fWdlfUh0d19WVllNdWdgZ2ZmZnl6ZUjW2dr1zFNZWVHSyvD0wMPx9cj1/dpS0NrM8fPz9Pb2w8xVXn1keHp0Q0VZdEh3c0BQwddNS319T1NQV9TFzPzk88rY3NNBUMPEVlHYx/z68/3Mx8DQx/L688LG0NjL9P31xNfQ2/Pl/Pb28MLJwlRcdn55f0lNRUJ2d3FKTEl2ZmJgbWJkZX94e3l03szQXHV1cHFTWt/F3cjz5uT55/z++vjn4e/i5v7/+Pvz9PfJ1N3Gw8jPxFXX2cheSEN2fX5IdHFdXltWXNzc9/LBRXNDQ0zcxdBXUN/Sx8bc19fe2VVc0l1JW1Xay/P/9/39//vn4uD79vXL9vv+y9nYzsn29/Tb0VZTX3R9eGZgbWJnZHZ4eHpnT1bB1EdIcEfVxfPz9vH1/uXm+v3w9/D7/P389fTax8r39sbIxtb18fzwz/TRUN3K8tza2dTMyvj99fLI2svwz19Odn9zQlBcRltZdkHa2VJKW3RwdUxcSE1KcEhQwNjR21TQ9f/9w8vKzsz3/PPw8f/45OPt5vrl/szS0NzH09PSxvXOwNvHxtzZzthVQnJ9cUxDQE13TUVF3NXVVUBQUdHUUNjW2NRfw19EXExFQlbbXNBFQ19ayvVXwcTGz/bn/Ofm//vz5P9Q3sHF3ND+zMD1xPfSx8x3dnFkYG15Z2Jhb2JtZV59ZXB9f39WVnJFX1zVVv/01sbGz8b74P/75f/Lzuf6xVbXxN30+/L+//LKy+f42FtR11Ta8PHK9vXfXvXw2VNOd2RmcXV2cHhkYH5KfmFiZmFnfX1kZmR7en9KR1hPdnx7dVXb2tpQUlfI8/D3zcPD9/Ty5eDm8f39+uTO3ltC1lDS2MHHS09bWlBeWXNgZmFld0pec3hyekpaT3BgfXR4dEFff2VweHdaU1Z5fnV9Q93K3kxQVlH05OT3zv3y+ODu6ebg5/344OD3x8rH28v6+M7YWkhwSlx9Z2wVamphZGJjbmoVbHlhYmFgYWRM0FxEdHN8StnbUFBMcU/V//D19dZaXvH+y/PCUFTF+v7+/fbOyPrk8PbHXVbC8vvl/vFRSFbD2VRffWFlf3F0cHxmbGNnY2ZhaGpoYWV5cHl5Z39CQVlHTndO0sD35ef7z/X+5eXm4eX45OHi4u3i5f7z8fPwz1dZ1NXRyM/B1lteTHd0d3F6ZXt/d3FPS3B2Z2ZnZnlkZXllcXRDR0BBQUhIQnVKcnZ4fUJT0NBYT03R0drL8uH68uXm7OLg4f775eTl+/r+/Pz45Pr/9dFNdnRwf3Jyfn94ZXFKSHZgb21tbm1hZ2ZneH53S3d3enxYTVxeXVRB3fT85fPx3MT88+Tn4OL75ODs7u3j8sHz/f/68P798ufg4ef+wUlKSnZxf3J+ckhHWElQRGZmYWFiaGNhYWR+SHVZRn98cnR0c0N1cUTQ9sjK8Nbdw8X3zvjj5uDi6O/j7fr+//X10s30w/D95Of75cNFTUpLeH9zfnFeXEBNX0B3fGV7YWNmYGd0QEh2WUlySEpEQEZZSURW9Pz34Of0yMPzzPHl+eHtlZfqlerp4ubh//n69PLk7ezn5+Txz9JGcXh5Z2FnfUBLW1VHdHhmbGxhbG1he0h0RlpGQUlCcEhRS0NS3fTB8PHMzN3cSUvc1tzw/ufg7urv7u3m8t/188/z/+Tn7JTs4fv/xEbT0UZaX9RJRthVXFtccWNnZGBsY2dtYX53cXhzfmBld01NW97R0eTv4+bm4fL0++Xn4+jq7pSQkJeUlObx/PX1ys3HVMb4+vHGwVlkZ3xkZHB6ZHxJXkJJR3dkZ3pnZ31wf3t1XnN1TXhkYX5xfkp1cUlQ9cjI99VFdU5WUfT+++HjlJSVlpXu4uTn+eTh8fz65+Dm4fv030FEQUxZcHp/cHV+dndkYG9uaW9hYGF4e314cUJ9ZmZkZHbUUVrc9vz+5+Hl98zFUkXN+f3l7e/s6JSV6eD+wtD2/8jK8/j++uzi/MRWWnBYVEt0cE53fnZKfmVnYxUVYmJvbW1jYWRxZG9paRUXbmdnfktU3Mzl9sXRXkF3XvTI9vvj6emXl+no7+T98f38zsn19/Xy4fDCx1tKc0NeRl5KTUZ3UVp+eGFtbmlmYGFlZ3h6eXtjbWhuaBVge3tyd1bC9fjE0ldzSHZPy87z+Ofp6JGW6pXi5+f+5/r2w9DP38bxwdladUhwSk5ITnxxSn10fmFiFRUUFGJmZH52RkJCSXB5Z2ZjY3tOTHNHx8r19M/cUk9OdUrX1lf3+OTm4+3g5fn2ysfE99Pdw97M8f75wtnZ2tfWxlVfWk5McXZ0ZGdgbhUUbGBhfHlzQnJ9emJtaGppZHZ3QdTJ/OXk5f78ydjfxvLx/OXn4O3t7e3h5/zx8M7Iz8XfV9LD2MFUWUVIXNDWxtrWRkpTSXFwf3JnZnplcHRCW03fU319e3pia29vYX98S3FHVUdfWk1yZn50SdTO8/Lk7+zt6Oro5+fh5eT6/Pfa9PLw+Pn8xN/Kycj9ytRGSk5xfHN6Y2JjYWdM0VlYWVRSQ3dweGdgZmZ4dHRKRNnH19TcS3F8eHJ0UNzdwf3n+vrs5vjk5fjk5/j28P344eHu7uDj4Obg4uP58MhVX15eQWRjYWJgZn1wcHB+eH58Zm9raRVqaWd5ZHxB1cfB2FBKV0Z3QNfAx8P85+fh4+Hl+vrw8Of798Xexsf08/3z/Pj6+uDj5P39/MPYwNjRWU9MSVlUVNjF3VRCXltlZmZjYm9gZ3pIfXpzWNdBfXZNSkhbVlTYx/X9+OHi4uvr7Ozh7eDm4fv65OHi5eTj5Obg7e3m5f/330VFcHh4YGdlZXt5XFBNXnVMT3p/YWltbGJhZXFleHJ2UUN2S3ZOS05dVc3Y1cb0+Pr64ubg7ePs4+Ph//7/5OLn4uH64OXk4uLm9s/dUtJcWUx+d3FKXVbD1kBbdENBcnltbG1uZH5ydX12S0Pb3V9MdnV2Q1PbxdDdXtPl5frl++Tk7uni7uH3z/b65efh5ebi7+7p6OfyzlPc1VFZfH9kYXp8Q3R4f2d6f3l5YmoVF2ppb2xubG1geUpTWUhASFlQ3/TYx9lR3c345vrn4eXm4+Lg+vTazfXw+v/z/fnk+ODg/PfMxtdSydpFTHV3cE3VV15U2NZG3NZwZGBiYm1hYG9vbWFgcEV8ZX5zfGd/d3J2dEpyQ8L3yv/k5+Xh7+Lj7eLk5+Lj4ebk5Pv44eXx88jQXFdXS3ZyeGZiY2NjZH55eXlyZ2BjY2Bib2xpYmZiZ3txdH1wTHV0dEt2dF9LSEdaR0XY/f34//DO2M7NwvD9ydvD9MDK8vP3y/b8/Pn7ztXZxlFWVFFwenBPVdvJ1HJ0d3h+ZHpiamtobWB7d2R6SHVHX9HUT1pT1cz0/sxQxN/M/+bj//T2zvzg7OTI8snExs3I3lfVU1Hcy8dKd3x5dURNcHhkZ39Ezs5WRnFkZUtFcH56YGF6QlxDSX9+fUDfXFxIZHhz3PTdxUV1Qd/78v7kz8DM/+Pn5vzXRlz1yMXx0UBf2P788vVEdHZU2U9ecGZmfdfBzMBLemRJ1kFUV3RmZU9Z0c1feGVK0t/391ZxS9Px+Of80EhV8fTx5fvaxPD+5unv5cLK/vz74efYRNzfw//4xn5hfnB0fnpnYmZlfV/SUnptYWV2TXV6YGZgZFrB9VN5cVvdyvLNW1PZ2/3k5PRTQVjS9Prm8dPUx+Xj4+TyztTXx/TzwNNdXcjy+fzB2FpewfDwV1hRSV7Mw83VdX58TF/TWHV0YWZKWVdYSWRtckFOQHd0f39RyfDF2dhB0f3n4eTk9sf74unu4ufIwPb45Pz+zlDd8Pz2y8BPdFtUxdZYR3Fz3/H03NxxenNBxsL1wFhPQtTIxM9FeHh+SEJOcGd6dlvb1Ntcd1lSwc7FxUFJQFzx8vv63sX1/Obh4uTy9cf28/fCWVtW18nO9ttd0tj38MrZTXNyeH12Xl90dXFH29r0211YcExNV1Jxd3VCVMTBxVfX08P1/Pra09Rd3PX4+vXC2cT28f/12sFfRFbR3F5aTV7ayfbJx8FQU8Pa0E9/fWV/TFLG0tZXRMLx9PTfUnV9dExFQ3ZxcU/S2sTM9cLWyP/9/vfSW0/Q3MH02sdFWcvM9MPEU3ZTRUBWSXZwfk5QXNDQXnZE1FLeyl1zfXNJ0crHzEZHxdvL8fTcSEpKd1hbXU1fxMX29//31sfB8/n0/NVL19T25+fkw9jdyPjI/cNMSnl2T0VQe3B1cddBTkd+cHBBUUxGe2NnYH1EUVRKfXJD9P3/9VBFcUDb2MjXTk1P18bNzN7Z1dvz8PLCX0ZF3sr99N5TQkPG/vjwwV93QlbFx9JPdHdN3cTWXER1d17F3F9wZGdkck9ASXVyf0fC8cLVU0hxdk9Bd3xne3DA//H2wsPb8OHt4fRXTVLNy/fIxMBcVPT6+vfZUUdf0cPOWHB7endNREF2TENZwsHZWnlkYHdEU1Fxcn1/X8HOyNNQdnNwf3J4ZmBsZE1f11PRXElFTVlTd35/d8DLxtjR31PF/uTi5vfDRdFcRFBFWnZM1djGy9vc19DG08TQdX55d0pGXV5YTln3/uX78c1FQ3Z9SnVwfHJLQEXE3tJXXFFITUBMdXBBUtv39czc3vT18//0xVldX1HA9PTTRUdBXcXe10FGRUdWUER9ZXtkfk1c2sXSys//4fnM1l9bcERXXkJwS0bVzMza9NrXT0bdR3B7eXB22vfA9NZeQVv1wFDVRUV1RvRcQkZ3cnlHXXRR0V5NUPnzyMDcV07Y/dXN8s3P/Ozi5eXy2EBP3lBcxddKdMrKVd3G10VezszZ0VZeWvLn9fb59NfX8vfNwdrddVjZ1FRFS2Vtf316f31Nck3D3NZYS3Z9VNJX1tjP0sDh5+Xm5fPc09lUU1hBTHNY3kdBWEd1SVRcWdFQWlvb9d/dx8TYzfb3xcr03dv39Pbw8dJETHZDfXp9fkvWx8bQ30R/dU1RW01SXFDA/OX3/fzFw8Lxx1PZWUhcXNjTxc3VzfTyydTER0jW2vLKzvTczN/0/sr59sTx8fvxzfVSW0RCSH50fGFwQNP3w/fFXltMXUNf1nVZ2srl+Pr8wcfT3NFaXUxLR3dJcXRAdnJycV9aUkd1RUxZxPXz9sn3yfT39c7a9/TK+fv329VVQXZNRV5BdXVyRt7DxtXXUVDZ38HF1MvI/uHg4ub78sLK8sDZQHR0dERNUVh3fm1heXl2cnZ/ZHNxU9zWx9TY8vT++Pj68/nl5Ob49tVW0VPR10RwZnlwd0BMTHNkcEpewdnAVlTczvnk5uTy9vT29/H82NDU1Mrz/Nl3fnlxdmd5cn18YXtF2FN9fHZEVlHEysVQS1rM/v/FV0VJXtfY9dbVXVHL//PeXUhORFXN9MPdV1bB8v798cDQUsTO2sFbd39/QFNV2dFZSEhbU9RRTkNQxPb3zNhXWkZXV9LFwt9e2PHN9cVad35wfn5IcXl7e3ZeUEBbdXNPQVnf3lZf0vHy5efm5PL3//P95ctUWddX1NjSTHx9d3BzdHV6YX5+ck9YX3FxdV7ZzfHLyPHz4Ozs4/jxxt3A2MPTSXV1SFVQQXR6f354ZWR5ZGV9cFLb8cjZ31LByfT79szH2s/2/PPa00ZGUtdRWEJ0dnxwcXd0SHdLRE5cXVPe38Xw+fr2zvf09PbM8/31yUND3NNTWEFZdH18enB1TkB3QFhFT0bU0dzcUF1YUlxYXVBX3l1QTkHU11VaWdVRR190SUp1W0hMWVhXX1HSVMDA3NHS2dvQ19vPwMTewPf5+cna2t/UVdD3/fDz8fT2yMnY1tNSVtdc1lVYQHVOUk1GSn53fH58fHl+Z2FjZ3JOW0FeWkFdx/X28fDx///y+Pz8+/X08fT1xN3cQnZmYGFtZ2FvZnVcWV3G8MPM8Pz7/fj6/OTg4+bh7+D79ffO1UV/Z2NubmsVaGxnZGZ/f392ZUxDcVNZUdNT9Pzz//Hk4Pvj6eznx9hPfH95ZmB4cVnT28nH3MTK8fH2zlN0d0hGR0zW1FjH9Pvn+MpJZHt/cn14c3lzWtD3z9BXTNX09/v+9sxTXUTVxtvcUlfayfv58d13fX59fXt4fH1MRdTK/fj2/eX7/fDwzdVV3VJCVN5RU93x8dpWWXpgZ3pmZ35ycWV/WlTQ1NpQ3vbM9vXFwNDC9cbx8d7a2PTw9ffWS31/QHZ4dH1lZXJGUcz98PXz5fz4+/3w3MTK3vP+9c3TxcDH0ExyfWVjY2JkZGFleHdB3PD3xfX18eTh4uD55+T/+eft4OTn5ufk8ffCW3FnYmtrbm5vYXF1RVJJSklbXljT0kF3fHJPcl/R3fby+PnIyMnVW1pDQkpfXExHUdfa011EdXFaVtPE0t7VWV5Q3cj08+Xt6+Lg4fD+8vH/y8n339v2/Pv+9MtQWdVQ3UV2dXpkdn13TXZOS0zGxF9Nf2RmYWVnZXdOR01D09bF39Pays7z5eXn5fLxyfPn4eT+8ufk+vLaV3BhY2hvYGB6Z2V2dVvdx/TI8vrm7e/s4+T65frk4eT9+uX/8tdfd2FtbhUUFGpubmZlYXt8dF3U0t7U39vFyvT08cfM2t7DzvTx9d1acUxHfHhkeUtY9fbBzNXb2tLk5+Xs4OTk/OT5wsvP2tlY28rf/cFGVEXd2HZIfXtxfUZedEh8ZnB3XMzT09dX3FDQ9MfM9MXHx/fk+vPcTUNyenx7fnd2S0RNXU93dHREWVfAxMrI39rG8vv+5eX8//Hl4fv313RwcHF3SHR2fHB8e3Rwfnhke3xwTVhMdHZzT09ERUJWU1Hdz//6/cTVR0BPRlxEWdRU2fT/4ePg4uPt4uDn9tLQR0pBS3BxZGR7eXx9REdxfXdwcHxkcn55WUXQxM329Pb65eXl5+b7yvX3wN1eXU5ySU1LSEpNR35wdH1ISXNlY2R4e3RN0VdE1M738Pjk5PbK8srHyPX1V1fF18TNzcFPQ1JxfndKZWgVY2ZkenRac3bR3sL3/+X49+Tg5uLh5vzC8crN8Pb310jf0d/dTFpJeXZxenl+ZmJgdEB+fnRZcX1HUU5F3FZMSVLAU17Y21RA0fzM29zRRUJF39zc9/n29vHz8/f588z38vz+ys769s71989SQFRDQFDR1U59dn1neWFgY2VbQHRDdk52TsDx8fH19/785fn09snL+drEw1HTcmRlfHFnb2gVaGJjZmVlcHF2VNnE3cDOzvnm4Ofk+uX8zOHo6uj63lZ3Wk5ydUpGTXRGXkVId11AS8XH3tzRWllMRN/C98XK8s/F3Ex8dXtzfX1FQNfx9snO8vry9vHD0kZAXEtCXkx2f2FnbWNyfXp6aW1ibmF6fklf9f30+Obl5+fol5eQk5Tp4+bn++zo5v/15OHzwdZ6Y2JtbhQWbmhqaWtjZ2VxfWV+en10Rc3A1llT9Pnw+Pzn7Ovu4vvB2VNDTEXey/bCQHR2dEVRV1NRXUt3XlxTV9fZzvL6/P3//PFQW1hG0NZNdXRMV9j38fH33sTPxMrJws3YVdJdTktMdGRmfkhZTn5nbRVsZ3l9cUXW0fL4+uHj6+ns6paX6uns4fj65Pj6y91RSUZXdXJ+YGlraWhoYmZ5eXp+RF9U09jTVd3AxtDT219cRcT2wPT/8PH///f0zvX0y9v3/v7x+f30y/D1xsDF3V9ATU9BW3Vyc3RwdHddxcfKXUxHck5NcnZydVdWwNlc0tNT2dLD9MHNxdfG2Mf19/nOX9XezvPdQHNmYGNiYW1ibWljZXBMQtbQXcP38+Hn4e7i7O/t6O7p7ubm4OT5VHZ+bmkUFxQXF2lqFW5vZnh+c1ld0vf+4efj5vL65OHv4ebg5uzi//jJ0NBGdXZ4dE1Id312T0xZXNHbVnVOcHZxZmBsbmJvZn513NFzc3BCUExW0VrF/eTp7Ono4+Tn4uni4PjJzdZG1kJNSmdhYmF0eG1vaGttYnx+fk1wdNfS++T//PXJ8/Dn4eXu4+Xk5ezn9PXRVMLKxNZwemFvbG5jemFnY2NhYGd+YWVyfEpxRMzc3tBRy/775ubl4uLm+//48NnfSnpydF/QQNBdQsPJ9vHUydVJVNzN8VDawlDYy/rt5OH8xdfSX9x0c0xGU1BU99HQwdvM8/zt5/H729BXd01IenpgbXpnfmdpbhRrY29hY2lhY2B3Q1TWWcb25uqUl5bql5Xu7u3t4vHw5OHj4fn5V1hfXltyfUN8ZWFgentmZmNmYWZ4cUlfRVhCXd7E9srZxsn8//zl+uf+ytzZx/fP3tnc3VVHSXVPSktNW1tST3B+fXFAdUhF18fH311ZU1JHXEZbUlHT2sL98/r6++fl/P/x/P329N5d1UZGcXNxfHt0fX55Y2dgb2dhcFJRzczb9vD/4OiUlemUlJXr4Ozkwv3/w9NPUkt3dnd2eHh4ZGlubGhvY2dkYWdlZmdlTEJxSVtRWUVXWXRUzvT2+u6V7ebh4+3slO/k++bt7ebg5PTYxvTaRUVwZmNtZGRgZXp+cnp+fXTG9dHWXNvdX8TLwPb35fv0/PrJ0FjN/Pfx+fbaT0NcdV7C0nVmcFpwfX1wZGJgeWBvZn97ZH1S0MLy+uDh4+rv6ZSU6uDk5frw8f3Pw97KXE9wc2RrFxRqam9kYWxtZHBIVf/k+/z85Pr64OH65eT4ytHP9cVVRkdVW1NUd311QUZHV8ReQn5yRVjb88VSR3Fxc3xzeGVibHp5Q1BDcXBAXNPa8PL7+f7n+ufg5OTn++T5/uXKwlZLTXdJUkVze2R+fHt0dX1ga29iY3FBREt+Tl9R3N7a21LV2sfK+/r/8Ofs7eDj7e3m+vzK9cjBX3Z8fHphY21saxRqa2xnfnhmZHx1TV7azFRSUc/+4ejj5fj75P/Jy8dQRkpBWkTUQndHRdnHV9rdRXR5cV5Q3VRbUFrQyd/IwdDTR3ZBV/T0xfb09/j45+bl+fj9/fj6ylTURHd3cnpgaWhqFhYXFRQXa2huZHFDdHReVFHT8eDh4Ovp7O/p6+L65/r1wcn68Nn19djBy/PCWkVeTHFP0FVxdkx/fnNEdXJzcX9kZ3ZKdXdGTkTV9vLM28vC38r98/P65vz19Pnw3lNXUkp0VFZId0xOc31GQHR1TldedVBYQk5HUVhYw/fGWU5U3dbGzsfAy/L8/fPz2tRS0NJfVMLa3MZEdHNzd3hnYGB6ZmRNTk9QzMLK+OLs5fvn4efk7O/78frn5/jn+dB2dk9zZXtwemBkfHp6ZXByZmF/e2R4c3N+eXZ3dUBU0VxNWVFAXd7H3Mz65efg7+/h7ent/vb98dnXzszawM/LWn11SHtkfHZ6YHp3S3RN3FHT9+fk8cjMwd7Y9/rl8/v2wMTazsLRVF5AQdPJ89tTSnZwdkl0S39jaGljYXJJRXFkfnZBUNLL1U5KWcL08P/l+fvm7e3s7OHz0d3188rI9NdLd3dDXdNVVEd3SU1fR0bQxd/C/+bh5/XQSEpaWFRcQ0lNR1fH8fDLws3AwPfNwtVCUfX2/fLN3XVwSHRkYWlrEBMWFGJ6c05ORsX1/v7z+vjn7O6UkZSU6eDv6JWV4uH0XVJ8fE11dXxmd3J/c2V8e2N4cEpaTEZHd1lX0cnD9VB9SlBT0NVV1UrXysjw/OHi8Pz75ebz9MhXQFpV0VFEW3BtbGZhYWF5eX1lZXl8d0NSy9zH/fzl5OTl+v/55OT73lfaSH14ck9yfXVbVlPC9N1BXN1bc3RQ0UBd3fb99/rk8c/05PfW2cjfW9/GxtJWxvTw9vT31XBLRFxFQFJQQHd2cHB5ZHtkZmBsZGBjZX5JTHXZ21XVyvDCWEdSSUJaVtld2ubg5+Xi4vbL9sj12PX5/fT4/OTl8OT/1tzVVk9nYGJpbmlsYGd4dn96ZHl2X8b28vrz9fPy/ffx5fDD9vbK8vL29NHXQEp1YXh8bxVrYmRlc0hwc3VY1d/Z9fTLVUfW1dbM9/76//zD08LL9c/AzffAwPf09MTeVFTUR1bcTHxlfXd9T1ZeUF1CVdNW98/eWHFEWnRex/P7/cn1zsPP9M1dTHByTEhS1EpaREvUXNPx91RFemFmbXtzf3FmYXB7eVjR2FhHUtdXxv/+9cD38vv4++Pkws7I+Obh7OL8wtZHTHB0V0N/Z2NhZXJYXNHQXF5R3NvB0kF2cUjc98P0/NHVX1fw9v/m8VZd3ff3yv37w1t0S0pzRkZ9YG5tYWFlfHZ6bGBnc1tQRE9/ZUpa9Ofm7+L4/vv+/+bl/shdTk1W1cH28sZbTF1W38fSVnVTyd/z8PP7U3Tfw/Tm5PfPSVPRWcn8+MNYcnllek5QW0B1d0pB3P/yzlJ5e3pnQklhbWoUbWB9x9hRVkxx1VzC/8zJ1NjH9P3g4+Hn5Pn6+v7k8dVOTUzdzv/h91tbQ1DC8+T8xlZXU1TYzP7LV0l+ZXp+cnh9ZmZlZ3xa3MfXTl1TUvT88vJV08LI+uHu6eb3x15JV9hSRnxgZGRmfllU3ld0THt32N/SWHVbQF31+f33UXdweVn29M7cQ9HDyfng4uHn211DWsvMzcnS0cff3PD+wd1zeHpyUl1FQn5lcHXT++bn/93Vx/Tt4PnyyNRbRU3DylXRcWZkZnxlZ2dtbmtvYH1Dd3FhbHtO18bH88zc1cHI+eLg+8jaXdPJ9/X+8/7/+OTj7OP5yt9SXMzC21x0eGR318HO0VtxYW1lQFJBTElKUNXE2Mz0+/HD2ML9y8TD2FlV39JX2dnYQWdsY3BOTkdAcXxyf3bZxMBec31/Wl93QVFWU9Da0/z5/chAT0bAz8Hy89pfV/T94u7j8VlzfV3V2NhGdE5H38D2+8pdUtVR9fLAyMVwT9nf3PHwyt55Z352RV1aRUhzTVFS3M7RQHF/eHRWWkhMdF/0xNHa3kN5YWNlcEJeTV1Yd0HT3fTm5v3ZWdXH9/zy+v325eH65uD7xFxCTNPQVFpYRE9a0cXJ+vbcTnNmZnNf1lTbUEBAWN7+xFJDcXt5RVxWXl1RzeXv6OvnxkJ3c3bZ2FdDTn5keHJL0VZwe2ZjaWV0TnxxTk1QV8///cRd1cPR9/v+xdJVVNjc+eT2VUdxfHxGxNjC5efk5OTs6OL5ydfVWlrG3kdXUF/axPb533JhaG9jY3NGSUFSRlba/ODlydZJdnBkf3Z7ZXJ5S0pGxUZjb25oY3pY1El1XkbR8eXplfrP29FWV87w8fHh4+bh4O3j9dNUUFRd1FTUWlbF8uXt6+/0dX5nbmptYGBtYXl1QdP38V13QVtLcFTf3FXTyPvn75Xr5Nd0dnN4REBwe2dkc3130txedXtlcH5LX15Y0/Xk5Pjj4PLVSXdwfnZCd3VCdVbL8+/q4fRQSUFLW8HLzPTx+ebn7u7kzVJZTH9lenxwf3dU98nx5PfTXHd/c3dOVN5QWFzHzf/t5MRecHhmY2FnZGFlStPQzuX5U3x5fGVnZHJJf3Tdwvzg65X611h2fn9mfVp1WfHk7ZSRl+Ph4Obx01t2dXN30/Hz5+HkyUd9fWBvbGJ/cmd13N7y5ODk8FTcWE1JRcFCSETI8P7l+MDVTnF9ZWRlcXZJXs/I9OXn/PTVdWVsYWdnfEBD29za9P7y30l+dXBkf09b0N735u7qlJTo4cdUXn92UdDM11tX9+Xt4fT0XnV/Znl0WFfV2M7l5uLg8MdRTGVvaWBtZnpgZVzE9/n85/3fTGBjcWF3UklKwfzw//PzxNVwZGBgYGd5eHJSys3z8/n/+tjQ08Lx3vLw/fvn++fg4eXg9Xdyck9PR0DRxff2wM3229ldentjYmdNX11TzcPX8Pz19lJgY21uY39IWNz1//jg7eLt7fFYR312dHl8SFHQ19PEWUx1ZWtubmRyfH1wWFbbzfP8//LefE1VU9/Z2Mv98Obn+fr69Fp+dVREU0Z1wfn95+Lu4+flzlNESHB8dnBdyd7UwvTR39tVRHdlY2hpbGFzd1jP98b3/PTQS0p0dXN3SHB8fEhTXlTOUXJlZWVMQEVXdFpd1M718+H9wF5OUcTBU8TGwcj54+iV6uD2VU1JR9FIVNFTXVfazvLzwkt8e2ZmbGtiYW16ddnK8P7I9dxRQV9YX19VVlPf9fH099jJ10dxfXZwck51TVBCQVvZ1lRAdnRySkxaRU9T3cXYyeHm+cB0fXtgYHhaV8H2//3m6+/t4/XMwF5aSUp0QV3cwvzv4eXm8lVFd35PTmV5e3FDRsTE3MNVS15bcXV0fHdxRsVW3tNf0E503vReTkl5cUNf3tv1x1XA03RzdHpyQXt/Tdfz/PfP0M/8ysz+9/Dy1UZUyOTn5+3h5/7M2vP0397G0Ex2SEVTXkdWTnNx1VxOdUxe3tjQ2FJGd3FnZmdPQklbXEdVVt/4/OTz/8hUV1BAd1nRVlrayP748FxSfGJjYXJ4eH9hYXl8Rcv49vH23dr18/b45f36/vb47+j6wVB+cVle18DGX0dJWdD95M3FU3t+UNDC9/fF1vTJ2cr+99ZceGtiY21lZGBhc3Z2Qf/819JZX8bP3vz10UBCQEpW9fHUV0dPd3JkfUp0c3VPd0FQx93S28rz5OXj6O3n5Pzw5eHs5M/Fxt/bVd/323VLSnBLQt3ZVHVdVl9aRdvTSnVYRlLexsXXcXdP1/T1/89OcX1heEBR0tNDTFVZx8LzzVzV1URM0txGcGZmdEBT2/L5w11DRk/e9vXBTnBG3sb85Obk+vnz9f3n/v3Oz8HI3vT68vXHzMfT3vj101tNXllE2/v0ydVAd3x8RFpKS3B3d3ZNXV/WVVNKdEBdVlxAfn5ySl/O9c7AWXdKUs/wwtxBQV5d2Pz78/HM3FZX2sbbxtnK8/D8+fjw9s3X0sfIwdLSVlNC3f3n5/nl9E90d0p2fnNkZ3hyTlPcVM7MVFZYXVNb3FFBQVdQV8P08s3USXRE2dNUU0p2Q0Jb3ND1xF5OdElbdnFdRFzcxMLHXMfUS3dxc3x0UtXUUkTcwf398vvI2M/E3lVa1kx/1MLQz9rDytPU31VUXU53T0tA2F1SVdv0z9veV1DM2NLf2NvbV1dZR1FOcXdOcXx8cUpA1MzYxd/ZydddXkVDf39zeXROWF5U1dT1UHR3fHhkZ398SETGyvHw9eHl5ODk+ffEw99dXVXX0FTS/fLdR3lnZm1lc3t/TkpY1VTI8ff3//z79fT0wfT8/efk8/v3xtJaZ2ZjYGRhYX58ckJbxvXFX1hOd3hkfHh5Wkdc39b1w8nY9fz+3XF0fHt9dUlUVczL8sjb0dVVXcfKzM3CUtPW11XSzM3b3NrU29deX1nVysLA2dzWV9LV11xRVNrXW1/Y2dL2+fDZQUNMYWd7cUNRTk9FdUp/cnh8dEpxfXl4e3l0SVjN+P/z8fPe0dDH8OXk8N/N/PL2xMbf00xLU9dGS1RcV8Py+v3QXUdEQXVLQFbUxlVR1V7G9//k+vRddGFheGdgYXp1TVrEx1FRWE9V2fT2W3VAQ1pF08bC2FRWdHNzT3dLX1tAc35P287OwsvB9/PH9fXQxcLO+ebj4fvNUkpMSk5b1cLWRkR1SlDX3cbAXk51fX18fnBOTF9U0cTdVFFfXdnZ019EUlhCVvX0/ffMxltIQ0db1s/z/MjKyMvN2d3XWEtLf2RneHB2dEfB+efg5vLNRHFMW0pF299QXNP3/frh4ubJVF3XW05JQXRxWdNQSXV8en5EUdNZd0x2c3N20/Lw8PzP1dHP8cz54+Lg+/D++v7J3NFQQHB3S3FyfGRhQt7T0lt0c3xyeXF3TFPDz9vM+uX54+/u7uPl9sHDVNTJxc1QQ3F0SXR4ZnlwdlfEVdFTxtvZ8PLzytBBR1xV3/T55+Tl+Pvn4ObTXUN9fmdjYmNnZHJQ9fb+5cjAyfP03MTLwd/Z287x8/3/9vD29NNxcH5nYmxncXN8cnFzeErYx878/fPI1tn0/f7w/vPP9M3GUM78+//5/8zEVVFfQl9LdUB8ZHp+fHZbz8jK+/v6+Mne0t7OzNvZ09vx2F7X2svCz9hbWsTAWklxTllX10JKd3ZxfHh5dFRZd0NHWVf34ePg+/fS2MDb28T38vz78+Xm5Pn3zMLG39JNdklMRlzZy//l/VdV3UZ2cUlxcXJyfn9GXdTPyPfyyNbcyvXaRlLZV9/bXHZORkBSRVzMyMVNcXl/fXRHTkBIcXN7fV3C/Pv74efw+/rl5uX1wt1QWk5MeX1PU1lE1NbRXUJMWN/94ef59tvdVMPz5f/N111ESUB0c3d0Ql9EWNTQdmdhZXl3WlJYVFF8dlzdxsr/99FRR0xS38LE09fX3c/eR1dfWFfWUnZ/dnZ+dFPEy/rn//fPWk9YU83K9dlCdEBJXt7N9crzwsf/+M7dVldaQFxLf3pkbW5sZmRwdHd1c2Vlf0hV3c7fW19d3cnw+Ofl4PvNwVfURX1wcH1wdnx4ZGd6dVrW28NWTEN0QtL95Pj5+fXE2/bl+sfVRklJfnpmYGRkeXZLQVZCTV1awvD9+/DxwEBwdn90Tk1NdV1FdnF0SdVWVtfXwMbfydJRwcT0yMXaXk1GdV/Y0cnDWFlYcXBldcTRx95EcX1wcXZFRV7UVtfVR0RaUdvcxvbI1kR3c3txT3dBRHV+eEBHTEXeWF7e0FBC3fbx4eH65/v98cnFU0VSQHdEVkBKcHJxWcvN0fDO01xyeHhJSHVf0VdVUVfYxvTzzvT68s7dUl9f1NVE2N5GR3d6ZXBf0kdKcGBjbWxne3l7cFdWUcrLwvng6+nplO7h5vbNzsTZxPHCXtXRdk5FR0VHR0Vye39lcE/Vxvb88/Dy8PT//vv+8fbeW0FPTVlZRl5dQEl2fWRkck1NQNFQSkp2eHxzf3ZGSn1wS3Vf8+Tn4e3s4+f+8vbIzMPG2Nnb1lRX18fByfD2UHB3dEDUV9POyfH8/Pz8/fr4+Pz7+sjV19VT31PQ8MxXR3xnZ2R9fXx1SnZzfH1wc3ZKW1hWx8HCxvXk4Obv6O7i/sPdVFxOdHR+dEBMQEBQ9PX1+fz999JWWEDX2PX+/ffKwN/O8v/08v3y8s3f0NBXV1VRX9jSWXBnfnV3Wt9cV150dElycE90fnpycHVNVMnl5u3s7u7h+8ndW1JTX1hbTnd/eHdARltHcUJASktKd0VR2vb+4+7v4ebg4Prk5v73wdfQUkFS0k7WfEtQZnRPTkbd1tHGz9VGd3hlfX13TnZDdkPcxP/i7+/g5OTzzF1ycHx7fHZDR0hF1dHL9cjCXtZWWtZGQdBR1dbX0NrGzNHZ+fL4+//+21xFTNfd0NVGdnxkZX16QNRaX0FaUEx0fGR9cn1O18n3zfb65uzi4uLh/MRdTnFzcXN/fX1ydEJWVt3Z1tHRV093QUZHVsPK9PL/+fXO9c/y+fHwyNhTQ3RyfX13fH9/cXF8StXQ0VFc3VdAc3h7fnlzfX1xdl3Q2cz84O7plOri8tLSxt7c10taQ3Zxd0hRV9fUQd1cTXZ+dUZN3Mz3+v395f3/5/nl9vTy3Ul+ckpKSnV8f3hhZ396fFnQVU1YWHFlYGZ/eXNzfEdDTlbVxvjm4Obk4P/TT3F2R1dRRF5VRFfGxML6+vHDwtpfdnJPRFRV1dPM2t3FwdTH4ezh4ODz2F5S1cH1xtTVUnB5fHJ/T0d3fnB8YGxoahVjZmR4dk5NXtbM/eLp7uzj8MrZ01dV2lxOT11MRkxNS9XOwNrf1ExPeWVKxPT/8vb29ffz8v7j5Pj55cnXWH14f3d/f399f3xzd1jT0FRYR0t4eWRnZmVnZXlyTXB9TkBV8Pjl5+Xzz9nW38jIxs/b0FRd0djQ0UdKSEp0eGRjY2ZkcUHE38PI9vb84e/o7O3n5fnKwNrd3FRfWE9GSX5kZ310cH1+fXFnaGpoY3h5R0ZL1dDH8+bt7eLu6eD8wszSQUdTQEh1QEp8fkpEWV9GQk1GfX5yfXNH08TZ18Le0cPy8/bx9/D88MfQ0tnY9/DPWV1VSHdKQXdwQUZLcnhgaBVrbXp2cH5BUkpa9+bm7O7t4eTk/8zdwvHz9dNd2tBWX15IcU10fWR6ZGBhfkfAzcLIy/j/5eHm5ODi5vr8+vRVRUxKQ0p0eHhnZ3hyfmd2dENJdXB8f3l9TVVQUlfX3ff45f/h7eDj4Ob/9/H99fLyzM7b0djB0kd2Ud1Y1dZNdXNxQlvMwNbY3s/KyfLz8+Tl//r+8PnKw1ZFUXV4eH57cnlkZWV5ZmZkYmhvZmV6ckNCWdTx5+Dv6O7q6u3p7Ofl+vP9wtxUS0ZBdHZyc3dxdXVYVlJFV93GwdLP9vf+5OXl+ufh5OTm4Ob6+/PNyVR1dHpkfn5xfX5xdkhNdn54ZWFiZnpmeX9mfETU19T35//64uLt7O7u4e3g8vPL0szG3FJydH9gZXpleHl6enbQQ3HT1sD/5Ozs6JaVlZaV6e7k/M/IxWVjY25vYGNib21mY3hOdnB2fXJ7fHx6dEhG3fXz/fP65fj6/P/l+vPw8ffSQk90fUpbRVhaWUFGU1BCQU5OQ1rWXlld0d/L9/P5++Tj7umVleru7ebyw19wfXByd39nY2JsaGpsYWNibWNjZGVmek1V2vjt6ZWX6u7p6+7h5+TyyslccHl/eWdgYmxtZ3lyT1VZXtbWU17e19fY9P/+5+f4+uT75eTh4+Pm8V1EcmNiYmBlcHB2TkxIcXBxf3lkZWdjZGRgZnFDWNXXzPjk5uzr6uqV6unt4uXCXVHdWUhlYmJsaGtpYWdneHp5dHd8cELb8ufs7pWQkZaWlJTp7+37yFV5bWsVahVqahZqbmhmcnVCTUBKSERFWFhf2/Tz5+Xy+cvGw/X9++bm//zKXUtzdERZ1t9EXdNUUFBWVN/VWVlMcHxnY2d8d0hHQcDx8uTi6peU6+/s5vPFREtPdX5mbRUXEB0SExEWFxYVbm5oa2Z2xfzk6JeUkZfqlZWV6pTo7OfeSnd6Ym1oF2tqamxsZnBHU93W3s71y8D+5eTj7e/v4eb++efn4ef21lxyYmsUFW9gZ2dyfX92cH1/fXFNRERBSHhgY2Nmfnp+dE5Q1NnM+uPv6ejrlJXp7eHn8MjWQHBlbWhrbmFmZGdlZHtiYH5ewfHh7ZWXl5eVlZSUlevs5PnZdGdibWoVFBcRFhYWFhcVaWJhZUzR3cfO+OXk4Ofk5/v98vX1/OX5w1pOcHpkZ398cnR9d0JEQXRKVvT39PfK8cdSSEpDTdfGxvHy//rg7e/u4+Lt6e7g+M/N00t+Z2xoFRcREBEUaG9sY2BgZ31UwPLl4e/v7uLg4eTj7Ozt4f7wy11LeGdkZmBiYmhpbGJnfUxJ1Mjx5O3t4eDv7Ozi4+Lj5ubm++f/zdlYdntkZmZkcnllc0tyfmFiYGdwSV9YR0p2cn1wSllfVczH3sDK+efg5uLo6+jr6eL929hPf2dhYmtob21jenxyTU9wQdXSyuXg7e6VlJWUlJWV6pXu5v7IX0l8Zm9tbxQVFRYSHRAWFG9hcFHN5eLq6+ro6Oju7+/n//nxxNHXSXZ2dnZ3dE9NW9VQUlHVUNDK9cbw+vr998/WRE91R9PTwcrLwcL45P728Pn+5eHm+8jAUnZ3fmZjbxVraGsUaGxuaW9kck5RzPX0/efm4eDg7Ojo6env7efk89tIfXFlYWJjbWtraWliYGVG2fPg6e7u65Xr7u7qlOjp7O3g+vj3w1hzfHx+f3B9ZmV8e3phYGBgYXt5dHZ2WllETEBHXd/Z38fd283N0dbQVMTw8uTn//X2/MXW2tHR2dddRlnV1lZFTlLXV9/P8vLK+Ofj7O7rlZSRkZbq7+LkzVpLeWFsaBcWEBITEh0TFhRuYXBU2/X85+Dn5+bm5uTl//P3z9vSdHh7eX1+Tkp2dEhTX3R0W9PfwfL55OTh5/LS2sHf3M3z9Mj0/OT6+eHj4OTn4Ob58/7y009LdXZlZWZiaBRqFBYRFG9sbXpOXVHc8eX7+Obt4uuWlO7k5uTBXnB2dmFsbm5vFW5hYWBmd0NS9eTm5efi7+Pg4+/p4uHi7+Lh5/LeUkVdSUpIcX9mZXpkZmNnfmVnenRxeXBBSXVxQN9dWkNMSXRHVllaWlbVQEXWycjb9c/Jw9faxNNVU1l3SVtOfWV4cHB5c3FFSE3R0MHO/uzr6paRlpWVl+vh+vDAU3tmbWkUFBUXEBARF2hoY2V4f1/3/Pz8+uT6+vrn5P7l/dBCcXB0c35/ZWBtZHN+fUhYVVfY8/r+/uX68PX85eH4y8dQdXXUx93Qxc3Axcv++fH29MDWUVhSXXRxfHtjYGRvFRUUFGpoY359eXp/cEzT9uHt4uzs5/vm5vXc09VRR3Z1dnlmYWRnen52R3RLUlNVwf3k+P7+/vn9/+bn++Tm+Pf/8/T2ys3HRXZ1dX1nenh5enpzSXJmY2FibGd6dkJBW0BPTlvdx1fQ0NtQU83K3tVXXkJB0tDBxtvY1VNR28RFd3R3cHTS8P3A2tjd3fb74O7vlZaUlerq4vPLxN1dRV9WSGZpFBVqbG9gYWxvYmFmcEVNS0ddVNPK8vzz9MHWRUZDdXZkZGRnZH5CSX95dkRWwf7j7ub998DByMr/+fL39Pb1zcNXWF/Qxs7y+ufi4fvl8vrj4Ob7/vLC3d3cXXJsFRQQExYXam9ubWNmcUTA/fvj7O7p6+jj89F0c35zQ0BMd3pjbWJkfHR0SE91Rcb75/j75+Ps7ZWUlpXv7Of//f38/dnUREtIT15adH1nZHFJV8X2ysRFd0tOdnFKd3BzdnbU01hAcX9xdkXW2FB1dXFzdFzP/Pfx//Lz/eTk8dFKcHFyf3ZaQ0x0dkxfVcX9+f3/4e3rlJeV7+f6+fn65OX3ztZCd09AQUt4ZmdjbGBmYmxgYXh2W83l5eXk++Xl+fz99tFMS3l7f35le3pnZXZXzfHx8vbD9fL5+fz48vT1wfPn+8j1w9zQ3sH/5v/3z8fE9/765P/M98ja9fHYW0pkYGBgbWBtbmhqamx4S1zd2cH8/Pnj4cjD3lpGSk9W0kJ0S01LSF/Rx9Z1QFVWxM7BVd7Fw/Tz8uDs5/v45Obh5+fk+PX3zMn/8sZEWF5TVtXC+/7KxcddSUJ0ZWBtbmFsbmFlZGFlcUXX0cTy9MPe0lfH8fL298TRw9/byNdHTnZ3dnVDUVJDWlBfWMbz/v/+5eHs65eRlO/g5/ry9/H+99VEWENKQVxZTn17fHl4eGRtaWlvYGR8S11cRFNXUdD08NtTQE9KfXRAcGFjZ3x2S0bSzsXE8vn++ebn/PfFyM3S39xEdnRNU8fO9//+9M3w//vm7O/i7ePv7eDm+8NSWllMcXxkemEUFhVqFWhsbW1nc9/Nzvjn+PH28svc1NbcRnl6fXpkZ2RnZ2d9REBEXllMXtLbyvnn4uPk5ebj4eLs4uf4+ef5wsDD1UhPX1NQX1Lb111ex8za29dYcmdnZWFsbmxqFxVpY3h2QlxaRFDWW1ZWWU1IRtrBUE1ETWVkf3dxd3dDR3FwWl5CW11dWFjc/ubn5OPi5fvm4Obm4eDk8872wtLVU0B1R9TY1kRISGVjYH9xeXBAQXF5fndxdVlWRkJE0NVMdndLf2FkcHx8fHVMdkFX0NzezM1fUtDL9drH3lhLd0BSXMX/5/rk4O/j5Obg5/3+5uPn/fTO1kx0X1hNSXVwZ2BgYGFgY2diaWJlSEdfx8vCzfT/8cvLwF5KTkF3ZGBgbxQUb2dkeXF1dHdL3Mnw5+Dt4Obi4uDm5+fk8fXLw83TV19bVlTazsnK98vP8fjn5/7z8NlHRkVCdXF8YWxram9ubGZ/SkxWycjH3djB0Ffexd3UWU1xfXllfnl+cXZ+fn1wcE5Q38DbwMj08OXi6JWV6Ono7+jr7ODm4efzyNxcT3pnenlwdUt1c3xlfnN1XFRFQ05KQ3V1S0hPdHVKc39yf2FiYWV7e3p5eGR6dl5X38PE21JMVtvJ9vzl/vz2ws3DxcLCzPPk4uDl/vL5+PL65+bm5Pj9/fzy9/b099pSX0dJcX1+emVhY2NtYmRJRFzbw8TAwsXeV19GRU1JcWVgbWtraG9jZ35zdXF2Q9PI/Prk5uzu7O/v7ePm+/n+/Pjn+/H39PH28P3wx9DU2PX2/Pn3zt3W0lJeWkJNdHx8fmV7f3tmZHJCU9DSU053cHZOQFtRUHVwcHN9f3t4ZGFhZnhwcHdOT0XX9PP45uLu6euUl5Xq6+7i5uTl//Lz8MrfVVdXVdXZ8czHy/b5+/HMx83I3FxaQF3RU0R3cUpNQEJJdXdwfXt6fHFyZWZmZ2V/dUBPc35yS3V0W1fW3sTJ9v76/PHJxvX44e3v6e7v4uPi6ZSV6OLm4eDg5fPD2lVATVnR1kdzfXx4ZXhydHR3T1hXx/TC0EVJcnpmZmZkZWRkYGNibG9ub21gZHl2QkVbU1HH9fng6erqlZWV6ujo6O7v7+/j5OTk5Pvzys7C9v/55+fm5fvg4OHl88BSdXR2fHlmbWgXFxcVbmxjZmdgb2NmeX99cnB3dEFCR05/emFhendaUdXBzcL85eDi4+Pk5OPplZSXlOjs4+Dj4+b7/v329/D00FJaTU9LTkFGQnFlZ2Npam5hYGZkZWVleHh+eHp6ZGVlZGR6f3J3Ql5W3N7W2cDOxsj++Pn4//3/+f7/+ufn5uT+8fD/+Pn6+//L2tveU0JwfHBwd3RKcXF+ZGVkeHFKSndzeWV/d3RyfHJ/c31xRkJCW1lZWUdS1VFWVt1R1c/LzdJcWlDTx/H//f/78v/88/7/+Pzz8Pf///fC2V9aU1lbT3JnZ2R7f3ZMQE1KTlpDSV3TxNNZWVlCdEtHQHVHRFpdUlbR0tLbwM709MbMzMLI9/f398bQ1tRFcH14enxyeHx8enx3RF1ZWNDQUtPA2NRf1NBW09LAwdFFRU1IR9bFxs3H9M3J//j5+Pv/9cTCwsDAyMPeXV3ZycZWX1NScn98ZWZtbWJtZ35KRXRydUdISl7Z1lZTVlJPQkl1QEt1dXZDRdfZ3N3I8fHl4eDn4eDj5/rm5+T78vLOwfX3+fHCwNxedktbTnB3cHJkY2NibWhubmhsYGZ7ZGFnZmZkc0hJT0tJc35zSEBbXllbWt3A8fn8/uTg5uHs4uPj4ef4/Pn98PTY1URX2vH6+fD29/b38PPA00VAdHhlYW1pamoUFGpobW9obmxub2Jhe3t6fnd0T1hdVdPby8n25ODp65Xq6O7o6O7s4Ofn5fnl5Pry/f3x9PP6+vj2zthWQURETUhyf3thYWdnZGNhYWxvbWFnYWBhZ2NsY2dkYWJmYWNld1pcRNDa3MX94+3t7+jr7+zp6Ozh4eHn5OTl5P/398DS1dzA2Nvf1dVFX9rQRHVJT09T3NvAUk9GQ3RwTEl9emdleGR4SnJmenVzcNHB9fDCy/f09Pby8/D28f788vj68vT19MLw5fj7+ffI9MDf2ttQWkZbWUBbWk1yfX9/cHRNT0xLfXN8fnFCU1NZ1tnA9v3l//Py/P/85ebn/vbCzddHXlNHdEtXXE1d1tpWW11eXV/N88reVlTVREFdXVh1Q1FCTdXXUElxdnJ/dVJTRExLX1JOW9LHzc/2+Prh7uqV6e/v4uLv7u3n//DxwtLGzsdWV8XTUNbe005/eWdjY2ZnZ2BsYmNvbmNjYGB6dHdJV8fD0VHc0lHfy/f3xtTbx9/GyMjK9uTm5eHj4OHm5OX9/uXm5/r75eT78ffK09RU2dNEUldQW0l1cmdne35lZHp4emFgZmZjY2Z5Z2R9dEl3cXZweHRU9v3w/vv+/eTg4uHi6e7i7JWV7+Pt7+D65Ofh5fn+99rbz8nF0tzRWXVITkx9emVkYm9sY2BsbG1jbGxtYm9ubGBmYXpzcnB0WlZZ1Mn///rj4uTk5uHi4+Di4uHk5+H7/P775+X7+vnx9/PO3dreUUVNTXV1dEpHQ0lPQVFfS0hJdnx8fmNtZmFhZ2dkZ2Rkckl2TVDR2NPXw8vN9P7l9/T88PD9/P74+fzk5+Tn5Ofm5Pj/9sHS1Ul7c3N8fnh6ZWVkZXRJc3B8fn99cnFzf3NGd3JEX1HV2cH19drL/vfMyM7MwcDax99bXdZEUNvT39ncxM3b3czD0VNeX1NYWEJLdXdxdndF0VdU3djYwldFUlhKdUh2Sk90d3Z9c0pxfHTQ3dr38/rk5fnk5OXk5Pr75f33xsHA9cfB8fTZ29rH1F1FSXR7ZGRkY2NibGJvaW1hYWZ7fnN0Skxxc3N0SXx4f2V6d3F3RFLXyP3y5+/s7+/r6+7u7O3g5fv498rw8crE2c/PwNnCxNHeVER9Z2FgY2Jpb25rbm1hZHl6eX12Sl9fQ09EUkZxT3d+ZGZ5fHF0RNHOyvb6+vnn4uPg7e7o7ePi4OH4/fzz/vr5+P/w/P32yMv3VUZBd39nYWNvaWhoaWlsbGxtY2JjY25rbGNuYmFlemR/TlhBQFncyvT94eDn5uLi5+Ts7OHg4+Pl+OX48/Dx8PXN9Mr3wtrXWUdLTUNOQkh2dUpN0NvT3lVaTEZcX1JDdHJ6YG9vbW1tbWBgY2V9cHROQ1xUzfP5+vnk+vn65OHj4eb4+/r45uDm+vj48vXx98zfVF1NTXd9cHZzcXFJSExZS317fnJ6ZGV4ZGVnYmNjY2RzcnZZ0c33//r6//37+vbI9vHPwsDB3NzR2cjM2trXW1xX2t1cTUZBd3ZMVl9dWkNAV9PN/fny8Pbz//L8zVhaV1p0TVtaXF1Mf3VDXMDz8PH8/Pb0+//3zs70wdnc08TE1VlOdU5U11BSREFHWlPWTndyf01Lf3VId3V3TkF0S1tNR09OR0BGR3V8ent2TEZZVt3awvzk4+/u7u3v7+no7+zs4fjy8PL0xt3dVFdU1VNaSkpxe2Rnf2VgZ2Rgb25iYGd4dEZT1FfT2VfX3FFdRVffW0ZRX0FOW1xQ3sXx5eXk5uDt4u7p7O3t6e/g4eDk88/KyM/I9Pz88PT1y8zS3Vp0cXt8fmZkZGNpaWxvYm5jZHtgbmJtbGJ6Z2ZleHFIcXRCUVXC8fH45eDj7+7q6urq6pXu4ubh4OTk+v3bVsbGx8TDxt1XUFBbTk1HSHB9cE5SR0deRk1eUl1RUd1QTHR3dHF4fHlkYGNnfnZ1Xd7F2Pfz//z75frm4uzs4uHh/f3x8ffC9c/38PXI9czb2snJ28HCzczQU1ZeWVtQREFOTFtBcHBHS315e3p4e3NzfHh5f3l/T1tT19r28v32+OT7+uX6/vzl5ubn5OX21kJEX1VdV19PdXt8cnVPdHR1c3dI1cHCx9FSXFHbyMPw8/vl/PLy8PfN3lZdU17U39rc39LaxszI9/bO/fP2//fNx1VFTkdT1FdFTEtDRFxTW0txemVkZ3pySnF5Z2RkckpGWVBKfXl0QFpEX9ReU13VxMvI2d3X19/Ew/X85Pjy/Pnn5uLp7uzt5fz1/fbG3tTc1k1yemVnYGZjY24UFBcRFxVpbGN5fnl5ZXBMWllF1tFU2tnK/PP2ztvb0MDM8vj1wd7CyPTy++fg5+Hh4ejo6ezn/vXJ9vLm5/nw2Fx3d09DdHlnYWkUFRUVFxcVFWpoaWJtaWsUFxdqaWxjZnJ2eX50RFle2vTz/Pjg4+Tk4e3u6JeRlpeVlOrv7e/h/v358/vl/P7PU01AREJEQ3lkY25paGhsYmxqaWxhZWdlZ2dgYmdleUtaVkB2cHZJRcXw88j3//Dl5+Tm5ebn5uXk7e7t4OTk+vH65/rx9/v6/P398MrB11hxZXh9eWZmYGBvb2BibG9iYGBhZntkbWdlZ2F6XNBFTkRRU1H18cRfU1HczfLh4+bn4+Lm5eDt7+X2//LIyMvJ1EFFUt3U3fb00UdAdGdgZHt6Y2F8e3x9cHF6e3ZdW03H9sNRU1TZ08n98/HM/eX48vv69NzQ3sz28OTh5fD19NJYXNrDXEBQXktCRFhLS1ZR3d7C/PPdUkV1emNtY2Jvb2Ntb25sbhVrbGFmZ0/W0dTF9PPz++Dj4+Dt6enu6ent5/7w8fTx+Pv029NecXp7f3pmZXl6ZXN0cH1wdEhNRN71xEdMdGRibmhvbm5jc3F2XlBBQdfB9vHx4enh5Ozp7ezqlZXq65WXlJSX6+H+9c3bVVTR01JAQ3F4ZGd/fGVncFl3S0F0fXxJW3R6fnV9Z2dnbhcTExATEBYVbmR5d0tIR8Tz9PHm7OLg7u7s6eqQkJCQkJKQkJKR6+L69NNJTlpIeX5+e2VmeHFwc3x/eXlwR3Z/ck7SQnB9d3d3cX54YWJibWJhY2FmfVZWWkVRyf385+Dj7OrqlerolZeRkJOQkZGWl+jn8cLUdn55ZXpmZXByeX90QUNXwNlfWMXaTXphZmBibWxvbmtvbW9pYmBgYXp2c3JMxcrNxc3PyfHk5u3p7+vq6+jo7+zrlOvt5OXg5c7URHJ5e3l7f354fn1le3J+c0JQXHV+d09Lcn5kZnpOWVbF3t/axNjMxdbTzPH0zcPx+fj/+/3w8eTj7e7u7e3k5eb89Pvm+f339fDx0UR0fnp7ZGd7cHRxdH57ZWRhe2RmfmZtY2ZpFWxgY352QFDYzPL+/eTk+Pj88/fA9/vn4ebn5uHi4O7r7e7v4PjxysH0wtRcREJFWdRTdHB4Ym9obmNne2V8e2R7fHt7fXJ9eXx0QXBwVtFaVNz0+ODulZXp7+/t5uT9/Pvk4unv4uzv4+Ph5vvx9MjGV1heVlhATXVDQ11QRXR5ZWFpFWpoa25iY2xubWhvYWBuFRVobGRxTVHbz/b45u3v7O3v4+fn5OT65+Hg4+Lv6pXv6JXt58He3dVV19hX39FQVVfXWXZ7Zmdmb21gbW1iZmVmYXh/ZnNBXHNgZ2ZhYXJB2vTx+uTl5P7/+/z8/+Xk5+Li7uno6Onr4umXlOL4/t1adU9Z09vewcLIxF1ERXFkbW5raW5qFWoVFGprFGtheWBoaGlraGxgZGVI3c3z//799s/Kw8TL+Ofm4ezv6Oro7OqRlu/4+vHEWE1OdUhNXNzbxVBQ1112f2VkZGNgZXp6cXZ6ZnNZ0n9sZ29pFG5lf3h0VsD09PX++P/y/v/98Pnk+eTt6Orp7JeXlOPH21pxfnxxSXFwd0FbU1Ba1FRDcHFJdn95Z2JvYGFmaWllZmNqFhYWFhZpZmZ7T1TC//v+8vDy9fTN9v318fvk4e3i7ePs6ezo587BUHR5c3Zzd3FNWE5DWdNSdHl4ZGBjYGV5eHVLfGFmdHR2eWBua2hvYGR/SV5Vz/Pn4ePv7ubz/eTn5uDs4uLi7uztleju4fTI0lhfQkRPcmV5d1pbREVKZWBnZ2Fjb29vaW9vY2FgZ2ZsahQUFBcVa2hrbHpwXNHx///h4+Hk4ePp7+bj7Ozu7uvj7eHg7P/5/PTAVtHWSEpKQVFHS0pFQ3VzcXtgYGd6ZWR4cnZ6eXN/eGdlZGBubWRken5xd3VZ9P3m7uiV6uiV6pWXlpeU6+7p7+/v6eLm+v722cv3zMDUUdNRVlXVUU58Z2ZjYGdgYmgVFRUVaW9uYm9iYm1tbWBmZmFnc3ZF2c/M8ebh4OLs7eqU6uvt4eDv4OHg+/vk4O/u7OPj4f7x8vH28vbIycVSXVlOdnhkZ2RnZX5kZWV+entkZmR5ZWBnYWNkeX1KTNTO+eHplOvp6+uVlJWUlJfp7+3h4eLs4OTl/vPz8uTh+Pb29Pf19v3xwkR1dnt6cnllY21vaWJjZX95ZWZgbG9pb2JrFGljZnNS0sX0/OTi6OqUlpTr6Ojs4uDg5fHy5+T++OTk88jG3M728vvl88n39MzK3lFHf2V5ZHl2T09yemBlfUpDTEpyeHpkY2B6f3BwWsf24OmUl5Xp6eqVlZWV7u3h+8zK//H2zdHdwPTy/PbOwdZX1trb2dFbQ3V8e397Z2JoFBVubGNsbWJtYmBkfnd2eXxycEpE1c/19Mjw5+DolZeXle/j5P7z8/TE3trHzPP45f/+yvf98//88/TYW051TndzfXt9fXh5e39+ZGNqaGxgZGV8fmV7fn9xd05GX970++Hs6Onv4uHj6JSUlerv5fDH38Lb39rQz/L74eHg5PRSSkpZ1NbTX3NnYWJiY29ubWxub2ZjbW9qFxATEWliZnJ0e2FmfHFMR9f38uft6pWVleL9wNDE8/j68vTMxdLby/D85eTn4+Lg5fLBU3xhZH11S11RR3JkZGdmYGBmYmxkeHlkY21oFhEXFWxleXd1dE3d/Obg7O/ql5CSkJfr4fZSRlTQyfHy/vvy/fjm5Pn99MzN//7OUkl7aRcXa29gZ3t5ZW5oaWsVFxcVFRVvYmxuahcTEhZrY2VzX8r89vvj4+Dg4OPm5+H78cZQdXxyXtv45uyUl5To7uH4ytxTX0Fc3Ed3fXpgaW9kckdMSV1Dd3J7ZGNtb2xtZ3dLeGdmbWxtZXTV9PHn7+/p6O7s5vvz8vvk4OH+8cza1FXb9ufj4+zt5OT330Z5YG4Vam5mZ2JjbG8VFG9menpydHJkZ2diaG5vbmB/Q9VbT090dHNC3c/9+uHj4ef4/cnb2NPfxPng4Of4/+fl9v7h7e/s4OX1VEVwZ2xoaWhuZHF9eXt4cH9+SEd1cXV1dHJzdX1lZH9IWc/l4eDk+fv/9/Hl5P7k5+bg5OTk/vjl5ufl7Ojp7Ofk5/zPwPL1yc/XUFt2emIVFxEXFhRvbWBub2JjYGBme2FkeXhwc3Z1dnZ0X9rJ5OPv7+Pm+PXcUFZbQ9DB9v7k4eH65+Pv6emVlZXp7eb9yNlU0FTR397d1tNScXhlYWFiYmd4fXllYW1jZmR5dndOXdbfzcDX0MP2+eDplJTp4uD6//n98Pb39vrk5eDt7OLs7+/p6e7v5PD00Ex2emFiYGNhZXt9dnN5Z2NsbG1vbWJpbGBjYWV/cUxT3/fx/P7+//398vH18f388MPy8Mnz+fjn4ebj4+3v6ens4+Ph5+Tk+vjOxdvVWktBTXd+cUlFX050SnRyfHlyfHN6e2Vlc3F2QlXB8v3h4OHg5+fk+f7wz8zI+frz9Pf98fP64O/v7urp7+7t4uX/9sHE397dWnZ4emdhZ2ZhZmd+d2VnZmZhYGBjYWdkfHFwcnBAUNPAwPTz9/nl8/b1wdNQ1lNc0Mrz/fD2/f7k4+3t7+/v6ezh5Pz1V0dfXkFdUNHfU0dOdnZKfX1OW0REdXNzfHp7cXZzdElE1t/Cyc7L9PH3ycvx/f788/32y9rQ38DNyvP38f7l+Pn8+f3O9PT129TWXXd7Z2Zjb21nZ2R7eWRvaGhsbGJhZmdmZX5lemZhZ2R5TN/H2MH0xVxYR1nU18r2ysn38MjDxcfEx8rl5Pr5+/7AVlxX0VFUxcfUVlVQR3F/f2V6cEJMcHxzfWdgZnh8eXtye2V9cH1lZXJ0dEbL8M3JyPfO0d7MzczNyMPbzsj29vfy/P308v/w9sDH3FBOT09JSnxyfH98fHp6e3thYm9tYW1iYGJvbmxmY2RleXhnZ2d7fnJ1SHdxcURTU9DWUVlHRVfVwPT///D+5+Hh5Ob7ysbW0tTR28fH29jX0cr3z9deXdRSfWVxRk5zZHh0TEhwemdkemZhZHZQRHVJ2vPO2M3P9PDNw97EzcXWQUFWUtnO+eDh+vzk5/j+9t3DwvfH3MLZ0FhBQnVwS0xAX3R/ZWRgYmdnYWdmZGZhZGRnZWdkZ3hFVNdSWlhTWHZ0WFxETlhcUFXWxsb18ff0/+Hi4Obm5+fy8Pn6+uXk+/3y8vz32d/UWENd0t7e0FxGXkhNSnRDSXZwSERbUUdBVFJVwPTz9vbD3MPD0FNd0d3SXVHN9fP7+vj45eTh7eLm5/z28snN3tLAVFBbQUJ2dUl1dXZxS0FZdElNcHJ7ZX9lZ3l/f39yS0t1T01CT1lR08VX2dJZX1NT1lBd3tjBxsnx8fvk5ebk5+Dg4+3u7eDm5Pv7/PDyy97c3dvbwMv1wcL28cvC31NeT3R3QFZaWFxDR1PRx8z39MnJw8DB1FdQWER3cUhaxcn2/PHz8PPy/f3x8vfz+/Hw/vPI0Nfe1V1cXERYVFNc1NNYSEtKdHF1fX97ZmdhYGBjZnp5eH53SlzT0tFcWkNxSU1LS05aXV7Q9/Pl4Ozs75WUl5GWlpaXl5SV6u/t4P/L3ldX38fMz8/29/X2yt7SU1leS3Rzc3F5ZmNiYmxjZmR5enZ1cnNyf3t/c3RH0M/I9/Hz/P775uHn+Pr65uDi7+H6+P7z9vPz/Pj9/P3O2tFfRkp9e2Z4f35/e2ZjbW9paG1gZWdlfnl9d0pzfmV7c0pwS090dVjR1t/L/ubs7uqVlZeQkJGXl5eUlOvp4/nLztvR1NLR2tvcyfXMwcxXWElLcHhlYGJvFRYWFxYWFWtsb21nYWBkZGdkZXFaV8H28fH18fn+8vfz8vP/++X65Ob4//H28v745ebl5fvy88nGxl1Mdnl7emVlZm9rFRUVamhtZHt+fH99fHlzfHl4f395ent+c3x+c09GXcL74Obj7+rr7urp7eLh5P/AxdxZcnF1fHtwQltCQ15QXFhSWU53dHF5ZmBmbhcRFhQXFWN6cHx+eXl9d09BX1JW0sfO9/fM39LYzvTx8/L9ytvf29/Y09fW2PTy9vf5/cBd19raUV5V29VeQnNyc3N7YGBnentnend1WF1cVtDBwtzUXFtZT3dxc398cHB4fXdOR9b2/fH++vrk+v/D29d0f2VkY25sbGBnZH52dElWzvfw/vr58cPWRnNlYWxuaGBnYmJmf3dOREVfUsjl4+3m5Pjx9vbI09HcVF7Tz8bTwNpV3djF9//++vz7//zzzszaxdrE9fXEwcLUU15dXUJBQ3N4fXhyfXdaQV5VwPfO0t7fVFNYWkNxdHZ3ZGd7Znh9SFtHVsL29vP/88rLwcXfUk5Od3x4fH1xdHZxcUPa9/7m5Pn7+//89N5UREdKf3p+f3BIS3V1cU7D8vL/5eDi4OPg5fP1y8Lf297X3NnE2trBzfD/5+3o6urr6Ozh4Of88PHNxd1fUkJJQkFFXkROR1laWEZCdXFNT0BaWFhIdHx9dn1nZ3p5fn94eXJ/cnZ2d17V3/H/+ubl+eX9ysjy9dzWXUl9fHplf3FFxPHw5Ozu6evo7uD6/PTN0FxJf2V7fX1xd0tGTFb18OXm4OLv7+Ps4uPm+v/2zcLE19fS0tXawPX95OTm5uHh4uzj+vDN2dReU0JxfmFmeX95ZGRkYWd7ZmdkZmFmZXt+cXd2Qkp0QklNT09RW9bUW93c2dvQVlTZyfzk+v/+8f388v7z9MLa11NNdnlnZGR7f3ZCRN3A/Of7++Tl5OXl8NNQTXZ/f3NxdkLS2s308Ofj4+6V6u/s7e3s4+fw3lRYREhbXkVfQlPHxsf1/f35//3339NSdXB6YG9rahQXFxVubWNmemdgZnp0QkFXXE9IXFBbUFBVXU9OXlDXwtjaz8Px8vb55fv65efn4+bl5P7y/PDN29BST3d9emd4emBjZX1K1MDO9P/4+ODi7e/h5P3L2FBPQkt3cXB2TkVdVNr0/Ofj7uno6+no7Of8zlJKZWBnYWBtbGxtb29me0BXUN7e0tJcRU54Z2BsbG9sb2JgY2BhYWd4fHF0R1xY0MDc0dHEyM7Lz93XUkTV9fH39M7B2sPAzvzk///9//bBwcL18ffOwtzUUljW0FlCSUlFXFJGW1TWzPfx8/f2+fn9+PfYVVRCd1lQSERVXNPY2djaxd3fwffKyNvS1E92fGFiY29pbm5rFRQXaGNhe0faz/D58fX0wdVQVl9wYWZjZnphZ2dmZHtNUsDB2fb18vvM9PHAx9nGxlBdT05JSEJXUNXdwvbz8PTw8vjg5uTh+fLw9v3xz9rfwcXWXFt0fHtlen97enNN3Pf38Pfn4Pnk4P7K30RIcWVhY29uaG5jZmFkZX5EUU9E0NDAyMTWWXVwcH1kZWRjbWJtZmVleHxyUvf9+fv45eX+8MrfV15SWU5zcmVge3Fzd0FTXFnRwsTexMD08/bKzMfS3M/F3dPQ1Mb/5eHm5uHn4uno6Onj5eXl8d5RRU1JSFhYR9TX1NvfUEVPdHZNR1BdTnZxT9RAcHpnZGZmYWNsaBVqbWNiZnxB2fX/5efh5f/h5vD13FladHx4Z2RkZnlMRVbSx/bl5uPv7u/j4u/j+srRRnBkYWBhY2BncE9EU1Ha8fvk4+/p7OHj4+b69vf98srDysbc39bWyfHw9fH4//zk6JaR6uzu6e37911JREl6bGoUFWhvb2gUamN5cXJzdE1FVll1dHVMSnF9eHxzfXB7ZX9xS3VF1vf/+ufk5+Dg4OPh+PfBwddAdHx8cX1xQVNWX9PO8f/z/eXm4Ob6/cDb1FlYQVhZSVxSU9LN8PP45ODu6+7p6eDk8vXFVVJNc3dMQUZY0sDx/uXh4uLg4uDm5P/3z9FbeGZnYWgVFBYXFxEQF2tpbWFjfk1aVMb2ys3A2txc1UZ1TX5ne3t4f3NMR1vTyvHk5uHs7uzj7uzm+vLxwt9Rc3JxeXtkZ35IQE1Uwf//5e3s7+no7u3g4Ofy9sRSXkNOXkFMRlBeW9DG/f/65OT45+Dg4fvyy95RW0txcnhkYWZkZGR5fUpDQlzRWU5SVFNOc3F6e3lmYmxmZ2FlfHNxcXVOQU5DUtVR0/39xsLMxNPBw1VVUVxAS1rRx8XayPDk+Ofh5OTl5fPJw9rY3VVSWVnV11Tc2NvLzPfk5eXh4eT75OX7+/nwysPcUVhMdXRKT1v08vLy//3w5eDn/v3EX0NLfGZtbhUXFxERFWpqbm9oaWxkc0zD9vb8+Pj+//P1w9BFQnx7Z2FhYGF5cnFKTFLQ2vb1wsnDxtjSyvLOx8bQVEdEX3Rxcn92Xk1H3ML0++Hg6JeU6Ojp4+b6/9NUXUtKRl9PdndMdUfT3sfx8/37+ufh4+Lj5vvI0VZYTHB5YG1sbWV/fnxye3p7fnBzf2Rsb25oaG9tb2JkZ3l3dXZ2dn95cU9JQFTQ3czw8/X++/P2xd/R39FMSnZyc1pX1tnb39nFz9lUX3V2SkZc2cDD9fHz9/L5+fj7/P3//fz45ubm4eHk5OT+9NhCcnxxdndLTk1e0dzT3svA9fDz8cjcVdBaT3VOSntnY2xvb29rFWhobm1gZHFS08PI9fTx+ffF1E1xe2dnY2FgY2d7cURXV1RZUtTd9fD2yPX39/34+Pr69MnLwtlcQkhweWdncVBRwPf1/OXm4eDs4ufl+vvy+Pv998TVUdVUXkNJdXVTwcby5+fh4+Ph7e3j+vTNXHZ5Z2dnZ2BibGxtZ3h8cnNkY2Zkf3hlfnB3SlVeT1NQW1tW1HV6ZHNbxsVfQklTyv7l9dxdUN3WVHV5c0RSUk1/ZXVU1lVTUFzR3tnH1lXawv3n4ezv7Ozt4ODm5Pj1zcv18vv/987N2dRXUtbZ0sDbwsDEzMjNy/TFzPD09vH2zMD0x8DxzcXa2VFFdGVhbWlqFRQWFhQVa2liZ0vDyMj19fT02vX83VJcSFtbdXV1W1xCTF1UU9LeyPPz8/f39s3E9v729/Tc09VAcXJ0S354cnxyQVHY9PX3/Pjm4O3rlOrr6+iUlOnm//XBV9XeUV5V0NnNycveyMrJ9/Ln4+Hk+Pb32kVZUkJPdnNxfmVlYW1ibGhsZX1wQ0dwRlNF0sdXT0lxeH54ZWdmZGdlS9HXV9zEwNvP9M/29/D7+crRV0F2dnFIR9HY19DS2trc1MXPzMjK9v37+vj898rBwfP6/v/z8PPz9MjC1lxc28bA9/3//+Tk5+Hh+v77//fKyffwzdJR1NRFQltEdHllZ3t2fGFib2lub21gZmRkeHRDU97b2d1WUdv1yNtRXURfUElNW1tMdnFydkxc11FTU1LSxdjbw8dU1N/L8ff2xNNcdEhKSE52dELcz/fx9v/65+Dv6ujp7+zi5vzO01FLdnN/cnd2S1pNR11V3sLy5+Hh4eHs7uHk+v7x9MrEUEp5YWBgb25ub2xtbW1iZ2BiY2RxS0N2cHVzcEpOSnR3SkZHXV1ORVFRVtfB28XBwvfN3lFcR0pBQUlyc0dFXFlIdHF3TE9Z3tNSR1TJ/fD8//v7/P/64ePh5P/88cPeV9XXWVtU2cH38PHy9fb12MDEVFZFRFxcQUVBSE9E0MXd3tJRR3RBSkt0fH56ZGBgbWFgYWR7dnVHXlFU2VdU31VXW0t3dn9lZHp9ZGZ4cHVf3NLb0NTNws3w9s3E1N/E2FHXWX1ycndATHRIdkxaVdDW39j08eTm5eXn4Of65OT49MfG1lde1NnU3d/W1ldR0tbc9PP18OTj4+Dm5P7KyszWXUpzemxoFRQWFhcUFRVsYWdyTkNeU8T08fb39fT239BXUNVBS3Z1TU9MWF9WVsfx9MbT01FHdnJxcXZxdUxARkFf09RXV1DYyvTz+fbLx9PBzNvAyPT/+vz8+/rl8PP5ys3A2d/bwcXG39bW0MXEw/by//n6/f7l5fjy+Pzxw1VZWF1GWEpxdnV3dn5gZmdmZGdgZmZjY2NgZ2VkfXFKVs7y8PPxyPfy/fLy/fbx9M3d0t1WRkNSXVHHyfX29/fIy8Da1tJaf3FyfnZzcHZ3dULb8PP28fj65OPt6ZWV6ePl8PDz9dBcUEdGQEhPSFrW19LN9v3l5eXn+vD/+ffw9sj38PfH11JcdXx/eXpgYm1sbWJgZHh8ckhGXt3Yxsj09sfXUFRWUUNwe2FtZmV8SktE1MXFyfT2/f365+bj5vj0wt9fRkFLdXR1S1pX1MD1/P3y8fX19crbVtRXUt3ezPfNxsH3yvX38v71yPf9/fDPw9jX2/TJyMFU3d3axNJXV93R3tLU0VdRUVtxZmJiYmNgZntnZGZ6c3NPfX9CTFzW11JdXF/XzPfY3NDdwM/2zNfBUXVW0FZPdnZ7e3lzd05NTF3cxNDRwc/K8Mz19vXB9PzFVFZ1S13G29LI8fj64+nu4vj/+/z3xdJNfmFubWRnZn5P38/L8f/+5ODj7+zg4OH4xtdbdUl0cHthbRUXFGhpb2dkZ3hydHVJdnlzfU9V3ddfUlZVXNnL3tZcQV5aVVVcWkp0cFvc0trG2MH0yPbyyMTXREJPdHF4YWJhZ2d9dUdd09nTxc7z/+Tj4+Lp6O7s4//B3VFFSFpeRUJcXlHB9vLyysj0zt1TX1l2eHt7e3NDT05Z3cb08/LJxNLdX3V0fGRjYmBva2hrbGlrYmR8SlPcyvfy5Ofk+v3EVFdMfHFPSHRARkJSVNbSxsnOwcD1yt7QRUlcR0NT0lVXx8PBycnf3szfV1nW10ZEUNnYxszK8f7z9v39/fz5+fv4/PXI9/XbV9HXUl/R2Nr3/fn+5+Dh4ODk883fXk59Y2oXERMQFhRrbmFkcl3ezPT98/X08PPKxcXXUVdDQ0VMeXp5cnFIUtbN8/L29PLxyvXB1F1bdXJMQnFwcXVNU8Tz/vnxxc79991Q19HUVd/K9/H/5OHg4Obh5/DA2czHXUhyd0tye35M1VdU3NDb8fD44O/u4OXk+/j//PDG2F9Y1Vl1SnF+f3xwcHh6ZGFkZ2xrFWprbGZ9dVbB9P/74u/v7+3m5f/02tNST3V/ZmBgYWR5S11ZXdfYx/T+/v/99MvDwdFHSXJyfH1+e3dwdtPz+ubi7O/t4u3n+/nz9MDEV9TF2tvYVFPQ28fLwsTEVFTW28/N2tVQUdHMyMrAx8nI9M7YUFdQQkBDdEpze2R4cnJ9fXdKT0Bb197Ozsv33l5PdHB9f3p7eX9JXdPT0cf3+uHi7ef7/drWU0t8Z2BgZ3t/d0lDdEhXxvT08PP28vP+/P/xxMXZ11NfXdXF3t7ayPn9/uT7+f/wzsbA21BBTUpCWFxUVdTfy//5+/ry8/TC21pLfmZjYm1sY2NsaW5jZXJxdFbCwcPz/Pjk5fr+//P1ysLOxdfRX1hdR1lNcHFwfnh/ZWVkfn12Q0Fb1NLbyvz65uDl/MnA2ll0cHJ4ZGR5c3F1RVPVyf7h4+Lv7Obm5PD1w1dbXH9mYGNkfn1wcUHRz/f84ODt4+Hh8vrxyfTc1Ed2fkp0ZWBsYXp7eGRjbW1jYWdkYWZ6cXV9dkpCVvT/8/374eDk8sT18vn1WFhd3VdzcFpddXxydkl3fXZ1QkN0dEpIc3JOWFld3drY08Dx+ufk+PP1zsb3/PTNx9VRXVFYSUJDdUJU28XewszY2dVeUFhOQVlYW11fWUVeU17Tyc7MwMDb01ZRR0p2eWVnYWZnZWVlfnl5dlpd08XaxdzC8PfOwtpWW0F2Skh2fGV8Sl5U3d7ZycvN9Pz98f32zfb3yt1XR3Z3dElIcU9LfHBxdk1MTVpR18f2++T65+T4+f79ycvIzsvT39hSSXB3dXJzSU9OWVjQzfb//fLy9ffKxsHDVnd1dnN5Z2ZhYGZhY2B4fXBAX9De0NHYx8D28vv4/vr89/TLwN1EW0ZNQU1JS0tNdH9+cnx4eHdaVNHU09rC8/n5+vrm5/vl5fzLzMLDwM/b11NYRVpfWFbU1lTTzMbS1dHc3Mn1zcDA39PdV0RPSkhBXtXdzvTPx9vG2sTK9/bKysFRXFtfRU51c3J+f3t+f2VmYGB6fnJ3QNbbwM7y/v///Prk5uT998HfVNXX11FHTUFGQE11d3Nyc3RNXN7e3FZFRltX19VfU9fX09TX3tzZwPf/++Xk5OT4+/j5+/r/9vXOzNnXUERNdHF0cnJ1dnNzdkhe19rLzMv09vXD29FSTE9ZUlNUUkB3fH1wcUp1cnx+fHJ9c3dOTUZUxsz2/PL0wMXBzc3N2tjc39BeV1dTRk5Z19dX111GS05R2MP09/f09PH1wdBXWnd0QkVEXF1aTktAQUfV2dvGz/fx8PL9//Ly+ubh5ub+ztLVXFpZRU10cEtaX1FRUl5EVt/T3dnRWE9BX1xQV1FQWUdOcXlmYGJsbWFnZXxJTUbSy/3k4+Lg5+T6//31xtZfQkxbXV5cT35/c3F2dUxNQUVQVNHf39PS2sTNzMDNxtbX3sbHxcfBz8HGwd/Z31ZdWVtW3cTOytnV0t7awsnD2VdfREBFQUhJRlndyPHz/ffP9fD3zsLMxNHX1FFeRU9yfHh6enp4fnthYGZnenJJWF9cWFffw8nCx9rA9Pby+f/0wPXx9vTOwtFTWEdLdHF4fHB0RllQ1NRVXFfQ19be9Pf19cjH399VUV1cV1fcwMLM0tbEy/H95fr48/T0zMLQR3R9f3xwSUBGTk5EXNRWV9DWV1lYR1heWlbZzczO9crD0lFeQEpzf3tlZGd6fnBMRllX0dvI/Pv78MzD2NLfwcHE3tbUV1FTWkt2cX19cUpGX1/Szc/AzsLG2djG39fR0dVW09/d3MXGxdvb297c39ze0tVUUV9b1NxX1trY2MTHxdZfWFpGVtbSw8fHz/fJwsDXXURAR01aU1lHWF1YW1xfXkZCSnF9e3h7en58cn1xT1tcUt/excnCzs3GzcDBzPf39/H28//+//LJ0l1ZUV1CQ0t1dUpFRkZcW1nU0trAy/XLzcnI0F5HQkZBTUNHRkRER1pZXVBQ0MXO9/Dz9vTJwdjQ1tHX29vQ3NfX2N7d39nR3dbX0NHd09LV1t3VUklxcXx/eGVnZmV+fnhzSHdIX1TX3MPOy/b0ysj09cj19vz9/PLx9vD32dBWQUFHTEl3SEFMdUxARkBMTVpS0NvbxMbDwd7d3dDV1d/c397awcPDzM3CwN7T01RRW0BaRUdESXVEUNba9/L8/vrk+v32xUZyf3pke3h5fnNJRl/W19zDwsHNzNrWXUl2c3N2dU5BUNTd2N7fxs7Pyc7Ext/VVNVW1dHX09lRX0JLTE1HQVxSU9Te2NdRUUxMQVtf0cHI9PT0ysL29vXx/Pj99cbY1tPUW15cW1dW3cbAy/D3wdrcUFhNdXZxdHByd0NBUtVQX0VGX1HW2ML18/T08cnMzMXd0ldZT0hATEpBQk5bV9TT2MzLyvf321NBdn56ZWdne3xzdFLf2MLIxsbKzdrF2NJU1FdWUlTW0sfPzvH//fPz//788vfF1lJAT0BGRFtdUFdZX1JaRV5BWFfXVFfX1UZNX0ZCWFPQzfP6+uXl+PP99szPwdBTTXF/cnd1TERZXFZUVFZdVtdcW1tAdHJ4emV7eXJ2SUFf3tvX1tfU3djDy/D+/fHw8M7d1lZETE1CSEpMT1rX3drCz8jNwM7Aws3E29vT1FRRXkZMRVNdVdje3dNUQEp0c3BydEtF2MXGyMjPwsn09PP+/vn65eTk5f/3wdrdV0RCdXR0cU9DRkd1d3J6ZGRkYWZmZ2V+c3x+cXRD1PT+5efn5fn588DdU0FBW15d0d3HzPTx9vb3w9/X3NBU11RWUFJSR0l1c3Nyf3N3dHZxdHd0S0hCWdXbx8vy8vT09sjaw/fz/OXk5eHj4ebn+/LJ29BWXFlERl5ZXlFfQ3VwdnVxdEl3SklIS093cHJ6fnB1VlVV0FFdUFxFWFHR28bIycL0ytrf2tdWXUFBQFLfxfTy/P31w9dEd3lnYGFhZ31xdnZ1SkpCXNPN8vj4+uX/98/ZVNfdx8LM9c70/f3+/vzLx99RUlBcQU9S0d3F31dbQUFOQlPd2MDK8PbP2150fnp9dkBZR1BRUlheVlHX19bQ1t5VWF1SWF1eQE91d3Z3Ql/Xxc7DxMXf0NBQW0dMSUpNWlxAdn1nZGVlfUpb0cfI8vHNwsj09fX0ycnOwM7x+/r6+//w9ffK9fTLzsPG00ROd3N8cnd2dUZfVNLZ0lZGTElAXFfR2cHF09/R1N/Zw8DPysPM9PL9/uX58dtfT3xnY2B7fXN1Qk9LSUBBQERBQklKSnF9f2dib21menN1WNnO9/L65frk5eX6///2yPH++uHi4eTzz99WWUdGXNDV19FSWk1zc3d3cXJ2QkdAXFVdX1hFVtLG9PH9/fXO9fTKy8LBwd9SUtfZxsLx8vbN011NcH9+cnVPTFpYWl1SUl5HQE9KQ0RHWUF0cXJ5ZHp7eH5zSE9AUdfe9/Py/////vnl5uHh4fr/9NdETXR0TVjX093Y39/Bw9rZ3lNBTU9ER0xPdUxMTkNbWF7dx9jEyPTIw/XC0lVQRUVd0c308fLw8/HJwNlX0cLG2dnd1VFbUVRdQHdyfXl5fXJ8fH9ycXJ8fmVleXlxWFTQ2cD29/TK9Pfw/OTj7eDm5fz33V5DdHd1S0NGQUZFRF/R2sXQV1RdXVxEQEBPSExPTU5OQ1zWxPTy5fr/+Pvz99rR3VbR29jE2NHV1VpBWkRfVtbYxsTPwd3a3lhJcXN9f312dnFISk5MSk5EQkhGU9Tf2sPFxc3G2Nje287y+fn4+vj+/cne1110fHZKdElMQUJMWl5GTkhITFlYW1lERUh0SE5MQ09b18TK/f78+fzy/vfKysnNzdvEwtra29DUX0ZBdXVAWVLe2N/Bw8bVQENKd3F0dnB0SUxNTEFISVpFX9308/Px8/HKy99SV9bS2cPJyMj18fXNwd3WXEReUldTXUFPR1lYQU91Sk1EQE9GQ0h0Tl9eRk9LS0JS0dvAxMTG9fXE3NrNxdPHyPfxyMTF3lRETUNMTljXxc3DzcnA1VNVVNRfR0N3dn18cnNzfHF0d01R39Pa9PXx/ffMwM/18fD8/fL5+//y8vHN2dBU0NDeVltFS3R9eWVnenlwcn1yfXF2dEdR0VRQUNHHzMrPy83P9MHT1tfQ3N7f3sXD9cPHwd/WX0dDT0xAXkVaV9DUQ3VKT0RfQUpCTUtCRUdMd3F3cUtaV9vCwcn95fn3yvDx8P/7+fj//f7998vD2NBR1dza3tVfU9VcTUp2cH1zdHB/cH1ycHVJQ19cXl3bzc/29sr39c3TUl9RXVTVWV/Q3NDQ3tjW1dRRXVdQXl1ZRVbR0kVOQERDQUJKTk90SktNd3l+fHl9T1pV3dLE9fXLxMHw8vD75+fn5+X48vDJ2N/RUlbe3FVSUddWX1xaR1tBTkZeRUVcUFhNQ0BMSEBc1NnFxsr1zcTf1ldU19LT1dfSxsLH397Y0FZcVddTX1hbXVBdXEN2fXhlZWRlcXRKTkxCT3V0dHVbV9bAzMz19cjIwMXIycnIyvH+/P398PH0zMPQVdbWUVZTUNzS1F1FR0B0S0Vf1sbF2N7WUVpBRU9GVt3FxsPDzsPExMb1ys3PzMLGw9hUX1TWVNRSRkNHQUBGXlHW0dVTW0Jwe399cnRNSHJ9fGVkZWdkfExb1MHPy/XIycnw/fLw8fL9/Pzxysr29/X1wt/T2d3R38fE3VBGS3FyfXxLXdba2N3W0VFaQE9NR1fE2NrH2sfY2sPK8fPw9vz5/v7zys739MDdVEx9eXJ+fHNxcXx9f3xzcHNxRdHQ1ldcTUl0c31/eHx1R1bT3MDa1tvC9/D1z8/Dzs7NzPTL9fTAwN9U0tLWxcr0yd9fQXFycUtAU9Pc011SUF9TQXRLW1Tfz/b3zMfF09HYx8HM9fX0/fzxy8rw8vz99d5UVl9ZUdVZT3RxfmV/fX9zd0RfRk91dnJzf3tlZmR+fXRAU1VTUdfW2/f08P78+ufn5/r4/vfMxtZEU11DW1XY0FhfRHZ3dXZD1dLY3dnZ1dHF1l5aQURW0djDwvTN28bF38Xc08P08Pzy8/DNwM/Gxt5WUlNeWNXRVk5xcXxycXZOQFDU0dfRU0BBTEt3cXN7enl5ck9DS09KQ1he0drN8/z55eTk+v309c3ZxdfX0lDX01RWRHdOTHF3WtbaxMTPzsLJ2tLXQUlBRlxX1dzSVNHXVNFUXVTb9fL/+vr//fbIysrDxsXe3tvY1kVOdH1/f3xycndCTEFYQUxNdnNzcXJ4e310SFlV0NrY3Nvf2sDP8fnz//v88vb1y8HZ0dRSUFJGQUpPRklLdnFxd0ZW3dfawsHPyfTKwNFDRl5V38TD3Nbf3NddV1JT2Mvy/OXl8vb19vbxyFRXVFBeRkx2fXx8f3h9dkpCRkVeXFZfQkJNTkhxeH5wdUpLWlPV1VXX3sTD8PPy/vv4/vD09vf1ztJR1tjQWUBYX1pcWk9CSHVDQVNUV9Pe1t719MRUWV9d0NpVX9VTX1NeWVlaXdbXyv/8/fDw8/Hx8vbZ0t/e3llbW09Idn99cX95cnBNQEZeQUxDT3dzfXt4fXBwZXFFQFjVxMHO9/34/OXl+/v98/z5883Mz8La3NZHWFZSVFJaQU92cHd1W11YXVzTzcDd1NbU0dHZ31TR2d/FzdjdxdPX28n1yML09cz29snOzcDbVV5ZdHB3eHl3c3xzc0pJRFdSQF5FSUROdnF9cHN7eHx+ckhG1cHFwMrL8/L+/vPK9PXK8vbO9vf29cPA3lZXVF5V01JfXkVZXtHTXFtTUdbGycbHxs7QU9NUXERbUF5QXV5bXtHbyvbx8fb8//Ly8PH19cXR0lZaSXZ3cXN9c3NzdnZIcX98eHh6eXx+f3JxeX5zc3RPU9zY9/b08Pnl+Pr6/PH38fTKys7BwcPY1FBUW0xFXFNdXEdMRkdCQV9YWdHGzvHw/P3x9cfc19RXVNFU1NVTX1PZ2tvB9c/HyMfGzMbD0tnYVERZXHV0dnZNdUtPTFhBd3dKc39zc3RKdkJ1dHd+eH9xd0RSVMTZz/P9///y8fXBwcTYwszN9vT38cLZ3tNRUlpc11NSUF9ZQkpISUBR0NnK9/X39c7HUVhfUVFSXV1dWV3dwvb3yvH98/3x9vb39ff99sjYV1FaS3NydnN9cEp1cX15e3tlenh7f3l6eXd9eX9yd0xf3dzN9PT/5Ofn+//w9cDJycHJyPfw8vP03tNUWlpcRlfUW1hDdU5KcHRFU9nAyf338fDMwNpUV93R1tlX0dBf0cXM9cPEzsnLyszN9sj08MnA3lJcR3V2dHZxd3F0SE51cnxxcXB2d3B2dHBzfXxyfnl8cUleUFzdyvD+5eXwyMzAwsvw8f34+fn/8vDBXkRTW0VcX1JFQVpCSHV3QVDWwcvO8PPPwsHc09RfW1tRVEdaV9LbwfTNwMf198jw8PDy/fzx8/bP0llFRl9Hd3B9cnByfHt6ZGV+fnllfn96emVwdnx9fXZPV1NSxMz8+uTn+P799crx8vL58vDy9PH10Ft0dnR3d3d0d3V3SkJLW1Xdz/f9++T7+P3098zY3VZRVFtbUFPczcbBxtPd2sfA2trA29Lc3NvfUFJcQF5UX0RGRF9WWFpBSUpKT0t2d3Z+e3h6cnF8e2V/c3B2SVzXxff28fP2w8/1z/X9/Pzz8/3w98PXWUdOSUhOR1pHRkJaXVXe9ff08v758/Dwzd7b0EdPSH1ydnVY0sDPwcvKz/Xy8Pf28fzxy/TC3dvdUFTWV9ZZTUxNQnd/fXJ/c3B/fnpkZWZneHl8dHN5fXN0S0ZUzfzl+/j6/vbw9vfw/f/99vfLwdjTXk1DTHdyc3dLTkl3dUBY1cbJ8PD8+P38+f3wzNnXW3Rxc3BMRdzLzvTOx87LyPXKwc/H3d7S0dZZX1RSVtPUU19FUVRTVkdPR0xLSkhzf3hke35ycXh6Z2BkeX13W9DP9PHy8vPw9PT28P398ffMz/bG19zUV9dYR0xMQUt0TUdb1MXN9/Xz8vT0ys/39VZHTEp0fXJ3TVzWxcD39ffz9v3//f/9zsLF3MXcVtXT3Nrd0dRdWk9JT0h2SEhwc358f2RkZXh5fH96ZGZkZGVwT1zfwPX39vL8/f/5/fj7+fz2/fTAwtxUVNZdQUlCXkxCW0NDWVPT2szIyPTx9vTy9sLFXl9QREZAX1bU18fPzffLyPD39ffB3tFE1dBYXdZd0dhX01ZU01pb09Rc1VlFX3VKcHp/eGR+emdlZGZnZmF6en9Kd1zf3vfx8fvk+uX58fL39ffLzMjAxcPZ39xT0NVf2d7S2tzW3sHAwMbBzsXExNRURU9EQk5EWFlQXlPYw/Tw//n6+/7y9M7H29NSXFZR1dXX09bQV19cWk1MQkpLcXBwfmV6eHp7Z2ZkZ3p7ZXxzcHFxd1hd1PXz8/r65OXy8/H18PbMysvHxt/V0V1XVEdH0dDU2NLGysXPzMz3yPTx9MDa29jeUERWVlZYdVpWUdbay/3yy87E3NRFU9dWRl3b3tJX0NjYw9/cyMbTVNfc1l1BSXB5eGRnZmFjbGFkZmdkZXl7ZXpwSEdUyPzl5OX5/vz09ff38vH18/LKz9vcxsXSVNjG0tPC9vXKytrOwtbVVdZXR1vU115FWkBCTU9LW9jezfnk5fj/9vfI3trGwNjR38fH0FFRVldV0NRXUUZBXFlZREp/eHlnZ2dhY21hZ2R+eXx+fHB0Tlnc2Mzw/f7+//DKz87Mw87L2trF2cdRV9DV01DS39rCzPH9+f7w/Mvewsfe2t7TxM3Q2lVIREBKd0BR08fG9Mr19NjSUlnR2NrHzsL2wFLfVlHV1VfFzt3FxlXFxtBST31keHphYWBjY2FjY2ZmZGFhenZNRdTfz/38//7+zM/39ffO9vTz99/Dxd7J01fdzMXE99rM+//x8fXS1VFeQ0paQFxXUMPVUNZ1SkncW9f33vD78/7OwttWVtbP0MfxzsfR1lpDWEpHVNBW19VQ3tBXV3RPcnJnZ2RvYWZiZmBmZGVkZnRxT9VU2fT+8/D8ycv298PCw8PIxdLURdFeQNTTz8DMwtjK8Pj5+v73/PfM3lBdX9NcV8XfwlVPXlNeW9HS2fb18/HPycDRUlfY2tvL9MXe21dcRVtDXsXRUVLPwFLG31dQWnB5c2ZtYmJgY21tbGJsbGJmeXx0XfXx9fP18fTDzf/+zvf7//H09d1f0NFdxvPLxPX2yMr7/cr6/M7O/lRK1kp9Ul9G0txKV9R/UsFH2v3L/fvK8PDQyPRWx/Hexs7LzVxc0Up10k1N2tRBWsTeX17bXXbQSGd5eG5ofmZpZ2RtZmZtfkp7Wchfy/vdzPPW2vbM8v7Y9/nGzcTW1kFf2FfG5cDd8cnN9uf7z/Dh8djlw3RX03J2xlN3WkV+cV9bxsldyfrTyPtS1vNTVvDb8fvXzfJZU95cX0NV8t9X/l9M8NpEWMHadXdNZGJkbWliYWJuYGcVbXlmckRd1sXwwFTCw0XB98zw+Ofz8eXGVfxRccLNx8vz/dzW+8ta5eTU8ePDW83MdnbcR3TawH1z1ER+1v3WUef4W/PkXEX5z3XO5sHP5cZNw95xSt9OQ8zdXtPaU1vXV3dQzUN2WXJsZX9paXB5FWd1aWhOdWxB9lhb5cxx3/lJdOf+X/vuz87gx0zI9XPV5cPf5P/b+ubF9OPwyefnzfTwR0PG131U9HB+UXVlVtJ2VeTdXv/AdVnKSVn+ydbk4MXN/dZMx9Z32PBdRPbaT9v1TkDNQXbCxWZ3U2NudH5rZHYVFHxtFH1cYHL8003y9nNS5FNN4+ZV5+jWUeHDecn/ddbv9V/j4NTn7tLO7vDV5+RB3vhDc/TYe97+e2TyXWfN5UhX7vR8+fxmTeVEfeD5SOXgdFbgUWTwwXrC/n53/kxh/N9sUfZhcfN6YM1/FEpIF2RdFBZaYhFBUWtJ5n1z4Nxm8OV60e7FWen5e/DjeUvhQnrg+3P561bKlPNS6+Nb4OhEz+5AceRQZvP0bUrwZXzlWHrk5XbO5n12/E1n9PN2yuNXW+D0Sf72e9HmTHHn12Tw92BE83p+8kJh9cVifV1ubUdmF2VmEGB3am/eTGHDymXQ5U915/FG4ONC8+JeRubWZPDzcczmU83p/lfh5lP77NTN7vVE5PR7y/x/SPFxZ8raZ1f5TUbn3n70w2VZ9kxS4P5Z8ubV3uHbTP/9T8HkTUb+X3hQUmd2w0p/y9B5X19iZF9iaHNkFWFzaGl2fmZQ039Y9Fhb9spf+uRTxeTTTPHAfcX/dEbnxkjn4lHK7cDR4/rT5ezAwuHES/PwcET1dH7GUHvR9HVf/ld8wdp/WfNCW+DxWPnnXNrk1F3l8kzO5E9L8l1nTVhhdsF3fc3Rf1rSZHpTZmt8fhVgcBVrfXpjQd56dfJcdP75WvDhV9f/xXTe3nhE/lx3/vlI8eBT2+3/UOfswfXu/lz45UTS51J9w8t8ScZKc8rFed/7cnP+VHrM+nXR5sRC5eVy3+dU1uL2dfzkd1vwdmfcVmdG8HFw/lFgX8ZkZlhkFGRIaxR4Yxd7WGxlyF9lzf9Bz+7CRuT4fNL+fXryw3H05UTQ7P9K8+3aze74X+HvVcbsx0Dl+n9b/HR+99ZgX/t9cPxUc/X3f1v/VEz++kHB41R3881x8uLf3eH/TMX7c3jyUWJb8Wd781htRctlYtFzFnhRFBdNYxBkRG5g9lBnwuR3QO7wdPrgWln6U2Pb+X9K4cZ45ONNx+n2W+3sW/aV9EPi4UD16NZ++PFlWPp3Y8z3YHXk1H/x/3pP4NF7/uF2QOPYZM76f9bsx0nj7UlR4ll6z8Vjc/9xYcrLZ3X8dGxGShVtRm8QZH8Ra0Z6aVzIZHX62nb74UbF78Vy88phdv5cffnnRcDp9dfs7FfK7/bf4+bdyO3z1Of+S1bzdX7YR2ZYz3FC5fV1yP99dfnVcvP7Wtjn2HLHw3ZY/8Re5eVSwvjVc9NCYHfTcnnBX2RVzHx/02VpfHwUFWRqEXp2YnDBS3/OyHTY5sFM/edH1v9JYdfcZ0b5VUjk5tD76Pbf7uHE45XwyePyxuzt1MDn13PaUGJyV31x8vFA9f12dPPQfc38S1Pm9kL29X1F/9RB5OVW9ubWU//cZ0DKc3P1UXtb2XlbznNjdH8UFWEUFmFgaXNRZH3GQ3/a91/F59BC+P99TvRxesnGfdDg29Lj4dv67vf06ebE5ODX0OP9Vf72cETMfWx3cGJJ90FF5v902/5eQfLad8f9WdHk1nfJ9HTW+N1R5f1Dx/tVTfdXZdTBe3ndSmZZ0WV9V3prZGYQFX9vaEpIZkb2Q3X890vZ/kZY+t583cl9SvVUc8T1WfXiwt7t5Mztlfvklf5R+OfHyeHGQf7BekfWZ2JQV3tZ9l9S/cx39ORDd89RfPT1eVr4XmX28nTD5sFX5fF19fpKTPzActfFZn7Kdm1cRG9nS2gWZ2wRYXAUYtB8Z/XOdN7l1XXzzUvBwn1H+99wwfxB1uPxVuDg1/jq+fGV7Mzn4EDf7cdy/PNM0fd3ftFKZVXCdkXk9F764NfF4NV9+P130+dVdefyf9rhQFjtzHjx9nxf80dy99RkXFJhe814b15CaXlKaxV1ZBFgRm9i2VBw8/tZx+dWdfPWf1DQenTxTWfGwE/c51VF5fFf4en9+pbjVuPiXNrm30/6/1jJ+Ut09U1kUNJlUfvUVOf5TtjydEzy0HH29k7d5NZ28/FFwf1YRPPHc9/zTVDIQXffQ2RERWNmQnhofn4UYnNqF31/aXLNQnXzzE735VjS599xyMt13c1KXuXCW/v6Ttznw1bj49nn6cfd4v931/JPWfzZSfTCfV3MRn7S1E398tzz5lNE+8db+eVf2+LLQv78d13+1H3E0ntOVnJ+3VJkRdJ6cN11ZF10YUpEYWJMeG99e2hkRWZn99x/0vN0R/vMTvbwc0LISmVfRH9UykTV8NtA9/zQ8+P28Onh9O/s3MrgzVD7/17a59RC+dp8U810QvbUSd/YdlH5x0bl4dXL4cBS5/VK9PpGTvdfelbdZHbEe2fMU3tH2XZx1XxndnFuYHdjaH56a2dHZWbHQmJR8HRa4fdY5u1H0OFCevTMc8bkRlb82Uf980DN5d7E4ufa/+TezeHNS/HzStX62FPz3Xva+nVO/9B8xclN9OfawO/hwOTkVFT7zXXK8X9yxX9iRXRse0ZmZd9DZt73eEPwQGVTSWJ3RGFhRmVvT1Bnf9hyZ93Yc8ThxNHm+VjHxHpK9XV88fR7UftZQeTAefTi3MPp5fXs5sPm49XT5vVF8/tHXPFJcvVQYV7cZ3zHTXPz5Vn2lfPU4PpL9eLRUfvXfVTYZHPWZm1ESWNN2GVE9kl391FgS1lhZkZhFXBxFGREY2dQemH11HvC48jA6OfW+vBx1uVNTvnWf8zxdlH7W331yXfN4NnD7vPL7OVO9+ZD1uHBcfb1edn7dXPy0WXE8HTW4MPF6u3I5eNT3eDJS/PNenXEZ2PUexR+dmpn1GVkz91zwv9yTvBKZdpYb3JSb2ZXemdWQ2BAw3JG819R4vlD/+V6Rfx9evfUYlP8fFv7UHzJzHH04t3xlOb8lejK5O3C9u3JX/vIZFz9fHz0c23b3mZN+EFF4PDE7ORa/eZBzu1XQubWZ87DYnLWbmzffG7d1mZX8Xtw8XJj2k9pT1kVYkZoa114alLfY1z4dU3i/F/v71zz7E5x+tB+yMF6Uc58SPVxZcZRf87/W/fpzsHs+1Tn/tPg5lf7+nbS5kx359B68vBl2eRF3u/3zuj/Xfv3cMz9SdDzc3vWcW91cmpldmt5zHp6/FF78MV/yvB6X/JkettmbVVxaV3TbF7JY037d1rvylLi2n/9VmzTxGBc/2RC5Hdy/Fp95fRI4uBT4eja+uhXxunXR+zIdPjFZ/f2ZtvxYUT8ZXHgQXDs/Vzu4kH+4XnW4kbS71p9+Xdv2XYVXVhrXshjRP5kcv5+ZvdKadRbFHPUFGPebG3Lf237Um3l92TmlVrkl09W7X155Fp++1xh+d9t9MBv1P9nxOlI0JXGUuvzcO38YOTgcPzsc1fqXE/q9Hzk2nvk5Xnk607/lV/N6HJx4EFw4l9h8VsUW0AWd04RftpueuV5ZORwbeVGaPTea1v1anbzYnLyZHr/fGP8TWD69Xjh4n3x5GFO8GFz5Hpg+khh4N5m+/h79u9D+ZXQ/Zbxx+vLcOPAeOP/ZPz4ZPfnZcfgZHXnemTiUHvp/HHt4HL24GXA73BR7Ut5+XRty0hr2UFqQdhjSsZ7cdFiYVFnZl9+bF5Jb0raenTOcHfxWHHwzlrk597h5HT0/GVQ8XNC9HB09nR393R9y8V2yvxe9eba2frfUvfXWffL0PHK3fn5zv3828n0x8POxNj48sr4/NvN0XVbxXdbxXVEw0B/R3NmdXZ4dnJ8TlN0ddZJdEFydk10d0B1fFhAQdNcQtDQTF7dTlDF1dv88dHJ0X1bQ3NEX3VA3tFX3Vzc9szE9PHDyv339/DAz/HKzcnDz8zd0dLFw8TZwMLaz8/X3sXZwvT1zPD+xNDHxd/NxVPaxlbW10xKR1hAQXR9c3NlYWdne357fHZyc3J7f31/c0VYQl3azdnZ9cz38vb08/7I39vRRUVXQ0xRU1tQX05CW13X3dfS2NjVVlZaUtnO9PL8/P32yv3z+/D1zsnwz/L88PP9+f//8MLOxFldV1pfRUNKWlBNd09wck9NRk10dnF5ZXpnfHd0S0dV1UVPSElJdVnQU15X3tXc1FLezMfTx8/WXkJ0SEZJT0dHRVxR1NPV28H39PHMz/bFUdDUXdbO9Pb55fLy9d7S29vFxdJX2dlQztvb9f398P/By8ZX29j09NbDUdffQ9lXTNRXVlJfQ3h+ZmxraWNhenh4XklzTH15f3NCXtld0sLN8djx//fkzfX008JEWlZaXVZXX0xYWl1FR1/cxlRX20RNWXd9cEpb38v3/v764fXz/vLn8fn29PnG9P7L9/L4//HL3dvRTUFfxlLX03hc0UpyR19OUtdJWkRxeGZnYWJleHxMSVlDSnRHd3VU19ff9MtSwcPU08rE3cDNRkFDcnZyQ0dJW0FAW13TXtDE/fTBzMHfUVlWTkZRXlTI8PT2+PTN9fDw8/zx9Pf12MfT2sHN2PT9x9jHVFza9cXI8Npd2sNSVsXG3cfcXEx1fWZtb29saWBhZGV7e2Fkfnh/WN/Qzvnwz/3/8f34/v748s7bVURDRERCXkdFQUdGdVheXcHTRNdbd3ZAcX53RnXZy8H0//z45uTh6eHj7eHk5/vx98HJ8fXAx9tXUkNaUVhU0FBFWllzdltBSdfa1FjXQnl3c2ZlZWV5cnFIc2d/cmV5dELVwvX38PP888HN9M7DxVRRU1tOdnNydUB8Q0ZZWdHZ0c778dLD1l/RXUVJdlTI1FHGw83BxtXM/v35+Pvm/P/z9NlWw93dxtPU3cXRVs7xx97O2srRQNBR1crd0c7fWUh0eGBgbG5ibWdmYGJiYGhtYGx9X9zz++Tk7eLl5eb4+vLZxsvB2VhwSnR2c3RwZXBJSl9Q08bRVktGQk1IZ2VCTF5R08339sj+5eTn4uHt6OHj7frN8/DQ2lZYX1/UWUZf1lRHWtxHdkVxcFhSVNvMxNvWX1laZWF8ZGR2cmB6fGJjZ2V6fk1T2vLm5P/45PD0+PZHVt1eTUBGfn95e3FzQtFCTtTJxvf79tv1yNFcS3d0cFpCQt7B29/G9/bl5OHh5+Dk5Of78PbOw0dAV1pd01jXwMTU3cTU11RFXF9P0sLByP/C1s10YGFnYmlkZGN4Y2JgaGBpYnJ9V9L44efu7O/g5P/LyPXe391T1ExPSXh9dnpxSkhKV8/b9PDewtBxd318eEpzcdle2fT18PXg5fmU5OqU/pbk5pVFlGfHwWL3Y/VmX0vRR9hDX0Z4wGHGZfNbwPje5NHNRXxKZGV7ZH1kfX19ZXpmYH5kck1Xxcjl/PPizP32dP530M1l+G7BdnrXY8Zn23THUf3M4fL+4dj6ffdgSXFkQWRES0bYWdjO9+Xy4eTm5+zh4OL45crFXkBUdErXc8/SWudy9lFD+m/mctj0VOZb5Nf3fFhjdGh8em1latMWc21pZWhwYHzfc/L88+Ph7ebh//z1yMHbVUVbQE94c3pOeHZZcd5ezvxczeVlydJp/2xg9RbwZn/pau7VzJFDnfDp7uSQ/Ojh7OX61P1IUHd9SGHZfPVKX0taW0xYTNhHydjb3/Hw1tZGTkNgdUAXUH9p9hd/Wxf6F3DJF+tj/+Znk3Tr1cXgevBxxXZS3MRkxmTXT3r/ZOZB4M3l88HnR/t5UkVgx2p9fWzIZUzYd/7D2ezd5u/Wlvb5lMjs517j2X7vb/bLY5FgyvhslWNd5BWXeNjjapVi9MJq7BdGchHxH3F8EPAfzW1nzBT8Yc7EU+fY4//i+OTh0+da9cFOztLSXXNIT2dScHfEcfTXdPVYSPNswF0V4RZeRBHgaFX4b5FA5Zdynt/skXGeTuqXZZ5g4coXlBD8SG3pEeF6fPZq/mbS0V/zS/Hf+Fzy1NbJZs1vSH9uwRRLfmj0F9F1auAU+V9ml2aU29nrfOFwzlRN9kX9RvR0wnNx2WXzcPT0ced95c9742zIcWrhE9Z+FeYQ53VD4nDq0eTl++PC7fjo8O7+9uR05HPG3kLie/jEeOBo8lhs7mrjXWGVa+l0SOFr+mNKe2tyFH9oZmF/YXtNe1ll9klW/VTqweDjUe1Y0eZn+/R+62fL9272YHNXZkvIdnbzf9zSec5OZMx5efVvxlZt7H/F4n2U8MSRQZTuTp7S75VBlkbU+UZTy01E+nrSxW7Xf2/0Yn/mb/33Zpd/0pRo48NglBbQzx3iE37HHuARdMAT7GlZ/W+XfObhfpdp4MdtlhXsx2eWbfjFYfpkcf969Mtm7mTc+mrvb1vzFulpTMMX4hXf2m2UaOL8eJxilO1QnkyU61aVxc/sT+bmeJR7wfgX6Gp49xDraU7gF+hpV+YWl2rz/heWEvVkFvIbyGpnwRbmbsnGeJRl6v/fkmaRWcLubpFm5fZ47hX+d3D2F/pjdfNo7GrC1GvhFedxdORl4mXA1nf0Zv5E/fRM60ri4VSS0ejrWpZU+eRE5tXOU89ed9MV2mdvwhHAfmLtYvT6ZuxeWe9SzuJT0PJtU0UT1W8V2BZyURHcQnvhccftdffkZOfIe+t3X+xj+Ntg53p14HrQ8Hnm9GHtQ3/ibVLnYvv4buJ0augUeOYT5MpolmBck2zo73ef9MOcWf6Wc+rsYJbXZZUUXOQf4XoX6xbF+BCUdGKWa/PnF5N0fpcQ+EMd4R18RxP5alpdZuFk48rJlHaW3EaWbe7JZJBt2+cX72Bs7xHLWGmUa/T2ae9px9Rv52L5X3XubOVxcuMU4EFa6W/s8EnoXeXu1e/n0uPN9Pjf8dPAS1rSbl5iZ0IRx2BwyWnsWXXqSOTnTerL1eBC11F6fWRlaXJnFFBrSkxo5mTN/H2XfdfjZPrQceZZRf/UQ/dCdM1zWfdQVf3+Q/70cfxDZPBYYvZYYPV0ZMp6Zst/evJLQudA9uLf4ez75O3k+e3k9+79derFZfp7YVFobMNvYflmc+149u5g7P1t6lNn42985RF3RBbZa27zFUfIbeJUXZBe+JZy5OVl6VJ973FR+W3SzRbQSGv8Y3TsavHgbu1NfuJq3v5o+UZy42P09GbmZFL7YedT2OB06fzz7FSV3MjuSezTXO162chtw2JtVhFAcmPwYfD00eLU7v7T6U7m333jZk1Ua1VsakUQfn9q9GPU/WTj187gd+fTwfhw5lTPynbgdkb8ZdjXc+XUSuHAWvvUXfR9R9plc9R9QVBkV0tkXXxAcXP5X1jh9/Ti8eTq3+WV1OHpXu3ndfLJfUNWZmdCYmRUYnn7XnHi/3Xn8XL/3mT/0GDCWm5wcxR8fxRFUWPA5k/87lTz4lNU7E9D4k125k52+HN58HRjykNn9Ft7+dty+8d6xMphWPxn3/15z/hmRPlkZed+d+t91pRAzJZF05Zzypdm+O1p/Mpu/3Zu9mFo8G1n/WvC/Gfq8sOXWODte+DdS+dk3NdsWGxjZhVLbnnTY/BOSu9/8v177l5P4nbZ+XDO5UzS4UhX4nHf5n3b+09c4FBl5XFjymd7z3hb237UcmLBYGP4e1zkRvj33ePa5eZd6OXblfX+4VX/3dXJdPRze/BiREJs9WZf5XjmwXLicXT6fFb5SkPIYWfcFWNRaXbbcEX/yULn/Xz6+EzJ8VzX3c1aWfV0XPF3XUfQRGDxT2Hg3nzl0mXc0WRC/09L7cV25slgz8lv2eBl2O5xRpVWfJXSZZfdZerYZO7IYefYYedUZvFaYNBYYNPbcPjOVuTBwsNH/NdH4VxzwnpkfmJnY312YVpUZ9b2fET/UETlwHD4yn7l5Hv96HTb6llT60B67VZm7M9p5NoX9FYXzcNu8vpsw/VtWVFhUM5x3PZO/c5M5l/b7U365lLt8dHuw17j20DlQ3H5cnjGZXrDdHP0RHPIUXPJ0Xbz1dX9fttdbNtkZ9lmQcZkVPl9Ufh/xeV8x/553vhIx/pAxOdX2vpe0v9wXNVy/XBw82Fd0WPSR2fNyUjn/nbkyXr20H7wxHnGwHbJzXDBz3Xy8EH539HmdfzlSuTDRPNWRPZbf8B1dvZ31fN+2PBwU/RZXfjdXv7Vf9dfY3LdZmTJc2HcR2Vc3UpAz9FLw8tXycny9dfl91z5+9nN5VZQ9kh313RjSkZvcVBhQfBEUv7ST9XbS3HL1n3eyl5x3vR9X/5XU/743Pns9cLn/kz34WVF4XR99NBlX9NmSdhmecN/Zs1Ze/XyTNn40l/HXEhNWkR2W89aePTYbs//YET/QHPk8nTy/Uv05XNY50Fx+Md1wMV9dVhweXN2eXl31UVX49BHlfF///hzSfpIe+XeZsrEbV35YVHtc9TryNbtz3b69mP35mDQ7WVO4nlx4WR45n5n5nBj5UZz5kRC4VFx8Ndkx91nxVZt9NRq0dBrUcxjwft//Oh11pVIce5feOL9feDnZf3gbU3kZmH1f2jVTmz0ymP752f85WLU52Za52dS4WZO5GZ99n1a49z1kfrBlMpC7Uxk+Ep65lJn+N5v2sJuWslodfRucuNyZe3LZePnePvKZPjOZv3zYc3/Y13xaU78bkeVcVPpXFj+cUn0ennkT37jVHvj1m3lxG/32GlXx2Hc9XH75Hfm7mbG72ZA7mV24Xdk/UFuUVFqROR7zetC9+pwVux7ZeNEZezQZeNDZufRYuXMYvvcYfrcZufwZ/jmYdPlZkD/e0z2YXL5e2H/eGjIcGbmynHp537t/mT5yGb6+Xzh5Gb25GHf/2ZR9W5H9mlz8Xlw9lh2/Ud6/lll5fZl9Od53PphWPVsRfhw3un1xOr/WuDfZvbYY/b/Y0X0YE73Ylvwbkb4Y33mf3/iW07rQXTpQmfs8GTk82f5+2PI+mp15Gl743B87dB+49Ri+1Rqz/xgVOVhWuNlde5wZO7QYuXCbf35Z/jgZPHsZ0Tocn/tdmXiS2HgdRT00RVQ8mBW4nPE60pC7k1n4Mpm+vxsyv5vw+Bh1u9Id+LYeuXPZufwYPvkb1fgZH3meWTlS2fkX27xxRTR5Wxc7Hzf6XJc7kB44/xn5edj8Odg2OFiT+J6Z+F2b/9RbfzJbPXlb1btYUnuf3LuW0jvXWb7xGnN52DQ7HTX6VBf7F164c9t9/ppd/lsZf9gZOFwYOLBYOf6ZP7mfv3tZNvsYXfsdnPg1HLj22flwGjL8RVF5WxJ52Rw535k41Zt5/Nu9+Rs2eNiU+xhTeh5Ye1dYe3IZu/0bOb7FfTgblbvZlzoZXHpY2LtZWrmRWnmzW7l/2747WL26mRE72R47WVk6EFh7spj4+Rg5+9j/O5vwO5pd+1jZ+B5ZuJNYOLfaOXwFcb7at/maVHiaU6VfXOW2XKVzWHv9G7g/Gr95Wnf5W5K4GBw7GVm7HFo5F5v4MNi4/9h4eZjxOFnT+Fkcuxzeu90beLRY+H9Z+X7bM38FE36a2Tjen7ufHuVXHCX9Hvt+mHy+G3K5mPY7WVelU5K70d4501t90pq2lMXUsBoXeVi3et/ROh2fO9Wce3We+DBY/LwYffjfNbjdHX4f2f4TWPl9WH95GTG5WNF5G16+GZ54Xdg51li581n4Od75vFj5NNp4E9s7XZ37nrT6mHh7mPr8m3uYWfpFdrmEexaYpFgUJQU4/cVlm156xPCwBHrZGSUa+fsbpfQYZRgdettwe1s1fRu3vlhz/pmVf5ncPV/cvxZceT3SPP6cFPmXH713WdZ83dz8VRnRsl+cfvyc13kRWDf/WZi/slsRe/VYeGUQHeU7md17lBq0OtGbf3sfWPl7X144OdhYvr+YWL2wWpt9sBoZufkZXPv4n9+4eFwfODvdGDH50Blzu3TZljlUm1w/MBhfvj6dH725URl3OdQYHn02WZ49v59Z9L+WnrD4vRwR//0fHvf8EV9U/DEdlHl5NFa/OTSf17OUXJ1zslOd9L1VEDF+/DVV8731U9QxEV/cFlfcXfE991e2/fAQ03T2dFd1cdQd0rT3FlJUsRYc0nTxF5Gzf3a0M/xydHXzchWREVWUXV3WlVYd3dGWXRa19FURV9QWHR1WF1QQFHZ0d7C8/7x9v3wx97a0tLW1dzQ3NVV39rHxMHHxVdY1tVedXVCdHN9SltEWFDf09bGwdnf28jIwN7b015d0FRfU9dQWFxXVdVVVF9H19xWUdPa3lFUUVBeXlpAQ0xBXkFZXlfS295VVNRSR09CQVNQXFHU1tLDzM7Nwc3H2NvE3NXS1lJV3dRTVN/Dzsr098/IyMzYVFFCdHR1SU1YWFNSVNDUVFRTWFNUUdReWVNbWFxU09dSUtRV1Nvb0tPdxsfawcDG3sXE1lJX01NAX1xES0pCQnZOX0Z0SUdDdXV1RkFBWFlcV9Hfwcvy//788PfOw8PO3Vzcxd1V3djGzMzLzMLHxNnR1V9MdnF2fHRNWEZJWVVRU1De39/Az8bd3tNWUV3V09bf3dNX1tndU1ldWERQUlTX19DUU1Ld0VZfX11YW1BTU15TUFxER0dJTVlJSkVSWEZEUNHV0Mf1y8v08Mnf2dxSRV/V0NDb2t3FyvDLzPbz88r28czWXVxCdHREREpLQURbU1BaXFJUX11RXkNAQlpdV97b293d3trEVtfd19Df29jDw8TZ0NxQV9VXUl5eUdVaTlpEQHBycXx4fXB2cE5bR01HX0BY3d/D8frl+Pj88/TO3FNfVsfCx8P19vf0z8rKxtrF39Lc1VpJd3NwSUx0dXRPXF1E1M3D2MXEwNPVVVNcV93b29vZ0NXf1FpYUlNeWVzX1VHU1VxTU1NcX1RXUVTXVF1VV9BdQkl3cXFwdkhCTFtaQkZaRFhTxPTM9Pz0x9jH0l5HVNLdzfT28//5+fLz+fD39vH1xNncX3dxSndzfXN3dnZATUZR1dXQV1FfRkZbWVXQ28bZ0NvG1FJU3dnfzcrB38PC3dfQ1FhMWFpCQ15QR09HVkVIRHV8eHt/f3lzQ0NCWlFQW17d2Nr25eX+/fLwzNzY0NfazMjNyvL+9Mry9MXFzMJXW1XXTHVCT0p0TnRwS0F1S1jT2cHJ9/Te1NbR11TTxsDVV9PXXVpYW0VU0tdU1NdQXl1UVEVc1VlPQVTUUlbW39HS3tZeWkRze313cXZGR0t1W1NHRVHX0sf19c3B2tfUVd3O8fD2/fz45OT68Pbz/crNwNrVW1tdWEVfQ3Bzd0x2dnZ1dUhR0VTV1UZFXFXb3tPc0Nbfw8ZaVldd3c/N9cXR2lBYVlLd1VpAdU9OQEdIRl9XXVpSRnVxfH1zSnVCQkFAT1DQ0dPUxPb19PH+8dFS2MDZy//PzvH58PTx//bGzvDB0VdfRHZwTlJfTUBbWXRJW19BRVfU19/J3lfTyMXfzc/aVtDEXk9eVkB0R9fRV1DdVkNCQldXV9zcV1TYT0XTVcRYXc3HVFDWWnd9dUF0cndZRHp2XEFESl3F3crMzFp21lfe/uT28/7l//D74Pzw5eT+9/PbXlRIX1hxT0Nxc310cXNzX0Nye0xVQEpSV3dS9M5Q0/T+zlhVV1NSwcvW8crA5XhK/cNwS/bMwsZweV5GdXBPR9NZddJfcnJZR0t6W9tfW3F2UVff1Udd28LZ3vTK1dHb8PzTwv71yeTl+/zx8MHb9/RdStdU13VJ3V9PXlDRTU9YXFtDXdFWXV5VVkLU2lZexclR11PV1HRG0VFDwlFAW1LbVndcxVRf2PXdWlxUVUhHW1ZR1FZQUURc3Etx11hGTXFMQ3ZyX1l12sXVU1XX1lHC28r++OTk+uHt4Obm5v3w8/PN08bP0EVX00hwTkJ3cU1ZT3VCTlNAdXVydXZzS0zV0tLT29/d11/d1tbZzPHYxMbdxVZRRUBYWNRcW1lRREVMSklyc3V9c09DS3R3dUZGTEV1QEZYVFNTWFPSXVJX39RT2sn0//7/+fvn4+Hk5fj59fTI39/XVtFfVN1TXU5Y0trAVlxe09tcWkBdR2VyT01KTVFcdnVcUElAXd3FwvXK1tTTxNBYXlTQWl5XwNDFwMnDWFVET0lAX0BHQlpJdkp0fX1zSk5xdkxIWlhJdXVGTnJB1t3V9+bn++fs5ubh4+Pj//j39NDV9tHU0tHaSXtZ0V5T3NBaRtddTEx3Q3xnZHFzc0lZQkf0xlldytr1+OPk/vbA9Mzb0MfeT0h/ckHOVVHW0MPYfndRdXN0Vk5yd3tzcEbVTFdEd1dcR1BB1HRQWXx3dHXR+/v54ePl+cb65v/x2/TJ11NfUVZGTMzQQkd2wlFFxc3SxtnaRHdfRE1HXUBCdnJATXx0d159cFlf9/nC/tLN9NxWc9J1dvHQ+9j5xUrwy/3P9MvAWvTaXVhM1091dmV4Q2ZKRnZddlJPfVhxSnhkcnRXw8vy5uf45+b9/vvl/fP3+P39XE1QW9lMd3l/RnZSW0RWRdVBQVhwekJDc1V3RVhATE1WVltZUljB/ufk/OD49PDd0/XS2MnFz8LfUdZUU99Z01FCRnNHQnFIdEx1d050dUtFUltC1kNNV19fXkxITkJdwPb2/vzn5/n+5frk//z2+ufH019W38fS319S1V/T0NnQ29JUWEVYcH5+fnl8SXBzTEpGSEhLdnBE2MfI9PHxx8T1xMDQ0fT0wMXeycjRVMTxUNFXUlRMXkhBcnt5fHl8ZXx0dn11RU10cEZPdHRLcUpD1MbEyv/88+Xn4+Tk4Pv45OTw88HDy8DcxcVcU1RQ1V5K1EBcRl5UXXRJcXBEQUVFXkBSUddZSljT0dLZ9f/wyMjHVN/R1FNd1sXZ1l3U3lFXUVN1TltdT3NPSnF2SnR1S3FzS0tf1F5SWUVaWF9CdHZ2TVDQx/XI/Pj38uTg+uXk5fzx9vHF3dvBzNHW2VFbW19Q1dFT1NjUVlJfSHVJTU5OWkNJRkZIdXFNT0pBVNXc2sbExszB0tLE29LczczBx/T1wMXG01NYR0B1d3R3fXB3cHxkZHx7eXdPdHd2dU5ycHZ2dEhX0sT25eTn4ezp6ezs7OPg4eH/8vf2zsDZ1FdTRU5ISEBBTUdSREdGT3R1TkVaTFtaWUFBWlNFWdDV1FDYwcTfzPTMVdHQRE1e0VJZV9jb09fa3lhJTHV8c3JzcXR2TUlNd3RBR1hdUFJZREZNTnRKdEpCQVjSx8bx+uT75OHn+Pz7+/30/Pz2xPT031bQ2FdaXNdSWlDc0lZX11NcWFNfUk93QUBOS0BFR0JbWVlZUlHW39vMzMTdVVHVUlbT2dLczPXMxdrF109JTHV8e31wfH53dH14cEh3cEtJd3NwcXZ2cHRIQU1c2/T8+eHt7ezu4uHm4OXk5fj4zvPa1t5NWFBIX0txUkRAdVtXQkhHU1dYUldQWkxZX0NCUdVQUlXS2t/Zz8Xbx9jQXEdYR0FHW1bUUtPY39/W1V9ATkNDSnZ2dUlPSVhZWkdOWFhJT0NPcnxwc3xlfXFzdETe8P3l5uHm5+Ph5Prk5Pr65+X/9cn3wdTQ11dfWFDR1llW11BETFlTRUBBTE51dk1GdUlbXlxZUN/Z0NrNwMfR19RcXVbU1tXR3tnU3cPd1lRVUkxJREV1cnJPd3FDXVhLSk5DdH1wcXJ/fnNxc3x8SltY3fL7+/rm4Obm4eDm++Xl5Pj//PTB0tHQ1VBU1F1ZU1NaTU9EQEpDX19DSkVdQU9SU0VBSV1WVtbFxsbZ3cXeUV9YW1taUNHX1tPS3dLT0tVRUVNSXV9fWEJ0dUBbUVfV11tMQEVCdnJzfXh7fnlkZHx1RFHD9vP/++Tn5+Tn5/v55Ofm+v748vX0ycLB2NnY0NZUWVpAdEtDSE1KcXR0TEZNQkVaQEJLQ1dQ08Xaw9vfxN/W1dfQ1NXXxcff2NzQ1ldUXEBeVlJFTU53cn10dU5HX1lETHdKdXFxe3t5en9+f3VNX97az/bw8uXl5uDg4+X/+uDm5fvl/8709MLG2MDF0tdfR0FPTHR1TU9MSkxHWFtSU1hGREFCQkdZ1d/T0dLW1FFQU11cREReUdfewcffUlfTUFhbUN7T1FVWWU5MRF1aRVRcWEZARXV3c395eH96ZGV/d01f1djayff+5eTn5+T45efh4eDm4ebk+P3x8PPx8/HB11BeTHV1S3RyfHNzcXN3dUBId1pZQXVBVtRRVdDQ09HfztjF39HWVNvFxMPCxNZQ0VxFQ0RT1V9DT0hwf313SHB1T0dKd3VCdH18fXN+fXdNT0RR39/cxPfy8/nl5fr4/uTn5+Tn5OX8/f3LyfXw9s/C2tRcWEZKdnZKTUpJQV1aQEdXUk1FU1ddU9feUFBW0FRSXlfUWkVfVVdU3M/Pz8TA01tHRVxSV1TUV15FWUREQktOTUNfXkp1dnZ8eHl9f2V7dE1IT1/RUtHF9vP19/388/365+Hh4eLg4Obk+Pb3/PLLy8bfV0RMSnNwc3ZxcHZLSnZCSUNKTF5cR19fXllcUFTWXF1X3dFU19nd19jMyPXP2d5cRkNSRE1HR0VPQEBNdHRKTU5EUlxLcXZ2cXNxdUl2S15XX1bW3dPQ2Mr0zMvw/PHw+OX7+uTm5vr7+fPJyvfKwcHMxVVaR0dMdE9BQXRJQUVMTlpWXEhE3NxFXlTUWEVfV011T1pYSUdX1tbTxvT1z9jZW0hHUF5AR1PVWlpfUEJ0QFFERl9SS3J2dElyfnF2cXZMU1pFWNPfVlHZytzQzPH29vL65+fm4+3m/vj68vT08PbKz83DVFheWUZCTFpOdnNLQUpKW1NMQtXdWUFF1NRYX1RdQEBS1V9aUNLR1d7z/c3d3lVBT01DS3d0XV9AQ1laTUFd31JCSUJ0c3BIcGRldnVKSUNWVlPTztre2cDOzc/w8vX08OXk5eTh+Pz////x9fDyycbDzd1SWVRdX0VAQEpzdEZDSHVBWVFT1dFWWVfWUkRfUEdYX1xQU1lTV9faz8jA31TUU0Z0T0ZDT1hWW1lZU1ddU93QXUxAQkl0cHx4eXlxd3ZxQF1U1N/HxdPRxMPBxcjMz/X55eX6+vr5//zz9/fx//H0y8ja0FbV09ReR1xEQ0BEQ0h0TUFaREZFWVxZXFJVU0daU1JQXlhaWlbX2NrA2cTF2lRfWURDTkZTVFJTUVXW3NHVXFlGREZPdHNwfXJ9d3ZzdktCXtDDxtnJy87Nyc/H08f19/D45fv7/uX7+f3x9/bOw/fI3FZV1lFHUtFQTFpZW09KQENNT0ZaVFpFWF5bWV1YXFxcUVhBREZfRF3Q3tHd2thURVFURXVGUltHR0XU1FZU0dxcXtdWSnd1S3l6fEp3cENHXF9XxMnF2c33wNzYwdxW0s/x9v365PL8+uT48PP88c7K9/Te1tzQWVHR291RUdLTQ0lAWndyQ9VSQkBRWU5G1dZFTUNDdXB3QURDR9PE397AzlVcVtBSR1bRUUNd0dBdXdXXUlNQ3FlxfHJyemV8dH1/cENBWlzby8Ta9PbI3NDbUljT8PL8+uHj5uTm5vnz9fLzycH3wlNFX1RER1HRXkdYUkZPTURIdUxc1VhHR9VXX1ze3VFeWFhLdU5ZWFlQ2cPM2sHE0VJaVlNYUdRaR1xXU1NYUNFWUVbVRnN5cnx6fEpHT3dDU15R3dvT29/ExtRQWVtbU9j39PLk5ubk5Ofk/cr08fX0zc/bVF1XVFbXwcfVUVFRRURCT3VPWlNaTk1FXFlHW9VST3dJdHJxT0VCXtDGx97Z2NZcXlfV2cXFxNTR0tReR1HT1VNdX09zf3h+e2VwTkxOQlNURFnT0Nbfx97R1dPVVt/By/nl5ePi4Obk5/n08/z3x8HG2FRaXFxZXVPX0F5aUVxAQkFGQUFbWE5IQkBERFvR1lNYWVtPdk9eWVvdwt3V0dxWWERfUdbcxMfZ1tVUXkFCU1ZYQV5FSnZwcHN2dERQU11U0VRDXdPQ11PQ31dd0ddW0ML38/764eHk+/r58fXy/cjCwMfSVd7E2NzSxcXf1FdXW01AW1hCSVhJfXNLT3dOQkdaWlhZQEpxdFpf1NzY2dVR19RSVtnFxcn39sPT0NBTWl/XWUhBQUpzcnN8fHN0QltQVldWXlpaUlBc1N7XXtTa2NnM9//5+ufn5/j88/zw8fb2yNnX09FR1d3R1dfT39ZWVF1GTEZXXUBPQEx3R0VEQEPX3t/d0VBfQ0tCRkZcVFReTEJBTk5FXdHc2cbHxd9WUFNZW1xTQ3R1Qk1OQk9NRFNUUFfc0VZSWVtW11RQWVJHWNbd0t7J8vj7+uX58vb38//+8vfPx8bax8faxMHOw9LY31ZYXFpKdU9bS3NxcXxzcHZKT0RRV9VXR0FMSE5bUNfW0t1XUNLT1t7YzfTPzMvA3lZQUVlbTUp0dnJ2d3d2dE9IR0dHUVJYU1BX1dvZVV1S19bT2Mj39PD45fr/8vbL9c/28/bK9cLF3t/T3tvZxcTa3tvdUUBHR0ZMSE9AdHdATUJZVlNRXlJSXlJJSndKSUNFWERGQUBNQFDU19zN9ffMwNjf1FfVV0ZJTk5CdU5DXltbWl9fXVNSX0dd19BaXVBYTU5HWF3U2szK9//4+PH09fTK9Pf28fb98/H09/b2zs7L98jG0NDVRE1OQnZ8cHR8fnZDR0dBR0JOQE9IcUpCTU1AWFNfX1LU3VTfxsLbwcvx9MbZ2dRGQUBCdXV1cXxwcUpLdEhBWkVbRFNWVtXa01dc1NFaXNrLysj19srw/fz0y/TI2trAz8LHz8PJwcTPz9vezPLwx9zS2ldaR0ZOSE1ETEVd1NDU0VVYTUpxcXN2dXV0cXBPW3V0RdDUV1TCz8HL98nGxcXeXV9cU1lWWF1YTFpSWkxDX1BDTFLRXVpY1VxMS0BIcUZQ393Tx87HyvX29/f28fTDzc/0yM/0/v3x8PLw9ff88MLH3tlfQ09LdHFwcHRLSUFSWVtNR3R8eXNyc3Z1dXBORV1bVMH09cjK8ffOycv0xtnd1l5NTlhcWklAW0J1d3V3dU1GTEZZU1NTVVRZQUFGWkRX38LNzcH08MjP9vL98PHwzdre29bd2cHB28TAzc719ffIwMDC3FZDQkdATURfU1BT0dNUWUV3cXNwcHx9cn54dkp1SF7T2sXNw8zJzcDMys7D2dzXUllVUVBX19dRVl9HTVhYR1pcUlxYXF1HdXZ0dnZ0RF1SUd3FzM3J9/Dy/P77+fXMz8jbxvX0ycv39/X2/fD29PbO21ZHSHV0SnRITU1dUFhPRkFKfX1xc3l5c3Z+fndAQkzXzff19/P/8M/098rG2N/fX0RbXkVMRVVRW1hBdHdNQURIWNXUXFbUUU92TkNHTFnRxN/Ty/DMz/f9/fbw//Hb2treUFbYwsffxM7Jzc/y+Pf28vHFXkFYQnZJXFBX09zbUF1dRHRxcHZ8ZXt4ZWR7fHR3T9fOx9/E8fHYxvHxwsHDz9xT1NDU0d3EwdxVUV1ERU9YW0NZUFhOTkx1fHlzdHB0Q1RUUtDMzsn2//v7/vz588vAy8nCwcrxy8j18/b0/fr+8crO0UV1d0pwcHRaWF9YXERPSkh1cHxydHJ+fnJ5eXJNXlDWyff0y/Tw9/XK9vTN3tDQV1hdVVdUUVFSW0lCdnZxd0hERV1TRkd3dXRLcU1MQV9U3Nzd2/X28v3++f/28fTPwMTBxd7dxcLDxcPI9/Xx8v788c/eV0ZHTkBFXVXU3NFdW0dDTHZxc3N4ZGZhZ2d6cnRJQ17X0NbTxNjCw8739fTN29nGxsTAz8LA3cTfUlxBSHR1S1tfWkt0dHRydkt0dUtBRFpDUtTRxsjw+OX6///98fb198vKys/098j38vL98/P8/fXFUV9FSHd0TE1JS0FDSktMS0p0cXdOcXp6ZXh5fXVHXNbZxcfAzcLAxcfAy8rN2NrR1NvF29vb2FVfWUdCdHFzcHVJWkVCQkFcUkdbVlxEWFBSX1Dd3t7by/P98fXz9s3AwMfY3cXE2sXPz8719/38/f/w9M7c3N9QRF3VU1pFUFFeU19aRkp3cX5mYWFmZGR/Sk1AX1XVVdTT39DbyPT29fTw9MPI9MrKyc3E09Dc1ER0dnByf3J2dnBwd09KdkxYS3F1Q1hBRlXBzfX8+/j//f/y8PDy/PbOy/D09vLw98n08fXH3sXdU0dFW09zcUp1d0paWU5MXVJcWk11cnh6eH1xd0dWVVTZwNvR1NLc2djBwMbAzs7NxdrH39TV0tBUV1ZZSHROSnZxdENGR0FeU1xBR1xHSU1SUllW2sDDwsv09c/Gwcj0w8zOwsHJ9/b29/Py/PLw9/H0yMDa09HRXFhaXFBeXlNZR0FGTktweHtmYWBkeH98cUJHW1pfXVxV2cXA9fH8+/7y8/LwyfXLz8bAzsbdV0F1dnNyf3F2c3JxSnVIdXV2dnd1TUdS1d/O9Pfw8/L09vTw/PLx9/L//P/88/H19MnKycXGw8DdVFRQR0RHREVERUFAR1tAQ0BJcXZxfHx9cXZ1QkZEUFNQU9VV1dPX0N3D9Pb19MnBxsPH2Njd1tPT1VdcRExOTnVJTk5IdUtCQE11T0xKS0xcUVXWwsjMxs70zsHNy/b39fb9/PHy8vH0yvHx9fX39srMydrQ1tJXU1RQU11FT050c3x+fntlZWV7enhydndxTkJaRUFW2dLYzPTOyfLy/PL88PLwyMvz9MPbxdNaRlxYdnZ2Sn18cn14eH54f395c0pzdF/Fx9vI8vf08PL98PL/+/39/vrl+fHw/cjJy8vax8/P3NDQ0ddQXlxVXltGWkh3dEJ3eX5zfWV4fHBzd3d1TEFDXFdfR9TN3tDey8Pay/L0zvfw9cnIzc3H2FBX01VeVFdEQkVNcXJwcX99cnNycnB0SnRMX9HUVNvx9c/08Pb28PLx9vLy+fr+9vn58vby/PTGyMrd1sHH1FdQ1FlYQXR2SXZ8cn9lZHtkZGV8fX9zSnR3TVpdRVDFzMPAwPfz8Mry//Hx8Pz29PTJ3NJRX15cW09CQEJ0dHB+eXZ9eH5yfmV+dnZKWVDV0cbP9vL88P/6+fP9/vHw//r98vn4/fLz9vf0z97Y2dRR1VNYW1xASkpJSUlYQEpxdnJ5eX94fHB9c05BSElFWERW2cTT0trHz/f09fDz8PX8/vTBzMRTVtdQWVpFQE1bQEt0S3FzdnRxcnJ+enl0d3VZ1lJUxMr3yvH9/v3z8/789Mr8/vz/5eXy8P3wz87A3NfWWUdZXk1PRk90T1xCSEBGd3J2cXt7c3N+cE91SE1MSkRV1dDM9MLH9/TO9/3+/fPw8Pb0wNLf015FU1tDTk9KSkxGSUlNd3B1SHB8fn94fXdIR9HZ19v09/Xx//z2/fj//Pnz9/L5/v/6+vL08PTDwcTVU1FeQ01bQndIXkFDUlBERE12fn9/ZWV4e2R8cXFzd3dKQVDT3cHOy/Tz8PH++/z9+fry8PHB1dPZUFDXXUFNQkxLQENwcHRyeXB3e2Flcnhld09OX9Dcx/b09/H8/PL45Pj8+Pv4+uTn5OXl/ff3ydnb11lfXk53QkZLdkJaTExbRUx1dnN9c397fn15eXRBdnFBW0ZQzMrNy/H09fDw8fHz8fbz/fTCxdFZVtZRRV5eQ09FXEdNSHR2dXJ9cXF7enxzfXNORV/U2cfI9/bx//zz8vj68vL48vf85fv++/zKwMzH0N7WXF9fR0BeVERJX1dHTV9ad3B0cH95emdleHt+S0J3SllXXNLPzsLJ9vT19/f28v3z8v72x8HHV1/W3F1b1NVYWlxBTkh2fXNxeXp8c2RneX5lfktGQlfDw8r8+/765Pr75Of4/Pr7/fvn5P/y9sHR0FNGRVlBRVdXW1peQ0tEXEJOR0J2dnRwf3t7e3x2cXZFUkRf2svHxsv2zvX3ycPCxsD28/fL9M/dVddfRllXUl3U1lhNQ093dEh2dnV2fXJxeXtydnBwQ15Q3Mz08f/6+fvk5P77+/HO9/H08P7998vA1lNTREZcVNfSxN9dXlFWWFfXREhDSXN/fmVmZHplfndwcUdUUNXByMfF9PbOz83Z0dvCw/Xy9sj3ytBV29xQ1Njf1NZQT3V2cHN2dHJ8cHJ6en55ZX12c3Rf1dfC8P3+5eTn4OPn5eT49Pf+/PT3/PbC2NZAT0FMTlxVXVDRUEJCX0ZLRF5Od091fXxyfHl8cXBLWVlY18fCwvHz9fXwytzS1l1c1NLfw8jAxsfXW1DWUF7U2dBQUVFaQUZLdUJCdXRId39xSXFySEJJRFXQ0sb09/b65+Xk5f/29Mja2sjLw/T8ztHS0F9aUdfU09nexMPcVdfdUEFFUk1ycnN6ZHh4e3xwcHRER0NR2d/H8fP09fTFVNHZ1VHZzc/K9snYx9pXVcfSXNXYUEBdWXdwSHR8dktyf3Nwf310cX1IWUxO1cfZwvz65ODt5ufg5Pz9/fTJ9PbNxMVVQU1ASUpFXUFA1d/R0tZdVtPVWFzVRnRIT3Z2Tk91SkBGRFJUUtTPysn098Pf29xaRFFZR1Tb0tDE3lZQ19dd1dFWVdzQUlBVWElFU0x1RFpJTkNKdU9PcXZMS3Va1dfb9vn45ebk5eX68c/1y8zMztvQ0VBAQF9FQVjX1NDMzsTEwNvT3dFYQFpGdHd3fHlycn59dEx3SllQ1cTNwc3OzcXH2tBQ1t/T28zNwMfHxt7Y2FRR19FV1VZbREZETHVOSnRKSXVKdXR3d3V0d0hCRlHbyPH+5ebh4ODk5fvz9vT1z8TF1l1HQUl2SnV0QVfX1tHe2NPf39VRUFJYX19ATk5PcXFCR0BGW11U0djFx8bGxMXZ0FNfXF1fVtPd0tBUVNHXUVlTUdXXVdHW1VFW1VBQU1BXUltbRUNOSnFwdnZxdUFFUNjM9/zl5OX6+/7x9/T1y8LG29LWU0VYWkNAUdPcxMHCz8/MxN3R1FNbXF5AdHd3c319cHB2dkpYUlxX3drF2dzd09fU1tTc2MTPz87Cz8PF3tDRV9fdV1HVVl9eRUdDQERCTkZMd3d0cXBwcHN8dVtd18zK9/zk5ubm4eT4/vD08fTG3tzUWEdGSnN3Tk1aU1VW1tLc2djbVlJUXF5XUEFNRUNISUVHQF1WVdLY39DbxdZT1tFHRltbR1zS19bc09TX1lZT1VRW1d/e19na0VfR31Fd1VVQX1pOS3VzfHx8fnZEXFLXxs3I8f7//fz/9vT3ysj1z9rax9JXUFFeQVzX1tzaxsHY2cXa3tRZWlJGSExKcXx9cXBxTkBHXlbT2NzY2tDVVdfQ11BR1VRU3cPIxcTDxN3T0tFXUFNXV1VVXVJeQEFGQUJMQ0h0Skl0cHFwcUla1dvOyvXy+Pn55OT+/PLzyszLwN/Q0FdbW0FJSEpMQVZWU9fS3NfS2NBTXlJQUllbWk9LT01FWVLU39jawsPBxtrc1tRQXlhBTnVPRkVcV1VWU9HQ1VTVV1DV2drZxMPF0dVV19dXVlJZR0hITnRwc3ZLSUdU0tPYwcn09vDx9PX0ysPZ3tjc1NDS09fW111cVtXcxMLGxMnMxdjd1FJTUkZCQnVzcHd0TkdFWlPX1NbY2dVU19VTUFVQWVlBR1DX1NXexd7azMXU3N1fVtnY1tHe0VNSUFhYXENKSEtxc0pLcXZERVrS29LG9/H38/7y8P3y9ffxx9za3lZeVVVFRFxCS1pFTV7d0VHdx9ZX0tNeVtBQWltbTE1RVVPWxcXGyMPewM7bV1FXQUxaQXRJTUh1TUZGXdHQVNTdUV1WU13Sz8PbwsvBxcXfVdDeU0BHRkJMQUBLTl5cXFBV1tjAxNjFws3FwMDYwMbd1NbQ0NLd2NZXVFVRUlTcwM3NyMv1z9/c119ZWUJ3d0tOTUBbWlzVVFTVVdDU1VddX1XRUVFQU1HU1FHV2MPHxcLb3dRdWkdT1dXQ0t7d2MRUWFtFTXR3dndOQkxCXlHU0tnc2c31y83J9PT39cjLyc/Z0NNUV9HTVl5TXEdDSXVDXFxf18XDxsDA2d3f01VWU1tY19nV1MTA2dDc3t7YVV5eWUFPR0VCTkNEQ05DWllR1VBX0NFeWlxcVtnGwc31y8n29cTa2VFDQ1pDQkRbT01YRFpRVl1X2d1R1NrTVdDd0sXD3NDaxN/ayc7T1t1VUlldV9Pb3sTP9M/GztrVV1FYQ0FCTkNfWEBQV0RGXFdX11VcXlZXW1/WU13U0FZd3Nre2MXc197RR0FcWUZR2dnfxcfS3d5UXF5AcXNOTUpIX15bV1Zd18fY08bMxMXKyMbAw8Xbxt/W09rSVt3YV1hbTXF3TklOUdBX3sjOxsr3xt/Z0FJU09RR0trT0cXZUFTc1V1RUUdNRU91QkZ0dEJPS0VWUVTW1lRWVF9c19zW3czOyfXxysP1z9PX0FpIRERISEVbTk9ATUNQV15d1VVcUt7d1NvB39PBw8bNw9jbwMfWV1BbRVJRVN7a29jHz8DAzdrVU1dZRFxbQEdRX01ZUVlbV1dfV9RTWFFTW17UUUZf1FRW3dvd3sXdU1BWWFtRVVfT2dzcxdvR1tNXRkdeRE9NRkFFWEdaX15dVdzc0d3ExcTNzMPAxN7Q39nT0dLX1NLTUF5ZR01CX1lbVNDR0MTMxsXa2NbT2NPX0NTV1tzT1dfdVV5WVl5EWltZX1lbQE1NdUlHQUBbVtXU1dbX1NzS09jZ0t3Gw8PPycPZxNlWUVFHSEJaTEhDREJMWV5aXV9EWdLZ3sDK2FHcxtPW2tnX0t7c38XfUlfZ3NHc3FVX3d/Sxc3cU9PZUVDXUVtFWlpfVFJBUdxVUtTVWFpSVFBV0F9AXFJGW1VSWlbZ09Te2FfSzN9V3dxRXNDfVlXY1FvU011FXkFLTFlBSFhfT1vXVl9V0NbeyPXJ9/bF1MbB1lTXUVtR01VX09VHU9hUWlfQX13f2dXcwtZT2sVXVcXcUtXb31XZxdfSx9RZV9VFW9DXR0VVRXRARkpMREBHVN3VV9vH3dvM31fd01xT3t5Q0szS0c/DUF1cQ0JFWkt1XF1ORFdEQl7VVNDL98DD9cfdwdheWVRQXtTdVVTHwtzYxtnR0dddUd7cV9XSVNXd1l1d1lFe1t1X18bG0dLe11BRVltX2VFGWlNFQl5SQUJRU1tW1lDUwsze3MfeUFBQRlnX1FJUxMfY2tvVWF5ETkJATERcWU1HUVJd0drAyvP2zc71w9vf1VtFX0dBXlBSUdna1NzD3FJQ11BQ0dZT1MTcVNLT1t/c3dDZzsHfxNvX1NbVXF1QU1ZRXUZaX09MRUdERUVDRl1V19HZ2dDc3NZXV1RW1d/f3M/IxtjExNRRXE1ITk1MTUBMTENHXlzSwcPPzcnNwMLH3dfUUlhaRkVW1dXf3tjH3NFUUtTW1NVQ1t3Q0NzQ0d/R3d3V0Nvf1tTR1lddU1JT19ZVVFZXV1xfXVhfUVtaWEVaXNXR1dPZ0VfVV11WVVdR1dzY3sXY2dnd1VlaRUNCRFpAQEVFR1tS1MfOzMDOycPDwdrc0dReQURER1hSUFBV1tRQVlRQ0NnR0dja39nHwNrbxNHV3d/S0t3UV1TUVltW1VFV11ZZX11bWlJTWVhSRENbR0RfUlRX1N3W0cXe0dPc0NTc29jYwNnW0tFYRVhbRkRZRk9AQE9DUldX38Xf08XAxcXMxNPc01BeU1NZX1JdXFZVXFbQ3dfR2d3Q2cXe29rT1tDS1NTf3dbT0VBTUF1bU9HW1dDTU1BUUF1cUF1bUlNEQ0RBQFhTU1BU0dTQxNvT39zX0N3d3dBVUl5TUFleUF1T1VFfW0VbQ1tU1dbc39Dd2MXHx8Xc0NzVW1lfRURbWFlZXVBTU9TW1tzY2drDwMHH2t3T393X3NrT1tPWVlBXVFdX1FBcU15fUlZRXVZRUlxdWUBCTUhCXVFQ0d/excbDwcHE2dnaxNzQ111ZWFNSWl5eRVpeXkVaWERbXFJT1dRWV9TS2cbCwcfb39bUVFNeWlldUVdXVNXW0N3bxd7Y29LQ3Nrf3NnS0NLS0NDWVFdQXF9RVVdSXVFXVdfW1dXR3dbRVV5EQ0xPRl5cUVdWVdzHx8fDxNjY39PUVV1FRlpFWF5fX1xU19VVVFxbUVdSVtPQVNHc0t7Dw9jZ3NFXXV9GRkVbWkVTUVNRVFXW2Njcx8Tf28HG2tvF29/f39PbwdLUVVRcWF5bQENYRVvVVVfQ29xU19BQRkFNdUZTU9TS3t3Eyc7FwsvE2MbZ0NZUXkJARkxPWFtBUlVdWV5eR0VcR0JW11xR0NLewc3Nx8fY3d/cVlHQ1VxcVlRX1NNRXddXXtXSV1TT01XU2NNU38Xd3MHfV1ZUVl1WVV5YV1BcVd3c2cPC297Z11lbWkxJQUVf1dfU3MHA3tvDxNLZ2dbVUUVNTkxJT1/UUlHd1FPU1lJdVFFaXNLVXdPd193Bx8TE29NU1FReXFRfRFxWXllR1VNW39dU39JU0dzX1tvH2NnAwNrBx9DV1lRbWlFdQVlRRERX1VbdwdvfxttRXlFFTVxXU1XZ3NbewMfZwsne3MTRXlJTR0lCQU9AXEVHVlVeXdBRW19RWFpRVF9R3NDSzvTOw83B3NDQUFLQ11heVFlDWlJYXtHcV9TXWkZWVlPV39jd2Mba3sbH19HZ11ZUVFlFU1FEXtHU0MLPx8PH3NVSXFpbVNVcX1ZTUdfY28XPwtPX01hGXVxERVxdWFhaRlpXUVlS0ddfXVdcWFJRU1ffxcD39MbEx9nVU1BQXVFcQUNCTEJEUlHX2MTUWFJcXFbX0d7Hx9nZxMbExsHd1t3Z0VJfWUVbXkVF197T0tva3tzdV1xdUVBSUFhFUNPQ0s31zsLD3FBV1F1fU1JFW1tPdExFQkBcU15WVVlGXVFbXNfWVMf3ycPLyMTF29RSVdNdWlJbTEVWWFjU3VZS11xMWFRZWNPZ0dTd1VfEycXayMPT2NhQW1bVW0XVVF/extHU28Lf3drVWFTRW0RTXUZT0NHez/XS1drdUdHSXVhV1UVAQUp3QVhNRdTVX15cRUZTVVhS3tPRxM/a28vM0tLe1V/VVVpbVVdHWVFfX1VUWlvUUVpcVllZ09JRV9PW18fKz831zt3T0lZTVFRdUNzTUFTUVtfGxdLT3FRaXFBYX9ZRRVDQ0tzEx9HXx9vV0NNWVlddQUZfR0pMXlpe1VBFRF1TX1LWVVfe01TW39rHxdnQ19LRXVJXU1JVUVBWVlBZWFJTUNdQWl1VVFdUVFZV3d/TxMnD2sXZ11XR0VFW0NBV19VeXlXT1NDa3tbQ0VNQ0NBQUdbW0dPc0t3F2tPQ0tdQVVVEQ0VHRkVHTENdWU1GWFpGXlNS19nT19bR1dbDwNzHz9vW3trR0tvWXlfYVFpdW01HU11BWl1EWlBQW1LQVFbdx8XEzs/c2MLE3tnH2sXD3NTS0ldR19RQ1ddcRVlSWF1WX1lX0tVW097S3sXTV9Lb1lfQVFxR1FNZVNReWlhaQERcRUNf11FdV15BW1dWU9De3NPe1lbd2NZW0d3R3NjQVlXWVFFWUF5dVV1bV9VRVdbX0NrF0dfc3VfQ2dbU2MXd0NDUUdTfVVfZ3VbU3dZX0NlUU9Le1t3Z1tfexdJX1tdfUFRZRVhEQ0dYWV9WUEFCRUVEWVhYUFdVU1DWUFpW1tTdxNvc3d7d38PbVdDa39HS3NRdXl9HQVtaQ0dYWVLV1FbX3tncxMXe28bE28TGxd7f39HW0NbV0dPT0tFXX1ZXW0VQVlJTVlVV0tPR3d3T1dTQ1VFXVdRWUVJSV1BfX1FWX11WU1NfWFhZW1pYXllERFpcUlFQUNTW093T28Tb2trFwcfb39LUVFNHRVpbXVLV1tTd2Nnc3dPe29jd3NnY0FFUVFDV1FfV3N7d3NjS1tLS1ldUV9fS1lfX3t7X0Njd1dRVX15XV11TUlpbX0ZPQURFWFfUXVHXXUFEXlpYUlJYUtPUUNfUUlTc3d3aw9rfxsfcxc7F1NfRU1tHTXVIRERf1NDV09xUVN7ExcbMw8TAxtdTVFRdVtbWVdzE39Dc3dHc3FZcVFReW1BQUlfR0NPe3tVQUFxS1N3T1tPQVl9FQUFcUlzV3ddWUFlDQUVaRVpbWllcWEdeUF1SVNVUVdLR19zExcTNw8XGxtJQXFxYWF1dXdbS1dXUU1DR3tvY2MfZ0FRfXFdWU9Tc3NLc29vfxMHc2sTT3NjXXFLX0NbR3t/Ywd1XVFJaWVJXX1lRX05KS3VMWlpZU9VRW0RFQVhSXFNVVFBRV1Jd1NzXV93d19bWVlHX2d7axtvbwdtVX1JbQkFfXFlU11JfV1XU0tje3sbB3NPUV9Tf39Df2t7W1tzS0dnZ0tLd1lRQXUFFVNVW0N7fxcHZ0N3c1VDU1lbV1lNbW1lZXFBdXFbVWUNAQE1BXl5eUlFaR15YWFfW1VXQ3dZWVlBQ19PT2cfBwcHG2NDT0VNZXl9YXV9EWFFTX1fWVNTQV15eXVNU3N/f3sfb0N3ExtrHwMHGzMPd0NFX1Nzc0N/F2dzFxN/T01FfXVNdW0VATUFYW1tZWVpZXkRNRFlaWlPXV1XXVlDU0dHS3tzc2NvRUlxSXFJU1dPe3tdX0dFWVNVTW19cWkZYWV1V0FRR1tPW1NVWUNXS3djDzcfa2t7d2tvR1NLY2dne1F1SU1NX0dDS2dzX0MXG297S0NDQ1ldX11RW1NRQWVxfQUBBR1hSXVlcVFRbW11fWVNWUlXQ3NPR0VBf1dDV1N/e0t3S0dHf3FRX0ddVVFBZWllTXF5SXlhfWUBDXlJR1t/F2sLB3tvF29jb2Nzd38Tb397f3d/d1t3F2t3S393Q2d/X0dzXUlJdXF1V1F1dXEVAQEFJSEVTXdfY01TUV15T09NQUNbR0N7Z0VVXVlBW09RV0VVfXlJQUVZRU1fT1lBXUVxdVtVXXV1ZRUVbWFPc39Pay8vAwMbb2MPa1tPRVV9TVV9ZVdBWVN/S19LS19Xf2dbcx9rZ2tjR0d/Y3dLf1lFQXkxJR0ZDRFdUV9BUXkZGQURSXUZGUlBYXdRVUlZUVdDE29fS2dbX29jVV9LS1t7Y0dfc1F5TUVlOTk9xdkFZXtHH2sXMzd/fwMXX3drRVFVQW1lWV1bd2tPfwsHc3MXZ3d7Z1tHF3dTS0FNS1tFXVNZSREdHT0JSU13Wx9rW3dxQWF9HTEFETUxZWUBY1NVdUNVX1dDTVVTQ0VXT01RU0t3W3Mba0t/cVlZWWk9CRkNAX9fR3s3OwsDF0tPS1VxdVF1GQERCRlNX19/a2NnGwdvYwsDb28bBx8PG29jE39HS3NVRVVNbR0VaQEReXlLW115FR01KdXV2dkpIdU1bWFDT3t/f28Tf39re3cXE3d3Z2d/bx9jZxN9UVdZTW0ZPdHZ1Tk9HVdLdwcLY3dzdVFfVUVxWUVtfVVdX0sXExcfDxMXCwsfBwNnZx8Tf3NvSUdTWU1fS1VBWUV9FWV5FWNXUVdDXXEZDTHdzd3ZwdU9LQ1JSXNXc0FXS3FXU2N/cxMDb2sPD39jDxNPd3FTV0VFaW19DS0ZFQV/c29nExtzQ0FFHWVFZR15SWV3X09HFz8HFzcPFx8rMx8zLwsHIwdPbxVVQ1tDV19zWUFVVWUZYWkZbV1BfU1NBSU93cnZ1cXFPQUNZVFdR0NzW0NjY39jF2dvMysnDw8Xd2cXS1dHWVlFWXkdGQ0tLR15R0t3W1tzf1lFcWEZaXF9S1NbX097Ex8n1wsHPyMnKyMHDzszGxdjS1VdWUNXR0tLW11dRVlNYRFteX11dXFFRXkBPSXR1d3Z1SExEX11cUNVWU1dUVdDd3d/Ew8jOx9rc09PW1tbS09bUVlNQU1lEW1pFVtTV0Nnf0NVVUlleRUBFX1FX0N/c2MDNwcHOzMLOyczO98jHx8XQ0N3RVdfT1tHb3tbR39RfUl1aRkZBQkVfQUlDQXV0T0p2dUlOQ1xcWlDUXlhU0NfQ2NvEyPXMwM/N3NjE3NPc39XV3dRSUFREQllbQlhWUlbf2VdT1V1GRFlFWtXVVtLE2dPaz9rFyvXJ9/HKzvbO3NzY1F9R1VBV3NHX2MXQVNHVWkRYQU5GW0BBX0RITUZLd0NHSkJZWkVSUEZGXlhGU9dRVNjH3sXIz8fBzMTawtrW3dnVV9vG3dPdV0VaWkJaV1BT1t7Q1dVWW1pZQUdSVlxX2dzX09vY3MbBx870y8/IzN7Zxt/X0tNTU9bW0dvG2N/e0V1bRE9LQEZMQkRDSElJdHVAQHVPWkdGXl5HRFlaWlbQ19PGxtnBy87Mzs7CzvXB3dLTVVTd3dHW119HWlpCR1BdW1HWVlJXXUdZUl5bVlRSVN/Q1t3e2tjBzMn19/XPzMzE2tvd1dXVUl9dUVbQ0tfW0FRZW0RBQFpYWkRZWk1MTUNDRFlFRlteX1lZQEZEQ0NFXF1W09jZxcbDzcHGwcHa0tDWVFXR2d/f2d/UUF1QUFHV1dDR1tVVVlJQVl1ZWFxZWlHUVVfQ3N/f3NvHzMHBws7AxMPMxN7S1lNeXV1R1tLQ3N3XUFxGTUdEQ01FRE1MQEBARkBDTU1PSUBEQU9BXkRaUddX1tvZ2cbMwszPzMLMwtrT0NRTVtLe0dHc01BQV9VX1VfV11VSUlVdWVBVXV5WV15cVNdU1NjFxMbNwMj0z8PKzN3fxttV0d7WXVBRXFxUVFRXU1tHXlpDRFJbQFhSRkBZXFtYUV9GQ0JMQUBMTkdZR1pU11fTxcDYwc3DxsTH2dve11XUVlPV29/S2dtVU1TWVVTQ0NHU0NTQ01RQVVZbW1fVXVHS0tfd29jf2djExsfDws7Y3cXB2dLe2tZcVtRUU1FQUVxYR1pEQ0xEW0FaUlFeUFVVX1leREh0dXVKdUhGWVpaUtPW1N7AxdjGwMbFxsHCxNnT0tBU1dzb3tnHxdfV1tdcU9TR1dXU1NPR11TVXlpcVlJdUNbRV9Df3NPex83AwszJwNzSxcDf28bE09VXV1xbWkVBSUpPQ0lOTUdFXlPVVl3X01RfXF9YTU9NQ09MQVlbQV/W09Tc2sHe3djF39/YxcXS0t7cV1fTxNvc2sXR1dVV1FTT2MXb2drA2NbW1lJFXVdWXFHU1VJQVNTU1dTQ2Nnf2MTe0d/D29zfxdrS19HQV1JSUlpMTEZNdU5fVFFU3sXXVdbVWkNGRUJ1dUBCdHVPREFbV9bV0NjF2NDdxsbbxMPMxtvFwNjR38TF09De29RSUNRVUdXH2dDYwN5SU9VVRERTVVxeVtZUUNDExdPSx8LS1sXB3N7Bw9jYwcLa09PS0VNbWURIdEtLd3NLW1tZVdjb3tJVV1FeW1pYTUlDQHV3TVtbWVXW0NPZ3N3f3Nza3tHT2sfT1t7H0tLc3tTR1NzTVlbT293QwvTA2cTBVlhR0FNAWdVRREZf1FNc0cfc1NLH1lpW2tvV2M/G3cXPwd3awcfSUVJTXkxJQk9KSkZcXdTbwNtVU1lfRUJOQUJ3cXV0cnBGWUBG1d7VU9Ha3t3B9cjY387J0NbDyN7R28bW1djF1VLX3dFW0drF3t/XVF9bXl9eWV9eWkFBR1zX3N/bzMDc19/e1tPIy8fb9fXb0cfO39TS31NBR1NAcXdDQnd1WFBbU9zSWkJeUUZCUldHSEhOSHRMW1tbUNTVV1TU193EwsTHwsfd0NvH3trC2VfV2t5XUdLSVlbazcTew87cUNHb1FlQ0FdaWFNHdExTUVhT3d5TX1TT1NbByMLazfTN2dja2sTa3N3f01VQU19GRllcWURc1lZZWFJZQE9ERnV0QnR4f0tOdkpSUEFEVNdSXdjOx9/P8PXHxM/N3d7Mw9PRxNhVVdLQVVXU1tbT0NVUXVxX1NfU11FcXVtHW1JQWV/W0NfTxN/X2MvJw8vw9czK9czb38HFUV/U0VtORF5AS17XX0JeV1lJRlJdWV5SXFlERkZPSkNaREBEX15bXlJdUdHf3NjZ39jF3lRV2trX0drfVVfQ01Bd08bb1tLDxtVV2tvR08ba1FDT01lHXFBSWVtfWkFCRFhFXNLGx8bI9PT09c7CwsLHx8fb09Lc1V1W0dVTVtDXXkVfWEFDWF1AS09Bd3xzSnV0T1tEQVteX15fV9zbxMLJysrKysvMyMvPwMHY3NHQ1V1X1VBS1VVTXllaREVQ19fX1dLRUllRV1BS1dVSX1ZRWFhR1tLDyPXK9fTLyMjLycDY2NzTVlJcQUJEUl5eVNFQX11QXF9QUF9eXVxcR0NDRlpeU1BcW1lHQkNZUlbU0t/c2dzS09LR3NrGxMXE2dFVVVXQ11XU393X0N7SV9HY2tLYw8TWVlZSXl9WUllEWkdMdEpCT0BT3NvGzsvDw8/LysrLzMDH29HX1tVWVNfW09DRV1FdXVLVUkVaXkRIS3V2cHdLTk9EW1pGTE1EWVnQ2MXFzcjAxcz0zsn09/XLzcbS1NZV1FdTXVFcWkVeXl9SV1dV3dzS1dVcXVFUXVNUUFpGWkZBWFdV38HK9PTKxsPOy83IyMHd01FFRF5ETUdbWV9WUF1fVldRVF1fUVReR0BDTkJBQENYVl5aRVpGRV9TXdfd2d3R1NXYxdvbw8LAxsHY0tjY09fQ0dbU1FBX0N/e2drZ2sDD3tbU1FBQUl9fWUFKd3Zxd05DR1Lc28TGwMPMyMjK9Pb1w8XdVFdUUF5dVdfR0dbU1FZTV1FZRFxeQEpJdXZzcHF3dUtOQkBHX1NWVNPa297bxcfAzsrJysr1zsjB29ra09TR0NVQUV1YWF1SV1BU0d/f19Hc3VFV3dNU1NRSQE1GQkBDW1LX0N7HzcfAyMjCzcrJx97fVl1YRU9CW0RaXVRdUtXWUFfU0NfUVVNdXltBQEh1SkJLd09YRE9bXVxaUVVVVtHZxMbax83M28TDw9nYxdjR2MHb0tbRV1VU1VTc2NjawsbS0t3XXVBQX0ZBT0lOSndIQE1GU9PR38L0yMv28fXI9crP2Njd0FBZWVFYRFJXUlhQUV9bUlJZWltGQENCQ0h1d3dxdHRIQ1tbU1RX1tPT0MTGwMP0y8LO9cvDzcLD2d3e2dbR1tRQX19eXF5Q1t7T2MDC38XA2tLX11BYRFlaQU1GRkFGXlHV0dvIysrL9MzF29rS0dVXXFheR0dHWEVeU1ZR1dHf3dHT0NFUV1JTWkdGTXdxdHV0d05CQExFWVtEXNTR0dzAw8bEycvMxs/OwcTMy8Db2cfZ3NHW11VU0dLc3tjGxNnQ39zWXVtATUp1T09LdUNEWkdS0dzZz/Dy8fbx9M3Hw8HcVlTRVlhcUVNZWVdQXlpTV1NaWFNdWkRaRUFJTEt3cXRLTE9MRF5YR19WVl1V2MfawvX1zcL19MzEw83B38XG2dTU39NTX1TXUFLd2tzR28bY0t/F3lZYXllASE1AQ0xBRVtZUtbS2cfI9/TJw8zA3dTT0ldSUVRQXlfR11XU0tBVVNzf0VZV1FJEXlFbTExBT3FxS0txcUlATEpPRkZBWFTQ3NjDycjOzsnPzczLz8/OzsLF2Nva3VTU0tJU1dvG2NPY2tNQVNFRREBaRU51SU91dENYRERR39/ezPHwysr3yMXS29rc0NPf09dU09/WVNXR1FFXV1NfXlJcWEZFRE5ISEl1cXdLSHd0RFlET1tTX15Xxs3Nz/fxzs3IycHbw83Bxdva0NfQ09RdUFdQXVPR39zQ0t7Q11XR01BcXFNYQUJBRUNNR1lTUlTc29vB9cvCxdjY1tHS1tRU11RQUlTd0dbQ3tvR0N3f11ZVV1FfXVNZRUJJT0lKdHR2dUt0dHRIT0hAXtfd28PPysPBw8zLwsPI98vBzMLC2t7Y3NzX1dHQ3d3f0NHSV1JQVVdYWFJXWExDQ0NKdU9CRkRQ0sXGwMrLysvDx9vB293f28fRVNXX1lBR1NDRUVZXVF1aWFlbQUNHRVpPT01DQElOTk9NTk1DRUVGW1PT3d3FyffPwM/Iz9rHwsPY0tjZ2dDR09fRVFJSUdZU1NHc3tXV1NzSVdDf2tBQUFNdQU1GW1hEX1TS3dDbxMTe0dPS3dTV093c1VZdXVdSUdXZ2dfQ2drRUNXUVltFX1xcRFteW0FLSEp1cXF0dU9OSUJAWltS1tnCwcDP9fTK9fT29MPDzcnB2cfG29RV0t3RV9bQ09dRUF1SXFtcUFRQW1pFW05JQ0ZFQVpQ09zdwMv1zcfBw8Lb2MbAwdLT0dRWWVHV1VZW19TVVl1eRVpGQ0BEW0ZGWFxbTUJDQE93SkNaQk9FWVxYUN/GwMDLysrL9ff1yszExdnb3tPQ09/UVdfT3VdTVdzQUNXT0FBT0NDWUVNWUlxaWFhYRUBaXVfW0NLYx8TZ3N7F3NLYxMfT19bXVlhT0dLUVNPe39fV11RdWlhfWVleU19eXV9bQEBNd3Z1TEp0SEZZRERR397W3cL1ysrw8vbKycvCxd7Y297Z3tnZxcXT1VXd31dTUNRQW15RVFlGWF5BS0NZWkNDX1BTUNfc3sTF29rGzcDAwMPMxtre3tJTVtTXUV5TVVRYRV1QXEBDWVlZRVlfWFpaXkVBTE5OSkhMQkFYU15ZVtvA3d/N9MrO9PD3z8HAxtzV1d/T11XT397c0dVV1tRXVtfT11BU0dJUXV1dWk9CWl5aRFLU1V1cVdHWVdbZxcbBwMfExsXf0dPXUl5RVVdQ1dbVXlhT1VdbWVZWUllfUFJeWFtGRk50dHRKdUtNW1pBWlzW39LfxM7Px8z28/TOyvfO2NzF2NPX3NvY39Ld09ZUVNXX0FVSU1fUUFhaXFlKdUdfREBfVFRcUtHe3dDdxMHGxcfCzMbaxdne111eU1dTUlBQV15ARl5eQVhV0FdfUNRVWUdaWkZOSk1GQklDQ0JDQUFEU1RU1tjCwMTDyPfJzM/Lztjf2sPF093Z2N3X0t/d19Hex9rS3d3R1VFSXFxeQ0lCW0ZDWl5XX1tX0tNWUNDa39LGzs/DwcLG2tzVUVTVVlBW1VReRFtfXFldVtZUXFJWVlhAR1tHSXRITU50S0BGQEJBWVFQV9LbxsDNy8r0y8nOycnG2sTNwd3T2djT1NTS2N3R39vb1FdUVVNbWF1SREFFRFpEQVpcU15fUNXRVdTQ2MXZxcLPw9nZ29rQVNfR11JSUVRRW1hZXV1ZUFXR1VNU1FVTX1lFQUlLSE5NTk9ARURPTUVcWF7V2MLCwMn09czNzMPE3NvGxtrY29jY3NDR39jQ1t/FxdPV1NZWWEVYXFpARlldWVhSVFdYW1JQUF5dVdDT0t7Hwdrf2dvb39LT0NdTXFLV1VJdV9RXUlXd3dRW1NVUUl5eRUBIS0xMSUpOQEVaQERbX15bXdDF2tjA9fTPzMjLwtvFwcHa39rE2t7f29nf1lXW093UV1TVV1hHWl5FQkdcV11c19FUX19SU1JYXFXd0tbex8Pa3N7Z2dPU1tDXXV9TVFFfUlfW11fU3NvQV9bQ1FlFWVhBTk1GRUdCQUdAQ0NGRV5bRF7V3NHR3sDPxsfNyM/Ex8PMxtvGzcLExMDG29PR0N3c0dbc3NZdWkRbRUBDW1BTXFDUVFlEWV9ET0dSVFFS1tnY3dLZ2Nje3d3d3NFV1NDT0dfW0tZWVNPSVVNX09VYQVhZWkFHWFlbRkdHRkFBWlleXl5TV9XX1NzEwsPDz/XKwMbCy8za28HG3t7E291VVdbXVVFX0NdRXFxfXl5YXFFX1V1TVNVRXVBWVlhbXVBcW1HT3NBV0d3QV1fR09HV19PS3dbV19TR19fR0NZW1NHWU1pcUlBZXlZXUkRER0FDQ0ZER0ZGRUVbXlzV3NvFx8PDwMXHy/TIws7IyMLbwcPF3NLZ09bVV9ZVUF1cXFxfWF5RVlxZXF9dX1pdV1BZRFldXF5R3Nvc0N7Y0tfU0tjf0dDZ3NBUVtTU1VZXV1JTWV1WUVNYX1NQXFxU1lFFRFleW0daX15FQkVZWVlS1t/F29rBxsTe2cfPzMXFwMbY0tnF29/U0N3WVVfU1VRTUdVUVFbV1tFVUlHUVVNeXVJcQE1GREVGWNXXVFNR0dfV193Hxd3d3t/TVFTR0tPT0dDRVVxdUFNRU1BUVFFQV9RVX0ReXkRPQ0dASXVJQ0RaX1Xc2tnZx8HAxMDOy8vNws3NwN7bwcfZ09/Z0FFS1dVTX1JQXV1bX1JQV11U1VdTXl5aREFCR15TU1PU3dBXV9Lc09PYxMTF3d/f0NVX0dHX1FXVUFlHRV9ZXl1RVNDXVtfQ09VXV1VRRUFGQE1OTkZYRVpR1tbX19/Z29vZx8bHxcXHx8XZ28HGwdvZ2t7QVNXR1FRX19DQV1fT09ZV1NRWXkRHTUNMSUFaW1heU1ZXUVBV0t7f2MPD2t7Z2sTd0Nnf3d3R19RRWVlcXFxYUlZRUVJU1tfQVFZWXEdOT0lJSE9BRVtHXFRV0dTZxcbAxc3PzMHHw8DDwMHE2NvS09PWVVJR1VRWUFZUVFZS1dDR1NfTVV1FWkVGRkBbXFNSUlVU1dXX3N7f0tnE29jQ0dDW19TW09BUUVdWXVlfXFxSU1HU1NbU097Z2dbS1lBZR1pEQUJPQEFBTUdeXlhZVd/e3tzb29vY3cTBxsfHwsbG2d7Z09FV1tbV1ldV3dbQ3NDd2NbX0lZTRkNBTU1ITkJBRkNZU1JQVNDZ2tnawMTa3tnb2N7R3NnT1lTX1ldTXFNSUV1dV1TUVlfWVVVRVVxcXEdETUFDSUZGQ0BHX11SUdPe3NvFxMPHxcfDzczG28Xf2dHQVdVVXlxWU1RSUdfWVdXf093S1tLVVlJcXV5EQ0ZERVhYUFBSVlbU097f0tnZ29LW3tPR1Nbc19VR1dVXVlxUVVVXVN/T39Ld2dPR1NVUUFNYW15aQUxMS0lITkRHRFlfVNDd09/b2NjYwcPBwM3OwMbF39jc3dFW0VXX1dHc0t/Q09/T0FfUVl9bR0RATkhIQklCQVhSUlRX0d7Y29zHxsbH28HH3NDQ3t/Q1NXSUVJdUdVcVlbV0FXW1dZV1VVdUV9fXlhdWF5AR0RBR0ZdV1dWUdbd3dPexsXa39nG2Mfa2sTf3tfR1FBRU9VXV9HX3N/Z0tLZ3tPU19FUVV1SXERBT0ZCQltFUFJWVFTT0NDT0Nzf0tHS3NDRVd3Q1NRX1NFUVFfcUNDE0sFX3t3R2NVXX1BcXFlGWVlEQkhCQk5NR11bX19V1NbQ18bawMXexMDMwMfMwcTY3NnQ11HV0NHc09/c3tzS293UUlxEUVNZW0FASXVISEBGRV1WVtXR3d/f097AxcTF2MXa2dPexdnQVNTVV1ZS19dVVFfW1ldWV9RWXFpFXkdbWlhcW0dNQURcXlnW0NbV1N7c09DZxd7f3dvE2t7Z2NzT11TXVlBQU9bX09bT393e097Z09ZWVldRU1BWXFhHQ0VERFtdVFdUVlfXVVVRVdfV11TR09PT19ze0NTU0NdUVdPY3NLS2MbY09Dc0FZQX1JcXFhbWUBDS0hBT0xBWVBcWVlQ1VdX1NnZ3dnYwMDBwMLNxdje2t7X0tDd2N7f0t/Z3tPW3NZTWUVeWkdERUVATUxGRkZeXVFWUVdX1tDS0d3b39jc28HEx8XAwMTZ1tPVUVdW1tdWUFbVVlJSUVZcXlheUlxZW1hYWkRbXVJQUFbXVFZRV9DW1tLZ293c3Nja39/e2N/Q11XXVldXVNDX1tHQ0tDT0d/Z0NZU0dZWUFDVU11fX1NYWVhbX1pZXl1SXl1eUFFR1NXS3tzc2MHH2N3c3tDW09rE2NvY2dLX0NTT0VRXU1FbREZCQU5MTk1GQ0NAWlhfXF1VUVTV0d/e2djHwcHNwczOwcLHwcHY39zf0tDWVNBVV1dSV1NdWFtbQUZDRVpFW1tdWVpaWl1YXFBX0dHS0tzb3tjexMDFxsXBx9re09JUVlBT1VFSU1BRU1BSVFFSUVlSXVhZRV9fXlhcVl9fXVBXUFRV1NRU0dTR3dHR0NDX1tbW09TX19HS0NLQ3N/d0NfQ09Dd3NjY3t3S01RUUFBRXVJeXlpHQUxAQkxCQlteXl5dVFRUV9fc3d7ZxcDGxsbAwcfGx8bE2tjd2NzQ0NDQVVdfXVJFQUJNTklOdUt1S0hNRURZWVxXV9XX3djZ2trGzMLAwczDwMHax8TE29PT11VWUVVUVlPV1VFTXlJSWEdBWFhbREZFREdGRV9eXFHR0tLc0tra29vZxMfb2dnFxdjc393R1lZQU1JQU1ZUVlZX1VZSU1BWUFNZWFBSWVpeXFhYWllZXVRX1NDW19fT19PX19zQ09bQ0d7V1NDT09fW0N3Q0NDY397awMTEw9jZ39xRXlNdXkREWkZCTE9CTEBHW1JQUVPVVdfU19/T3t7Yw8HHxcXHxtrYxcbb2d/d1tzZw8nFUN1fWVROQE1MQU53TkxbSHVMQUFSX17WUtNU2NxTxsDG2sbf3N3SwtDQ2sLc3NDf39dWVthW0N1T1d5XWVVQW0dDX9RFQF1YQlhAVd5RVsHBxcHazczc3sfazdvBzczZxtvSxdRRxNJRVFhWXlxf39ZSw9RXUVPRWl9eX0pWWnBccVt0RtZQVVxRXtzWVt1b1dhUVFHZV9VRVFVVVdjR1trfV9rFU9jHy9nE9crfxfTeVdXS19VcXUlBQ3REckJbXndBVkNHUtR308BF0cPbwApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYjljZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACis/Q0te5ebq/VxYYFpUavL+XVhbUFNcW2tv49zl2dra3OpdVFpgcHzVz+Xo5Ph758/ExMfR/l5NRlPr0MXBwMnjaVVLS2bazcjIyM3kbF5eXFFNaHZd69nX1XRYT0JFVn3MxczQ7khAPD1KWM/Aw8rL4VtLRVFaTVlpaextaunl+97e6eNq9fdPTVFLV3Dpz83Ryc99ZU1VZFJe4Nvd9Gvsa1vgysK+ytxcPzk6P1nPwLm8y+VZRkFFX8/MysTM6mFNUU9GVuHNx8vJwM5oV05PW2Da0dvQ2m9XS0lbbO/OyMfN4ON3TVJ94nxeVl1WSExX89nj2MzqX2BjXFRNWFpPVUtKU1Ve/WBXcO7uZFfu311dX1dZaODOy83O2upVQUnqzsfAv8XTaE1GSu7MwLy+wMPPa09MT1Jc2cvMwLy/xupVTkpKSk/m0up0X0xKTl7n39jX92JXSENNYt3N0dznbFNGRGHWzcvP72NKQUVGTGjfzM13Y11UUlJMV23q5Gxm6fhdVklQ9NjOx8vWcFFRSENW1sW9xc/aZkxCP0zuzLy7vr/C0/5WVWBm6djW393m2NfuaeXhc1FOcPLu3t597nJ5/HT+3d3d/1hkZ3jZz99vV1xUR0t+zMTL5PtdSD9CR1BZ4c7dcWNgWE9HSUxPUE5KS0pSX0xKUvLb5/7Y2fRfUUtLS2TLwby6urzJYFNe7sW8uLW4vsX8T1Jb2szb1tLw5+ni13JbbldKS05q5mJVXFlpel9salVYVElSZ9/Iz9fRcVNSSE1UXs3ByMvYbVo/OT9M6snKzt9XSkM/SGH31dVxXlVNUU9HS0hT6+3jy8zL3E9NUWHSzM3G0ep9VFFd+czCwL7GysnP6Wx15tjZ4OPX09Xq9N/e3uFmT0tKVWbq1NDKwcvlbGjte19YU17yamXu3d16T0Y/RV/t0M3hXkxBPDg+Vfjp7l9YXlFMR01aZXXe09LP1XNYUE1i38zJzNHO4P7zW3XW2N7k2cjR829PR0xW38XFw8nWbkxJZ9zOys/zZWdsfeTIvb7L22hbVExSeuXOxr+8x9LVdU5JR13f1c/mXFVHQEA9Rln48Hls+1JCPz4+P0li3+HtbnFMREJT59nRztxjWlBUVGrSy9vd4dLL0szM1/tmZ+X+3snFyNxkYGZd9/jj4Ojv7nF+8e9uW1tgbm1vfmxidOnPzt/c32ZTSl3Nxb67vsPL187R18zLyszQycLIzulQQD1GaN3OxMLWSzs2OTw/S1VPTEM9OjY6Q0lXev32ZFJJPjxBTXDi2dHS2V1MTVZm7+Lc+llaXG3j49nLztbl7ul5WFJKTX3Uzc7Oy811XFxy2Mi+vMPgYlVQU/zNvb3Ex8zMx8rZ4f7WzMnAvL7DzuDY4ujm53JqVnDh7u5oV1NOR0ZETl5bVU9DPkBIV2x+Yk5BPzw9R11hU0pMbefc3/16d1Rj+uzf3d5sUF7k9+jY19PQ1dloYfbVys3a28/gXlhu+nrnzsnIxs1lSUVGZs2/urm6vtLc42PzzMXAxsjE2XRyc9/YdXTl3ujm4O1LQEZMUldnV09HQkBDRVJkZFlMUltKQExOVVVcdFxRZXFiWklMX+Dp5uPcZFJZbtTFvsjfa3dx7ezh3N/g6tzPzuHc8FNFSF3r3cvExcjeX1JWVFxo5uXczMjMzczX8NvHw8C9vMLTbVxt3tnp6eDoc+rmdl1nWU1MTE9PUlFJQ0dMUFVOTltTQjg3P0VPdNjQ1O5lW11s59fN1vDa33VoZWP42s3L3/PpXUxEQU5sbenOzdVmT1NGQVJpfeLs2sfJy856+uXmxL28trjBzuHcys3LwczP0/nj3/vs1d3uWU5ma11wXlljU1ZjVU9QQz8+PlJiWW5eTk9OWm5VSk1KUFxd2c7gdmNeavjYz9Tb5GlhWEtd69jP1eX0ZFv3+WJw7nz7e+XY1nVPS1dXX9jT0MvIxcnrYlZVXXvczczN09zX49/N0ubQzdDb3/h7+u/Vz8rO3PJoT01WbO1+9+lpXHBXUV95et3xaWRbY1BISEZGatbNz+TxdE1JWFf20d3g3ldHSkxKTU1RVFzxflNEP0BLX9PJ3f/7V19ZREp0fuLV5Oji0MO/x87i6NXNx8fPz8nOxsTLyMfd39b2X2/nz83a1tzQ1fft4V753enYaUlPVEhQUktKXGzo8F5cXWFVUlJQP0lZV1pcUufqTF9XSlVqbNDYc1dPUE1Z39LRxdN0TEBBVWvdytLm59zd0OxZWPN8ftbO1eX2ZGtcVmHV1djeZ11u8NXIzc3Kx9Pc3Wpa59/h0dbSx8jZbE9PW97Fvb3LZFRSTV92Zt7P6ersUUpNUVxgWVVSW2BaYFNIVF1Sa2pg2vhQVUg/TWN89GhgX2PueGzfalt4ZFloVVFiXmD4X1Tq3dfP3mJpcN7Q0M74Zun858bJwr3I091t5MvMx9D3Ymvo0cvEx9TU/01ITU5n6dnPzNnn3e3kfVtVZOrNzNhiUFhWWPrseNffdFxNSlZdXVRPWFtfUUhFPzg6PT9ITU9TUUdFRUdMcdDLzd1dT09Q+tfb38rIztDV08rIxb7Dy8/Kyc7W083HwMO+vcXHyN3w5ubWzczNzuJgVFhWT09TXW7s29RxS0tUWnbs7djP2fZzWVVt2+BhVU1LTU5OVk1NU05LTk1SVUhERktEQElOSUhGPj5ESVBTS1Xw0MjJ2Ojn5dTMzdPLwcLIycnHwL6+v8HHxMDDys/QzcvJxsLHz9HlX1NSTU1UV2VmUklJUFFRXWbu287N3lJESU1QWWR739rf52tQVV9lYWb1c2ZjXlhSUVvs3+jpaVVMQ0JFQT1ASElGQT47Oz5ASUtMVm3/c2ZcX/fTxsHExb+6u7q4uLa2tbW0t7m5u8DHy8vIx8nO3VtLS1Zd7N7v+PtwZFJHSExQVVte++HY2ON0U1V67P7td2d88uzb7WJeVVFPT0xMSkpJR0ZGTm1tZmdSS0pISlJIREZCQkE+P0FES1JVVmBy4e7s7Gz33tXPzNXTycvOzMzEwr+7uLm8vcLAwL+9vru6vL7M6fzn5uHZ3NXX0c/uWlNWbt/V18/T3998eF9VXW1fWlxSTk1MS0VBQ0RLTEhEPjo5PkJHSkxOSkRBPj1BUF9yd2dq9+/+amJle9TMzdjk5N7m4NTT1tTV293q9e7Z3NjS0tLRysnN2N7d2dLKx8fGwb++wtDPycXKzc3NzcjBw8vV08vKzMvT1dve4H1TRUA+PkBFQz8+P0A+OTo+QUI/Pjs7PUNSXldgcnv6bVVOTFNr+u1wbvZ4dWtXVl/uz8vY5NvSzszJy8/QzsTAx9Dm7vdz9Pvq183L0HtaZWjdysjFys/O2vNlZOnZ1c3JzdHV0tDZ19bOxMPAxtDU3NzibFpNS05PUVVLSFJOVlVMUEtEQT08ODY5PD9FQ0ZJRUVGQ0ZJWfvs4GNaZldo7WZs8uTNy9PW2tXY2dLrdNzQycbO1NTW0MrIy9DMz87L1trS187DxMTCwL7F1WZObuHWxczd3fV65Hv20szHxsfJ29znaWpXTFJXVl9bST89QktaVEdIQjw+PDxARU9PTUlBREpHSUpBRVBSZGJTU0xMTE5SVHjVzMjN6Xrq3tHMzNDe1tXY0uvm1c7BvsfR19vc29nc1snGx8HO3tDOztPa3N3X3OHZ3ufTzc3L09jOzMXAx9dtd35p9nJWV1RPWlpQUVlkWEk/Ojw8Oz88Nzg6PUNHSUlKTEZHSkZX4+Ld6nf293T4/F5cdt7RztlsXVtWbufc3t/a6nhrZPzTysTH0s/Ly8bK0MvKxsXBwMjKys7X3+Xh0s7KzdngYGj22tDb0M7PytP3aHHo7PVsXUpIRUROSkpPU2VbS0lHSElJSElKTU9QXFBMVVtvbF5WTFhcVFdZVU5LTl1ZVVldfPdeUUxd7ObV2flpcOzRy9Da29LU4N3ZzsbJyszS0NLMwLy+ycfIy8zO086+vry7vcDMysnLzd3a2uDlWUhGUlFSWktFPDw9QEk/P0dMV0pPT1tmT0xBQkZMW2nmW1VXSVJNUFhs3ejsYVBHSF752O9q/FhmWE5SVnR13N9gV1NobuTf3M3PycnMx83Gx8fFy8rMysbAxMjFy8jKz8rTz87OzeJybNvHw8TJ0H1RUFJtZGJ7bV1COjc8S1JgYFZWTkxJTFBOUlZjWkxLTXJlW15RVk9PUmNwX/Hj2uVfV0/43drfaGlRTElNZFxnbu/jaFZO+tvc0+befF198s7P1s/Pzd7h69HHx8PLycnX2d3KxcfGyMTM2unZxcC+x8zUevl47en58nDwak5FQEVITUlMW1FPTFhiV1JMVlpMRUFGTlpPS05HR0pSZ3fh+21qVFFObNbNz3djVUlJUX7x9WZi+FtUTlrf29Tb4N3r6OLRzcrHy8nMzNDYycfCwsjIzcvMxcLKys7O1uRuYtXP0c/q+GJpaXDZ4uXldVlTTEBJVV/hdFpRTk9V7/1lZFRLSEhBS2NaX1ZGQD9BQlRhXWpbVFVYT1ve2dTYdF1dYFNdYlVv7O7x/VVNWV7bx8rN1OF06Nfl2tPX09Hdc9TKxr/Gz87Ky8a/xsXEztfb2OPPydHM3VhQUE9Z3dna0/NlX1ZISVlX7+JhYFhMRlBaVf71a25uV0xSTlhlTkxLSUZGSkdPYVxaVk5HWnD22XNjWE9LSmBbX2JTUU5OR1Bt4sjK09nX0tLDwsXEzdLe3/3vz8vFyMW/v77Ev7/Gw8fIztTmcd/YztDoaFRTTVRyeeb1fV9QSUFNX+LV2+NnX1NUY2JfYF1dV1dOUGJy/WFfVlRMREdISEhMTlVWTE1l9eX1ZFRIRkZPXVZVZmpfW1tb4czHwcfR4eB9+NbOz8/T4PNgT2Hd2s7Ev8XFycvFycvHwMLHxtTaztDS6F9JSk5MYPJ0Zu3c5+ZcWOnw8P7oYFJbUWN9/Ovi2V9XUEhTVGV7+WBJTENDSElNTWRhW1JGTVz+4uDmWl9YWmhWT0xXXU9NRk5bYOnj0+Xh2d3Ozs7MzcvX4m5k7OjPz8vMzsrOxsPDxsO/wcrU5dzg195tV0RLSlFabO/n2dPZ/Wzy08rM18/vZU9PWmVvW3VnT0RCQUdUaWF0WE1MTE5QaFZl9PpaT0tNYPhcYmhVWVluXHFbYO5wV01TV2zW2+blZV9f7/HMxM7N3ftfXnTgx8TMy9txY93RzsXMw8PM3OPX08bBzdN7VExRXVff3dveeFxW/uzXx87Y61JISF1v4drd325UTFtebOPn/15LR0lXWmPx9ntWRz4/QU149GxXSkVIXPDi3d/sXEpASlv20tXU6lJEQ1bkzcPExNLyYHHw5si/v8jX+mjn0si+vru7wtLn39vLyMzXaU1FSlhn4dre5FtQUF/62sjI1XdTTEtZ69naX09GQ0FDTmTWzulZSD89QlVn6fr3bE9GPkhZ6c/dblZSVVLr0MXG0Nrn6mVu5tnO2W1WTkxIX9rV1t3f7PL36NfOx8bWalhiYmzY0MrN1dLS2evdycjL7VRPTlFW3MrL1Ofk73zu5tDTz9RjVE9XXOrW3OxcXl9bXFnn193uTkpFREZNYWVgXFlSSkhOXF5VYlNLR0tceerl6HFgYG748+fp8u5eUU1PXOvP0uB2a3Ruc9nIxMbHzeFjX+TUycrJytTb2NXPycXI0N35X05TV+nT3eHs3Nrd2M/M1ubf5mFNVllnak1PTlBRUGFk9eNvYFVNRk1RVO9kU01LUUxXZurXZlpjWEtLX3LX2vr5YW3uz8rSy9bqaE9LS1lZe+FjWFJebv7Z1MXK4O9tYmDw3tbN1N/4+OXUzM7Ly9bf8fB86N7Vyc3hYm7i1tDNx8fS62tsW2Hu3NLiaE9JTFjr1srL12dHQUFGVFdiXU5CPURPYPTx8WZPS05aU19w8vBeT0dNaO7X2eHc5mlbY2D26W52X1ZLT/rbysXFx9Hr+NvU0MbFw8real7t2sjCyMvQ4WxgZWTp4ODrYlBKVffQyc3P235fXfz9393x+VVKSE1m59HV3fheWVJbZGtzWlZNRUFDTmTjfWVlYGtt6eDo5O7pZ09OUGfs0svM0OH/ZmRt9uR4ZVRIRENN/c7KzNXsZ1td9d/b3tfhW05OZPLVy8vL0tfNz83KyMrO1N7k6OHUy87kfv5lZ/fdzc3a7vVaTE1Ra9/X2dnoWVdfVVxiYVNNRDs8P0NU/mJYXVRPVlNv3ut9eWlPTVlf9Nff9/BbT23u4NLL1PZpT1BZVvrR0N7g3dzNzMzFw83b2fldcXbw08/b2dTh2s/SzczQ3/RmV2FdWe7Y+lxZVFp+6NTJze13Yk1IS1Xw2OTc2Olv9fVu+/xaU0g/P0FCQ1ZcUlldbOTa0svL19ze4uT1/vvg6mNlYFpo5eHs621cUE1NT09NXvd4Z2Ru5efu3M7P3/5wX1ZSVnzW19zPzM7Ny8XFys/W1M/T2d/g2d9uX2l67efb29zuYvvg63Fu8PB0Y2rl7fDj2N51Xk9MSUVFQ0RDTldLTlVceenu7OJwW2RkXU9RXWZtWl5wZWnu6HrwdFVcc3zp6OnZ09jd0M3KycnExsvZ5tj2WFhdcOtvZubg49DOzs/d29nX3uztb15WVVRYYVx66u/e2u9q7/hqc3Pz7Hnh5vxu997j8GJcV09LR0xRTVVfZWFaX+7yY23x7enh3uD9al1XVlVm+fDk5+97+lxWYmJcWl1eWWLt5N/l2tLQy83V8eniXlhXbuvs9P7e29bQ0c3S09jRy9Xb1tPlbG1z+PNnfnn58GJiWnvm+err6H7p4Hre6urm7+1fV09QT0ZJTE5OTVBMTlRWZWdv9+7ubufpb3NeVk9RUFZzaPnw3tx5aGB6397d2NXT1dfi1s3Oy8zP19zi/Pl99+jp3/3+fmx1a2Jo7eDj6PXg3HBlXllfXF5ZVFtiY3Dm7d/f49DN1Njb4On1cOrW1OLufV1OSUtNWVtaYF9XWV5cXG1x8fB59nJ769/g+HFrb2hZU1BnYF9lXWFeYGdtcWhzZWNudPHg1djV1N7g7XL+4dbZ4Xx94d7m39LNy8nP1tLW0szO2+jucl5YVmFyaWr0dW7y9PPs3d7f6Ghec/jz6npqempZVk9LT1ZTUFNST1JSTUxNVWhiWFx+7vDc29/rb2BhY2Rtc3FnX15u6uvx4tXW2tvk2c7Jx8vOztDgemhlbPrscV5ZYnR97efd19XX3+zq7/Hv5dvd53ljVVddVlpcZ2Rgdu3q5trQ0tzv59zT1N/pfXJaVlRTWmFnX1hTUVJVXGRkfu70cFlYavjm6d7W7V5aX2JfY21yWVZWU09MTllweerf39zZ1t/n3+Hh5vp76ODp5ubr+XFp5uf03tLP1c/O0M/LyMrK0+N6V1pfZWL28XX2a2ptd+7n2Nbg7e3l3ONs6N5pW2FXS0lHS0xLT09VWFpbWlteVlJcWVJg8ujb1Nv8YFthbWx54+Pm9WtbVVdgd+jc2tXS19PR1M7N0tTT3+t9e35qY15YWm3w6u/t73Bmcu7s5NfT1dTd6ntoa2h1ffHx6PRgW1le+t/RycvP0tTY3O7q4OHqcV1RS0hLTE9RVVZgW1hjXFxhaWx5793V3OtuYlpQUl9ycvxtYWtXVFZQTlr33tnj4uHl5t/h3dbU0+9eZVxq7ujd1tXd4u77aW175d/d09LP1dfO1Nnh+XV+6u3p7378dmNibHTk3dvm9fF75tvf8uje32xXUE1IREhMTU5VWVRUUVJhZHV+6tzief7weufwcGVfdvZ6aPnsb2dZZG3w1NDR0d3u2+X24d3Vz9Pf5XdpbWJsdPPubWFpYVlmYm7g6OTe42xtdfXd9Hz44uf77e739eX5a/x869rX1tXi29DU0tfW1tzmYExMUk9SX2xvXlVPVVNYYmNqbPp+Yl9ZWm72dmheWmVjX2Jma3vzc19gd3Bj8Oh69eDX1Nzg2N/l5+vy6u3z4+HY4mP6b3bu8OXq6vvi+XP4deLY1Njf/fflfOHtfOXq7fT/a+rm3drh3d/e6O52/u5dYFhVU05NTVNNU01HSEhPWF1l+fbs3enc4enX0d/8Z1tyaGl2dWxvbl1bV1xv+N7e2M/N0c/O2tPW4O53aXNuXXTr7/5hWlZadOp97u915eTx+Pv4399rXlladu3w6NjNzd3o82/x6+DY1tbQ1d/c3+vl8WJeXVhWT1BYWlpaU1BSWmVaUlhfYGhkZHHq4tjgY1pRU1xfZXnm4/VrYGBm9Ov06d/n8PPv3d3n1s/U2Nrj9XNv59nd5HB33Obr8Gdr+fro7vfZ0eDl/F9ja37r7eLW3+7sXVRhW2fq3M/Q6uzl693c6OT1cX1XTVFLS1NLSUtLUVxVWFFNYfTu4t/YzdTc1fJlbFxi8vfk3HFgX1picHzp4tzV5+vZ29PM1+DV1tfaZ1hcW2jy9m5qeP9tZWpbYmpZXerc1M/scmxYWGNu+tvV2+bo4eTc5e7n087P1HdtdHTq3N3x4PdbXFxYW2peWU9VXl1ZU1BPU1NbYWN3dGhze2f372Jha+LR2PVjV09ZW2zl59jS6HT579jR0M7Py8nN3ub9cfP04OB0bHhZV3Z6fvhoXWbi1NXl5+h7ZWJ86ujb0u997Wt5+mtf59ra2ex+bmdr8Nzd8mxkT0xVU1pcVFZcUk5RT01QWFVcX2xv7eHz6d7b3u1vb+Hg3dnvYmFcVWJ66N7c2+ju6eDe1tTOx8rPzdj98nVlaWptdWRTVVpga2liXV546fXe3Pjl8HBlXmvi3vLc2uTp6eHd1cvK1dbdaWJfZWty/PpfTlRUUFhqd2v95e1ZVlpNTlFUUFJXXl1YY2VdYnh4cPDb09vY2+t+amZebHTj5X306v5s7NnVzsnK0trk7OXd3NrZ3dvtZF1qYlx5fGJfcvD17u7o/m13dmFfe+15fuXr7N/c3dra6vRyWltaZvzn5tzU4W5aXVtYZHp2cW1fXE1FSUxNUVlZXFphbW1+7ebl3eHf3Obe9WxrX1hc9+3h39zjcXfq4urUzc7S29Dc+/Xh4ujY3N319m1eaG7//N/i/GpjblxYXWhhYvDi629++XJ65dre39PM1Nra6W1dZnF75NTc9v9fVFJfZ2H+5vZaWV5QSUlUU05cfmtVVFRYWl1eXW/39fx7eWhfZf5zZejV3efj5Oju497e283JzdHS0N3l2NbYzc3Y2ez7/njz/3344/ZmW09PTVJoZWze1NrmefHk/vHm4+DY19bkYV9ZVltZX/Do/nBq/v5qc21ee+Xu7m1YVE1HTU5XZ2ZlXldUWmhvXmPc2dza6XB+YGJ+aHjr6e347uDf29zq4dfTzM7a39vm39vh1s/W5u3p/Gh1alZaeubjdF5ZT0pTWFvx2dnj8PX8693peuHOzNPW1+NvZvpsZv7t5X5w5eb1cFlTVWd6dWdiWlNNSUdKUlldVFFhW1hcWFVd39jb6u1qWlVaXVz52dj169HX2uXn8evZ49jW1dTT1d3p7c/JzdTWys3R4XNnY+fx/WtbWE5FRkhNZ+HZ2drV2+Dv/Hnhz9Xe3tvtblVTUlBufmZk/9vg7HJiVVloZGhgWV1hT0RCRlFWU150eWlpZWFj8NjV0NPe729ZUFRo3dre3dvV2t1zZXfr19vXzs3O0956aWjg19rT1s3N0OB1a2f9aWv7bFtVTEdLT27569PY2evybmlq6M/a2NPU2ehtWV5YZPtx7e/f3+xrXVhWZF1ga1ZWVU5LTExZZFlgZVtSUE9XWWjd4NTP5GdYVE5OT/fZ5dvX09fb7HR0ftvXzsjLy83X6/h828/NyMrOz8/Z/nPs2+fp8GJXTklITExdeHrm6OLe3N3l493Q0djle+1lU0xISlVfZvDt3N3k/F1jZHz28f5gXU5KRUFJWl9kbVtbWVxaW+/cz9PU197tcF1QUVJnc+nh9d3V2ndo/+/c18zIycjL2m5fX37i2M/T0tLc53zw2dPf6edlXVhNSkxSYHdudmdv6erw79rQ1uDj3u3d3HZfW1xjcn7g29rZ6XBaXW5veXd1Zl1NQkJFSllsbXRjWFZTTlNt5ePo7ev0dWRdXl5t+vxxe/1xePNpX2drd+rWysTDw8nW4N3d2M7JyMnM0eb95OTn6nZwZVpVT05TW1tna19hbHXq6+DQztbc6/V+a2x6XltYVWNmeOXf5d38XWVdV15baG9dVE1IS05PZXx18HlqcFhZ+/R+6PRvbWNpaVxpfmv36/zs9/Pe+WV3amzj39PHxcTHz9bh89/W1c3M0Nh6cOpxd/JtaXRnYV1YYWZeY2VbWmB93trSzNHU19/o73p4eF1fW1hnbP7j19vm8f10WFdmde73c1tLR0lKSFBbW1pdX1xYW2Jta2htYl1kbGt75HNu/mtoa3v4+PF4a11ffN7NyL/CycrO5d3Vz8fFxcXL2eXueWln7+z27HRjZV9WbXBdYVhUZW/7393j6erf5+nf/WxyXk9YV1x+du3Z6mlmWFRZW3r26nBRTk1HSFRTXGdlb/90cfl1cuvvfvrv9fnq7vp6cWFtbmd28vtydF9aZvLn0cnJxs3P3Ofc1MrMyMfO2/DyX21qZmdn7Hp9b/nubnhyZlFPWlpr6N/d4ebz7OLe1Nfd4nhlXm97cObh6mFUUE9RUmZw7N3gZ1FZU09RWmFTV15aWFRZaGVjaVtTXl1RXvh5bGlza2395+Lm7XFuXGL4edPBwsbLzM/Mzs7GxMTHyc/f4O9wcGtfYfx9en145d3yc21eWGBdVWztfF5fXlx75+jz9etmXVlj/Gvi2eduW1tPVllXbOfiYVZWUU9NUVlgZ2JnYvDu+OPt53RmbWdrW19zemJWXGJm9e3l5un2YGRu8N7Sx8nMzNLa5dnX0s7Mzt/e5ej2fPZ57OfwbWHv7f/r7u11X1VRWWBp7+ns9vbs3djb19zffWFYVu7g7efm3HthVlZyZnP07GZUUk1PT0xQWFxXV1ZZZ2RgYGr/cmRUVWddVVleVk1YW2t07djm72VnZO7OzMrIxMTJyszJyMPFzc3Q2+7q5+zw4N3j3uHv4Nrj5v/181dNTVZaU1VVVlhfaPrh4trmaG1gUlVx6fpy+HdfXFlbcPf99l9cWElMV1pWV2JdWlllbvLe6uTt6/JhX15iZWJzXVhYWGh15+PwdGJeUVj94dHPy8fHx8nFx8bGy87i72lja1tr8/z47d/27NvV1dvc5/JuX19ZWFtVVlFXWGrp2s/R2efq/V5faGv9dnN5e2ldYPTwbGxjWVNRVVhWW1RPV1pYV2Lu8GZ0fV9kY15bV1dWU1VVVFVg+t7f8+1qYmVjeeHU1NHLxsXFw8K/wsnH0unc3Oj98e967t/Z2tvQzs7a4fBib2ZVUFVQSUtITVdc8d/Z4OzmZV5cWFxeaWBw8PXp9nLt5v1jaFVQW1BVVlFLTFdUXW3u3tnc8ebueOP5eHtbUE9RTVBdeOPj3/tsX1BZZGPx3d/Yz87NxsPDxMPIzNHi3uHy6v1cW/X6fN7Tz8/Kz9jZ8v31Z2BdTUVLR0NQZeLY0dHd1Ox48Pjs6O9bbvlcYn7t8+rqZmxcUFVWVVRNR0pTSUlfd3vm3P7+9nFma29eWExIS0hIUmpyeeB2aGVdXnPk2M3OzcjHx8fBv8C+v8jLzNHY09rn7Wrv7nzn1szMx8vU2uV2Wl1fTUlDQEBBR1Fx9ujZ6en9aW5u+ndwXVdbUldecu7x2eliZ1hVW1xSTlBJTEpKVmH76dXa4dvi8fx1YldfTUZMS1Fgem3o3XDzeV703t7bz9XdzcvKxsHBwb7Izszc593meefvXGBlXvfRy8rGydDT52h1ZVBRUURASEpOZG9w5N3i5Ob93dbu5t9wWl9hZPDi5+PsXlZYT09VTUlOS0JER0lYe3vk3eX6e3RnZlxVWE9DQkpKT19s+OLo/OTq4dHP0tLLz8/Hxr+8u72+wsvMztHOztri3vdfZWr40s7Qzc7f6n1meHFeT0lHQUBCRU5VV2B9bGXq79/V4nN9+2BbYXPm3uDwdlhNUE9PYGJQT09IRk1QauTd3d7maWd0cOrf/lZRT0lJSk1aZWzz6P7v397Tzc/b2M/Rz8vGwb6/yszQ3tvX19HW7HN6Z1dm4dPPzs/U3Ol5+OTd225TUU1GRkpNWW198urp893R0dvd5Pzqd2n79OjkZVlTVE1MTU9STktHRkZCTGFs7f5xa2ZeW2H953xdU01MQkdIS1xpZ3Hk6v7e09LOz8vIx8jFwL67u8LFx8vR09DY2tnf5uj799jSz8rU3uLxaWBr+XtmUUpDQT8/REpn9GHr4ut75Nrm3Ojtd2FeWF/+6ulhXWVeUlBTUlRUTUlJTVBWdOfe8fD6amxt6Nve5mtTTElFSE5f9Op6eu7o4OHUz9HLz9rc187PxcDCx8vM1t3q3tvp3/Nm8+jd2MrHy83b73Zx/njq+WZURkZDQ0tc6uLa7HDe4Ozf0NHf5mVaWlZ07d7kfmlSVkxGTFVRRUZBPUZHTGft8vLyVVJfZerZ23pYT0RDRUle7Pdt7l1a3dvXysXGyc7c3tDKwLu8vb/L3NXP3M/J0fVpZGbd0MzCwsbL6ltaZmZ83/5RRT89PkRMcONzaVZNXOPZ1NDR319NS01SeePW53xqSkpNU1llb09EPj1GUPLV0M/T31hQYOfS0tb0WExDREdU9+fnY1lOS2feycbJxs/mZW3cyr++v8bN3F9w3c/K0Nl0VVJd6tG/vr/DzN1fVn3i1troX0xFQklOftbY5GBcWl3r2cvL2fBZTkxMWu/b1N1iV1FITFdibk9COzk9Qklg2dHYblleU1Lv2dflc1NHR0hKXeDn/FdJUl9r5c/FxsvY5dfOzMa7vb7Az9TU1NPIw83daFJd39XUwL2+xd7z6eTx39byY1REPkFKS2DwYV5MSVNgfPDU1+lmTUpRa2Pt4Hn0XU1NVWJ28mZPST8+RFRk/tPU1e5RV3R459TX9XRVSUhPZvXccGBXRktaeePPzdjY/mX92c3LwcPKzNnj39jRx8TlZ1xVXXHQyb+/ysvV3t/U0tLN6WBTTktHW//e12NcWlZWYNzXzNZ1YlhXUPnf9+JvWlNRT1N0aHdWRD87Pj5HWl/x/mBbXF5r2+Dk3P9SREtPTnHu5fBZTUtUXuTa0cnQ3XXf0s/DwsC/wM/cz9HJxsbEz+tZXffnzsbBxs3f6tndzsza2edZRD9GSFNmcWFSSj9ESlXg39fgYFFNWFf42Obodl9LSVBW4+5iX1BHPUBGUebh5uj5ZWLt8M7K39jyXUlKVFrf4f71b1FDTVnvzdLM0uR4dtzYysPEx87WdHrd2cbIyM3pZlVh9dTEwsfO0NbczsrDwsnaXVVJRlNl6e1iUk1IRE1d6dbZ32pfW1Rq5t7Y5FdRUUZLW2vybF1LQ0A+RE5XWllPT1FOXf/w3dvhYllWTE9jcHd6YE9MSk9q687Lzc/Qz9TNxsPDwsjTztbi1M/Jx8TL3uJ59tnMzMrJ0c7U08bEw8bO3V5XTUdMV1NOTUQ/QEFLWGjr7fBsXl5ded7ee21nUVNXV3rl3udqUkRGSElaZFxbYVZVcfLc0dDY7XZdXFxSZmxfWVNJRU1TYN3U09rY19vPzcrFytTY3/nq5+7Wz87U3ef03uDaz9LU0NbYz8rHxcHFztXna15XUVpZU01KSEpOV2F+7+7qeWVqef/u4/x6fWljXl9eaG5dUElDQkVGSVJSUVhUVWB4+vjn6XViV1NUUFRbWFVSUU9VXHLq18/R0dXMysjFxsTIyMjP1dXS1dXT3uXe3NrX0tHNzs7Pz83Mx8PIy8/c4m5eWVVPTEtDQ0JARUdNTk9ZXVxicHbv9nF9+vz5emt0Z1tTWFNNTk5OTk1RXWBcXmZq+Ovp8ezoa2peWFpdWlJaV05UU1dve+Xb1N7j1tHLycrMycrQztHW0Nzo/v16a+js5NXa187IzM7JysXExcnKytvocl5oYFBQV1BMTk5TW1ppbX5tXGpv+urr4d/e9WxtZmxhVEtJSkVIR0lQT09PWFRPVWBibmVjeXBeWl5aY15TWVNTTktVXW/p3drR0M7LxsO/wMLBx83P1NbW1uhweXrs6+LX0s/SztTV0tPLx8TKz8zb73pkW1FPR0RBQEZHSlFaYlhZXFxqZGv37H7r2e7xdWnu9XBcUVFKSkxOUldkY2NYYf5y6evf5W1pXFdgX2tjXVdSUk9VU2rq5+j1ffzj0szHysfDxsrPz9vc4f52cl1cXW7p29DNysvNz87OysnIxcjP1drY2dnba1lTS0dHTVFUXWxvdGxw6tvX3+3wbmBeWlRUWFZRU1VOSUhKSElIS0hKSUhMVl9Yb9/qa21gW1VYVVNMTlJNUFrp5NjS09fV0svEwMPBwMjJzsrLztfb4v75fvD66d7Y1dXZ0M/PzcfIzcnLzc/X3N9tV1ZQSUpLSUpQWFhjYGJkZGtmavT48nBsaF1fXl1cXVBMUU9OVVdWWlxaWlVVWVtlav/o6evn7+hsWlRUUExPVFlae+zd293c19DM0NHN0NDS0tzh4uL969/s/Ovq5+5q6eXe29ne19HOx8HCyMjMzdLT4XpdV1ZTVVxrXmh+9WVpX2d67XFy8Pn8eXFgWVFZVlZMS0pITE1LSEpISk5NTFNUVltwdXZzb2deXlhWU1JYXl5+5ebe0c/b2tjX0MvJx8TExsXHyc/W2uJ8bXJtfenc3tvT0tfT1dnQz87Lys7W09LW3er6X1VUV1tZXVZTVVtYVFpfV1/zd3v4dGVlWlFMTVFQUE9PVE5OVVNVWVdUXF5daPp2a3RmXmZgXFxbXV9ZXHFycfz8fuDg7ODZ2t/SzczKyszL0Njc2+Lw7mReZGZl9+7l2NPY08/Pzs3My8vQ0tXS19jc5uXude3e9Pb7cWZnW1xdV1poee3d4u32+ltVUEpERkVBSExNTE9NUFZRUVlWVVRPWVZUV2ZgWFlhWlxpbvTr62558/Ln3N7d28/IysjExMfJyczT1dnd5Ojp5ebvdXvn6NvW1M/Ozc7T19bY2+Hd3+nn5eh5dHP+dmxaYWxYWFpfWlxeXF5kcu7n/ntkYFxWUExKSkxOUExOUlRYXl9tfG9ndm9eZGNja2ZYWFZUWm/h5ezxenHzeHh6fuvc0NPQ0c3Q09bX3Ojk5fVfanj4bmZeb+7i083IyszOy87a2tnh2tHP0tXZ2djX1eDqbnH87nNlZPf3aXNtbGV3eHtsYlZZWE9LSUhFRkdGR01LTlBTWV5ZVlxdU05UVVtZV1VWVmlv6u3n3/vt5uz06eTUzs3QzMnKzcrLz9LZ0M/U4OPg6P5tXGFp+9vU0M/JzM7M0d7j7fPs7PXv593X3t3f72NeZl9bWlVdZ19XXG1gaml4al9fYF5SUFFQS0lJSkpTVWj9ZnTr6mFhY1xWWVlcWVRbbHPz7O/1bnj582lkbuby3dvd3d3TzsvX1NjY3t3e3ub1cHhrWGhmfe/d1M3LzMzL1d7W09XU2d7c28/Oy9PU1N/m5mtfamJy9fdXX2xkbOl9Y2BeX11YSUtOTEtKRENBRkxWWFVhXVlbWEtOTk9NUU1KT1xj/+f+8XT/dOX/d+7d19DT2dDPz8vCyc3LyczN0d3d3Of48GJbY+zb1tLNzM/d29n18OHe6t/a39zU39PR7v3+bF9fX1taZWBzaldcb2p97nNmYmVVXVhNTlVOTE9NS0xPUGZybHJkWFhaVlpZVVVeV1hhY2H77XV7b2lr+G958ezw2tfb0s/T0szNz9Hb59ze6+rvZ19hYWf8ce7Yz9LQ0eDa2dnX0tva09LSztXY0M/P09Ph5erp9Oh5Y21pY3rme/Tw7GloW1JOSklJSUNDRktLT05VXFxWXFZKTE5OSk5NTlBSUWRhXWXueWbz7vF5fPPZ29rUysvIxMLCw8TKxs7Y3Njp8e7ubG9uatzn4N3acXDx7vfu8+zU5OTb1ejc19ne3ebs2vL6+HJidWtkYG5dct176fZiVFtdVVJRSk9UTFFUUE9dZnH+b1ZcYFdZWFRSVlZVVltPXW1y/G1mY2/39/H7eN7e49rT1dfNysrK0djW2unxeGZfYmlia2/u39vY1+dravPl7uDd1tLSz8zN1tbOz9PQzs7R1Nnd5uni3fV07Ort6uj4cFZLTE9JREhKSklLS1FPTFBaVlFUTk5QTEtVUlBVV01RXV5gaWx39Xfx7evv39nQz83Ry8XNzMnKzMjJy8vO4uPf83l2a2B+6eDf52t3dF9YXlVWavvh29/829jg7en53tjTz9He/drd39zmY3zr7evoZ2BsV1RVTENISVBUUk9ZXFtkbFdSXlxsZlpNVlhdb/1WVGJk8vtrbuVw9+xwWG3v6dnX2dTO1tLU2/bf2djY4HZsZFz69G5cdPzd1N3u7f57fW1eVV9t39XR2tLT0tPV2dbOz8rJzNLNzc7Qztjz9+72/fpraWJaTU1GQEBHS0xNTk9TUVJVTUpLUExPTktOVFFZbVtUVl5bc+Te3d3t6+Lv6drR0sjGysnL1NDN09bU3PL0fHJ89PPm8Xb36ejg2eHn819YXVRTXWNp7Nvh3ePn3tfb1Nbg39fX19HW2dDS4OX3cW3t9vdvWU9NR0dMTU9WXVheaWJfa2JdXVZLTFBPV2NfY3VoamRoXnPt6uTkfW75fvbp2+DV09TV1Nrh3N/q7vtdV1NZXHBqZ3lua+rf6d3Z3vT7XldeZGPv4ebc19Xaz8vLycvNzM7Sz83NzcjJzM7T3+Hi+/D7ZFBMRkFBREZKTE1OTE9SV1RVV1RNTEhISEpQWWVfXV1gXGv34OLc2+T17uvk3djNy8rMyszOzc3V2eD8Z2FaV2p6/u7rcHD+8e7p6fR8ZlhUUU9UX2Rpd3lrbfHd0dDQ0NHU19TQ0dLMycfKzNHZ2d3c4H1fU0tISExMTk9PUVZTV2NrZ2BjXVVSTk1NT1RaX2BgX15tfe7d4uHk7v166+Le2NPP0NHY3Njb5OxyXlpQTlNYV2BlZnB8cHjp5+bv7nNnXFhcanbu7uzi4N3cz8zLysvLyc3NzMrIysnHxMjLzdHc3/diVExFQkRGSUpLSExNTk5TWVtWUE9PS0ZLSktNUFBVW1115ujf1trc2dnj393Szc7PysfJy8vLztfh4n5kWl1eWllZV1hbXWv08ube8HdoZ1tSVl5lZmZsZWh19NrX19jX1NTUzs3LycvNzMvJyczMzdTofl5QTkxKTU5NS05QTlVbXWFiWVRSUFFQTlVZVFZZW11m/OPb2djV19zf29ja19fZ1dXTzdLd2t/4ZldPTk1NTlFPS0xOT09gevbo8/v6YlxpZGJ+6ubf39zY1dXSzMzNzcvPzcfEw8PJy8rNz87P1Nnc33hbUk1MTEpMTEhKS0tOV1hZWFFNTUxJTVFTWFxZUlpaW3Lp6tzX2tfY3dnR1NTU1dTNzczJys7V1+xpbWdcYV9ZWlhUUlRVWGRtYl1bWFlVT1FTVFdiYmJrc/Di397Y19rb1M/OzMrLzM3NyMnNzMjM0tvl6npeWlhQTE1RT01UYGVtZ2BdU05TUVBTWWJmXV1scHZ249jZ2tLQ1dDQz87W39rc397a19jZ3PFgW1ZUUU5OUExLS0lJTU5RWFVTVFNUVlRbX2dmYWd7dX3i3NPSz87P0M3LysrJx8XHysfIycjJzdrxb3NiVlRZWVBNS0tMTE5ZWVBUWVROUVNVWVdWWVlWXWtw/NjR0tDQz8nLzsjIyszMzs/QzcrIzdfZ2/Robl5bX1xbXE9PVlBPVFlVTktKSEpLT1lZTU9ZT0tLTldbV2VqZnTs3tze2M/Q0c/NzMnJxcfR1djq/Wdp7ux7cXRqaVxdaGps/3V3ZWFzfW9oYWBmW11haPrc1NLU2NbS2dXOysfMzcrN0M7T2d9+cfpeU1hZWl1WUVBOS0xOTlBfalpQTk5QVE9ZZ1lWZ2JZWF9y+vt1+OX/cufd2NrZ4ebd2NDLz9LP0t5zX1FPWF5rb1lca2ZcXW5xaGZgXmFcYHnwbW54XVRUUl/47NzOzM7Ly9DOyMXDxMbIxMLHxMbP0tTh6v1sfOPn8vtkVlFNS01SU1NaUUxOSkdNTUxQUE5MTUxOUU9OUVBSVlxkftnd2dvo4tvn4uPn6eXf7/hoY2x+bG9pbnF37+TW2t/o7W5wb3X+7urj235iXGFlcn3o3tTSz8zPzs7Kzc7Pzc3JysjK0dzs+VpcYXXx6vHg5/1kX2dXU1JVU1RRVVpdU112XltUU1lfXWdwa1hcXlJXWmN36u3t3uR25epmaWRmbWJVWV9YVF5YTU5NUVxpZHnkeWB9dGf/c3nk4e3k53dse2t+9fvg1s/OycbJy8jMzM3Tz8vM0czL09jb493e4dfT0dbV1d3f6XBvX1VZXFxZZWhoaV5WU05LTlFWWWNYVVRPTVFPTVRUXWdya/d1bWJjXVZcXGJrdm7z+3BfZltYZmR66fB48nttZHtlZHFv8uHzd/xwbGbuefbq69bLztHQ0NbZ1d/d29jOytPc29nf4tzo5+bo39fq+eLhcWxxbHv48uHU39/Y2Onq9vb8d3Xt3nNicHJmcGtgXV5h9OtqXWJdUE9NSUhJSlFWT09WVVFSUFJZXmLw8Gpga2ZfX1tWV1xfffp4eOzz7+35cfru5djX2tvY3t7e4ujc2tbQ0NTSz87Lys3T0tnV09bc2+rr5Ol0d+7z4OHi493h4u73YGx3bfxyZ3j4YGx4a1xpZG3w7ene62FiY2JQUU9RV1lVWVZMT1ZSTVZVZ3Zxbvh0Z3JrYFVcXF9daGT4dVpfbmdkdW72+/f17GhdX2llXF9hZXX3fd/i5tvX5ujj3dnW1NTP2t3f19bX0tDXz87Myc3P0c7P0dff6tzf39/o7OHc5enf5u3b4OLtcWpwa1xaYFJOUE5RU01KS0xLTVRMT1dZXFlPTlZaVldcUGJsbW9mXGdtZGZpZl19b+7m8HXzbmxvfndifW7j29/j2uPd3Nz2dPf/2t3o6dzi3N7j9ffw5tTX2dXR2dre3+jj8ejY4ePa293W19na2d/VztbY2eTn6PlwZ2tn8e1pY2ZbXWJbWFtWUFxWUFVXUVhYV1xfXFpqbGpqbGFoZ2JfW1ZXX1lZVVNSWFhZU1BVW15dZGNvam1ydWpjcfXs59/c2Nzb1dLW1c/NysfJztDZ19HW3tnV18/R1dbQ0s3N19zZ2eDb3tza3Ork6Xh+6/J48G5qcWNeevZpZV9UUlFNT1FOT1lWT1BSUVhdWV9rYGNvYVxmY15sbGZ7bltgcGVha2xndHR38Xtlb31gWVpXVl1cXWZeWmNtZm/86OTe5+Ph6e3j297d29jd1dPMycvKxsbJys3N0M7T0NXd3tzc4eLh3Ofj7uHm8Ofh6/368PlpcGzo63h7bGJcWlpYVmBea15TU1RVUlVSUFBTTlJMS09OUFNUUU9PVFdfXWNmY2RhZ2ZhYmlv7mtnbWv27ev3/HT77evz9+/p5O/p7Oni2NDOzs3Nzs3PzM3OzsnJy8zO0NDQ1c7R2tnS197oc2x1cGJyYVhbdnV5cGhmbGdheGxgZHJiXlxaXGljX2dfWGB4ePl9fXx9Zl9YU05YbmheWlxZXFRVVlNPXGBeV1JWVFJPTk1OS1dkZ11kZGVrbvfo4+XSzs7W1tXZ29bX1tLXz8vQ19LSzszMzc3O1c/P1t3Y1Njb2+3w7Pjd1tza19nc3+PzdnBu+/9pZGJlXFdTTExMTldWU1hYWFFOTkxPV2r4dGtsaGRcXWNfZ/nm6Ph5fW1sXl5cWFVZW1ZRT1JUVlBXWVhcd+/vff3r4uDo2Nje4dja19fTzMjKzcbJzNDO0tLV0s/O6Gz7Xlpl+/3q5+Te4XL15nz84djY3dbY0tV1eOny7Nze3t/h7tnnWVVTT1RmbGZZXFVfUUtSVk9TW1VaU1ZUbldTWWJbWVhVVVNXVWZPTU9QTVdcXlteZF5uYG55b19u7+v039bSztXTzs3T0MvIycHAxsbO1M7T1s3Nzc3O0tPR19zk6vTo6Pr25Ht0bFhdaWdq6e7v5ut79G1cXWVbXH1jXFtcVmNgX3n+YmjydXtyZlpeVVNYVExQXFNfZWdgaFxWXFZNUlRNUU9QUFlUVmVXVWFpZffv8XzufO/e7vTj3d/Q0tPZ1NvZ0uDazsvPy83P1tjd1tns4NTP1s/P0tna4dnY3NvU0dLMz87V2+vf4PT86vd29mNbVVNZXVZQT1ZSUV5YVE9PTlJRT09UVFpkXl1aW1llbV5nbVpkY1ZTTkxKTUxJSk5OXGZeW1pbWnV0aHTw8dXS2NrZ2uDP0NLRztLIxsvKys7UytHT1t7p2d3o+nNdW/L++O7o7Nff8+/mZ3bj593s4ODY2eDi3mt13fT9+mZh/mdXX1lLVVhYaVtdYGRoWGdbT15eYV1TW2Brd2n8YlhfXVxUSUtMS0xMT0hISEtQT1JdYGlobHtbXWL85Ozh2NTQzcnJzcnIxMTIyMnKycrM0d7f5tvZ19fZ3uHi6u1scnZ8bnV7Z2p36N3f4tvX3ebh62NcXVleWE9SXVRabWFeXFxbZ1xYU1RMUV5XUFlWW29dZ/1wWGtlWlRTTVNOR0RFRURUXVpXVk9ZWltZZFpZePHq5Onr2dnSzsnNy8PAwsjNz8zOztDN1c3Ly87bef3xfO/4+2v7+OzueWLy4dzU0tfi1dPN0Nrr6f976O1uaPHw3NjwYGlfbvpvXFpkZW1tVk5XVGL/bVZYYl1eWU1JRkJIS01ISk1KS0xBPz8/RUpISFNZWllkXmFr8dfKz9bMycrKxcnKyMK/vL6/vr7AwcPL0dbR083e5ePzX2rtfnn74+LX5OPk5X7t53Rocujd09rb2dvn3uPyZWdra3RibHhrYnj5cWtqZm5yaW9qY19fWVlZWVpka2pwZl9fXE9LSElKSUdFSUVAQ0dHTE9ZaH747Ovw8/F4+uHi3tLIx8C+vr+/wsTGy8zKztPN09/c1Nza5+7h3eDY1d7g6t9vad7t8c/VzsXGysTFzNDU0tvW5N7abFZmXVlcVV1pb2XyfFlOTkRCQUFISUpPYF5bWWRbW1ZSWFVPTVNPSkhNTFFQTV1bWGH7dWx9cWFoZnbl6ejTzM/NxsbIxMfFxcfKycjO0tbZ19Db0s7T2dXb+WRiV09OTVdYWmfk3uHe2OHd3+DU0NHX0M/Z3dzf1dnaz9Hb6N7taGJZTU1KR0pKSk1STU1XU0xPT1NYWFBNUE9PVVZUVlBQVFJNTk5LSkpGREhMT1BWY+rn49bS09TW2tbS0czIx8TAv7/AxMfExcvKy9DS0dv4eWdp9vZnevlv7+nyePDv7OPseuvl+3vs8eDh7ufc2+Td6erz/mReU1NSVVZWX11aYGlaWFFRTlVQTk5PUFZZVFZQUE1ZT0xSVE1PT0lJSUhIVE5OWmBbeOx7/ntiZORsaO/r79DQ1svFyMO8wsC9wMnDydTSzdfV0tzPz9ne3vt672dZbG5ccn1nduLq2c/T0sjN0crQ39PV6+HibWv5WVZfUUpOTEtVUkhLTUVJTEdKT01PXFdPW15VaGtQWGZaVlpPTVJKSFJYUVtdW1xhVVJcV1BdaWLs6u/g09na19naz8/Z0M7O087T2dvd69nX5d/d3unc5fn3dl9rfnV57O/t0M/VzMvUzc3X2NXb6NjX3djc7tzc7d/X4PbtaVVaUkpQV1dVTkZFSkVDS0Y/RUZHS01ISE9RT1dQT19mdu7n7ffzfHjrc2F+4OHh7evn5+Pc09zm5Nvc3unp5tfY19HY29TP09bb2fXs/vZyW09ZXlhYWl9WYl5kZWBc/uHY1NTQ0szPz9HW0sfGxsXCxMbEycvUenvi+v356O7+bFpbXFBRUlFRT05MTlJMUE9JUE9RUFdYUU9WUFJNSVhfY2Pv6efb1uHV0tLP0dPWzs/W1NPf19vZ0tTW2M/X5er3bXZdXWlvbnvc2t/Z4evpfPDs9Gxt9X157Htpb/b19+337NjY5N3c3NrX087OzszJzM7Mz9XUzc7W3+Pn4vV3fGRYWWZoaWdoY21pWFVXWVtfX15gY3Xk7vP7dGpydWNaXWFcYmZqaGBeZGxqbv337+j6+3Z2/nV8fHzl4t7W2N/08f33eWhu7vt78fHd3t3b2NLRzMjKy9DS1trW3eLg6d/b3tXU093wdndvdGNpbXLue+ro3+fv5N3p3+Hi5nNr/uHj8GBeZ29hX2VlXmh2ZGNlYGp8X1xq//Le5ejo6P786/twe1dLUU5MTExNVlRSXGRQT1ZUUlNTV2dkW198Y37j7e3e2tfQ0uPe2P7w4N/e3tvS1Nne0M3b19TW0tTa29vf5+Dn4tPX3ODj2t7mbmNoV1NcWWVeXHb6bHDr2tvn8XHqe21yYltnfurq7XL46nRrcGtcXlpVS0tJTkxHUmRbXV9ca2hnTExRWV5aTE1SU1FOT01XWWbn4Hd7c/5uZmNo697Wz83NysvNz9jq49vb2t/q5ent8n57/Hb959PQ2d3i3+XubmZfZfnqbnD6/Or6cF5jY2xvZFlUb+10V1JWZ2NjeN/a0tHY3GxaW11baPjt4Nrf6vleVVJPSkxNSEhJS1BNQ0RLSktVWl1oXl1iWktJS0tPW1Zd6Onk2O1q8n5mc+P049jc087X3dPb387M0MnGysfG097d7O7c6n7Y1dnT1fxvdF9ZZlpUaXp7+vhbUFBLTVlRXPV1Y1pUUE5MTFNbXGzm2tff9uj3cHT4dWBkbu3b+HH9bPt79Hrs3+Ph4mBbVktIR0VFTFBXdX1cbP9cXmFUUVdUVXRrWHVpW2NgXG7p69zN2ejb5fPub37b19XNyM/QycrOzNne1tbcz8zTzdHZ4OVy7N7l/d3uY19bUlRQTVxaX23xbPvv7HdyWU9RS0xQVlFcXl1fZ1hfc2Rn9fD67XpsZ2FSXl1RYe/q2tLQ0NXY/f5pW2dtcGr0+Pjnc2x5c3ff2dPV39vgb2VfcHJr8ejc2+Hb4Xzq7nNwdvrm2uHu19bm3Nzq5/N52tbc3s7X5dnd4uPq8N3X2tHI1t3afF9aTU5gZF/84Gtv7WpbYVVp4PRpdWZRUFVMS09MXvDn5tTda2hiV1VYUmDv+/De3/fi2+DX2dvNyc3Mzs/V1tbn7fPx5dja0M3NzczT3e3r7eT+59ri2O308HBWYGNcYllbY2xcZnVyVWNo+uPe2dfS3eP/c2f39+Df1c/KyMzN1tnj2dvc4uPp7G5eWlRPT1lc/HLk29ff7fxoWE1UWFpXXWXwfPf4bGZle/Tsb/jd1t7t4eJ1effq09fNw7/EyMnP2trb2M7PzMXEys/b/G7rfHvjc3rb2d3c7VZQV1NjfW7gzuViXFJGRUtHTFVScNXq6+br7d/qft3de+DU4Nrb7Grt7uDOzdPHy9nQ131naFJPUU5JXF1ab2Bf/HlbaPp3bdbu9N3yXlxZU2/l4NbM2NPK097gfWTs2+fczdTOzdba2uTv29jd09Db0dTicHZqYfPg6OX4XWRjWE9TT1NdXVdpe2zr4u1fZ1tVWFdRVVFPU1dMS1ZUWGh7aOnf6+PZ7m97W1VdXlh58+3Rydff2fVjbXdcaXRm+GtMS0xKTFhaWO3k7NjU8XFubmf/eHfZ293T2OTf+W903et+39/g4HtpaWP8+dvp+uxpbf96dG1xd2Nzc3T/8dvn6OF3ZFdSWlZYW1ZcUVxfUVZZWlxfYFxYX1VcUklGQT8/P0BGT1ZQZl1XVldeYWR09vD9aOXw5uXl4tXPztLR0dLO2tzq6ff7aWp2cGBodm1qW2j7737p8nd2eHd77vj9eXBpbGNeZXZ2aFpPUk9OTVlhZn7m4OX7ZXH09Hfr9Onf29/b2+Pe4evw5nd+5exeVE9NTk5NTVVPUlxgXFhVUFxeU09NSUdHR0JCRUVKTk9VX1783tzp7t/s3t3d39jW0srKzs/O0MnKztTW3efq4vj75fZ1YVtSVlVk+/peXmllZV5dU2RjXWv/Xmpte+twYml0YGn1fVlm8Glu+u158t/R3eHu/e3mdP3mefbr4Ozoenj262Zra1haWVtTXlVYZ2NVa3BgaO/yYm5ZU1dZTVNOSUlPT1FiX2Lq2unY2Nzf2Nra09fQys3Yzs7X1M7Y1dDb29fd7/ZsZmpmW2h+av7zY11wYGB59u/o39/b6Xh06Oz15ePq4uf13t3j6P1fZmRbXHBsaPdxeuPvXm1tZGhxa+HX59rR0tfP1N3V3/fk3vb29l9ZZlxeeujl19Pq3d9mVl9UTk5PUFtcVF1fVlzz83rY19nM0Nbe3fTm39Xaz8zQzNrX09f149jb6OXf5trd193n6ezd4vPzd3Lu5ejw7+v26PpvfXXz9OLa3PRw+uhwa/Ht8Ozb3tzo8O7vd+/n8enm5vJ0ZF5hbW/e2dLOy8rKy9vm621p+PLv8+3s8vV1fPnw4NXd8vNuX1VYTE5QT1pmX1x24t3P1NXZzuPa5d3v19ze2NfW1M/p2tvm797m6OPe2tPteOjOZd7W6tLZ+2d1UlJaZGx0bPHh9Gz373l+5eDq5uDe6/Pi3O3x3tfV1tLW2+Hs8elsX2drfP5uW23ubuHW2dHLyMvT19re7evY5l9s5vDs7vLs5Ono3nJdX1hadWpbVV9eZ/1aUVZbX2dncnFpa9vT6nLv7+TW1M/T3N3b5G1xbm3g1tje2+Hc0+H483T44fdfXFNLVF5YVVlZYW5vdPB0YXx6a/3q++bc3tzY3Ovg4+La6vLmdF1eZVdYamdra1tYXWNg+Ojy3uN79ez3/nz259zd19Lc4+fz83xaVFRbXVZXWlxYUVdaW2x+6vd7bVVaXlpjWl725ujh2+pnbGpp63FbUl5nYFxdaez1/OlkXGRs7nZrWk9XWl9bU1VbaXzl3uHo6OXf3fVte+nZ19LS0dXT0dDT2+rh2uLyVk5LUk9LS0lKUVRSWE9IS1FQVU1IR01OTlRTUlRUVm9+a/jj6tfa8Xvn3+rc3+DSz8/N0d7p5fzi4WJaZHpv5dvh3uBy7uNvcXlcXl9QTEhNTFJaT2JlYnbee1ZVTElNRj5BP0NJVlFWW1RQX2Nd6+nu5Nvn7N3Z3NLNysLEyMbByMvKzsvN1/D05PDf2etsXVNMVVBJTEhDRUZFRUlLSE9PUF5eTVJSTE9aTk1MSElKUlP+63Ds7G373fv57WdeevNs9N7q3c/NxMDFw7/EyMPEyc7X6ujd3dzU3Onhd2vj819lUk1PSkdGRD4/R0RIT0tFREdFS0xMT0pLUl5179ne6drd4NDU2dXV19LS0tHOzM7HxMTAw8zU1+bn2t/selxhYnR69N50Z21cXldRVElGR0dLRkdNSUtXXWl6ZllhX1RaVFRRSkpJUF1Wbe1q9Ovp083Jy8vKx8THxsbEx8S9vL6/yM3Lzc/R09zo7fpo/Whub1VNTVJMUFRNSEZGSUlLTlZgXejV1tnm/PHs/3f15HJy/P7b08/Mz9DQz87Qzt7/Z2J1c/ZhY/n/7tbX0NHe4eXpffxvZ15hbO/f3NXd9HFzef7y9G1lWFhlX1lPUVFWYHHo7Gto9Htu7uXk6tzUzsXExsbM0M7NzszL09TW3tbPztLRztDRz8/R2O/wbVxdXV9TTlZVaOjf19/h6t/a49zvaHJYXGNhYVZodG3v5tXU5N7l+2pkXlBMTU1XaPje6ft7+eLp4OZk+3Jz7u3ffuvf5NTQzMjMzdDS3NzS3enh5N7X19PX4nlra2pra1dWVlRicfH+++7s2dLQy83N0trjde1zYW7u6dvPy8jJztLQ1eH2ZlhYVE5TY29q/fB85NnT1dLO0tTrff1cWGFlaHD/7eve9F5ocG5oZ15VT01NUUxMUU9VWm9wbd/ufu1fZV9cYXPa3NvR0MfGzsvLzNHa2Phy/Hbd2dXV4Nze5Oxs6m5UX1dVV1JYTV70duTm29Lg3Njb4ufbcV5zZ2r8dnhfZXfz3+ze3uzb5F9ZV1NJSVFPWl56637u3+Dn5NvybfDz6+DW097p5ebc4ubmbWZsZmxsY1JSX1xZWmBhUFhgbXdiZVNNT1RYWF9nXGD569zT2Nzj3tne5+p3YlRcde/n5Nve4NvV197vbVRPVFxrXmFkV2P2693p6ePy6vH+7G1lWk5XYWJdXWxfY3vr4m1eXFBQVVlSSk5KSFBUZWJaaFxnfn3t8uj0bv7y3tzd193j2M7Lztjgcmn36eJ9+/Bn+eTp5/rxcWJmZV9YWVJKSk5PTlBfW1107eDi4H5hVVVTTE9QT05Ucfh24uT78/H/XWNqX1tZW11YYfhkX2ns6uLY3e7ycXR38upfXl9pcWru+WNub2xfYftiWFdSTEtLTU1NUVVXXnNfT09RS01VVFRZaXjp1svIzc/N0t3U0trW1dHc29jd19fb3+7d1tbj5d5xcO77XVZYU1Blb3D7a3t0W2T0cHtmXlBPU0tNU11aWG13eGtfW0tIS0pKSk9OTVz56+fb3nJra3bw3Nba4eHX293b0+dw8+je19XV2tjY4d99bFNMT01aYWdrWl1ZVGJ04/lfXFNTXnF1evzm39LM1dzq7vNideHmeHbq5dLN1dLf5eL15dTO1eDk8+rc2tPb5vv16dXN0tjY1uDd4HxuWFBPUV1fZ2BYWFdcX11XSkZIRUZMTVFOTk9a7N/zbltbVldyaO3m7tzVyszQy9LQzs/LycPGytDRz87U2tnd/e/k4d3e5X76691sXWFYU1BcWlZvbGl4be3t2dPjZ1VhYV/u5vN6dO3w5ePt+vns631t8G9daH7o3NTR2dPS0c7LxsjO2Nvc2M7Q3Ovp3d3Y2drp93lybVpTT0pIRUZKTFhPT01LXnnj/GRdVmX959XV19fb0M3KztPW2dbO0tPS2tro5NvY2OTd5Pjb19LW3tr3dO/c1O3o6v3f28/T29Td6NzW3mxdWFFVYHVuZGlrWGPo63BbaVpWW19uXF9bVl114ur26Xv029HT4Nzc3t7Z0tXW19HPzMfEys3N0N/x9O7k8vPw5Nve4unk5O7r3up9YFNTV19hYl9YX2dn7v79fmJ0dvb8c+r46fxs4W1lbV5nYHjpbvNnYWxo3Np64+bk3tjL0srK0M7UzNF16+Ln7vTQ3+Lb5djw5d9ZV1ZMSEVPS0ZJQ0ZFTWxTTVZTUFF5d1RnbW79eNHa+OTk3uTOyNHOzdHc3svO53j55u7aztTQ0dTb3MvP6ml3+nzo1tfb2Nvsa9vW63FeWUxKV1tXVk9MSFBcUElGSklLU1NLSkxOTlFcZWleWFJOW37p5+h1cHrd1dbZ3+Dg2drUzcjK19PSzsze62lg+HTw6uPlXF5oZ3Vsa1VISklNWVxrVE9UTVxoXlZIU1pPWmNsUU1WT1lncnhPUFtTYe/c6190eHXazMvZ3tPUz8jCwcnIy9LPyMfZ5dzl6dzOz97qaF1WW21TSkQ+Pj5JTEZHQj8+Q09JRklISUxf9G5mWlVSW+vpc3RfV17+0dbb2/hnbNfQ3NXgdXvmztDQ09je3M7M1tjlbnfg1M7N0NZ3XHjh631sU0lNUVdaVlJKREdLR0pJQD9ASU1PVk9PS1FgY2tlXlld8OLZzcvO3tvQzc3Kyc3PzMnFxsXGzdDU19XV3nlq/P733d7j92lsX1laWFdOTU5RWFdeXFZYS0pLSk9MTU9NV1phZWJjYl1dYFtbVFhPU2By8/RqXl/39ufc1MnN1M3KxMbIydDOzczMzs7Q0tHPzM7R2/VfV1pWUVRUUFFOTVdcXVhIQ0VFQkVJS0pLT1BZXFhZTlJqX25sb3tj7tnSzdXX7eXS1czLyMbOzMjEwsXH1OLV09DO1tDT1MvIycvQ411bXFhXUVNQVF1kal1zZkpJSUlGQEdISUxQXFtrZFFSVFpaVWFbV2b12Nzc1vfv4ebZ3c/HysjFwMPHxc3Q0dvb8d/a4dbTzMvOzeFnX1xcT1FUUFdrbmJfbWJZUk1OSEZKSEpaYVxYa11UXVxlYmRqXWZ52tLZyMva3OHU39fNz8nFvry/vr/BxsrJ0c/O2tTMxcTLy8zX3vBjV09PS0lLU2FcaX5kWk5KRERJQ0VJTl1aZGdkY11gVl12XGFw7trj1tff3+7tXVzt+O3W0MrIwr/CwsXK1O3b1d7V0czLxL3Eyc7Q5mTz9WRnbf1dZOl+bmhuV0dLTEhER0pFSVBZV05UUEhMWF9faez39czDx8rKydTZzs3Lx8C/wr24uby9vcrX0tvb3N/le+TOztfk42tMS1JMTFZOTFJda2BdZVlMS05LS1NWUU5bbFVbX09MSVBXUFtbV110293c2f9nW114d9rQzsnHvb2+u77CxszLz8zJ19LOy8fKyc7a7WNlY19rVk5QVltQWFhMSENBQUNJSElPTlNOV2BTSkpMS1j8dmfu2NLQy8nN2d/ncGffz9PNxcPEwL2+wcjQ4PPY0d3c1c/QzcTG0uZ5aFZqfVxaVV1ZUFhcUE1LRz4+RkZDRUVHSUxXS0NAQT47QktLUFx77t/N1+b2bGJZbNrd2M7HwcG8vMHAw8zS19PS3d3b2NrUydbg5WlbVWFsY2tbX2RZdmdQT0lFQkFKSElNS09OT05HRUBCQD5ITk5UWHjg28/m8HpVXVde3N7Vz8vBwLq7v77Gy8vQy87Y4fTe7ePW4+toW11WXF5dXlJXXFNZUElGPj49PUZKTFBYZGBgXVZQS0pHR05eXlVl5Nzb2t7ucF5dW1v693rYz8zKx8XIzc/Y3OXm2fHu4Ovf19DP4Ovq6Pn5435saF1fV1daTEtIQj49REhJUU9VYFRTTUZFQD9BTFhZY/vd0s3MzdDS3ert49TW0s3Lx8XFxcXJy9LX1t7d3uftefDg6eN9a2ZdbvT45Oj4ZFxyXVdWUVRKSU5NVlpgaF/tclNSTk1GP0NDSVFSXFdlfmVtaF9USlBaXf3e1dTMw8TFwL/Ay8vJzczO0tno2tTWz9DS5e3c3d3T2/1kXF5XUVVOR0ZHSUtf9Wtqa3twYVlWT0tISUpPWlpcZuvk+vzuXFdST1Nade7v4tPLzs7Eys/Mzc7My8/Y1tPOycnCwsjHyMrIxsfP1t1+bGtsYkxHSUZISlNWVlZQT1BSSkNAQT4/QUtPTFJj/uXi6nRbe2NYYvvi5OHRy8vJx8nNzc7W1svO2efr4+Xa1dPV0s/OzsjHzNLS0uDq4ur1a15fXWt9e+rm7ntgbGlNSkpHRkNIS05cUk5VavpiU1dfW11peHvp5dvTzsnGxr+/xMTJxcjKyc7OzMnGzczHzMrIxcXKzdHZ7WZnVk9PSEtNTU5PbnVfbFtfXk5RSUBFREZITVdNT1RYdWFYXFheXF5vft/q/eTaz87NxsrIxcfEx8fJ0dDRzMbLxsnOyM3MxsbK2N7vcfBua19QWVdbb3nh+WJpWmBjU09FREVCTFBUW1JXXGHo721fWFtXYXHo5/XvbPHNzc7NzszMwsHGwsnZ3tfOzcvJzMrGw8LBwMvU3nLu/ndrUlFMSU5SYFpPUEtNUVBPRj8+PD5BQkRCREVIT1txa11iXWtz7Nrq5et279/Pys7Lyc3Kx8bIzdro39vWztDV08/Mz8jI0tje4/tx3ehnX1tZVV/+eWx86vdk7vlWTEhGRkVJSENDRUlIVmdSTVBVUktRWVRYWlxUYeDZ3NHMy83Jw8bHxcbMy8bHycrMzM7Pyc3X1d30bXp7XFhUT0pGR0dHTFBPUE9US0hHR0hGQ0RBRkpGS05XWlNWX1taWlxYWm1cXWVnZWbq0tLP0dbe6t7f4NbT3enh2uLb1NXZ3NjR0s/O3f/q5Hd5e3ZVTlZefend/VRaWU9QTE5FPj9ARUhOWUxOXVpkbfX7Xmhy/d/a0N905u3f0crH0drY3tLIxMzd1N3l49/d7Hr+cXbu3OVbWFJPW2ZfVk9MS1Fm3t54ZFdMTVxnVlBNSElOYG5gXVFQU2Ltbm5dTE9V7trv52ZbY+zO1NDM3uLe0MfLytL5ZG3b3ebX9mJt6tDS1NtmWlh9615sVkpKU/rj3+JcTkxd92J8e1pKTV5r999sT01b8O3Z2XhXXPHXzsvS9F1919rXzc7o5dbQysHDzeDb0NLOycvpZu7t4NHP5FBJUFZaUE1LRkpNUm3xcE5FSU1YX1tNSEpITGji23FQV2nu29TfaXHr6dPMzNpxY2rx2s7K1/P85c3Hx8zU3fz65NnV4vFub93Uz9Lj6mhs49bVeml2XWzf4N/9WlBSX2zzaltaSUpba3pqXUxFU2NeYllaUVB23dbn6+pj9tPLyczM2OXOxcHCxsvc4djPzNLQ3nXv1tLY3OJeWmh85/lqZVdV7dfa7u1XTlVj5ODb4mpeYPzd5d5nT09QXWBdVktNWGnp++huWWtw493m5mNdYm7W087O7Obb0srJxszU2+XY1dnga2l4+t3e2Olv8OrZ1dzqX1RUT1NYbG1aW1dl6efa6G9qVl5fenBXWVtgfebi5nv68+Db0c3o8/xv7tvPztvg6+bY19Ha6ONtZnf27WxoX2vo3djd5eNzc+Hn815RU01QX3Dk8fl6ZuDX2trtcFtTWV9nYFhXV17w6OXf2uD43NHT0NnwaF707ePa6OVma9zf2uDmclhyZ2J5XVhWUF5zbvT0bFhm/HDs3G9VU1Vd9tzl3mNk5+jc19nuXFtcWWppb19t5ufY2dHZ+eXj1c/a0v1c+fzYy8vM4enu3c/d0+BfXE9YXmZ0TlVbV/tjXmVQVlVjd15jTkdLSFNmd3xbU1Ng2tPR23RnV2Lp6tz6Xl9e+uTf3+zq/ejV1tTgbWRn7NzT2utzYGHk0M/W4mxZYHfn5PBeWVlf7+b5bmZbWWzn7m1WTEtMVF5iXVtUUWXg1+D+cl1XWF5jWVJLTlbi0dfY4ODo1snEydp5X3Df3Nnc5eFufNnOztnqdmVt9+HeaVZOTVlfZmNYX2Fr4OPraE9MSFlmcnZXVFNRbePe3fJzWFRWUVRPSkhETF9t+nL2bl1mX2tyWVBRWeLc5On27HLn0MzGytnhZ/ZuZnRnaFhe/erj3Onu+vPj8ub0WlBPWVxjb2xpXmvZ0M3O199mYFhTXFtWUlNcYWbm7PB5bXVdX2JfWlZjcOnZ29/t7Nrb1dHa52tubXfi2tryZmVjb+fs+mNkZmV4dWZTTU5MUF9u6Ofw3N7Ryc/f+G1pVmZ6bGBWXGT+3t/o2uj5XmPuZVZOT1ZY59nh2vdsY2nb4nX+Z2dbY9puYGRZVE9kb1p29mxfc8/V3eHueV7q0/7f1N/e0sTGzc3U6mJe63Nu5/pcWtzbfu/k+mds3t/q9XhsaNTL2tjP2vv61Nnf4+fvW2rr/XxnXE1FUVNOUVNfVF/h7vhqXFhSe/B6+Ore8OLJy83KzdXu8et9cmljX1Vq7GVjaWVbXXxua/d0aGnp2u3u5ebq39jZ59za7+nZ2tjW1/BmXlhhU05TUFz45eT07GZRWl92aV9wbXTi0s3Z09Ln4ODX5XLralxubury59/+39nU3fzmZV346NTb3tru3+3a0NzP2ObX187X39twaWVgXVBaUklVYvPZ4Nnna2hfb2Bt+Ftr59zNz87S4uXy7vdob19cZVldV1piWFRUV2xncGRbZ19q5tvV2N3Z3drZ297o2drcz87Z6P1+Y1hfZ2xjW1tUY+zh5P77dXXq7ePn/Nzc0MjIxcrO1ODb1OLrYlpaWmVfdmlZUEVJT09YVFdQTFRXcu735f3q1NrQz8/O1c/MzMrP2P1493L1+mVWSk9WWWFfX1VMVlxs4uvhd3vu3s/MyszU19nY2dfS6fT9/dvV0utZUE9XWEtPVFJSSU5m6nJTUlhleHXl3Od1XGje0NHme2ddbPvp2/n+b3bc0NXsb1xeZn3f2uHvenjj1NDT1uL0cObd6ONpWVFRYnJ96/ZrXV1pcv12XWF05tjZ3+p6aGR5efDn4O1r6tff2+dnWVBWUFBdV09OTlhsc2JpW1VeY2vs7Hht8NfUzcvJzNTZ0dXTzdx7a/l7/OrwX1JTWVZVWltOSVBQVF5pbVdXWmvr39fc3dfUyMTEx8/X5O7i6uDxXVtbXX50Y1pOUVBPTUxPS01SVnHo193r7XDj3drO2N/l6N7Y0tTo82RkcPp2amBaWFJVV1haXVlcZl1ub3Lr7efVz87Y3dja2tje1dPb3WFh7vNxamNrWlNSTVZaXmFZYmpnXmP89u7uc29qcW5qbnN77G90XmP8+X5oa/91ZGxaXVtaaV1eamp6bXfwe+Li7vfw6+n0+une4ebs4tnPz93o5+39fvTZ09bU19rX3d3p+fJwd/tt+X5pYltecF9kXFBZUlBSUk9QS0lHS1ReaWJraGJv5dvY19bX0dHUz9LSztva19na5u/uYFdKSElFS0lDSlpua27k1uDe1tLO087O0szIx8rJw8jO29nd/mdRS0dCQj8+QERLTEpRUVFYTV5hV3FqdfNy2tHU0dfMyM7HwcPL5epeUlFPSUhPV2vx6d3l7uXc1tbY3nNZWVxkZF74/Grl2s7Lz9xdTE5RVFNPVU9VaPPZ3vR7X/3a2M7Q2N9zb2b+5OnucHro3c7P1+9ZU1BTU05PUlNeZ/3b0s/X083O09bW3/5973BgfOx1cu7X1+d4ak5IS05KS1BUVk1RaHvz/Ohz7Njf2Nvm4vTg2+TX1+zo6trV29n5XFNRYVhPWlNNTVRjd97T1tvVzdLPztPW7uXc7NXQ29/z5+Hl819UU01HR0ZMTElNT1lj7tbZ59vb18vJxsjPy8zRz8vFyMzLysvM19ngaVdLRkA/QkJDSVdbZ3BdW11obGry8GNZUlReU2z179fUz8/d3d39aGhhYFxsbl5ldvro8W5lW1dnefPm8ev+a2x0793a1c3Fv8bIydXQ1NfR3N3Z7OnY0s7Q2tx0a/9z72dYW01MWFNZX1heXF/j5m1fUUxKSU1LTVleZV9h8/fm7PPo3N3Vzc3LzdTX3dXLyczQ1MvMztToelZJR0BDSEhOS01YW2nv5drc1M3KxcPEx8vNzc7MyczTzs3R1PptWElFQj49PT9CQklNSU5RWm788Oz87enn29ra1+Xf6Ovg3drX2+5oV19lUk9MT1xq2tjj3/3p6PDMy83EyMzM0szP4Nze6Otp6Nvs0+NjfWfv6VhdU05XU2RsWVxRSlZZbt/z8vt67nPz2uXf2ufk5dnMztXuX2BTTVJOUFlYXGVfb15ZWVpmanrh5tzd7efk1M7Qzc3S0dfNyc7Z+VlWVldZXVpYUlZSTllWUE9MTlJWX2pfWVhVXl5lZmB3cnXv3tHO0+X/ZGFeZG5ma/x769rRycfIxsfFxsjL2PH0ZVxiXFZXTExOT1FSZWRXU1lWVlJMVFBPa2f05t/Y2djOzc3Ny8rO3NvZ4u9rbl1UXV9cXFxfZVBWWlNdXVVNR0xPTllf9ntm/N3Y1s/MzNjb1Nvk3dvbe3nm++Xf3+NeYXBXUFlcTUA+RkpMTlpoVFj37ODZ0c3P2czIysbJytHg19zf1tjY+l3t9u3uX2hdT1hWTk9QSkZHWmJQUFpqV1Nld15m7nhfXXHicWzq6Hxi9dLe6e32Z2Bn7e7u2c/Y2NfV1dnP1N/Z1NHQ3N3O2N3b2d5xYnxhYnP3/V1TWFNLT0lIRk1pYVpgWF1YXuHX19fb2dDSzc/Z2N3cz+jm4HXxVExNUldLQ0A+QEZHSk1NVldYfevl7+Ld3c/KyMvMzc3S38nAv8DO7HhZaF1UWltkX1pkbGdcWW5iXOfk7O73Z2tfZe3g2ebc1N7n7l9SW05VU1NnYvrX193d1M3U2Nfh8GNiblxgbF9YUUlLRUdUU05NQUVGQklOUF1t29Paz8rNy8vAvLy5uL3Bx8rLzsTAytHazMnV4vhOR0ZFQjw7QkA/QT9HS01WU01QTVNZZ9/i+Wpy2s/Wz9HKxMDBxs7j63JhX2fs3NjgYlpYWmd2enN1b1xZbG1yevvr3dTO0tPR0dd1aGlk9flfWlpfe+rZ19fZ6+be5tzd4N/qffBvXlxeWkxKUF1rXVBLRT5ES09TV2f59tPPzsnHv8HEv7u8vsHEyc/OzM/O3O91XWR6W1RQSEE/QUBARkpPT01QZm198unyfe/i5PXx6WxuZ+bY4trR1dfR0dna3tva3OnZ0NDXz9Pa3Nbb5OLm721iX15jaVtUVVpWWllv5+Xbb19kVF5fVFhTW3p34upu8fJz6/Dh2uPf5/nk6uXa2c/dbf/s3tXvYlRKSEdGSUVGRUFHTVZfYPn0b+HZ1MnLycLGxMPFwMLBwsrKx8zQfFhQQkE9PD08PEE/PkJDSk9QVWpv8NnQycvGytTOzMnDycrIysTG0c/d9fRkW1hPWl9dWVNYXl9qbfXpeFtdVldXSkhEQkZDSlBb7vZVVVZgdV949mjn08zBxMHAx8zLxsHGyM/d3/hk+GBfW0tJRklaT0VDQD9ERlJQUF9WWvvxzszR0tvd1NXKyM3Cx83MzcTL2tv3fODb5vlWTklDREJHTklKR0dJSEtQSUxUUltXZt/u7PR23NDOysrNxsbKztHP1uvtXE1UWmzzYfRvYOHd2Nf83f5dfO7f13To4HPp3M7FzMnS5/rwbe5aVV5kcXR82fXz4uje1dLFy9fO6fN6WV9dTk5IRU1LUEtBQj0/R0NJR0FJR0hZYX35auTYyr+9vLu/vL7CwsXExtfVzMnHydDPemltbGhUU2BSTUlITk5JSkdKSUpOV11sZ2pgbuzl2Nvq5N3S0NLNzsvQ3O7r5dne6+vu731kXVteXFxfaWlxXlZQU1diW11n++Xl7G9qcXBlbmNpcXby6ODT1c3OzsvN0dHX0tPX2uxv/WRkV1VXUk5aUlBPR0tIQ0tJVnB239/p2NbRyMC9vsC9vb6/yMTM4NPR4fFecFxZWFlYT09PTEFCREBDR0tMSUtNSktNX2BXXWh2a2d7a1p73trYzsK+xcrJx8XEvcPMzsrFxcrIzNrq49roZ2dVSkdETExITU5QVE5QU1rk2/b5bujubObc4tjYzc7a0s3d9Grf0tnXz9foXmFuW2zg8FtKVmhWU1NWTEZIUEhDSlBOTFNw9eDUzcjJx7/Dwb29v8jMzc7W19Pe4ezcbl5WVUw/PD0/P0NMSURFTFZcfdHMztLSzM3NyMnNzMzP3Pbe2+Z+Y2R9aXF7WVJbY2RleuVsYFBTZmrp1edwZVdXVVJUTk1GRE5PYXRhV1ZhbvHo1tTOz9DLzcvIzMzLzszP0M3c4HlcX1ldcGdVTkxQUk5aW1NIP0NGR1djZVxQXW127uvo6XH/6OTbzs7R1svExMjHxcXKztHc29zjbVhSUk1JR0VEPz0/P0RLUE5KTFJbX2zo331wdt7QycDHzc7OzNHd3OV0Y1tjZ2b7YFllZ+vleufuZ1lPV2xz731pdGj03ezd4vTyZVhietra59ja2c/Py8rNz8/T087O2337ZllZVE1IQUA/Ozs8Pj08P0BCTFdgWlpse3fx18jJyL/BxMPBv8bOy87b4t3O1uva2+rj3NXgaGdsX1de9H5XWF9RUFVlWlRVV1FMS1dbWllkXmb+2NTe6dzg7dvT1dTOydLb2c/W7HF7cFtae3ddWV5eVVNkYlpbXnlsW3NqYF5kdmpp4dnka1197/nk3uXi3NTS09XV6P1x9PBtfODo7uRmWlVVWU9LSEhNSkxfXl503+Dcz8XEzc7LycvLxMPO183Ky87Kz/VXWF5VTU5WTkdMUk5OTVZUSklRTkxPVVVQT1hZW2J89m5fa3dhb+zk7t/OzcvIw8PJxcHF0NjS1+v63t/n4t7caFNbXU5MUlhOSE5ZXFpf7nby2MvM193e4+zq2c3N1c7Y4ebo3eD2fGxiY/Hd1ehyXFhWWF1aXFFGQEFHSVRdZldMUFdjc/Hc/15ca+DZ1tDNz87KxcXDxMnV9u/b1Nzc2vtcWVlhb/F+fGRZXV9sZWT05+3g0crJy9v1XVxoan1uYV1fZHnl19bc4N/i4tnf4P5gddvY09Tf71tWXFpMSUE/ODg7PUZNVF5eZOfb0NDVzs/LxMK9ur29wcjDwL6+xsnZb3BSUl9bW1JKWFNRVU1STkdOVlxoX2RlWWt69t3h2nRTXHNx9f99/Vv53N3W0cnG1tLOzcrV2t16Ymh993ZlaVZFRElJSUlPT1NNTE9SWWFw3O7l09LNzMzMzdHPzMzO7HroXFJPVF5UUlppeHPg2u9jbe9oVVp09mJu7tjT2M7M197azNn5693tae3k5PB35NrW2NnZ/lZcZW5nYnF0YllYVlZQTE5MSkhDTEhHTFBdX1vr6X3+29bgamVwXWBod+tu6MrIy83Gxtjc2Nzb6tvP09rP0szN1szR+e3/eF5LSEZBQkFESEtOV1FOTFBYbePY087U29XT09nXzdbg19jb1NTY2fb7YlxbSU5SQz4/RkxNVV1WVVtp/+3r29rcfmX3/vnf2dDO0dLh8eDc297i39ni4dna2eXsfHz9ZXjuX1FNU1lSXndsdG9gfvF42d7saldmaFps5dXO093b3eHe2t9uX1ZUX11w/VxoZlz9bfLX2XxmTklKRE5VUVZKSVZOT2r26mpkcPp649HQ2+LZ1M7PzsfM4N7dz8rJxMbS4PlkX1Zae2FRS0dJTVRqbvb1bmx27unj8GNYV13u2eHa0vb+bXrW2NHK13dv79nZ3NPO4WlaXFxVY2RTSEFFSElMUldOREhLVGl0ZV5QTVtn2svKw8XP0M7Q0crN0NxuXV95/uPY1ONoX2937eTxeVty3e3V1dXOc1rt4NrKzNneXXH2a93Sz+FpVE9NTV50aWJbWFti7dHU3nFPTk5LYF1JRT89REhT5Op2eV9W/m3g0d7d++rl2tPIx8nLzM/OztDM1/1eX1/v3tHJ2WlpYHTg1czS43h6cX3q39Dcel1QTU1QVE9TSkpNS1Jo7uX6Xm9xcdrS1NR98eDdzsnCwcrZ5GxdeepwZFFITEtKUGt87HlaX05Z6ezwaltpYm/bz9PYdVlWT2rY2t7tYfbg3c/IxsjL6W9gZ9zf393x9uXt7tbQ4+9VT01UcG9nYFBNVlryzsrL0e/+5drFyM/U3f1pZ1/g3H71V0pMSlJNS0tFQj9DSFNhWVZJRE5d++Tl1d/t/uLdz8XIzt3obvHd2drQ1dDRz8zHxMfP3O1wbt/g6W5aT0xZ+uLe92lXSUVNYXBiX11bdP3m6t/Zztfg6uDS3OXh6mp+7PF56+vqY0tER1ZeXmViV1JUUVjq5uFsVVNRaG1ZYnZ5cvTo8dLP091hXmPi3uLU1OhtetrTxsLH12tVUm/+6upkWV5l7eHXztxvcP1229Ti3OdWXuvt7tbW2+xPS1BYZm5oZl1VX3Zx7t71YVZRT1p5aF1eWmza5fXo7GFPSUdNVmBsX29pWWLy79rKytPqa/7k2dLUztPYzcnOysjO5m5gX/L0fGhqZl5o9+fdztjuXlVKSlVt+HzpdGJhaezQ5XBhV05PZ254a293383DwMDL5GBZVVjr6ntgXlBMT1Rc9XlWTkpHQU1ZXlJWXV9zed7Q0+Zv/eH32c7Q5/B9fOrtz8vYfmRXUlJk5ungzcvMzMzEwMbP3fv/aGfj7GR6dW3o5tjP7VNJQENHR1VjXWJxY3no0sjN3fddWFZMUVhOTVRPXFxk52RHQ0JAR05p+11bbGP1183Bvs7e6fZ4ed7W19fJx8rJyMXH2/J7dH1v+3z8aHjn083Fv8PaW1BLQj9FR0hFSU9bY/PY1m9ZY2hcVn3s7n3x3M7Lw76/zPpZWFVPZmFWTktMVVNZ8e5sW05NVlBcbGxq8tvMzM/HyNT+XVlWUFhgWVtgW3jc1cO/ydp0XWJcaePc3trXz8rLwsLM33BrXlFNTlJVUVl82d3XzNnzbllRVFlefex0aW7l39HFzOZsVU9KR0lLTElNW/H03c3PclJPUk1LTFNdUFrv4NHIv77N+mpYUFBKU2hba9fMxb26u8fJyMrX8WlYW1VZ8dfVy8nM3WVTUkhDREZRVEtb7uvTzMjM1nvtaV9dZ+NgXWbc1dDNz+L+XVdTTUxMV1hdbN7d2s3L0tr9W01ESUtLUmFh6e7o2tDU7V1QW1VMUV5o9OzZysK/vb3AyeV8bFFYd/Pf+Wh62c3FydnabFtRSk9aaXn+6t3NysbI1uV2X01DQEhFSk5ITW7m2NDRy9PtXkhHV0lZcF1b49LW0dXV5v9WTEhHSEtPTlRx3N/V1c/Rzurz8uDX7NTW087LzsvIyczI21lUVF5eZWL159nX4t/Y6OpvTU5HRUtfbG5x3+D61tLb2HFIR0VCR1Fcau7b0c/IxcbFxddqZVJYWk9SXXfz+fLma19bTT9BQkxUUlNWanjp39XS0dTrUl99cuzr6tzT1srLz83N2mhQW3xmcWRb48/Ty8XCx8vN3nFlXVZSWFZu3ez84Nr27el9ZllNR0BBRElVWWre2OPZ0tn1XFxaW1VZXVZSUl1xa3zedlRNTU1fYmd6Wmhv/d3b1cnT4Wxedubic+bk4tzPx8C+v8jYfV9dZPZdfPZzb3vn3tTV4FxSTkpKREBFSUVOW+rb1tDc2+12Y2xqbWx+eXPt29fa2erd+WVXU1hWVF5bX3VgY2nr+X1iWFlUXF9oZl5y7ufq3cnKz+JZU05HSE9ne+PY0dPKv8PFx9vf4WtoXVtaYm7t4NLDyc3K1H1nWVBeXk1PTlZgZObm7uF+XGxpVltZUllXZOd37PJs9F5a69psXl1QV2Ft6+jb5X3i8lpVWk5UY05RX/rV0tne9N7S29/Q2dbU/2R73czLy8XJy9De6NXa7ezk9F9XXWZzbGV3XlVX/m5eWl9s6+n16nBkWVdLSUteYF1pbmR+ee3P0szV0d18e3RiWWv3eGjo3dDO1W5wUkZHSVNPT1FJSU9SZtzP19bY7+ja1djPzdPO0NjPw8DO43VQV2ts+uLkbWVda/PTzN/nck5QdPTg2dnn+Nrd69zQ2fhtT0BGR0VNTEhJVVhYY9HS+vFrbeTe7NLb9WFgYlx429f8e2VeWVRMU1xZVFteWWNz5e/w6dvVzM3HwMXLzNLWzcjEzN7n5O3pfu3Z6VpcW1VcYO/rfFtveGxoZ+nyW1tqZHDs5Of6V1le+tnb0d5eVlNJT2J18fFhX31r5eDV327+/mVf8O5kVkpKWmJy6NTP4W5gY17s2NviXVZk7OTSzMrMzc/V29LL0NLd3uPd69rN1Nvl3uXy68/b8Whfa2tm6M7Z3f5iWFJRZmhcXFVZWVhfb2z4fXFbWmJveW1hUFBUXGze293ia1lccN7W4O5jY2tv6tLO1dff7nl66OPp5Ovb1NXSz8/W19/78eXd4/HweHNg7tPLy8/N2l5aWVtXUFVMS09UXnLufd7efHdqb3Np7XVjY3p1euHa1N/8XVpm6/J9c1tYYWBp7vTa5mxeWV1oWFdvZm7t5uDlbuX8XFlXVVJacP79cGbu4tPT1M7d6t7m631n+F9R/OD13ujh3PP87X58b15ZXlxh6m9xfena3unse3Tf6fDt6ujoenpqZXZeV1heV1JRVlti+9/p5+3q3fpvbGdgUVFVT1pdamx8/vzbdVlZUU9MS1BSXWXk3NfW28nNzMjMz9nl4e1vb37683zw09TvZE9LSUVNVU5RXVxp/n3d19nZ0dLO29ra49rS08vM1c7Z5PBoS0pHSExISVBSVGBp5NvnbGpeWU9MUk9QZ2Vu7fjb4d3q29LQ71daUk5TWl17ft7c1N3o9v9+b+Tc39/gcPP3+n3x3t/p7ej76ftrbWv+2+Di6+73efH/+m51fOj5aWzq6vHYz9XqY2FfSUtOV2F2XV5nW1xRVE9SWlxXU1BPTk9aXWrfz9DV19Xr9vXk1s3M1u3f0tTY5uTt8l9cc/pkXHxueeHUzdP0bmRlY1tcYnj85H13/mzk2dHMztpvWklJT0tISU5bX2jm5XV1al5969rYaVtiYGdn8uTg6nx4WlVVXllcbWliVVBe6d3e4Nzj2dXl29rz5+De0MrHyc7fcFteXF5p/uD4ZGZbXHP57+TibF5aU1NSUFZeX2189+bufXZtb+vq8m1mcGlgedva09nf42ldYWVp+d7V0t3c3dzf6+/6alxcUUxKT1ZYWmXi0MvIytTfZldeaVtn6e10bfLZ087Jxsrde2/7aV5dY1pXa/J1XVtSTVBmdvJrWV5YVVVY8dTW1tLe/fbe1t/Px8bIztXQzdDd7vZ0YlZZXFdUUkxJYOzx8GhaVVFUT1dZX3Lh3ujfzs3Qx8PCwsfN2OPhff3d5t90YFdaXVpPSk9WWHrmfvZy5Onr1tTV3PRjZW197NrPy8zNz87LyMrxb2FTUEtHRkZLTFR029jQzd3i3dXa7uXc4u3r6d7X1dPR19bX2vJXVlBLRURLV1VSVFdVT1zq5d3S09Xd+eva09DW0NXe2t/kdd7SztHQ0N/mfnZtYG1cW2JSTE5QUlhp3tzbzs7Ozt3s8eze3+jr8ejX6mz66Nzg3uppaObiZ11WXmt6+mBcWFhXUk5PWnxrWWFkannZycfIztnw6uLo6ebY1NHO1c3KzM/Z3+Dj7fFfWF1fZG7r3NHN03t972RYV11XV1RTUFFkb/ve3dnU3Pju3NvoZHDreuzpblheZGFwZm7f3edfV09RU1plXmJcV1VOU2/g0s7OycvWzs7Nys3b4O9zaF5fT1Necmtl+/f2bmBfau3TycrP2OnufODUzdHf+W9mXWJaVVlaYG1laf31WEtJTU9ZaHBpfHVSWG7v5NzR2fZ2ZV5w7eDm8/r6797rZXltanr5cFhRWFdQWnLm3M7L0dneZ15pc9/b2+pgWmJdbOvf29zU4OXRz97ueHloYm5cUE1MRUJESkxWWllbVU1MUV1+797taW1v793Wz8vNx87f43r8Z1NWVlNWWFJPTEtOW2j46eB4X2FaYPDTzM/Pz9rm6djNzeX9ZF1dUE5KSExMT1hcYnlgX25n4NbTztXX4WJWWFFaXl9fW25nWFdZXf53d/n64eTt3fB24uba3efobF9kW23q9t3hamtqV1ZNW+b25exlV1JWV1dnZ2z7ePv+ZWVod+nt5Njd+WZZVU5XXlljZltQT2JkX2fsamvs9HRg79fXycnNy87T193ncmdwYllmeGFbVlRXa9zf9dbe821UT09dXVts9Xt9dnnq49rU3trO097ucG1t+/1l6uxkZVlOTVZt8GVcVkhHRURLTk9OVnl3d9zc4M/Iv8HBvcHJytjf3ubq5tfga/32WF5nZWdlZWdUTlFNVl795NjR1dbU1trQ0M7Q19jsaWNeX2trY2xvYl1YU0xMVF9fYfV1XFxYT1FVUVdkXFJVXFtt1czLycXDx8vQ1Njd3uHj6uro+Ht7+uXi3dbYc1ZZWmL8evPe3dfS0tLS087Pz9LOztz++v5z7XLz1t96ZVJLS0xTU1JaW1hVUlNWVVhcaGp55ePg49vMyMrDwMLG0OHvfG5eWllQWmJfYWJ02tvbz9LT2fB4amL76tvQ09nc4u3e1NHa1NPU1N/t8/R6en52berxa1ZLUFtZaO1uemxaWl1UVl5aUE5UVVtffN3NysXDwsLJzt3vaXBxbGpoXllRT1liZGlkV2BiXFxbWWd36NjQx8LDycrIyM7MytDZ4/rzcGNw8V74Ulx1SlpeXmTv+Pfk3v5jWU5NU1NZXlhhWGDu5dHGw8PIzMzV3m9UVlJOUlhhZF1n//fc29zgbPd4aPlkY/N2/vn79ejk3vfrz9TPztHQ6W1nX/rv9f9kV1JMTVNOYvxnbWNodF5aUkxTVFNd+t3Z39jOysTGxsbJ0uZvXldVV1VRUlNUWWB4eO/r+Pb2el5ZY2RkeeHc2dTRz9rd297Uz9bW3elyYVpUU1NZUlFRV1ZSW//093Vu73liVU9OUE9UU1NXWG/069/RyMLBvb/G1PDw5Ovu+1xoYFhXWF12evv7Y+9uX1hQW2Rf7t/ZztPTzdPRy8/N2NrU7l1QVFxbW1tSUU5JS1FNUmv0fl9qaldNSEpRT1VVUmVhXnf/48/KyMrMyNHyXldYZXl3Zmt+Znnj5eDOzdfh4OhtWFReZnx+//Pf6O/n4/zlycTJyMjV6mxx/uPb5P3/cFVQUlRRXmVZUFZSSERAPz5HSkxPWF5fbPjf08XBwsTH1tzr8nl9521eXm9fZF9fXP3e4uft/F9eT01c5trR1NfX29nV1NDHzM/Pzd36alJPUVlRUVFTUVJVWWry83xpZVxPT0xLSk1LTU9UX1ZTXmJ91s/Ny83V3ur47N3d497o9Xxv9urz9WVcXVtaT0xHR0lMV2Pm7eHd2NjSycPAxMXLzc/b4ejv7n1tal5jXVBMS1NaVlNQUldLQD9ARk5PZGRc/vXl1MrFxcbCwcjS4N7wY2VyYV1bYVtSUFtmam1kYF9kU1BUUlVk8+Xr++Ds9uHU1NjX2dbS1uT18Ovp2dbea25+XVlcY1lWY2RcVE9IQD4/RU5YVlBicVxn2crKxMLFyMzM0d7u4NfV2/Fu6PR5bWxdV19aU0tOTEhJUGXi3+Dd3M/RzMnKzMjGys7Rztp+Z19bYVxaT05LS05UUEtYWmBdW1ZSUU9TX351cHv679nOzdHJxcjHyMrR2dfT2tTU397p9eri8GVXdu9q/flfW1RXYGne4vjq697c3dTV1czN0c7Q1s/c4HhndVtPT1BOVE9MTUxPSkpMRkBDSk1OU2Fga/vXy8jDwMK/v8TBxMvNztXT4O18XGNjWlhUVVlXW1tqeXBneu/k4vDe2NnQzM3NzsvJzMzKyMrNztXf3XtaWk5MUFBXU1BXWF1fWFBPTUlGSk5JUFFJUmX8+vzZy9HNxsbExMLCycXI1NXc8N/j7nBUWVFITU5NT09OTlj1YVfy9+LRzMTEwLu+vru+wcLM0t7d501HR0JDSEdGQ0VKR05dWFZYU1ROUlFOWl1k79rV09XNzM/O0tHNzdXW19nwYF5aU1xoZmpoa2NjcnRgY15eYWj5bGpv9u3c2NXPzszHwsC+vr/CxcrU4W1WU1ZUWVFKR0ZEQD9ESUdGRUdHTE1KTl996M/Fwb68vsLBwMLJyszU3N1uVk9RUEtIRkRFS09UXn1rbPf4c2vs+/vq2tHQy8vOzszOzczJxsfK129mVEdGRkhNVlZYXl9dV1ZXUU9MTUtHTExISlZhav7638/MysS/vr6+v8HFxs3gb3Xva11NRkVEQEBASUtLT05PWVlSVmDp1MvEwr65uru7vb3Bw8XO3H5PRT8+Pz4/Pzs+QUBKVFtgX2JcXWZnamps6drVy83Uz9zk4dvTzsrK0dLbblxVWmZr9+xlb/J8dHV5fez9a2peVlJLR0tSWV1lY+LX1MzGv7y9v8PEytXnZlxeW1BKRT48OTY3ODo7PDs+QkJAP0pY59LMwLy9ury/vr6+v73AxMrrXFlORkVAPD8+PkRESlZlce/4697b3OLQzczHxcPDycrQz8vLycvY+G1URUA9PkNIS0tUU1FYVlNRU1dfZmZjXU9IR0dKUE5QWl50/OrfzsfDwcC/vb3BxcnL1tz5YlZNRUA/QklKTEtNTE5GSFBs49fJxb68vLy+vr29vr/EzM/rWktGRT8+PTw6Ozs7Ozw+QUZJTV/27uXez83MyMvMy87T1Nvb0s3P4WheVk5MS1BSVFpTWGBmY1pceNrZ2dnb1+RwXVxhX/rk5NfU0M7HxcPCx8bFwcLIz97f8VxQSkRAPjs6OTo9QENER0hIS1N74dTNycPDwsbIycvHxMTFydDW3G9cT0tMSkdGRkBBREZLU19d/d3XzMTFycjDw8TGx8bHysrKzsvQ3+tqWE5MSkpMVE9NVVxUUElGSEtWXW1pZVxYVFNWW2ttft7l6+Lcz8vIysbAv8C/wMbT6epeUUtJRj9AQ0VHTlJTX15WY/7x3M3IxcG+vb69vb6+v77CydDcbF1SSkNFQz0+PTs3Njk7PUNJVnbfzca+v7/AwMDCw8PL0c/X5fX5XVhYWFhZWV5faf91cHb+dPTc2+TWzc7S2N75ZV5bZPLy49zc4+DPzNDY1s/QzcnKzt3icFhZUEpHQz4/QD89QERCQUNMVF1239va0srKycjIxMDAwMHDxcvM1eldU1ZNSUZHRT8/QUFGSE1k69XIwcLCv76/wsK/vcDBxMXIzs/Z4WpVUlFQUVZTSk1STk1JSEhHSU5PWlhYaGtlX2Jlbuzr7eXv6d/f9vfzfObW1MzL0drY0uf36Pb26vpuZGv9+HhnXnH6euze1NPcz8vHxMLAvr26uru+w8bM32hcT0lDQDw7OTc4NzY4Oz1CSVZ76NvRy8jLy8rKyszN0dXZ3unwWk9OT1NQXVxXWl1zbFpaaPPt4tTPzMzJy9Tw6OPt7t/V2t3Z0szNz8nHyMzLyMrP1dDU815cW1hNTUpGQD0/PTs6PUJERU5ebnXt1s3Oz8rFxr+7vcLMyszjbFZYWElEQkJDPkJISUhKWWFw28zKzcvGw8fIx8PBxsnGw8bJy9TrcGdvXVtcV1FKTU5MSkdLUExLTllXT1ZjXVpXYu1vaGFfXVlld2tnZ3f/YWb33d3o297d4fvo5fN+cmpZXWleU01PVlVPVVdmXV/19OPd0MTAvru6u76+vMDIzdbhcU5JRUA9PT48OTk6PEBAR01OUWzZ0tLSzszNzs7LzNDN0vRgV1ZZVVBRTUhFTFVQUl1qfnvq1M7Q0MzO1tvSzcnO3OR0W1r85O7059/h59zQ0NbY2uL3dmpwb1pXUk5HSExDPj49PT9AR1BTT05RVl/x2MnFxsTEy87Kytvt8v92ZFhbWE9KSUxLTlBYZFpccHJ+49PMz9DQ0M/T0crLzszKz9nR1NrY3N/kZ1hbWlNLTU9PTk5VXVRKR0lGREtOWGBjaWJeXmju5Xr09Ol0cd/c7P56bGBj8PPj4+jp/XJ26eVnWFpZVlrw1tPh5+rv79fOyMLDvru9vr++xdXc5u9vZ214XUlBPT4/RENISURDRklKVmdfXGVvffPb1NLU2uP5ZmRhWlhMTExLTFBgXVFPV2Z449DHwsrS2OLj3dzRz9TZ2tjb3+F6am31493UzsvGyc7N1M3HyMrO0NPg7+/ub1REPj05ODo8P0NCRUdKVmbi087HxMLBwMDH1fZaVVBUYWJfWU1HRUZMUlpaXF5aZ+TOys/Oy8fExb68u77DxMvR09LS0+v8ZlxcXmxnWlNLTFZdeefY3OZnWVxeWFdcWVZVWFj88mpiVlFXWGf36nRbW1dVWm7e0tnX0dPV08zM1/VcVldUUVhoYV9aWF9tfefT0NPQycW/vby+w8vNz8/OzM3Z3vhgWV5iY1xPSktHREhKRkRISU9Yad/Nzc3Mzs3Nz9LT1/ZfXE9OUVBMTk5LTVh639fW1Njh29TQz9LP1Nnb49XLzt3b4e3z7OPRytHZ3uTm2dDOzNHe2d3o2tfqaFxMSEhHRUhFQkA+P0ROXG7v6+PR0s/Hyd3h7GhkXF538GBaXF9cXG335flbYn555d3ifuzn4drV1MjEy87PzMrJy8vLz9vZ393R1ORmamxyeP3gztDc5+VvXWBZTUhEQkhEQklNS0lNV2b79uXU2uHs8Hrl1tTY2eX24e3o3ftlXlhZWFthd3FhaHRtauTV0NHQzcnEv7y6vMPIy87U2dfQ2P9mamFcY21rXVNOUk9PT0tFQEBDSExSXG9tZXF6dvPa1elzYV5cUlpiVklGS1JYXGPw3ufm1M/Qz8rL0tjn3d/x7O5mWFlfcuXe2dHQ2t/W0c7Kw8PGxcbDxcjKzuFxaGtfV1JMTUk9Oz4/PkBERUVLVOzf3s/Lz9fY1Nzu/fjuY09OU05MS0xLS0tTZmJlbGtebPDp3M/LxsfMzcrHycbExsvOz8vQ4OLh/V1ebXN0bXDp+m9s5d7o6ftpU0tLTUlEQkQ/PD5BR09YYG5oZXT3aHh4a19dZOfidF9mX01MUVlXWVlhZVdWaGxgaW5vaWru0MrLzMfGzc7KyMrKycjM1d7Y4PD+cWFbZfvq+GZdXU1HSFFXT1ViYldPUFlXW2t5Y2Bm9P1fWFlcUUlMVlJSUltfWGN79O7r399tcPTc2+jk7GpcWWJxbubQy87MyMPHzMnIy9LQysfL09re919abWpfXVpWS0dISElIR0pGQUZNXGVt5Nzg39rR19zc4mxbXWNZTEhIQz09Q0pMT1dbWllc7d3Wy8jFyMrGxsjKy8rL19vc4d/xemxpeXvo3d3c2dze18/Ly9DV1etlZGdgW1dRSUQ/PkNCQ0pRW1553dzl7urj9Hvs5+/8al9XU09NUFBQV1hQUFNWVV5z7eLp4tza1s3GwL6+wMHAwsC/xMjKycvU3O5uXk5KTk9WW1xbVVJNUFRbbnxnYF1cYVtbXF1eWltbVVFUUUlGSU1OTk5PT0xOWGt67eHm6HFfeOnd2NLN0NLY4N/h5+Dg39XMxsjN0NTQz9TNy8rKy8/T09LU2dja2ehwbWRdV1NQTk1JR0dFRkxdZm7p4eXi4OfseWxkZl9dV01IRD8/QENHS1BVW1dYYfHd0s7MycTCxMPDxcfKzs/Q0s7LztfZ2tfX1tLW5PT86tvY0s/Z3u/38HBsZ2BfWlJSUE1OUU5KTFRgcfPxcV1ZVlhdYml2c1tWVlVTUU5PTElJSk5WVlleXmf72tXPysbCwb+9vL6+v8LGyszN0NTV1tvsfnt5ff/r19/k3NjQztff5N/c7W5oYm/2cWZZVltfYWBdW1lWUk5OUldUTUpKSk1RW2JeVFBUXFtZaHr37Obd2NDO0dfd5NvPycXDwcLDxsfGwb2+wMbKycjIzdXg6H1iX2v2+WVUU1JPTU9TWlpZXmp65Nrg9GddVE1KSkpLTUxMSEZGRENCQ0VITFBYYGdpcnbl28/Iwb+/vr6+v8DAwMLDw8PHzMzMzM7V3N7g2NHPy8vKzc7IyMnN1eJwW1pYUk9JRUA8PDw+QkRHSktIQ0dKUFFTVFZZWmNgZF1RTklJTllod//j3+DSzcjGx8fMzMfBvr28vcDEx8jHx8rO0NPX2dba83BnX15cXmNkYFdNS0dBP0JJSEpMTU1NT09QT05OTE1NTExNUVRZYGt47ez46uLe5N3Qz8/P0dPRz9DRzsvLyszQ1tbQztDOztHc6Onrc2BWUlZWWVpcV1dQTE1MT1dbXFlVT01RWVpUUlNRVVJXZGBgaWtramVw/nZ3ee92/t7c3/BuaHXx5NfR09HO1NDS1dDQz9HV1tnR0dng621ocmppXlRLS0xOUVhfYl9cXmhhXW/y5vJqa2tgWlxlYVtlZmdvcHj18fDp4t7a2uPf3+Dc2dnY2eT1+P1mVlJPTlJTT1JSTlJZZW5qavPzcfLh6v1s/fV58fDh4/ZnZ19dZffn5N/l2t/d0c/Qz87R2+bg4OLi3eHsbm/q3eN4bHJwVFFRTUpFRUZFS1BbZ1pTW2VdXGzr93hxeHBeYF1bYlxbW1hhZ/rr7u7d19fNycjLycjHy83Ky8zO1NTd49vZz9fg4e5sWFxoXlZZVlRMR0dGRUBCQkBESEpOTElLSkpMVVxdXlxdVVBVXWFpbGtoaO/h18/R0MzIysnExsfHycvP0s/S1trq/mZ56NfOz9bY2NjZ1tTi82diWk9NSUVBPz49PT9ARUNAQkRCQ0ZJTk5NUFlaXmpvfvLo3N3XzMjBv76+wMLAwMLEyMvLzM/NzM7U09LX2tXOzc/Y3ep5Y2ZmX11TUU5JSUpLTEdJSURDRElLSUhJS0dER0tMSUZJSUdNWWhtZvTo7ufSx8XFw8DAw8TBwMTJycnLzMzNzNHZ2eHw/u3i6unt/f5nbej0ZltdXl5y7unicF5kYVpWX11TTktNT0xPXFRKTltUVvbj29bg3NnZ2tjT1dbY1tDS1M/O1Nna2uDWzc/Oz9nd2uHs6Ol0aGRpa2JoZ19UUlFRVlpfXl9cU1VSUFZgcnJr+Ovh2NPN0NXU0tHSzcrL0Njg3/pkbHNlWlx7bl9u9+h4aW9rb23f1dzseHv9ZWNvb2pbYHZgX/75dV1WWFNQWnBxZl5cbXBeafDl397Yz87Jwr6+wcPDxsbDwsXL0dbX4PDj3uV4e+fxc/ns8l5RT0tHR0pLSkhERkdCQkdHSEhNWlldeuXh9XXu8Xbt3NnY5P3p5e3k3d3b2MzKzMnHyMnKzM3S0M3Ky87OzczO19nc8f176vFmcHl1aV1bVEtLTlBNTE5PTklISkpHR0pPS0xTWl1ZV1hWT1p92NPW0M7Q08zIxsnGwcLGxL6+w8fFwsjOzMvJzc/Q2efp3t3n8e72a1tdXl9TTk1MRkNER0hEREVHQ0RFRkNCREhKSU5VVFZaaHlq/N3R0c7HxszMysnGx8jGxsnMy8nO0tDOy83Ozs/X2dTe7+jsd2ZfX1pbWVxlYV1eY3VtXF1dWFJSUEdFSkhJS0tLS0xMU11YX3X36vH54dzf2tDN2NrS1tbT0tDPz9HMy8zLzMvKzM/Q2OPw/l1OVVVSUE9OTU1MTVpdVVZRUFFTVFdVUVVkWVRmbXb+6+Pa2ujc0Nnf3d7e4+Ho5e1pbvhlc+nz7evu5t/p7t7g9nJrbXJqamBcW1hXWFln9nt77+rq4HpncGpbWl1YXF5aWVhTVVtXUlr17+fZ1c3Mzc/MzM3LzM7OzdPZ5OPi2+Tj1trr6efl/G9nXVpOS0xMR0dGREZDQUVISUpOUFVaW19XVVRaXVJOUU1OWVdZZnD73dPTy8PDw8K/v8LCxMXHzc7P2dvW19zm697e4evg5vbrfWZTS0lIR0ZBQ0I/QkVJTE9NT1NYXG1tYF5mcWRXXllQTEpPUVdZZvfe3NjOzs/LxsfIxcLAxcfGx8nP09LV0M7Pz9DW0tPY3dzZfWNjWVFLSUdDQUBAQUFERERFR0ZHR0I/REdBRkhNTUxRXWpjYmvu3NrTycjLysbGy8zExMjIx8fNz83P1dbX1tvf2tzZ4Oj5a2VcX2FeYF1YW1tf9Onx7H5nXmRubHBhWlROSENDRUVFRUhIR01TVlpeYW1839XPzc/MztDNzMnHycrPzs7PysjKzs/P1NrX2d/sfW5fX1lTVldVVlddXV5rXFNOUFRNTE1OTE1LRkdHR0xVVFhr9t/Z0c7O0dPOztfc2Nfe4OLj7u316tzf6Oj5aW576O9uX2RjWVhfeGxuaGBiefPf08/T1tjV0dTS32lnemhaX2lobm5fUVthbeLV1dfS0tjaztHZ3t7a4+vu8uXm/mpeW158+3VwZmNlZ3L5XVlTUV9cUVpcWVtYXmNaXGlfZV5eZWFkZFpSTk5YX2Rree/n4NLMx8PCwsTDw8DAw8TEyc/U1tPa5O/ue3l8/nJnXFtXTkxLUU1ISkxIQ0JFSEtPWmRy+3ry63r67XVvZ3rtaGR1bWNeaW1z7OfXzc3MysjFxsLAxMXEwcPIycjM1N7c3d7d2tLR1trb3N/w72dZV05SUEpMTEdBQURDRkJHTE5IQkZFREZNS0pNTlddV1pgdX7g19fPzcjHw8K+v7+/vr7CxsrJyMvMztPoeOPj5ebg4+97c3VpXl9lXVZTVl5wZWVsZF9scG92du90XlpZWldPUk9MSEdLUFhbb+zn6tnV0dHOzc7KxsTExsnJ09PX19ng297Z1tvd2t/o6N3d6ePg39/0c3hsa2l0ZmJdX2hjVlZlXFNPTk5PTlVVUk9PUU9RXmhy+efY1NPYz8zOzs3O0NLNysrLzM3Y92BmbX5ve21eW05SU1teWlpbVVld/ePg5fZxbnfp3OHW1c7N0tTT1tnf7HdvcWv87Ofu7fHn497d2dje09XY0dnf5X1nXmVz/HtnX1xgZW1yaVxXTU1MS05UW1dPS0xMVFxja3VcU09ZYWhlbfxrc2/+5tzc6u/7+u3m4dvSzM/T0s/LysbAwsTFzdLb09jk7Pvu919UTk1LSEpHR0I9PTw6PD5BREdPUE9PTVZeaGtn9/Z85+vb0tTY3unp8+Lf1M7a4+zg3drUzsvIy8nJyMDAwcTL0Nvd2NTKy8/W6m1ZWV5hWU9LSUE9Pj4+PDw9Pj9AQUZFQUA9PDw/QURHSlRYT1BaZWtr6NrV0s/Ix8zMycXCwLy6u7y+vb7DxcPJ0NPP1c7N0tDecV9hZWBmYU9MR0JBQEBERUQ/QURJTUtMS0tIRktNT1xod2JYVlhdZubW1d3Z0dbNy8zKzcrLys3MxcHFyMzMztbOy87X2c7O0tLT1dzj+WpXTU9TT0pKSEdDQ0hGRENGSEhJSU5MRUtMS0lObfNnXmV2cnbb1+ZtcXbt39TJx8rLx8bJzMjFw83Y0dPd3Nzd/WNncO/979ja92RiWktITE5NR0lSTlJTVldOTlhuaV/l2OF3cX3r8t3T1Nff083P087O2u7069/Y1szJzNbb2vFqbujhbmJzbFxgZWpcXHl27uzg0tXvcGdbTkdFR0ZCQ0dFQkJEQj5ARElKS1749vzn2tXVzsjHx8jFwcDCwcHFy9DW19rXz87a6fJsV01OUE1KTU9NTVVaVlNWWl1fZezb5mVfWUxGQkBDQkJHVFdYbHNjY/ri2NfXycDJzMTBxcS/vr6/wL68vb28v8nQ29/pfnv38nBhYVdPTEtRUk1LVmtZXGNaU1JdaVpOUFpTS0tLQjw4ODk4OTs+QkxPWVxcZebV2tfKxMbIwsLEwb+5ubm5ube5ube6wMbO2vJdXmhcT1BQTk1KT1ZWVVJRT09WZVhRVF3xYFZTWVlYV1BOSUZGRUZJRklKU3l5aGd33dPSy8jHxL6/vr/Avry6ubi4ubq7vMDL1+D8WFBPTU1KTVZUT1FaY2F74ettaufnX05JSkhGRURDQkBDRUJBRkhISU5XVVRe59vf59/e3dfMysXBw7+/wMDAw8S/vb/FzM3IzN78ZlRPTk9OUVBOUFNNTlNQVWB1bltQWV5cU1BMSk5danjn7O3o5une5/fy39fa3+HXz8/RztPW1svHxcLCxcXMzcrR2s7Kz9PZ2tbW9mVaUE5OTEtOVlpXWlBOTUxJTkxKUEpFR0pBPkRHR1BYYXPq3tTQ08zMz8/S1dji2c7LycrLycnGyMK/xcLDyM/W3OPa4P1uZWBna/tzWlZPRkNAQkdLTk1STkxOUk5OU1RTT1JaY1ZWefdnfO3az8jBvr7BwsPFyszT0s7MxsHDxsPDx8fJyc7X2t3jempseGlhX1tgYG91ZlpPTUlBPj9AP0JGR0RCRUBDSUhCPj5ARExXX3bo3tjOysXDxMXDx8vLzMvOy8nIx8bDv77DwL7Fy+Lr7v5++up77fV1fnr6a1hOSktJQkVIRUVGSk1KSU9RSlVjbVVIS0pJSVRj6NrWzsvNzNDRztLS0M3My8bGwsHAwMC/xsG8vcbP0O9oW15q8unr4+Dd5m9mZ1dMRUJAQUI/Pj8+PT8/PT9JT0hAQEE/QERITE1d7t/V0dDT2N7c4eXcz8vKycTDwL/AxL+6u8PPztfmaV9eW1xfbu7p5nNz+29YUU1MTEdITU1OV1hOSlVq8VFES0NBPUJNUU9ad+La2tvQz9HU0NDT1c/Mz8zFwL/Bw7y8vcfl6WhXUFJXXVdVWWNpcnNo/HxhVlddWFBPS0ZDSElKQUFNSkc/Ozs7OztBSkpOXnzg0c7Q09bU29rf2NLb187MycXGxcfDwcPAy93jdFpQVVhVWVdfal5ga/NwWlBPTEhHSE1PT1tcUklKWlpYT0hCP0BDR0xRXWx+3tTLycfDwsrV08zLysjExsbGwsTFvsDCydnd8GltYGZeVE1PWWdoZWdbTUhLSklHQ0NDQUNDR0hIS0pEPz09PTw+QEA/RE5WbvfX0dHJx8nMycbBw8rHxMTCwsDHxcnIw9HP0trhePX3XVtcYnVlXFxnYFtVV05ISEtNTUxOVFdNUFVQTktNTEhCRUxMTlBXWVtr2tPKwsC+v8C+v768u7y9v8LBw8LDwcbKztDY69zZ3+H8d/J3eH3/dV5SS0pHSEtIRkA+Pj4+QUNCRkNGRkVFREhKSklLVVdn697e1snJyMbExb+9v8DEycjDyMnIzs7MyMPCxMfHydDX1NfY1Njd3edwb2teWE5MS0xLTVBMTU1QTk5MSkxQTUhLSUdMT1NcX/zez8nBvb/Av7++vb69vbzBw8TJycbEyMvN0NTV1MzJz9jY2tnb2NPW4GZbWE5OU1BNR0VDQUZHTFFPTUpIRENBQ0Y/PUFHSlVw8Ofa0szGwL+9u72/wMDExsjIzdfUy8zQzszM1dzk7d7Y1M7N1d3Z2d/c63ZlUE1PTE9YXl5UTkhNU1thX1xUTk1MR0hOUVZWaOXYyMG9vL7Bwb++vr6+wsXJzt7c0dfX3/Xv4trT0tjd4/l5+Ojp6/ZpYVtSTlFOS0ZAPT5CREdEREZFRkhMUFhYT1JUVltl/d7b2tzWy8fAvry8vsLHzNDV1dnl7Ojl3tXPzdHQ29nT1dDS1drqaV1bXllVU05TU09PTlFQTEc/QERHTE1RUE1OUFFXWV5jbezZzsjEwMHDxsnHwL29vr/Dzdbl7eDo7Oj03tTOycnIzNpwXFtr/PnybFVLSEZGR0NCRURCQ0pHRUM/PDk4OkFGSlRaTklKUVdfZfvZ1MvFv76+vsbT4fTl1c/O1Nre5/Dp3NbSzczLx8bIzdTjclJJTFNbXG92ZVRMTEtKSEhJRkRMT09MR0VAOzo8PkRNT1lbWl/v0srIxMO+vLi3uby/yNhwZHv13dfU0M7U08/KzM/S2t/f0dDdcF1OQTw8P0NIS05PTUJAQT8+PDw+Pj5DRkRCPzw4NztAR01VbNzS2M7Hx8fIyMfKy8nO1+R1W1JUa+nPysS9vL3AwsnP3O5zbGNu7mRZU05IQUNMVGRfXW9hWVROTEdFQ0RFS1lcTktKRURFTVr+2tfLw8PBwMLEys7V1M7MyMnQ19/n/X3p2MvHx8TFzMzZ7WNPSEI+P0JJS0ZHREM+PUNKTU1UWlRMS0tGQEJDQkhRYf1pXl5ZWlRg797TzsnHycvO093o6vPt5c/Ix8vO0cvM2NDJxcPEyM3bfGdWS0RAQUBCTFdTT05PVlFQXWVbV1tbWlRVW1NNTFFda97NycjLz87R2NfNzNDMy8rIzMzM0M/NysvNw8DBxMvMy9Le4tTb3d77c2lXTkY+PDo8Oz1DRUhCQ0ZHSEhKTklMT09WVVhbWFhabejdzMfDw8fKz9vudXlpYPPj2NDMycnNy8fCwcG+vr7BxcrT3et89H337ezv+PFwV09NSUlGRkpPU09NSEVHSkxPWFldb/fs3+L59OHXz8jBvb3BxsjN0c/T1tjY2M3MzcjFxMbEw8PBwcLDzNba819YTklGSEdJTU5SWFVPS0dEREVDRUZBREhHSU1RV19x7dnX0tDQ0dPT1Nfb19PS1uDU1t3Vz87LycrHx8XDwcHEx8fJy8zMzc/d5+j/Z1xjX1lQV11nbV1aXFpUUk9UUlVOTkxNVVdYYH7j1NLJyMnIy8vM0NDV3t7d0M7U2tnT19XNyMPCwr/Aw8LFxs3R2OLl7ezvaFhPTktJSkpJSktQWU1KSkpJSEhHSUtMUldWVFZidPHh4trV2c/N1djb4/J093Nt89zV09bY09DMx8XFw8PDwcTJzNLbemVtbGNudPbtcmReWFdbU1NeaGZmW1VUUk5OV1hVWl1m9+3g3d7c2tfZ3dzX09DS1dPY3Oj17OHf3NXY19DNztDSz9Pd2tnb6fv5b1lOS0lHQ0VLS0xOT0xDQEBEREZJSktKTVBNTUpJS0xPX+3l6uPa525qZWv8+tzY293Z1t3h5+Xl5dzNy87PztDieW569nZ95+X9eH1zZVdRUE1NVmBfVlJVU0tISk9ST05UTk1TVlJNTFRZWmPc1t/d3Nnd9+ze397f3eHp3d3Y2NnU0tPa09HW2OLl7nVdXl5dXFJUUlFRUU5OTk5JRkNFSUVGSEZDQkRKR0xNT09LS0tOUFRbXVhXV2ZycvT5dmtlZ3n/4trR0dbQy8nJzMrO3OT38fz16eXl6er79tzZ3vlrbvtwU01XZF5VTE9ZX11WTUtMTUpJTFh1Zltd6NXe6t/e2tbf4evm3+f5Y2N4cevez8jJztLMy87Q1+7h4Nnl7uDr9GljYFtWXF5hbVpRTUxIRktKSUtKTEpJTExLTUtMS09nfflxaGlyalhaaW5mXmludH744+Tb19nZ0cnGyMrKy8vU1tDOzc3MztPU1NLZ6+z8amBv8Ovs9G5kbF1fW1phXVhWXWVodWVjfHB+4trV2Njh7uHh9HJv9u/wb3Xf29XOzs/PzczJxcbKytLX1N3f7PDie3NpYmBYW11bW1dXXGJrWl1fVVROTVFNS09RUVFUXFxaXl9gXmt28ed66/FrbXJz93Rv7Onj5N3X187MzMrMy8jIx8XCxMjKzM7O0dbU3Ozu7+no4tzb4+DX19zg7XFsXllZYnhoam5hZXP25d/Z2t3d4eLi/Ht0amZZV11o593Y0tfV1tTU09PX1NnVztfW0NXd9Pvs/W9ubmZpe3Fu/PFqXVxcWldbUlFOSktJR0hHSk5PT1BZW27y8PVuZ2FXXV9cXF5ob2z02dXNyMTEw729vLq7u7u8vL29v8PFyNHc7Hl67eTf3t7Y2dvY3OvwcWtrXFpVVVdPSkdGRkRHSkxPTldbVFVUUU5RVVpl9N7d2dfV0tDOysnLz87NysjGw8nOz9DU2NXV0s/T0tPe6PZtZFtTTkpPUVBRTkpHRUNBQEVITUtNUE9TWFxVUE1OVVxWXF5ZW2n29+3c0MrEwr++vry5ubq8vLy9vb/Bx8/c3un2/PD26Oju3dvf4996al1cVk9NSEZDPjs7PDs7Pj9EQ0VLSUhMS0tMTFdne+PX19fb18/Q1NnV1NTRzs3OzMrP0dfY1NDOzcrNzc7T1d3j5G5fWFBOTk1NSkM/Pj4+PkBFTE5QUlFTUk9UUk9PUVFPTk5QVFJQVV5kbuDOyMnHw76/wb7BxcbJzNHi5u5rVFZbUk5WYGhgYWt1bmlwa15ZWldPSkhKQjw6Oz08PkdNVlJQT09TWV5jbXB58OTd2dnf7PDq3trW1dTT3Ont6ezq8vn46drU2NnP0+Fv+ujodmx+6f1rYFVUVVROSEhLTk5LTllbaW5uefTj4O79bmlqXlhXVVFRVlZPU1leZffY09fQzs7MztHg6flaUU1MR0JEREhLS1BYWl143tnV0M3Q1+H3ZFVNSURCQEdLRkVKUVleZmdtcd3Nx8XKzM/X2Njd8vXue2vy3uTy4eh+7urm2dHQztLO0dLV3t7o5ujm29vl4+D8c2xub2BiYVVPU09UU1loY2t94tne8OztfXJqaGBXWlhZTEtOSk9TXWlleeDY2NTR1dvc4+fscF5eWVJPUlNXWlhXV2Do2NDKzM/OztHS2ux8ZmVbUE5QUVZdXFtbV17h09TRzcjGyMfIzdXb3ODt6Oz77uvm5+jj39bQy8XAv7+/wMTJyMvR1tff5+9tcGBdYGNma2VdZWtoaWNgW1dfXmJoamldWlJTWFNLS05PUFFPT1RRVFhYWWz/7dfRzsrNz83T3N3U2+74b11TUk1NUVdn5tfVzMTCwb/AwsjO0drf9G5dUU1OU1NWWVxkX3jb1s3KyMbDw8fExsfKztHY3+Dm+vrw8P/o4drTzMzKysnJxsTHztbf6v1rcmBXUElKT1FQTExMSUtOSktMSklKTU5QV1lYYFxaYF1fXl51afj8ae/t6+n1eXzr3dLMztHQ19PS1NDV2uDo+nFfWE9LTExOUFhgZu/i0svOzszNzM3N1vJ1X1hRUVRXWGDw6N/a1svHx8K+v8PExcXDx8vW7H1qZlxpbGdtYHLl4+Xb09PQ0NPZ7PJwW1ZOSEI/Pj08PD5CRUdKTUtISk5ZYGN6bl5dbXRpc3R+b15ebHT54Oro3uHX1NjPzc7NzcvLx8rNzNDU0tbf6PRwXllTTUtPTUhHTVNc/OLd2tHPz8jGxcPJzNPc6XReYFxZV1VYXmdue+fZ0svHwsHAv8HAxMvS3nBcTUhLSUhFRERFQ0NKTmF6c+zs8PFuZ15PS0hERENEQ0ZIR0hJSUtPUVdaZW5q8+Ht9ffm3d3c3u/7cGX929fZ2t7j6OHi3tLM0dHT0dfi4+Db19ne4O77cGr49GtgXV1mbnBkaHz43tnX1dnYz9DSz9npfntgWWt1XWV9bvLq6+ro5+/t49nc3enx+15XUklGR0NBQkI/Pjw8QEdJTmXn3tbP19rZ4/91eG1VSUpHSk1JS0tKS05fcOLj69jb1M7f2tfi5Ork5HRvXl5dXWB5dP3v4NjU1drW1M/IyszJz9TW2NPX3ujs4uf5bWlaUk5NTVFOTVVf7tnY1tnLx9DMyNDc7GZdVk1JR0NCQEJHSklMTVBmdl5m9fPi3eb3a1tWVlNMTUxHRUZFSk1NT1JUcNnTz87Ozc3Q1tztemxxa15VU01ITlZVWWNybmv34OXs5uHa1djc3uXw7t7m7/H0/OPRzcnKysnLxsHAwMDHzczN1+t2Z19dXWlqZfz7/Ontc2deWlhfZXRvXldWXv1hVk5LS0pKSUdEQD4/REdGSlJj6tvRzcvJzdDJytbb7mpoWlJPS0xMSk9fZnfw5dfNysfDwsPHxsPHztz2ZFZMSUhJR0hLVl5lcnbo187Mx8PBxMnHxsrO2NnT1Nvg2+Pu7Pf53dfW29fP0dLLwLu6vsTCwcXO2G9dZV1ORD49PkBDQ0A9P0dPV1RVWV9meGpbWltfXFdST1JVU1VOTVFXXFtn+NnRzsvMy8jIx8fJz9nj4/liWlJSV1NXY3J3bfLe1tHV083KyMrO0+Lp+2tpY2pqXW5wcvDf1tXPzMfCv8LBwcjM09vnfXBfVVlfYmRq8OLX0M3JxsbIxsjKzNHY3vZpT0pLSUA+PTs8PDo5PD9BRUlHUF9ofOPX29/i6O5u/mRbX1BLTk5PUVRfZWnx29fMysnEwsPGwsTKzdTX4O11VVNXT05MS1BdYl9849HQzcXEw8HAwsXIyMvU2OZwbGFebGNfZHRsaPPk09HOzMzPy8jIyc7U3Ox3aVxXVE9MSUpMTExPU1thYG72a15xfHNdVVdNTk9KRkRKS0lNUVVXV1tdY11gcf1289PT5ODf5vPj4X5+dm5hXGj35efo3dbMz8vJzMzNzdTd4ejq731wa2v++n3u6unc39nMzc3JyMzOy83OztDW2+DudmpfW1pbXmna1NPU0dLVzcfL0NPmbGFcUkpEQj48PDo6Pj8/QkNAQURMVV/g19jSz8/Q0dXb4fRnYFJOS0lJSEhPVFdcX3D06Njb4N3g5Orw3NTd5OT1e2VmbVlXVFBXa19l7uDazsnIwLy9wMDBx8rN0fF7blxcZG1eWFlfWmXz7OXW1dPOzcvJx8bHys7d9XhqX1ZPR0VERU1RUFJUTk5OUFZVUUxEQ0JAQENEQ0ZLS09ZW1hYWFFPV15dYn3079/W1dvQztTY5+337fZfW1hUVWd79+vp7evn3ut7bVtYXGRu6+Lh29fV2NTPz87O0tPR09LPycrKycnMzMvQ2ulgU1JWWFlcXl9r9e7y7Nzh29bV1t3tfvRnXlteXE5LR0RDQ0M/PkBAQkVITFdw8uHd29rXz9nn/F9XTktLR0lIR0pOV2Z6enxrcfzu2tXY3dvZ2dPPz87O2t3c4OtuYF1WUEtLV3N14tnb0s3KycjExsvNzs7Uz87T2OX+d/18bGFdW1tx4+TTy8vJx8fJxcXHztrfblhPS0tLS0hGRERFS05SVFVLR0pMUU9NUFZZXH5sXnF1aWl3/FpNTFVo5OdtYF1y3NDN2+5vdO/4fFtPVWZwcF9RTVt8+H1xdW717Ovl+H7o4NPLycTDxMTFyMjKzM/a39zb087R2N7f6vx6cPfr8OHp4OLl3t3f3Nrn39ba19fX3+La5eLX3+bo63dnWk1JRUE/Pj07Oz0+QEFGS1zg3d3a29ra59vS73FuXWlpW1tbaG5gX258cfDr3dXU1dnZ2N/m2NDY2dru8v9hV1RaXFBPVFJUYnXq2tvZ0s/KyMW/vb+/v8C9vcHK0dvje/3sdmt+8+rf3dzr3dvd2dPLx8nMz9jZ6GdrcGBeWFRXUE1MSUVGREBETVNWYWVWY3Fn8OV5Xl1XT1BPTUpKTEtNXPX6ee3l4une2t7Y2dbOz9v2e2NXV1dcZfXq+/Tw6Oju/Obe393c2NPOzs/S2Nzj49XO0NDV1tXV2t3g921u6ePi2dPR0czMy8jJztDO0dnc3dnW3/F3/PtmYGhlWk9MS05YUklGQ0FCQ0VISkxMT1phcezp6+55denb3Ol3b2ZsdF1faGlfV1dUWF9u+Xdxc3Dw5unp4OV8/O3c19jY5vNuWl1bXF1YWmDu3tnX2NHNysjDv8DBw8TGytHe8nZcWFVRVFlYXGdfZW997ODUy8nJycnDwsnMztDX2tzldVxPSUhIQ0JCQ0RFRUVGS0hGR0xXXGBYVltUVlteXFpZW2Nlb25eZ3V3ePvj6Obj4Njf7HduZFtjY11UVWRnbmtdWlZZX15r7PJxZX3d09bS0M7O0tHNycfJzNHS1+Hrev76amh86+PZ1tfU29jb6uLmfXhnZm5uY2djXV5m8+fu7PB2ZFpiXFxaUlBOTEhIRUhISUxOWFtkbHZ763l77H56aFxZWFFNTE1TTEpPVltt7vHp8/3f4N/V2N/m/O3m6nb6a1NUVFlhX1ldWF9ofvT47era18zKzc3LyMvOzMzP2uXj+Hps/Or87+34+Hl18Pju2tXb1szHx8jKzNDb2973b1xVTURAPj07Ozw9Pj5ESUtUXmFsceba19jZ29rY7fV5dP5jXFhbX15fam15eeTX2eTz83dkWFRXV1hXW19hZGNt8vt5enTp29rVz9jc5fPj3+ni3drRztLSzs7N1tXP3N/i6u3p4ubk7Pf59Ofl4NjT0M/O09DNzc/Tz9LX4X5ram5kaVxXWFtZWFBISktKTEtISklHR0dIS01MU1dceN7U1tXX3dnU09TU09jX2t/v8O94ZGBwb3Xl3dvY2dnc3OLo+PFnUVdUUFhVVlhZW2Dp1tTY18/OzMfFwb6+wcfN1dbV2/Rtc2RkYl1eXWj4+fHf19LNzc3LzdbRz9jW193Y1tnl+XBuW1JRT05IRkVERUZITE9SVF1kbO/q493a2OX6c3x4d2BWTklFSk1RXFxm/Obn3drX0tPNy8rHyc/a4OxtZGJcW1paXGh6/eLa0dPU19vb29vpd/t6cO/s3tnf4+LZ3NrY1NDb3dnT09be4On66drd3eN97+/o5vB6eu/17PD89nt2d2lXSkZGRkZISk5LTEpNVVVeU1FgX273+nBubm3639nq7vTv4d7Y3/vjdlt383heV1hOTk9VWF5fX2/t5vX2497c1t7b2Nvj2dLnfXhbXG7j6fDd18/Nx8HCxs/RztLY5/BfUEhCRUxLSlBe7d7c19DQzMjHw8TIyMjP4/ppW11aVk5JRT48PUBBQ0tMS09UWltdV09VUl5+7vttcHl+buvc6/huY2xofn1uZ1xaVmnu8ejj6uPa3djU3eb6ZWBeWldPSUZJS0tSW2Rv8+vy593V0MzHx8bBwMLEx9Hj73VnXWhsZ2Bta3bj2NTU29za3u9ybWtYT05OTlVhXl5r7uPa1dTd5vDvbVtZUkxHRkhDP0BAREA/RkxRXHLt29nUzMvMztPmfXlfUldeXFpiZGBxfPjw5N3e4uLb3Ov0Z11uZWBy8H165eHj3d3t7N7temv4+mRmdOvq5N/c19DV2NLT0tHQz87P0tvd2drpevb6cG336ujZ09DQy8jJyMjM1d/ta15TRz88Ojg5Oz0/QklMVG/s3trT1dva1tXc5+f7dXlhYWdeT05PVFddcfjf1dPX2tTX3Nvj/G9pW1ReYFdWVltfc+bV0M/X597T2e50+/X8fu3c2dfRzMnIyMrJy9bh6t/lb11UWVxUTlBe/nl87vPp19bPyMPByM3Mzs/R0tbk6m1q/2taXFZQUFJWVU9OTElMS0Q/Pj8/REpSW3fj2tHOxsPDw8XJzdHa6PNwXltRSkhISUxQXG9rb/rq5drQ0NHT2tzh4/VlXVRUUlNQTllWWPLVzcrGxMPFxsXLzs/V2uLme/3n6OjqfHP06OXc4Obme3v46N7f6P10dvbf3dzi5d3d2t3pdHl0YGJhWltVTkxPU1RTU1lbXmJp+ezd3tzZ7GxeWVZTUU5OT1Fdb/Hy9eTYzsnGxcvO0+j3clxSS0hIS05RWV1hWl165Nra1tXY1NTQ0tHX5efr+XJtb/7n7Ovo3c/T0MzO0NHW3uTi6XRjX1xgam58fv3t3NHPzs7T1drg6GhcUEpHRkVER0dEQUFHTVRXWnng4+DV0s/Mzc7Q0dXb3ODd5/v3bWpuZGtfVldWUE9RTU1MUFNXYWNp/PHp29LOysjN0t3i6GtaVVRPTExPVVdaZ3P+3dDJx8bDxMrKzNba4XtpblFKSEdMUFNWV2P13tnSyMjFx8nJ1M3X3drt/GVYUFxaTUhESU1OT0xHRUVHSUtMSUpOV1pTWFxgeNrR1dPOycjM1OXb1M/bampu73pVVWdvW1JUWF1ZU1hbYGBaWlxdVVReamtu7+jp8eHXzsrMz9Tb3uTZ0trf5f93bnVqXWBhW2B86ebs4N/q6/5rdGpeY2tpaW9ta2dscmzx3d7f4uLp8nh3ZVtYUE1LSUpLTU1NUE9PWGhv8efo5+7g1tne4Oh5aWNYXF1YUk1SXGx97+vr3dzf2tLS1tPX39jZ3O56ZVhZWl1dV15cUlZXWF9eX2d2+uXYzszOy8zPz9DT3dzd3dzx7epwXVZZWlNVXV5ea2rz39jR0tTU29jb5OPhd1lbWFRPS0pJSEpJR0hPU1ZibfPr9fXq5eHY1M7P0M7R2drc4e9maWRfY19dXFxfWlFQVFJPT1hnfPb88ujg1c/Pzs7Ky87NzNLc3uDh4t7o+3NqZ2dsanj9+H3y3uPw/vbu7d3b3+Hi7fLveWZeXF1ja/3v3dre5enj6Obc2djc2+N2bmltZl5aVVRQUU5QUUxKSEhOUFRZYffp4t7U0NHR0s3MyszT2ePtfP36+XZlX2NkYl9bWVVTVVpfbuzs7nhnZGh6+f1tcvr78vz66+7r4tnRzszMzMzPzs/Pzs7R2Nve3+v6dWZfWldZVFRbWFVVWFxs+ejc39za2Nvh6fVwX15rcHN7cWJZUlNWV1tbVFJQUlRTVVheX2R85N/Y0tTZ4ebi39/f6Oru7fVseXpzZF5r+vp7+m5kXF526uDa2dja2dfb4/N6Z1laYGdmbm5nXlxhY2X/6+nk3tnX1tTT0dTUzsrJysrQ3vD9bmdrZ19aVlxnbHZ2cGxleezy7ur2al5jbG50eXZ0a2ReV09KR0ZERUlLTVJdX2Pw3NPMx8bIy8zO0NPa4/htYF9obmxuXlBRVVdXW19fY2d0fPbs7fPw6OXf3uLf5Pf56+Tk5uXj3uPk4+zq7Xlva2l47+be3Ov98ezn4N3g6nptZWFmY11dZGvv3NfV09ne29bZ3eDf5vb7+3dsZ15UUk9OTk1PUE5JR0pLTVRdam1taXrt4N3g5eji2tjU0NHZ4dvX2Nrd4PZzamVcWldPUVZaZGtz/Pt+bXr0+fns2tnb293l7e1+dm9tenvu4eDe8Pjm3NbTzc3P1dra3+D0ZVpSUVJVXWFjXV5mbvx4evT4eWpqZWpraHjr397e29zg8HdsYlxVUU5NTEtNUFZfZGp69ejd0s7O1t7h6vDs4+Pm7Pf9enZyaFxYVlNTV1tkbW3w397i3uDk6+rk7Pv39f548+3v7ufk5+jp6evt7e3s8P57d2xo/e559+fq6ebl5/htamhkefjw4OXl3tnd4OL6bmZiZV9oc2tlam9qaW5ta2RgW1dTTk9OTlBSVFNWXmlucO3s5t3g3t/k3+Li39nZ2dfY1dHQ0dTd8W9rd25gYFxbW1xmZGNuaWv88Ojh3Nvc393d9GtlYGRjX2FlZGZmZGhrb3R19efd2dbV19nd4+n1+fb56en07vn66uvv7ev27/j79ffu8vD99+/+cF1WV1JRTk1LSk1QUE9VXVlcbX377uDe3Nja293a293a2NLT0tPX2NbZ6/N5Y2NkX11ZXWNfW15hZGJfX2hw9enp5uTg4+zu7/T//e3u7ezn4+Hh39/g4uzx83x2aWJoZmVmXVtmdPjn2dTR0M3MztLY52RUUE1MTk9PUFVdY234+u7h4OPf3uj4bl1YVVVYW15idPzu6uzs5N7e3d3m5O3+fP94//f68et2bGBcX19kY21xcv3s6vp2dl9fY2lt9+Pc2tra3ODY2NvW0s/T2+Pp+PL7aWxuaXl47uTi3NbZ4ufudGpfW1hWWVZUWWFicf50bGdkbXf46uDb1dra193f3+fv8HtrXlxiXlxjYF1pe/zz6d/c3NnZ6XNiWFBNTUtLTlJUWnDt6uDd4+Pc3+jn6fB9/Xl4cHz48eXe3tfR09XV0NDS1Nnn+HFhXmFjZmhvc3lrbXFoZ2xjaXr5fXr6/mRfbGRganP139XOzc3Nz9XT2N/e4/RyX1ZRU1lbXmZqbnl9fHdvePpuaWliWVRPTU1OUFRYXWJt7On69/n97+nh3NbQ0tfW1t7v93hlX19gXFxeXmj77+fg3t3f4t3i4N/m6Ony/H13bGRfZ3Jvfunr7/J7YltaVVZUWlxn6ubk3dze4N3a2tXQ0M/OzczMzdHZ4+jve2VgW1paV15hZGRbWVROS0xMSUpKS01QVVJQV1ph/NnQzcvLzc/P1eHvcmJjaWtu9+/l39rX2NjZ4e377vR8+nx4c3BxZV1bVVVUUVRZWVhXWllaXFxgav7p5dzU1Nra2Nzn4dnU0s3MzcnHycrLztTd6PR4bWplZGxrbHZtYVpWWFpXWl1ZXF1dXF5ZVVNOUFZbd35+9XVvdG5nanf36ePd3eDa2+jt5/p4b2NjYnDt5trU0tPb4PplWU9LSElJS1NXWFhbXFxgbvHf1M/Pzc3R2N7qe/nv5eDf293a09PQ0NLc5e12cHRuY15w9e/n7HppY2NeYHPv6uLb1tje6WxaUE1SWGJqZXR2cGpreHf6+fj0+ex+aW9wam9sYl5bWVhZYG36597g5efs9PRzaWVeXVxfaG1iWFNLTE1NU1to9+Xd1Nff4N3Z29va3d3e4t7Xzs7NztHW29nb29rc3uHk8mZeWVRSVFlXW2RsfPHr8HhkX11ibnn16uPn8e33++3r4eHe2+Hf2tTT0M3Q1+hsXlJLR0hOU1VbYF5cXWJiYmZiYF1cXFdTUUtGQ0VKTlVbauve2dTOzc3Mzc3N0NHY3NfQzsnGyczV3u15a2VkbvT/+/VwaF9VVVlZV1RXYGVibn1ubWpnd/Dj2tfT09ve29rc3ODj4+1xcPnr4+DX1Njf8W9fVlFQVFteXmhpZ29wcGtlYl5cYGZlamJaV1RPTE5OT1BUXV5id/ns2dXU0dHR0M/NysnJyc7R2fpmX1paX2r78u7q7e3i4Ojq7HFiX15mZF9eW19fXmFoamzv5erl3drd4dvg8X50Z2dv9t/a19TV1Nfd4ut69eDk6+vv/XZpdn1uYllUU09PU1RSUlFUV1RSUE1NT09XaX3z6+LY2Nrc2tnW0szGxcjKzdLZ72xhWllbXGFkYmRnZm336Ob0eXxvb25mYmFeXF9eX15eYW745trUzc7Rz87U2ej273j16erm6vb+/2hjaGZtd/fq5Obe4u/n7GpdV1RTUVNYWFdcXF5fXF5lYF1kcfzt6OHm59/j6urr6N7Uz8/Pzs/Q093s+W9aUlhcWl1fY2BfaGxkXl1dX2tqaGtmZ11aXV5fYF5p++Xb09DSz9LT0Njb3N3f3+jm4Ojo6PT7bGNjW1thanHs6e3j4eP9YmBcWVdaWFZaXV9fX2NdXWhmbe7a1dXX1dfc3O1wevjx6+Dd3d3b19vf4+/4bmZscHpybmNeZWtqY15bW19mYl5kYVxaXm1rZF5cXGBw9ujh5ubk29vm7ujf5/Lk3dnX3OXn63xlX2FfXmr659/h393h/3J+ffxtZWFZWFNSVFVVUldaWV927PHo2tvX09ne4t7b19bS09TPztHU1Nff6/V99PPseGhnXFpTT01LTU9WVFJUU1dYWmV393x0dfXl39ze3N/e2uPx+fr17uzt7Obh2+Dl4+z4bGRgXl9ia2doevP9YVtbXmVtY1tgX1xgZ2VfWVdZV1xoe+ng493Szc/Z29bX1tHOz8/R09DT2dzh6vN2/+7o7P5scf1uX1tYVlNVWlZRVlNUVltdYG1ta27p397Y19zZ29/ycG12b33/a2317fTz6+r5//x1b3pzbG9qZnn28WdeYWZhYmBbXl5aXFxfWVBQUk9TXmh97vHm2tvc5uPV1NbOy8vLy83P1Nbd6u32cXjs7n5xdft4bW5oZWljXmNsZ2dudGlfYWJfXWJu/Ovn5Nva3+bt+Hl9+vDy//nw5ODk7ezq9XhufvtybWpob3RvbmFYU09NTUxNV1pbXl9gXltaWlppevfi3t/b293d4ubd3d3d3NfQ0tPT1tfa3+H0fvf4d3hxde7w/G5nZWJaXGdt+OTn6uz4dWhiZ15kee/n5OHh3eDm5eTa3N/e3+Dk4ep8bXv4ffxwZGFlY2JjbHf39v1yaWBWTlFTVFlfXFRSUk1MTUtMUl9p/OPe3Nvd3d3W09TW19TT0tLX29zY2dvb4O3y6u717eXm7nNkXFdUU1Fcb/jn6u/493ZoYl5fZXrl6ujl5+Xq6ODc19XW2NLP0NDV297Z2uHufF5TT1RQUlVXV1JTUVFVVlVXZvb093tuX11aVVNRT1JbZXjy7uLo+ejg2dbb3t7h3t3f39rc2tri4e188PH35tza3e1tYldUV1xicvLt8m9xdG1xY1pcaXzt3tjZ3+Xm8vbq5ePe29va09HX3NvW1NLT2+t9d21rdv5rXlpXUE1RU1FVWWZsZF5bV1RUUU5NSkxQU1pic35ydvr46dnZ1tDSzsvLy87P0Nje4/hmcm9haH3p9WpsZlhZW1hg/vDq7+vr//Xn+GxoY2V49urh4Nrf6ePn7Ofu8+Ha1tHU1dbf4t7k5Ot3cHFrav31eF5WV1JUV1heYnX79vr3cmJiXlxZV1VOTk9PU15hXF5cYWps9uff1dHPzczMztPa29/r5/v58HT683x3ZlleX1dZaPjn5uXe3uDd6PD6Yl1jZG16/u7wffX6e/Z8b3vo29TRzs3R09jd3Nzh5Obs6+nq92ddWlNRUVJUVFlgX2NpY19fWFRVV1RPTlNZXWt99Ojq7ujt6OHe18/U0c7S1Njb3OPr9/1wdXFjY1xeY11cWFdXWWN57/no4OPe3drc4fdhZGx+7eXh7fft7vpve3Bx6dzU0s3N1Njb2NjX3Hx7fXRrY19YU1JSUU9TWFxgZGdsbndtYGBfXl1WT1BWW1tcZ3P+/X777Obh1tTU0M7P0NbZ19na3vF2+er0amFqbWduaF5gXFphYnJ9e/Ls+evb2uV7a2xv9eh+bf5zbXJsamtob/j63NHR09bV1dfX1Njr8O3r7GtpaV5cWFFTV1FPVFZfYmNrYl9gXllVU05PU1ZWTVdnYmn+5uPe2dPP0s3Nzs7S1dLP1d/f3uDn7vlkanlwfHBoY15YVVlaaW9qb27z3+Lv/fn89vfr7Hz26+3n3+nv5vL56d3b3eDa29/X2N3e3+LofWxrWlVZT09ZVFJVVVxdZnpwYWxnXWVeWFdTVlVOT1JQVFxk/uPn4dvc1dPQ0NXb2tvc1Nje2NnY2+Hi7Hd5fGx+8nBtbGdrbPfybWlxd/nj3eTl497zcfN8bWZpdWx0bmxpbPbp3NjX19jS0dTU1tfb2+f28XhoXVhZV1RSVVVVWFhdV1BRT09OT1FQUVRXT1BVVVpec+7p2dja1c/Nz87O0tfZ19rc297j4+Hp+3R8aV9nbnJvbmVfZGRgY2xqa/Xk3dfW0tPX2+Xu+f16fPZ8/f5zbHHq5+nj297l3eXk3+Ph8OvqfWZrbltaWFhfWlxeX2pjWFhbVVFVVVpcWGBbWllQT1FXWWZxfObr3tXT0dHU19vj4uXq4N7f2NrY1+Dr7PJ3cGht+nNwc21rYFxcXWJ29evc2dvZ297ldmlsdndwb25ua27v4NjZ3NfT1dPX2NfZ29nT193qenVoXFVUWFVTVlxaV1NPTk5NTk9OUVBNT1lTT1FUWV9t7u7f2tnRzMvLztHV2+Ld3ePd3dnW1NTa6/F8aGduZHn9aWphW15bVlpncuvi3dPZ19be4uh8eu/2+Ot79vNt9+bf2+Hl3t3c297f2Nza1t3h7HBuZVtYWlhXWVZaXF5bVFFXV1ZYWVVYWlZVUlJUUE9SV11sc27u29bQzc3W3d/h4NzW1tPPz8/R1NXja2ZzaWdtbXBmYmhgXVtZY3T349zd1tXe4OLt8vxsaWl3e2RoevHp49rf4uTb2dzW1tbU09LX1dje8GtmZG1lWFZTVFZUUk5OTE1QUFBNUFFNTk1WWFJTU1heenFx5t/SzszLz9DT2tvW1NTQ1NbU2dfb9GlaWFpZWVlaWVtZXGBcaX7v3tjTzszOz9Pa2d7p73d1fGlodXPu3+Tj5PHv5+Xi5+fi6fDu7untc3BtYmt8bWZkZm14aWhiXVxbXlxYWVhQTk9OVFdSTk1RVVVYXW7559nY1tXY4N7b3tvT0tLU1dPW2eH7amVeXV1dZWhlZGBnb33s29na09DP1dbW3+zp9WReXVJUWFpq8OHe49zb3tvU1tnY19LW3Nrg7+nvdHz4evhrX19fYFlRUlRRVVZRUE1MTUpLT09SWlVQU1VZXGN839LNzs/O0NjW2NnW0tHT2Nnc4+rxbF9hXllUVVlcXl1ZW2Jq/uTd1tbSz9PSz9LW3+r7aVpXVVZfZ+7c3drd5d3c3dvc4t7l7+zw9fhrbXxwefH9cm1ndn1yeGVeZV9cW1xVUU9MTlBUV09OS0hMUFJZaPTe2tfU1NXW2trY1tPT19jf3tjk+e79efppZV9fY1xaX2Vo/Off2dvV1Nra3N7Z23dlX1xaU1NZX2745+LZ29nV19PR09HT3uDn7efteP7z7uju9/1vaF5dXlxYXV1WVVBSUUxMTU5PUlFOTEpMTE1WXm7s4tvY2NTS09HP08/O0NLX09ri4O58ffhuY11gbF9gaWFhanHy6N/c3NrX2NrU2ODnbG10ZmNibHj7+uTe39nc3dbY29ni7PZm/fVqb/hu9up68Xl78Wdo8vxu/2tnbVtcVk5RT0xQTktNTElLSklNTVFbWW3t7NnW187Mzc3Q19TZ29nc3t3h5+Hr7O5y8/9t6+zw5+746+Ph4uTj3ebm5fx8Z15mYF5mamt1bHLp4drW0c/OztDT2t3l6fJxbnh2//768vn1emxuaF9fYFxcV1ZWUE1NT05OS0pMS05OTVJVVldWWGpv+9vV1c7NzMzU1dfb1tff29zl5O3/9W96fGVl9vT76fHj3Obe39/Y3drX2uLn6Onsc2Z4d3lqW2h3dvjo3NPU3N7l7fxnc/l4ZG/p7PB79enq4O3u3eTze/ru+G9jXVZPT0xLSklHRElMSktMTU9OTU5WXWV73dLNzM3P0NLa29nY1Nfb1dTb3unu5Ofxferk8PPg2Nvb3Oje4Pj/ffh5ZGj8+2xmZ2JgX15caers38/Mzc/R2Nnc7Ojk4ur27eTl9HV2eHp+9Px5dmRjbmtqZVtRT09LS0tJR0VJS0xQT1JQUlZaXmru6t/W09DQ0dbc3t3f4N7c6Ofn6uV2evX/8XTw7ejg3tfTz9DW0tzr4OXr6Ozz5t/0531dZmFbWWJ28uXk2tvb2urxcGv16ufk3uDY4nDteHf9/nrn3e/n5H7m5PRxXlNMT01JSUhHR0lHR0pKTElJTVhfZ/zt3tPR0dDQ3t7Z29ne2NrV2e3h5+zd83nv3+fm2ejfztHX1tvw/3dsYFtoYm55c+D+dPhbW13uaPnZ69XO1dDe4Ol5efne9OXX3uX3+Ghhalxle/N4+f5z7PV7elpeVFRLS0xDSUpGSkhKTE1MSlpXXv5869rQ1dbS3dzY2eHg4OHd5/D8ZvVrYvvx3uLf4Orc1c/PzdDZ0tnf63VvbPNteeft4H1ebHJsafbw69jb1dfe3eL3cHrq5+nc2efs6XttZ2lhbOf2d3De4nDk7Xp1Z1ZPVEpFRkZIR0VFREZEREZKT1JabtvW2tXb1trh39HQ3tnO0dba2u9t9PZu5NXc5trY3dvO0tvO0t7e0Hxb+VtTcGxj8O1beftRceNl59Pc087c1db03dp45dfr5N7c325u91xb8V9f6PxjaObsbGzpbljzXUtPT0JAUEpBS0xFSkpFUFxOat1t3M7v39X36Nje1NDq2c/k3+b3+WNt6nrkzeLv193f2MvO3tbJ1+rN4Fp68VRY5HFZaGZQV2xp5N1v3c7z3c5w99VyeNbo187639RrcetubWF+1O150G1f1uhmauPoW1lfTEZMRUFGSUZCSEs+RU9KVGVv9+fV4n3g4Wfj2N7Wz8vV183kfdJ2V+Df5dzV0+35ztxnzMz818fhaN/fWFjuZFro4lNV/WVQ+NP4dsvPaNXMbmbP3lveyuLezeRf4exXXOxeYd/vbPPnc2n7eVl032BYalRETVFBQVZPPktbQUBeWkRi2Glozd9X7c9dWsvQbM7C3t7I5V/d21X9zeHtzNHpzcrm2sfW3cvL39rWZWHj+lJ82lZQdltNefBYfszvbNHiW2vcXWvQ3fnMyOff0vlf5fhZ6tZuZtjoXujbXmLfY1fg50pYcUdCWlA/TFg+PVJFPVJuSFPS8l/U11VwzHJfx8p+y8D4d8nhUN3RW/jD2m3HyP3LwvDewtb+y8xj689hVNrqTuvQTkzUb0vfzVx7wtpSz9JKX81mU8jPXczIWnfIdkzW407g0FBZ0F9J0uxEdthJV9VOSN9RPVxdPExvPTtnRjpidj9dylNVyO1K1s1O9sLna8HPTtbHUFzJYE7IzlTPv3ncvdVwv8dpyMBm3sJhV8t0StXaRVzWTVLNak7MzVjeylNY0V9L2tVY3Md7acjaXdDYTvbKX1fL+kzV2Uhl1U5Q1GBJ2+dGU29CRWVKPE1KOUhZP0PsX0nh203zzV5by9dkyMdg1cZsY8r4TNXVV9/Kcd/B0HrJynHOxPzfwttmzNpO3NJRXNdXS9zoS3vPX2TL7FDa4E1r2F9wyNBr1Mn+68npX9HTXuPMX2TQbU50cEtY4VtR3PRPbG1FTG1GQFVMPklVQEFYUEp08lFq2Wpp19xtzsxy58zxX9fiU+fRWmPL5F3LxnXcxOL2x87yzcTi4MnmXNXWVmXbWlDkdE712Vpt0HpS4uhRatVgaMjWas/LbujM/W/N1F7ezF5c1G9LX2pJWONZU9/1UWjxTE5ySj9RUD5IVj4/U01GY+xNW9RuWtDPaNbJevrQ51rr7E9l0G5Z0M9d18hy6cXRc8vD4tvC0G7PzWXwy3BT4dxSXeRbVdzmT+zOVFXQfE3fzlv2yuZgzc1U7ct8+cbYW9LMWWjVWEvteEtk1VdW0HZIbeRMSmlMPUxcPz1PRzxOaURM3G1N39Fj3sLgY8zOUvDQU07T4VfZzWb0xNFb1cXn38LPbcnDfuTE5GLNzlFp0lpQ2fhIbc5TVdJ7VdvZUGjRfF/QzmPjxnxZ1d9X1Mbt78nRX+bOVU/Ud0Zp10tO1WpFZtxNRfVVO053PTxfRjlMZkJI2HRL4MxZYsLWWs3IZ2vOckfpz1FcyORPzMdf5cHXaMXEadi+2mDGyWLbwPhQz9dNac5ZRt/ZSFvL/FHX0U1eyPVO0MlYYsfqTN7OUffE5F3HxV11xmtO3udGVdFWSdzcS1rSWkRjXD5FZEM5TFE6P2ROQW7dTFrO6FfOyWTnw+dU1dxJWNBuU8/LZuHB2/vExHrcw9jtx8rv3cXV/MvQXHjVW1DqZUpq3ldgzdtb3dFTWs//VNXOaOrL6VTl4Fhp0eZszM1w4M/+VfNgSFnzVE/ibUx+31JR8U1BUlI8Pkw+Ok5YRlbjXFHe3VnqyuNf08tk+NFdSfvuS2TPfV3MyvTOwNjswsnmx77W3cbU5MTF/OLL+1XndEZTe1JW1Ndi29NYWtX1U9/SXHLK2GDY21Nm0fxjzM132Mr5ctHtS2HbVVXbdU5o61Bp3lVHWlE9Pkk9O0lIQVV1TFPkYVHo2W3ny/Ngz9FTXdpXTd3kU/TI6PDGyejNwtnawcrmzMj79MfTftDYVmXfU0RZVkZd2WNmytFa6dBsY9ToWeXTa/XM+Vnd2lr4z+92zdNh5c5+X9l7TfzjTlDvXEpr9k1Te04/TEo4PlBDQFxcSmPYYVvR2Vzq0GRqzexS7t1TXNt9VeXbatvG4OzFzN/Fvs7MvtB3z8vl3cnkY9DjTWX4S0Z1ek5r2G1w099Z2sxgWd51UtnbT2fPa03Y1FrhyuN6zddb285cX9HhVPrmSlDcWEVuZkNLXEA7S0Q6SFY9RvRSS9reWuzM/1vV31zj4FNlzu1W49Jj+MfXeMjI+c++z9a+xN/LyGLtxeVU0tVf9dhZUPVcTX7gWGfM2mzNyPnmyP5Tz9JZ88t+W8vUUefJYWrF30/X2FJt1WVU2fxMbXFJTt9PQ2xgQVBcPz5aTDpIZENG63VW1c5q5ct4W9X4UXT0TVrXX0vk4V7uy35nzddsycHTzrvHeMfGbejK7V7O0Wrdz1xa219LdPBMd877fMvPXurUWl/U9FfY2F3uzPhY1ddn49JqZtXlVe3VX3PdY1ntYUxmZkdKYE9AUFA9RlU/PFNRQVTfYFrU317ZzWrxy+xX3dxb799ba83gaM7OXu7L4HfHx+rLweXvxtBZ+9NeatLrXdrgU2/fZFDx/V/S0+7VynFmzuVpz81t6cbcYNDSWG/Q/FLm8U5ed1RQ73BMZ/BOVu9bTG9aSVxmSUZeT0NTTkBMZ0pL2O5R8NVaZc7fXtjVVWDdW01tZlB722X/1uli2NLz1cfY1sHI2sPE7tzI33XO0Wzoy/xgz+hRcd9aYNj7Xe3pWHbP5GPNyf7cyeJwy9tb2s5kXthtTXjvTFjmTkveck5k6lhX/lFLV1ZBSFlHQFBOP0tlTUrlYEZ21VpoydlqysVl9MlgTdrfVePMZHjS62XT1WLfzezmxsvo0czs38nfXNfVW/3O6nHV707ozlte0fVS591f2svn4cPJ4czMfXvO31vc11FT51FGZ1lETmRKTe1hSuzZT2HWYkxyXUZZZklJY01DXnNLUepUS+7qVebJ5vbKz2rl5k5b21tS19pOds5rY8viT9rG7uHBzdvEyeHKx//xyttn1c5kbtddVNt1SWzuS1LlX1XVzWvYvtX8yM5c28b3ds77U3zqTFX3SkVmXUdf6kxl2F1Z2XdIXGtJSmRJPlZXPUxmR0t0Tknb/E7gx93iwMv4ztZX+c1fXs/5Ud/XV3bOaVPb3VnfyOvgwtXcxM1e2cph+cnjV9jbT+rOW1XU9k3m1ln3yODmv8Xdzcdz78jdXNXfTlrmS0f8Tj1QWD9L+01M3u5V4NFUXtZbTedqQ1RwQ0p7TUt3YUhh4VRk1W11xs9g0c1OZ9JTTtn8RnHSUmjOdFLd3lfaxu7XvcrRvsDczMXg2MXdbc7dTG7TUVLaVEXp7Epfz2NnyNblw8xo08pj3sV5YMr4S97hRlP3QkTtUkLv+Ep7105W11RH515BXmo+RmRAP29PP3DsR27PW1/G0m3Dw27VxF5XzvRQ3eNOd91RXdtXTeR3Ud3RaNnB3ePEznvL0PHIynrOzljwyl9Zy/RN1NZN68xm7MPZ3sDRbs7ZVt/TXfXVVU74VkNbVD9NV0BP305N0ndO1udQ29ZObdRMTuhKRX1XQW/zRGzdR1/OWWjD23DG6FHTeUTx5Uhu0UxgzFhU0mhSzdpdxsdzycDozsB65MD5ZcTdWc/nS9nYSunXSWbRTVfIY1bD023CxmLQyU/4xWTww2hTz1lD61c+bmo/bN1HZdBMVNBQSthcQfxoPVX8PUfrREXcUUXOcUXN2UzKvmjMvF54xVNPzGhQzm5Jz+1F2uJD/NBL5sFc9L7kcL/VVsXSSMzIVdLEVXu/bl6/2VLM6E7MzU/Mv17QvmzfwFRXyGNWxm1J1mg9aWI7WV46UOhCTs1QTMxWRc1kQNrsP2nbP1jVRlTUTE7RUkfRX0jO207JxVPXzEle1klVzE1IzVxJyOtKzs9O2MNg0L7007vX5MDcVcfhTsfRTNLPTNnLTeXITFvLTkzGdE7B0lfFyFTYyE3iw1Z3xVxPz1pF3F1A62I/Y+pHXONOV/dGSXZLSm1QRGtdQ1vnTVreVVnXalfW3mjMy+zJzFna0k1011Vg2lZa2FlZ2VpT3OdY3NJr2sro687tcdn6a9nc89fc78/P3dPS6d3a5eHe5urP1NvP0unf9Vtp5llo51tm4WJRZVVKW1dPWFRRXnFaW/hdWmNTWF9aWWJbUmlhY/JtYPT1X2zvXnTm/enS1/bd9lNpYFVmbFti7PV77m7u2N7l2tbh3NPZ2dbi3tfb393g3t/u9fHn4eXq4uDo3t757Ofr4Nrb3tbQ5vTl5+3f53Lo5Hf5+19bZWpiY1pTVFVNSUpLTlBOUlhUVVROUVNRVWZpYG/o3+vr29/Z1Nja1dDc7en2Zmd6YV93cmlzbF1gaW/67/vw6er9eHdoceve2tTS0tPY3NPVztba3t3W3tTS1tXSz9HQ1uDe5mtveWhtZ2BcZ3NfWV5WVF5fZF9aWFdPTU1LUllaXGR+/WdeXF1dW2r0cWx67P3t/HDr3+Xy5d74a2BZXWNdXmRlZ252+/P+6ePZ2tff3tfndfX8b/fe2tjPzdTT2+zx6enn5/B76+p13unp29PT1dHj3OR66era2vngd/rsYOt5X/16eHFtYU9QSkRAQUdJTU5PbF1VX1NPUVVgbOtu8ODf1+nX0dnM39rZ8+BlaHlnbnh6bF9qaG9nZW3u43x56WVfa1lTVltp7dzY0NDNydvV0NPL1s/Y2s/k2tDc2dTP0dfc7uj1X2Jt5HD68k9u9lxUZW1dcPldaGZXT0pLSUZNT1JfXWtgW1plWVt9+vrt2txx4+D98tzm7+HfZGNhVFhUYWVdaWNhaG7ybPXm09rj3uPsd2t5XWN1a3zd1trXz9rf29bW1dLX2dna6eTy6OPf6trT5erlfW7o2+fd1udv6OFwd+fk7+XubV9bU0pFQ0NEQUhJTE1OTklMUE9Qau313s/W3tPR19PO0NDP1N7pfmVhZmZgbGVnYmVjW2psbuPxZfppWVhiV1BZZFvq3OLZ0dLPyczJwcnHxcnMy87X2eLd19ri5el6cGFodmp99HNnaGtVWGljXfvn/Wr6YE9ZVUpNTU1PVFddVUtRVE1PWWD94NvZ1tXS1eLf2t3h5nx2cmhdWFVUW2FSYWRra/Xr997O1/Dg+G31b2ddWHzc/Hbk4d/j5P7e0NPPz87K0tHV2ut34e/v5PP97uf1eN7X5eve6Nz2YfN2/tzv9t7sa11aT0hIQ0JGRUtKSEZGSEBFSERTbO7VzszMxcbNzcrOzdTq5Nzj62lWW1pYVVlWTVZdXG108+T2d1xkYF9dS01gX2x28t/Z2N3QzczLxsnFwMnHxM7f1Nb06HhpbW38a2Rt+HtkaO5lWGdXVmpwfenf5un5bWpnTUlSTExXVEhOUkZHS01OUF9y6NTKzNHPzNbaz9hleO5sX2FkUFFQTldUYPVgXvzd5NnO2Onb3fdtXFlaVmhgYOzi6ezk2djNzMnJy8jMzMrO1tfe4GRiemhv8mr54uX97+b7+Xxnbmxe8eDj3dHg+N9aSElLRkFMTEdPR0ZIQEhBRVRTevDPycvCxMPIzNHc3dvs7O5z/F5eXU9TWE5XW11cet7p2tbs4PVXWVJST1tVV+tr69rb1tvIzc+9zL+90LvMyr5nvUvl40XZR9tKbFz2ZephbWRP4knjTdVp4s/ry/bfZlFcTE1OS1NMU1JTTU5KSFBMVF9559zN0tXG39LYWtBZ9N9Nz0LjWE36R+RL6VrkdtPfydTQyerOU9lIXVdMY0xmXGPqaure2c3UyczKysTJyMbPzdznbGJ7Wlz6VN7xZ8tU2HdgzkPKVOrafcppzPrZUmpHWkBSTkRNP/I7VURBTUBWSFLtVdTS1cfJxcrJ0NLb3ePpfmdpYl5PVU5eT1drV+xs3dJu381N3fBB0ENI2zvWSlDBP8L+37phttXBwsy40sDIxM3N/NNddFlTXUnrUttbbFxoaF9pX+ll3erp7dfW+PlkXmFIW2E8dFBB2DxQaTzOPFbdPL9H0cpLuFq//ubITtZX51hw7uZM5Ev5Xk7RS8ljyN/N1ePLZc5PcWZI5T9TUkTdTV/pWdDh68TvysP3u9fPvdzEy2zH61DDQ9jcR7pH289EvkdvzD28T+nHP75G2uA/xDxjVDrXNFdSOdY030VL3j3SSd7lcsvqx9HGz8zJ88to2+Ne3fDxblVdXktwVlnmV9r5WttqXNVE4m89yTtsZjrIQH3OQ7phzbxUs+3EulezXb68TbNIyds8vTnSXUXBOslNUtc/0Erw9mzVXNftz27U/fndSt9DXVFC4z1cUEDaPPdbP8g9z2xKvEm96Ou/UclW3ntf2GfTZNpa4FVX603VVdnaV8pTzd5Ox0TdVz/JOPdQPso5y1thxla+9svNzsfgxc/A1sLQ2MxazFXk7GDGTs/mT8hA02lEwj/Hb0m+P8FaXclAzkdbTj9UPVBASklRSU5fTmtN111303y/4sjHd8Vq98lLztpQv0vc2ULXSFV5SlzdWFjVUO3xT95eTN9PT9tC5HhFxFHnxlO91ua6Y73CXbPwwr5ju2P8z2Ny3F9mzk7w50L5UUPaRlHKQ9PZSrxR8L1Ax+FIvTvz3jXFOFDlMsg6WuE3xEFq00O8UsrJULxByOVFuz7E5Uu7Rc/nSc5MV9FO2txKwkztzj/DQ2nUO8FBX+A8xj7s6EW9QMbST7VGvcVzs1+9v3e+597EXsrKT71O4887wD9P2Tm/QV7IPMBBeso7vD7U0Dy7N9tMO9Mw3T5K4jvKQt3kT71Nv9Hst0q6a+DCQrpKzdhPwj7QWFbYPM5HWtVAxD/g/T/JPstXWsxNxk3i91jZStBm09pfv1vGyXu398DAaLt9z8xlyv3dct5sWfE+6EtD4DrhUEbFRtrOSsRsa8Nw3sZy9dRFcWc4/UM+6jpUdzruYE7JV+TFW9nMTMvcTr9ZbcRHz+lIy01byE701k/K2knFYFHGRXDLRs7PQsZaP8A9T8o4zNxAu0huuETAw1i02uG1a9C7Vb/ESLv6Tb49bsw0yU08vzvnzjm9Wka7P9XLPLhaULw5z2E2yTZSZTjPP2hvSshMx9zdvVi77mS7RcLdTLhF6cs8w0hEwzrcaUG9P9rYQcNB5fxDy0bQbVvCRM1XVMc9yGJnwUPE1l3Abs3C/cPL8Mff2s/t1/LiXGjxQmxGS2A65EhV3UHEalu/XczKX7/c/8hg+3dNU0xNQVRLPXU/W19Aykzf0lO8U/vHTM71V8prZ9H7YNlgWt9Va9l0fdPQYdDaVtJgTNZqRthqSNpaS9xOStxRTdRcYMth2MbtycTOzMXMz8XM2cLTW77nTc5OSHZAROFDSc9KVcVP2MJIxNNEv3JLx0NSzTpZZjvrP0LUPmXcRcZ8b7lsz7tUzMxMwXBTw1Z2z0Xw3zvzXT/SR1rEP9fIQsRfUMY+7NBAz2RUx0fa2krKTHHOScty6sdawdLUxHy+7d3CXcTybcVO691F4UZFeDpiVEfWSdba9cb8wtDzwV7K7FPGSl97P35EP2c5UFE/2kb800zH+t7HWcvy489Wynve3FjIWGTSTer5Vc39XMniaM77b9pTZOhNVftSY3RMelxMb1JiV1XPbWrJ2NrG1sy+7M2+/cnBbMXLW9TdU2F4SktgRkx7Rk/ObFfG0VvL11TR7EzR9EfgaEJWVT1SUT1ndkfiyl7SwnzVxnJ7xF5hxl9Yyl5Yz1VP1lpH22FL2mlOz+lUzuRO5txJatFL7dNP3s9KZs9MTctQWb9T+L1i37tn8btV27xKz8VB0dxC0VdC2ElA1kVL0j/g0ku/1OC8asjFTsjvXMtL7vpEakRHSj5cQk/xR9ZeXMNQ1NNOwmxexVjrz1bezV/xyV16xlftylPozl5tyHNNzVdH3EtO3k9o6FD8U0bjSEfPTm7MZM/Z78fnzcpvwM3pvtrQyX7R7/7dWtpVTtZGZmBE20ptzU/K41PGV1rOUnnPXGHdSUvuPkd3QVjoVmfQ3WDL01LNz17d1277799oattabtdZb2X0ZkjXXknI7FLN8E3t9Uxg0V5cxedYyt1I3t1D68hN6cJXZL55Ur7xTbzvTb7qS8LdScvqSct8StdnSPVqSPLpVs/deMzj4OBl0vplyW5V4E5MUEZLR1NYSWh8S/jYUmXRdGbN4lXP21DNzE7TwFrpv2tzv2JOxXhKxN5BzOg82ng83+FC081E4dtFa3VJc95X7thd095eymzpxV/NynDF1/bC4WzH6WLNYVbPVE/kTU7gWVXaZlTddlXd91jV/v/TUOluROlMS+tKYuRMfdBSdc9R581S5NBP7M9c5c1i5st7585s8dFWbv1U01ZW1Ulv90fwZUvf3V3L0FjM3U3Y9FDW5k/k4Vfd31bj3lvU1mPQ7PXKW9HNXMzgZtV4ZdhoUeJbWNhY/dVQ6tZWcdprb87ua9D+UftsR1TvSkzdVEntZU1u71xh3vVc4dx63d3U2/rN2W3PzuvfzXl02F1Z+VpHXGRDV3RJY9ZlcdDwXv/pXFfc+FPs3GtX7NpTbdB6c9DP7s/E2+DL0F/ZyU1nyVpT2vRNbfJKXepKT+FRSt9rTtvUX+vO8W3kbl1faGVYaN5oT9rqQt7RSGXRYlXM1FrU01zazVRpy2JXz+Vb4udSW2lWUFVYT09Z/2d6x/VlvtdQ0c5VXc1dTs3sStzmRW/PSXXFVfy/3PnF3lfN2EfZykj0xU1exk9XyUtPylBLylZHzWRVymVgyXdX1ftM5e5L53dF2vw/9vM/d99H485Q0sBb+L5dV8JtTsXTU8jLTdLIRV/MSknbUUD+XkTa20fOy0vSzUb7y0poy0twyUpezEpT2FNox+3bus3jvdxgxV9Lz1tOynBLz+xD6OBCaN1AW9lCVMdUTcXcTcfLT87bTM/dStPVSd/RR2/XQV7SQmW+V3LBbWnQV13aTk/MXlDHfE7G+EXM5kPZ6kF75Uju21fOzFnKwkrkw0piwk1YyVlM02NBd3Y+ZsxO379g2b5WecROTcdmTcT0TcdhSsv1Rs3fRs7tSc3tSsvWS8/KSfHNSmLRTl/YSVPPTknRTkDcVkrK21fBy1DF0EzP3ErOz1LJzErYzEnt0Up320Jl2EFV109W12pY02VO0GtNzdhM2ctP7s5JattEZ89W7MHb5r/RaMjsStjpR9jQR2faSF3ZRmnWQmTPR1PKUVHGaF6/YlrBYEvE1kzM1UvPzkfczj5bzEFOx1VSxfVQx/xGzn0/3tJIe81JaMdNWsJWTML0Rs3gRdPPSs/ITNbESmbAVFHFWE3GXEnIWz3a9z501Eh4xlXmv1tgwl9LyNxKztJE3NBD4chJ+cNdWcbqTs3eSsvVSM7LQ3vHTFPKT0zNXErMbUHX5z33zUNuxFHtwVRuwmFPxtJLzMtH1ctI6slGXsZOS8lYQ9F2RdLdRNvNQ3jFSV3BUVTBaVzDb0rO5kHfy0jzxFr6wXNsxG9Oyd5E2c5BWc9ETdFITMlWSMbjSMvOTNDKUNPFTOjDSVnEWFXI/FTH6UvN4UDc1z5nzURdy0xWy1BMx3hFytVC2cxE68dGcsRJX8BPScVvScXcSsPaRMrOPtrIQnjDSm7ATVfBR0bFTT/KZkHK30LN0ULOxUbYv0xmw0xPxU1MwGNJwttHx8xIy8NH0sJD4cJBWcVGS8hPSsZfSMXtQM3WPuTOPu3KQXbGQV6+U1W76lS+30nD2kLI0j/TzEHtzUJcyEhWxE1Kw1dAzGxDx+FGx9FIycpH5slLXslMVMRVTsNaRcX2R8nTS83ORN/SPV/NP0zGTlDCUk69bla82k7FzknUzkXcykfqxU1rvl5cw2VPy19F2Vw/6HE8ceJAb81G779RZcBYUsN4V8X4TsjjR9TWSdnHUvnHWlvOUUvPX0fN20nTzEvkzUdnzEVNz0pPyFlIy2pGyt9LyMtOytdHzPJByF5ExVhZwk3xv0nIwke/1EXCSUvBPufKOsRoRrpIdb09xtk9u0VPvzjg4Tq/TEy9P8rEQrz0Sb1IW79E4sVE/dlC7M9J3s1KftBLVttQVNJrV8zZXdXOVnHKbVDb7ktq1VlV13xLZN1QV87UVW/MZ0js00pG0N1EZ8P/Scm9Ylm9wktbwnU/9L9kRdPEU0fNxVNOyMtJRs7QSUbY4j9F2OJASsvMTVXDxlFQyclVUsfDWkjly2FN3sXySmnNcUVW0uJJUM/OWlDYzWZN7stzSE/a60pP2NBTS/DQaE7hxtpWZdDaUU7t1mdTctbmWHbNzPZo0szxUWzedlRb3t1eWfDbe2Lnztb/ed7Z/V505mdRVmtsV1nl2O9s6NniYF/y6/dv/eR0WVvy7WtdcOZpVV3y5mtj39Po9N7X3ff63914Zmd3dltZaH5qWVlka1po+vZ8Z210alpbam50YXbr9ezg1dDX2NPW5ezo8PD5/e717v5+7efl5uPk53tq+P5sW1tgWlVTXGlmanXs8vfj4+vs6N3d4uvp8mxu83xtcvt1am56fv1+fG1l++54d/Po63d7d3Rra2hiYV9ja2JrbHvw6ex9ffxwZV5gYnJ1bnX8+PHh393f49/k6unm7v3w+HF+7/xze+3g3tza2d7d3d/qfHVgWlpbXV9qaXJwfPT9e3tyaXJ9d/1sanJpam588vpwcPx9++no8PPv5OXo4uLk7Ofl+HB68XJibW5mXFxgYFhebWRaXWVhW1tbZGNjaWpuevXt49zU0dDS1tne4eDd723u5u9+7urk39/c3uDl5uv2/21fWFdYUllfamNda352cXXs7e3h3uTu6/J4dm7+8/js7/J6+OvucmtuamZzcHz6+fT7cnDu9XhtbW9qaXRxcWtydG5lZWRdX2tdXGdwamNmc/f+8+Xb3NzZ1t3t6u5xZm3/9PTp6O7n3Nbc39fV1dzY19/4bm5gWllmZltcY2ZpcXVobXB9bW91bGFhYGhveuzo6e7v6+jmd/vv+/Pt6Onh4ebq9O50ev15cGxsdf5oXWdmYVZUV1JPU1VYVl5pZV9lbWJp7+3h187Nz8/S1dre7nJteOXg5eHb19na3tzb4+jn7fDu/mhdWVVWXV9aW1pebm5m+9/h6ufm4vL+fnJueu/o6enr9P3t/GhqcHJsam76/nb9/m1xcnNubXx6dXz6e29+efRvYF1ZV1dWWFxgX2lnYGRoZmpx5tre2tLa5erl8GxkfPHv39nY1dHPz9PVz9bZ2Nfa5uvubFlXXFlVU1VZWFhiX2R3//70endtZGRoan706eTr9Onk+3F87uvt39vj7OHg7vv0/GpeamhgYGx0ZV5leGddZlpRT05RUU9VYWFgaHZ1aWzu6ujYzc3Q09TV3u7q8/ro393f29PQ2dzU2ubn3+B6aX37X1tgXltZXlpWXGNbXGrx6uPd2drs+/j3+nzy5OL+evL6bmhqaGd98Pl8+/p0bG97fGdu/2peYnz8cHj37fbx6/dsaGZVTlNYV1dkZVxbaHNlZ3b68eTb29/j6Pr8fe7e19bY0tLPzMzO1tjV09vf4uf/aGhuamZtYVVVWV9YWFhbWl129n3//2Rnbn7p7PLt9Pnt4eRoeHlu7t7f2uf153VpeHDu/2diW15eYmVcZG16b2dwY1tXUlNVXFtgYGJiXnX09fP85tjb2tfQ1vZx6uLr3NHe3tfP1trX0Njj3tbi9XptZldWXXFtX2Jpa1pdaW1jZ3n9+uzd63rz3Oft397oePXla15seGJaZfn2e3TveGFgYHl5eu7teXvqXmbxfuVqb9/ke3X4aFlTW2NaVFlqZk5YbWJlXG7m79vf32hX+Xrs0MzY1dDN0dXOyNLWzczQ2dXobH1dbGpXXmFXVVNaV1VVbGFTTl99Ylxwe1hw2d508tnQ3mp+enNw49z519zhzU9c0uFWXNjf4ONWT2tkWlZeZfJqW/BtVFNrZVxOaeltaFdYd3vt/mRv6eDr7Nrb//bp1tLy4NDb3czNztLX1eLp2dpvXPl8+ltd721ebHX3X15qbmlhbvd4b2x+eGD96Hhr5t11+XP+/Fpk93Zh4HZiaXDpeFlu53tt6dvvaG58fV1kaXh2/Hd0dmZu7lxX+WljX1ZeYVhUbGtb5+b+cn36+Hbg6dvQz8zMzsnFyMrJytLW1dXf8uTe82Z7811WXmBZV19qXlpgXnNiWltUW1hVXF7/8PDx6O3v+m3v+Pnq39fp5uTu5nd3Z2JqavtuaWp3ZmdfXF1UVVpTVV5hXFlZW2NkX2ZbYmRqe3NyanLwb3B67f1x6N3a0dDRz87Lx8nMzc/P2trd7e35d/Ztfe5yb15q8OfheW5r8+luaGJvZE1UXl9cX3duWFtudF1hb+/n4Nvb+Pzy5vVqbH31aGx64fPn4t3han5lXl1ibWJlYGhdWFxaU1NVXF1XWF5dZ2pdWltjXlNi+e//2crLzsvEysrJx8fH0c/Z2vT+2PX78ffoXU5r9mty7vNnZPpuX15ZYVJLTFZUVV1rYGXa5Gtv2+jaz8fM0Nji2t/p9OTsXlxRVGPefnX59eHqUFl2W1Vad15UWU5VVmT/XnlmWXtuZXNj/Fp0alJZWlv2zs7QycfMz+TOytHW6drd+nNtd3hkXt/0YGVY4HZn59/x5OvoZlltZl9kb2JgWFRiX1JZWWxTVmts2dDg0PDf2u55VfBbV9f1zurP51zW3NPe2tziaNrnbmpf+15bWE1PYEpbY1hvWHBeU2pXXE5MVFp64NzUysvPysrT0M7N09XZz9PTbV91aOtfWVBRZFhwaGV4Z/1jY2pWTmBhVX5ZZ2piX193d2lrcGrj0MvM0sfP2tbu8tvw6d3n3uDtdvh8cu1q8nZgZFVkYFZcWl9bWF5aW1xncGhg+GFfeW1tbF9dXWBv4tjY0NLLy8/Qzc7M0dLYzsvl8Wx47OXw7Wxw/23y9Ov16fB7amdpVlBQUE9SXVZVX1tkXV1cWFZm6eXd2tfX5ebb5uLz9tra4ubs3d31fObXdPZ7cH1ea11jVE5PUk9STVJZWFNbZl9aVmReWlpcV1xh/ePm3NHS1c3Lx8vMyM7PzMzW1OPg3OLu5+ducXx0/mxc+2FuZGx9blpdV1ZmYmdna2JwdftqXGny9vDq29HW3dzle+31+3Nu+Ofr+W787HV6dnFbXWhvXlVeW1dYW1pbXFdVXFxt/Wxwa2Zoam1gWlhYX3T15dvd0s/Z1MzIzs3MzdLX2Nfn7+nj3/X46nZpaG10/vdx/Or8d3FtXVtdX15eaGFdZGRdW1dfXlxjfP7u5+Tm5N/j8PDm6fDu39/j5dra4ufk8nJqZWJbWVpZUlZZVlJMS1FOT1leWVlYW15UVVhXWlx68ObYzczLycTBwcTExMfIycnR1NnY3uHr/XlxZl5dXWJjX2VxZmRkXlpbXmZoX2loa2NjZ3Jna/P//HTq4ubt3trffvb0Zl9s93Bqeenp8/vn7GpdX1tSVFRVV1pYX11fWFpjZWpvdXBqZmRfXlpcWlxgY2rw5eTXzszOzMnLztLOztPZ0tLY5dra7Xf06nlnbftxZ3Tu8Xd6+3NtaXJtcF5ZY2JdXGJmZWBpa2trcXb47enf3+bvfXb+cHfy6vDu3tvf5+jn+l5dX1tSTlNWUlBZWlNPVV1ZVlxdWVVWV1hYVlpdY19u6drSz8nFxcTCxsnKx83Mzc/P3tXo+OtfanNdbVxXcGZiWmh7YF1kcntpcXp1Z19rbWFgdv90cH7w6O3q3ubp5OrzbmVpZWNkaXn7cPHq7O34/21iXmFgW1hYW11eXWpraGVeamldXmFeVFJWVVJNU1dVWmbs1tPNysnKy8fJzM3MzM7Oy83R293Z4/v1+XptanX2+Wt5+nRmX2pyZ2JjX15aWF9jW11pa25rdO3r9ejf4eX1+vtub3j99/327Ov97+Hv+Xx+cV5dZmZbVFReWVdhbmpcXF5hWlNWV1RRUFRXVVFRXGlq7tTOzs3KyMrKycjKzs3NzM7R0drj8Pb0/nR8/W9rc3NoX15lYlxhbG1hW2dvY15xcmdjXW94ePjm4+Tr7+fsdm1paWhodfX6+PLw7/Dy8f12dnFwbm1tamBaW2Jpd3r/+WlfYmdgWFRVU09OUE9MTFJbZnXh2NXRzszLyszLy87PzMvKztDP1Nva3eDj6erq9fh7amhiWlxhXF9cV1paX2RfYGdoYmBcYXpz8ubn4ens5u34/fvz+/365uXs6e71+Ht7bWFseHBnX15ZVFNaW15lbGpmX1lbW1dXTk5QTlFQUVtfbezo3tjW1M3NysjIx83RzsjKzc7N0N3a2uDj6uHm8PptZWJeX1pbX15fW19lamlwcmpkZmNgYGVq/uzx9vD3/HVzcm5uZmZsd/ns4+XtcHvzdGpodOzz/X53a15fZm9oZntuamRiZ1tZVVFPT1FOTE1QWV9t/ern3dnQzczLy8zOzcvJycjKycrMz9PX1tXX1dfj+XRsX1tbXFpUUlVVV1VZW2JdWWdrY1tjePx1fvTz8vft3ern7ff4fOjm5uHg5vl19m5nYWVy/WxhXl1WUVNYXVZbXmVbWVtgWlNSU1VQU1lfXmZ27e3u5tnT1c/Nzc7P0MzKy8zLzM3S09Pc3dvW2N7g6PxtamRcV1hcX1xdY25nYmR6cV9mc3lvcvrsc3N49HxxbHr7aGdtfXp87t7e3ubh8mllZ25wen38emxnamZlYFxdX2FtbFxbV1hST09TUU1OWl9dXm33cPbn2NXb2dPS1dPOy8nJycbIyMrMz9fZ0tPc3OTtemZfW1VWVVdWVlhcXFhgXWFcX2xuZG1tbGttdX33bm977/d8+uvv+unf3dve6+xuY2FwZl9lZWZeYWJfWllcX15lcG5cV1hYVlVWWl1YXGt6bHn57/Lz6tza3tzW0tfWz83OzszKys7Oz9Xd3Nnb4+Pf531oZWReWl5jY1pdY2ZfXmh3bl1l7u5nbH39amdtel9aXmhqXWR6+Pnz49rb3urqaVxkc2xiZXH+Z2htc2BaYnVmY21wXFRYWl1TUFdYV1hfcmhnavLseHbr3O713tfY2NTOy8vKx8TK0M/N1Nra1tjc3t/he2psamRgX2heWFVcY1xbaHJeYP7va2Nn+/tpbXtuYWJw/m1odPD2/uvV0t/v7H5iXl9hXFhab21iYWtoX2Ju7XBgXWBZVVZcVkxNWFtcXWF4d3Pz3ujr6+He397W1Nva1c3MzczJz9LR0NHX29bU3ePg3+9wanxvbWdhYVtVWmNhXFtja3Zz/fZ4a3v3cGZtc2VqbW50cWtyefro3t3i7H38cmRaXmRgXmp4aWprcXpvce/zbl9iYF1ZVlJPT09XWVhXYm57/ezl5/P25uHj5t3f3tvPzc3Nzs7P0dLV2NnX0dfa3N3o9Hj+8/xsZW5mYGFmYV1aX2NnZmNna25qbnB+cmRocnB0bGpoaHj66ufi6+bn531ta2VhXWRze3Bzd3737ff+bmtjZmNeWVVWUlRTWVhVWFxgbPTh5Ord3N7f3d7k8eTb2dbPzc7O0M3Oz9LX2djd4dnd7Xd9+HZlcPZ0X2hqaV5cYmFfXmRne2dnamtoam9qbm5tdmpjZmRtZW/z7Pfv6Op7ZnZ8Z1pkcGllZWf8/Hh79+5ubPp3W1lbXE9NUlxZVmBlbm175t3m6t/Z4e7q4+538N7X19POzNTSzczO1tXS197b2drs+O71a3b36e92dvDzYF1iZ1lUYf5wYGJ2al5j/fdnX2FgW1ZZY2VhZfPl7ezh3n1uefRwZXf2dmFu9fNubv75cXJ07mtWUlRTTk1RWlNQVmFjZ27p3OXn2tjd7vXpcWry1tTSzsnHysvKys/V29TV3ePZ4HFnbXtmZXf3bGVqcGNeX2VcWl9u/WpkZf95bW7s73drampcWl1ramtz6+He6OPm93Fod3FpdftnZG57cXFpc/V4dnf+ZFVPVFJOUlxlXllhcmx37+nx6e3m5Px0amlpcunZ2tTMysrLzMvM09va19va397pfW95fHj64+X+dXZ1ZmZgXlteZ3NoXl9nbmplaf5wXlldWlRXXmZgbPPk5evq6vhubHn96+bn5vz28P1sZXby/nJvbV5VUU9QTk1WXl9dYHN8ZWvz8/jt5ev1/vP+d+3i3M/NzcfGyMrMy8/a1dLZ5ePk6Xtobm5rb3L682todW5hYGJkY2NpaV1dYGJmZWn393JpamleWF5sa2nv4O/+9e54aWZsdfju5eXr+P99bGNgcXhqYmxnXFhWVlVYWmZ0cm9993xhb/H0+nLz7Xpv9/t49ODY1dDNycnMzs7P19vU093g4uXwfezl6e7w5+ft+3l6aV9iaWpgXWpdU1VcXlleYGVnaGlrYVtXWmht/O7p6v52+vxxeOvn593Z2OHy9PRxaG35a11jY1tVVFVSUVVaYGh1eHt4bGdocHVt/ez5bPvn6urf2dDPzcrLy8/S1dLW19jY3Or68fZ2/e/2/vrx7Ph4fW9jX2R7b2FeYl9YZWdlYmD56+3u9XRtYVxgZGRufHtsX2BjXl1nb/fu6+Pl5+14dHNqaG1xYVpbYF9eYF5fZnN7dXru9nhwa2l4+Xxza3Blafjv8Ozd1M/Ozs3P1NjZ1dHQ09ne5eTo5eXn5ePd4fDq7XhqbmdcW15pXFVXV1FVVlhcXmZ1e/56ZWNfXV1pdfr38O96c/Hx9+zq39re39zh7Hd1d2toX1taWFRYWVlYWl5dZWVldXBqcXR7/ujrfW9w+/jx6d3Z2tbPzc7R1Njc297Y1dfc2+Dm7O3z7Ojr5+bn7OjvdmJlZWRfXV5hWllhX2BqeXN3bHBxbHBdXFlbXWBmaWZkY2JfYnT8+u3f29nf4urs/Hn9emRdXV5gW15hbGlpaG1tb3JwbWVv+vVob3VpX15kam796N/c2dDPz9fa29rc2tnY19jT1dfa2djX3d7c2N3k8/P+Zl9eYFhSVlpSUFdhZWVjZGBeYl5cV1xgX19hanJtbXD8733t5ODo49zX2uTr6/xkY2JgW1tbV1JWV1tcWV1jaGdpZnJ4ef7o8ntu/Pdobujc293b2NvW0tLa3Nnd6Ofi3uDl3uHd4+be3uns39PW5O7w6HloZWReXV9mX2Zv+/P89n1qX1xXV1VYW1taV1ZeaVtZZ/T8envg3uPc2d3j5+fsbm1ucmt5am9qX2hwaF5hbXRhX3D1bmhq/W5fXGJcV2R07e/x5d7l3NvY2dnY19nh397a3N7a0NPX1tTV29nS1uDl7OptYV5cWldWVlpcXWJwa2lfZVpST1VUVFhbW1ZdZm9pfOPa29zb1tnd3dza5Ovv92xfXmluZ11haWBbWVtZW19kX2Rrc3FyfX1rY2NkaGZ67eDf3+Pa1t3e19TT1dfW3+jr6Pjv6uPi6ebh397b29nc4uLg7XhhYGViX2ZtcnRy9/J9a2dZV1VVVlJTVFBPV1tbXGvx6Off4d7d3+Lf297h6+36cGt9dnV6+vl1eWxlX2ppZWdtcG5qbm9lW1haWFhaZm9wd+/n3t/d2dbU0tDOz9rf3t3p5Nra3dzZ2dvY09XY2dfe6XhlXVtaXFpdX19udGpeZGNbU1NXVVBPVVhQUFliYF7539jb2dXR1t7a2dvj6uztbWVpbGZfZ352aWliWllfYmZdaf37bXn8dV5XXmFkX2v35u3x3Nbf3tnT09jW0Nfo6OfrdXjq4OXt5d7d397Uz9nY1NbnbGJqYFhdbXN78+3pdG5vZlpXVldSTU5PTUxOUllZXvve5ezl19bq5NbX4OPg3u5y+/T89e/m4+1+dW9lZl5qaWFrdGpeXl9bUk9VWlZaYXx7cfTf3d3Y0c7O0NLP1dzh3N3g49zX3N3b1djZ087Q19ve9mdbWVxWVlpoaW1qbWZeXF1aVlJUWlRQUFRPUFRfbHP53dna3NrW2dvb2Nrf7PTzempvfnt8dXdwaV1gWFhXWV1lZ25xZGVZW1pcV19eYm177u7v6dvY1NPQ0NHY19re4ubj5+zv5+Dh5+Hd2dvX1NDS197se2RlXmJnbn777fZuaWVgX1hXVVVPTEpJS0tOVFpdYWz69ffy5eng4N3Z29rf6evj5Obi3uDh7ubscW5jXVpbXGhsaFxaWlpUWFxaW1xjZmhhcf315N3Wz83O0dHT19fb2Nzb3N7a2d3Z1NTT1dTS09rndmxnXVlaX19dXGNgXFxfXFxaV1leV05NTU9PU1tlbvjr5+Xi3+Dh5uXi3Nzf6uj1/enn6eno6n5sa2VgWlZUVltdaGdgYGNtcGVpd25lanNxbXXu7Ozp3NXT19vV2N/i4uXq7ubm6Ofe3t7b2dLS09HW2t7u7e11Zm/+cmdndHZscW1oY1xZV1BKSUlJS0xRXF9ibX3+fvzx7fTo3drY29rW2uHd2tvc3d/m8vTt/WVaWFZUUFRYWFZWWV5cWF9qXFdbYWljZH7j39vSzs/R09HU1tbU0tje3Nba2NPW2d3a19vl6+fvcmVnaF5UV1xbWVtoa15eb3BuaF9bVE9NT1NXWWV4fX3r4un3/PDu6+ri4uPh3d3f5+fl7fv/8PN7enhrXVpdXFhXWmFjZWJsc21iZG5kXV9wcGt46OLg4Nza297k4t3a4d/e4OPd2dfY2dXU0tTW2dba3eLo8vX3bmpobnVsbHFrZGNkXVxWT05KSUhMT1FSV2BlaGdtb2596ubi29bSztDU1NTW3dvc3uPi3eTve2NbWFRUUVdYVVRXXFtdWltYWFlaX2Vw/ezd2tnV1dTa19rW0tTX2dTQ0tHS1dfb2t3b3efk4eHvfH1zZWZlZmdmZ2NiZWliYWFdV1hXUlJTV1hbYGRmdHJ0cv9+//L69e/h2tja2t3j5OHl6urv+PPx/nltZl5dXVtdXl5dW1xgYl9bXl5bXF5udX334Nzf5N7a3uPf3NjZ29jT0dfT1Nba29fX29vZ2Nve3ejz+PB7cntzcW5nXl1aVVJQUE5NTU1OTk9UWFlXXmBoZ2N56/Dq39re3dTT0tTS1tTW3dzV2uDp5/FoY21pWFhYW1NSVFNPT1BPUVFPVVxVWm3m5end1Nja1tPS1tTRztPT0M7Nz9fW093d3Nzo5d7e7vXz9/p0a21+bGhkaF1ZWmBZT1BVU01PUlZVWVlbX2NhbnttZfzf7PTs3OHo3NTa3tnW2t3d39/k6nR68n5rfHlmYGdfV1RWV1FTVFVUVFZaXFpfbfb8fOnX297a1tjY1tTW19TUz83Q2M/P1NjT0trk3dzv9+Ll/Ht1/WpqY1pYXVhSVFFMTE5MTE1SU1FVW1lZX2hvZ3Tn3+Hh4tnV1tzU0dfX1tLY2trd7vB2bWxuaV5gYmBaWlVQT1hTT1BUUE1QWFdba3X99uTe2NTS1tHOz9XT0NfW0M7T1M/P09TV2Nna3uzq6/t1/nJpaW5iXFtdXV1qYVtXV1RPT1BPUlZTVV5jXF1mamZ56+bz8ejl3tnZ29bV1dvS0Nrj3+Zyd/tza2hnYV9pYlxaXFdVWFpWVFRQTk9aWVtr+HB75tvZ3NfT0NPV1dDS2tvS0NLRzc3U1tPW3t7i7vr4a2VrbF9eZF5aXm5gXWJkWVRYV05OVFVQVl5bXV9eW2Z9/vTf2eDl2dne2dPQ09XW1tja4vDt8WtncWhgXl5cW15kXV1fWVZbXVZRUFFPU1ldZfXr+una2drX0dLY08/R0s/V2dTP0NHOzdTa1trh4+b+c3ZsYF9pYFldbGNhcXRmZl9YUFFRTU1PTkxSVldVWFlcY3Tz7+Ld3NrV1tfQztLSz87U1tbj/vHrdXX7b2JfYF5cYmFWVlpUT1ZZTklNVE5NWV5ebfPu5dfa2dfS0tTPzM/Sz87PzszLzM3N09nZ3evp+mtsbF1ZYGRcWGBoX19pZ19bWFVTVVFOUFNPT1piWFdjaWR039zf3Nfa29bV19fU19jU09rg5vVrePd3Z2tsYV5nbmRfXVpYW1RSV1dOTlJVUlVeZ2386+Td2djX0dHU1M/O1NPP1NnSzc7QztLb4d/l9Oz4bm1sZWJsfWZdbXplX2xoWVZaVlFPTktNT05QXGBZXGp6bvHe3eDd2Nrb2dnY1NPU09DY5OPle2347m9o/P5paG5jXl1YUlVXUE1SVUxLT1BNUFxkYHvh4dvSztDOzM3Oy8vP0s3O087LzNHU2OP19XNkZ2tjZ3p7aWhsYVxlbmBeZWBYWFpVUU5OTlJYV1hncGZt59zl5NzY3dvY3eDg4+LY1dnc2t7vfvptZGt5cG/892lfYV5YWl1YWFtYU1RXT05UWFZWYGx07t/a19DOz87MzNDOztfd2dfa1dDT2dzh93JzZWNte/nw5u1va3Z4anr7Zl1hXVVQUE1KTE5NUFlWV2V7dP/j3eXm2tje3t/r9ung4dvU2N3Z3PR96e11/ert+/h0XlpYVlVXWlRSVlROTlBPTVJYVVps/vng1tPQzMzLyMfLzczP2dnQ0trZ0tjg6fliXmJfXW1+b3P1dWBgbWRcZmxeWV5bU1JUUk9SV1Zcamtq+eXg4NfV29vW2+7x+W9u/fDt4d3h5OX7aXX5dGz86/N0dXZoYmRcWmBgW1pcWVFWXVdUXWBdZn318ePa2djOy83MzdHX2t3o593c4drS3vbw821odvn88uvs5uHufvrvc2NncF9UVFVOTE9PTlJWVVpmZGF26+zl19Xa29rnfPXr/nfr397b2N3q5Oh6fuXwbf/qdGJva1lWXVpSWFxUUVVWUVNaV1Nda15d/uXr4NLOzMjFysrIzNLT09nd2tjf5eZ9Yl9iXVxmb2Ni/+338PdvePH9am7/Y1pcXlhYXl5bW2JkZnB8cPve3N3a2eHt6O1oZnZrZXzo8PPm7Hh1+ftu/vV4fe31cHV+al1ncl9bZWhdXmFcW15eV1dfXFto/frp2M/PzcrMzc3O197b3N/f3un09XRiYm1nY2n6/PTf3ubm4uny7vZqYmhkWllZUk9TVFBSWl9ZW2tz/uXf49/e3+bl6PV1+Ozy6d/f4uXl5Ozp6nt2+fd+/nhoZmNlX1tdXFpcXVtcW1lZWVtaWV1gZHbo3dfQzcrJyMjMzc7V2Nrb3ubn+W5lY11YW1taYnr6+fXs6vLs7f92dHFqbG1iXV5eV1dgZWJjaW989urn5eTk5ufr83JsbW9tePLv8PN7ffb6d2txd/75fvf4/XZ4/XR0c3R7cGlpZ2FeW1dWV1hXW2NndOnf2dLNzM3OztDW2dnb3ODj6fD3cmdpaGBhdvPt5uPg3t7f5e/3/HJpbmxhWVlZVVNTVlZYWFxqcG557+fn6+3v8vr79/zu6ube3t7g3uHn7PP3efrvenb+eGxrZ2RhYmZgXmNfWVlaV1ZWVlRSW2lu+d/c2dLMysrKyczO0NbZ19rk6+38amRkXFVZXl9oc354+PHt6+rpeHB8bWx6dGNfZmFdXWZlYm53fvDq7fTo5/dy+fZlZGlpZW7w+fjt8fv7+Xhy/Xx4/u3s+evo9nr27Xdv/n5zbWdeXFtVUlJSUFhlbnD65N/d1tDQ09LR19rZ3N3b3ufo5fB7c3VsY277+O3o4+Lq6+fo7PxraHBkXV5bV1JTV1VXXmJlbHnx6e7q6PT9ffrz+nR2/3t97+Hd5ubh5u7z8Pd6dHJ7e35+b3BrYWNkY2BfYFxaW11aVldVV11o/une29rUz8/PzMzQ0tTV3N7c4uz19XtpaWNdXVxfY3l4c/vw7fvw6fRza3B0cGtpaF5cXl9ma3D87ero4OHi5Ojt+f10bGliXVpeY2dueX53c/b0/n3/enP96+jq5uHn9f1++vt7d3BrZV1cXlpVVVhcXWV88PHq4t3a19bX2tva3ODq7Onu+/Tw8/v3+m9ueP7u5uDk5t3f5+nv/HBzcGNgYFtUVllaXmVnaHL6/fjq6v17+v9zdH50a2tjZXT6/P3r5+zo3+f87u9teOvq+Pfs9nNwdGpqbmFcXVxXVVtcV1hlZ2fw6fDk2dbZ1dDU1tPU29nX5O7o7Hhsfn1nZm5gXGdnX2zv9Xfv5fd58PJsd/V0aGlpX191fnH55ufk3eHs4t7pe3d6Y19oY1pdX11bX2Rkb/f0fPzvdm95cm/w3uDo4Nzi5+fsfvPsc2JlZGBfYmJcXmtubXR9+Orh5enn4N/n4uLp4uTu/ffz8/Du6vd6fH51cHvu4t/f3dzb3u3u+m1ramBZWVxeX2FpaG7+fH3/fvX8/ntvbX72dXV1cnX8/Xb+6uHl5+Dp7/1vZ2Vx/v3z8Ozv6uV9amhnX1pZWFleYF9ga3b88Ovt69/b3N/d2trZ29zc3d7r9fF7evbxeGtybmVhXVthbW5t++fh4+Li6u/s8X15cmlp+uv+/ebi6vXu7Ozpfmxsa2NeZWdgXmFmYF5hZ2t2/XN78/VsaG5ud+vk49/b3N3Y2+bn63ZhYWhhYGZpXl9pZmd1eW966+92/OfyffPv8Ofh7vTo5e3o3d7z9+5+cGtvefLo7Obe2t7k3uj/eXdqYWNgXWFtamJ0e2Zkbnp6+n1tbHh6aW34cW/983lu7ujs6ufu+uz3ZWNua2R36+vt5+Tx7+x9bmxiV1VdX1xdbWxpendu+eXq8uTe5ufc3eTi4Obp4+z58ejwd+7qemlpX1dZXl1ed/V77N3e5NzZ5O3r9HB78f128Ojz9+frdXzt/W92d2VfZ15bYGNZWmBeXGd5d3z4+H15fW1t+e7379/e3drX3OHb3vP79GhdZmZdXGZpXV5iX2F0emxv/n5ucezv/Onj7fHi4ePf4Ono4uX4enRpZ3B1e+zo6erl3uLi3+f+cXlrZm5oYmV2bV9rdmtpenptevxyanZzaWv9dmNt/X147unv7Ofvc3R4aml1fnrx6+7u5+n3+PN7ZGRsZl5fZGNnamVnbWxufu7u9u/m5+bf3+Hi5uzz7evx9vD5/fHydGxrZF9gbWtpfPX29Obf5Obn6vny6vP69fv/+O7y/vrvfWx3eGxmZ2hqbGppYl9fW11kY2Jod/38//j5++7w8err8O/j4eHe3eHr5ut4dXdlXWBoX11gZmBfa2xobm1ma/Hr7OLc6nXu5PH46Ov78Ozt7eftcHrr7fbt7n577+3w59/ucvLrd3P5d2lmaGhtfHBjde5+cPv9aWhwfHN+821ibnFkaX5waHjr8/zs6nvx3+x+7+52bvPseH7q/Gn98m5nbGNcXmtiXGltXmn5d2198/js3drd2dfn/eTj+Hz6dml383568v5kcup7aHv0bG/t6/3u4Pdy6Od7fefucP/p7X7r5/vw5ftre/1nafT7ZWd9ZlliZFteZWJlfe//e+nk7+ne7Xrv8m5z6+x18N/w997hdW9uYWBnaFxbbm9eZnpmYGz+ffTc2eLh2uXv4+pra3xzbPzvfn3l4O7q5Ov29/tvduzuev/xfP7v+G9v+Hdr+O96+uTk9fDr+XN2d2l663dkaHFnYGtwY2B2c2l5+HX84N7s7uXrdXV0ZGv5/XB95uTq6On+aWtlXmBiX2Zua19ld3Bu9+fi29XY393b4Ont/WlnbWVibHRwdevo++7h7XB0+XV09flz/ObtfPDy+ezt7/Pq3uPt5un5+/f9bm51cXd3b2RobV5eZmVlZ2dhZG9++/fq6/Tu7vl7eXx5/e3t7d7d5Orm5vt2bV9dXV9fX2JfX2BlbG3w4+He393f4uDl7/r8cGpnZGd3/v7t7Onl7vV7cPv4+/11+e/z9O309u317+/+9Ont+Pv3+HpvcnBz+fh9fHd6em5tbmptdWlnaWdobv72/vPr9nr+em93fXp2/+7q7Ofp6+vv/2pnZmFgZmhiYmdnZWlw/eXe3+Le3eHh4+jt9vxsY2VmZWpwc3R++Px0d3x09er39+ro7evk4ejp5vX+7+zw8O77enz9eGh5/XZ++3drbW9pZ3Bya2lwZmFoZWVscHt7/O/49ubr9/Hu9f3t6Orq4uv48PdqZmppY2ZrZF5hYl5gcHt67eft8efi5+fe5vLu8nRrcnJrbXBvbnh9bnj07vr26+/16+fs6ejy+PTw/P3t7/fy93Rzc29pcvb3/vTzc3R9c29udW9pcHJmYWZiYWpycXN99vv05uny7O769e/v7/N+cWxzc2tsc29x/nZtaWdoYWl9/vnu7fTv6ufk5Oft8+7+aWttZ2Zpamtrb3Nxcv34+e7q6+fh4uPl6O7z7O/57ujx+fH3eHV6fHl5/HVucWxscHl2b3h2cG5va2JgX11gbnZ09u3r5+Ph4+Pm6+vo5e30+m9qanJwaGxsZmhrbGdoamZpbnFy//t4evvw6+Tg4+Xp7ff9e3FsaGtvd3l7fP748+/p5+vq6PD17ejt7uvw9PDw8/T4e3lzbW11fnlwb3Z6fvr4/v717/n3fmtmYV9eZGxudnt5fu7l5OTg5urp7fL7fW9nZGdnamxsbW18+f59fG5pdnlwefH0e/bu8Ozh4erq7fV6b21jZGdoaGdxd3F2e3736uru5OXt6ePk6Onm6e3t7fLp4/D7fnxtamxpYmFpZ2j+fnv06O18+fR0Y2JfW2Rycvzw7O7m3d7m4Nzm6uTr8/l8bGBiZF5eamljcH1va2tsZGZuZWB5+m529fDs49/f5eXp7u3ueHX1/25ueHx6/PN2b/p6bP/xe3zy8n796fJ97efv7uPse3d8eG95fmxqeXNtfe/u6+Hg6ezq+2toaF5dY2dt//n77uLh7Ong5vDr6/f/dmdfXl9dXm38cHfv/XL893Bve3ZobvD/b/Pu+u/j5ebm6fN8/H1rbn1tZm15bGt3/nJ47ft97fB79u76+enl6evh4ejj5fX++XxpaHVuY2p2ZmZ7/nnv4+nt4+l1bHVmX217cX7r7vns4uXr4N3s7ub1bHByZF1gY15ibmZld35sb/R2aW11aWd1e2127vTw3drd4d/j7vT1dXD0+2pre2thaHBqa/Xuev36Z2N5eXH+7Oru6uTo7OPl+vbr+nl8fWtmcnZmbPf99ODe5OHl7f5wbmhofP9ubHlzdvrp6Obe4PL682lkb25mZ21uampoZGh5d2tw9vttb3puaXB2cnvt5+LZ2uTm5ev+c3N0b3VuYmFgX2BmcHf76uX9anBubXn79+vl5erq5uTm5OPv+e7r93Bta2ZpbGdn++zy8Ono6+7vem1vd3RwdWpndPH08N/b3uDh7nR+/G9tcXFnaWleWl9nYGJucWx4fmtkb3Vpbfn4fOXZ3eHc3ebn6P1wfvFvaHBoX2d3amn973lw+21faXxravLr9vvv/Xrm3efo3eHx6up0aXj9aWb9fG3s5Pb96ODs7uj+aXz2aGZyb2Rz9Pbs3tvx/ujvdvbwb2p9/WZhY1xZY2pfZ/z9bWxuZ2Ryfmlw7PL25t7n6dzf8PDs/m3+fmdpfnpla3ZtbX57aGn8dWhteGtr8fB3efL5+eXc3t/a3u/y8HlzfHxuc+7zdHz7ePnk5vDz7XxobXVpbfh1ZnPz8e3m5ff65en+8/J4eHtuY2RtZFxfbGhr/3RnZm9ybHD4fXrs8Xz47ejl5uv1+vD2b3B6cXF+d3R4d3RranByc/p0aG9+fXl9fHd+7+3z5t3g6Ofr+n319nZ58/V++f1sbH7y/PTo7Pjz9nF09fRzdfn49vLt8O/m6PL08Pt0fX1mYWdlZGZlX2Fva19jamdjbHJw+uvz+vf2/fjh4u7l3uj37Oj38On4bHrqfGhvaF9lc29jaG9maHR1aXDzfHfu5efl3t7u6uDm6+rk6Ofh7vzx8Xp1+fxz/vltZ2twam94bWp78P938+vw7Ofze/Dp+Xr1e252+3NrffxsaGpoYWZuZ2Ft+nVue2xjaXt4cvXr7vLs+Hju6vh49u717unzeH75fHZ5dGxvfm9pe/53fvj59ejn9vru73rz6/j86ufv9PT7df3tfnnr73j97/h78+t9cvDr+O/r9/rs5/B7+Pptc31rZmplYWRqa215c2NgZ2dmampqc3t+cnT4dGh4+Pzv5uju7+zv7eDpffXo7fbw7fxvbG1lYmlnYWVpa3D++3j57Ovu5efs6OPm6OXk5+zt7fX49Pj+9fPx8PV6bXh5aWd1eHByeX5+8PH27+/z/vz1/nd7fvt5dXBwenNsbXd4bW55c3NtampraWhqbGpmZWhucHV1dP348u/y6Obp6Ofn4+Xp7fH8fXFlZ2dpb3D9+P3v6uvt7/Hs6eru7uvq9XZ8e3T/+3v97uzv7urw9/Dw+Xp7evvw93n76+z69erv/vx9bWx5eW9ycGhpbWReYmZmanr8b3X6b2NlbGhqcHFpcPL9dfv8cHzu7+/n4ejs5OTt597n/Pn2cmllX1tdZmZs/PX/8u59e+zl5uTf4ebi5PlzfHtuePf5fu7l7fTu7vfu7nlte3xsaHRzcXv19PLs6/91c25w/O7y+PP0eW1mY2JucG3+7/t3c2tgYmdoZ2hpaGpuamRsdW5wfP98fvD2++7m5ubf4efj5PB1bW1paW9ub/jw/f78cXP37Onq6uXq9HttbXp3cvvu7fDu6Ons5uPu6Obx7ur6bnD68/j27O3q4+97fHBoa3F7bWp3bV5bXFtfaGhrc/53aGZnY2pwbnJ+fXN2enBv/O76ee7v+fn3eHX66uzo5Ojp4+l9bXBpYGNtbmp8+nBte3788Ors7OPj7vL8ef3s7fTt6Ov59+3x9evr8PDv+Ht1b2NnfP549ezt5+Pr8+/u/XT893j++XJoaWtqbnRubnn+a2BhYl9ibGxscHZoZWxqanr3/n3z7/l4eXN0+fLy6+Xi4uPk6fTy9nNrbG1qbm1maXZxbXr4e/vzeWtsb3N77uzt7OXp8+/m4+jl4uPk3+Hv8/V5/O7u9e3n6+7n5uzy83Zsb3JvaWdiX2NpaWhra2hrbGZfZmtnaHH7en37d3T99fbw7O7u6un2cG5xbnF8/vLr7Pp69vV4e/5yaW1uaGRpa29+9X12+PP3/f14c/7w7+rg3+Xo5+vv6On1/fDq6+vs/W9wcnJ79/Tw6+378+fk6ezw9fX093p6+315/fx1a25sY2JjZGlwb2pufH1paW5ta3F4cH3z7vH293Rt//P//Ozs8O/w9vXt7X159fl+fHVqaGpxbmxwbGpta2Jga3B3+e3n6ODj7Onn6erp6u3v7ebp7evt7+3v9+/n6O/w7O/z6u369u76cHFvbW99+29vbmdiYmJdXWdxb/vq8nv7e2xy8vJ1c/n19Ozr9X56d3N58vx99n5tbHF0dnl2c3ry+XV6d25vef55b29rZ2dpanPu7fPo3Nzh4uPp6eHo+PP1fW1zfm1rffV4fO3w+fHw+/7t6/ju5ejr5+r39+zq7/Ds+HZ0bF9dZGRhZnp8e/N9a2RkY2Zwb2RkcXNqb/t+cHh8fvPl6fvx6/f56er/evDw+ezp9vvu+2xydmteXl5XWGNrbPXl5+fe3+3t4uf67uf3fH5zaWt4e3jv6PLt4OLu7efr7+vr9/bm7/vw83Fw+PV6fPlwZmVkXmBxcm/35ej37u50aW1lX2NmX15qa2Jq/f5udf16//Xyfnz0933y8nt98O737uTn8O3ueXh3aF5gZGBibfn369/e4OLn8PPw/m5ufG5jYWZgZHJ7+uzn6urk4+jp4OLp6OPj5eHj6erm7ffx7v12fXNoZGdnYmZrbHD3+WxnZV9bW1tYWFtdW19panTy7O3t6ebt7efr7+fl7u/r6+3o5err5u17fvlyaWReWlhbXl5lffDu4+Dp7+7vfHr+dW54d2hsfnp68efm5+Th5ufg4OXj4urr5eXt7enwd/z3c3vw/nV3dmxna2xnav78fvX6bWRhX1hVWVhWWl5cYXBxbf7u9H7w7n786uzt5eLo6OHh7erh5fLv7nz+9nZnaW1hXGNnY23u6erl5O7z9XVlanZrZGxwa2/58fXn3uPn3+Hn5Nzf5d7c4OPd4/Ho5311+PP/+u33dX5+a2NpaGNpeXRtc3JjXV5YVFdbV1deY2FrfHt29O739Orq7Orn6ujf293g4efv6+bx/vb4eHZ3a2VkYFxcZWx28O739+7t93ZtamRobWxw/Pj58+vm5d3b4OPe3d3b3ePh3d/k5+rw/Xt4dP/28PH5+np3eXJpZmhsbG9vbnV3bGJeXVpaWVhbXV9mbW9udf94cnl8fvTv7u3l4d3e5eju8fL5+Pfx8/n9eHF0c2pmaWhnePz/9evt8/59cGtrZ2JmbXZ69O3u6uLf4+Pe3uDe3d/d2dzl5Ob19O73ffvz+Pbp7Pj37fttcW5oZGNjYGdtYl1hY1taXlxYW11dYW5uaHT8bGp99fr06enm3dve4d7f7erl7vLu7f797vxxdHtmYGtpYGp5cHjt63lz/m9kZWtmaP3+ePDl6vHo3ujn29vd2dfc3dje7u7p+2x2/3N+7fb66uf1fPb+aGVqYl1jaGJjbWVdX2NcWWFkW2BraGdxdGRkbGpkcvt2fOrl6+fd3uXj3+bo4Oj47uv+e+nk7/PveWdoaGBnenRz9+v1/f54aGdrYmRweG166+768unq7uTi5d3a3N7c3+vr5O368fJzcfj49+nk6u3r9m9pZl5cYWNfYGZhXV1dWVpiYlteaGRkbGxlZmtnaHf1+/Lj5Orj3N7f3d7g3dvj7/Hzfnzv7/f4+2xlaGhgZHNvaHb5eHB5b2VrcGxpeHtwe+30+e/r5+ri393b2dre3t7m6Ojv/v/+cG1vdnfz8Pn49HtraWZiYmhqaGZraF9fX2FgZWtnZGhrbGprYWRmYGFmbm548+rq5+Th3+Pk4uLo8PP3fX716+zs6+38c291c3f+//X29/1+eHBzeG9ram1raHf8fnvz7uzs7enk3+Pj4N7i5eHf5ezx93Frb292+PD07e/6c25jX2RmYV9nZl9fYmFhZGJhX19eXWJlYl5jbGZodft6+enq6+Te4N/e3+De4Ojx9Pxyd/Ds9vft83R0e/56/3v++X5wcX5ua3R9bmx5emxuffl8++nm5uPf4t3a3uHc3+/t4+h99+z4b3R2bm58fHx6cWlla2dhZnBpYmpwZGJrbmlpdW1kYGBfY2JeXmVrZGh7+nrx5+Lq49/g5OXl6ujs+n77eHH+6e3w6ul+cXz4fnv08/f89fz08nx0fXhpaXr+bnfx8Pvv6ert6+rm4+Th4N7q7+fj6vDr5/duePx7cnZ1dm5qZWhmYV9maWNocHZsdH5+bGtsZl1aW1tcW11ka2hncfL4/Ovh5+rj4uTn4+Pg5uvy8PN9/u3p6+vl5vv/+Ppucvv2//77/PP2+n3+bGhteHBudPj2e/Tt7fPs5d/i4N/d4u3x5+Lt6ePm8/16em5oZ2diXVxeYV1eX2VnbHH+eW/68Xttbm1qX15fYV5eY2ppY2358v3t5+Ps7+rn7Ozq5ufx8Ozte3ry5unu6Ob2//5+/Xzy6ufp6+ji6vn5+XBnbnt5bnb8/nB0ffz7//z06evs6ubs9u3h6e7t5+jw+vfzenBwcGdfX2RfW15tfXV77Of7fvf+aGFkZ2BbW2JgWlteZmNpe/j+9Orm6vTv5OPo5eHf5Onn4ur37ebn8fTs6fxwdPt+df3l6vXq4uxwcf19ZmZzfm5sefd9dfTl5/Lw5eDw+Ofj7uzi4Orp4+Dn8/Lx93Jpa2ZdWlxcWFVcaGlrfenp7PF+e3draWhqX11hYltZX2hoan348/Pr7u/t7u3o7PXy6OXy+Ozl8fHt7Pz2++3zeHfy6e704Nni6+bjeGp29XNiav12ZmRt/HFu9eTu/fHk+Wh45+n/6d7j7+fe4+/o4+XxdXFxbF9dYF5bXGNub/3p4ul9cmttZmBdY2BZVltaVFZka2Jk/+v+cvfn7O/j293q7N7d9Pjg3Oz26OT3/urm/XD67vd49ujn6+37fW1pbG1sa2xsaGNjZW757u3p3+Lt+uzr+fHc3OXo29rp9uXe7Pzw7HFjZXJiV1lgYFlaaXNoce7waGBsdWRgcXplXV1eXVpeaWlpdP3/eXv7+e/m4OXk4OXv8+nl7Ojg6nv96Ox7d/DxeHno3+br4N7udPfp/Gt09XpoanJkWl9zdWlx7+xybH3x/fji3ODn39rf6+rn6Obn7u/t8n51cW1kZGtta2Zu+HhqanBrYl5mZFtaYFpPUVxdWFtwdGNme/lwb+rd5eze1trl5t7f7+ze4PP15up9fvD1fn79+Pfy9P57b256/fn9+nVubmllaHB0am349Pry5e376tzd4dzW29/c297p7OPndWz89WheZmxhXGz5bGBse2tdZHBva2xwbmtmZGReW2FnZmJmbWxpbHFudvXt7err7Onm63x+5+j69ejtfXrz8XRv8uTp9/Dg5P9+6Oj28+Tn/HTy8mtkbXRxa2ltaGJgZmpmbfHj5ePc2tra297g4ODl5eXp8vDt/W949v9yePX7a2dtamNgaW5iXF5iWVJVW1taXmlmY2lsbWxteu7p5uDd3Nzc3Nze3dze4uPq7vb1/m95/3Nw/n5zbGpoZmdz+vr6/fD2cGp3enRw/v5wbXh2amp29/Dh3dvb29rc3d3c3eHp6e3yeHBtY2BlcGxse/ZzbW90bW10c21rb21uZGFhY2hscXVuaWtkYGBrcHj78O3u6+3x8fD37ujk5efl6/V+fX70+X387e/69evwe/fp6PDp4Ob4eXlwbG14cGtmZ2ReWlxgXmJx7unk3tzg4d7c3Nvc3+Hk6ff79/53ffr58vX3eXdvb3D/cGZobGZdXFpYVllcXl5laWhkX19mamv06efn393i59/a3d3a2dvc3+Tw/Pl+/Xpzb3ZuaGZsa21xe3t+7+7w/v5ub3Z7b3F8dGhjaGNjanl+7eLc2trc4+He3N/d3ePv83VnZmtmX2Vpa214dW9td3p2e29tdn1sZWJhXmBjYmFqeWtoZ2hkZ21xb/vv6+72/P7q5ujo4eDi5OPq8Onp8fn09/j7+3N69O3r6+jq5+Hh7Pj7/HVzcG1ta2NbWVhWWV1hZXDu6ebk4uHf3d3c2tjb4ebvfHl8dWxvffn29/f8/HdyeXZrZm5rYVxdW1hVVldZWlxdYGJlbXJ4e/Lo6Ozp5+Xi3tvd3Nvb3d3i6ejo8fz39P5zdm5qam9xeXR79u3s+vbu73Z+7/F8/PxwYl9kYGJhaHD59Ozl3+Xi3d3g39vd5OzteG9qZ15gaWZobn1ucP/5c3n89Pr9fnJvbGhjYl1bXGBcWV5qZV5pb21od319efbr5eTo5d/f6ebh4evp5ur16uPo8fj3en18/n3t6unn4OTw8O/5b3NzbGRjXl1eXFlcYl9kcvL37eDa3dzY19rd29ve6eru9XNra3ZqZXB6cWp1dm1pcXBraGlkYmFgYV1bWVlXWlpdYWhpcXt5+PHy9Obk4uHa3ODe29zg3+Dh6+/s6/n1+Px0bWxsbmxz+ezy6uLg7Ofi5/D5+3NqZmtnY19kY2NkbHb+9end3Nzc2t/n6ejw9v55bmprZWVlamdscnd2/vft7/Xx9fZ8e3ByaGVkX1lXWltZWF1gYl9namlmbv339+7i4ePm3dzf5N7e4+bf3OHp6+Xr7vb5+3189fDu7Ork5uv07e74b2hiX1xbXl5cW2FlaGVw9u3r3tbU19jX2t/l4OPud333eGptd3Nra3lzbGhyeXJoanJuaGZoZ2JdXlxZV1lcXl5fZmtpZWx4d29+6uXo4Nrb3+Db2t/m4d/j7ebj6/387fFybXz7dHHv6O726OTq8O3n7HlqbGpiXV9iYV9jZ2lrcfnw6+Xd2drd4N/i7/zy8Hpxdn10bHr2+X788fR9fO7t9nl++3FmbHVpXl5jXldXXFxXV11iXlxeY2Nianv07urh3d3e3t3e39/c3t7e3uDn6uno73388PB9/unk6vLq6PN0e/V1ZmJoZ15aXV5bWmBqZmZ27O3r3tfW29zZ3Ofx6eju9PLs8ft88e34fP72/HZ6eXJtbHBuamNnZl1cXF1bV1hcXVhaZmtlXmhybGt65N/f3tnX3t/d3ePp4d/j5+no8/r08vxvdXt0b3L17e308Oz0+3728nRtbXFqYmBiZ2FfZWtycHzt6enj29zg5+nq+fbw+P17+3xzcHvu9/j06+j38+/t+nh+endtb3FrZ2BdXl1cWlpYWlxaWlpdXl1ibPnv6eHe3OHj4d/c4ODc2dzj3+Dg6Ozq7u76/ffz7+7t9PfwenB0fntqaXF6aV9hYWFcW15gY2V08Ofj4tvc3Nzh5enj6O/t6eX1ff/693R2/PP2dXh6e29oamppY2FlZ2heXl9gYl1eXV5fXV9hZ2dkaXPy7+7m3dne4d7d3ufl4ODq8Orq6/P28/r3e3Bxd/h8+/Xt7P7+/O3wfvTt6PR1dHFvY19jaWplbXzx7vTp5uXr9/Hw7/z/8+/u/ndvb3lwd/3r6vrz6+f3df/7d2hnbW5uZWlsaWNcXVxbV1dZW15eXWBhaGlw+erg4uLe29rc29rY2uDh393j6+Xk6f1+8e/2efjz8/p2dW9wbWludHxzaWdnaF5dYGRmY2h18+7v4dzb3+Ti4ODp6eTh4/Dz9ft4a3b9/nd3+v39eG5sZ2hkYWJmaWRkam1pX2BhYl5ZXGBoYF5na25qdO3k4uLc3Nzc29nb3N/m5+rp7PL08e37ffvx7npyfu30dP/y9HRy9fP5dnN4cW5oaWlpZ2Job3n49fDq5Obr7evn7vDp5uXy+vj6eWpz9/H8fPHr7Pr/+ntvZ2ptamtscW1rb21pYmJfWVhbXlxaXWRqZmZ27ez47uDb29vV1Nfc3dzg5+zp6ezq7Ovr5+fy/37v7Xtzdf11aWx1fWtkamxiXGFrZ2FhbHRzdfrt7OXn6ejk3+Li4eHf5Ojs7PByeP35d2xyfnxpZ290bmJha2trZ2ttamhoa2djX15eXF1fYGJqc2xreOni7+3f2tve2tbZ3uPi5O3//u3x+X3z7Ozt9/5++Pt5d/vx+nV99vB9bm5vZ15gaGxnZnD8/W9ufvb5fvnr5uPj4uXl5Oft9fP6cGx2fnp1/vf/bGpx/ntpa3h4cGttdXBsaWlkZF5aWlpcW1xfaGhjaG757fDt5t7e5d/Y1dre3Nne6u3n6vL67ujp7fDv8/h7fP779H5xcnr8dGpobWpbW2VtZWFtfXxucPbs7vXv5uPk5uXg3+Po5+vs+m9scXpzcXN0eWxiZGxsYmp+9Xlsc/t9a2VoaGRdXF9jYF1gYWBhYmNlcn17+Org4ubh3dnd397c3urt6ODm8u/r6u/58e3v+vbs5ejx7+/1/XZwbW1sYF1gaWRhaGx6bWl58fJ3dPPo7fDk3t7h4+Dk5+7+d3v9eXN4/31sZmltbmtud/l8bXB4eWlhZWllXVpdX15aXGFkYmBjanZ0e/Dp5OLf3Nza3N3e3d3k5+bf4+/y6+ny/fvx6u/27ejp+3p8fnJpam9wZmNmZmhlY2huc2xtc/32fvzz6ufr5+De4evr6ef1fPn1+3BwdXx1aWlrb29rdX72/XN8/X1xbWtnY11cXV5fXl5hZmZeX2duamz+6uDg4t3a29/f3uDm7unk5Ofq6erp7vT37er19+zn5/H+/fh5aWdqbWhiZGtva2pwfHpqaXF0dGxufvTx8evl4+ft6+jp7fDy8/pybXD//nBveft6cH7v7vx4/f59cWxsZmJdXF9fXVxeYWdnYmVpbWxpb/Tn6Orh29re393c4Ojn4+Po7ejm6Ozt6evt93758u/7eXz+e2lkaGtnYGVueW9u+vd8bW1xc3BpbX7v8fjs5eHn7uzr6/H8+PX7b21ye3dtcHn4+nn97uj0evj0+2tna2ljXl9kZmRgY2RiYWFjZmtoZmz/7vX16+Le4+Tf3N7l5eDe5Onj3+Dm5uLk6fL39O/u9ffu7fluZ2VpZmJhaHVzbnT9e2tmam1mXmVwfHdx+evq7/Dq6urr7+/u7vV+/PXz9vr38Ph3e/PxfnF78/1qY2prZ2NlamtpZGRlZGNjaGprbGxyev36++7l4OHg3tvc4eTg3N/n6eLk6+vm6O9+fvj5fnd69fp1bW1ta2xpbnZ6/29ze/52b3R5d2lpb3NuaXXz7fR99+/0enr28/b++fPw7/j++v32+fv39fh4/Pf5cmdtcHRqbHh5cWZmZWJgYWNlZGRkZ2dpbG797ujm5eDh4ufk3Nrd4N7d3ODp4uHn7vDr8/f/evh9dG9tbW5samx2d21rbm1vbWdvenVqZmpvbmt37unu9Ozp8Pn88Ors9vTr7vR8eP39/3h6enBya294dnJqbXNzbm58+XdnZmtsaGVnbWxnYGdqa2tw9+zn6eji5Obs6+Xe3+fn4uTq8Ovn6O378+/3fXr9/3xzdv19fHn++PZ+cHb8fXJrb3BtYl9kZmdkav77fXN29vr++u/l5+/v7OzzfHv38PPz9/T1fm5vdXJ2cXV8e3d0efx+bWZsbGZeYWRiXVtdYWZnbH3t6Orr5ePi5eLd3Nzf4N/f4uzp4uXr8u3r9Hdw/v9xbXB0b29obXF1em99/nlxbGxoZmNgZWtzcXP87/R6evDu8fLq5uXn7u3t9P169/f5/H79c2tlZ2xrbG51fPT7ePrz8f56e351Z2NkYl9eXmRpZmd1+fj5+u3r6ejr5ePk5+bk5ebr6ePk4+nr6Oz1fP72/Hx6+fT1envx8vl++/15a2ZlX2BeXWJoaGlscXh6dnR+8Ozt6uHh5+zr6Obv9Ovs7+/1+/11a2ttbW5qcHl3d3B8+Pv1e3h4bmVeXl1dXF5jZ2llbnx+9/vr5+Ti59/e3uPl4eLg4uLm6unw8/H4fnB2/n14dHd8fHhw/vT1/PryfW9naGdjZGJpbnFwcH58/v367ezt8Ovm6er09vP3+f348vV8dXp4b2ttbm5wcXb7+/f88uzq6/fw93RqZGhmY2BeYmJiX2RsbGprfu3r7O7p6Onq7+Xi5OXk4OTk6uzr8vZ++fn/+Hl97/f07vTv6vj78HhxZGBjX19cXmBiZGFrc3Bze/Xr5+vo4ubo7Ovo6ez27uvx93z6+HpybnFwdm9veXv8eXn4fn52fm1ubmVmX2NhXWRkYGJlbW5wdfPr7ujn5uDl5uXg397j6Oft6/b1fv5+bG54cnxwdfv5fv3t8+/w9/D9eHBub2xmYGRmZ2pqc3RxeHj78+zs8Ovr6fD47PP3/fju+f53//15d218fn55fO3y7fDv6vP1+/58dXJqaWxoY19fXF1dXWZlZmtsffTv8e3p6erq4+Dj4t/e4uPm7enu7vZ39n75/vbu8Oz08u3y9Xr9eW1pZWZiXl1dYF1gY2pwcXx59uzq6e3l4+Tl6ePk7vT16+30+/7wdnBudf5ud3j99H34/vh+/n5udm1sbGpvamxiZWZjZWRvenp3d/nu7/Hs5Ofn7Ovk6eXn6Obt7Pr1/HN1cv95evb57uzr8PHr7PH8+fZ9fW9wbmViXmRgYGlndXB3fHzy9fPx9O7t8Pbw7vT2fu/0/fx5/Pd9fHruc/Pm8ON67O/16v56bXVubmtka2tmYFxgYF1fZW9pbW1+/Pj0+eTo4ufs5uLf4uXe4+bp7uv0+3X99Pbu8uzu7O7x6O/7cG5mdnFraWNiXVtdXWFjZ294ef/27+3s8uzi5+bn6ufo6/Ls5ur1e/z+eXhw+fp9fXr4+Hp4e/x3bmhna2VpZ2luaWVfY2ZubGv38/n+/Ozt8vTr5+vs7unm6Ozr6e3y+nz6eXV0cvf78/jy7O/s8+zr8fh5eXp2c3V4bmllYWZlZmhufHl9d3n5fn51ffr++3z38vLy+e3s9Pz79fp8fvLq7fHw6uPp8/Xt9Hl0bHBubmppamJhXF1iXl9ia3Nta2t1/np5/Ovr7uvq4uHj4uDf5urs6Oz58PTv6uzt8Ozr7PL47vlya2ZrZ2VmZ2dhX19kZGRrb3Z4dnp69/Tw9u7p7Oru6OPm5efi4ubr9/H+dnl4+Pt4dHf/eHFxdXlubGpscW5raWpqaGZob3B0dHf7fHl1efT4+fHq6O7u7uro7O3s6u3z+n76eXp7e/T6+Pb18fPy9u3r9fh79vd3dHP+cm9tbHFpa2ppbWhra29wbG9rdHV3/P3w7O3u6uPl6u7t7PT38+jm6ujq6/D69fzz93t6c3ZpZmNgY15eXl9kYGFiZ2psbm9+dXv99u3s6+rl4uPf49/e4uDk4+Pq7e7s8PT5e/R9e3pwenJvamlpYmRhZ2hnaGlua2hoZ29qbnV59vbw8O7p6+rs5uHm5Ofj5ejs8fB9d3Nz/nZxcnN1cXVwe3dxdmpwb2prZ2xtbGpud2xsb3R7c3t+/fx99vz27/X19PX59/f48vz6+/bw8/Hz7u3v9fvz8fXu7urq7O/w83x8c3R3b3BsbGdlY19iYF9gYGhrbGtvfHt8evvt7+zq5uLk5OTi4+Xk5eTm6Orv6u709PT1fXptb3BnY2BfXl1eW1xbXF1fZ2Zra256ev767urr6Ojk3+Di4t/h4uPo5ebm6fPz+X54dn58eHP//ndxbHBwamVjampoZmRnZWVjZ2xsbnX38PDu8Ofo6Onr5eXp6+vn5+nu7e/2+Hd0c3B0cnh7eXl7/XdxcXV4dXJranRwa2hsbmlqaGtrb3t6/PP5+fny+fL7+u718vj09ez++/Ty8/r48+709PTq7ezn4uXm4Orr7O12bHJvbGZmaGRgXl5gX2FlaXB1d3L+fvr7++3y7Ovq4ePk5ubl5Ojp5+Tp6+3v+O7r4d3ndO9sa31eYl9eYl5ZXl9oXFtfY2NwbGz3cfJ76e5y5OLk6OTs7u/w4PT06ODu7vXt7fp4eOp49O9x/ut7a350aWVhbfxnYW9qYGpifux3eOPj5+Po39/t7OXo3+nj39/r4+nw5v125vB3fGp4a25t7flw4f16dnP1aG1sbVx5Z1ZuV2haY/hzfm12bO33d+9p/up9fHbre/92fX1+fur3+Ojteejncerl3Orm29zt5trsfv7w+/9tb11iYVpmVGBpbFljd2FkcP1Z8+Jm9uHo4gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCkBAIC0wLDAgKzEsMTcgQEAKKzk3NSAxIDAKKzk3NSAxIDYwMDAwMAorOTc1IDEgMTIwMDAwMAorOTc1IDEgMTgwMDAwMAorOTc1IDEgMjQwMDAwMAorOTc1IDEgMzAwMDAwMAorOTc1IDEgMzYwMDAwMAorOTc1IDEgNDIwMDAwMAorOTc1IDEgNDgwMDAwMAorOTc1IDEgNTQwMDAwMAorOTc1IDEgNjAwMDAwMAorOTc1IDEgNjYwMDAwMAorOTc1IDEgNzIwMDAwMAorOTc1IDEgNzgwMDAwMAorOTc1IDEgODQwMDAwMAorOTc1IDEgOTAwMDAwMAorNTIwIDEgOTYwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZmNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KQEAgLTAsMCArMSwxMjIgQEAKKzI2MzYyIDEgMAorMTIwMjMgMCA4MzMzMworMTA2NDcgMCAxNjY2NjYKKzEwMjY5IDAgMjUwMDAwCisxMTA3NiAwIDMzMzMzMworMTExMDQgMCA0MTY2NjYKKzU5MDkgMCA1MDAwMDAKKzQyOTEgMCA1ODMzMzMKKzUxNDkgMCA2NjY2NjYKKzUzNTMgMCA3NTAwMDAKKzUxODUgMCA4MzMzMzMKKzI3MzYgMCA5MTY2NjYKKzIxNTc1IDEgMTAwMDAwMAorMjE5NiAwIDEwODMzMzMKKzQzNDAgMCAxMTY2NjY2CiszMTA5IDAgMTI1MDAwMAorNDQxMCAwIDEzMzMzMzMKKzE3MzEgMCAxNDE2NjY2Cis0NTU3IDAgMTUwMDAwMAorMzM3NiAwIDE1ODMzMzMKKzEzNTIgMCAxNjY2NjY2CisyODQ0IDAgMTc1MDAwMAorMTc4NyAwIDE4MzMzMzMKKzEwODggMCAxOTE2NjY2CiszNjg0MyAxIDIwMDAwMDAKKzI1MjAgMCAyMDgzMzMzCiszNzQ5IDAgMjE2NjY2NgorMzc4NCAwIDIyNTAwMDAKKzM0MDIgMCAyMzMzMzMzCiszNzk1IDAgMjQxNjY2NgorMjM0NSAwIDI1MDAwMDAKKzMxNDIgMCAyNTgzMzMzCisyOTQ4IDAgMjY2NjY2NgorMjAxOCAwIDI3NTAwMDAKKzUxMzMgMCAyODMzMzMzCisyMjc2IDAgMjkxNjY2NgorMjM0NjggMSAzMDAwMDAwCisxNTIyIDAgMzA4MzMzMworMjI5OSAwIDMxNjY2NjYKKzMyNzMgMCAzMjUwMDAwCisyNjMwIDAgMzMzMzMzMworMjkxNSAwIDM0MTY2NjYKKzMwMzIgMCAzNTAwMDAwCisxODkwIDAgMzU4MzMzMworMzcxOCAwIDM2NjY2NjYKKzE5OTAgMCAzNzUwMDAwCiszMTM5IDAgMzgzMzMzMworMTgwNiAwIDM5MTY2NjYKKzIzMjA4IDEgNDAwMDAwMAorMTQxOSAwIDQwODMzMzMKKzIyNjMgMCA0MTY2NjY2CiszMTMxIDAgNDI1MDAwMAorMjY0NSAwIDQzMzMzMzMKKzE4ODAgMCA0NDE2NjY2CisyMjM5IDAgNDUwMDAwMAorMzYzNyAwIDQ1ODMzMzMKKzE5NDEgMCA0NjY2NjY2CisxNTc3IDAgNDc1MDAwMAorMzc3NyAwIDQ4MzMzMzMKKzE4MTYgMCA0OTE2NjY2CisxOTYwMSAxIDUwMDAwMDAKKzExMDQgMCA1MDgzMzMzCisyODA4IDAgNTE2NjY2NgorMjQxMSAwIDUyNTAwMDAKKzIxNTkgMCA1MzMzMzMzCisyNDExIDAgNTQxNjY2NgorMjQwOCAwIDU1MDAwMDAKKzIzODggMCA1NTgzMzMzCisyNDE4IDAgNTY2NjY2NgorMTQ4MSAwIDU3NTAwMDAKKzE5MjYgMCA1ODMzMzMzCis5MDIyIDEgNTkxNjY2NgorMjkyIDAgNjAwMDAwMAorNzAxIDAgNjA4MzMzMworNzQ3IDAgNjE2NjY2NgorMjA1OSAwIDYyNTAwMDAKKzE2OTMgMCA2MzMzMzMzCisyMDc4IDAgNjQxNjY2NgorMjk3NSAwIDY1MDAwMDAKKzEzMTcgMCA2NTgzMzMzCisxNzQyIDAgNjY2NjY2NgorMTAxOSAwIDY3NTAwMDAKKzEwNTMgMCA2ODMzMzMzCisxNDE4MyAxIDY5MTY2NjYKKzE0NjcgMCA3MDAwMDAwCis5OTQgMCA3MDgzMzMzCisxNzA5IDAgNzE2NjY2NgorODM4IDAgNzI1MDAwMAorMTMyOCAwIDczMzMzMzMKKzIyOTIgMCA3NDE2NjY2CisxODI5IDAgNzUwMDAwMAorMTcyOCAwIDc1ODMzMzMKKzI0MzYgMCA3NjY2NjY2CisxODUyIDAgNzc1MDAwMAorMjE5MCAwIDc4MzMzMzMKKzE1MTY3IDEgNzkxNjY2NgorMTE4OCAwIDgwMDAwMDAKKzIwNzAgMCA4MDgzMzMzCiszMzE2IDAgODE2NjY2NgorMjYzNiAwIDgyNTAwMDAKKzk1MCAwIDgzMzMzMzMKKzEyNjAgMCA4NDE2NjY2Cis5MDYgMCA4NTAwMDAwCisxMjk0IDAgODU4MzMzMworMTI5OCAwIDg2NjY2NjYKKzE4OTcgMCA4NzUwMDAwCisxMzQ4IDAgODgzMzMzMworMTMxOTQgMSA4OTE2NjY2CisxMDQyIDAgOTAwMDAwMAorMTI1OCAwIDkwODMzMzMKKzE0NTcgMCA5MTY2NjY2Cis5OTAgMCA5MjUwMDAwCis5MDAgMCA5MzMzMzMzCis5NjMgMCA5NDE2NjY2CiszNDQ4IDAgOTUwMDAwMAorNzc0IDAgOTU4MzMzMworMTA3NSAwIDk2NjY2NjYKKzc1MCAwIDk3NTAwMDAKKzEwNTQgMCA5ODMzMzMzCisxMzEzOSAxIDk5MTY2NjYKKzMxMDQgMCAxMDAwMDAwMAorMzM2NiAwIDEwMDgzMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYxIEBACisxNjk1IDMyIDAKKzE5MzggMSAzMzMzMworNDcxIDAgODMzMzMKKzE1MyAwIDY2NjY2Cis5OSAwIDUwMDAwCis2NTcgMCAxNTAwMDAKKzI2MCAwIDExNjY2NgorMTE1IDAgMTAwMDAwCis5OSAwIDEzMzMzMworNjIyIDAgMjE2NjY2CisyMTEgMCAxODMzMzMKKzc5IDAgMTY2NjY2Cis5NSAwIDIwMDAwMAorNTk3IDAgMjgzMzMzCisyODggMCAyNTAwMDAKKzE0NSAwIDIzMzMzMworMTQ3IDAgMjY2NjY2Cis2NzYgMCAzNTAwMDAKKzI4NCAwIDMxNjY2NgorMTQ0IDAgMzAwMDAwCisxMzEgMCAzMzMzMzMKKzY1OCAwIDQxNjY2NgorMjcwIDAgMzgzMzMzCisxMDEgMCAzNjY2NjYKKzE1MSAwIDQwMDAwMAorNTI5IDAgNDgzMzMzCisyNTcgMCA0NTAwMDAKKzk4IDAgNDMzMzMzCisxNjAgMCA0NjY2NjYKKzY2NCAwIDU2NjY2NgorMTg2IDAgNTMzMzMzCisxNDcgMCA1MDAwMDAKKzY3IDAgNTE2NjY2Cis3OCAwIDU1MDAwMAorNTc1IDAgNjMzMzMzCisyMzAgMCA2MDAwMDAKKzEzNCAwIDU4MzMzMworMTE0IDAgNjE2NjY2Cis2MjkgMCA3MDAwMDAKKzIyNCAwIDY2NjY2NgorMTM4IDAgNjUwMDAwCisxMjkgMCA2ODMzMzMKKzY0NSAwIDc1MDAwMAorMjY0IDAgNzMzMzMzCisxNDUgMCA3MTY2NjYKKzcwNSAwIDgxNjY2NgorMzY1IDAgNzgzMzMzCisxNTYgMCA3NjY2NjYKKzE2MCAwIDgwMDAwMAorNzI1IDAgODgzMzMzCiszMzAgMCA4NTAwMDAKKzEzOCAwIDgzMzMzMworMTYyIDAgODY2NjY2Cis2MzggMCA5NTAwMDAKKzMzNyAwIDkxNjY2NgorMTcwIDAgOTAwMDAwCisxMzMgMCA5MzMzMzMKKzQzMiAwIDEwMTY2NjYKKzI4NyAwIDk4MzMzMworMTMwIDAgOTY2NjY2CisxMzYgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTQ5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMiBAQAorMTA3NSAzMiAwCisxMDc1IDMyIDAKKzY4NjEzIDEgNjY2ODcKKzE5MDI1IDAgMTk5Njg3CisyNDA1IDAgMTMzNjg3Cis3NzcgMCA5OTY4NworNjgxIDAgMTY2Njg3CisyMDI1NCAwIDMzMzY4NworMjkyNyAwIDI2NjY4NworNzY2IDAgMjMzNjg3Cis2NTggMCAyOTk2ODcKKzIwNzg2IDAgNDY2Njg3Cis0MjE0IDAgMzk5Njg3Cis2MDkgMCAzNjY2ODcKKzY2MSAwIDQzMzY4NworMjA4MzggMCA1OTk2ODcKKzQyMDkgMCA1MzM2ODcKKzUwNiAwIDQ5OTY4NworNTg2IDAgNTY2Njg3CisyMDQxNSAwIDczMzY4NworNDIwNyAwIDY2NjY4NworNDI3IDAgNjMzNjg3Cis1MTQgMCA2OTk2ODcKKzI0NDU3IDAgODk5Njg3CisxOTA0IDAgODMzNjg3Cis5MjEgMCA3NjY2ODcKKzk5MiAwIDc5OTY4NworNTQzIDAgODY2Njg3CisyNDM0MiAwIDEwNjY2ODcKKzE4MjIgMCA5OTk2ODcKKzg0MCAwIDkzMzY4NworODkyIDAgOTY2Njg3Cis3MTUgMCAxMDMzNjg3CisyMjg5MyAwIDEyMzM2ODcKKzE2MTggMCAxMTY2Njg3Cis4ODEgMCAxMDk5Njg3Cis4OTAgMCAxMTMzNjg3Cis3OTQgMCAxMTk5Njg3CisyNDI5MiAwIDEzOTk2ODcKKzE2NzMgMCAxMzMzNjg3Cis3NTUgMCAxMjY2Njg3Cis4MTAgMCAxMjk5Njg3Cis1ODggMCAxMzY2Njg3CisxOTgyOCAwIDE1MzM2ODcKKzE1MzggMCAxNDY2Njg3Cis4OTQgMCAxNDMzNjg3Cis5MzMgMCAxNDk5Njg3CisxOTg1MyAwIDE2NjY2ODcKKzIwMTEgMCAxNTk5Njg3Cis5ODEgMCAxNTY2Njg3Cis5MDAgMCAxNjMzNjg3CisyMjg2OSAwIDE4MzM2ODcKKzE1NjIgMCAxNzY2Njg3Cis4NDIgMCAxNjk5Njg3Cis3NjUgMCAxNzMzNjg3Cis2NjUgMCAxNzk5Njg3CisyMjM0NiAwIDE5NjY2ODcKKzIyNDUgMCAxODk5Njg3Cis1MTYgMCAxODY2Njg3Cis2MDQgMCAxOTMzNjg3CisyNDMzMyAwIDIwOTk2ODcKKzE3NjUgMCAyMDMzNjg3CiszMTggMCAxOTk5Njg3CiszMjAgMCAyMDY2Njg3CisxODU3NyAwIDIxOTk2ODcKKzExMjMgMCAyMTY2Njg3CiszMzcgMCAyMTMzNjg3CisxNzUwOSAwIDIyOTk2ODcKKzg2OSAwIDIyNjY2ODcKKzkwMSAwIDIyMzM2ODcKKzIzMzY2IDAgMjQzMzY4NworMTIxNyAwIDIzNjY2ODcKKzM4MCAwIDIzMzM2ODcKKzM0NyAwIDIzOTk2ODcKKzE5NTQyIDAgMjUzMzY4NworMTg4NyAwIDI0OTk2ODcKKzQ2NyAwIDI0NjY2ODcKKzE4OTM5IDAgMjY2NjY4NworMjg2MyAwIDI1OTk2ODcKKzMxNyAwIDI1NjY2ODcKKzI3MiAwIDI2MzM2ODcKKzE5MzUzIDAgMjc5OTY4NworMjA5MiAwIDI3MzM2ODcKKzIwMyAwIDI2OTk2ODcKKzMxMCAwIDI3NjY2ODcKKzE4ODAwIDAgMjkzMzY4NworMjAzOCAwIDI4NjY2ODcKKzI0MiAwIDI4MzM2ODcKKzE5OSAwIDI4OTk2ODcKKzE3NDUyIDAgMzA5OTY4NworMTA2MCAwIDMwMzM2ODcKKzMwMSAwIDI5NjY2ODcKKzQ1MiAwIDI5OTk2ODcKKzI1NiAwIDMwNjY2ODcKKzIxMzUyIDAgMzE5OTY4NworNDA5IDAgMzE2NjY4NworMTczIDAgMzEzMzY4NworMTkxNDIgMCAzMjk5Njg3Cis2NDIgMCAzMjY2Njg3Cis0NjggMCAzMjMzNjg3CisxOTA2NiAwIDM0MzM2ODcKKzYzNSAwIDMzNjY2ODcKKzE5NyAwIDMzMzM2ODcKKzE5MCAwIDMzOTk2ODcKKzE4ODEzIDAgMzU2NjY4NworOTY5IDAgMzQ5OTY4NworMTY1IDAgMzQ2NjY4NworMjAzIDAgMzUzMzY4NworMTczNjIgMCAzNzMzNjg3CisyNDYgMCAzNjY2Njg3CisyMzYgMCAzNTk5Njg3CisxNzQgMCAzNjMzNjg3CisxNjQgMCAzNjk5Njg3CisxNzA4MSAwIDM4OTk2ODcKKzM1MyAwIDM4MzM2ODcKKzIyMiAwIDM3NjY2ODcKKzE4MSAwIDM3OTk2ODcKKzE0OCAwIDM4NjY2ODcKKzEwODM1IDAgMzk5OTY4NworMTg1IDAgMzk2NjY4NworMTM5IDAgMzkzMzY4NworNzUxMCAwIDQxMzM2ODcKKzE0OSAwIDQwNjY2ODcKKzEyOSAwIDQwMzM2ODcKKzEzMiAwIDQwOTk2ODcKKzEwNjMgMCA0MTY2Njg3Cis4MDUgMCA0MjY2Njg3CisxNTcgMCA0MjMzNjg3CiszOTQgMCA0MTk5Njg3Cis5MDg0MCAwIDQzOTk2ODcKKzYxNTkgMCA0MzMzNjg3CisxNzUyIDAgNDI5OTY4NworOTg1IDAgNDM2NjY4NworMzEzMzggMCA0NTMzNjg3CiszMzkwIDAgNDQ2NjY4NworNzcyIDAgNDQzMzY4NworNzgxIDAgNDQ5OTY4NworMzEwODQgMCA0NjY2Njg3CiszNDk4IDAgNDU5OTY4NworODE4IDAgNDU2NjY4NworODgxIDAgNDYzMzY4NworMzA0MTYgMCA0Nzk5Njg3CiszMjY1IDAgNDczMzY4NworODE1IDAgNDY5OTY4NworNzkwIDAgNDc2NjY4NworMzEwNTMgMCA0OTMzNjg3CiszMTA2IDAgNDg2NjY4NworNzA4IDAgNDgzMzY4NworNzEzIDAgNDg5OTY4NworMzAyMzAgMCA1MDY2Njg3CiszMjE0IDAgNDk5OTY4NworNjM5IDAgNDk2NjY4NworNzY4IDAgNTAzMzY4NworMjk2NTcgMCA1MTk5Njg3CiszMDEzIDAgNTEzMzY4NworNjIyIDAgNTA5OTY4NworNzIwIDAgNTE2NjY4NworMjkzNDQgMCA1MzMzNjg3CiszMTk2IDAgNTI2NjY4NworNzEzIDAgNTIzMzY4NworNzc1IDAgNTI5OTY4NworMzA0MjAgMCA1NDY2Njg3CiszMzc0IDAgNTM5OTY4NworODAzIDAgNTM2NjY4NworNzE3IDAgNTQzMzY4NworMjk5NjAgMCA1NTk5Njg3CiszMjgzIDAgNTUzMzY4NworNzkzIDAgNTQ5OTY4NworNzkwIDAgNTU2NjY4NworMzEwMTEgMCA1NzMzNjg3CiszMzk3IDAgNTY2NjY4NworODA5IDAgNTYzMzY4NworODMxIDAgNTY5OTY4NworMzExOTQgMCA1ODY2Njg3CiszNDAxIDAgNTc5OTY4NworODA3IDAgNTc2NjY4NworODI3IDAgNTgzMzY4NworMzAzMjYgMCA1OTk5Njg3CiszMTg2IDAgNTkzMzY4NworODE4IDAgNTg5OTY4NworODYzIDAgNTk2NjY4NworMzE1NTkgMCA2MTMzNjg3CiszMzY0IDAgNjA2NjY4NworODQwIDAgNjAzMzY4NworOTE5IDAgNjA5OTY4NworMzIwMTMgMCA2MjY2Njg3CiszNDk1IDAgNjE5OTY4NworODcxIDAgNjE2NjY4NworODAzIDAgNjIzMzY4NworMzAyOTQgMCA2Mzk5Njg3CiszMTUzIDAgNjMzMzY4NworNzE2IDAgNjI5OTY4NworODEyIDAgNjM2NjY4NworMjk5NTIgMCA2NTMzNjg3CiszMjk5IDAgNjQ2NjY4NworODAxIDAgNjQzMzY4NworNzQ5IDAgNjQ5OTY4NworMzA1OTggMCA2NjY2Njg3CiszNTM2IDAgNjU5OTY4NworODg3IDAgNjU2NjY4NworODUwIDAgNjYzMzY4NworMTcyNDYgMCA2Njk5Njg3CiszMTExMCAwIDY4MzM2ODcKKzMxOTggMCA2NzY2Njg3Cis4MDkgMCA2NzMzNjg3Cis4MzYgMCA2Nzk5Njg3CisyOTc4NCAwIDY5NjY2ODcKKzMxNTUgMCA2ODk5Njg3Cis4NTkgMCA2ODY2Njg3Cis5NTggMCA2OTMzNjg3CiszMDY2NiAwIDcwOTk2ODcKKzMzNzEgMCA3MDMzNjg3Cis4ODYgMCA2OTk5Njg3Cis4NjEgMCA3MDY2Njg3CiszMDQxNiAwIDcyMzM2ODcKKzMzNTAgMCA3MTY2Njg3Cis5MTcgMCA3MTMzNjg3Cis5ODcgMCA3MTk5Njg3CisyOTUwOSAwIDczNjY2ODcKKzM1NzQgMCA3Mjk5Njg3Cis5NzIgMCA3MjY2Njg3Cis4ODUgMCA3MzMzNjg3CiszMDg3MiAwIDc0OTk2ODcKKzMzOTkgMCA3NDMzNjg3Cis4OTggMCA3Mzk5Njg3CisxMDI3IDAgNzQ2NjY4NworMzExNTUgMCA3NjMzNjg3CiszNDU0IDAgNzU2NjY4NworOTY1IDAgNzUzMzY4NworODQxIDAgNzU5OTY4NworMjg0ODcgMCA3NzY2Njg3CiszNjE2IDAgNzY5OTY4NworOTIxIDAgNzY2NjY4NworOTkxIDAgNzczMzY4NworMjMyMDggMCA3ODk5Njg3CiszNTUxIDAgNzgzMzY4NworOTE4IDAgNzc5OTY4NworODk0IDAgNzg2NjY4NworMTY5ODIgMCA4MDMzNjg3CiszNDU4IDAgNzk2NjY4NworODQ0IDAgNzkzMzY4NworOTQzIDAgNzk5OTY4NworMzAzOTYgMCA4MTk5Njg3Cis0OTYzIDAgODEzMzY4NworMTQxNiAwIDgwNjY2ODcKKzE2MzkgMCA4MDk5Njg3Cis1MjQgMCA4MTY2Njg3CisxMzY4IDAgODI5OTY4NworNTY1IDAgODI2NjY4NworMzkyIDAgODIzMzY4NworNDEzMTcgMSA4Mzk5Njg3CisxODUgMCA4MzY2Njg3Cis0NzcgMCA4MzMzNjg3Cis1MzQyIDAgODUzMzY4NworMTI3NSAwIDg0NjY2ODcKKzEyMSAwIDg0MzM2ODcKKzk4MiAwIDg0OTk2ODcKKzY0NjUgMCA4Njk5Njg3CisyNjA2IDAgODYzMzY4NworMTE2MyAwIDg1NjY2ODcKKzk0MyAwIDg1OTk2ODcKKzExODYgMCA4NjY2Njg3CisxMTU5MyAwIDg4MzM2ODcKKzMxMjIgMCA4NzY2Njg3CisxMjc4IDAgODczMzY4NworMTU5MyAwIDg3OTk2ODcKKzkwOTkgMCA4OTk5Njg3Cis5NzggMCA4OTMzNjg3Cis3NDggMCA4ODY2Njg3Cis4MzUgMCA4ODk5Njg3CiszNjQgMCA4OTY2Njg3Cis0Nzk5IDAgOTA5OTY4NworMzY1IDAgOTA2NjY4NworMjE1IDAgOTAzMzY4NworNDM2NyAwIDkxOTk2ODcKKzMwMiAwIDkxNjY2ODcKKzQ4MCAwIDkxMzM2ODcKKzYxODAgMCA5MzMzNjg3Cis3NzEgMCA5MjY2Njg3CisyNDYgMCA5MjMzNjg3CisyODEgMCA5Mjk5Njg3Cis0NjM2IDAgOTM5OTY4NworMjExIDAgOTM2NjY4NworNDAzNyAwIDk0OTk2ODcKKzM4MiAwIDk0NjY2ODcKKzQ4NiAwIDk0MzM2ODcKKzM5NzUgMCA5NTk5Njg3CiszMTIgMCA5NTY2Njg3Cis0NzQgMCA5NTMzNjg3Cis2ODgwIDAgOTczMzY4NworMTExNiAwIDk2NjY2ODcKKzIwNiAwIDk2MzM2ODcKKzY5OCAwIDk2OTk2ODcKKzYyNTQgMCA5ODk5Njg3CisyNTgxIDAgOTgzMzY4NworMTMwMyAwIDk3NjY2ODcKKzk4NSAwIDk3OTk2ODcKKzk2NyAwIDk4NjY2ODcKKzY0ODYgMCAxMDAzMzY4NworMzU1NSAwIDk5NjY2ODcKKzE0MzAgMCA5OTMzNjg3CisxNjA1IDAgOTk5OTY4NwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYmZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTQgQEAKKzU3NiAxIDAKKzU3NiAxIDI0MDAwCis1NzYgMSA0ODAwMAorNTc2IDEgNzIwMDAKKzU3NiAxIDk2MDAwCis1NzYgMSAxMjAwMDAKKzU3NiAxIDE0NDAwMAorNTc2IDEgMTY4MDAwCis1NzYgMSAxOTIwMDAKKzU3NiAxIDIxNjAwMAorNTc2IDEgMjQwMDAwCis1NzYgMSAyNjQwMDAKKzU3NiAxIDI4ODAwMAorNTc2IDEgMzEyMDAwCis1NzYgMSAzMzYwMDAKKzU3NiAxIDM2MDAwMAorNTc2IDEgMzg0MDAwCis1NzYgMSA0MDgwMDAKKzU3NiAxIDQzMjAwMAorNTc2IDEgNDU2MDAwCis1NzYgMSA0ODAwMDAKKzU3NiAxIDUwNDAwMAorNTc2IDEgNTI4MDAwCis1NzYgMSA1NTIwMDAKKzU3NiAxIDU3NjAwMAorNTc2IDEgNjAwMDAwCis1NzYgMSA2MjQwMDAKKzU3NiAxIDY0ODAwMAorNTc2IDEgNjcyMDAwCis1NzYgMSA2OTYwMDAKKzU3NiAxIDcyMDAwMAorNTc2IDEgNzQ0MDAwCis1NzYgMSA3NjgwMDAKKzU3NiAxIDc5MjAwMAorNTc2IDEgODE2MDAwCis1NzYgMSA4NDAwMDAKKzU3NiAxIDg2NDAwMAorNTc2IDEgODg4MDAwCis1NzYgMSA5MTIwMDAKKzU3NiAxIDkzNjAwMAorNTc2IDEgOTYwMDAwCis1NzYgMSA5ODQwMDAKKzU3NiAxIDEwMDgwMDAKKzU3NiAxIDEwMzIwMDAKKzU3NiAxIDEwNTYwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNhNDQxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVjNzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDM4NSBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzExNTIgMSA0ODAwMAorMTE1MiAxIDk2MDAwCisxMTUyIDEgMTQ0MDAwCisxMTUyIDEgMTkyMDAwCisxNzI4IDEgMjQwMDAwCisxNzI4IDEgMzEyMDAwCisxNzI4IDEgMzg0MDAwCisxNzI4IDEgNDU2MDAwCisxNzI4IDEgNTI4MDAwCisyMzA0IDEgNjAwMDAwCisyMzA0IDEgNjk2MDAwCisyMzA0IDEgNzkyMDAwCisyMzA0IDEgODg4MDAwCisyMzA0IDEgOTg0MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDA2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpAQCAtMCwwICsxLDI0OSBAQAorNjQ1OCAxIDQwMDAwCis0MDQwIDAgODAwMDAKKzMyNTUgMCAxMjAwMDAKKzMwMjYgMCAxNjAwMDAKKzMyOTMgMCAyMDAwMDAKKzMwODkgMCAyNDAwMDAKKzMzMDUgMCAyODAwMDAKKzE3OTQgMCAzMjAwMDAKKzE4NDggMCAzNjAwMDAKKzEyODggMCA0MDAwMDAKKzE1MTEgMCA0NDAwMDAKKzE1MjcgMCA0ODAwMDAKKzYxNDYgMSA1MjAwMDAKKzEyNDMgMCA1NjAwMDAKKzEwOTkgMCA2MDAwMDAKKzEzNTQgMCA2NDAwMDAKKzEzNjYgMCA2ODAwMDAKKzEwNDIgMCA3MjAwMDAKKzE2MDAgMCA3NjAwMDAKKzg3NSAwIDgwMDAwMAorMTcyOCAwIDg0MDAwMAorMTI1NCAwIDg4MDAwMAorOTk0IDAgOTIwMDAwCisxNTkxIDAgOTYwMDAwCis2MjY1IDEgMTAwMDAwMAorMTAxOCAwIDEwNDAwMDAKKzgyNSAwIDEwODAwMDAKKzg2OSAwIDExMjAwMDAKKzkyMSAwIDExNjAwMDAKKzk3NSAwIDEyMDAwMDAKKzkyNCAwIDEyNDAwMDAKKzgzNCAwIDEyODAwMDAKKzEwNjYgMCAxMzIwMDAwCis3OTMgMCAxMzYwMDAwCis4ODkgMCAxNDAwMDAwCisyMDUwIDAgMTQ0MDAwMAorNjI3NiAxIDE0ODAwMDAKKzg4MSAwIDE1MjAwMDAKKzI2MCAwIDE1NjAwMDAKKzczMCAwIDE2MDAwMDAKKzQzMSAwIDE2NDAwMDAKKzM1MSAwIDE2ODAwMDAKKzMyMSAwIDE3MjAwMDAKKzM4MDIgMCAxNzYwMDAwCisxNDYgMCAxODAwMDAwCis2NDYyIDAgMTg0MDAwMAorMzI0NiAwIDE4ODAwMDAKKzUzMyAwIDE5MjAwMDAKKzYyMzEgMSAxOTYwMDAwCisxMzc4IDAgMjAwMDAwMAorNzE5IDAgMjA0MDAwMAorODE4IDAgMjA4MDAwMAorODU2IDAgMjEyMDAwMAorOTM3IDAgMjE2MDAwMAorNjExIDAgMjIwMDAwMAorMzAzMSAwIDIyNDAwMDAKKzEwNDEgMCAyMjgwMDAwCis2MDQgMCAyMzIwMDAwCis3MTQgMCAyMzYwMDAwCisxMjgzIDAgMjQwMDAwMAorNzU2NSAxIDI0NDAwMDAKKzYwMiAwIDI0ODAwMDAKKzUzMCAwIDI1MjAwMDAKKzI1NzkgMCAyNTYwMDAwCisxMTUgMCAyNjAwMDAwCisxMDU4IDAgMjY0MDAwMAorNjg5IDAgMjY4MDAwMAorMTExOSAwIDI3MjAwMDAKKzY5OCAwIDI3NjAwMDAKKzEwMDYgMCAyODAwMDAwCis1NDUgMCAyODQwMDAwCisxNjE3IDAgMjg4MDAwMAorOTEyMyAxIDI5MjAwMDAKKzUyNyAwIDI5NjAwMDAKKzE1NzYgMCAzMDAwMDAwCis0NjUgMCAzMDQwMDAwCis3NDEgMCAzMDgwMDAwCis1MjEgMCAzMTIwMDAwCisxMzIyIDAgMzE2MDAwMAorNzc1IDAgMzIwMDAwMAorODYzIDAgMzI0MDAwMAorOTEwIDAgMzI4MDAwMAorOTE1IDAgMzMyMDAwMAorOTI2IDAgMzM2MDAwMAorNzU1NiAxIDM0MDAwMDAKKzc0MSAwIDM0NDAwMDAKKzUyNyAwIDM0ODAwMDAKKzI1MTYgMCAzNTIwMDAwCis0NTkgMCAzNTYwMDAwCis0MDQgMCAzNjAwMDAwCis1MDkgMCAzNjQwMDAwCisxMjI3IDAgMzY4MDAwMAorMTU2MSAwIDM3MjAwMDAKKzQ5MCAwIDM3NjAwMDAKKzcxMiAwIDM4MDAwMDAKKzgwMyAwIDM4NDAwMDAKKzc1MjQgMSAzODgwMDAwCis3MzAgMCAzOTIwMDAwCis0NjEgMCAzOTYwMDAwCisyNTI2IDAgNDAwMDAwMAorNDUzIDAgNDA0MDAwMAorNjMyIDAgNDA4MDAwMAorNzgzIDAgNDEyMDAwMAorODQzIDAgNDE2MDAwMAorOTE4IDAgNDIwMDAwMAorOTYxIDAgNDI0MDAwMAorOTQ4IDAgNDI4MDAwMAorOTU5IDAgNDMyMDAwMAorNzU5OCAxIDQzNjAwMDAKKzY3OCAwIDQ0MDAwMDAKKzU2OSAwIDQ0NDAwMDAKKzg5MyAwIDQ0ODAwMDAKKzYyNCAwIDQ1MjAwMDAKKzc1NSAwIDQ1NjAwMDAKKzIyMzQgMCA0NjAwMDAwCis1NTYgMCA0NjQwMDAwCis5NDQgMCA0NjgwMDAwCis3MzkgMCA0NzIwMDAwCis4NjIgMCA0NzYwMDAwCis5MzggMCA0ODAwMDAwCis3NTc0IDEgNDg0MDAwMAorNjk5IDAgNDg4MDAwMAorNzAxIDAgNDkyMDAwMAorNTMwIDAgNDk2MDAwMAorNjg5IDAgNTAwMDAwMAorNzc4IDAgNTA0MDAwMAorODU2IDAgNTA4MDAwMAorOTMwIDAgNTEyMDAwMAorOTc1IDAgNTE2MDAwMAorMTAyMSAwIDUyMDAwMDAKKzEwNzQgMCA1MjQwMDAwCis5NzggMCA1MjgwMDAwCis4MDIxIDEgNTMyMDAwMAorNzA0IDAgNTM2MDAwMAorNjEwIDAgNTQwMDAwMAorNjk3IDAgNTQ0MDAwMAorNzExIDAgNTQ4MDAwMAorODIwIDAgNTUyMDAwMAorODQzIDAgNTU2MDAwMAorMjUxIDAgNTYwMDAwMAorMzM2NyAwIDU2NDAwMDAKKzUwNyAwIDU2ODAwMDAKKzMxNjggMSA1NzIwMDAwCis3NzkgMCA1NzYwMDAwCiszMTYgMCA1ODAwMDAwCis2MzUgMCA1ODQwMDAwCisyMDQgMCA1ODgwMDAwCis5NzggMCA1OTIwMDAwCisxMjcgMCA1OTYwMDAwCis1ODkgMCA2MDAwMDAwCis2MDQgMCA2MDQwMDAwCis2NjYgMCA2MDgwMDAwCis1ODIgMCA2MTIwMDAwCis3MjkgMCA2MTYwMDAwCis0MTUyIDEgNjIwMDAwMAorODU4IDAgNjI0MDAwMAorNzM5IDAgNjI4MDAwMAorODg1IDAgNjMyMDAwMAorNzQ5IDAgNjM2MDAwMAorOTUwIDAgNjQwMDAwMAorNTkzIDAgNjQ0MDAwMAorNzcxIDAgNjQ4MDAwMAorNjc4IDAgNjUyMDAwMAorNTI5IDAgNjU2MDAwMAorODM1IDAgNjYwMDAwMAorMzkxIDAgNjY0MDAwMAorNDY5MiAxIDY2ODAwMDAKKzQ3MyAwIDY3MjAwMDAKKzcyNCAwIDY3NjAwMDAKKzM4MSAwIDY4MDAwMDAKKzkwOSAwIDY4NDAwMDAKKzM5NCAwIDY4ODAwMDAKKzY1OSAwIDY5MjAwMDAKKzM2NyAwIDY5NjAwMDAKKzY1OCAwIDcwMDAwMDAKKzUyMyAwIDcwNDAwMDAKKzU1NCAwIDcwODAwMDAKKzU1MyAwIDcxMjAwMDAKKzYwODAgMSA3MTYwMDAwCis0OTYgMCA3MjAwMDAwCis3NjMgMCA3MjQwMDAwCis5MzkgMCA3MjgwMDAwCis3MTUgMCA3MzIwMDAwCis2NzIgMCA3MzYwMDAwCis2MTQgMCA3NDAwMDAwCis4MTEgMCA3NDQwMDAwCis5MTYgMCA3NDgwMDAwCisxMTUzIDAgNzUyMDAwMAorOTQwIDAgNzU2MDAwMAorMzIyIDAgNzYwMDAwMAorNjYxMyAxIDc2NDAwMDAKKzg1MSAwIDc2ODAwMDAKKzEwMDcgMCA3NzIwMDAwCis1MjAgMCA3NzYwMDAwCis0NTYgMCA3ODAwMDAwCis2MzkgMCA3ODQwMDAwCis3NTggMCA3ODgwMDAwCis4NzkgMCA3OTIwMDAwCisxMTUyIDAgNzk2MDAwMAorMTA2MSAwIDgwMDAwMDAKKzk0NiAwIDgwNDAwMDAKKzg1OSAwIDgwODAwMDAKKzM2MTAgMSA4MTIwMDAwCis4NzEgMCA4MTYwMDAwCis3NDYgMCA4MjAwMDAwCiszNjcgMCA4MjQwMDAwCiszOTcgMCA4MjgwMDAwCis5MzAgMCA4MzIwMDAwCiszMzcgMCA4MzYwMDAwCis0MTggMCA4NDAwMDAwCis3NDAgMCA4NDQwMDAwCis2MzcgMCA4NDgwMDAwCis2NjYgMCA4NTIwMDAwCis2MjcgMCA4NTYwMDAwCis0MzM4IDEgODYwMDAwMAorNzQ1IDAgODY0MDAwMAorNzgzIDAgODY4MDAwMAorNDY1IDAgODcyMDAwMAorNDYwIDAgODc2MDAwMAorNDU1IDAgODgwMDAwMAorNTA2IDAgODg0MDAwMAorNDkyIDAgODg4MDAwMAorNDg1IDAgODkyMDAwMAorNTE3IDAgODk2MDAwMAorNTM0IDAgOTAwMDAwMAorMzk1IDAgOTA0MDAwMAorNTYyNiAxIDkwODAwMDAKKzExNjkgMCA5MTIwMDAwCis1NjQgMCA5MTYwMDAwCisyNjEgMCA5MjAwMDAwCiszMjcgMCA5MjQwMDAwCiszMDMgMCA5MjgwMDAwCisxMTQ1IDAgOTMyMDAwMAorMjU3IDAgOTM2MDAwMAorNDk4IDAgOTQwMDAwMAorNDY1IDAgOTQ0MDAwMAorNDE0IDAgOTQ4MDAwMAorNTUzIDAgOTUyMDAwMAorNTYxNyAxIDk1NjAwMDAKKzEwNTIgMCA5NjAwMDAwCis1OTIgMCA5NjQwMDAwCiszMjMgMCA5NjgwMDAwCis0OTcgMCA5NzIwMDAwCis0NjcgMCA5NzYwMDAwCis3MDUgMCA5ODAwMDAwCisxMDg2IDAgOTg0MDAwMAorMTI1MyAwIDk4ODAwMDAKKzEyNTIgMCA5OTIwMDAwCis3NzYgMCA5OTYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY5MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3Y2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxNjY4MCAxIDE2NjY2CisxNzAxNyAwIDMzMzMzCisxMDUzNCAwIDUwMDAwCisxMDI4OSAwIDY2NjY2CiszNjk4IDAgODMzMzMKKzI3NzYgMCAxMDAwMDAKKzE5MzYgMCAxMTY2NjYKKzE0OTMgMCAxMzMzMzMKKzEyMTcgMCAxNTAwMDAKKzk5MyAwIDE2NjY2NgorODA1IDAgMTgzMzMzCis4NTcgMCAyMDAwMDAKKzUwODIgMSAyMTY2NjYKKzgxMiAwIDIzMzMzMworNzE4IDAgMjUwMDAwCis3NDYgMCAyNjY2NjYKKzc2MiAwIDI4MzMzMworODY1IDAgMzAwMDAwCis3ODIgMCAzMTY2NjYKKzgzMyAwIDMzMzMzMworNzUwIDAgMzUwMDAwCis4MTkgMCAzNjY2NjYKKzgyNiAwIDM4MzMzMworODQ2IDAgNDAwMDAwCis0NTIyIDEgNDE2NjY2Cis2NzggMCA0MzMzMzMKKzcxOCAwIDQ1MDAwMAorODAzIDAgNDY2NjY2Cis3NjkgMCA0ODMzMzMKKzc2MiAwIDUwMDAwMAorNTg3IDAgNTE2NjY2Cis2MzUgMCA1MzMzMzMKKzY1OCAwIDU1MDAwMAorNzE0IDAgNTY2NjY2Cis2NzcgMCA1ODMzMzMKKzY5OSAwIDYwMDAwMAorNDYxNiAxIDYxNjY2NgorODAwIDAgNjMzMzMzCis4MzEgMCA2NTAwMDAKKzkyOCAwIDY2NjY2NgorODY5IDAgNjgzMzMzCis5MzEgMCA3MDAwMDAKKzkzMCAwIDcxNjY2NgorOTc0IDAgNzMzMzMzCis5NzggMCA3NTAwMDAKKzkzMiAwIDc2NjY2NgorOTE4IDAgNzgzMzMzCis5NzggMCA4MDAwMDAKKzQ2NTUgMSA4MTY2NjYKKzg5NyAwIDgzMzMzMworODk2IDAgODUwMDAwCis4ODMgMCA4NjY2NjYKKzk0OSAwIDg4MzMzMworOTY1IDAgOTAwMDAwCis5NTEgMCA5MTY2NjYKKzkwMSAwIDkzMzMzMworOTY1IDAgOTUwMDAwCis5NTUgMCA5NjY2NjYKKzk0OCAwIDk4MzMzMworOTY4IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY3YzJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJhOWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDEgQEAKKzQ3IDMyIDAKKzIxMTE1IDEgMAorMTY0NTYgMCAzMzMzMworMTE4ODAgMCA2NjY2NgorMTIxNTUgMCAxMDAwMDAKKzExNDAyIDAgMTMzMzMzCis1MzQ1IDAgMTY2NjY2CisyOTg2IDAgMjAwMDAwCisxOTI0IDAgMjMzMzMzCisyMjc1IDAgMjY2NjY2CisyNzkzIDAgMzAwMDAwCisyNzU2IDAgMzMzMzMzCisyOTMzIDAgMzY2NjY2CisyMTEwMCAxIDQwMDAwMAorMTMwMiAwIDQzMzMzMworMjIwNiAwIDQ2NjY2NgorMTU5OSAwIDUwMDAwMAorMjU1OCAwIDUzMzMzMworMjc4NCAwIDU2NjY2NgorMjQ1OCAwIDYwMDAwMAorMjQ4MCAwIDYzMzMzMworMTQ0NiAwIDY2NjY2NgorMzEwOSAwIDcwMDAwMAorOTQ0IDAgNzMzMzMzCiszMTM0IDAgNzY2NjY2CisyMTM0MiAxIDgwMDAwMAorNjUyIDAgODMzMzMzCisxNzA4IDAgODY2NjY2CisyMjAyIDAgOTAwMDAwCisxNjk1IDAgOTMzMzMzCisxNjYxIDAgOTY2NjY2CisxNjUyIDAgMTAwMDAwMAorMTY3OSAwIDEwMzMzMzMKKzE2OTAgMCAxMDY2NjY2CisxODI0IDAgMTEwMDAwMAorMTgwMyAwIDExMzMzMzMKKzE1OTggMCAxMTY2NjY2CisyMTU0MCAxIDEyMDAwMDAKKzIwNSAwIDEyMzMzMzMKKzExMjQgMCAxMjY2NjY2CisxMDY5IDAgMTMwMDAwMAorODM4IDAgMTMzMzMzMworNzY1IDAgMTM2NjY2NgorNDI2NSAwIDE0MDAwMDAKKzk0IDAgMTQzMzMzMworMjA0NjMgMCAxNDY2NjY2CisxMDI4IDAgMTUwMDAwMAorMTQ3NSAwIDE1MzMzMzMKKzM2MzAgMCAxNTY2NjY2CisyODM3MyAxIDE2MDAwMDAKKzcyNSAwIDE2MzMzMzMKKzExMTkgMCAxNjY2NjY2CisxNDI3IDAgMTcwMDAwMAorMTY3OSAwIDE3MzMzMzMKKzE4NjYgMCAxNzY2NjY2CisxMTk3IDAgMTgwMDAwMAorMTU3MiAwIDE4MzMzMzMKKzE2NTEgMCAxODY2NjY2CisxNjc4IDAgMTkwMDAwMAorMTY4OCAwIDE5MzMzMzMKKzE2NTkgMCAxOTY2NjY2CisxOTkwMCAxIDIwMDAwMDAKKzU4NCAwIDIwMzMzMzMKKzE0NzUgMCAyMDY2NjY2CisxNjc4IDAgMjEwMDAwMAorMTAxMCAwIDIxMzMzMzMKKzE0MzUgMCAyMTY2NjY2CisxNjEyIDAgMjIwMDAwMAorMTYwMiAwIDIyMzMzMzMKKzE3MDkgMCAyMjY2NjY2CisxNzM3IDAgMjMwMDAwMAorMTgzNSAwIDIzMzMzMzMKKzkyNiAwIDIzNjY2NjYKKzIwMDkwIDEgMjQwMDAwMAorNjMxIDAgMjQzMzMzMworMTU3NiAwIDI0NjY2NjYKKzk0MSAwIDI1MDAwMDAKKzIzNDkgMCAyNTMzMzMzCisxMTEyIDAgMjU2NjY2NgorMTU2NiAwIDI2MDAwMDAKKzE3NzMgMCAyNjMzMzMzCis5NzkgMCAyNjY2NjY2CisyMjQ2IDAgMjcwMDAwMAorOTA0IDAgMjczMzMzMworMTM0MiAwIDI3NjY2NjYKKzIwMTQ3IDEgMjgwMDAwMAorNjMwIDAgMjgzMzMzMworOTgyIDAgMjg2NjY2NgorMjA4OSAwIDI5MDAwMDAKKzEwMjEgMCAyOTMzMzMzCisxNTA2IDAgMjk2NjY2NgorMTY0MiAwIDMwMDAwMDAKKzk2OCAwIDMwMzMzMzMKKzEyNjIgMCAzMDY2NjY2CisyMjcwIDAgMzEwMDAwMAorODY0IDAgMzEzMzMzMworMTI1MiAwIDMxNjY2NjYKKzIwMTQ1IDEgMzIwMDAwMAorNTk1IDAgMzIzMzMzMworOTE4IDAgMzI2NjY2NgorMTE2NyAwIDMzMDAwMDAKKzEzNDcgMCAzMzMzMzMzCisxNTk3IDAgMzM2NjY2NgorMTYzNiAwIDM0MDAwMDAKKzk0NCAwIDM0MzMzMzMKKzEyOTUgMCAzNDY2NjY2CisxMzk3IDAgMzUwMDAwMAorMTQxMyAwIDM1MzMzMzMKKzE0MzIgMCAzNTY2NjY2CisyMDE4MCAxIDM2MDAwMDAKKzUyNSAwIDM2MzMzMzMKKzEwNjggMCAzNjY2NjY2CisxMjMwIDAgMzcwMDAwMAorMTQyOCAwIDM3MzMzMzMKKzkxNiAwIDM3NjY2NjYKKzE5NDggMCAzODAwMDAwCis5NjYgMCAzODMzMzMzCisxMzQyIDAgMzg2NjY2NgorMTMzOCAwIDM5MDAwMDAKKzEzNzkgMCAzOTMzMzMzCisxMjk2IDAgMzk2NjY2NgorMTczNzggMSA0MDAwMDAwCis1ODMgMCA0MDMzMzMzCis5MzYgMCA0MDY2NjY2CisxNzQ1IDAgNDEwMDAwMAorOTg3IDAgNDEzMzMzMworMTM5MyAwIDQxNjY2NjYKKzE0OTUgMCA0MjAwMDAwCis4NjkgMCA0MjMzMzMzCisxOTM4IDAgNDI2NjY2NgorODI4IDAgNDMwMDAwMAorMTg1MSAwIDQzMzMzMzMKKzgzNCAwIDQzNjY2NjYKKzE3MjgwIDEgNDQwMDAwMAorNTgwIDAgNDQzMzMzMworODY5IDAgNDQ2NjY2NgorMTYwNSAwIDQ1MDAwMDAKKzg0MyAwIDQ1MzMzMzMKKzYxNDcgMSA0NTY2NjY2CisyMjAgMCA0NjAwMDAwCisxMTA2IDAgNDYzMzMzMworMzk1IDAgNDY2NjY2NgorMzA0IDAgNDcwMDAwMAorMTk0NiAwIDQ3MzMzMzMKKzE1NCAwIDQ3NjY2NjYKKzQ4MiAwIDQ4MDAwMDAKKzk0OSAwIDQ4MzMzMzMKKzEwODggMCA0ODY2NjY2Cis5NzQgMCA0OTAwMDAwCis4NzYgMCA0OTMzMzMzCis5MTY0IDEgNDk2NjY2NgorMTAxOSAwIDUwMDAwMDAKKzk4MyAwIDUwMzMzMzMKKzEzNzUgMCA1MDY2NjY2CisxMDQxIDAgNTEwMDAwMAorNzg5IDAgNTEzMzMzMworMTAzNyAwIDUxNjY2NjYKKzgxMiAwIDUyMDAwMDAKKzczMiAwIDUyMzMzMzMKKzk3MiAwIDUyNjY2NjYKKzcwOCAwIDUzMDAwMDAKKzYyMyAwIDUzMzMzMzMKKzEwNjY3IDEgNTM2NjY2NgorNDYzIDAgNTQwMDAwMAorOTExIDAgNTQzMzMzMworODYxIDAgNTQ2NjY2NgorNTA3IDAgNTUwMDAwMAorMTAxNSAwIDU1MzMzMzMKKzUwMSAwIDU1NjY2NjYKKzkzNCAwIDU2MDAwMDAKKzgxMiAwIDU2MzMzMzMKKzg1NSAwIDU2NjY2NjYKKzgwNCAwIDU3MDAwMDAKKzc4MyAwIDU3MzMzMzMKKzEwNjEwIDEgNTc2NjY2NgorOTUwIDAgNTgwMDAwMAorMTI5MiAwIDU4MzMzMzMKKzEwMDIgMCA1ODY2NjY2Cis3MjggMCA1OTAwMDAwCis5NjAgMCA1OTMzMzMzCisxMjMwIDAgNTk2NjY2NgorMTMxNSAwIDYwMDAwMDAKKzEyNDggMCA2MDMzMzMzCis5OTUgMCA2MDY2NjY2CisxNDAxIDAgNjEwMDAwMAorOTA1IDAgNjEzMzMzMworOTMyNiAxIDYxNjY2NjYKKzcyNiAwIDYyMDAwMDAKKzY2NyAwIDYyMzMzMzMKKzgzMyAwIDYyNjY2NjYKKzEwMDcgMCA2MzAwMDAwCisxMTcyIDAgNjMzMzMzMworMTkxMCAwIDYzNjY2NjYKKzE5NTQgMCA2NDAwMDAwCisxNDk4IDAgNjQzMzMzMworMTE4OCAwIDY0NjY2NjYKKzc4NCAwIDY1MDAwMDAKKzEwMDUgMCA2NTMzMzMzCisxMDAzMCAxIDY1NjY2NjYKKzQ1MiAwIDY2MDAwMDAKKzc2MyAwIDY2MzMzMzMKKzYzOSAwIDY2NjY2NjYKKzY3MSAwIDY3MDAwMDAKKzg2NyAwIDY3MzMzMzMKKzk2MyAwIDY3NjY2NjYKKzk4MiAwIDY4MDAwMDAKKzk5NSAwIDY4MzMzMzMKKzk4MiAwIDY4NjY2NjYKKzc0NyAwIDY5MDAwMDAKKzU3NCAwIDY5MzMzMzMKKzEyMzUzIDEgNjk2NjY2NgorNDc0IDAgNzAwMDAwMAorOTY5IDAgNzAzMzMzMworNjMzIDAgNzA2NjY2NgorNzIzIDAgNzEwMDAwMAorMTIyMSAwIDcxMzMzMzMKKzY3NCAwIDcxNjY2NjYKKzc3NiAwIDcyMDAwMDAKKzU3MiAwIDcyMzMzMzMKKzkxMiAwIDcyNjY2NjYKKzU2NCAwIDczMDAwMDAKKzU5NCAwIDczMzMzMzMKKzE2NjYxIDEgNzM2NjY2NgorNTE4IDAgNzQwMDAwMAorNjU2IDAgNzQzMzMzMworNjI1IDAgNzQ2NjY2NgorNTgzIDAgNzUwMDAwMAorNTg0IDAgNzUzMzMzMworMTAyNyAwIDc1NjY2NjYKKzgxMiAwIDc2MDAwMDAKKzcyOSAwIDc2MzMzMzMKKzc2NiAwIDc2NjY2NjYKKzkwMSAwIDc3MDAwMDAKKzk2MCAwIDc3MzMzMzMKKzEyMzM2IDEgNzc2NjY2NgorOTQ0IDAgNzgwMDAwMAorMTM5OCAwIDc4MzMzMzMKKzE2MjUgMCA3ODY2NjY2CisyMTAzIDAgNzkwMDAwMAorMTYzMCAwIDc5MzMzMzMKKzEyMjggMCA3OTY2NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VhZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5OSBAQAorMTkgMzIgMAorOCAzMiAwCis4IDMyIDAKKzUyOSAxIDAKKzMyOSAxIDEzNTAwCiszNDkgMSAzMzUwMAorMzM2IDEgNTM1MDAKKzM4MyAxIDczNTAwCiszNTkgMSA5MzUwMAorMzQ0IDEgMTEzNTAwCiszNDMgMSAxMzM1MDAKKzMzMiAxIDE1MzUwMAorMzIwIDEgMTczNTAwCiszMTkgMSAxOTM1MDAKKzMyMyAxIDIxMzUwMAorMzIwIDEgMjMzNTAwCiszMjggMSAyNTM1MDAKKzM0MCAxIDI3MzUwMAorMzE4IDEgMjkzNTAwCiszMTkgMSAzMTM1MDAKKzMzNSAxIDMzMzUwMAorNTExIDEgMzUzNTAwCiszOTUgMSAzNzM1MDAKKzMyNyAxIDM5MzUwMAorNDc5IDEgNDEzNTAwCiszMzIgMSA0MzM1MDAKKzMyMCAxIDQ1MzUwMAorMzIxIDEgNDczNTAwCiszMTAgMSA0OTM1MDAKKzMxMCAxIDUxMzUwMAorMzEwIDEgNTMzNTAwCiszMjYgMSA1NTM1MDAKKzMzMCAxIDU3MzUwMAorMzE4IDEgNTkzNTAwCiszMDkgMSA2MTM1MDAKKzMwNCAxIDYzMzUwMAorMjk4IDEgNjUzNTAwCisyOTQgMSA2NzM1MDAKKzMwMCAxIDY5MzUwMAorMzE0IDEgNzEzNTAwCiszMDQgMSA3MzM1MDAKKzMwNyAxIDc1MzUwMAorMzIxIDEgNzczNTAwCiszMzMgMSA3OTM1MDAKKzMzNSAxIDgxMzUwMAorMzA2IDEgODMzNTAwCiszMTUgMSA4NTM1MDAKKzMyMCAxIDg3MzUwMAorMzE1IDEgODkzNTAwCiszMDggMSA5MTM1MDAKKzMyMCAxIDkzMzUwMAorMzExIDEgOTUzNTAwCiszMTEgMSA5NzM1MDAKKzMxMyAxIDk5MzUwMAorMzE0IDEgMTAxMzUwMAorMzA4IDEgMTAzMzUwMAorMzA3IDEgMTA1MzUwMAorMzE3IDEgMTA3MzUwMAorMzI4IDEgMTA5MzUwMAorMzE3IDEgMTExMzUwMAorMzEyIDEgMTEzMzUwMAorMzA4IDEgMTE1MzUwMAorMzE1IDEgMTE3MzUwMAorMzIwIDEgMTE5MzUwMAorMzIyIDEgMTIxMzUwMAorMzIzIDEgMTIzMzUwMAorMzIyIDEgMTI1MzUwMAorMzIyIDEgMTI3MzUwMAorMzAxIDEgMTI5MzUwMAorMzAzIDEgMTMxMzUwMAorMzA4IDEgMTMzMzUwMAorMjk5IDEgMTM1MzUwMAorMjk3IDEgMTM3MzUwMAorMjkzIDEgMTM5MzUwMAorMjk1IDEgMTQxMzUwMAorMjk3IDEgMTQzMzUwMAorMzAwIDEgMTQ1MzUwMAorMjk0IDEgMTQ3MzUwMAorMjk5IDEgMTQ5MzUwMAorMjk2IDEgMTUxMzUwMAorMzAzIDEgMTUzMzUwMAorMzEzIDEgMTU1MzUwMAorMzA2IDEgMTU3MzUwMAorMzAzIDEgMTU5MzUwMAorMzExIDEgMTYxMzUwMAorMzA3IDEgMTYzMzUwMAorMzEwIDEgMTY1MzUwMAorMzM5IDEgMTY3MzUwMAorMzI1IDEgMTY5MzUwMAorMzIwIDEgMTcxMzUwMAorMzE1IDEgMTczMzUwMAorMzE2IDEgMTc1MzUwMAorMzM4IDEgMTc3MzUwMAorMzI1IDEgMTc5MzUwMAorMzI1IDEgMTgxMzUwMAorMzI4IDEgMTgzMzUwMAorMzA0IDEgMTg1MzUwMAorMjk3IDEgMTg3MzUwMAorMzIyIDEgMTg5MzUwMAorMzExIDEgMTkxMzUwMAorMzA3IDEgMTkzMzUwMAorMzAwIDEgMTk1MzUwMAorMzAxIDEgMTk3MzUwMAorMzA5IDEgMTk5MzUwMAorMzAwIDEgMjAxMzUwMAorMzA2IDEgMjAzMzUwMAorMzA1IDEgMjA1MzUwMAorMjk4IDEgMjA3MzUwMAorMjkxIDEgMjA5MzUwMAorMzAxIDEgMjExMzUwMAorMzAwIDEgMjEzMzUwMAorNDM5IDEgMjE1MzUwMAorMjkyIDEgMjE3MzUwMAorMzA4IDEgMjE5MzUwMAorMzA1IDEgMjIxMzUwMAorMjk4IDEgMjIzMzUwMAorMjk3IDEgMjI1MzUwMAorMjkzIDEgMjI3MzUwMAorNDA4IDEgMjI5MzUwMAorMjk4IDEgMjMxMzUwMAorNDUyIDEgMjMzMzUwMAorMjk3IDEgMjM1MzUwMAorMzAzIDEgMjM3MzUwMAorMzAwIDEgMjM5MzUwMAorMzEwIDEgMjQxMzUwMAorMjk5IDEgMjQzMzUwMAorMzA2IDEgMjQ1MzUwMAorMzE2IDEgMjQ3MzUwMAorMzA4IDEgMjQ5MzUwMAorMzEzIDEgMjUxMzUwMAorMzA5IDEgMjUzMzUwMAorMzEwIDEgMjU1MzUwMAorMzE1IDEgMjU3MzUwMAorMzA5IDEgMjU5MzUwMAorMzE3IDEgMjYxMzUwMAorMzExIDEgMjYzMzUwMAorMzI4IDEgMjY1MzUwMAorMzMzIDEgMjY3MzUwMAorMzI2IDEgMjY5MzUwMAorMzIzIDEgMjcxMzUwMAorMzE2IDEgMjczMzUwMAorMzI1IDEgMjc1MzUwMAorMzE2IDEgMjc3MzUwMAorMzE5IDEgMjc5MzUwMAorMzI2IDEgMjgxMzUwMAorMzIwIDEgMjgzMzUwMAorMzI4IDEgMjg1MzUwMAorMzEyIDEgMjg3MzUwMAorMzE0IDEgMjg5MzUwMAorMzA5IDEgMjkxMzUwMAorMzA2IDEgMjkzMzUwMAorMjk1IDEgMjk1MzUwMAorMzA0IDEgMjk3MzUwMAorMzI2IDEgMjk5MzUwMAorMjkxIDEgMzAxMzUwMAorMjk5IDEgMzAzMzUwMAorMjkzIDEgMzA1MzUwMAorMjg4IDEgMzA3MzUwMAorMjk0IDEgMzA5MzUwMAorMjkyIDEgMzExMzUwMAorMjkyIDEgMzEzMzUwMAorMjg4IDEgMzE1MzUwMAorMzA4IDEgMzE3MzUwMAorMzA0IDEgMzE5MzUwMAorMjkyIDEgMzIxMzUwMAorMzgyIDEgMzIzMzUwMAorMzgxIDEgMzI1MzUwMAorMjk5IDEgMzI3MzUwMAorMzE2IDEgMzI5MzUwMAorMzA4IDEgMzMxMzUwMAorMzAxIDEgMzMzMzUwMAorMjk3IDEgMzM1MzUwMAorMjk5IDEgMzM3MzUwMAorMjk0IDEgMzM5MzUwMAorMjk1IDEgMzQxMzUwMAorMzE3IDEgMzQzMzUwMAorMjk3IDEgMzQ1MzUwMAorMzA5IDEgMzQ3MzUwMAorMzEzIDEgMzQ5MzUwMAorMzIwIDEgMzUxMzUwMAorMzI5IDEgMzUzMzUwMAorMzMwIDEgMzU1MzUwMAorMzI0IDEgMzU3MzUwMAorMzI0IDEgMzU5MzUwMAorMzA5IDEgMzYxMzUwMAorMzA0IDEgMzYzMzUwMAorMzEzIDEgMzY1MzUwMAorMzEyIDEgMzY3MzUwMAorMjk5IDEgMzY5MzUwMAorMjk1IDEgMzcxMzUwMAorMzAxIDEgMzczMzUwMAorMjk1IDEgMzc1MzUwMAorMjk3IDEgMzc3MzUwMAorMzAyIDEgMzc5MzUwMAorMjk4IDEgMzgxMzUwMAorMjk5IDEgMzgzMzUwMAorMjk2IDEgMzg1MzUwMAorMjkyIDEgMzg3MzUwMAorMzA3IDEgMzg5MzUwMAorMzAzIDEgMzkxMzUwMAorMzEzIDEgMzkzMzUwMAorMzE4IDEgMzk1MzUwMAorMzEzIDEgMzk3MzUwMAorMzUzIDEgMzk5MzUwMAorMzcxIDEgNDAxMzUwMAorMjkyIDEgNDAzMzUwMAorMzAwIDEgNDA1MzUwMAorMzgxIDEgNDA3MzUwMAorMjk0IDEgNDA5MzUwMAorMzAxIDEgNDExMzUwMAorMzA1IDEgNDEzMzUwMAorMjk5IDEgNDE1MzUwMAorMzA1IDEgNDE3MzUwMAorMzIyIDEgNDE5MzUwMAorMzE1IDEgNDIxMzUwMAorMzI2IDEgNDIzMzUwMAorMzM4IDEgNDI1MzUwMAorMzIwIDEgNDI3MzUwMAorMzE5IDEgNDI5MzUwMAorMzI3IDEgNDMxMzUwMAorMzMwIDEgNDMzMzUwMAorMzEwIDEgNDM1MzUwMAorMzAzIDEgNDM3MzUwMAorMjk5IDEgNDM5MzUwMAorMjkzIDEgNDQxMzUwMAorMjkzIDEgNDQzMzUwMAorMjk0IDEgNDQ1MzUwMAorMjk1IDEgNDQ3MzUwMAorMjk1IDEgNDQ5MzUwMAorMzIzIDEgNDUxMzUwMAorMzA5IDEgNDUzMzUwMAorMzA5IDEgNDU1MzUwMAorMzAxIDEgNDU3MzUwMAorNDczIDEgNDU5MzUwMAorMjkxIDEgNDYxMzUwMAorMjk3IDEgNDYzMzUwMAorMjk0IDEgNDY1MzUwMAorMjkzIDEgNDY3MzUwMAorMzA0IDEgNDY5MzUwMAorMjkyIDEgNDcxMzUwMAorMzAyIDEgNDczMzUwMAorMjk2IDEgNDc1MzUwMAorMjk4IDEgNDc3MzUwMAorMzAxIDEgNDc5MzUwMAorMzA3IDEgNDgxMzUwMAorMjg1IDEgNDgzMzUwMAorMjk0IDEgNDg1MzUwMAorMzA0IDEgNDg3MzUwMAorMjk0IDEgNDg5MzUwMAorMjk1IDEgNDkxMzUwMAorMzI1IDEgNDkzMzUwMAorMzE5IDEgNDk1MzUwMAorMzIzIDEgNDk3MzUwMAorMzEzIDEgNDk5MzUwMAorMzAzIDEgNTAxMzUwMAorMjk2IDEgNTAzMzUwMAorMjk1IDEgNTA1MzUwMAorMjkwIDEgNTA3MzUwMAorMjk3IDEgNTA5MzUwMAorMjk2IDEgNTExMzUwMAorMjk2IDEgNTEzMzUwMAorMjkyIDEgNTE1MzUwMAorMjk1IDEgNTE3MzUwMAorMjg3IDEgNTE5MzUwMAorMjk0IDEgNTIxMzUwMAorMjkwIDEgNTIzMzUwMAorMjk3IDEgNTI1MzUwMAorMjk3IDEgNTI3MzUwMAorMjk3IDEgNTI5MzUwMAorMjkyIDEgNTMxMzUwMAorMjk3IDEgNTMzMzUwMAorMjkwIDEgNTM1MzUwMAorMjkzIDEgNTM3MzUwMAorMjkzIDEgNTM5MzUwMAorMjkxIDEgNTQxMzUwMAorMjkyIDEgNTQzMzUwMAorMjkwIDEgNTQ1MzUwMAorMjkxIDEgNTQ3MzUwMAorMjk2IDEgNTQ5MzUwMAorMjk1IDEgNTUxMzUwMAorMzI3IDEgNTUzMzUwMAorMjkzIDEgNTU1MzUwMAorMjkxIDEgNTU3MzUwMAorMjkxIDEgNTU5MzUwMAorMzExIDEgNTYxMzUwMAorMjkxIDEgNTYzMzUwMAorMjk0IDEgNTY1MzUwMAorMjk2IDEgNTY3MzUwMAorMjk1IDEgNTY5MzUwMAorMjg5IDEgNTcxMzUwMAorMjk1IDEgNTczMzUwMAorMjk1IDEgNTc1MzUwMAorMjk3IDEgNTc3MzUwMAorMjkyIDEgNTc5MzUwMAorMjk3IDEgNTgxMzUwMAorMjkyIDEgNTgzMzUwMAorMjk1IDEgNTg1MzUwMAorMjk2IDEgNTg3MzUwMAorMjk1IDEgNTg5MzUwMAorMzAzIDEgNTkxMzUwMAorMzA0IDEgNTkzMzUwMAorMzAxIDEgNTk1MzUwMAorMzA3IDEgNTk3MzUwMAorMzA0IDEgNTk5MzUwMAorMzEwIDEgNjAxMzUwMAorMzEwIDEgNjAzMzUwMAorMzA1IDEgNjA1MzUwMAorMzAxIDEgNjA3MzUwMAorMzAyIDEgNjA5MzUwMAorMzA1IDEgNjExMzUwMAorMjk4IDEgNjEzMzUwMAorMzAwIDEgNjE1MzUwMAorMzAwIDEgNjE3MzUwMAorMjkyIDEgNjE5MzUwMAorMjk3IDEgNjIxMzUwMAorMzAxIDEgNjIzMzUwMAorMjk3IDEgNjI1MzUwMAorMjk3IDEgNjI3MzUwMAorMjk4IDEgNjI5MzUwMAorMjk3IDEgNjMxMzUwMAorMzAwIDEgNjMzMzUwMAorMjkzIDEgNjM1MzUwMAorMjkzIDEgNjM3MzUwMAorMjk3IDEgNjM5MzUwMAorMjk0IDEgNjQxMzUwMAorMzA3IDEgNjQzMzUwMAorMzAyIDEgNjQ1MzUwMAorMzA3IDEgNjQ3MzUwMAorMzIwIDEgNjQ5MzUwMAorMzMwIDEgNjUxMzUwMAorMzMzIDEgNjUzMzUwMAorMzM3IDEgNjU1MzUwMAorMzMxIDEgNjU3MzUwMAorMzIzIDEgNjU5MzUwMAorMzEyIDEgNjYxMzUwMAorMzI2IDEgNjYzMzUwMAorMzI4IDEgNjY1MzUwMAorMzMyIDEgNjY3MzUwMAorMzMzIDEgNjY5MzUwMAorMzQwIDEgNjcxMzUwMAorMzM2IDEgNjczMzUwMAorMzI0IDEgNjc1MzUwMAorMzEyIDEgNjc3MzUwMAorMzAxIDEgNjc5MzUwMAorMjg5IDEgNjgxMzUwMAorMzAyIDEgNjgzMzUwMAorMjk2IDEgNjg1MzUwMAorMjk5IDEgNjg3MzUwMAorMjg5IDEgNjg5MzUwMAorMjk1IDEgNjkxMzUwMAorMjk5IDEgNjkzMzUwMAorMzc0IDEgNjk1MzUwMAorMzkxIDEgNjk3MzUwMAorMzY1IDEgNjk5MzUwMAorMzQwIDEgNzAxMzUwMAorMzMwIDEgNzAzMzUwMAorMzM3IDEgNzA1MzUwMAorMzI4IDEgNzA3MzUwMAorMzI5IDEgNzA5MzUwMAorMzE5IDEgNzExMzUwMAorMzEyIDEgNzEzMzUwMAorMzA4IDEgNzE1MzUwMAorMzA0IDEgNzE3MzUwMAorMzEyIDEgNzE5MzUwMAorMzExIDEgNzIxMzUwMAorMzE2IDEgNzIzMzUwMAorMjk5IDEgNzI1MzUwMAorMzMwIDEgNzI3MzUwMAorMzMwIDEgNzI5MzUwMAorMzMwIDEgNzMxMzUwMAorMzQyIDEgNzMzMzUwMAorNDM5IDEgNzM1MzUwMAorMzIyIDEgNzM3MzUwMAorMjk4IDEgNzM5MzUwMAorMjkzIDEgNzQxMzUwMAorMzEwIDEgNzQzMzUwMAorMzAzIDEgNzQ1MzUwMAorMzE3IDEgNzQ3MzUwMAorNDUzIDEgNzQ5MzUwMAorMzc3IDEgNzUxMzUwMAorMzc0IDEgNzUzMzUwMAorMjkyIDEgNzU1MzUwMAorMjk1IDEgNzU3MzUwMAorMjc0IDEgNzU5MzUwMAorMjkyIDEgNzYxMzUwMAorMjkxIDEgNzYzMzUwMAorMzY3IDEgNzY1MzUwMAorMjk1IDEgNzY3MzUwMAorMjk4IDEgNzY5MzUwMAorMjk3IDEgNzcxMzUwMAorMzAxIDEgNzczMzUwMAorMjkyIDEgNzc1MzUwMAorMzQ0IDEgNzc3MzUwMAorMjk2IDEgNzc5MzUwMAorMjk3IDEgNzgxMzUwMAorMzA2IDEgNzgzMzUwMAorMzA4IDEgNzg1MzUwMAorMzA1IDEgNzg3MzUwMAorMzEzIDEgNzg5MzUwMAorMzA2IDEgNzkxMzUwMAorMzIyIDEgNzkzMzUwMAorMzEzIDEgNzk1MzUwMAorMzA1IDEgNzk3MzUwMAorMzA0IDEgNzk5MzUwMAorMzEzIDEgODAxMzUwMAorMzI0IDEgODAzMzUwMAorMzEyIDEgODA1MzUwMAorMzE4IDEgODA3MzUwMAorMzExIDEgODA5MzUwMAorMzAyIDEgODExMzUwMAorMzA1IDEgODEzMzUwMAorMzEyIDEgODE1MzUwMAorMzEzIDEgODE3MzUwMAorMzEyIDEgODE5MzUwMAorMzM1IDEgODIxMzUwMAorMzMzIDEgODIzMzUwMAorMzQ2IDEgODI1MzUwMAorMzM5IDEgODI3MzUwMAorMzM3IDEgODI5MzUwMAorMzQxIDEgODMxMzUwMAorMzM1IDEgODMzMzUwMAorMzI1IDEgODM1MzUwMAorMzI0IDEgODM3MzUwMAorMzE3IDEgODM5MzUwMAorMzE1IDEgODQxMzUwMAorMzAzIDEgODQzMzUwMAorMzE3IDEgODQ1MzUwMAorNDUyIDEgODQ3MzUwMAorMzI0IDEgODQ5MzUwMAorMzIxIDEgODUxMzUwMAorMzM1IDEgODUzMzUwMAorMzI3IDEgODU1MzUwMAorMzE1IDEgODU3MzUwMAorMzIxIDEgODU5MzUwMAorMzE5IDEgODYxMzUwMAorMzA4IDEgODYzMzUwMAorMzE0IDEgODY1MzUwMAorMzIyIDEgODY3MzUwMAorMzI4IDEgODY5MzUwMAorMzIwIDEgODcxMzUwMAorMzI0IDEgODczMzUwMAorMzMxIDEgODc1MzUwMAorMzMwIDEgODc3MzUwMAorMzI4IDEgODc5MzUwMAorMzE4IDEgODgxMzUwMAorMzE0IDEgODgzMzUwMAorMzE4IDEgODg1MzUwMAorMzE4IDEgODg3MzUwMAorMzI1IDEgODg5MzUwMAorMzM4IDEgODkxMzUwMAorMzQxIDEgODkzMzUwMAorMzMzIDEgODk1MzUwMAorMzMwIDEgODk3MzUwMAorMzM4IDEgODk5MzUwMAorMzMzIDEgOTAxMzUwMAorMzMwIDEgOTAzMzUwMAorMzQ0IDEgOTA1MzUwMAorNDc5IDEgOTA3MzUwMAorNDczIDEgOTA5MzUwMAorMzMzIDEgOTExMzUwMAorMzM3IDEgOTEzMzUwMAorNDk1IDEgOTE1MzUwMAorMzUzIDEgOTE3MzUwMAorMzUyIDEgOTE5MzUwMAorMzQ0IDEgOTIxMzUwMAorMzM2IDEgOTIzMzUwMAorMzI0IDEgOTI1MzUwMAorMzIxIDEgOTI3MzUwMAorMzUwIDEgOTI5MzUwMAorMzQ3IDEgOTMxMzUwMAorMzQzIDEgOTMzMzUwMAorMzQ1IDEgOTM1MzUwMAorMzM3IDEgOTM3MzUwMAorMzM1IDEgOTM5MzUwMAorMzMzIDEgOTQxMzUwMAorMzM2IDEgOTQzMzUwMAorMzM0IDEgOTQ1MzUwMAorMzMzIDEgOTQ3MzUwMAorMzMxIDEgOTQ5MzUwMAorMzI5IDEgOTUxMzUwMAorMzE5IDEgOTUzMzUwMAorMzIxIDEgOTU1MzUwMAorMzE2IDEgOTU3MzUwMAorMzIyIDEgOTU5MzUwMAorNDQ4IDEgOTYxMzUwMAorMzEyIDEgOTYzMzUwMAorMzA2IDEgOTY1MzUwMAorMzAxIDEgOTY3MzUwMAorMzAzIDEgOTY5MzUwMAorMjk2IDEgOTcxMzUwMAorMzAwIDEgOTczMzUwMAorMjk1IDEgOTc1MzUwMAorMzAwIDEgOTc3MzUwMAorMjk3IDEgOTc5MzUwMAorMzAwIDEgOTgxMzUwMAorMjk3IDEgOTgzMzUwMAorNTEyIDEgOTg1MzUwMAorMjkyIDEgOTg3MzUwMAorNDY4IDEgOTg5MzUwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZiODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJmNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0OWViMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUyNGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KQEAgLTAsMCArMSwxMCBAQAorMTYzODQgMSAwCisxNjM4NCAxIDEwMjQwMDAKKzE2Mzg0IDEgMjA0ODAwMAorMTYzODQgMSAzMDcyMDAwCisxNjM4NCAxIDQwOTYwMDAKKzE2Mzg0IDEgNTEyMDAwMAorMTYzODQgMSA2MTQ0MDAwCisxNjM4NCAxIDcxNjgwMDAKKzE2Mzg0IDEgODE5MjAwMAorMTA5MjQgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGIyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE2ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDUyMCBAQAorMzAgMzIgMAorNDE0MCAzMiAwCiszMyAzMiAwCis1MiAxIDAKKzU4IDEgMjY2NgorNjEgMSA1MzMzCis1NiAxIDgwMDAKKzU5IDEgMTA2NjYKKzYzIDEgMTMzMzMKKzY2IDEgMTYwMDAKKzcxIDEgMTg2NjYKKzc2IDEgMjEzMzMKKzM3NCAxIDI0MDAwCiszNjYgMSAzNjAwMAorMzc4IDEgNTczMzMKKzM5MyAxIDc4NjY2CiszOTMgMSAxMDAwMDAKKzM4NiAxIDEyMTMzMworMzc1IDEgMTQyNjY2CiszODggMSAxNjQwMDAKKzM3OCAxIDE4NTMzMworMzc5IDEgMjA2NjY2CiszNzQgMSAyMjgwMDAKKzM1NiAxIDI0OTMzMworMzU4IDEgMjcwNjY2CiszMzIgMSAyOTIwMDAKKzMzNSAxIDMxMzMzMworMzYzIDEgMzM0NjY2CiszNDEgMSAzNTYwMDAKKzM2MCAxIDM3NzMzMworMzQxIDEgMzk4NjY2CiszMzUgMSA0MjAwMDAKKzM1NyAxIDQ0MTMzMworMzU1IDEgNDYyNjY2CiszNjMgMSA0ODQwMDAKKzM4MiAxIDUwNTMzMworMzcxIDEgNTI2NjY2CiszNTcgMSA1NDgwMDAKKzM1MyAxIDU2OTMzMworMzUwIDEgNTkwNjY2CiszMjcgMSA2MTIwMDAKKzMxNSAxIDYzMzMzMworMzA3IDEgNjU0NjY2CiszMDMgMSA2NzYwMDAKKzI5NSAxIDY5NzMzMworMzEyIDEgNzE4NjY2CiszMTYgMSA3NDAwMDAKKzMxNSAxIDc2MTMzMworMzE4IDEgNzgyNjY2CiszMzAgMSA4MDQwMDAKKzMxOCAxIDgyNTMzMworMzE1IDEgODQ2NjY2CiszMjIgMSA4NjgwMDAKKzMxNSAxIDg4OTMzMworMzEwIDEgOTEwNjY2CiszMTUgMSA5MzIwMDAKKzMxNCAxIDk1MzMzMworMzAyIDEgOTc0NjY2CiszMTMgMSA5OTYwMDAKKzMyMiAxIDEwMTczMzMKKzMyMyAxIDEwMzg2NjYKKzMxOSAxIDEwNjAwMDAKKzMyNSAxIDEwODEzMzMKKzMyOCAxIDExMDI2NjYKKzMzMCAxIDExMjQwMDAKKzMzMyAxIDExNDUzMzMKKzMzMCAxIDExNjY2NjYKKzM0NCAxIDExODgwMDAKKzMzMSAxIDEyMDkzMzMKKzM0MiAxIDEyMzA2NjYKKzMzOSAxIDEyNTIwMDAKKzMxNCAxIDEyNzMzMzMKKzI4NSAxIDEyOTQ2NjYKKzI5NSAxIDEzMTYwMDAKKzMwMiAxIDEzMzczMzMKKzMwNSAxIDEzNTg2NjYKKzMwOSAxIDEzODAwMDAKKzMyNyAxIDE0MDEzMzMKKzMwNCAxIDE0MjI2NjYKKzMzNiAxIDE0NDQwMDAKKzM1MCAxIDE0NjUzMzMKKzM0NiAxIDE0ODY2NjYKKzM1MiAxIDE1MDgwMDAKKzM0MSAxIDE1MjkzMzMKKzM0MyAxIDE1NTA2NjYKKzM1MSAxIDE1NzIwMDAKKzMxOSAxIDE1OTMzMzMKKzMyOCAxIDE2MTQ2NjYKKzMyOCAxIDE2MzYwMDAKKzMyNCAxIDE2NTczMzMKKzMzOCAxIDE2Nzg2NjYKKzMxNyAxIDE3MDAwMDAKKzMyOCAxIDE3MjEzMzMKKzMzNSAxIDE3NDI2NjYKKzM0MSAxIDE3NjQwMDAKKzMzNSAxIDE3ODUzMzMKKzM0OCAxIDE4MDY2NjYKKzM2MiAxIDE4MjgwMDAKKzM2MSAxIDE4NDkzMzMKKzM0NCAxIDE4NzA2NjYKKzM0MCAxIDE4OTIwMDAKKzMzMyAxIDE5MTMzMzMKKzMyOSAxIDE5MzQ2NjYKKzMyOCAxIDE5NTYwMDAKKzMyMyAxIDE5NzczMzMKKzMxMCAxIDE5OTg2NjYKKzMxOCAxIDIwMjAwMDAKKzMxMiAxIDIwNDEzMzMKKzI5NSAxIDIwNjI2NjYKKzMyOSAxIDIwODQwMDAKKzMxOCAxIDIxMDUzMzMKKzMxMSAxIDIxMjY2NjYKKzMxNyAxIDIxNDgwMDAKKzYyIDEgMjE2OTMzMworNzUgMSAyMTgxMzMzCis3MyAxIDIxODQwMDAKKzMzMiAxIDIxODY2NjYKKzMyNyAxIDIxOTg2NjYKKzMzMiAxIDIyMjAwMDAKKzMyNSAxIDIyNDEzMzMKKzMyOSAxIDIyNjI2NjYKKzMzMCAxIDIyODQwMDAKKzYxIDEgMjMwNTMzMworNjEgMSAyMzE3MzMzCis3MCAxIDIzMjAwMDAKKzcwIDEgMjMyMjY2NgorMzE5IDEgMjMyNTMzMworMzAzIDEgMjMzNzMzMworMjkyIDEgMjM1ODY2NgorMzEzIDEgMjM4MDAwMAorMzE4IDEgMjQwMTMzMworMzQ2IDEgMjQyMjY2NgorMzI4IDEgMjQ0NDAwMAorMzE2IDEgMjQ2NTMzMworMzQxIDEgMjQ4NjY2NgorMzI4IDEgMjUwODAwMAorMzM4IDEgMjUyOTMzMworMzQxIDEgMjU1MDY2NgorMzM3IDEgMjU3MjAwMAorMzQ3IDEgMjU5MzMzMworMzg0IDEgMjYxNDY2NgorMzU4IDEgMjYzNjAwMAorMzYzIDEgMjY1NzMzMworMzYzIDEgMjY3ODY2NgorMzU4IDEgMjcwMDAwMAorMzM5IDEgMjcyMTMzMworMzY5IDEgMjc0MjY2NgorMzQzIDEgMjc2NDAwMAorMzQ4IDEgMjc4NTMzMworMzYzIDEgMjgwNjY2NgorMzUwIDEgMjgyODAwMAorMzU4IDEgMjg0OTMzMworMzUyIDEgMjg3MDY2NgorMzM4IDEgMjg5MjAwMAorMzM1IDEgMjkxMzMzMworMzQyIDEgMjkzNDY2NgorMzM4IDEgMjk1NjAwMAorMzQwIDEgMjk3NzMzMworMjkyIDEgMjk5ODY2NgorMjc5IDEgMzAyMDAwMAorMjk5IDEgMzA0MTMzMworMzAzIDEgMzA2MjY2NgorMjk4IDEgMzA4NDAwMAorMjk3IDEgMzEwNTMzMworMjgwIDEgMzEyNjY2NgorMjk3IDEgMzE0ODAwMAorMjkwIDEgMzE2OTMzMworMzA2IDEgMzE5MDY2NgorMzAxIDEgMzIxMjAwMAorMzA2IDEgMzIzMzMzMworMjg5IDEgMzI1NDY2NgorMzExIDEgMzI3NjAwMAorMzE3IDEgMzI5NzMzMworMzQ0IDEgMzMxODY2NgorMzA4IDEgMzM0MDAwMAorMzA0IDEgMzM2MTMzMworMzA0IDEgMzM4MjY2NgorMzEyIDEgMzQwNDAwMAorMzA1IDEgMzQyNTMzMworMjk5IDEgMzQ0NjY2NgorMzAxIDEgMzQ2ODAwMAorMzE4IDEgMzQ4OTMzMworMzEzIDEgMzUxMDY2NgorMzMwIDEgMzUzMjAwMAorMzI1IDEgMzU1MzMzMworMzI1IDEgMzU3NDY2NgorMzIxIDEgMzU5NjAwMAorMzQ5IDEgMzYxNzMzMworMjg4IDEgMzYzODY2NgorMzAwIDEgMzY2MDAwMAorMzEyIDEgMzY4MTMzMworMzAyIDEgMzcwMjY2NgorMjc4IDEgMzcyNDAwMAorMjg0IDEgMzc0NTMzMworMjg2IDEgMzc2NjY2NgorMjc0IDEgMzc4ODAwMAorMjk1IDEgMzgwOTMzMworMjgxIDEgMzgzMDY2NgorMjg4IDEgMzg1MjAwMAorMjc4IDEgMzg3MzMzMworMzA2IDEgMzg5NDY2NgorNjIgMSAzOTE2MDAwCis1OSAxIDM5MjgwMDAKKzYxIDEgMzkzMDY2NgorNTUgMSAzOTMzMzMzCis3MCAxIDM5MzYwMDAKKzcyIDEgMzkzODY2NgorMzI0IDEgMzk0MTMzMworMzA5IDEgMzk1MzMzMworMzAxIDEgMzk3NDY2NgorMzAxIDEgMzk5NjAwMAorMjkxIDEgNDAxNzMzMworMjg5IDEgNDAzODY2NgorMzA2IDEgNDA2MDAwMAorMzA1IDEgNDA4MTMzMworMjg2IDEgNDEwMjY2NgorMjk0IDEgNDEyNDAwMAorMjkwIDEgNDE0NTMzMworMjk3IDEgNDE2NjY2NgorMzA4IDEgNDE4ODAwMAorMjk2IDEgNDIwOTMzMworMjkyIDEgNDIzMDY2NgorMjg3IDEgNDI1MjAwMAorMjkxIDEgNDI3MzMzMworMjk4IDEgNDI5NDY2NgorMjk1IDEgNDMxNjAwMAorMjk0IDEgNDMzNzMzMworMjk1IDEgNDM1ODY2NgorMjc1IDEgNDM4MDAwMAorMjgwIDEgNDQwMTMzMworMjg4IDEgNDQyMjY2NgorMjg1IDEgNDQ0NDAwMAorMjc0IDEgNDQ2NTMzMworMjk4IDEgNDQ4NjY2NgorMzAxIDEgNDUwODAwMAorMzAwIDEgNDUyOTMzMworMzA1IDEgNDU1MDY2NgorMjk3IDEgNDU3MjAwMAorNTkgMSA0NTkzMzMzCis1NiAxIDQ2MDUzMzMKKzU3IDEgNDYwODAwMAorNTUgMSA0NjEwNjY2Cis1OCAxIDQ2MTMzMzMKKzU3IDEgNDYxNjAwMAorNTggMSA0NjE4NjY2Cis2OCAxIDQ2MjEzMzMKKzY3IDEgNDYyNDAwMAorNzEgMSA0NjI2NjY2CisyODkgMSA0NjI5MzMzCisyODIgMSA0NjQxMzMzCisyNzMgMSA0NjYyNjY2CisyNzkgMSA0Njg0MDAwCisyODYgMSA0NzA1MzMzCisyODIgMSA0NzI2NjY2CisyODQgMSA0NzQ4MDAwCisyNzggMSA0NzY5MzMzCisyODEgMSA0NzkwNjY2CisyODAgMSA0ODEyMDAwCisyNjMgMSA0ODMzMzMzCisyNjAgMSA0ODU0NjY2CisyNzEgMSA0ODc2MDAwCisyNzMgMSA0ODk3MzMzCisyODIgMSA0OTE4NjY2CisyNzkgMSA0OTQwMDAwCisyOTcgMSA0OTYxMzMzCisyOTEgMSA0OTgyNjY2CiszMDkgMSA1MDA0MDAwCisyODMgMSA1MDI1MzMzCisyOTIgMSA1MDQ2NjY2CiszMDQgMSA1MDY4MDAwCisyOTYgMSA1MDg5MzMzCisyOTMgMSA1MTEwNjY2CisyODIgMSA1MTMyMDAwCisyNzMgMSA1MTUzMzMzCisyODQgMSA1MTc0NjY2CisyODEgMSA1MTk2MDAwCisyNjUgMSA1MjE3MzMzCisyNzIgMSA1MjM4NjY2CisyNzcgMSA1MjYwMDAwCisyODAgMSA1MjgxMzMzCisyNzYgMSA1MzAyNjY2CisyNzMgMSA1MzI0MDAwCisyNzggMSA1MzQ1MzMzCisyODAgMSA1MzY2NjY2CisyODAgMSA1Mzg4MDAwCisyNjggMSA1NDA5MzMzCisyODIgMSA1NDMwNjY2CisyNzcgMSA1NDUyMDAwCisyNzQgMSA1NDczMzMzCisyNzUgMSA1NDk0NjY2CisyNzAgMSA1NTE2MDAwCisyODIgMSA1NTM3MzMzCisyNzkgMSA1NTU4NjY2CisyNjAgMSA1NTgwMDAwCisyNzIgMSA1NjAxMzMzCisyNzUgMSA1NjIyNjY2CisyNzMgMSA1NjQ0MDAwCisyNzYgMSA1NjY1MzMzCisyODggMSA1Njg2NjY2CisyOTQgMSA1NzA4MDAwCisyNzEgMSA1NzI5MzMzCisyNzcgMSA1NzUwNjY2CisyODggMSA1NzcyMDAwCisyNzYgMSA1NzkzMzMzCisyODIgMSA1ODE0NjY2CisyNzYgMSA1ODM2MDAwCisyNzUgMSA1ODU3MzMzCisyNjggMSA1ODc4NjY2CisyNzAgMSA1OTAwMDAwCisyNjYgMSA1OTIxMzMzCisyNjggMSA1OTQyNjY2CisyODIgMSA1OTY0MDAwCisyNzkgMSA1OTg1MzMzCisyNzkgMSA2MDA2NjY2CisyODcgMSA2MDI4MDAwCisyODYgMSA2MDQ5MzMzCisyODAgMSA2MDcwNjY2CisyOTAgMSA2MDkyMDAwCisyNjYgMSA2MTEzMzMzCisyOTIgMSA2MTM0NjY2CisyNjQgMSA2MTU2MDAwCisyNzEgMSA2MTc3MzMzCisyNzcgMSA2MTk4NjY2CisyOTIgMSA2MjIwMDAwCisyOTggMSA2MjQxMzMzCisyODQgMSA2MjYyNjY2CisyODcgMSA2Mjg0MDAwCisyNzUgMSA2MzA1MzMzCisyOTEgMSA2MzI2NjY2CisyODcgMSA2MzQ4MDAwCisyODMgMSA2MzY5MzMzCisyODQgMSA2MzkwNjY2CisyNzEgMSA2NDEyMDAwCisyODIgMSA2NDMzMzMzCisyNzcgMSA2NDU0NjY2CisyODIgMSA2NDc2MDAwCisyODUgMSA2NDk3MzMzCisyODAgMSA2NTE4NjY2CisyNzEgMSA2NTQwMDAwCisyODkgMSA2NTYxMzMzCisyODcgMSA2NTgyNjY2CisyOTQgMSA2NjA0MDAwCisyNzcgMSA2NjI1MzMzCisyODEgMSA2NjQ2NjY2CisyNzQgMSA2NjY4MDAwCisyNzEgMSA2Njg5MzMzCisyNzkgMSA2NzEwNjY2CisyODggMSA2NzMyMDAwCisyODAgMSA2NzUzMzMzCisyODQgMSA2Nzc0NjY2CisyNzggMSA2Nzk2MDAwCisyNzYgMSA2ODE3MzMzCisyNzUgMSA2ODM4NjY2CisyNjMgMSA2ODYwMDAwCisyNjYgMSA2ODgxMzMzCisyNDcgMSA2OTAyNjY2CisyNjkgMSA2OTI0MDAwCisyNjMgMSA2OTQ1MzMzCisyODMgMSA2OTY2NjY2CisyODAgMSA2OTg4MDAwCisyODEgMSA3MDA5MzMzCisyOTkgMSA3MDMwNjY2CisyODUgMSA3MDUyMDAwCisyODggMSA3MDczMzMzCisyOTkgMSA3MDk0NjY2CisyODggMSA3MTE2MDAwCisyNzkgMSA3MTM3MzMzCisyNzYgMSA3MTU4NjY2CisyNzcgMSA3MTgwMDAwCisyODIgMSA3MjAxMzMzCisyODUgMSA3MjIyNjY2CisyOTUgMSA3MjQ0MDAwCisyOTQgMSA3MjY1MzMzCiszMDQgMSA3Mjg2NjY2CisyODIgMSA3MzA4MDAwCisyOTkgMSA3MzI5MzMzCisyODMgMSA3MzUwNjY2CisyODIgMSA3MzcyMDAwCisyODcgMSA3MzkzMzMzCiszMDYgMSA3NDE0NjY2CiszMDQgMSA3NDM2MDAwCisyODkgMSA3NDU3MzMzCisyOTkgMSA3NDc4NjY2CisyODEgMSA3NTAwMDAwCisyODEgMSA3NTIxMzMzCis2NiAxIDc1NDI2NjYKKzYzIDEgNzU1NDY2NgorMjg5IDEgNzU1NzMzMworMjcwIDEgNzU2OTMzMworMjU3IDEgNzU5MDY2NgorMjQ2IDEgNzYxMjAwMAorMjY0IDEgNzYzMzMzMworMjgwIDEgNzY1NDY2NgorMjczIDEgNzY3NjAwMAorMjg1IDEgNzY5NzMzMworMjY3IDEgNzcxODY2NgorMjc1IDEgNzc0MDAwMAorMjc4IDEgNzc2MTMzMworMjkzIDEgNzc4MjY2NgorMjgxIDEgNzgwNDAwMAorMjk3IDEgNzgyNTMzMworMjk0IDEgNzg0NjY2NgorMjg2IDEgNzg2ODAwMAorMjkwIDEgNzg4OTMzMworMjkwIDEgNzkxMDY2NgorMjg5IDEgNzkzMjAwMAorMjg2IDEgNzk1MzMzMworMjgyIDEgNzk3NDY2NgorMzA2IDEgNzk5NjAwMAorMjg3IDEgODAxNzMzMworMzEyIDEgODAzODY2NgorMzEyIDEgODA2MDAwMAorMzA3IDEgODA4MTMzMworMjkzIDEgODEwMjY2NgorMjg5IDEgODEyNDAwMAorMjg1IDEgODE0NTMzMworMjkwIDEgODE2NjY2NgorMjg1IDEgODE4ODAwMAorMzExIDEgODIwOTMzMworMzA3IDEgODIzMDY2NgorMzE0IDEgODI1MjAwMAorMzE4IDEgODI3MzMzMworMzE5IDEgODI5NDY2NgorMzE1IDEgODMxNjAwMAorMzAwIDEgODMzNzMzMworMjk1IDEgODM1ODY2NgorMjkxIDEgODM4MDAwMAorMjgyIDEgODQwMTMzMworMjk1IDEgODQyMjY2NgorMjk2IDEgODQ0NDAwMAorMjg4IDEgODQ2NTMzMworMzA0IDEgODQ4NjY2NgorMjk5IDEgODUwODAwMAorMjk4IDEgODUyOTMzMworMzA1IDEgODU1MDY2NgorMjk1IDEgODU3MjAwMAorMjk2IDEgODU5MzMzMworMjk1IDEgODYxNDY2NgorMjg3IDEgODYzNjAwMAorMjkyIDEgODY1NzMzMworMzA4IDEgODY3ODY2NgorMjg3IDEgODcwMDAwMAorMzA3IDEgODcyMTMzMworMjk1IDEgODc0MjY2NgorMjkyIDEgODc2NDAwMAorMjkyIDEgODc4NTMzMworMjc5IDEgODgwNjY2NgorMjg5IDEgODgyODAwMAorMzAzIDEgODg0OTMzMworMzA3IDEgODg3MDY2NgorMzEwIDEgODg5MjAwMAorMzAwIDEgODkxMzMzMworMjk5IDEgODkzNDY2NgorMjk5IDEgODk1NjAwMAorMjg4IDEgODk3NzMzMworMjkwIDEgODk5ODY2NgorMjkxIDEgOTAyMDAwMAorMzA0IDEgOTA0MTMzMworMjk5IDEgOTA2MjY2NgorMzA0IDEgOTA4NDAwMAorMjkwIDEgOTEwNTMzMworMzA5IDEgOTEyNjY2NgorMzAxIDEgOTE0ODAwMAorMjk2IDEgOTE2OTMzMworMjg4IDEgOTE5MDY2NgorMzA1IDEgOTIxMjAwMAorMzE3IDEgOTIzMzMzMworMjkyIDEgOTI1NDY2NgorMzAwIDEgOTI3NjAwMAorMzAxIDEgOTI5NzMzMworMjk1IDEgOTMxODY2NgorMjgyIDEgOTM0MDAwMAorMjk2IDEgOTM2MTMzMworMjk1IDEgOTM4MjY2NgorMjg3IDEgOTQwNDAwMAorMjkyIDEgOTQyNTMzMworMzAxIDEgOTQ0NjY2NgorMzExIDEgOTQ2ODAwMAorMzAxIDEgOTQ4OTMzMworMzA3IDEgOTUxMDY2NgorMzAwIDEgOTUzMjAwMAorMzA5IDEgOTU1MzMzMworMjk4IDEgOTU3NDY2NgorMzA0IDEgOTU5NjAwMAorNjAgMSA5NjE3MzMzCis1OSAxIDk2MjkzMzMKKzY0IDEgOTYzMjAwMAorNjQgMSA5NjM0NjY2Cis3NyAxIDk2MzczMzMKKzcyIDEgOTY0MDAwMAorMzA2IDEgOTY0MjY2NgorMjk3IDEgOTY1NDY2NgorMjk0IDEgOTY3NjAwMAorMjk1IDEgOTY5NzMzMworMzA4IDEgOTcxODY2NgorMzAzIDEgOTc0MDAwMAorMzA4IDEgOTc2MTMzMworMjg5IDEgOTc4MjY2NgorMzAwIDEgOTgwNDAwMAorMzA0IDEgOTgyNTMzMworMzA4IDEgOTg0NjY2NgorNjQgMSA5ODY4MDAwCis2MyAxIDk4ODAwMDAKKzY0IDEgOTg4MjY2NgorNjQgMSA5ODg1MzMzCis2MCAxIDk4ODgwMDAKKzc0IDEgOTg5MDY2NgorNjkgMSA5ODkzMzMzCis2OCAxIDk4OTYwMDAKKzYxIDEgOTg5ODY2NgorNzEgMSA5OTAxMzMzCis3NiAxIDk5MDQwMDAKKzczIDEgOTkwNjY2NgorNzAgMSA5OTA5MzMzCis3MiAxIDk5MTIwMDAKKzYwIDEgOTkxNDY2NgorNjkgMSA5OTE3MzMzCis4MiAxIDk5MjAwMDAKKzI3OCAxIDk5MjI2NjYKKzMwIDEgOTkzNDY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTAyNzEgMSAwCisxMDYgMCAxNzAwMAorMTM0IDAgMzMwMDAKKzE0OSAwIDUwMDAwCisxNTIgMCA2NzAwMAorMTU5IDAgODMwMDAKKzExNCAwIDEwMDAwMAorNzIzIDAgMTE3MDAwCisxNzUgMCAxMzMwMDAKKzE4NiAwIDE1MDAwMAorMjAxIDAgMTY3MDAwCisyNzAgMCAxODMwMDAKKzM4MyAwIDIwMDAwMAorMjU1IDAgMjE3MDAwCisyODYgMCAyMzMwMDAKKzI3MyAwIDI1MDAwMAorMTIyNCAwIDI2NzAwMAorMjIwIDAgMjgzMDAwCisyMzEgMCAzMDAwMDAKKzE5MiAwIDMxNzAwMAorMTgyIDAgMzMzMDAwCisyODkgMCAzNTAwMDAKKzIwNCAwIDM2NzAwMAorMjM3IDAgMzgzMDAwCisxODcgMCA0MDAwMDAKKzg5OCAwIDQxNzAwMAorMjMxIDAgNDMzMDAwCisyNjYgMCA0NTAwMDAKKzI3OCAwIDQ2NzAwMAorMjA1IDAgNDgzMDAwCisyNTUgMCA1MDAwMDAKKzE2OSAwIDUxNzAwMAorMjMzIDAgNTMzMDAwCisxMDExIDAgNTUwMDAwCisyMDIgMCA1NjcwMDAKKzI1MSAwIDU4MzAwMAorMjIzIDAgNjAwMDAwCisyODMgMCA2MTcwMDAKKzM2MiAwIDYzMzAwMAorMjE3IDAgNjUwMDAwCisyNDUgMCA2NjcwMDAKKzk2MCAwIDY4MzAwMAorMjMzIDAgNzAwMDAwCisyODYgMCA3MTcwMDAKKzI3MiAwIDczMzAwMAorMjU0IDAgNzUwMDAwCiszMzEgMCA3NjcwMDAKKzIxOCAwIDc4MzAwMAorMjYxIDAgODAwMDAwCis5ODEgMCA4MTcwMDAKKzIyNiAwIDgzMzAwMAorMjI2IDAgODUwMDAwCisyNzkgMCA4NjcwMDAKKzIyNSAwIDg4MzAwMAorMjk1IDAgOTAwMDAwCisxNzUgMCA5MTcwMDAKKzI0OSAwIDkzMzAwMAorOTk2IDAgOTUwMDAwCisxNjkgMCA5NjcwMDAKKzIyNCAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMGM3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzg2OTgwIDEgMAorNjc0MSAwIDMzMDAwCis5NDMzIDAgNjcwMDAKKzkzNjMgMCAxMDAwMDAKKzg2NzEgMCAxMzMwMDAKKzkwMDMgMCAxNjcwMDAKKzc3NTEgMCAyMDAwMDAKKzEzMjA3IDAgMjMzMDAwCis4NTQyIDAgMjY3MDAwCis5MzQ0IDAgMzAwMDAwCis4MDY5IDAgMzMzMDAwCis4NTg4IDAgMzY3MDAwCisxMjA4NyAwIDQwMDAwMAorNzMxNSAwIDQzMzAwMAorOTY1NCAwIDQ2NzAwMAorMTMxMDAgMCA1MDAwMDAKKzc4MzIgMCA1MzMwMDAKKzEwMDYwIDAgNTY3MDAwCis4NTQwIDAgNjAwMDAwCis4NjY3IDAgNjMzMDAwCis4NTMyIDAgNjY3MDAwCis2MDE4IDAgNzAwMDAwCis4NTIwIDAgNzMzMDAwCisxNTM1MCAwIDc2NzAwMAorNjExMCAwIDgwMDAwMAorNzg3NiAwIDgzMzAwMAorNjEzMyAwIDg2NzAwMAorOTQ3NiAwIDkwMDAwMAorMTEwMDIgMCA5MzMwMDAKKzc0ODQgMCA5NjcwMDAKKzg3NjAgMCAxMDAwMDAwCisxNjUxNSAwIDEwMzMwMDAKKzc0ODIgMCAxMDY3MDAwCis2OTgzIDAgMTEwMDAwMAorNzU2MSAwIDExMzMwMDAKKzgyNjMgMCAxMTY3MDAwCisxMDY4MiAwIDEyMDAwMDAKKzgxMDggMCAxMjMzMDAwCis3OTI0IDAgMTI2NzAwMAorODY5MyAwIDEzMDAwMDAKKzE0MTkwIDAgMTMzMzAwMAorNzM5MyAwIDEzNjcwMDAKKzY4NjQgMCAxNDAwMDAwCis5NDMxIDAgMTQzMzAwMAorNzY3NCAwIDE0NjcwMDAKKzg0NTggMCAxNTAwMDAwCis1ODk5IDAgMTUzMzAwMAorODI1OSAwIDE1NjcwMDAKKzc5NjMgMCAxNjAwMDAwCisxNDc3OSAwIDE2MzMwMDAKKzY4NzcgMCAxNjY3MDAwCis3MjY4IDAgMTcwMDAwMAorODUyNiAwIDE3MzMwMDAKKzg0NjcgMCAxNzY3MDAwCisxMTIwMCAwIDE4MDAwMDAKKzcyNjEgMCAxODMzMDAwCis4MjgwIDAgMTg2NzAwMAorNjcxOCAwIDE5MDAwMDAKKzE3NzQyIDAgMTkzMzAwMAorNTIwNiAwIDE5NjcwMDAKKzU3MDAgMCAyMDAwMDAwCis1ODcyIDAgMjAzMzAwMAorNzkxNSAwIDIwNjcwMDAKKzg0OTMgMCAyMTAwMDAwCis2NTQ1IDAgMjEzMzAwMAorOTA3MiAwIDIxNjcwMDAKKzEzMjAwIDAgMjIwMDAwMAorOTYzMiAwIDIyMzMwMDAKKzEwMDE2IDAgMjI2NzAwMAorNzgyNCAwIDIzMDAwMDAKKzEwNjI4IDAgMjMzMzAwMAorMTA0MDEgMCAyMzY3MDAwCisxMDg5MiAwIDI0MDAwMDAKKzkwMjMgMCAyNDMzMDAwCisxMDczNCAwIDI0NjcwMDAKKzE1MDQ1IDAgMjUwMDAwMAorNzk0MCAwIDI1MzMwMDAKKzk2NTcgMCAyNTY3MDAwCis4NzQzIDAgMjYwMDAwMAorODA3NCAwIDI2MzMwMDAKKzk0NDUgMCAyNjY3MDAwCis2NDk0IDAgMjcwMDAwMAorODYwMSAwIDI3MzMwMDAKKzEzNDc4IDAgMjc2NzAwMAorNjk0MiAwIDI4MDAwMDAKKzgwMDIgMCAyODMzMDAwCis3OTQwIDAgMjg2NzAwMAorODMyMCAwIDI5MDAwMDAKKzEyMjE1IDAgMjkzMzAwMAorNjY2OCAwIDI5NjcwMDAKKzExMzg0IDAgMzAwMDAwMAorODM3OCAwIDMwMzMwMDAKKzEyOTA4IDAgMzA2NzAwMAorODQyMCAwIDMxMDAwMDAKKzc1MDIgMCAzMTMzMDAwCis4NDgyIDAgMzE2NzAwMAorMTA5NjggMCAzMjAwMDAwCisxMjMzOCAwIDMyMzMwMDAKKzg2NTcgMCAzMjY3MDAwCisxMDQ2OCAwIDMzMDAwMDAKKzEzODc4IDAgMzMzMzAwMAorOTM3NCAwIDMzNjcwMDAKKzk4NTcgMCAzNDAwMDAwCisxMDM4MSAwIDM0MzMwMDAKKzk5ODQgMCAzNDY3MDAwCis5OTU2IDAgMzUwMDAwMAorODkwNSAwIDM1MzMwMDAKKzg2NzIgMCAzNTY3MDAwCis4MTIyIDAgMzYwMDAwMAorOTY3NyAwIDM2MzMwMDAKKzk4MTIgMCAzNjY3MDAwCis5NjIyIDAgMzcwMDAwMAorOTAyMyAwIDM3MzMwMDAKKzcxNDcgMCAzNzY3MDAwCis5MTQ2IDAgMzgwMDAwMAorNzQ4OCAwIDM4MzMwMDAKKzEwODEyIDAgMzg2NzAwMAorODM0MCAwIDM5MDAwMDAKKzEzMjgwIDAgMzkzMzAwMAorNTE2NyAwIDM5NjcwMDAKKzY5OTEgMCA0MDAwMDAwCis2NTQzIDAgNDAzMzAwMAorNTk1MiAwIDQwNjcwMDAKKzUxNjQgMCA0MTAwMDAwCis0MDExIDAgNDEzMzAwMAorMzc5NCAwIDQxNjcwMDAKKzEyOTU5IDAgNDIwMDAwMAorNzEwMjAgMSA0MjMzMDAwCis1MzUxIDAgNDI2NzAwMAorNjI4MyAwIDQzMDAwMDAKKzUwODAgMCA0MzMzMDAwCis2NzA3IDAgNDM2NzAwMAorNTg1NyAwIDQ0MDAwMDAKKzUyMjEgMCA0NDMzMDAwCisxMDk3MiAwIDQ0NjcwMDAKKzcwMjMgMCA0NTAwMDAwCis2OTA3IDAgNDUzMzAwMAorNzg1MSAwIDQ1NjcwMDAKKzQ4NDMgMCA0NjAwMDAwCis2MDg1IDAgNDYzMzAwMAorNDg2OCAwIDQ2NjcwMDAKKzUwOTMgMCA0NzAwMDAwCisxMjgwNyAwIDQ3MzMwMDAKKzYzMzAgMCA0NzY3MDAwCis0MjA5IDAgNDgwMDAwMAorNDU5NiAwIDQ4MzMwMDAKKzYzMTYgMCA0ODY3MDAwCis0OTU0IDAgNDkwMDAwMAorNTUzMyAwIDQ5MzMwMDAKKzc3NDkgMCA0OTY3MDAwCisxMjQ4NiAwIDUwMDAwMDAKKzU0NjggMCA1MDMzMDAwCis0MzUzIDAgNTA2NzAwMAorNTc4NiAwIDUxMDAwMDAKKzU1NTEgMCA1MTMzMDAwCis2NzExIDAgNTE2NzAwMAorNTY4OCAwIDUyMDAwMDAKKzYyNTggMCA1MjMzMDAwCisxMjk3NSAwIDUyNjcwMDAKKzQ4NzMgMCA1MzAwMDAwCis0NTUyIDAgNTMzMzAwMAorNDg0NCAwIDUzNjcwMDAKKzQ3NzQgMCA1NDAwMDAwCis1MDI1IDAgNTQzMzAwMAorNTIwNCAwIDU0NjcwMDAKKzQ4MTQgMCA1NTAwMDAwCisxNDgzNSAwIDU1MzMwMDAKKzUzNDMgMCA1NTY3MDAwCis0ODA4IDAgNTYwMDAwMAorNTA3MSAwIDU2MzMwMDAKKzYzMjQgMCA1NjY3MDAwCis1MjQzIDAgNTcwMDAwMAorNDk5NSAwIDU3MzMwMDAKKzUxMzQgMCA1NzY3MDAwCisxMTA1NCAwIDU4MDAwMDAKKzQ4MDcgMCA1ODMzMDAwCis1MTE4IDAgNTg2NzAwMAorNjQyNCAwIDU5MDAwMDAKKzQ5ODQgMCA1OTMzMDAwCis3MTg3IDAgNTk2NzAwMAorNTUwNSAwIDYwMDAwMDAKKzY5NDEgMCA2MDMzMDAwCisxMTUxNyAwIDYwNjcwMDAKKzU2NDYgMCA2MTAwMDAwCis2ODMyIDAgNjEzMzAwMAorNTI5NCAwIDYxNjcwMDAKKzYyMDAgMCA2MjAwMDAwCis2MzI4IDAgNjIzMzAwMAorNDM0OCAwIDYyNjcwMDAKKzQ2MDcgMCA2MzAwMDAwCisxMjk1OCAwIDYzMzMwMDAKKzQzMDggMCA2MzY3MDAwCis2MDg0IDAgNjQwMDAwMAorNDQ5NCAwIDY0MzMwMDAKKzUzMzggMCA2NDY3MDAwCis1NzQyIDAgNjUwMDAwMAorNTQ3MiAwIDY1MzMwMDAKKzg0NTkgMCA2NTY3MDAwCisxMzA3NSAwIDY2MDAwMDAKKzg5ODYgMCA2NjMzMDAwCis5NTgzIDAgNjY2NzAwMAorODc5MiAwIDY3MDAwMDAKKzkwMDQgMCA2NzMzMDAwCis5NjMyIDAgNjc2NzAwMAorOTM5MyAwIDY4MDAwMDAKKzkyNTkgMCA2ODMzMDAwCisxMTkyNyAwIDY4NjcwMDAKKzEwMzIzIDAgNjkwMDAwMAorMTUyNDggMCA2OTMzMDAwCisxMTI0NCAwIDY5NjcwMDAKKzE1NTU4IDAgNzAwMDAwMAorNjE5NyAwIDcwMzMwMDAKKzgwNDQgMCA3MDY3MDAwCisxMTQzMiAwIDcxMDAwMDAKKzg3MzcgMCA3MTMzMDAwCisxMzg4NSAwIDcxNjcwMDAKKzExMTU4IDAgNzIwMDAwMAorMTUxNTIgMCA3MjMzMDAwCis3MDI1IDAgNzI2NzAwMAorODAyNSAwIDczMDAwMDAKKzEzMzYyIDAgNzMzMzAwMAorODA5MCAwIDczNjcwMDAKKzEzNjM3IDAgNzQwMDAwMAorNjE0OCAwIDc0MzMwMDAKKzkyNzAgMCA3NDY3MDAwCis4NjMzIDAgNzUwMDAwMAorMTA2NzMgMCA3NTMzMDAwCisxNDIwOCAwIDc1NjcwMDAKKzgwODQgMCA3NjAwMDAwCisxMzc4MyAwIDc2MzMwMDAKKzEwNjYwIDAgNzY2NzAwMAorNzQ2NiAwIDc3MDAwMDAKKzE0NDMzIDAgNzczMzAwMAorMTA5MzQgMCA3NzY3MDAwCis3MjM5IDAgNzgwMDAwMAorMTI1NDggMCA3ODMzMDAwCis2NTY0IDAgNzg2NzAwMAorMTA3NjEgMCA3OTAwMDAwCisxMDk5MiAwIDc5MzMwMDAKKzEyOTI0IDAgNzk2NzAwMAorMTIzNDggMCA4MDAwMDAwCis2NzcwIDAgODAzMzAwMAorMTQyODggMCA4MDY3MDAwCisyOTM0NSAxIDgxMDAwMDAKKzE4MjIgMCA4MTMzMDAwCisxMDg3IDAgODE2NzAwMAorMTEwOSAwIDgyMDAwMDAKKzIwMDcgMCA4MjMzMDAwCisxNzk4IDAgODI2NzAwMAorMTYzNSAwIDgzMDAwMDAKKzE5NjA3IDAgODMzMzAwMAorOTE5IDAgODM2NzAwMAorMjM1NyAwIDg0MDAwMDAKKzM1NzggMCA4NDMzMDAwCis0NDk3IDAgODQ2NzAwMAorNDMxNCAwIDg1MDAwMDAKKzM4NTEgMCA4NTMzMDAwCiszODIyIDAgODU2NzAwMAorNDI1MiAwIDg2MDAwMDAKKzQ3NzUgMCA4NjMzMDAwCisxMjIwMyAwIDg2NjcwMDAKKzUwNzggMCA4NzAwMDAwCis1ODc2IDAgODczMzAwMAorNjEyNCAwIDg3NjcwMDAKKzQ0OTAgMCA4ODAwMDAwCiszNTM4IDAgODgzMzAwMAorMzQ1MCAwIDg4NjcwMDAKKzM2MTEgMCA4OTAwMDAwCisyODQ3IDAgODkzMzAwMAorMjYwNSAwIDg5NjcwMDAKKzEyMjQzIDAgOTAwMDAwMAorMTk0NiAwIDkwMzMwMDAKKzE4NDcgMCA5MDY3MDAwCisyMDM1IDAgOTEwMDAwMAorMjU3MiAwIDkxMzMwMDAKKzIzMjYgMCA5MTY3MDAwCisyNjQ1IDAgOTIwMDAwMAorMjkzOCAwIDkyMzMwMDAKKzI0OTUgMCA5MjY3MDAwCisyNjA5IDAgOTMwMDAwMAorOTc0NCAwIDkzMzMwMDAKKzE3OTYgMCA5MzY3MDAwCisxOTg1IDAgOTQwMDAwMAorMTc1OSAwIDk0MzMwMDAKKzIyNTkgMCA5NDY3MDAwCisyMjMzIDAgOTUwMDAwMAorMjA0NCAwIDk1MzMwMDAKKzI1MDIgMCA5NTY3MDAwCisyMzA3IDAgOTYwMDAwMAorMjczOSAwIDk2MzMwMDAKKzExNzA3IDAgOTY2NzAwMAorNTE2OCAwIDk3MDAwMDAKKzQ0ODMgMCA5NzMzMDAwCiszMDQ0IDAgOTc2NzAwMAorNDI0MSAwIDk4MDAwMDAKKzQzOTIgMCA5ODMzMDAwCis0OTM0IDAgOTg2NzAwMAorNTkzNCAwIDk5MDAwMDAKKzU2NDcgMCA5OTMzMDAwCis1MzI2IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorNjkzOSAxIDAKKzY4MTggMCAxNzAwMAorMzEwIDAgMzMwMDAKKzI3MyAwIDUwMDAwCisyNjcgMCA2NzAwMAorMjM5IDAgODMwMDAKKzIzMiAwIDEwMDAwMAorMjIyIDAgMTE3MDAwCisxODYgMCAxMzMwMDAKKzE5NCAwIDE1MDAwMAorMTg5IDAgMTY3MDAwCisxOCAwIDE4MzAwMAorMjAxNCAwIDIwMDAwMAorMjk3IDAgMjE3MDAwCisyODcgMCAyMzMwMDAKKzIzNyAwIDI1MDAwMAorMjYzIDAgMjY3MDAwCisyMzggMCAyODMwMDAKKzI1NyAwIDMwMDAwMAorMjI5IDAgMzE3MDAwCisxODcgMCAzMzMwMDAKKzE5MSAwIDM1MDAwMAorMTggMCAzNjcwMDAKKzIyMDMgMCAzODMwMDAKKzI2NSAwIDQwMDAwMAorMjI0IDAgNDE3MDAwCisyNTQgMCA0MzMwMDAKKzI1MiAwIDQ1MDAwMAorMjczIDAgNDY3MDAwCisyMDggMCA0ODMwMDAKKzE1NCAwIDUwMDAwMAorMTgyIDAgNTE3MDAwCisxMzggMCA1MzMwMDAKKzE4IDAgNTUwMDAwCisyNTAyIDAgNTY3MDAwCisyODYgMCA1ODMwMDAKKzMwNCAwIDYwMDAwMAorMzQxIDAgNjE3MDAwCisyNTkgMCA2MzMwMDAKKzI3NSAwIDY1MDAwMAorMjIyIDAgNjY3MDAwCisyNTQgMCA2ODMwMDAKKzI1MyAwIDcwMDAwMAorMjI1IDAgNzE3MDAwCisxOCAwIDczMzAwMAorMjUwMSAwIDc1MDAwMAorMjgyIDAgNzY3MDAwCisyOTggMCA3ODMwMDAKKzI1MiAwIDgwMDAwMAorMjQyIDAgODE3MDAwCisyNTAgMCA4MzMwMDAKKzI2MCAwIDg1MDAwMAorMjE4IDAgODY3MDAwCisyMTMgMCA4ODMwMDAKKzE0NCAwIDkwMDAwMAorMTggMCA5MTcwMDAKKzIzMyAwIDkzMzAwMAorMjU0IDAgOTUwMDAwCisyMjkgMCA5NjcwMDAKKzIzOSAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOTY3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzU0OTE4IDEgMAorNDYyODAgMCAzMzAwMAorMjAwNiAwIDY3MDAwCisyODQxIDAgMTAwMDAwCiszMDQ0IDAgMTMzMDAwCiszNDI5IDAgMTY3MDAwCiszMTk2IDAgMjAwMDAwCisyOTI2IDAgMjMzMDAwCisyODIxIDAgMjY3MDAwCisxMTUwIDAgMzAwMDAwCiszNiAwIDMzMzAwMAorMzgwODQgMCAzNjcwMDAKKzM2ODkgMCA0MDAwMDAKKzM0NzMgMCA0MzMwMDAKKzMwMTEgMCA0NjcwMDAKKzMwOTAgMCA1MDAwMDAKKzI1MTYgMCA1MzMwMDAKKzI3NzEgMCA1NjcwMDAKKzMyNTAgMCA2MDAwMDAKKzExNTkgMCA2MzMwMDAKKzM0IDAgNjY3MDAwCiszOTY5MCAwIDcwMDAwMAorMzYxNSAwIDczMzAwMAorMjQ5NCAwIDc2NzAwMAorMjg5MyAwIDgwMDAwMAorMzMyOSAwIDgzMzAwMAorMjkzOSAwIDg2NzAwMAorMjM1MiAwIDkwMDAwMAorMjczMiAwIDkzMzAwMAorMTc0NiAwIDk2NzAwMAorMzMgMCAxMDAwMDAwCis0MTUwMSAwIDEwMzMwMDAKKzI5OTcgMCAxMDY3MDAwCisyNjY2IDAgMTEwMDAwMAorMzU4MiAwIDExMzMwMDAKKzI2MTYgMCAxMTY3MDAwCisyOTIzIDAgMTIwMDAwMAorMjY5NiAwIDEyMzMwMDAKKzE2MjggMCAxMjY3MDAwCisxODg3IDAgMTMwMDAwMAorMzMgMCAxMzMzMDAwCis0Mjg3NiAwIDEzNjcwMDAKKzI1ODggMCAxNDAwMDAwCiszMzE2IDAgMTQzMzAwMAorMjI4NyAwIDE0NjcwMDAKKzMzNzUgMCAxNTAwMDAwCisyMTA4IDAgMTUzMzAwMAorMjk2MSAwIDE1NjcwMDAKKzE3MzAgMCAxNjAwMDAwCisxODAwIDAgMTYzMzAwMAorMzQgMCAxNjY3MDAwCis0Mzc5NyAwIDE3MDAwMDAKKzI0ODQgMCAxNzMzMDAwCisyNTU2IDAgMTc2NzAwMAorMjY3MSAwIDE4MDAwMDAKKzIzMzggMCAxODMzMDAwCiszMTMzIDAgMTg2NzAwMAorMjAwMiAwIDE5MDAwMDAKKzE3OTQgMCAxOTMzMDAwCisxMjc5IDAgMTk2NzAwMAorMzIgMCAyMDAwMDAwCis0MjY0MiAwIDIwMzMwMDAKKzI2ODYgMCAyMDY3MDAwCisyMjAyIDAgMjEwMDAwMAorMjE0NSAwIDIxMzMwMDAKKzI1NjYgMCAyMTY3MDAwCisyMTkwIDAgMjIwMDAwMAorMTU4MCAwIDIyMzMwMDAKKzE3MTEgMCAyMjY3MDAwCis2NDggMCAyMzAwMDAwCiszMiAwIDIzMzMwMDAKKzQwNDA5IDAgMjM2NzAwMAorMjYyOCAwIDI0MDAwMDAKKzE5NzMgMCAyNDMzMDAwCisyMzYwIDAgMjQ2NzAwMAorMzA0MyAwIDI1MDAwMDAKKzE3MzAgMCAyNTMzMDAwCisxNDU2IDAgMjU2NzAwMAorMjMxMiAwIDI2MDAwMDAKKzM2OSAwIDI2MzMwMDAKKzMyIDAgMjY2NzAwMAorNDEzOTEgMCAyNzAwMDAwCisyOTY3IDAgMjczMzAwMAorMjQ1NCAwIDI3NjcwMDAKKzE4MjUgMCAyODAwMDAwCisxODUzIDAgMjgzMzAwMAorMTc0NiAwIDI4NjcwMDAKKzIzNDcgMCAyOTAwMDAwCisxMzYyIDAgMjkzMzAwMAorNDQxIDAgMjk2NzAwMAorMzQgMCAzMDAwMDAwCis0MjUwMyAwIDMwMzMwMDAKKzE4NzcgMCAzMDY3MDAwCisxNjkwIDAgMzEwMDAwMAorMTM2NyAwIDMxMzMwMDAKKzE1MjAgMCAzMTY3MDAwCisxMjQwIDAgMzIwMDAwMAorMTA5NCAwIDMyMzMwMDAKKzczOSAwIDMyNjcwMDAKKzM5MiAwIDMzMDAwMDAKKzMzIDAgMzMzMzAwMAorMzUxMDQgMCAzMzY3MDAwCisxNDYzIDAgMzQwMDAwMAorMjAyOSAwIDM0MzMwMDAKKzE2MjYgMCAzNDY3MDAwCisxOTU2IDAgMzUwMDAwMAorNzk5IDAgMzUzMzAwMAorNTU2IDAgMzU2NzAwMAorNTg0IDAgMzYwMDAwMAorMTkxIDAgMzYzMzAwMAorMzYgMCAzNjY3MDAwCiszNzY1MiAwIDM3MDAwMDAKKzg2MiAwIDM3MzMwMDAKKzUyNCAwIDM3NjcwMDAKKzY0MSAwIDM4MDAwMDAKKzU4NCAwIDM4MzMwMDAKKzM2MCAwIDM4NjcwMDAKKzM2NSAwIDM5MDAwMDAKKzM2MSAwIDM5MzMwMDAKKzE1NCAwIDM5NjcwMDAKKzM2IDAgNDAwMDAwMAorMTI1NzQwIDAgNDAzMzAwMAorMzMyIDAgNDA2NzAwMAorMzgxIDAgNDEwMDAwMAorNDIwIDAgNDEzMzAwMAorNDY0IDAgNDE2NzAwMAorMjg4IDAgNDIwMDAwMAorMjY2MCAwIDQyMzMwMDAKKzEyNzU2NCAxIDQyNjcwMDAKKzMwNjk2IDAgNDMwMDAwMAorMzQyMyAwIDQzMzMwMDAKKzMzMTAgMCA0MzY3MDAwCiszNTEzIDAgNDQwMDAwMAorMzczNSAwIDQ0MzMwMDAKKzMzNTggMCA0NDY3MDAwCiszMTA4IDAgNDUwMDAwMAorMjgwMCAwIDQ1MzMwMDAKKzE3NTEgMCA0NTY3MDAwCis0MSAwIDQ2MDAwMDAKKzM5ODYyIDAgNDYzMzAwMAorMzczOSAwIDQ2NjcwMDAKKzM3NTUgMCA0NzAwMDAwCiszNDA4IDAgNDczMzAwMAorMzc4MyAwIDQ3NjcwMDAKKzM0MjMgMCA0ODAwMDAwCisyODAxIDAgNDgzMzAwMAorMjU0OSAwIDQ4NjcwMDAKKzE0NjEgMCA0OTAwMDAwCis0MCAwIDQ5MzMwMDAKKzQxNjY3IDAgNDk2NzAwMAorMzYyMyAwIDUwMDAwMDAKKzMzNTYgMCA1MDMzMDAwCiszNDI0IDAgNTA2NzAwMAorMzU0OCAwIDUxMDAwMDAKKzMxMTkgMCA1MTMzMDAwCisyOTA1IDAgNTE2NzAwMAorMjc3MiAwIDUyMDAwMDAKKzE2MjMgMCA1MjMzMDAwCis0MyAwIDUyNjcwMDAKKzQ2NzgzIDAgNTMwMDAwMAorMzQ2MiAwIDUzMzMwMDAKKzM0NzAgMCA1MzY3MDAwCiszNjc3IDAgNTQwMDAwMAorMzY4NCAwIDU0MzMwMDAKKzMyNjYgMCA1NDY3MDAwCiszMTI3IDAgNTUwMDAwMAorMjgwOSAwIDU1MzMwMDAKKzE3NTAgMCA1NTY3MDAwCis0MCAwIDU2MDAwMDAKKzQ2MjE1IDAgNTYzMzAwMAorMzU5OSAwIDU2NjcwMDAKKzM1NTggMCA1NzAwMDAwCiszNTQ0IDAgNTczMzAwMAorMzYzMiAwIDU3NjcwMDAKKzM1NDggMCA1ODAwMDAwCisyOTY4IDAgNTgzMzAwMAorMjcxNSAwIDU4NjcwMDAKKzE3MjkgMCA1OTAwMDAwCis0MSAwIDU5MzMwMDAKKzQ1OTU4IDAgNTk2NzAwMAorMzc3NiAwIDYwMDAwMDAKKzM1MjUgMCA2MDMzMDAwCiszNjQ0IDAgNjA2NzAwMAorMzc4NiAwIDYxMDAwMDAKKzMyMjIgMCA2MTMzMDAwCisyOTIzIDAgNjE2NzAwMAorMjc1MiAwIDYyMDAwMDAKKzE1OTIgMCA2MjMzMDAwCis0MSAwIDYyNjcwMDAKKzQ2MDMxIDAgNjMwMDAwMAorMzUyMCAwIDYzMzMwMDAKKzMzODAgMCA2MzY3MDAwCiszMzcxIDAgNjQwMDAwMAorMzQyNyAwIDY0MzMwMDAKKzMxMzUgMCA2NDY3MDAwCisyOTg4IDAgNjUwMDAwMAorMjczMCAwIDY1MzMwMDAKKzE2NzEgMCA2NTY3MDAwCis0MSAwIDY2MDAwMDAKKzQ1ODQ2IDAgNjYzMzAwMAorMzUzNSAwIDY2NjcwMDAKKzM1MDcgMCA2NzAwMDAwCiszNDI5IDAgNjczMzAwMAorMzQ5MSAwIDY3NjcwMDAKKzMzMjUgMCA2ODAwMDAwCisyOTc5IDAgNjgzMzAwMAorMjgwMCAwIDY4NjcwMDAKKzE2MTAgMCA2OTAwMDAwCis0MCAwIDY5MzMwMDAKKzQ1OTU4IDAgNjk2NzAwMAorMzc2MiAwIDcwMDAwMDAKKzMyNTQgMCA3MDMzMDAwCiszNDA4IDAgNzA2NzAwMAorMzg2MCAwIDcxMDAwMDAKKzMxOTggMCA3MTMzMDAwCisyOTY2IDAgNzE2NzAwMAorMjg4MiAwIDcyMDAwMDAKKzE3NjMgMCA3MjMzMDAwCis0MiAwIDcyNjcwMDAKKzQ2MTMwIDAgNzMwMDAwMAorMzU5MyAwIDczMzMwMDAKKzM1MjMgMCA3MzY3MDAwCiszOTM5IDAgNzQwMDAwMAorMzk4MCAwIDc0MzMwMDAKKzM0NzAgMCA3NDY3MDAwCiszMTkxIDAgNzUwMDAwMAorMjk2OSAwIDc1MzMwMDAKKzE3NDAgMCA3NTY3MDAwCis0MSAwIDc2MDAwMDAKKzQ2MzAwIDAgNzYzMzAwMAorMzczOSAwIDc2NjcwMDAKKzM3ODEgMCA3NzAwMDAwCiszOTY0IDAgNzczMzAwMAorNDAyMyAwIDc3NjcwMDAKKzM0ODAgMCA3ODAwMDAwCiszMDY1IDAgNzgzMzAwMAorMjkzNCAwIDc4NjcwMDAKKzE4MDUgMCA3OTAwMDAwCis0MiAwIDc5MzMwMDAKKzM4MTY2IDAgNzk2NzAwMAorNDA2MiAwIDgwMDAwMDAKKzM4NDQgMCA4MDMzMDAwCis0NTQ3IDAgODA2NzAwMAorOTM0IDAgODEwMDAwMAorMzY1IDAgODEzMzAwMAorMTgxIDAgODE2NzAwMAorNDYzIDAgODIwMDAwMAorNDE5IDAgODIzMzAwMAorMzggMCA4MjY3MDAwCis5NzAyIDAgODMwMDAwMAorMzQ0IDAgODMzMzAwMAorMjc2IDAgODM2NzAwMAorMTM1MCAwIDg0MDAwMDAKKzE3MDMgMCA4NDMzMDAwCisxODQzIDAgODQ2NzAwMAorMTIyOCAwIDg1MDAwMDAKKzM1NTgwIDEgODUzMzAwMAorMjc0NTggMCA4NTY3MDAwCisyMTQ0IDAgODYwMDAwMAorMjQ4MiAwIDg2MzMwMDAKKzIwMDQgMCA4NjY3MDAwCisyODIyIDAgODcwMDAwMAorMjU3MCAwIDg3MzMwMDAKKzE3MjYgMCA4NzY3MDAwCisxMjQ4IDAgODgwMDAwMAorODQ0IDAgODgzMzAwMAorMzUgMCA4ODY3MDAwCisxNDIwNyAwIDg5MDAwMDAKKzEwMzcgMCA4OTMzMDAwCis3NDkgMCA4OTY3MDAwCis4MjkgMCA5MDAwMDAwCis5MTUgMCA5MDMzMDAwCis2ODUgMCA5MDY3MDAwCis3NjcgMCA5MTAwMDAwCis3OTggMCA5MTMzMDAwCiszNDIgMCA5MTY3MDAwCiszMSAwIDkyMDAwMDAKKzEyNTkwIDAgOTIzMzAwMAorOTIzIDAgOTI2NzAwMAorODE5IDAgOTMwMDAwMAorNzc2IDAgOTMzMzAwMAorODYzIDAgOTM2NzAwMAorNzI5IDAgOTQwMDAwMAorNDcxIDAgOTQzMzAwMAorNjM4IDAgOTQ2NzAwMAorMjc2IDAgOTUwMDAwMAorMzggMCA5NTMzMDAwCisxNzI3MiAwIDk1NjcwMDAKKzg1NiAwIDk2MDAwMDAKKzExNTggMCA5NjMzMDAwCisyMTcyIDAgOTY2NzAwMAorMjc1MSAwIDk3MDAwMDAKKzIxNDIgMCA5NzMzMDAwCisxMjY3IDAgOTc2NzAwMAorMTk2NSAwIDk4MDAwMDAKKzE1MTAgMCA5ODMzMDAwCiszNCAwIDk4NjcwMDAKKzI2OTIgMCA5OTAwMDAwCisyNzc4IDAgOTkzMzAwMAorMjU4NSAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUyMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFmMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCkBAIC0wLDAgKzEsODMzIEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzMyIDEgNDAwMDAKKzMyIDEgNjAwMDAKKzMyIDEgODAwMDAKKzMyIDEgMTAwMDAwCiszMiAxIDEyMDAwMAorMzIgMSAxNDAwMDAKKzMyIDEgMTYwMDAwCiszMiAxIDE4MDAwMAorMzIgMSAyMDAwMDAKKzMyIDEgMjIwMDAwCiszMiAxIDI0MDAwMAorMzIgMSAyNjAwMDAKKzMyIDEgMjgwMDAwCiszMiAxIDMwMDAwMAorMzIgMSAzMjAwMDAKKzMyIDEgMzQwMDAwCiszMiAxIDM2MDAwMAorMzIgMSAzODAwMDAKKzMyIDEgNDAwMDAwCiszMiAxIDQyMDAwMAorMzIgMSA0NDAwMDAKKzMyIDEgNDYwMDAwCiszMiAxIDQ4MDAwMAorMzIgMSA1MDAwMDAKKzMyIDEgNTIwMDAwCiszMiAxIDU0MDAwMAorMzIgMSA1NjAwMDAKKzMyIDEgNTgwMDAwCiszMiAxIDYwMDAwMAorMzIgMSA2MjAwMDAKKzMyIDEgNjQwMDAwCiszMiAxIDY2MDAwMAorMzIgMSA2ODAwMDAKKzMyIDEgNzAwMDAwCiszMiAxIDcyMDAwMAorMzIgMSA3NDAwMDAKKzMyIDEgNzYwMDAwCiszMiAxIDc4MDAwMAorMzIgMSA4MDAwMDAKKzMyIDEgODIwMDAwCiszMiAxIDg0MDAwMAorMzIgMSA4NjAwMDAKKzMyIDEgODgwMDAwCiszMiAxIDkwMDAwMAorMzIgMSA5MjAwMDAKKzMyIDEgOTQwMDAwCiszMiAxIDk2MDAwMAorMzIgMSA5ODAwMDAKKzMyIDEgMTAwMDAwMAorMzIgMSAxMDIwMDAwCiszMiAxIDEwNDAwMDAKKzMyIDEgMTA2MDAwMAorMzIgMSAxMDgwMDAwCiszMiAxIDExMDAwMDAKKzMyIDEgMTEyMDAwMAorMzIgMSAxMTQwMDAwCiszMiAxIDExNjAwMDAKKzMyIDEgMTE4MDAwMAorMzIgMSAxMjAwMDAwCiszMiAxIDEyMjAwMDAKKzMyIDEgMTI0MDAwMAorMzIgMSAxMjYwMDAwCiszMiAxIDEyODAwMDAKKzMyIDEgMTMwMDAwMAorMzIgMSAxMzIwMDAwCiszMiAxIDEzNDAwMDAKKzMyIDEgMTM2MDAwMAorMzIgMSAxMzgwMDAwCiszMiAxIDE0MDAwMDAKKzMyIDEgMTQyMDAwMAorMzIgMSAxNDQwMDAwCiszMiAxIDE0NjAwMDAKKzMyIDEgMTQ4MDAwMAorMzIgMSAxNTAwMDAwCiszMiAxIDE1MjAwMDAKKzMyIDEgMTU0MDAwMAorMzIgMSAxNTYwMDAwCiszMiAxIDE1ODAwMDAKKzMyIDEgMTYwMDAwMAorMzIgMSAxNjIwMDAwCiszMiAxIDE2NDAwMDAKKzMyIDEgMTY2MDAwMAorMzIgMSAxNjgwMDAwCiszMiAxIDE3MDAwMDAKKzMyIDEgMTcyMDAwMAorMzIgMSAxNzQwMDAwCiszMiAxIDE3NjAwMDAKKzMyIDEgMTc4MDAwMAorMzIgMSAxODAwMDAwCiszMiAxIDE4MjAwMDAKKzMyIDEgMTg0MDAwMAorMzIgMSAxODYwMDAwCiszMiAxIDE4ODAwMDAKKzMyIDEgMTkwMDAwMAorMzIgMSAxOTIwMDAwCiszMiAxIDE5NDAwMDAKKzMyIDEgMTk2MDAwMAorMzIgMSAxOTgwMDAwCiszMiAxIDIwMDAwMDAKKzMyIDEgMjAyMDAwMAorMzIgMSAyMDQwMDAwCiszMiAxIDIwNjAwMDAKKzMyIDEgMjA4MDAwMAorMzIgMSAyMTAwMDAwCiszMiAxIDIxMjAwMDAKKzMyIDEgMjE0MDAwMAorMzIgMSAyMTYwMDAwCiszMiAxIDIxODAwMDAKKzMyIDEgMjIwMDAwMAorMzIgMSAyMjIwMDAwCiszMiAxIDIyNDAwMDAKKzMyIDEgMjI2MDAwMAorMzIgMSAyMjgwMDAwCiszMiAxIDIzMDAwMDAKKzMyIDEgMjMyMDAwMAorMzIgMSAyMzQwMDAwCiszMiAxIDIzNjAwMDAKKzMyIDEgMjM4MDAwMAorMzIgMSAyNDAwMDAwCiszMiAxIDI0MjAwMDAKKzMyIDEgMjQ0MDAwMAorMzIgMSAyNDYwMDAwCiszMiAxIDI0ODAwMDAKKzMyIDEgMjUwMDAwMAorMzIgMSAyNTIwMDAwCiszMiAxIDI1NDAwMDAKKzMyIDEgMjU2MDAwMAorMzIgMSAyNTgwMDAwCiszMiAxIDI2MDAwMDAKKzMyIDEgMjYyMDAwMAorMzIgMSAyNjQwMDAwCiszMiAxIDI2NjAwMDAKKzMyIDEgMjY4MDAwMAorMzIgMSAyNzAwMDAwCiszMiAxIDI3MjAwMDAKKzMyIDEgMjc0MDAwMAorMzIgMSAyNzYwMDAwCiszMiAxIDI3ODAwMDAKKzMyIDEgMjgwMDAwMAorMzIgMSAyODIwMDAwCiszMiAxIDI4NDAwMDAKKzMyIDEgMjg2MDAwMAorMzIgMSAyODgwMDAwCiszMiAxIDI5MDAwMDAKKzMyIDEgMjkyMDAwMAorMzIgMSAyOTQwMDAwCiszMiAxIDI5NjAwMDAKKzMyIDEgMjk4MDAwMAorMzIgMSAzMDAwMDAwCiszMiAxIDMwMjAwMDAKKzMyIDEgMzA0MDAwMAorMzIgMSAzMDYwMDAwCiszMiAxIDMwODAwMDAKKzMyIDEgMzEwMDAwMAorMzIgMSAzMTIwMDAwCiszMiAxIDMxNDAwMDAKKzMyIDEgMzE2MDAwMAorMzIgMSAzMTgwMDAwCiszMiAxIDMyMDAwMDAKKzMyIDEgMzIyMDAwMAorMzIgMSAzMjQwMDAwCiszMiAxIDMyNjAwMDAKKzMyIDEgMzI4MDAwMAorMzIgMSAzMzAwMDAwCiszMiAxIDMzMjAwMDAKKzMyIDEgMzM0MDAwMAorMzIgMSAzMzYwMDAwCiszMiAxIDMzODAwMDAKKzMyIDEgMzQwMDAwMAorMzIgMSAzNDIwMDAwCiszMiAxIDM0NDAwMDAKKzMyIDEgMzQ2MDAwMAorMzIgMSAzNDgwMDAwCiszMiAxIDM1MDAwMDAKKzMyIDEgMzUyMDAwMAorMzIgMSAzNTQwMDAwCiszMiAxIDM1NjAwMDAKKzMyIDEgMzU4MDAwMAorMzIgMSAzNjAwMDAwCiszMiAxIDM2MjAwMDAKKzMyIDEgMzY0MDAwMAorMzIgMSAzNjYwMDAwCiszMiAxIDM2ODAwMDAKKzMyIDEgMzcwMDAwMAorMzIgMSAzNzIwMDAwCiszMiAxIDM3NDAwMDAKKzMyIDEgMzc2MDAwMAorMzIgMSAzNzgwMDAwCiszMiAxIDM4MDAwMDAKKzMyIDEgMzgyMDAwMAorMzIgMSAzODQwMDAwCiszMiAxIDM4NjAwMDAKKzMyIDEgMzg4MDAwMAorMzIgMSAzOTAwMDAwCiszMiAxIDM5MjAwMDAKKzMyIDEgMzk0MDAwMAorMzIgMSAzOTYwMDAwCiszMiAxIDM5ODAwMDAKKzMyIDEgNDAwMDAwMAorMzIgMSA0MDIwMDAwCiszMiAxIDQwNDAwMDAKKzMyIDEgNDA2MDAwMAorMzIgMSA0MDgwMDAwCiszMiAxIDQxMDAwMDAKKzMyIDEgNDEyMDAwMAorMzIgMSA0MTQwMDAwCiszMiAxIDQxNjAwMDAKKzMyIDEgNDE4MDAwMAorMzIgMSA0MjAwMDAwCiszMiAxIDQyMjAwMDAKKzMyIDEgNDI0MDAwMAorMzIgMSA0MjYwMDAwCiszMiAxIDQyODAwMDAKKzMyIDEgNDMwMDAwMAorMzIgMSA0MzIwMDAwCiszMiAxIDQzNDAwMDAKKzMyIDEgNDM2MDAwMAorMzIgMSA0MzgwMDAwCiszMiAxIDQ0MDAwMDAKKzMyIDEgNDQyMDAwMAorMzIgMSA0NDQwMDAwCiszMiAxIDQ0NjAwMDAKKzMyIDEgNDQ4MDAwMAorMzIgMSA0NTAwMDAwCiszMiAxIDQ1MjAwMDAKKzMyIDEgNDU0MDAwMAorMzIgMSA0NTYwMDAwCiszMiAxIDQ1ODAwMDAKKzMyIDEgNDYwMDAwMAorMzIgMSA0NjIwMDAwCiszMiAxIDQ2NDAwMDAKKzMyIDEgNDY2MDAwMAorMzIgMSA0NjgwMDAwCiszMiAxIDQ3MDAwMDAKKzMyIDEgNDcyMDAwMAorMzIgMSA0NzQwMDAwCiszMiAxIDQ3NjAwMDAKKzMyIDEgNDc4MDAwMAorMzIgMSA0ODAwMDAwCiszMiAxIDQ4MjAwMDAKKzMyIDEgNDg0MDAwMAorMzIgMSA0ODYwMDAwCiszMiAxIDQ4ODAwMDAKKzMyIDEgNDkwMDAwMAorMzIgMSA0OTIwMDAwCiszMiAxIDQ5NDAwMDAKKzMyIDEgNDk2MDAwMAorMzIgMSA0OTgwMDAwCiszMiAxIDUwMDAwMDAKKzMyIDEgNTAyMDAwMAorMzIgMSA1MDQwMDAwCiszMiAxIDUwNjAwMDAKKzMyIDEgNTA4MDAwMAorMzIgMSA1MTAwMDAwCiszMiAxIDUxMjAwMDAKKzMyIDEgNTE0MDAwMAorMzIgMSA1MTYwMDAwCiszMiAxIDUxODAwMDAKKzMyIDEgNTIwMDAwMAorMzIgMSA1MjIwMDAwCiszMiAxIDUyNDAwMDAKKzMyIDEgNTI2MDAwMAorMzIgMSA1MjgwMDAwCiszMiAxIDUzMDAwMDAKKzMyIDEgNTMyMDAwMAorMzIgMSA1MzQwMDAwCiszMiAxIDUzNjAwMDAKKzMyIDEgNTM4MDAwMAorMzIgMSA1NDAwMDAwCiszMiAxIDU0MjAwMDAKKzMyIDEgNTQ0MDAwMAorMzIgMSA1NDYwMDAwCiszMiAxIDU0ODAwMDAKKzMyIDEgNTUwMDAwMAorMzIgMSA1NTIwMDAwCiszMiAxIDU1NDAwMDAKKzMyIDEgNTU2MDAwMAorMzIgMSA1NTgwMDAwCiszMiAxIDU2MDAwMDAKKzMyIDEgNTYyMDAwMAorMzIgMSA1NjQwMDAwCiszMiAxIDU2NjAwMDAKKzMyIDEgNTY4MDAwMAorMzIgMSA1NzAwMDAwCiszMiAxIDU3MjAwMDAKKzMyIDEgNTc0MDAwMAorMzIgMSA1NzYwMDAwCiszMiAxIDU3ODAwMDAKKzMyIDEgNTgwMDAwMAorMzIgMSA1ODIwMDAwCiszMiAxIDU4NDAwMDAKKzMyIDEgNTg2MDAwMAorMzIgMSA1ODgwMDAwCiszMiAxIDU5MDAwMDAKKzMyIDEgNTkyMDAwMAorMzIgMSA1OTQwMDAwCiszMiAxIDU5NjAwMDAKKzMyIDEgNTk4MDAwMAorMzIgMSA2MDAwMDAwCiszMiAxIDYwMjAwMDAKKzMyIDEgNjA0MDAwMAorMzIgMSA2MDYwMDAwCiszMiAxIDYwODAwMDAKKzMyIDEgNjEwMDAwMAorMzIgMSA2MTIwMDAwCiszMiAxIDYxNDAwMDAKKzMyIDEgNjE2MDAwMAorMzIgMSA2MTgwMDAwCiszMiAxIDYyMDAwMDAKKzMyIDEgNjIyMDAwMAorMzIgMSA2MjQwMDAwCiszMiAxIDYyNjAwMDAKKzMyIDEgNjI4MDAwMAorMzIgMSA2MzAwMDAwCiszMiAxIDYzMjAwMDAKKzMyIDEgNjM0MDAwMAorMzIgMSA2MzYwMDAwCiszMiAxIDYzODAwMDAKKzMyIDEgNjQwMDAwMAorMzIgMSA2NDIwMDAwCiszMiAxIDY0NDAwMDAKKzMyIDEgNjQ2MDAwMAorMzIgMSA2NDgwMDAwCiszMiAxIDY1MDAwMDAKKzMyIDEgNjUyMDAwMAorMzIgMSA2NTQwMDAwCiszMiAxIDY1NjAwMDAKKzMyIDEgNjU4MDAwMAorMzIgMSA2NjAwMDAwCiszMiAxIDY2MjAwMDAKKzMyIDEgNjY0MDAwMAorMzIgMSA2NjYwMDAwCiszMiAxIDY2ODAwMDAKKzMyIDEgNjcwMDAwMAorMzIgMSA2NzIwMDAwCiszMiAxIDY3NDAwMDAKKzMyIDEgNjc2MDAwMAorMzIgMSA2NzgwMDAwCiszMiAxIDY4MDAwMDAKKzMyIDEgNjgyMDAwMAorMzIgMSA2ODQwMDAwCiszMiAxIDY4NjAwMDAKKzMyIDEgNjg4MDAwMAorMzIgMSA2OTAwMDAwCiszMiAxIDY5MjAwMDAKKzMyIDEgNjk0MDAwMAorMzIgMSA2OTYwMDAwCiszMiAxIDY5ODAwMDAKKzMyIDEgNzAwMDAwMAorMzIgMSA3MDIwMDAwCiszMiAxIDcwNDAwMDAKKzMyIDEgNzA2MDAwMAorMzIgMSA3MDgwMDAwCiszMiAxIDcxMDAwMDAKKzMyIDEgNzEyMDAwMAorMzIgMSA3MTQwMDAwCiszMiAxIDcxNjAwMDAKKzMyIDEgNzE4MDAwMAorMzIgMSA3MjAwMDAwCiszMiAxIDcyMjAwMDAKKzMyIDEgNzI0MDAwMAorMzIgMSA3MjYwMDAwCiszMiAxIDcyODAwMDAKKzMyIDEgNzMwMDAwMAorMzIgMSA3MzIwMDAwCiszMiAxIDczNDAwMDAKKzMyIDEgNzM2MDAwMAorMzIgMSA3MzgwMDAwCiszMiAxIDc0MDAwMDAKKzMyIDEgNzQyMDAwMAorMzIgMSA3NDQwMDAwCiszMiAxIDc0NjAwMDAKKzMyIDEgNzQ4MDAwMAorMzIgMSA3NTAwMDAwCiszMiAxIDc1MjAwMDAKKzMyIDEgNzU0MDAwMAorMzIgMSA3NTYwMDAwCiszMiAxIDc1ODAwMDAKKzMyIDEgNzYwMDAwMAorMzIgMSA3NjIwMDAwCiszMiAxIDc2NDAwMDAKKzMyIDEgNzY2MDAwMAorMzIgMSA3NjgwMDAwCiszMiAxIDc3MDAwMDAKKzMyIDEgNzcyMDAwMAorMzIgMSA3NzQwMDAwCiszMiAxIDc3NjAwMDAKKzMyIDEgNzc4MDAwMAorMzIgMSA3ODAwMDAwCiszMiAxIDc4MjAwMDAKKzMyIDEgNzg0MDAwMAorMzIgMSA3ODYwMDAwCiszMiAxIDc4ODAwMDAKKzMyIDEgNzkwMDAwMAorMzIgMSA3OTIwMDAwCiszMiAxIDc5NDAwMDAKKzMyIDEgNzk2MDAwMAorMzIgMSA3OTgwMDAwCiszMiAxIDgwMDAwMDAKKzMyIDEgODAyMDAwMAorMzIgMSA4MDQwMDAwCiszMiAxIDgwNjAwMDAKKzMyIDEgODA4MDAwMAorMzIgMSA4MTAwMDAwCiszMiAxIDgxMjAwMDAKKzMyIDEgODE0MDAwMAorMzIgMSA4MTYwMDAwCiszMiAxIDgxODAwMDAKKzMyIDEgODIwMDAwMAorMzIgMSA4MjIwMDAwCiszMiAxIDgyNDAwMDAKKzMyIDEgODI2MDAwMAorMzIgMSA4MjgwMDAwCiszMiAxIDgzMDAwMDAKKzMyIDEgODMyMDAwMAorMzIgMSA4MzQwMDAwCiszMiAxIDgzNjAwMDAKKzMyIDEgODM4MDAwMAorMzIgMSA4NDAwMDAwCiszMiAxIDg0MjAwMDAKKzMyIDEgODQ0MDAwMAorMzIgMSA4NDYwMDAwCiszMiAxIDg0ODAwMDAKKzMyIDEgODUwMDAwMAorMzIgMSA4NTIwMDAwCiszMiAxIDg1NDAwMDAKKzMyIDEgODU2MDAwMAorMzIgMSA4NTgwMDAwCiszMiAxIDg2MDAwMDAKKzMyIDEgODYyMDAwMAorMzIgMSA4NjQwMDAwCiszMiAxIDg2NjAwMDAKKzMyIDEgODY4MDAwMAorMzIgMSA4NzAwMDAwCiszMiAxIDg3MjAwMDAKKzMyIDEgODc0MDAwMAorMzIgMSA4NzYwMDAwCiszMiAxIDg3ODAwMDAKKzMyIDEgODgwMDAwMAorMzIgMSA4ODIwMDAwCiszMiAxIDg4NDAwMDAKKzMyIDEgODg2MDAwMAorMzIgMSA4ODgwMDAwCiszMiAxIDg5MDAwMDAKKzMyIDEgODkyMDAwMAorMzIgMSA4OTQwMDAwCiszMiAxIDg5NjAwMDAKKzMyIDEgODk4MDAwMAorMzIgMSA5MDAwMDAwCiszMiAxIDkwMjAwMDAKKzMyIDEgOTA0MDAwMAorMzIgMSA5MDYwMDAwCiszMiAxIDkwODAwMDAKKzMyIDEgOTEwMDAwMAorMzIgMSA5MTIwMDAwCiszMiAxIDkxNDAwMDAKKzMyIDEgOTE2MDAwMAorMzIgMSA5MTgwMDAwCiszMiAxIDkyMDAwMDAKKzMyIDEgOTIyMDAwMAorMzIgMSA5MjQwMDAwCiszMiAxIDkyNjAwMDAKKzMyIDEgOTI4MDAwMAorMzIgMSA5MzAwMDAwCiszMiAxIDkzMjAwMDAKKzMyIDEgOTM0MDAwMAorMzIgMSA5MzYwMDAwCiszMiAxIDkzODAwMDAKKzMyIDEgOTQwMDAwMAorMzIgMSA5NDIwMDAwCiszMiAxIDk0NDAwMDAKKzMyIDEgOTQ2MDAwMAorMzIgMSA5NDgwMDAwCiszMiAxIDk1MDAwMDAKKzMyIDEgOTUyMDAwMAorMzIgMSA5NTQwMDAwCiszMiAxIDk1NjAwMDAKKzMyIDEgOTU4MDAwMAorMzIgMSA5NjAwMDAwCiszMiAxIDk2MjAwMDAKKzMyIDEgOTY0MDAwMAorMzIgMSA5NjYwMDAwCiszMiAxIDk2ODAwMDAKKzMyIDEgOTcwMDAwMAorMzIgMSA5NzIwMDAwCiszMiAxIDk3NDAwMDAKKzMyIDEgOTc2MDAwMAorMzIgMSA5NzgwMDAwCiszMiAxIDk4MDAwMDAKKzMyIDEgOTgyMDAwMAorMzIgMSA5ODQwMDAwCiszMiAxIDk4NjAwMDAKKzMyIDEgOTg4MDAwMAorMzIgMSA5OTAwMDAwCiszMiAxIDk5MjAwMDAKKzMyIDEgOTk0MDAwMAorMzIgMSA5OTYwMDAwCiszMiAxIDk5ODAwMDAKKzMyIDEgMTAwMDAwMDAKKzMyIDEgMTAwMjAwMDAKKzMyIDEgMTAwNDAwMDAKKzMyIDEgMTAwNjAwMDAKKzMyIDEgMTAwODAwMDAKKzMyIDEgMTAxMDAwMDAKKzMyIDEgMTAxMjAwMDAKKzMyIDEgMTAxNDAwMDAKKzMyIDEgMTAxNjAwMDAKKzMyIDEgMTAxODAwMDAKKzMyIDEgMTAyMDAwMDAKKzMyIDEgMTAyMjAwMDAKKzMyIDEgMTAyNDAwMDAKKzMyIDEgMTAyNjAwMDAKKzMyIDEgMTAyODAwMDAKKzMyIDEgMTAzMDAwMDAKKzMyIDEgMTAzMjAwMDAKKzMyIDEgMTAzNDAwMDAKKzMyIDEgMTAzNjAwMDAKKzMyIDEgMTAzODAwMDAKKzMyIDEgMTA0MDAwMDAKKzMyIDEgMTA0MjAwMDAKKzMyIDEgMTA0NDAwMDAKKzMyIDEgMTA0NjAwMDAKKzMyIDEgMTA0ODAwMDAKKzMyIDEgMTA1MDAwMDAKKzMyIDEgMTA1MjAwMDAKKzMyIDEgMTA1NDAwMDAKKzMyIDEgMTA1NjAwMDAKKzMyIDEgMTA1ODAwMDAKKzMyIDEgMTA2MDAwMDAKKzMyIDEgMTA2MjAwMDAKKzMyIDEgMTA2NDAwMDAKKzMyIDEgMTA2NjAwMDAKKzMyIDEgMTA2ODAwMDAKKzMyIDEgMTA3MDAwMDAKKzMyIDEgMTA3MjAwMDAKKzMyIDEgMTA3NDAwMDAKKzMyIDEgMTA3NjAwMDAKKzMyIDEgMTA3ODAwMDAKKzMyIDEgMTA4MDAwMDAKKzMyIDEgMTA4MjAwMDAKKzMyIDEgMTA4NDAwMDAKKzMyIDEgMTA4NjAwMDAKKzMyIDEgMTA4ODAwMDAKKzMyIDEgMTA5MDAwMDAKKzMyIDEgMTA5MjAwMDAKKzMyIDEgMTA5NDAwMDAKKzMyIDEgMTA5NjAwMDAKKzMyIDEgMTA5ODAwMDAKKzMyIDEgMTEwMDAwMDAKKzMyIDEgMTEwMjAwMDAKKzMyIDEgMTEwNDAwMDAKKzMyIDEgMTEwNjAwMDAKKzMyIDEgMTEwODAwMDAKKzMyIDEgMTExMDAwMDAKKzMyIDEgMTExMjAwMDAKKzMyIDEgMTExNDAwMDAKKzMyIDEgMTExNjAwMDAKKzMyIDEgMTExODAwMDAKKzMyIDEgMTEyMDAwMDAKKzMyIDEgMTEyMjAwMDAKKzMyIDEgMTEyNDAwMDAKKzMyIDEgMTEyNjAwMDAKKzMyIDEgMTEyODAwMDAKKzMyIDEgMTEzMDAwMDAKKzMyIDEgMTEzMjAwMDAKKzMyIDEgMTEzNDAwMDAKKzMyIDEgMTEzNjAwMDAKKzMyIDEgMTEzODAwMDAKKzMyIDEgMTE0MDAwMDAKKzMyIDEgMTE0MjAwMDAKKzMyIDEgMTE0NDAwMDAKKzMyIDEgMTE0NjAwMDAKKzMyIDEgMTE0ODAwMDAKKzMyIDEgMTE1MDAwMDAKKzMyIDEgMTE1MjAwMDAKKzMyIDEgMTE1NDAwMDAKKzMyIDEgMTE1NjAwMDAKKzMyIDEgMTE1ODAwMDAKKzMyIDEgMTE2MDAwMDAKKzMyIDEgMTE2MjAwMDAKKzMyIDEgMTE2NDAwMDAKKzMyIDEgMTE2NjAwMDAKKzMyIDEgMTE2ODAwMDAKKzMyIDEgMTE3MDAwMDAKKzMyIDEgMTE3MjAwMDAKKzMyIDEgMTE3NDAwMDAKKzMyIDEgMTE3NjAwMDAKKzMyIDEgMTE3ODAwMDAKKzMyIDEgMTE4MDAwMDAKKzMyIDEgMTE4MjAwMDAKKzMyIDEgMTE4NDAwMDAKKzMyIDEgMTE4NjAwMDAKKzMyIDEgMTE4ODAwMDAKKzMyIDEgMTE5MDAwMDAKKzMyIDEgMTE5MjAwMDAKKzMyIDEgMTE5NDAwMDAKKzMyIDEgMTE5NjAwMDAKKzMyIDEgMTE5ODAwMDAKKzMyIDEgMTIwMDAwMDAKKzMyIDEgMTIwMjAwMDAKKzMyIDEgMTIwNDAwMDAKKzMyIDEgMTIwNjAwMDAKKzMyIDEgMTIwODAwMDAKKzMyIDEgMTIxMDAwMDAKKzMyIDEgMTIxMjAwMDAKKzMyIDEgMTIxNDAwMDAKKzMyIDEgMTIxNjAwMDAKKzMyIDEgMTIxODAwMDAKKzMyIDEgMTIyMDAwMDAKKzMyIDEgMTIyMjAwMDAKKzMyIDEgMTIyNDAwMDAKKzMyIDEgMTIyNjAwMDAKKzMyIDEgMTIyODAwMDAKKzMyIDEgMTIzMDAwMDAKKzMyIDEgMTIzMjAwMDAKKzMyIDEgMTIzNDAwMDAKKzMyIDEgMTIzNjAwMDAKKzMyIDEgMTIzODAwMDAKKzMyIDEgMTI0MDAwMDAKKzMyIDEgMTI0MjAwMDAKKzMyIDEgMTI0NDAwMDAKKzMyIDEgMTI0NjAwMDAKKzMyIDEgMTI0ODAwMDAKKzMyIDEgMTI1MDAwMDAKKzMyIDEgMTI1MjAwMDAKKzMyIDEgMTI1NDAwMDAKKzMyIDEgMTI1NjAwMDAKKzMyIDEgMTI1ODAwMDAKKzMyIDEgMTI2MDAwMDAKKzMyIDEgMTI2MjAwMDAKKzMyIDEgMTI2NDAwMDAKKzMyIDEgMTI2NjAwMDAKKzMyIDEgMTI2ODAwMDAKKzMyIDEgMTI3MDAwMDAKKzMyIDEgMTI3MjAwMDAKKzMyIDEgMTI3NDAwMDAKKzMyIDEgMTI3NjAwMDAKKzMyIDEgMTI3ODAwMDAKKzMyIDEgMTI4MDAwMDAKKzMyIDEgMTI4MjAwMDAKKzMyIDEgMTI4NDAwMDAKKzMyIDEgMTI4NjAwMDAKKzMyIDEgMTI4ODAwMDAKKzMyIDEgMTI5MDAwMDAKKzMyIDEgMTI5MjAwMDAKKzMyIDEgMTI5NDAwMDAKKzMyIDEgMTI5NjAwMDAKKzMyIDEgMTI5ODAwMDAKKzMyIDEgMTMwMDAwMDAKKzMyIDEgMTMwMjAwMDAKKzMyIDEgMTMwNDAwMDAKKzMyIDEgMTMwNjAwMDAKKzMyIDEgMTMwODAwMDAKKzMyIDEgMTMxMDAwMDAKKzMyIDEgMTMxMjAwMDAKKzMyIDEgMTMxNDAwMDAKKzMyIDEgMTMxNjAwMDAKKzMyIDEgMTMxODAwMDAKKzMyIDEgMTMyMDAwMDAKKzMyIDEgMTMyMjAwMDAKKzMyIDEgMTMyNDAwMDAKKzMyIDEgMTMyNjAwMDAKKzMyIDEgMTMyODAwMDAKKzMyIDEgMTMzMDAwMDAKKzMyIDEgMTMzMjAwMDAKKzMyIDEgMTMzNDAwMDAKKzMyIDEgMTMzNjAwMDAKKzMyIDEgMTMzODAwMDAKKzMyIDEgMTM0MDAwMDAKKzMyIDEgMTM0MjAwMDAKKzMyIDEgMTM0NDAwMDAKKzMyIDEgMTM0NjAwMDAKKzMyIDEgMTM0ODAwMDAKKzMyIDEgMTM1MDAwMDAKKzMyIDEgMTM1MjAwMDAKKzMyIDEgMTM1NDAwMDAKKzMyIDEgMTM1NjAwMDAKKzMyIDEgMTM1ODAwMDAKKzMyIDEgMTM2MDAwMDAKKzMyIDEgMTM2MjAwMDAKKzMyIDEgMTM2NDAwMDAKKzMyIDEgMTM2NjAwMDAKKzMyIDEgMTM2ODAwMDAKKzMyIDEgMTM3MDAwMDAKKzMyIDEgMTM3MjAwMDAKKzMyIDEgMTM3NDAwMDAKKzMyIDEgMTM3NjAwMDAKKzMyIDEgMTM3ODAwMDAKKzMyIDEgMTM4MDAwMDAKKzMyIDEgMTM4MjAwMDAKKzMyIDEgMTM4NDAwMDAKKzMyIDEgMTM4NjAwMDAKKzMyIDEgMTM4ODAwMDAKKzMyIDEgMTM5MDAwMDAKKzMyIDEgMTM5MjAwMDAKKzMyIDEgMTM5NDAwMDAKKzMyIDEgMTM5NjAwMDAKKzMyIDEgMTM5ODAwMDAKKzMyIDEgMTQwMDAwMDAKKzMyIDEgMTQwMjAwMDAKKzMyIDEgMTQwNDAwMDAKKzMyIDEgMTQwNjAwMDAKKzMyIDEgMTQwODAwMDAKKzMyIDEgMTQxMDAwMDAKKzMyIDEgMTQxMjAwMDAKKzMyIDEgMTQxNDAwMDAKKzMyIDEgMTQxNjAwMDAKKzMyIDEgMTQxODAwMDAKKzMyIDEgMTQyMDAwMDAKKzMyIDEgMTQyMjAwMDAKKzMyIDEgMTQyNDAwMDAKKzMyIDEgMTQyNjAwMDAKKzMyIDEgMTQyODAwMDAKKzMyIDEgMTQzMDAwMDAKKzMyIDEgMTQzMjAwMDAKKzMyIDEgMTQzNDAwMDAKKzMyIDEgMTQzNjAwMDAKKzMyIDEgMTQzODAwMDAKKzMyIDEgMTQ0MDAwMDAKKzMyIDEgMTQ0MjAwMDAKKzMyIDEgMTQ0NDAwMDAKKzMyIDEgMTQ0NjAwMDAKKzMyIDEgMTQ0ODAwMDAKKzMyIDEgMTQ1MDAwMDAKKzMyIDEgMTQ1MjAwMDAKKzMyIDEgMTQ1NDAwMDAKKzMyIDEgMTQ1NjAwMDAKKzMyIDEgMTQ1ODAwMDAKKzMyIDEgMTQ2MDAwMDAKKzMyIDEgMTQ2MjAwMDAKKzMyIDEgMTQ2NDAwMDAKKzMyIDEgMTQ2NjAwMDAKKzMyIDEgMTQ2ODAwMDAKKzMyIDEgMTQ3MDAwMDAKKzMyIDEgMTQ3MjAwMDAKKzMyIDEgMTQ3NDAwMDAKKzMyIDEgMTQ3NjAwMDAKKzMyIDEgMTQ3ODAwMDAKKzMyIDEgMTQ4MDAwMDAKKzMyIDEgMTQ4MjAwMDAKKzMyIDEgMTQ4NDAwMDAKKzMyIDEgMTQ4NjAwMDAKKzMyIDEgMTQ4ODAwMDAKKzMyIDEgMTQ5MDAwMDAKKzMyIDEgMTQ5MjAwMDAKKzMyIDEgMTQ5NDAwMDAKKzMyIDEgMTQ5NjAwMDAKKzMyIDEgMTQ5ODAwMDAKKzMyIDEgMTUwMDAwMDAKKzMyIDEgMTUwMjAwMDAKKzMyIDEgMTUwNDAwMDAKKzMyIDEgMTUwNjAwMDAKKzMyIDEgMTUwODAwMDAKKzMyIDEgMTUxMDAwMDAKKzMyIDEgMTUxMjAwMDAKKzMyIDEgMTUxNDAwMDAKKzMyIDEgMTUxNjAwMDAKKzMyIDEgMTUxODAwMDAKKzMyIDEgMTUyMDAwMDAKKzMyIDEgMTUyMjAwMDAKKzMyIDEgMTUyNDAwMDAKKzMyIDEgMTUyNjAwMDAKKzMyIDEgMTUyODAwMDAKKzMyIDEgMTUzMDAwMDAKKzMyIDEgMTUzMjAwMDAKKzMyIDEgMTUzNDAwMDAKKzMyIDEgMTUzNjAwMDAKKzMyIDEgMTUzODAwMDAKKzMyIDEgMTU0MDAwMDAKKzMyIDEgMTU0MjAwMDAKKzMyIDEgMTU0NDAwMDAKKzMyIDEgMTU0NjAwMDAKKzMyIDEgMTU0ODAwMDAKKzMyIDEgMTU1MDAwMDAKKzMyIDEgMTU1MjAwMDAKKzMyIDEgMTU1NDAwMDAKKzMyIDEgMTU1NjAwMDAKKzMyIDEgMTU1ODAwMDAKKzMyIDEgMTU2MDAwMDAKKzMyIDEgMTU2MjAwMDAKKzMyIDEgMTU2NDAwMDAKKzMyIDEgMTU2NjAwMDAKKzMyIDEgMTU2ODAwMDAKKzMyIDEgMTU3MDAwMDAKKzMyIDEgMTU3MjAwMDAKKzMyIDEgMTU3NDAwMDAKKzMyIDEgMTU3NjAwMDAKKzMyIDEgMTU3ODAwMDAKKzMyIDEgMTU4MDAwMDAKKzMyIDEgMTU4MjAwMDAKKzMyIDEgMTU4NDAwMDAKKzMyIDEgMTU4NjAwMDAKKzMyIDEgMTU4ODAwMDAKKzMyIDEgMTU5MDAwMDAKKzMyIDEgMTU5MjAwMDAKKzMyIDEgMTU5NDAwMDAKKzMyIDEgMTU5NjAwMDAKKzMyIDEgMTU5ODAwMDAKKzMyIDEgMTYwMDAwMDAKKzMyIDEgMTYwMjAwMDAKKzMyIDEgMTYwNDAwMDAKKzMyIDEgMTYwNjAwMDAKKzMyIDEgMTYwODAwMDAKKzMyIDEgMTYxMDAwMDAKKzMyIDEgMTYxMjAwMDAKKzMyIDEgMTYxNDAwMDAKKzMyIDEgMTYxNjAwMDAKKzMyIDEgMTYxODAwMDAKKzMyIDEgMTYyMDAwMDAKKzMyIDEgMTYyMjAwMDAKKzMyIDEgMTYyNDAwMDAKKzMyIDEgMTYyNjAwMDAKKzMyIDEgMTYyODAwMDAKKzMyIDEgMTYzMDAwMDAKKzMyIDEgMTYzMjAwMDAKKzMyIDEgMTYzNDAwMDAKKzMyIDEgMTYzNjAwMDAKKzMyIDEgMTYzODAwMDAKKzMyIDEgMTY0MDAwMDAKKzMyIDEgMTY0MjAwMDAKKzMyIDEgMTY0NDAwMDAKKzMyIDEgMTY0NjAwMDAKKzMyIDEgMTY0ODAwMDAKKzMyIDEgMTY1MDAwMDAKKzMyIDEgMTY1MjAwMDAKKzMyIDEgMTY1NDAwMDAKKzMyIDEgMTY1NjAwMDAKKzMyIDEgMTY1ODAwMDAKKzMyIDEgMTY2MDAwMDAKKzMyIDEgMTY2MjAwMDAKKzMyIDEgMTY2NDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NmVhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDgwNyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCis2NCAxIDQwMDAwCis2NCAxIDgwMDAwCis2NCAxIDEyMDAwMAorOTYgMSAxNjAwMDAKKzk2IDEgMjIwMDAwCis5NiAxIDI4MDAwMAorOTYgMSAzNDAwMDAKKzEyOCAxIDQwMDAwMAorMTI4IDEgNDgwMDAwCisxMjggMSA1NjAwMDAKKzEyOCAxIDY0MDAwMAorMTI4IDEgNzIwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmI3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWcyIiwgbXBlZzJ9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LCB7ImF2MSIsIGF2MX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisKKyAgICAgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBtVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzSGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHNIaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0c0hpdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2Q7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICh2b2lkKW1Dc2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzIsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgYXYxLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDEpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXZjLAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCJ9LAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aGV2YywKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMifSwKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWcyLAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiJ9LAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoMjYzLAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMifSwKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnNCwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2In0sCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOCwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCJ9LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSJ9LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2MSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmF2MSIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5hdjEifSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmluZm8iLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAoMSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICAgIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfUChDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhlcywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoMCwgMSkpOworCisvLyBBZGFwdGl2ZSBUZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgQWRhcHRpdmVEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkFkYXB0aXZlIERlY29kZSBUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fAorICAgICAgICAgIG1Db21wTmFtZSA9PSB2cDkgfHwgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgeworICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgICAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisKKyAgICAgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcE1heCA9IDA7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBPZmZzZXQ7CisgICAgICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBNYXggPCB0aW1lc3RhbXApIHRpbWVzdGFtcE1heCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBPZmZzZXQgPSB0aW1lc3RhbXBNYXg7CisgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAorICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAoaW50KShJbmZvLnNpemUoKSAtIG9mZnNldCksIGZhbHNlKSk7CisKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG9mZnNldCA9IChpbnQpSW5mby5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2VuZCBFT1MKKyAgICAvLyBUT0RPIEFkZCBmdW5jdGlvbiB0byBzZW5kIEVPUyB3b3JrIGl0ZW0KKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gKChJbmZvLnNpemUoKSkgKyAxKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSArIDEpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lURVJBVElPTlM7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgICAgICBzaXplX3QgaiA9IC0xOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoSW5mb1tqXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tqXS5mbGFncyAtIDEpOworCisgICAgICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGogKyAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZWxlYXNlKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworCisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmVuY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIGJvb2wgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KTsKKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHVpbnQzMl90IG1GYWlsZWRXb3JrUmVjZWl2ZWQ7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1HcmFwaGljUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JmlucHV0U2l6ZX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogVVJMKSB7CisgICAgc3RyY2F0KFVSTCwgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Iik7Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGdyYXBoaWNQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgZnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRnJhbWVzLCB1aW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoZWQgPSBmYWxzZSxib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIEMyX09LLAorICAgICAgICAgICAgZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gR3JhcGhpYyBWaWV3CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCogcFUgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QqIHBWID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIG1lbWNweShwWSwgZGF0YSwgbldpZHRoICogbkhlaWdodCk7CisgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG5XaWR0aCAqIG5IZWlnaHQsIChuV2lkdGggKiBuSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgbWVtY3B5KHBWLCBkYXRhICsgKG5XaWR0aCAqIG5IZWlnaHQgKiA1ID4+IDIpLCBuV2lkdGggKiBuSGVpZ2h0ID4+IDIpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBFTkNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkVuY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIEVOQ19OVU1fRlJBTUVTLCBuV2lkdGgsIG5IZWlnaHQpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gRU5DX05VTV9GUkFNRVMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICVkIiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBFTkNfTlVNX0ZSQU1FUyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIW1Dc2QgJiYgKG1Db21wTmFtZSAhPSB2cDggJiYgbUNvbXBOYW1lICE9IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CisgICAgfQorCisgICAgaWYgKG1Dc2QgJiYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCBleHBlY3RlZCI7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0KSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgSW52YWxpZEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZmVlZGluZyBsYXJnZXIvc21hbGxlciBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgbGFyZ2VyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBuV2lkdGgqMiwgbkhlaWdodCoyLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgc21hbGxlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgbldpZHRoLzIsIG5IZWlnaHQvMiwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gMykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogMyIsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobUZhaWxlZFdvcmtSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBmYWlsZWQgZnJhbWUgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZEZyYW1lc1JlY2VpdmVkIDogJWQiLCBtRmFpbGVkV29ya1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIFJlc29sdXRpb25UZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVuY29kaW5nIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HRCgiVHJ5aW5nIGVuY29kZSBmb3Igd2lkdGggJWQgaGVpZ2h0ICVkIiwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBtRW9zID0gZmFsc2U7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgXSwKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmU1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMCwwICsxLDEzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQ2xpZW50IgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBMaXN0IG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcyBpbiB0aGUgZGVjcmVhc2luZyBvcmRlciBvZiBwcmVmZXJlbmNlLgorY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lc1tdID0geworICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICJzb2Z0d2FyZSIsCisgICAgfTsKKworLy8gTnVtYmVyIG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KK2NvbnN0ZXhwciBzaXplX3Qga051bUNsaWVudHMgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrQ2xpZW50TmFtZXMpPjo6dmFsdWU7CisKK3R5cGVkZWYgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piwga051bUNsaWVudHM+IENsaWVudExpc3Q7CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gb2J0YWluIGtub3duIGNsaWVudHMuCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoc2l6ZV90IGluZGV4KSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5tZWRpYS5jb2RlYzIiLCB1aW50MzJfdCgwKSk7CisgICAgcmV0dXJuIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBrQ2xpZW50TmFtZXNbaW5kZXhdLAorICAgICAgICAgICAgKHNlcnZpY2VNYXNrICYgKDEgPDwgaW5kZXgpKSAhPSAwKTsKK30KKworQ2xpZW50TGlzdCBnZXRDbGllbnRMaXN0KCkgeworICAgIENsaWVudExpc3QgbGlzdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbGlzdFtpXSA9IGdldENsaWVudChpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK30gLy8gdW5uYW1lZAorCisvLyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQKKworY29uc3QgQzJTdHJpbmcmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWU7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KAorICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYmFzZSkKKyAgICAgIDogbUJhc2V7YmFzZX0sCisgICAgICAgIG1OYW1le1tiYXNlXSgpIC0+IEMyU3RyaW5nIHsKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBvdXROYW1lOworICAgICAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UtPmdldE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJm91dE5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1N0YXR1cy5pc09rKCkgPyBvdXROYW1lIDogIiI7CisgICAgICAgICAgICB9KCl9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICB9CisgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgfQorICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnkoCisgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5IC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gZXJyb3Igd2hpbGUgcGFyc2luZyBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJiAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHN0YWNrUGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9IHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gc2tpcHBlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIHBhcmFtIHVwZGF0ZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbVBvaW50ZXItPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXh0cmEgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50Ojpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgUGFyYW1zIGhpZGxQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZoaWRsUGFyYW1zLCBwYXJhbXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25maWcoCisgICAgICAgICAgICBoaWRsUGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZwYXJhbXMsIGZhaWx1cmVzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtcyYgbykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBmYWlsdXJlcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLT5yZXNpemUoaSArIGYuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNmIDogZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmKCpmYWlsdXJlcylbaSsrXSwgc2YpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBTZXR0aW5nUmVzdWx0IHJldHVybmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVQYXJhbXNGcm9tQmxvYihwYXJhbXMsIG8pKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBwYXJzZSByZXR1cm5lZCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IENhY2hlIGFuZCBxdWVyeSBwcm9wZXJseSEKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIHBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+JiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gcGFyYW1zLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZXNpemUoaSArIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgc3AgOiBwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKnBhcmFtcylbaSsrXSwgc3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIHJldHVybmVkIFBhcmFtRGVzY3JpcHRvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGluRmllbGRzKGZpZWxkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZpbkZpZWxkc1tpXSwgZmllbGRzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gYmFkIGlucHV0IjsKKyAgICAgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgaW5GaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJmluRmllbGRzLCAmZmllbGRzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+JiByKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLnNpemUoKSAhPSBmaWVsZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYW5kIG91dHB1dCBsaXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgZGlmZmVyZW50IHNpemVzLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZmllbGRzW2ldLCBpbkZpZWxkc1tpXSwgcltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmV0dXJuZWQgdmFsdWUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lciA6IHB1YmxpYyBJQ29tcG9uZW50TGlzdGVuZXIgeworICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uV29ya0RvbmUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtczsKKyAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtJdGVtcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFdvcmtCdW5kbGUuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpbnB1dCBidWZmZXJzIHBvdGVudGlhbGx5IGhlbGQgYnkgdGhlIGNvbXBvbmVudCBmcm9tIHF1ZXVlCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnQubG9jaygpOworICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPmhhbmRsZU9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lKGNvbXBvbmVudCwgd29ya0l0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4mIHNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMlNldHRpbmdSZXN1bHRzKAorICAgICAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+IGMyU2V0dGluZ1Jlc3VsdDsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZjMlNldHRpbmdSZXN1bHQsIHNldHRpbmdSZXN1bHRzW2ldKSkgeworICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSByZWNlaXZlZCBjb3JydXB0ZWQgU2V0dGluZ1Jlc3VsdC4iOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMlNldHRpbmdSZXN1bHRzW2ldID0gc3RkOjptb3ZlKGMyU2V0dGluZ1Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25UcmlwcGVkKGNvbXBvbmVudCwgYzJTZXR0aW5nUmVzdWx0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvblRyaXBwZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FcnJvcihTdGF0dXMgcywgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIm9uRXJyb3IgLS0iCisgICAgICAgICAgICAgICAgICAgPDwgIiBzdGF0dXMgPSAiIDw8IHMKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvckNvZGUgPSAiIDw8IGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3IoY29tcG9uZW50LCBzID09IFN0YXR1czo6T0sgPworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgOiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25GcmFtZXNSZW5kZXJlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgUmVuZGVyZWRGcmFtZSYgcmVuZGVyZWRGcmFtZSA6IHJlbmRlcmVkRnJhbWVzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25GcmFtZVJlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLmJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuc2xvdElkLAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnRpbWVzdGFtcE5zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJbnB1dEJ1ZmZlcj4mIGlucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IElucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6IGlucHV0QnVmZmVycykgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvbklucHV0QnVmZmVyc1JlbGVhc2VkIC0tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWQgZGVhdGggbm90aWZpY2F0aW9uIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5wdXQgYnVmZmVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lSW5kZXggPSAiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKK307CisKKy8vIENvZGVjMkNsaWVudAorQ29kZWMyQ2xpZW50OjpDb2RlYzJDbGllbnQoY29uc3Qgc3A8SUNvbXBvbmVudFN0b3JlPiYgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbUxpc3RlZHtmYWxzZX0sCisgICAgICAgIG1TZXJ2aWNlTmFtZXtzZXJ2aWNlTmFtZX0geworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IHRyYW5zUmVzdWx0ID0gYmFzZS0+Z2V0UG9vbENsaWVudE1hbmFnZXIoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJnZXRQb29sQ2xpZW50TWFuYWdlciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8c3A8SUNsaWVudE1hbmFnZXI+Pih0cmFuc1Jlc3VsdCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgeworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIHNwPENvbXBvbmVudDo6SGlkbExpc3RlbmVyPiBoaWRsTGlzdGVuZXIgPSBuZXcgQ29tcG9uZW50OjpIaWRsTGlzdGVuZXJ7fTsKKyAgICBoaWRsTGlzdGVuZXItPmJhc2UgPSBsaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICBbJnN0YXR1cywgY29tcG9uZW50LCBoaWRsTGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKKyAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSBpZiAoISpjb21wb25lbnQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gbnVsbCBjb21wb25lbnQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKmNvbXBvbmVudCktPnNldERlYXRoTGlzdGVuZXIoKmNvbXBvbmVudCwgbGlzdGVuZXIpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gZmFpbGVkIHRvIHNldCB1cCBkZWF0aCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorCisgICAgKCpjb21wb25lbnQpLT5tQnVmZmVyUG9vbFNlbmRlci5zZXRSZWNlaXZlcihtSG9zdFBvb2xNYW5hZ2VyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnRlcmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudEludGVyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnRlcmZhY2UoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnN0YXR1cywgaW5wdXRTdXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW5wdXRTdXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNyZWF0ZUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Omxpc3RDb21wb25lbnRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1MaXN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHNMaXN0OworICAgIH0KKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+bGlzdENvbXBvbmVudHMoCisgICAgICAgICAgICBbdGhpc10oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+JiB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJsaXN0Q29tcG9uZW50cyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYWl0c0xpc3QucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJm1UcmFpdHNMaXN0W2ldLCB0W2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAibGlzdENvbXBvbmVudHMgLS0gY29ycnVwdGVkIG91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1UcmFpdHNMaXN0W2ldLm93bmVyID0gbVNlcnZpY2VOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImxpc3RDb21wb25lbnRzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBtTGlzdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gbVRyYWl0c0xpc3Q7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y29weUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQ/CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICBMT0coRVJST1IpIDw8ICJjb3B5QnVmZmVyIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPgorICAgICAgICBDb2RlYzJDbGllbnQ6OmdldFBhcmFtUmVmbGVjdG9yKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGV4cG9zZWQgYXMgQzJQYXJhbVJlZmxlY3RvciBvbiB0aGUgY2xpZW50IHNpZGU7IGluc3RlYWQsIGl0CisgICAgLy8gc2hvdWxkIHJlZmxlY3QgdGhlIEhBTCBBUEkuCisgICAgc3RydWN0IFNpbXBsZVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoMSk7CisgICAgICAgICAgICBpbmRpY2VzWzBdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oY29yZUluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIFsmZGVzY3JpcHRvcl0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4mIHNkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgdmVjdG9yIG9mIHNpemUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2Quc2l6ZSgpIDw8ICIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgMS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZGVzY3JpcHRvciwgc2RbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJ1cHRlZCBkYXRhLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZVBhcmFtUmVmbGVjdG9yKHNwPEJhc2U+IGJhc2UpCisgICAgICAgICAgICA6IG1CYXNlKGJhc2UpIHsgfQorCisgICAgICAgIHNwPEJhc2U+IG1CYXNlOworICAgIH07CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVQYXJhbVJlZmxlY3Rvcj4obUJhc2UpOworfTsKKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsIGJvb2wgd2FpdEZvclNlcnZpY2UpIHsKKyAgICBpZiAoIXNlcnZpY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxCYXNlPiBiYXNlU3RvcmUgPSB3YWl0Rm9yU2VydmljZSA/CisgICAgICAgICAgICBCYXNlOjpnZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKSA6CisgICAgICAgICAgICBCYXNlOjp0cnlHZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICBpZiAoIWJhc2VTdG9yZSkgeworICAgICAgICBpZiAod2FpdEZvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ29kZWMyLjAgc2VydmljZSBcIiIgPDwgc2VydmljZU5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5hY2Nlc3NpYmxlLiBDaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb2RlYzIuMCBzZXJ2aWNlIFwiIiA8PCBzZXJ2aWNlTmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5hdmFpbGFibGUgYXQgdGhlIG1vbWVudC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhaXQgb3IgY2hlY2sgdGhlIGRldmljZSBtYW5pZmVzdC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ+KGJhc2VTdG9yZSwgc2VydmljZU5hbWUpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkZvckFsbFN0b3JlcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPgorICAgICAgICAgICAgcHJlZGljYXRlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfTk9fSU5JVDsgIC8vIG5vIElDb21wb25lbnRTdG9yZXMgcHJlc2VudAorCisgICAgLy8gQ2FjaGUgdGhlIG1hcHBpbmcga2V5IC0+IGluZGV4IG9mIENvZGVjMkNsaWVudCBpbiBnZXRDbGllbnQoKS4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBrZXkySW5kZXhNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNpemVfdD4ga2V5MkluZGV4OworCisgICAgLy8gQnkgZGVmYXVsdCB0cnkgYWxsIHN0b3Jlcy4gSG93ZXZlciwgdHJ5IHRoZSBsYXN0IGtub3duIGNsaWVudCBmaXJzdC4gSWYKKyAgICAvLyB0aGUgbGFzdCBrbm93biBjbGllbnQgZmFpbHMsIHJldHJ5IG9uY2UuIFdlIGRvIHRoaXMgYnkgcHVzaGluZyB0aGUgbGFzdAorICAgIC8vIGtub3duIGNsaWVudCBpbiBmcm9udCBvZiB0aGUgbGlzdCBvZiBhbGwgY2xpZW50cy4KKyAgICBzdGQ6OmRlcXVlPHNpemVfdD4gaW5kaWNlczsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IGtOdW1DbGllbnRzOyBpbmRleCA+IDA7ICkgeworICAgICAgICBpbmRpY2VzLnB1c2hfZnJvbnQoLS1pbmRleCk7CisgICAgfQorCisgICAgYm9vbCB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soa2V5MkluZGV4TXV0ZXgpOworICAgIGF1dG8gaXQgPSBrZXkySW5kZXguZmluZChrZXkpOworICAgIGlmIChpdCAhPSBrZXkySW5kZXguZW5kKCkpIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KGl0LT5zZWNvbmQpOworICAgICAgICB3YXNNYXBwZWQgPSB0cnVlOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworCisgICAgZm9yIChzaXplX3QgaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpbmRleCk7CisgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHByZWRpY2F0ZShjbGllbnQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGtleTJJbmRleFtrZXldID0gaW5kZXg7IC8vIHVwZGF0ZSBsYXN0IGtub3duIGNsaWVudCBpbmRleAorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhc01hcHBlZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDb3VsZCBub3QgZmluZCBcIiIgPDwga2V5IDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHRoZSBsYXN0IGluc3RhbmNlLiBSZXRyeWluZy4uLiI7CisgICAgICAgICAgICB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOyAgLy8gcmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBmcm9tIGEgdmFsaWQgY2xpZW50Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgJmxpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUNvbXBvbmVudChcIiIgPDwgY29tcG9uZW50TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgY29tcG9uZW50IFwiIiA8PCBjb21wb25lbnROYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgW293bmVyLCAmaW50ZXJmYWNlLCBpbnRlcmZhY2VOYW1lXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUludGVyZmFjZShpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUludGVyZmFjZShcIiIgPDwgaW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIFwiIiA8PCBpbnRlcmZhY2VOYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5zdGFnZWZyaWdodC5jMmlucHV0c3VyZmFjZSIsIHVpbnQzMl90KDApKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1DbGllbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKCgxIDw8IGkpICYgc2VydmljZU1hc2spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgaWYgKGNsaWVudCAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNyZWF0ZUlucHV0U3VyZmFjZSgmaW5wdXRTdXJmYWNlKSA9PSBDMl9PSyAmJgorICAgICAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgImZyb20gYW55IENvZGVjMi4wIHNlcnZpY2VzLiI7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHNMaXN0ID0gW10oKXsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdDsKKyAgICAgICAgc2l6ZV90IGxpc3RTaXplID0gMDsKKyAgICAgICAgQ2xpZW50TGlzdCBjbGllbnRMaXN0ID0gZ2V0Q2xpZW50TGlzdCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdFNpemUgKz0gY2xpZW50LT5saXN0Q29tcG9uZW50cygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LnJlc2VydmUobGlzdFNpemUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIGxpc3QuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0oKTsKKworICAgIHJldHVybiB0cmFpdHNMaXN0OworfQorCisvLyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyCisKK0NvZGVjMkNsaWVudDo6TGlzdGVuZXI6On5MaXN0ZW5lcigpIHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UKK0NvZGVjMkNsaWVudDo6SW50ZXJmYWNlOjpJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHRyYW5zUmVzdWx0MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+Pih0cmFuc1Jlc3VsdDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdDIuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdDIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye251bGxwdHJ9IHsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6On5Db21wb25lbnQoKSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlkKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBibG9ja1Bvb2xJZCwgY29uZmlndXJhYmxlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlLT5yZXNldCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqYmxvY2tQb29sSWQgPSBzdGF0aWNfY2FzdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4ocElkKTsKKyAgICAgICAgICAgICAgICAqY29uZmlndXJhYmxlID0gc3RkOjptYWtlX3NoYXJlZDxDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRlc3Ryb3lCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCit2b2lkIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpoYW5kbGVPbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKHdvcmtJdGVtcywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWUoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCAqaXRlbXMsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gYmFkIGlucHV0LiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Zmx1c2goCisgICAgICAgICAgICBbJnN0YXR1cywgZmx1c2hlZFdvcmtdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgV29ya0J1bmRsZSYgd2IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJmbHVzaCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KGZsdXNoZWRXb3JrLCB3YikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZsdXNoIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKCpmbHVzaGVkV29yaywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRyYWluKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkcmFpbiAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkcmFpbiAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+c3RhcnQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdGFydCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdGFydCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdG9wKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdG9wIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlc2V0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlc2V0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlbGVhc2UoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJyZWxlYXNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlbGVhc2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPQorICAgICAgICAgICAgc3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KCk7CisKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgaWdicCA9IG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihzdXJmYWNlKTsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwgaWdicCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgpOworICAgICAgICBpZiAobU91dHB1dElnYnAgIT0gc3VyZmFjZSkgeworICAgICAgICAgICAgbU91dHB1dElnYnAgPSBzdXJmYWNlOworICAgICAgICAgICAgaWYgKCFzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJxSWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmbU91dHB1dEJxSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IG9idGFpbiBidWZmZXJxdWV1ZSBpZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PdXRwdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dElnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicVNsb3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGF0dGFjaGluZyBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIG5vbi1idWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIW91dHB1dElnYnApIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBvdXRwdXQgc3VyZmFjZSBpcyBudWxsLiI7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQgfHwgZ2VuZXJhdGlvbiAhPSBvdXRwdXRHZW5lcmF0aW9uKSB7CisgICAgICAgIGlmICghaG9sZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2ssIG1PdXRwdXRJZ2JwLCBtT3V0cHV0QnFJZCwgbU91dHB1dEdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBtaWdyYXRpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGNvcnJ1cHRlZCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LiI7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICgheWllbGRCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBjYW5ub3QgeWllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJxdWV1ZS1iYXNlZCBibG9jayB0byB0aGUgYnVmZmVycXVldWUuIjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPm1CYXNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBwcm9kdWNlciwgc291cmNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvT214SW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25EZWF0aCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+bUJhc2UtPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldERlYXRoTGlzdGVuZXIgLS0gbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1Jlc3VsdCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2Vye25ldworICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6CisgICAgICAgICAgICBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoW2Jhc2VdKCkgLT4gc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkpfSB7Cit9CisKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+CisgICAgICAgIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9CisKK3NwPElJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRIYWxJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24KK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6ZGlzY29ubmVjdCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1Jlc3VsdCA9IG1CYXNlLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4Y2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX0NMSUVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX0NMSUVOVF9ICisKKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBDb2RlYzIuMCBISURMIGludGVyZmFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ29uZmlndXJhYmxlOworc3RydWN0IElDb21wb25lbnQ7CitzdHJ1Y3QgSUNvbXBvbmVudEludGVyZmFjZTsKK3N0cnVjdCBJQ29tcG9uZW50U3RvcmU7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CitzdHJ1Y3QgSUNsaWVudE1hbmFnZXI7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygb3RoZXIgY2xhc3NlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9IC8vIG5hbWVzcGFjZSBWMV8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAvLyBuYW1lc3BhY2UgZ3JhcGhpY3MKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2Ugb214IHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIG9teAorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUsIGJ1dCBmb3J3YXJkCisvLyBkZWNsYXJhdGlvbiBvZiBhbiBpbm5lciBjbGFzcyBpcyBub3QgcG9zc2libGUuCitzdHJ1Y3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIEJhc2U7CisKKyAgICBjb25zdCBDMlN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDb25maWd1cmFibGVDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgQzJTdHJpbmcgbU5hbWU7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQgOiBwdWJsaWMgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUgQmFzZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHR5cGVkZWYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IENvbmZpZ3VyYWJsZTsKKworICAgIHN0cnVjdCBDb21wb25lbnQ7CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQgU3RvcmU7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2aWNlTmFtZTsgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIGxpc3RDb21wb25lbnRzKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgZHN0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsCisgICAgICAgICAgICBib29sIHdhaXRGb3JTZXJ2aWNlID0gdHJ1ZSk7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UsIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgLy8gRmluZHMgdGhlIGZpcnN0IHN0b3JlIHdoZXJlIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBPSywgYW5kIHJldHVybnMgdGhlIGxhc3QKKyAgICAvLyBwcmVkaWNhdGUgcmVzdWx0LiBVc2VzIGtleSB0byByZW1lbWJlciB0aGUgbGFzdCBzdG9yZSBmb3VuZCwgYW5kIGlmIGNhY2hlZCwKKyAgICAvLyBpdCB0cmllcyB0aGF0IHN0b3JlIGJlZm9yZSB0cnlpbmcgYWxsIHN0b3JlcyAob25lIHJldHJ5KS4KKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mKT4gcHJlZGljYXRlKTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgbXV0YWJsZSBib29sIG1MaXN0ZWQ7CisgICAgc3RkOjpzdHJpbmcgbVNlcnZpY2VOYW1lOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW50ZXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50SW50ZXJmYWNlIEJhc2U7CisKKyAgICBJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcHJvZHVjZXMgc29tZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBnb2VzIGludG8gYSB0cmlwcGVkIHN0YXRlLgorICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzCisgICAgICAgICAgICApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBlbmNvdW50ZXJzIGFuIGVycm9yLgorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIHRoYXQgaG9zdHMgdGhlIGNvbXBvbmVudCBzaHV0cyBkb3duCisgICAgLy8gdW5leHBlY3RlZGx5LgorICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KKyAgICAvLyBJbnB1dCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IG9uV29ya0RvbmUoKSBvciBmbHVzaCgpIHdpbGwgbm90CisgICAgLy8gdHJpZ2dlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgYSBmcmFtZSBiZWluZworICAgIC8vIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgorICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgQ29tcG9uZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworICAgIH5Db21wb25lbnQoKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtT3V0cHV0QnVmZmVyUXVldWVNdXRleDsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBtT3V0cHV0R2VuZXJhdGlvbjsKKworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisKKyAgICBzdHJ1Y3QgSGlkbExpc3RlbmVyOworICAgIHZvaWQgaGFuZGxlT25Xb3JrRG9uZShjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlIEJhc2U7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICAgICAgICAgIENvbm5lY3Rpb25CYXNlOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgdW5kZXJseWluZyBJSW5wdXRTdXJmYWNlLgorICAgIHNwPEJhc2U+IGdldEhhbEludGVyZmFjZSgpIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfQ0xJRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIsCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorICAgIHNvY19zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgc3JjczogWworICAgICAgICAidmVuZG9yLmNwcCIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIHZlbmRvciBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CitpZmVxICgkKFRBUkdFVF9BUkNIKSwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICAgIGVsc2UKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKKyAgICBlbmRpZgorZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBhbmRyb2lkLWhhcmR3YXJlLW1lZGlhLWMyLWhhbC0xLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1pbmlqYWlsLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisvLyBPbXhTdG9yZSBpcyBhZGRlZCBmb3IgdmlzaWJpbGl0eSBieSBkdW1wc3RhdGUuCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorCisvLyBUaGlzIGlzIGNyZWF0ZWQgYnkgbW9kdWxlICJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Ii4gVGhpcyBjYW4gYmUgbW9kaWZpZWQuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0Jhc2VTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiOworCisvLyBBZGRpdGlvbmFsIGRldmljZS1zcGVjaWZpYyBzZWNjb21wIHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCBpbiB0aGlzIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0V4dFNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5leHQucG9saWN5IjsKKworY2xhc3MgRHVtbXlDMlN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIER1bW15QzJTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkR1bW15QzJTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBzdGFja1BhcmFtcyAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiAvKiBoZWFwUGFyYW1JbmRpY2VzICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCAvKiBoZWFwUGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBwYXJhbXMgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IC8qIGZhaWx1cmVzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IC8qIHBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgLyogZmllbGRzICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxEdW1teUMyU3RvcmU+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTI2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDU5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJQaXBlbGluZVdhdGNoZXIuY3BwIiwKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAiLAorICAgICAgICAiU2tpcEN1dEJ1ZmZlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q4NTlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSB7CisgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgIGlmICghc3RybmNtcChjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgImMyLmFuZHJvaWQuIiwgMTEpKSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgIGlmIChpbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemUgPT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXIsIHNvdXJjZSA9IGdldFNvdXJjZSgpXShDMkJ1ZmZlciAqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVyLCAtMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgKHZvaWQpcGFyYW1ldGVyTmFtZTsKKyAgICAqaW5kZXggPSBPTVhfSW5kZXhNYXg7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSYgbXNnKSB7CisgICAgaWYgKG1zZy50eXBlICE9IG9teF9tZXNzYWdlOjpFVkVOVCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmIChtc2cudS5ldmVudF9kYXRhLmV2ZW50ICE9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpbXNnLnUuZXZlbnRfZGF0YS5kYXRhMTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1zZy51LmV2ZW50X2RhdGEuZGF0YTM7CisKKyAgICAvLyBUT0RPOiBzZXQgZGF0YXNwYWNlIG9uIGNvbXBvbmVudCB0byBzZWUgaWYgaXQgaW1wYWN0cyBjb2xvciBhc3BlY3RzCisgICAgQUxPR0QoImRhdGFzcGFjZSBjaGFuZ2VkIHRvICUjeCBwaXhlbCBmb3JtYXQ6ICUjeCIsIGRhdGFTcGFjZSwgcGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SU9NWEJ1ZmZlclNvdXJjZT4gQzJPTVhOb2RlOjpnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJTb3VyY2U7Cit9CisKK3ZvaWQgQzJPTVhOb2RlOjpzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBnZXRTb3VyY2UoKTsKKyAgICB2b2lkIHNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTBjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE3ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDQ29kZWMuaCIKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBCR3JhcGhpY0J1ZmZlclNvdXJjZSA9IDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2U7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENDb2RlY1dhdGNoZG9nIDogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludDY0X3Qga1dhdGNoSW50ZXJ2YWxVcyA9IDMzMDAwMDA7ICAvLyAzLjMgc2VjcworCitwdWJsaWM6CisgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBpbnN0YW5jZShuZXcgQ0NvZGVjV2F0Y2hkb2cpOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZzsKKyAgICAgICAgLy8gQ2FsbCBJbml0KCkgb25seSBvbmNlLgorICAgICAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBJbml0LCBpbnN0YW5jZSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICB+Q0NvZGVjV2F0Y2hkb2coKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdhdGNoKHNwPENDb2RlYz4gY29kZWMpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgIC8vIElmIGEgd2F0Y2ggbWVzc2FnZSBpcyBpbiBmbGlnaHQsIHBpZ2d5LWJhY2sgdGhpcyBpbnN0YW5jZSBhcyB3ZWxsLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3N0IGEgbmV3IHdhdGNoIG1lc3NhZ2UuCisgICAgICAgICAgICBzaG91bGRQb3N0ID0gY29kZWNzLT5lbXB0eSgpOworICAgICAgICAgICAgY29kZWNzLT5lbXBsYWNlKGNvZGVjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgQUxPR1YoInBvc3Rpbmcgd2F0Y2ggbWVzc2FnZSIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3Qoa1dhdGNoSW50ZXJ2YWxVcyk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigid2F0Y2ggZm9yICV6dSBjb2RlY3MiLCBjb2RlY3MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNzLT5iZWdpbigpOyBpdCAhPSBjb2RlY3MtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPENDb2RlYz4gY29kZWMgPSBpdC0+cHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWNzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoIkNDb2RlY1dhdGNoZG9nOiB1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlY1dhdGNoZG9nKCkgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSB7fQorCisgICAgc3RhdGljIHZvaWQgSW5pdChjb25zdCBzcDxDQ29kZWNXYXRjaGRvZz4gJnRoaXopIHsKKyAgICAgICAgQUxPR1YoIkluaXQiKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c2V0TmFtZSgiQ0NvZGVjV2F0Y2hkb2ciKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXopOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+PiBtQ29kZWNzVG9XYXRjaDsKK307CisKK2NsYXNzIEMySW5wdXRTdXJmYWNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMklucHV0U3VyZmFjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+ICZzdXJmYWNlKSA6CisgICAgICAgIG1TdXJmYWNlKHN1cmZhY2UpIHsKKyAgICB9CisKKyAgICB+QzJJbnB1dFN1cmZhY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChjb21wLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UobVN1cmZhY2UsICZtQ29ubmVjdGlvbikpOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSW5wdXRTdXJmYWNlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIHN0YXJ0ZWQgc3RhdGUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nIGVvcyh0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3VyZmFjZS0+Y29uZmlnKHsmZW9zfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24+IG1Db25uZWN0aW9uOworfTsKKworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisvLyAgICBleHBsaWNpdCBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcihjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkgOiBtU291cmNlKHNvdXJjZSkge30KKyAgICBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeworICAgICAgICBtRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICB9CisgICAgfkdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob2RlID0gbmV3IEMyT01YTm9kZShjb21wKTsKKyAgICAgICAgbU5vZGUtPnNldEZyYW1lU2l6ZShtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCisgICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKG1Ob2RlLCBtRGF0YVNwYWNlKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ob2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkdCU1dyYXBwZXI6OmRpc2Nvbm5lY3Q6IG5vZGUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBPTVhCdWZmZXJTb3VyY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc291cmNlLT5vbk9teElkbGUoKTsKKyAgICAgICAgc291cmNlLT5vbk9teExvYWRlZCgpOworICAgICAgICBtTm9kZS5jbGVhcigpOworICAgIH0KKworICAgIHN0YXR1c190IEdldFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmc3RhdHVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmluZGVyIHN0YXR1cyBmYWlsZWQsIGJ1dCB0aGVyZSBpcyBubyBzZXJ2aWUgb3IgdHJhbnNhY3Rpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga051bVNsb3RzID0gMTY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlLT5vbk9teEV4ZWN1dGluZygpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEdldFN0YXR1cyhtU291cmNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZykgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIC8vIGhhbmRsZSBlYWNoIGNvbmZpZ3VyYXRpb24gZ3JhbnVhbGx5LCBpbiBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gZWxzZXdoZXJlCisKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgZnJhbWUgZGVsYXkgcmVwZWF0aW5nCisgICAgICAgIGlmIChjb25maWcubU1pbkZwcyA+IDAgJiYgY29uZmlnLm1NaW5GcHMgIT0gbUNvbmZpZy5tTWluRnBzKSB7CisgICAgICAgICAgICBpbnQ2NF90IHVzID0gMWU2IC8gY29uZmlnLm1NaW5GcHMgKyAwLjU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXModXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1pbkZwcz0iIDw8IGNvbmZpZy5tTWluRnBzIDw8ICIgPT4gcmVwZWF0RGVsYXlVcz0iIDw8IHVzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1pbkZwcyA9IGNvbmZpZy5tTWluRnBzOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHRzIGdhcAorICAgICAgICBpZiAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDAgfHwgY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCkgeworICAgICAgICAgICAgaWYgKG1Ob2RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSBwdHJHYXBQYXJhbSA9IHt9OworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5TaXplID0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uVTMyID0gKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBjMl9taW4oSU5UMzJfTUFYICsgMC4sIDFlNiAvIGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGMyX21heCgwLiAtIElOVDMyX01BWCwgLTFlNiAvIGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyAtIDAuNSk7CisgICAgICAgICAgICAgICAgKHZvaWQpbU5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckdhcFBhcmFtLCBzaXplb2YocHRyR2FwUGFyYW0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heCBmcHMKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgbWF4IGZwcyB0byAwIHVubGVzcyB1c2luZyBmaXhlZCBmcHMKKyAgICAgICAgaWYgKChjb25maWcubU1heEZwcyA+IDAgfHwgKGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDAgJiYgY29uZmlnLm1NYXhGcHMgPT0gMCkpCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm1NYXhGcHMgIT0gbUNvbmZpZy5tTWF4RnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0TWF4RnBzKGNvbmZpZy5tTWF4RnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtYXhGcHM9IiA8PCBjb25maWcubU1heEZwczsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NYXhGcHMgPSBjb25maWcubU1heEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVRpbWVPZmZzZXRVcyAhPSBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lT2Zmc2V0VXMoY29uZmlnLm1UaW1lT2Zmc2V0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVPZmZzZXQgIiA8PCBjb25maWcubVRpbWVPZmZzZXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVRpbWVPZmZzZXRVcyA9IGNvbmZpZy5tVGltZU9mZnNldFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tQ2FwdHVyZUZwcyAhPSBtQ29uZmlnLm1DYXB0dXJlRnBzIHx8IGNvbmZpZy5tQ29kZWRGcHMgIT0gbUNvbmZpZy5tQ29kZWRGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVMYXBzZUNvbmZpZyhjb25maWcubUNvZGVkRnBzLCBjb25maWcubUNhcHR1cmVGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVMYXBzZSAiIDw8IGNvbmZpZy5tQ2FwdHVyZUZwcyA8PCAiZnBzIGFzICIgPDwgY29uZmlnLm1Db2RlZEZwcyA8PCAiZnBzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1DYXB0dXJlRnBzID0gY29uZmlnLm1DYXB0dXJlRnBzOworICAgICAgICAgICAgbUNvbmZpZy5tQ29kZWRGcHMgPSBjb25maWcubUNvZGVkRnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RhcnRBdFVzICE9IG1Db25maWcubVN0YXJ0QXRVcworICAgICAgICAgICAgICAgIHx8IChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiAhY29uZmlnLm1TdG9wcGVkKSkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0YXJ0VGltZVVzKGNvbmZpZy5tU3RhcnRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdGFydCBhdCAiIDw8IGNvbmZpZy5tU3RhcnRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RhcnRBdFVzID0gY29uZmlnLm1TdGFydEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3VzcGVuZC1yZXN1bWUKKyAgICAgICAgaWYgKGNvbmZpZy5tU3VzcGVuZGVkICE9IG1Db25maWcubVN1c3BlbmRlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN1c3BlbmQoY29uZmlnLm1TdXNwZW5kZWQsIGNvbmZpZy5tU3VzcGVuZEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiICIgPDwgKGNvbmZpZy5tU3VzcGVuZGVkID8gInN1c3BlbmQiIDogInJlc3VtZSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgYXQgIiA8PCBjb25maWcubVN1c3BlbmRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZGVkID0gY29uZmlnLm1TdXNwZW5kZWQ7CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kQXRVcyA9IGNvbmZpZy5tU3VzcGVuZEF0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgY29uZmlnLm1TdG9wcGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RvcFRpbWVVcyhjb25maWcubVN0b3BBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdG9wIGF0ICIgPDwgY29uZmlnLm1TdG9wQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgZGVsYXlVcyI7CisgICAgICAgICAgICAgICAgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoJmNvbmZpZy5tSW5wdXREZWxheVVzKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIj0iIDw8IGNvbmZpZy5tSW5wdXREZWxheVVzIDw8ICJ1cyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25maWcubUlucHV0RGVsYXlVcyA9IGNvbmZpZy5tSW5wdXREZWxheVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RvcEF0VXMgPSBjb25maWcubVN0b3BBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbG9yIGFzcGVjdHMgKGFuZHJvaWQuX2NvbG9yLWFzcGVjdHMpCisKKyAgICAgICAgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnJXMiLCBzdGF0dXMuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEMyT01YTm9kZT4gbU5vZGU7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgQ29uZmlnIG1Db25maWc7Cit9OworCitjbGFzcyBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisKK3B1YmxpYzoKKyAgICBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5Db2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIHsKKyAgICAgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7CisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+KCk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENDb2RlYzo6Q2xpZW50TGlzdGVuZXIKKworc3RydWN0IENDb2RlYzo6Q2xpZW50TGlzdGVuZXIgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICBleHBsaWNpdCBDbGllbnRMaXN0ZW5lcihjb25zdCB3cDxDQ29kZWM+ICZjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpZXJyb3JDb2RlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICB7IC8vIExvZyB0aGUgZGVhdGggb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBkaWVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBcIiVzXCIgZGllZC4iLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdG8gTWVkaWFDb2RlYy4KKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYyB8fCAhY29kZWMtPm1DYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoREVBRF9PQkpFQ1QsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8Q0NvZGVjPiBtQ29kZWM7Cit9OworCisvLyBDQ29kZWNDYWxsYmFja0ltcGwKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsIDogcHVibGljIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNDYWxsYmFja0ltcGwoQ0NvZGVjICpjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisgICAgfkNDb2RlY0NhbGxiYWNrSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgIHtSZW5kZXJlZEZyYW1lSW5mbyhtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zKX0pOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjICptQ29kZWM7Cit9OworCisvLyBDQ29kZWMKKworQ0NvZGVjOjpDQ29kZWMoKQorICAgIDogbUNoYW5uZWwobmV3IENDb2RlY0J1ZmZlckNoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxDQ29kZWNDYWxsYmFja0ltcGw+KHRoaXMpKSkgeworfQorCitDQ29kZWM6On5DQ29kZWMoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gQ0NvZGVjOjpnZXRCdWZmZXJDaGFubmVsKCkgeworICAgIHJldHVybiBtQ2hhbm5lbDsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKSB7CisgICAgc3RhdHVzX3QgZXJyID0gam9iKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgYXV0byBzZXRBbGxvY2F0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IGNvZGVjSW5mbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZjb2RlY0luZm8pKTsKKyAgICAvLyBGb3IgQ29kZWMgMi4wIGNvbXBvbmVudHMsIGNvbXBvbmVudE5hbWUgPT0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKS4KKworICAgIHNwPEFNZXNzYWdlPiBhbGxvY01zZyhuZXcgQU1lc3NhZ2Uoa1doYXRBbGxvY2F0ZSwgdGhpcykpOworICAgIGFsbG9jTXNnLT5zZXRPYmplY3QoImNvZGVjSW5mbyIsIGNvZGVjSW5mbyk7CisgICAgYWxsb2NNc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKSB7CisgICAgaWYgKGNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoImFsbG9jYXRlKCVzKSIsIGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgIG1DbGllbnRMaXN0ZW5lci5yZXNldChuZXcgQ2xpZW50TGlzdGVuZXIodGhpcykpOworCisgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CisKKyAgICAvLyBzZXQgdXAgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSB0byBhY2Nlc3MgdmVuZG9yIHN0b3JlIHBhcmFtZXRlcnMKKyAgICBjbGllbnQgPSBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0IiwgZmFsc2UpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8vIEVuZm9yY2UgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICBpbnQzMl90IGkzMjsKKyAgICAgICAgZmxvYXQgZmx0OworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInNhbXBsZSByYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjaGFubmVsIGNvdW50IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1pbWUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgid2lkdGggaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaGVpZ2h0IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbWFnZS92aWRlbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYml0cmF0ZSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJIGZyYW1lIGludGVydmFsIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLnJlc2V0KG5ldyBJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWd7fSk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5GcHMgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KEtFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEZsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzKTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELCAmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgZGVzaXJlZCBjb2xvciBmb3JtYXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IC0xOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQWxzbyBoYW5kbGUgZGVmYXVsdCBjb2xvciBmb3JtYXQgKGVuY29kZXJzIHJlcXVpcmUgY29sb3IgZm9ybWF0LCBzbyB0aGlzIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAgKiBuZWVkZWQgZm9yIGRlY29kZXJzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gKHN1cmZhY2UgPT0gbnVsbHB0cikgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICAgICAvLyBOT1RFOiBXZSB1c2VkIHRvIGlnbm9yZSAidmlkZW8tYml0cmF0ZSIgYXQgY29uZmlndXJlOyByZXBsaWNhdGUKKyAgICAgICAgLy8gICAgICAgdGhlIGJlaGF2aW9yIGhlcmUuCisgICAgICAgIHNwPEFNZXNzYWdlPiBzZGtQYXJhbXMgPSBtc2c7CisgICAgICAgIGludDMyX3QgdmlkZW9CaXRyYXRlOworICAgICAgICBpZiAoc2RrUGFyYW1zLT5maW5kSW50MzIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCAmdmlkZW9CaXRyYXRlKSkgeworICAgICAgICAgICAgc2RrUGFyYW1zID0gbXNnLT5kdXAoKTsKKyAgICAgICAgICAgIHNka1BhcmFtcy0+cmVtb3ZlRW50cnlBdChzZGtQYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICAgICAgY29tcCwgc2RrUGFyYW1zLCBDb25maWc6OklTX0NPTkZJRywgQzJfRE9OVF9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29udmVydCBjb25maWd1cmF0aW9uIHRvIGMyIHBhcmFtcyIpOworICAgICAgICB9CisgICAgICAgIGVyciA9IGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX0RPTlRfQkxPQ0spOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbmZpZ3VyZSBjMiBwYXJhbXMiKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQgdXNhZ2UoMHUsIDB1KTsKKyAgICAgICAgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQgbWF4SW5wdXRTaXplKDB1LCAwdSk7CisKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzIHsKKyAgICAgICAgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSB9LAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIGMyZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBjb21wb25lbnQgaW50ZXJmYWNlOiAlZCIsIGMyZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IGluZGljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcG9uZW50IHJldHVybnMgd3JvbmcgbnVtYmVyIG9mIHBhcmFtczogZXhwZWN0ZWQgJXp1IGFjdHVhbCAlenUiLAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnNpemUoKSwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UgJiYgKHVzYWdlLnZhbHVlICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IGJsaW5kbHkgdXNlIGNsaWVudCBzcGVjaWZpZWQgaW5wdXQgc2l6ZSBpZiBzcGVjaWZpZWQgYXMgY2xpZW50cworICAgICAgICAvLyBhdCB0aW1lcyBzcGVjaWZ5IHRvbyBzbWFsbCBzaXplLiBJbnN0ZWFkLCBtaW1pYyB0aGUgYmVoYXZpb3IgZnJvbSBPTVgsIHdoZXJlIHRoZQorICAgICAgICAvLyBjbGllbnQgc3BlY2lmaWVkIHNpemUgaXMgb25seSB1c2VkIHRvIGFzayBmb3IgYmlnZ2VyIGJ1ZmZlcnMgdGhhbiBjb21wb25lbnQgc3VnZ2VzdGVkCisgICAgICAgIC8vIHNpemUuCisgICAgICAgIGludDMyX3QgY2xpZW50SW5wdXRTaXplID0gMDsKKyAgICAgICAgYm9vbCBjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUgPQorICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2xpZW50SW5wdXRTaXplKSAmJiBjbGllbnRJbnB1dFNpemUgPiAwOworICAgICAgICAvLyBURU1QOiBlbmZvcmNlIG1pbmltdW0gYnVmZmVyIHNpemUgb2YgMU1CIGZvciB2aWRlbyBkZWNvZGVycworICAgICAgICAvLyBhbmQgMTZLIC8gNEsgZm9yIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzCisgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBlbmNvZGVyID8gMTYzODQgOiA0MDk2OworICAgICAgICAgICAgfSBlbHNlIGlmICghZW5jb2RlcikgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IDEwNDg1NzZ1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgQ1NEIGZpdHMgaW50byB0aGlzIHNpemUgKGlmIGRlZmluZWQpCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiBtYXhJbnB1dFNpemUudmFsdWUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IG1zZy0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lenUiLCBpeCkuY19zdHIoKSwgJmNzZCk7ICsraXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NkICYmIGNzZC0+c2l6ZSgpID4gbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGRvIHRoaXMgYmFzZWQgb24gY29tcG9uZW50IHJlcXVpcmluZyBsaW5lYXIgYWxsb2NhdG9yIGZvciBpbnB1dAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgfHwgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybiB0aGF0IHdlJ3JlIG92ZXJyaWRpbmcgY2xpZW50J3MgbWF4IGlucHV0IHNpemUgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIGlmICgodWludDMyX3QpY2xpZW50SW5wdXRTaXplIDwgbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkIG1heCBpbnB1dCBzaXplICVkLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdCBjb21wb25lbnQgcmVjb21tZW5kZWQgKCV1KTsgb3ZlcnJpZGluZyB3aXRoIGNvbXBvbmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvbW1lbmRhdGlvbi4iLCBjbGllbnRJbnB1dFNpemUsIG1heElucHV0U2l6ZS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJUaGlzIGJlaGF2aW9yIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcCBkZXZlbG9wZXJzIGRvdWJsZSBjaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGlucHV0IHNpemUgaXMgaW4gcmVhc29uYWJsZSByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjbGllbnRJbnB1dFNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUGFzcyBtYXggaW5wdXQgc2l6ZSBvbiBpbnB1dCBmb3JtYXQgdG8gdGhlIGJ1ZmZlciBjaGFubmVsIChpZiBzdXBwbGllZCBieSB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBvciBieSBhIGRlZmF1bHQpCisgICAgICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9JTlBVVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyX21pbihtYXhJbnB1dFNpemUudmFsdWUsIHVpbnQzMl90KElOVDMyX01BWCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICAvLyBwcm9wYWdhdGUgSERSIHN0YXRpYyBpbmZvIHRvIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggZW5jb2RlcnMgYW5kIGRlY29kZXJzCisgICAgICAgICAgICAvLyBpZiBjb21wb25lbnQgc3VwcG9ydHMgdGhpcyBpbmZvLCB3ZSB3aWxsIHVwZGF0ZSBmcm9tIGNvbXBvbmVudCwgYnV0IG9ubHkgdGhlIHJhdyBwb3J0LAorICAgICAgICAgICAgLy8gc28gZG9uJ3QgcHJvcGFnYXRlIGlmIGNvbXBvbmVudCBhbHJlYWR5IGZpbGxlZCBpdCBpbi4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkckluZm87CisgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKQorICAgICAgICAgICAgICAgICAgICAmJiAhY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGhkckluZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgZGVzaXJlZCBjb2xvciBmb3JtYXQgZnJvbSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgorICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvcGFnYXRlIGVuY29kZXIgZGVsYXkgYW5kIHBhZGRpbmcgdG8gb3V0cHV0IGZvcm1hdAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpbnQgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItZGVsYXkiLCBkZWxheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItcGFkZGluZyIsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGNoYW5uZWwtbWFzaworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaW50MzJfdCBtYXNrOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX01BU0ssICZtYXNrKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIGFuZCBvdXRwdXQ6ICVzIiwKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoZG9Db25maWcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50Q29uZmlndXJlZChjb25maWctPm1JbnB1dEZvcm1hdCwgY29uZmlnLT5tT3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHJlYWQgaXQgZnJvbSBpbnRmKCkgcHJvcGVybHkuCisgICAgICAgIGlmIChzdGF0ZS0+Y29tcC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsIHRoaXMpKS0+cG9zdCgpOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OlN0YXR1cyBPbXhTdGF0dXM7CisgICAgYW5kcm9pZDo6c3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKyAgICBPbXhTdGF0dXMgczsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnA7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdiczsKKyAgICBhbmRyb2lkOjpSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBvbXgtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmcywgJmdicCwgJmdic10oCisgICAgICAgICAgICAgICAgICAgIE9teFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBzID0gc3RhdHVzOworICAgICAgICAgICAgICAgIGdicCA9IHByb2R1Y2VyOworICAgICAgICAgICAgICAgIGdicyA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkgJiYgcyA9PSBPbXhTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICAgICAgbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihnYnApLAorICAgICAgICAgICAgICAgIHNwPDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U+KG5ldyBMV0dyYXBoaWNCdWZmZXJTb3VyY2UoZ2JzKSkpOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCkgeworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKENyZWF0ZUlucHV0U3VyZmFjZSgpKTsKKworICAgIGlmIChzdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3VyZmFjZSA9IENyZWF0ZU9teElucHV0U3VyZmFjZSgpOworICAgIH0KKworICAgIHJldHVybiBzdXJmYWNlOworfQorCit2b2lkIENDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorCisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHBlcnNpc3RlbnRTdXJmYWNlID0gQ3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpOworCisgICAgaWYgKHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaGlkbElucHV0U3VyZmFjZSA9IElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpOworICAgICAgICBpZiAoIWhpZGxJbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3JydXB0ZWQgaW5wdXQgc3VyZmFjZSIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihoaWRsSW5wdXRTdXJmYWNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZSkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRlZCgKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcihidWZmZXJQcm9kdWNlcikpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSkgeworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSB0cnVlOworCisgICAgLy8gd2UgYXJlIG5vdyB1c2luZyBzdXJmYWNlIC0gYXBwbHkgZGVmYXVsdCBjb2xvciBhc3BlY3RzIHRvIGlucHV0IGZvcm1hdCAtIGFzIHdlbGwgYXMKKyAgICAvLyBnZXQgZGF0YXNwYWNlCisgICAgYm9vbCBpbnB1dEZvcm1hdENoYW5nZWQgPSBjb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgQUxPR0QoImlucHV0IGZvcm1hdCAlcyB0byAlcyIsCisgICAgICAgICAgICBpbnB1dEZvcm1hdENoYW5nZWQgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIiwKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgLy8gY29uZmlndXJlIGRhdGFzcGFjZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludDMyX3QpID09IHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSksICJkYXRhc3BhY2Ugc2l6ZSBtaXNtYXRjaCIpOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAodm9pZCljb25maWctPm1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFTcGFjZSk7CisgICAgc3VyZmFjZS0+c2V0RGF0YVNwYWNlKGRhdGFTcGFjZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgLy8gdW5kbyBpbnB1dCBmb3JtYXQgdXBkYXRlCisgICAgICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IGZhbHNlOworICAgICAgICAodm9pZCljb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisKKyAgICBpZiAoY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgc3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnOiBubyBjb25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldElucHV0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKyAgICBhdXRvIGhpZGxUYXJnZXQgPSBzdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCk7CisgICAgaWYgKGhpZGxUYXJnZXQpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBJSW5wdXRTdXJmYWNlOjpjYXN0RnJvbShoaWRsVGFyZ2V0KTsKKyAgICAgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGlucHV0IHN1cmZhY2U6IENvcnJ1cHRlZCBzdXJmYWNlLiIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8QzJJbnB1dFN1cmZhY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihpbnB1dFN1cmZhY2UpKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQWNjZXB0ZWQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0YXJ0KCkgeworICAgIGF1dG8gc2V0U3RhcnRpbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUQVJUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0U3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c3RhcnQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tTdGFydGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tTdGFydGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IodG9TdGF0dXNUKGVyciwgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgc3RhdHVzX3QgZXJyMiA9IE9LOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGVycjIgPSBjb25maWctPm1JbnB1dFN1cmZhY2UtPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlcnIyID0gbUNoYW5uZWwtPnN0YXJ0KGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIHNldFJ1bm5pbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJ1bm5pbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0YXJ0Q29tcGxldGVkKCk7CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgaWYgKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgaW5pdGlhdGVTdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhdGVSZWxlYXNlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdG9wKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSAgPT0gUkVMRUFTRUQKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQsIHJlbGVhc2VkLCBvciBkb2luZyBpdCByaWdodCBub3cuCisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVE9QUElORyk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdG9wKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBzdG9wcGVkIG9yIHJlbGVhc2UgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVE9QUElORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gY29tcC0+c3RvcCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVEVEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrIC8qID0gdHJ1ZSAqLykgeworICAgIGJvb2wgY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgcmVsZWFzZWQgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgICAgICAgICAgLy8gV2l0aCB0aGUgYWx0ZXJlZCBzdGF0ZSBhbGxvY2F0ZSgpIHdvdWxkIGZhaWwgYW5kIGNsZWFuIHVwLgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RBUlRJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gUlVOTklORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgLy8gSW5wdXQgc3VyZmFjZSBtYXkgaGF2ZSBiZWVuIHN0YXJ0ZWQsIHNvIGNsZWFuIHVwIGlzIG5lZWRlZC4KKyAgICAgICAgICAgIGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICB9CisKKyAgICBpZiAoY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCkgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgLy8gdGhpeiBob2xkcyBzdHJvbmcgcmVmIHRvIHRoaXMgd2hpbGUgdGhlIHRocmVhZCBpcyBydW5uaW5nLgorICAgIHNwPENDb2RlYz4gdGhpeih0aGlzKTsKKyAgICBzdGQ6OnRocmVhZChbdGhpeiwgc2VuZENhbGxiYWNrXSB7IHRoaXotPnJlbGVhc2Uoc2VuZENhbGxiYWNrKTsgfSkuZGV0YWNoKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpyZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBjb21wLT5yZWxlYXNlKCk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgIHN0YXRlLT5jb21wLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlYzo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHJldHVybiBtQ2hhbm5lbC0+c2V0U3VyZmFjZShzdXJmYWNlKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbEZsdXNoKCkgeworICAgIHN0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEZMVVNISU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0oKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIEFMUkVBRFlfRVhJU1RTOgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkZsdXNoQ29tcGxldGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpmbHVzaCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja0ZsdXNoaW5nID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBGTFVTSElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0ZsdXNoaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgZmx1c2hlZFdvcmsuc3BsaWNlKGZsdXNoZWRXb3JrLmVuZCgpLCAqcXVldWUpOworICAgIH0KKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGNvbnZlcnQgZXJyIGludG8gc3RhdHVzX3QKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+Zmx1c2goZmx1c2hlZFdvcmspOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoRkxVU0hFRCk7CisgICAgfQorICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsUmVzdW1lKCkgeworICAgIGF1dG8gc2V0UmVzdW1pbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSRVNVTUlORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJlc3VtaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKHZvaWQpbUNoYW5uZWwtPnN0YXJ0KG51bGxwdHIsIG51bGxwdHIpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUkVTVU1JTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhdGUgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXRlKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTk9URTogV2UgdXNlZCB0byBpZ25vcmUgImJpdHJhdGUiIGF0IHNldFBhcmFtZXRlcnM7IHJlcGxpY2F0ZQorICAgIC8vICAgICAgIHRoZSBiZWhhdmlvciBoZXJlLgorICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBtc2c7CisgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZiaXRyYXRlKSkgeworICAgICAgICBwYXJhbXMgPSBtc2ctPmR1cCgpOworICAgICAgICBwYXJhbXMtPnJlbW92ZUVudHJ5QXQocGFyYW1zLT5maW5kRW50cnlCeU5hbWUoS0VZX0JJVF9SQVRFKSk7CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgLyoqCisgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpICYmIGNvbmZpZy0+bUlucHV0U3VyZmFjZSAmJiBjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmY29uZmlnLT5tSVNDb25maWctPm1UaW1lT2Zmc2V0VXMpOworCisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RhcnRBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLT5maW5kSW50NjQoInN0b3AtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0b3BBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdmFsdWU7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzID0gLTE7CisgICAgICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMpOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5fc3RvcC10aW1lLW9mZnNldC11cyIsIGNvbmZpZy0+bUlTQ29uZmlnLT5tSW5wdXREZWxheVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICh2b2lkKWNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIGNvbXAsIHBhcmFtcywgQ29uZmlnOjpJU19QQVJBTSwgQzJfTUFZX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAvLyBQcmVmZXIgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBidWZmZXIgY2hhbm5lbCwgc28gdGhleSBjYW4gYmUgc3luY2hyb25pemVkIHdpdGggdGhlIGZyYW1lcy4KKyAgICAvLyBQYXJhbWV0ZXIgc3luY2hyb25pemF0aW9uIGlzIG5vdCBkZWZpbmVkIHdoZW4gdXNpbmcgaW5wdXQgc3VyZmFjZS4gRm9yIG5vdywgcm91dGUKKyAgICAvLyB0aGVzZSBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50LgorICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cgorICAgICAgICAgICAgJiYgKHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfZGVsYXllZF9wYXJhbXMiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tcC0+Z2V0TmFtZSgpLmZpbmQoImMyLmFuZHJvaWQuIikgPT0gMCkpIHsKKyAgICAgICAgbUNoYW5uZWwtPnNldFBhcmFtZXRlcnMoY29uZmlnVXBkYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAodm9pZCljb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9NQVlfQkxPQ0spOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgbUNhbGxiYWNrLT5vblNpZ25hbGVkSW5wdXRFT1MobUNoYW5uZWwtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gSURSIHJlcXVlc3Qgc2VudCBzaW5jZSBjb21wb25lbnQgaXMgcmVsZWFzZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIEFMT0dWKCJyZXF1ZXN0IElEUiIpOworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMucHVzaF9iYWNrKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4oMHUsIHRydWUpKTsKKyAgICBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgcGFyYW1zLCBDMl9NQVlfQkxPQ0spOworfQorCit2b2lkIENDb2RlYzo6b25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICBpZiAoIXdvcmtJdGVtcy5lbXB0eSgpKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5zcGxpY2UocXVldWUtPmVuZCgpLCB3b3JrSXRlbXMpOworICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0V29ya0RvbmUsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6b25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIHsKKyAgICBtQ2hhbm5lbC0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIFRpbWVQb2ludCBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWxsb2NhdGU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTBtcywgImFsbG9jYXRlIik7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKKyAgICAgICAgICAgIGFsbG9jYXRlKChNZWRpYUNvZGVjSW5mbyAqKW9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Y29tbWl0X3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAyNTBtcywgImNvbmZpZ3VyZSIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RhcnQoKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgNTUwbXMsICJzdGFydCIpOworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RvcCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0b3AiKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmZsdXNoX3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1MG1zLCAiZmx1c2giKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDEwMG1zLCAiY3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJzZXRJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgc2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdvcmtEb25lOiB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChxdWV1ZS0+ZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHNob3VsZFBvc3QgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgaW4gd29yayBkb25lCisgICAgICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIENvbmZpZzo6V2F0Y2hlcjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBpbml0RGF0YSA9CisgICAgICAgICAgICAgICAgY29uZmlnLT53YXRjaDxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PigpOworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICYmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEMyRnJhbWVEYXRhOjpGTEFHX0RJU0NBUkRfRlJBTUUpID09IDApIHsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgYnVmZmVyIGluZm8gdG8gY29uZmlnCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmLT5pbmZvKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWxsIGluZm8gaW50byBvdXRwdXQtc3RyZWFtICMwIGRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weUFzU3RyZWFtKCppbmZvLCB0cnVlIC8qIG91dHB1dCAqLywgc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA6IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1YoImdvdCBvdXRwdXQgYnVmZmVyIHdpdGggY3JvcCAldSwldSsldSwldSBhbmQgc2l6ZSAldSwldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS5sZWZ0LCBibG9jay5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0KHN0cmVhbSwgYmxvY2suY3JvcCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gY29uZmlnLT51cGRhdGVDb25maWd1cmF0aW9uKHVwZGF0ZXMsIGNvbmZpZy0+bU91dHB1dERvbWFpbik7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IHN0YW5kYXJkIGluZm9zIHRvIGdyYXBoaWMgYnVmZmVycyBpZiBub3QgYWxyZWFkeSBwcmVzZW50IChvdGhlcndpc2UsIHdlCisgICAgICAgICAgICAgICAgLy8gbWF5IG92ZXJ3cml0ZSB0aGUgYWN0dWFsIGludGVybWVkaWF0ZSB2YWx1ZSB3aXRoIGEgZmluYWwgdmFsdWUpCisgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN0ZEdmeEluZm9zID0geworICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi0+aGFzSW5mbyhpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBpbmZvKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGFubmVsLT5vbldvcmtEb25lKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yayksIGNoYW5nZWQgPyBjb25maWctPm1PdXRwdXRGb3JtYXQgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBpbml0RGF0YS5oYXNDaGFuZ2VkKCkgPyBpbml0RGF0YS51cGRhdGUoKS5nZXQoKSA6IG51bGxwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAvLyB3YXRjaCBtZXNzYWdlIGFscmVhZHkgcG9zdGVkOyBuby1vcC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0RGVhZGxpbmUoVGltZVBvaW50OjptYXgoKSwgMG1zLCAibm9uZSIpOworfQorCit2b2lkIENDb2RlYzo6c2V0RGVhZGxpbmUoCisgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaW50MzJfdCBtdWx0ID0gc3RkOjptYXgoMSwgcHJvcGVydHlfZ2V0X2ludDMyKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfdGltZW91dF9tdWx0IiwgMSkpOworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICBkZWFkbGluZS0+c2V0KG5vdyArICh0aW1lb3V0ICogbXVsdCksIG5hbWUpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgcGVuZGluZ0RlYWRsaW5lID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgbmFtZSA9IGRlYWRsaW5lLT5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSAhPSBUaW1lUG9pbnQ6Om1heCgpKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3RleHByIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGtXb3JrRHVyYXRpb25UaHJlc2hvbGQgPSAzczsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG1DaGFubmVsLT5lbGFwc2VkKCk7CisgICAgICAgIGlmIChlbGFwc2VkID49IGtXb3JrRHVyYXRpb25UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIG5hbWUgPSAicXVldWUiOworICAgICAgICB9CisgICAgICAgIGlmIChlbGFwc2VkID4gMHMpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICAvLyBXZSdyZSBub3Qgc3R1Y2suCisgICAgICAgIGlmIChwZW5kaW5nRGVhZGxpbmUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3Qgc3R1Y2sgeWV0IGJ1dCBzdGlsbCBoYXMgZGVhZGxpbmUgY29taW5nIHVwLAorICAgICAgICAgICAgLy8gcG9zdCB3YXRjaCBtZXNzYWdlIHRvIGNoZWNrIGJhY2sgbGF0ZXIuCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygicHJldmlvdXMgY2FsbCB0byAlcyBleGNlZWRlZCB0aW1lb3V0IiwgbmFtZS5jX3N0cigpKTsKKyAgICBpbml0aWF0ZVJlbGVhc2UoZmFsc2UpOworICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6Q29kZWNCYXNlICpDcmVhdGVDb2RlYygpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkNDb2RlYzsKK30KKworLy8gQ3JlYXRlIENvZGVjIDIuMCBpbnB1dCBzdXJmYWNlCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBDb2RlYzIncyBpbnB1dCBzdXJmYWNlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZDo6c3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+PigKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlKCkpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjNjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfSF8KKyNkZWZpbmUgQ19DT0RFQ19IXworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDsKK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXI7CitzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisKK2NsYXNzIENDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIENDb2RlYygpOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IGdldEJ1ZmZlckNoYW5uZWwoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNDb2RlYygpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgVGltZVBvaW50OworCisgICAgc3RhdHVzX3QgdHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYik7CisKKyAgICB2b2lkIGluaXRpYXRlU3RvcCgpOworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrID0gdHJ1ZSk7CisKKyAgICB2b2lkIGFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzdGFydCgpOworICAgIHZvaWQgc3RvcCgpOworICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIGZvciB0aGUgY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbiBjb21wYXRpYmxlIHdpdGggQ0NvZGVjLgorICAgICAqIFRoaXMgY291bGQgYmUgYmFja2VkIGJ5IHRoZSBDMiBIQUwgb3IgdGhlIE9NWCBIQUwuCisgICAgICovCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLy8gQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIHRvIHRoZSBPTVggSEFMCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKTsKKworICAgIC8vLyBoYW5kbGUgYSBjcmVhdGUgaW5wdXQgc3VyZmFjZSBjYWxsCisgICAgdm9pZCBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2b2lkIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHN0YXR1c190IHNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisKKyAgICB2b2lkIHNldERlYWRsaW5lKAorICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBbGxvY2F0ZSwKKyAgICAgICAga1doYXRDb25maWd1cmUsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0Rmx1c2gsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycywKKworICAgICAgICBrV2hhdFdvcmtEb25lLAorICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgUkVMRUFTRUQsCisgICAgICAgIEFMTE9DQVRFRCwKKyAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgUlVOTklORywKKworICAgICAgICBBTExPQ0FUSU5HLCAgLy8gUkVMRUFTRUQgLT4gQUxMT0NBVEVECisgICAgICAgIFNUQVJUSU5HLCAgICAvLyBBTExPQ0FURUQgLT4gUlVOTklORworICAgICAgICBTVE9QUElORywgICAgLy8gUlVOTklORyAtPiBBTExPQ0FURUQKKyAgICAgICAgRkxVU0hJTkcsICAgIC8vIFJVTk5JTkcgLT4gRkxVU0hFRAorICAgICAgICBSRVNVTUlORywgICAgLy8gRkxVU0hFRCAtPiBSVU5OSU5HCisgICAgICAgIFJFTEVBU0lORywgICAvLyB7QU5ZIEVYQ0VQVCBSRUxFQVNFRH0gLT4gUkVMRUFTRUQKKyAgICB9OworCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgaW5saW5lIFN0YXRlKCkgOiBtU3RhdGUoUkVMRUFTRUQpIHt9CisgICAgICAgIGlubGluZSBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVN0YXRlOyB9CisgICAgICAgIGlubGluZSB2b2lkIHNldChpbnQgbmV3U3RhdGUpIHsgbVN0YXRlID0gbmV3U3RhdGU7IH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5hbWVkVGltZVBvaW50IHsKKyAgICAgICAgTmFtZWRUaW1lUG9pbnQoKSA6IG1UaW1lUG9pbnQoVGltZVBvaW50OjptYXgoKSksIG1OYW1lKCIiKSB7fQorCisgICAgICAgIGlubGluZSB2b2lkIHNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJnRpbWVQb2ludCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgICAgICBtVGltZVBvaW50ID0gdGltZVBvaW50OworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIFRpbWVQb2ludCBnZXQoKSBjb25zdCB7IHJldHVybiBtVGltZVBvaW50OyB9CisgICAgICAgIGlubGluZSBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lUG9pbnQgbVRpbWVQb2ludDsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgfTsKKworICAgIE11dGV4ZWQ8U3RhdGU+IG1TdGF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4gbUNoYW5uZWw7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtQ2xpZW50TGlzdGVuZXI7CisgICAgc3RydWN0IENsaWVudExpc3RlbmVyOworCisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbURlYWRsaW5lOworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnIENvbmZpZzsKKyAgICBNdXRleGVkPENvbmZpZz4gbUNvbmZpZzsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+IG1Xb3JrRG9uZVF1ZXVlOworCisgICAgZnJpZW5kIGNsYXNzIENDb2RlY0NhbGxiYWNrSW1wbDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZhZjkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMjkyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNCdWZmZXJDaGFubmVsIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CisKK3VzaW5nIENhc1N0YXR1cyA9IGhhcmR3YXJlOjpjYXM6OlYxXzA6OlN0YXR1czsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRhdGlvbiBvZiBidWZmZXJzIGF0IG9uZSBwb3J0LgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiQnVmZmVycyIpCisgICAgICAgIDogbUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSksCisgICAgICAgICAgbUNoYW5uZWxOYW1lKHN0ZDo6c3RyaW5nKGNvbXBvbmVudE5hbWUpICsgIjoiICsgbmFtZSksCisgICAgICAgICAgbU5hbWUobUNoYW5uZWxOYW1lLmNfc3RyKCkpIHsKKyAgICB9CisgICAgdmlydHVhbCB+QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldCBmb3JtYXQgZm9yIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCBzZXRGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICAgICAgQ0hFQ0soZm9ybWF0ICE9IG51bGxwdHIpOworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgY3VycmVudCBmb3JtYXQuCisgICAgICovCisgICAgc3A8QU1lc3NhZ2U+IGR1cEZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQgIT0gbnVsbHB0ciA/IG1Gb3JtYXQtPmR1cCgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlcnMgYXJlIG9wZXJhdGluZyB1bmRlciBhcnJheSBtb2RlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvKioKKyAgICAgKiBGaWxscyB0aGUgdmVjdG9yIHdpdGggTWVkaWFDb2RlY0J1ZmZlcidzIGlmIGluIGFycmF5IG1vZGU7IG90aGVyd2lzZSwKKyAgICAgKiBuby1vcC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqKSBjb25zdCB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiBidWZmZXJzIHRoZSBjbGllbnQgb3ducy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgPSAwOworCisgICAgdm9pZCBoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YUNhbmRpZGF0ZSA9IGJ1ZmZlci0+Z2V0SW1hZ2VEYXRhKCk7CisgICAgICAgIGlmIChpbWFnZURhdGFDYW5kaWRhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkKKyAgICAgICAgICAgICAgICB8fCBpbWFnZURhdGFDYW5kaWRhdGUtPnNpemUoKSAhPSBpbWFnZURhdGEtPnNpemUoKQorICAgICAgICAgICAgICAgIHx8IG1lbWNtcChpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKSwgaW1hZ2VEYXRhLT5kYXRhKCksIGltYWdlRGF0YS0+c2l6ZSgpKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBpbWFnZS1kYXRhIiwgbU5hbWUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IGR1cEZvcm1hdCgpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGFDYW5kaWRhdGUpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgKmltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCk7CisgICAgICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBzdHJpZGUgPSAlZCIsIG1OYW1lLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2c3RyaWRlID0gKGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgLSBpbWctPm1QbGFuZVswXS5tT2Zmc2V0KSAvIHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgdnN0cmlkZSA9ICVkIiwgbU5hbWUsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEZvcm1hdChuZXdGb3JtYXQpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRGb3JtYXQobmV3Rm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IG5hbWUgb2YgY29tcG9uZW50IGZvciBkZWJ1Z2dpbmcKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE5hbWU7IC8vLzwgbmFtZSBvZiBjaGFubmVsIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNoYW5uZWwgbmFtZQorICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W10iKQorICAgICAgICA6IEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+SW5wdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGEgYmxvY2sgcG9vbCB0byBvYnRhaW4gaW5wdXQgbWVtb3J5IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeyBtUG9vbCA9IHBvb2w7IH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBNZWRpYUNvZGVjQnVmZmVyIGZvciBpbnB1dCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgaW5kZXguCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBubyBuZXcgYnVmZmVyIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIHByb2Nlc3MuIFJldHVybgorICAgICAqIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZSBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2YgaW5wdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlcXVlc3ROZXdCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBQb29sIHRvIG9idGFpbiBibG9ja3MgZm9yIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0IikKKyAgICAgICAgOiBCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfk91dHB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXRwdXQgQzJCdWZmZXIgZnJvbSB0aGUgY29tcG9uZW50IGFuZCBvYnRhaW4gY29ycmVzcG9uZGluZworICAgICAqIGluZGV4IGFuZCBNZWRpYUNvZGVjQnVmZmVyIG9iamVjdC4gUmV0dXJucyBmYWxzZSBpZiByZWdpc3RyYXRpb24KKyAgICAgKiBmYWlscy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNvZGVjIHNwZWNpZmljIGRhdGEgYXMgYSBidWZmZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgICAgICogTWVkaWFDb2RlYyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqIC8qIGNzZCAqLywKKyAgICAgICAgICAgIHNpemVfdCAqIC8qIGluZGV4ICovLAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKiAvKiBjbGllbnRCdWZmZXIgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2Ygb3V0cHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZWdpc3RlckJ1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIFNraXBDdXRCdWZmZXIgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgaW5pdFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBpbnQzMl90IHBhZGRpbmcsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgQ0hFQ0sobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cik7CisgICAgICAgIG1EZWxheSA9IGRlbGF5OworICAgICAgICBtUGFkZGluZyA9IHBhZGRpbmc7CisgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIFNraXBDdXRCdWZmZXIgb2JqZWN0LiBOby1vcCBpZiBpdCdzIG5ldmVyIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlU2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBkZWxheSA9IG1EZWxheTsKKyAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gbVBhZGRpbmc7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBkZWxheSA9ICgoaW50NjRfdClkZWxheSAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBwYWRkaW5nID0gKChpbnQ2NF90KXBhZGRpbmcgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICB9CisgICAgICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VibWl0IGJ1ZmZlciB0byBTa2lwQ3V0QnVmZmVyIG9iamVjdCwgaWYgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPnN1Ym1pdChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgU2tpcEN1dEJ1ZmZlciBvYmplY3QgdG8gdGhlIG90aGVyIEJ1ZmZlcnMgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgdHJhbnNmZXJTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPFNraXBDdXRCdWZmZXI+ICZzY2IpIHsKKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBzY2I7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8U2tpcEN1dEJ1ZmZlcj4gbVNraXBDdXRCdWZmZXI7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtRGVsYXk7CisgICAgaW50MzJfdCBtUGFkZGluZzsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworCisgICAgdm9pZCBzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldlNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZTaXplICE9IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBtTmFtZSwgcHJldlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE91dHB1dEJ1ZmZlcnMpOworfTsKKworbmFtZXNwYWNlIHsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrU21vb3RobmVzc0ZhY3RvciA9IDQ7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtSZW5kZXJpbmdEZXB0aCA9IDM7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKy8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCitjb25zdCBzdGF0aWMgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gMzg0MCAqIDIxNjAgKiA0OworCisvKioKKyAqIFNpbXBsZSBsb2NhbCBidWZmZXIgcG9vbCBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgKi8KK2NsYXNzIExvY2FsQnVmZmVyUG9vbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPExvY2FsQnVmZmVyUG9vbD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xDYXBhY2l0eSAgbWF4IHRvdGFsIHNpemUgb2YgYnVmZmVycyBtYW5hZ2VkIGJ5IHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGEgbmV3bHkgY3JlYXRlZCBwb29sIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gQ3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+KG5ldyBMb2NhbEJ1ZmZlclBvb2wocG9vbENhcGFjaXR5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEFCdWZmZXIgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgfGNhcGFjaXR5fC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGNhcGFjaXR5ICByZXF1ZXN0ZWQgY2FwYWNpdHkKKyAgICAgKiBccmV0dXJuICBudWxscHRyIGlmIHRoZSBwb29sIGNhcGFjaXR5IGlzIHJlYWNoZWQKKyAgICAgKiAgICAgICAgICBhbiBBQnVmZmVyIG9iamVjdCBvdGhlcndpc2UuCisgICAgICovCisgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Qb29sLmJlZ2luKCksIG1Qb29sLmVuZCgpLAorICAgICAgICAgICAgICAgIFtjYXBhY2l0eV0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjLmNhcGFjaXR5KCkgPj0gY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCAhPSBtUG9vbC5lbmQoKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUoKml0KSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgIG1Qb29sLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICAgICAgd2hpbGUgKCFtUG9vbC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVVzZWRTaXplIC09IG1Qb29sLmJhY2soKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgIG1Qb29sLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm1Vc2VkU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUsIG1Qb29sQ2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVVzZWRTaXplLCBjYXBhY2l0eSwgbVBvb2xDYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKGNhcGFjaXR5KTsKKyAgICAgICAgbVVzZWRTaXplICs9IHZlYy5jYXBhY2l0eSgpOworICAgICAgICByZXR1cm4gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUodmVjKSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQUJ1ZmZlciBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgICAgICovCisgICAgY2xhc3MgVmVjdG9yQnVmZmVyIDogcHVibGljIDo6YW5kcm9pZDo6QUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgVmVjdG9yQnVmZmVyIGJ5IHRha2luZyB0aGUgb3duZXJzaGlwIG9mIHN1cHBsaWVkIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZlYyAgIGJhY2tpbmcgdmVjdG9yIG9mIHRoZSBidWZmZXIuIHRoaXMgb2JqZWN0IHRha2VzCisgICAgICAgICAqICAgICAgICAgICAgICBvd25lcnNoaXAgYXQgY29uc3RydWN0aW9uLgorICAgICAgICAgKiBccGFyYW0gcG9vbCAgYSBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0IHRvIHJldHVybiB0aGUgdmVjdG9yIGF0CisgICAgICAgICAqICAgICAgICAgICAgICBkZXN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFZlY3RvckJ1ZmZlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpCisgICAgICAgICAgICA6IEFCdWZmZXIodmVjLmRhdGEoKSwgdmVjLmNhcGFjaXR5KCkpLAorICAgICAgICAgICAgICBtVmVjKHN0ZDo6bW92ZSh2ZWMpKSwKKyAgICAgICAgICAgICAgbVBvb2wocG9vbCkgeworICAgICAgICB9CisKKyAgICAgICAgflZlY3RvckJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IHBvb2wgPSBtUG9vbC5sb2NrKCk7CisgICAgICAgICAgICBpZiAocG9vbCkgeworICAgICAgICAgICAgICAgIC8vIElmIHBvb2wgaXMgYWxpdmUsIHJldHVybiB0aGUgdmVjdG9yIGJhY2sgdG8gdGhlIHBvb2wgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgICAgICBwb29sLT5yZXR1cm5WZWN0b3Ioc3RkOjptb3ZlKG1WZWMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVZlYzsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Qb29sOworICAgIH07CisKKyAgICBNdXRleCBtTXV0ZXg7CisgICAgc2l6ZV90IG1Qb29sQ2FwYWNpdHk7CisgICAgc2l6ZV90IG1Vc2VkU2l6ZTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG1Qb29sOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNvbnN0cnVjdGluZyBub24tbWFuYWdlZCBMb2NhbEJ1ZmZlclBvb2wuCisgICAgICovCisgICAgZXhwbGljaXQgTG9jYWxCdWZmZXJQb29sKHNpemVfdCBwb29sQ2FwYWNpdHkpCisgICAgICAgIDogbVBvb2xDYXBhY2l0eShwb29sQ2FwYWNpdHkpLCBtVXNlZFNpemUoMCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYmFjayB0aGUgb3duZXJzaGlwIG9mIHZlYyBmcm9tIHRoZSBkZXN0cnVjdGVkIFZlY3RvckJ1ZmZlciBhbmQgcHV0CisgICAgICogaXQgaW4gZnJvbnQgb2YgdGhlIHBvb2wuCisgICAgICovCisgICAgdm9pZCByZXR1cm5WZWN0b3Ioc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbVBvb2wucHVzaF9mcm9udChzdGQ6Om1vdmUodmVjKSk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9jYWxCdWZmZXJQb29sKTsKK307CisKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmbG9jYWxCdWZmZXJQb29sKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIEFMT0dEKCJmb3JtYXQgbGFja3Mgd2lkdGggb3IgaGVpZ2h0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmV0Y2ggZ3JhcGhpYyBibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIFtsb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJ1ZmZlclBvb2wtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICB9KTsKK30KKworY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworLyoqCisgKiBGbGV4aWJsZSBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEZsZXhCdWZmZXJzSW1wbCB7CitwdWJsaWM6CisgICAgRmxleEJ1ZmZlcnNJbXBsKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogbUltcGxOYW1lKHN0ZDo6c3RyaW5nKG5hbWUpICsgIi5JbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIGFuIGVtcHR5IHNsb3QgZm9yIGEgYnVmZmVyIGFuZCByZXR1cm4gdGhlIGluZGV4LiBJZiB0aGVyZSdzIG5vCisgICAgICogZW1wdHkgc2xvdCwganVzdCBhZGQgb25lIGF0IHRoZSBlbmQgYW5kIHJldHVybiBpdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXJbaW5dICBhIG5ldyBidWZmZXIgdG8gYXNzaWduIGEgc2xvdC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgICAgaW5kZXggb2YgdGhlIGFzc2lnbmVkIHNsb3QuCisgICAgICovCisgICAgc2l6ZV90IGFzc2lnblNsb3QoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBidWZmZXIsIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCkgfSk7CisgICAgICAgIHJldHVybiBtQnVmZmVycy5zaXplKCkgLSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIHNsb3QgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIHByZXZpb3VzbHkgYXNzaWduZWQgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZQorICAgICAqIHVudGlsIHRoZSByZXR1cm5lZCBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgYXNzaWduZWQgYSBzbG90LgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZWxlYXNlZCBmcm9tIGEgc2xvdAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmVsZWFzZVNsb3QoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlciB8fCBjb21wQnVmZmVyICE9IGMyYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgQUxPR1YoIlslc10gYnVmZmVycyBhcmUgZmx1c2hlZCAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZW50cnkuY2xpZW50QnVmZmVyICE9IG51bGxwdHIpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworLyoqCisgKiBTdGF0aWMgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgZml4ZWQtc2l6ZSBhcnJheS4KKyAqLworY2xhc3MgQnVmZmVyc0FycmF5SW1wbCB7CitwdWJsaWM6CisgICAgQnVmZmVyc0FycmF5SW1wbCgpCisgICAgICAgIDogbUltcGxOYW1lKCJCdWZmZXJzQXJyYXlJbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBidWZmZXIgYXJyYXkgZnJvbSB0aGUgb3JpZ2luYWwgfGltcGx8LiBUaGUgYnVmZmVycyBrbm93biBieQorICAgICAqIHRoZSBjbGllbnQgaXMgcHJlc2VydmVkLCBhbmQgdGhlIGVtcHR5IHNsb3RzIGFyZSBwb3B1bGF0ZWQgc28gdGhhdCB0aGUKKyAgICAgKiBhcnJheSBzaXplIGlzIGF0IGxlYXN0IHxtaW5TaXplfC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIEZsZXhCdWZmZXJzSW1wbCBvYmplY3QgdXNlZCBzbyBmYXIuCisgICAgICogXHBhcmFtIG1pblNpemVbaW5dICAgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBjbGllbnQgYnVmZmVyIGZvciBhbiBlbXB0eSBzbG90LgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsTmFtZSA9IGltcGwubUltcGxOYW1lICsgIltOXSI7CisgICAgICAgIG1OYW1lID0gbUltcGxOYW1lLmNfc3RyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1wbC5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBpbXBsLm1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudCA9IChjbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoIW93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBhbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgY2xpZW50QnVmZmVyLCBpbXBsLm1CdWZmZXJzW2ldLmNvbXBCdWZmZXIsIG93bmVkQnlDbGllbnQgfSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29udmVydGVkICV6dSBidWZmZXJzIHRvIGFycmF5IG1vZGUgb2YgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSwgbWluU2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBpbXBsLm1CdWZmZXJzLnNpemUoKTsgaSA8IG1pblNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2NhdGUoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFiIGEgYnVmZmVyIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkgd2hpY2ggbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXhbb3V0XSAgICBpbmRleCBvZiB0aGUgc2xvdC4KKyAgICAgKiBccGFyYW0gYnVmZmVyW291dF0gICB0aGUgbWF0Y2hpbmcgYnVmZmVyLgorICAgICAqIFxwYXJhbSBtYXRjaFtpbl0gICAgIGEgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHRoZSBidWZmZXIgbWF0Y2hlcyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSBvciBub3QuCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwKKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLICBpZiBzbG90cyBhcmUgYmVpbmcgdXNlZCwKKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSAgICBpZiBubyBzbG90IG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBldmVuIHRob3VnaCBpdCdzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICovCisgICAgc3RhdHVzX3QgZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2ggPQorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJikgeyByZXR1cm4gdHJ1ZTsgfSkgeworICAgICAgICAvLyBhbGxCdWZmZXJzRG9udE1hdGNoIHJlbWFpbnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGJ1dAorICAgICAgICAvLyBtYXRjaCgpIHJldHVybnMgZmFsc2UgZm9yIGV2ZXJ5IGJ1ZmZlci4KKyAgICAgICAgYm9vbCBhbGxCdWZmZXJzRG9udE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPnNldFJhbmdlKDAsICgqYnVmZmVyKS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsQnVmZmVyc0RvbnRNYXRjaCA/IE5PX01FTU9SWSA6IFdPVUxEX0JMT0NLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlIHVudGlsIHRoZSByZXR1cm5lZAorICAgICAqIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBncmFiYmVkLgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENsaWVudCByZXR1cm5lZCBhIGJ1ZmZlciBpdCBkb2VzIG5vdCBvd24gYWNjb3JkaW5nIHRvIG91ciByZWNvcmQ6ICV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gJXM6IG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCAoaW5kZXg9JXp1KSIsIG1OYW1lLCBfX2Z1bmNfXywgaW5kZXgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBjb21wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29kZWMgcmVsZWFzZWQgYSBidWZmZXIgb3duZWQgYnkgY2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihpbmRleCAlenUpIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYnVmZmVyICMlenUoYXJyYXkgbW9kZSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIgKGFycmF5IG1vZGUpIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgfGFycmF5fCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhcnJheVtvdXRdICBhbiBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICovCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgICAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICAgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgYXJyYXktPnB1c2goZW50cnkuY2xpZW50QnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgYWJhbmRvbmVkIGFsbCBrbm93biBidWZmZXJzLCBzbyByZWNsYWltIHRoZSBvd25lcnNoaXAuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgZm9yIChFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgZW50cnkub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IEVudHJ5ICZlbnRyeSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3duZWRCeUNsaWVudDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudDsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKK2NsYXNzIElucHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzQXJyYXkoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJJbnB1dFtOXSIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIH5JbnB1dEJ1ZmZlcnNBcnJheSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKGluZGV4LCAmYzJCdWZmZXIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgICAgICpidWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIxRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBhbGxvYygoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAodm9pZCltRm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMUQtSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpcywgY2FwYWNpdHldICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geyByZXR1cm4gYWxsb2MoY2FwYWNpdHkpOyB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgYmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgTGluZWFySW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gJmRlYWxlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0sCisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiRW5jcnlwdGVkSW5wdXQiKQorICAgICAgICA6IExpbmVhcklucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtVXNhZ2UoezAsIDB9KSwKKyAgICAgICAgICBtRGVhbGVyKGRlYWxlciksCisgICAgICAgICAgbUNyeXB0byhjcnlwdG8pLAorICAgICAgICAgIG1IZWFwU2VxTnVtKGhlYXBTZXFOdW0pIHsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgbVVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCwgMCB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBkZWFsZXI6IG9ubHkgJXp1IHNsb3RzIGFsbG9jYXRlZCIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW1vcnlWZWN0b3IucHVzaF9iYWNrKHtzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+KCksIG1lbW9yeX0pOworICAgICAgICB9CisgICAgfQorCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICAgICAgc2l6ZV90IHNsb3QgPSAwOworICAgICAgICBmb3IgKDsgc2xvdCA8IG1NZW1vcnlWZWN0b3Iuc2l6ZSgpOyArK3Nsb3QpIHsKKyAgICAgICAgICAgIGlmIChtTWVtb3J5VmVjdG9yW3Nsb3RdLmJsb2NrLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1lbW9yeSA9IG1NZW1vcnlWZWN0b3Jbc2xvdF0ubWVtb3J5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIG1Vc2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBibG9jayA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIG1NZW1vcnlWZWN0b3Jbc2xvdF0uYmxvY2sgPSBibG9jazsKKyAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcihtRm9ybWF0LCBibG9jaywgbWVtb3J5LCBtSGVhcFNlcU51bSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyTWVtb3J5VXNhZ2UgbVVzYWdlOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJQ3J5cHRvPiBtQ3J5cHRvOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1NZW1vcnlWZWN0b3I7Cit9OworCitjbGFzcyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1NZXRhSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbVN0b3JlKEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSkgeyB9CisgICAgfkdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxHcmFwaGljTWV0YWRhdGFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIobUZvcm1hdCwgYWxsb2MpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3RvcmUtPmZldGNoQWxsb2NhdG9yKG1Qb29sLT5nZXRBbGxvY2F0b3JJZCgpLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtTWV0YUlucHV0W05dIikpOworICAgICAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgW2Zvcm1hdCA9IG1Gb3JtYXQsIGFsbG9jXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihmb3JtYXQsIGFsbG9jKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZsZXhCdWZmZXJzSW1wbCBtSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gbVN0b3JlOworfTsKKworY2xhc3MgR3JhcGhpY0lucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cywgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1CQi1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1JbnB1dFNsb3RzKSkgeyB9CisgICAgfkdyYXBoaWNJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IG5ld0J1ZmZlciA9IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICBtUG9vbCwgbUZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbUxvY2FsQnVmZmVyUG9vbCk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtQkItSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBsYnApOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKiwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqLCBib29sKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gMHU7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAmYzJCdWZmZXIsCisgICAgICAgICAgICAgICAgW2NzZF0oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmJhc2UoKSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50QnVmZmVyLT5jYXBhY2l0eSgpID49IGNzZC0+ZmxleENvdW50KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGMyQnVmZmVyLT5iYXNlKCksIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGMyQnVmZmVyLT5zZXRSYW5nZSgwLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWZsdXNoZWRXb3JrOworICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jOworICAgICAgICBzd2l0Y2ggKGMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSOiB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2sgPSBjMmJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA8IGtNYXhMaW5lYXJCdWZmZXJTaXplIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gYmxvY2suc2l6ZSgpICogMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbG9jID0gW2Zvcm1hdCA9IG1Gb3JtYXQsIHNpemVdIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemUpKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydAorICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM6ICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpJTlZBTElEOiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1M6ICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1M6ICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIHR5cGU6ICVkIiwgKGludCljMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1JbXBsLnJlYWxsb2MoYWxsb2MpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCdWZmZXJzQXJyYXlJbXBsIG1JbXBsOworfTsKKworY2xhc3MgRmxleE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRmxleE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlZ2lzdGVyZWQgYnVmZmVyICV6dSIsIG1OYW1lLCAqaW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBMb2NhbExpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgdHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKG1Ta2lwQ3V0QnVmZmVyKTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBhbGxvY2F0ZUFycmF5QnVmZmVyKCk7IH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwLgorICAgICAqCisgICAgICogXHJldHVybiAgYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCB0byB3cmFwIHxidWZmZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3QgZm9yIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlCisgICAgICogdXNlZCBhcyBhbiBlbXB0eSBhcnJheSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIEZsZXhPdXRwdXRCdWZmZXJzOjpmbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcigwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm9uLWxpbmVhciBidWZmZXIgJWQiLCBtTmFtZSwgYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBsaW5lYXIgb3V0cHV0IGJ1ZmZlcnMgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgICAgICAvLyBXZSBleHBlY3Qgb25lIGFuZCBvbmx5IG9uZSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBidWZmZXIpOworICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBvdXRwdXQgc2l6ZQorICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfQorfTsKKworY2xhc3MgR3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0KTsKKyAgICB9Cit9OworCitjbGFzcyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1PdXRwdXRTbG90cykpIHsgfQorICAgIH5SYXdHcmFwaGljT3V0cHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyYnVmZmVyID0gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICByZXR1cm4gYzJidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDo6UXVldWVHdWFyZCgKKyAgICAgICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jICZzeW5jKSA6IG1TeW5jKHN5bmMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU3luYy5tR3VhcmRMb2NrKTsKKyAgICAvLyBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCB0aGF0IG1TeW5jIGlzIG5vdCB1bmRlciBzdGF0ZSB0cmFuc2l0aW9uLAorICAgIC8vIGFzIHdlIGFyZSBob2xkaW5nIGl0cyBtdXRleC4KKworICAgIE11dGV4ZWQ8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1TeW5jLm1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICsrY291bnQtPnZhbHVlOworICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgfQorfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjp+UXVldWVHdWFyZCgpIHsKKyAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgLy8gV2UgYXJlIG5vdCBob2xkaW5nIG1HdWFyZExvY2sgYXQgdGhpcyBwb2ludCBzbyB0aGF0IFF1ZXVlU3luYzo6c3RvcCgpIGNhbgorICAgICAgICAvLyBrZWVwIGhvbGRpbmcgdGhlIGxvY2sgdW50aWwgbUNvdW50IHJlYWNoZXMgemVyby4KKyAgICAgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICAgICAgLS1jb3VudC0+dmFsdWU7CisgICAgICAgIGNvdW50LT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIC8vIElmIHN0b3BwZWQsIGl0IGdvZXMgdG8gcnVubmluZyBzdGF0ZTsgb3RoZXJ3aXNlIG5vLW9wLgorICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgY291bnQtPnZhbHVlID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBIb2xkaW5nIG1HdWFyZExvY2sgaGVyZSBibG9ja3MgY3JlYXRpb24gb2YgYWRkaXRpb25hbCBRdWV1ZUd1YXJkIG9iamVjdHMsIHNvCisgICAgLy8gbUNvdW50IGNhbiBvbmx5IGRlY3JlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRocmVhZHMgdGhhdCBhY3F1aXJlZCB0aGUgbG9jaworICAgIC8vIGFyZSBhbGxvd2VkIHRvIGZpbmlzaCBleGVjdXRpb24gYnV0IGFkZGl0aW9uYWwgdGhyZWFkcyB0cnlpbmcgdG8gYWNxdWlyZQorICAgIC8vIHRoZSBsb2NrIGF0IHRoaXMgcG9pbnQgd2lsbCBibG9jaywgYW5kIHRoZW4gZ2V0IFF1ZXVlR3VhcmQgYXQgU1RPUFBFRAorICAgIC8vIHN0YXRlLgorICAgIHdoaWxlIChjb3VudC0+dmFsdWUgIT0gMCkgeworICAgICAgICBjb3VudC53YWl0Rm9yQ29uZGl0aW9uKGNvdW50LT5jb25kKTsKKyAgICB9CisgICAgY291bnQtPnZhbHVlID0gLTE7Cit9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OlJlb3JkZXJTdGFzaCgpIHsKKyAgICBjbGVhcigpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Y2xlYXIoKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKKyAgICBtRGVwdGggPSAwOworICAgIG1LZXkgPSBDMkNvbmZpZzo6T1JESU5BTDsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmZsdXNoKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXREZXB0aCh1aW50MzJfdCBkZXB0aCkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtRGVwdGggPSBkZXB0aDsKK30KK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGF1dG8gaXQgPSBtU3Rhc2guYmVnaW4oKTsKKyAgICBmb3IgKDsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXNoLmVtcGxhY2UoaXQsIGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1OdW1JbnB1dFNsb3RzKGtTbW9vdGhuZXNzRmFjdG9yKSwKKyAgICAgIG1OdW1PdXRwdXRTbG90cyhrU21vb3RobmVzc0ZhY3RvciksCisgICAgICBtRGVsYXkoMCksCisgICAgICBtRnJhbWVJbmRleCgwdSksCisgICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXgoMHUpLAorICAgICAgbU1ldGFNb2RlKE1PREVfTk9ORSksCisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICBtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzID0ga1Ntb290aG5lc3NGYWN0b3IgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycygiIikpOworfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjp+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpIHsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1EZWFsZXIgIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA+PSAwKSB7CisgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChtSGVhcFNlcU51bSk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgbUNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC0+Z2V0TmFtZSgpICsgU3RyaW5nUHJpbnRmKCIjJWQiLCBpbnQodWludHB0cl90KGNvbXBvbmVudC5nZXQoKSkgJSA5OTcpKTsKKyAgICBtTmFtZSA9IG1Db21wb25lbnROYW1lLmNfc3RyKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgQUxPR1YoIlslc10gc2V0SW5wdXRTdXJmYWNlIiwgbU5hbWUpOworICAgIG1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5jb25uZWN0KG1Db21wb25lbnQpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbUlucHV0U3VyZmFjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVycyBhZnRlciBFT1MgaWdub3JlZCAoJWxsZCB1cykiLCBtTmFtZSwgKGxvbmcgbG9uZyl0aW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaW50MzJfdCB0bXAgPSAwOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIC8vIFdPUktBUk9VTkQ6IHVudGlsIGNvZGVjcyBzdXBwb3J0IGhhbmRsaW5nIHdvcmsgYWZ0ZXIgRU9TIGFuZCBtYXggb3V0cHV0IHNpemluZywgdXNlIHRpbWVzdGFtcAorICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhY2hpZXZlIGltYWdlIGVuY29kaW5nIHZpYSB2aWRlbyBjb2RlYywgYW5kIHRvIGNvbnN0cmFpbiBlbmNvZGVkIG91dHB1dC4KKyAgICAvLyBLZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICB1aW50NjRfdCBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gcXVldWVkQnVmZmVyczsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgIH0gZWxzZSBpZiAoZW9zKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIC8vIFRPRE86IGZpbGwgaW5mbydzCisKKyAgICB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrUXVldWVkKAorICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKKyAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUocXVldWVkRnJhbWVJbmRleCk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBlb3MgJiYgYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgLy8gV09SS0FST1VORDoga2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5jbGVhcigpOworCisgICAgICAgIGl0ZW1zLmNsZWFyKCk7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCisgICAgICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgYm9vbCByZWxlYXNlZCA9ICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyICVzcmVsZWFzZWQiLCBtTmFtZSwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CisgICAgfQorCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBzZXRQYXJhbWV0ZXJzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBydW5uaW5nIHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIG1QYXJhbXNUb0JlU2V0Lmluc2VydChtUGFyYW1zVG9CZVNldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuZW5kKCkpKTsKKyAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGJvb2wgc2VjdXJlLCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisKKyAgICBpZiAoIWhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgc3A8RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI+IGVuY3J5cHRlZEJ1ZmZlcigoRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgKilidWZmZXIuZ2V0KCkpOworCisgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKKyAgICBzc2l6ZV90IGNvZGVjRGF0YU9mZnNldCA9IDA7CisgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0cikgeworICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9IGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNvdXJjZSk7CisgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoCisgICAgICAgICAgICAgICAga2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBidWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50KG1EZWNyeXB0RGVzdGluYXRpb24sIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNyY0J1ZmZlcik7CisKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEU7CisgICAgICAgICAgICBkc3RCdWZmZXIuc2VjdXJlTWVtb3J5ID0gaGlkbF9oYW5kbGUoZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQ2FzU3RhdHVzIHN0YXR1cyA9IENhc1N0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBzY3RybCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhc1N0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBDYXNTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkLCByZXN1bHQ9JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlslc10gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIG1OYW1lLCByZXN1bHQpOworCisgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCkgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR1YoIlslc10gV2UncmUgbm90IHJ1bm5pbmcgLS0tIG5vIGlucHV0IGJ1ZmZlciByZXBvcnRlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpIHsKKyAgICBpZiAobUlucHV0TWV0RW9zIHx8CisgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgfHwKKyAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtT3V0cHV0U2xvdHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtSW5wdXRTbG90cykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZpbkJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBuZXcgYnVmZmVyIGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBuZXcgaW5wdXQgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgaW5CdWZmZXIuZ2V0KCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGluQnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIEFMT0dWKCJbJXNdIHJlbmRlck91dHB1dEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOworICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTk9URTogc29tZSBhcHBzIHRyeSB0byByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCB0aW1lc3RhbXAgYW5kL29yIHJlbmRlcgorICAgIC8vICAgICAgIHNldCB0byB0cnVlLgorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgLy8gaW5wdXQgYnVmZmVyIGZlZWRpbmcgbWF5IGhhdmUgYmVlbiBnYXRlZCBieSBwZW5kaW5nIG91dHB1dCBidWZmZXJzCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICBpZiAoIWMyQnVmZmVyKSB7CisgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gVGhlIGFwcCBpcyBjYWxsaW5nIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3IgcmVuZGVyPXRydWUgd2l0aCBub24tdmlkZW8gYnVmZmVycy4gQXBwcyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgImNhbGwgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggcmVuZGVyPWZhbHNlIGZvciB0aG9zZS4iLAorICAgICAgICAgICAgICAgICAgbU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyNpZiAwCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm9QYXJhbXMgPSBjMkJ1ZmZlci0+aW5mbygpOworICAgIEFMT0dWKCJbJXNdIHF1ZXVpbmcgZ2Z4IGJ1ZmZlciB3aXRoICV6dSBpbmZvcyIsIG1OYW1lLCBpbmZvUGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGluZm9QYXJhbXMpIHsKKyAgICAgICAgQVN0cmluZyByZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggKyAzIDwgaW5mby0+c2l6ZSgpOyBpeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoaXgpIHJlcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICByZXMuYXBwZW5kKCooKGludDMyX3QqKWluZm8uZ2V0KCkgKyAoaXggLyA0KSkpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIgIFslc10iLCByZXMuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+IHJvdGF0aW9uID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKKyAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CisgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfSCA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gMTgwIGRlZ3JlZXMKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfViA6IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8vIDkwIGRlZ3JlZXMgY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4gc3VyZmFjZVNjYWxpbmcgPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIHVpbnQzMl90IHZpZGVvU2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c7CisgICAgaWYgKHN1cmZhY2VTY2FsaW5nKSB7CisgICAgICAgIHZpZGVvU2NhbGluZ01vZGUgPSBzdXJmYWNlU2NhbGluZy0+dmFsdWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGFzcGFjZSBmcm9tIGZvcm1hdCBhcyBpdCBoYXMgdGhlIGRlZmF1bHQgYXNwZWN0cyBhbHJlYWR5IGFwcGxpZWQKKyAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisgICAgKHZvaWQpYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpOworCisgICAgLy8gSERSIHN0YXRpYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBoZHJTdGF0aWNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgLy8gSERSMTAgcGx1cyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3MuZnJvbnQoKTsKKworICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgdGltZXN0YW1wTnMsCisgICAgICAgICAgICBmYWxzZSwgLy8gZHJvcHBhYmxlCisgICAgICAgICAgICBkYXRhU3BhY2UsCisgICAgICAgICAgICBSZWN0KGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5sZWZ0LAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkucmlnaHQoKSwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKKyAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCisgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOworICAgIGlmIChoZHJTdGF0aWNJbmZvIHx8IGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgSGRyTWV0YWRhdGEgaGRyOworICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgeworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0geworICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAgICAgLm1heENvbnRlbnRMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzID0gSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMzsKKyAgICAgICAgICAgIGhkci5zbXB0ZTIwODYgPSBzbXB0ZTIwODZfbWV0YTsKKyAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CisgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBxYmkuc2V0SGRyTWV0YWRhdGEoaGRyKTsKKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgaGF2ZSBkaXJ0eSByZWdpb25zCisgICAgcWJpLnNldFN1cmZhY2VEYW1hZ2UoUmVnaW9uOjpJTlZBTElEX1JFR0lPTik7CisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAwOworICAgICh2b2lkKWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CisgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKG1lZGlhVGltZVVzLCB0aW1lc3RhbXBOcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OmRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIEFMT0dWKCJbJXNdIGRpc2NhcmRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMgJiYgKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgcmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE1lZGlhQ29kZWMgZGlzY2FyZGVkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICB9CisKKyAgICAoKmJ1ZmZlcnMpLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1PdXRwdXRTbG90cyk7CisgICAgfQorCisgICAgKCpidWZmZXJzKS0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KDApOworICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5KDApOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJmlTdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJm9TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJnJlb3JkZXJEZXB0aCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlcktleSwKKyAgICAgICAgICAgICAgICAmaW5wdXREZWxheSwKKyAgICAgICAgICAgICAgICAmcGlwZWxpbmVEZWxheSwKKyAgICAgICAgICAgICAgICAmb3V0cHV0RGVsYXksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgaWYgKGVyciA9PSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgaWYgKCFpU3RyZWFtRm9ybWF0IHx8ICFvU3RyZWFtRm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHJlb3JkZXJEZXB0aCkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVvcmRlcktleSkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgaW5wdXREZWxheVZhbHVlID0gaW5wdXREZWxheSA/IGlucHV0RGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXlWYWx1ZSA9IHBpcGVsaW5lRGVsYXkgPyBwaXBlbGluZURlbGF5LnZhbHVlIDogMDsKKyAgICB1aW50MzJfdCBvdXRwdXREZWxheVZhbHVlID0gb3V0cHV0RGVsYXkgPyBvdXRwdXREZWxheS52YWx1ZSA6IDA7CisKKyAgICBtTnVtSW5wdXRTbG90cyA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIG1OdW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5VmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICBtRGVsYXkgPSBpbnB1dERlbGF5VmFsdWUgKyBwaXBlbGluZURlbGF5VmFsdWUgKyBvdXRwdXREZWxheVZhbHVlOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQXJyYXlNb2RlID0gZmFsc2U7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZXRhTW9kZSA9PSBNT0RFX0FOVykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNJbnB1dEJ1ZmZlcnMobU51bUlucHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURlYWxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKGNhcGFjaXR5LCBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAobU51bUlucHV0U2xvdHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0RGVzdGluYXRpb24gPSBtRGVhbGVyLT5hbGxvY2F0ZSgoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKG1EZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgbURlYWxlciwgbUNyeXB0bywgbUhlYXBTZXFOdW0sIChzaXplX3QpY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgICAgICBmb3JjZUFycmF5TW9kZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQoaW5wdXRGb3JtYXQpOworCisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICgqYnVmZmVycyktPnNldFBvb2wocG9vbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvcmNlQXJyYXlNb2RlKSB7CisgICAgICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRTdXJmYWNlOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlID0gb3V0cHV0LT5zdXJmYWNlID8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkXzsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworCisgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBhbGxvY2F0b3IgSUQuCisgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvciBpZgorICAgICAgICAgICAgLy8gdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0ICpvdXRwdXRBbGxvY2F0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEFsbG9jYXRvcnMgJiYgb3V0cHV0QWxsb2NhdG9ycy0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Iob3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBidWZmZXJxdWV1ZSBpZiBvdXRwdXR0aW5nIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAvLyBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBzdXJmYWNlIGFsbG9jYXRvciByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgKnN1cmZhY2VBbGxvY2F0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlQWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Ioc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIHN1cmZhY2Ugb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXJyICE9IEMyX09LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHBvb2xNYXNrID4+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsICZwb29scy0+b3V0cHV0UG9vbElkLCAmcG9vbHMtPm91dHB1dFBvb2xJbnRmKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBDcmVhdGVkIG91dHB1dCBibG9jayBwb29sIHdpdGggYWxsb2NhdG9ySUQgJXUgPT4gcG9vbElEICVsbHUgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29scy0+b3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgYmFzaWMgcG9vbCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdXRwdXQgYmxvY2sgcG9vbCBJRCBhcyBwYXJhbWV0ZXIgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0IHRvCisgICAgICAgICAgICAvLyBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29sSWRzVHVuaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7IHBvb2xzLT5vdXRwdXRQb29sSWQgfSk7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7IHBvb2xJZHNUdW5pbmcuZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uZmlndXJlZCBvdXRwdXQgYmxvY2sgcG9vbCBpZHMgJWxsdSA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZHNUdW5pbmctPm0udmFsdWVzWzBdLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIG91dHB1dFBvb2xJZF8gPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhtTnVtT3V0cHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQtPmR1cCgpKTsKKworCisgICAgICAgIC8vIFRyeSB0byBzZXQgb3V0cHV0IHN1cmZhY2UgdG8gY3JlYXRlZCBibG9jayBwb29sIGlmIGdpdmVuLgorICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgbUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkXywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgLy8gV09SS0FST1VORDogaWYgd2UncmUgdXNpbmcgZWFybHkgQ1NEIHdvcmthcm91bmQgd2UgY29udmVydCB0bworICAgICAgICAgICAgLy8gICAgICAgICAgICAgYXJyYXkgbW9kZSwgdG8gYXBwZWFzZSBhcHBzIGFzc3VtaW5nIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAgICAgICAgICgqYnVmZmVycykgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworCisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAwOzsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5IHx8IHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIGFuZCB3ZSdyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVycyktPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLm91dHB1dERlbGF5KG91dHB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnNtb290aG5lc3NGYWN0b3Ioa1Ntb290aG5lc3NGYWN0b3IpOworICAgICAgICB3YXRjaGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIG1JbnB1dE1ldEVvcyA9IGZhbHNlOworICAgIG1TeW5jLnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiB0b0JlUXVldWVkOworICAgIC8vIFRPRE86IHVzZSBwcm9wZXIgYnVmZmVyIGRlcHRoIGluc3RlYWQgb2YgdGhpcyByYW5kb20gdmFsdWUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnksIG9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBidWZmZXIgJXp1IGF2YWlsYWJsZSIsIG1OYW1lLCBpbmRleCk7CisgICAgICAgICAgICBib29sIHBvc3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFjb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5jYXBhY2l0eSgpID49IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmJhc2UoKSwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNhcGFjaXR5IHRvbyBzbWFsbCBmb3IgdGhlIGNvbmZpZyAoJXp1IDwgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvc3QpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvQmVRdWV1ZWQuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyIDogdG9CZVF1ZXVlZCkgeworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGluaXRpYWwgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c3RvcCgpIHsKKyAgICBtU3luYy5zdG9wKCk7CisgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFN1cmZhY2UucmVzZXQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Zmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIHsKKyAgICBBTE9HVigiWyVzXSBmbHVzaCIsIG1OYW1lKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlJlYWRWaWV3IHZpZXcgPQorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGZhaWxlZCB0byBtYXAgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YTogJWQiLCBtTmFtZSwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ3MtPnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkodmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSkpOworICAgICAgICAgICAgQUxPR1YoIlslc10gc3Rhc2hlZCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhIChzaXplPSV1KSIsIG1OYW1lLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaCgpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5mbHVzaCgpOworICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5mbHVzaCgpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSkgeworICAgIGlmIChoYW5kbGVXb3JrKHN0ZDo6bW92ZSh3b3JrKSwgb3V0cHV0Rm9ybWF0LCBpbml0RGF0YSkpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gKCpidWZmZXJzKS0+ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6aGFuZGxlV29yaygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKCh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggLSBtRmlyc3RWYWxpZEZyYW1lSW5kZXgubG9hZCgpKS5wZWVrKCkgPCAwKSB7CisgICAgICAgIC8vIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4KKyAgICAgICAgQUxPR0QoIlslc10gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSB7CisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ID09IEMyX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRCgiWyVzXSBmbHVzaGVkIHdvcms7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHdvcmsgZmFpbGVkIHRvIGNvbXBsZXRlOiAlZCIsIG1OYW1lLCB3b3JrLT5yZXN1bHQpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3Iod29yay0+cmVzdWx0LCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSB3b3JrbGV0CisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIHdvcmtsZXRzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gJndvcmtsZXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgb3V0cHV0IHN0cmVhbS4KKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgYnVmZmVyczogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIGJ1ZmZlciA9IHdvcmtsZXQtPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogbnVsbHB0ciBmb3VuZCBpbiBidWZmZXJzOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlcktleS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGtleSB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGtleSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVucmVjb2duaXplZCBjb25maWcgdXBkYXRlICglMDhYKSIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlcnMpLT51cGRhdGVTa2lwQ3V0QnVmZmVyKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCBvdXRwdXQgdGltZXN0YW1wIGJhc2VkIG9uIGNsaWVudCBpbnB1dCB0aW1lc3RhbXAgYW5kIGNvZGVjCisgICAgLy8gaW5wdXQgdGltZXN0YW1wLiBDb2RlYyBvdXRwdXQgdGltZXN0YW1wIChpbiB0aGUgdGltZXN0YW1wIGZpZWxkKSBzaGFsbCBjb3JyZXNwb25kIHRvCisgICAgLy8gdGhlIGNvZGVjIGlucHV0IHRpbWVzdGFtcCwgYnV0IGNsaWVudCBvdXRwdXQgdGltZXN0YW1wIHNob3VsZCAocmVwb3J0ZWQgaW4gdGltZVVzKQorICAgIC8vIHNoYWxsIGNvcnJlc3BvbmQgdG8gdGhlIGNsaWVudCBpbnB1dCB0aW1lc2FtcCAoaW4gY3VzdG9tT3JkaW5hbCkuIEJ5IHVzaW5nIHRoZQorICAgIC8vIGRlbHRhIGJldHdlZW4gdGhlIHR3bywgdGhpcyBhbGxvd3MgZm9yIHNvbWUgdGltZXN0YW1wIGRldmlhdGlvbiAtIGUuZy4gaWYgb25lIGlucHV0CisgICAgLy8gcHJvZHVjZXMgbXVsdGlwbGUgb3V0cHV0LgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcCA9CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCArIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbAorICAgICAgICAgICAgICAgIC0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogaW5wdXQgJWxsZCwgY29kZWMgJWxsZCA9PiBvdXRwdXQgJWxsZCA9PiAlbGxkIiwKKyAgICAgICAgICBtTmFtZSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHRpbWVzdGFtcC5wZWVrbGwoKSk7CisKKyAgICBpZiAoaW5pdERhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPnJlZ2lzdGVyQ3NkKGluaXREYXRhLCAmaW5kZXgsICZvdXRCdWZmZXIpID09IE9LKSB7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVzdGFtcC5wZWVrKCkpOworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGNzZCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNzZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgYnVmZmVycy5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJ1ZmZlciAmJiAhZmxhZ3MpIHsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogTm90IHJlcG9ydGluZyBvdXRwdXQgYnVmZmVyICglbGxkKSIsCisgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmZmVyLT5pbmZvKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHByb3Blcmx5IHRyYW5zbGF0ZSB0aGVzZSB0byBtZXRhZGF0YQorICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBpZiAoKChDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm8gKilpbmZvLmdldCgpKS0+dmFsdWUgJiBDMkNvbmZpZzo6U1lOQ19GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5lbXBsYWNlKGJ1ZmZlciwgdGltZXN0YW1wLnBlZWsoKSwgZmxhZ3MsIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgICAgICAvLyBGbHVzaCByZW9yZGVyIHN0YXNoCisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNlbmRPdXRwdXRCdWZmZXJzKCkgeworICAgIFJlb3JkZXJTdGFzaDo6RW50cnkgZW50cnk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIGlmICghcmVvcmRlci0+aGFzUGVuZGluZygpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlb3JkZXItPnBvcCgmZW50cnkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmJ1ZmZlcnMpLT5yZWdpc3RlckJ1ZmZlcihlbnRyeS5idWZmZXIsICZpbmRleCwgJm91dEJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoISgqYnVmZmVycyktPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcnMgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPdXRwdXRCdWZmZXJzQXJyYXkgKmFycmF5ID0gKE91dHB1dEJ1ZmZlcnNBcnJheSAqKWJ1ZmZlcnMtPmdldCgpOworICAgICAgICAgICAgICAgIGFycmF5LT5yZWFsbG9jKGVudHJ5LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHVuYWJsZSB0byByZWdpc3RlciBvdXRwdXQgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmVvcmRlci0+ZGVmZXIoZW50cnkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7CisgICAgICAgIEFMT0dWKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiBvdXQgYnVmZmVyIGluZGV4ID0gJXp1IFslcF0gPT4gJXAgKyAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpLCBvdXRCdWZmZXItPmRhdGEoKSwgb3V0QnVmZmVyLT5zaXplKCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBvdXRCdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmbmV3U3VyZmFjZSkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pY191aW50MzJfdCBzdXJmYWNlR2VuZXJhdGlvbnswfTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gKGdldHBpZCgpIDw8IDEwKSB8CisgICAgICAgICAgICAoKHN1cmZhY2VHZW5lcmF0aW9uLmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSArIDEpCisgICAgICAgICAgICAgICAgJiAoKDEgPDwgMTApIC0gMSkpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgaWYgKG5ld1N1cmZhY2UpIHsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0U2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKyAgICAgICAgcHJvZHVjZXIgPSBuZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHByb2R1Y2VyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgb3V0cHV0IHN1cmZhY2UgdG8gbnVsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKyAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgb3V0cHV0UG9vbEludGYgPSBwb29scy0+b3V0cHV0UG9vbEludGY7CisgICAgfQorCisgICAgaWYgKG91dHB1dFBvb2xJbnRmKSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgb3V0cHV0LT5zdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7CisgICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgorICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bworICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICBzaXplX3QgbiA9IG1JbnB1dE1ldEVvcyA/IDAgOiBtRGVsYXk7CisgICAgcmV0dXJuIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5lbGFwc2VkKFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpLCBuKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKSB7CisgICAgbU1ldGFNb2RlID0gbW9kZTsKK30KKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCkgeworICAgIC8vIEMyX09LIGlzIGFsd2F5cyB0cmFuc2xhdGVkIHRvIE9LLgorICAgIGlmIChjMnMgPT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIE9wZXJhdGlvbi1kZXBlbmRlbnQgdHJhbnNsYXRpb24KKyAgICAvLyBUT0RPOiBBZGQgYXMgbmVjZXNzYXJ5CisgICAgc3dpdGNoIChjMm9wKSB7CisgICAgY2FzZSBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0OgorICAgICAgICBzd2l0Y2ggKGMycykgeworICAgICAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEJhY2t1cCBvcGVyYXRpb24tYWdub3N0aWMgdHJhbnNsYXRpb24KKyAgICBzd2l0Y2ggKGMycykgeworICAgIGNhc2UgQzJfQkFEX0lOREVYOgorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIGNhc2UgQzJfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQzJfQkxPQ0tJTkc6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEMyX0RVUExJQ0FURToKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGNhc2UgQzJfTk9fSU5JVDoKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgY2FzZSBDMl9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBjYXNlIEMyX1RJTUVEX09VVDoKKyAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICBjYXNlIEMyX0JBRF9TVEFURToKKyAgICBjYXNlIEMyX0NBTkNFTEVEOgorICAgIGNhc2UgQzJfQ0FOTk9UX0RPOgorICAgIGNhc2UgQzJfQ09SUlVQVEVEOgorICAgIGNhc2UgQzJfT01JVFRFRDoKKyAgICBjYXNlIEMyX1JFRlVTRUQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGMycyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMjliNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjZGVmaW5lIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5RGVhbGVyOworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSA9IDA7Cit9OworCisvKioKKyAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBDQ29kZWMuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWwKKyAgICA6IHB1YmxpYyBCdWZmZXJDaGFubmVsQmFzZSwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0J1ZmZlckNoYW5uZWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spOworICAgIHZpcnR1YWwgfkNDb2RlY0J1ZmZlckNoYW5uZWwoKTsKKworICAgIC8vIEJ1ZmZlckNoYW5uZWxCYXNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBiZWxvdyBhcmUgaW50ZXJmYWNlIGZvciBDQ29kZWMgdG8gdXNlLgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wb25lbnQgb2JqZWN0IGZvciBidWZmZXIgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLyoqCisgICAgICogU2V0IG91dHB1dCBncmFwaGljIHN1cmZhY2UgZm9yIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNldCBHcmFwaGljQnVmZmVyU291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgZXh0cmFjdHMgaW5wdXQKKyAgICAgKiBidWZmZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2lnbmFsIEVPUyB0byBpbnB1dCBzdXJmYWNlLgorICAgICAqLworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBiZWZvcmUgdGhpcyBjYWxsIGhhcyBjb21wbGV0ZWQuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IGNsaWVudC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworCisgICAgLyoqCisgICAgICogU3RvcCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYWZ0ZXIgdGhpcyBjYWxsLCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGlucHV0IGNsaWVudCBhYm91dCB3b3JrIGRvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya0l0ZW1zICAgZmluaXNoZWQgd29yayBpdGVtLgorICAgICAqIEBwYXJhbSBvdXRwdXRGb3JtYXQgbmV3IG91dHB1dCBmb3JtYXQgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICogQHBhcmFtIGluaXREYXRhICAgIG5ldyBpbml0IGRhdGEgKENTRCkgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGlucHV0IGJ1ZmZlciBhdmFpbGFibGUgZm9yIHRoZSBjbGllbnQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAqIGJ5IHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBvZiBpbnB1dCB3b3JrCisgICAgICogQHBhcmFtIGFycmF5SW5kZXggVGhlIGluZGV4IG9mIGJ1ZmZlciBpbiB0aGUgaW5wdXQgd29yayBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCisgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCgpOworCisgICAgZW51bSBNZXRhTW9kZSB7CisgICAgICAgIE1PREVfTk9ORSwKKyAgICAgICAgTU9ERV9BTlcsCisgICAgfTsKKworICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CisKKyAgICAvLyBJbnRlcm5hbCBjbGFzc2VzCisgICAgY2xhc3MgQnVmZmVyczsKKyAgICBjbGFzcyBJbnB1dEJ1ZmZlcnM7CisgICAgY2xhc3MgT3V0cHV0QnVmZmVyczsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBRdWV1ZUd1YXJkOworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBtdXRleC1saWtlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKgorICAgICAqIC0gQXQgU1RPUFBFRCBzdGF0ZSAoaW5pdGlhbCwgb3IgYWZ0ZXIgc3RvcCgpKQorICAgICAqICAgLSBRdWV1ZUd1YXJkIG9iamVjdCBnZXRzIGNyZWF0ZWQgYXQgU1RPUFBFRCBzdGF0ZSwgYW5kIHRoZSBjbGllbnQgaXMKKyAgICAgKiAgICAgc3VwcG9zZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqIC0gQXQgUlVOTklORyBzdGF0ZSAoYWZ0ZXIgc3RhcnQoKSkKKyAgICAgKiAgIC0gRWFjaCBRdWV1ZUd1YXJkIG9iamVjdAorICAgICAqLworICAgIGNsYXNzIFF1ZXVlU3luYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQXQgY29uc3RydWN0aW9uIHRoZSBzeW5jIG9iamVjdCBpcyBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFF1ZXVlU3luYygpIHt9CisgICAgICAgIH5RdWV1ZVN5bmMoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zaXRpb24gdG8gUlVOTklORyBzdGF0ZSB3aGVuIHN0b3BwZWQuIE5vLW9wIGlmIGFscmVhZHkgaW4gUlVOTklORworICAgICAgICAgKiBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RhcnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXQgUlVOTklORyBzdGF0ZSwgd2FpdCB1bnRpbCBhbGwgUXVldWVHdWFyZCBvYmplY3QgY3JlYXRlZCBkdXJpbmcKKyAgICAgICAgICogUlVOTklORyBzdGF0ZSBhcmUgZGVzdHJveWVkLCBhbmQgdGhlbiB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqIE5vLW9wIGlmIGFscmVhZHkgaW4gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RvcCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgTXV0ZXggbUd1YXJkTG9jazsKKworICAgICAgICBzdHJ1Y3QgQ291bnRlciB7CisgICAgICAgICAgICBpbmxpbmUgQ291bnRlcigpIDogdmFsdWUoLTEpIHt9CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQ29uZGl0aW9uIGNvbmQ7CisgICAgICAgIH07CisgICAgICAgIE11dGV4ZWQ8Q291bnRlcj4gbUNvdW50OworCisgICAgICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOworICAgIH07CisKKyAgICBjbGFzcyBRdWV1ZUd1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1ZXVlR3VhcmQoUXVldWVTeW5jICZzeW5jKTsKKyAgICAgICAgflF1ZXVlR3VhcmQoKTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNSdW5uaW5nKCkgeyByZXR1cm4gbVJ1bm5pbmc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFF1ZXVlU3luYyAmbVN5bmM7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBoYW5kbGVXb3JrKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisgICAgdm9pZCBzZW5kT3V0cHV0QnVmZmVycygpOworCisgICAgUXVldWVTeW5jIG1TeW5jOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgY29tcG9uZW50IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY29tcG9uZW50IG5hbWUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+IG1DQ29kZWNDYWxsYmFjazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1JbnB1dEFsbG9jYXRvcjsKKyAgICBRdWV1ZVN5bmMgbVF1ZXVlU3luYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1QYXJhbXNUb0JlU2V0OworCisgICAgc2l6ZV90IG1OdW1JbnB1dFNsb3RzOworICAgIHNpemVfdCBtTnVtT3V0cHV0U2xvdHM7CisgICAgc2l6ZV90IG1EZWxheTsKKworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+IG1JbnB1dEJ1ZmZlcnM7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+PiBtRmx1c2hlZENvbmZpZ3M7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+IG1PdXRwdXRCdWZmZXJzOworCisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZpcnN0VmFsaWRGcmFtZUluZGV4OworCisgICAgc3A8TWVtb3J5RGVhbGVyPiBtYWtlTWVtb3J5RGVhbGVyKHNpemVfdCBoZWFwU2l6ZSk7CisKKyAgICBzdHJ1Y3QgT3V0cHV0U3VyZmFjZSB7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIGludCBtYXhEZXF1ZXVlQnVmZmVyczsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29scyB7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gaW5wdXRQb29sOworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIH07CisgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPiBtQmxvY2tQb29sczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworCisgICAgTWV0YU1vZGUgbU1ldGFNb2RlOworCisgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+IG1QaXBlbGluZVdhdGNoZXI7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBmbHVzaCgpOworICAgICAgICB2b2lkIHNldERlcHRoKHVpbnQzMl90IGRlcHRoKTsKKyAgICAgICAgdm9pZCBzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KTsKKyAgICAgICAgYm9vbCBwb3AoRW50cnkgKmVudHJ5KTsKKyAgICAgICAgdm9pZCBlbXBsYWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpOworICAgICAgICB2b2lkIGRlZmVyKGNvbnN0IEVudHJ5ICZlbnRyeSk7CisgICAgICAgIGJvb2wgaGFzUGVuZGluZygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUGVuZGluZzsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtU3Rhc2g7CisgICAgICAgIHVpbnQzMl90IG1EZXB0aDsKKyAgICAgICAgQzJDb25maWc6Om9yZGluYWxfa2V5X3QgbUtleTsKKworICAgICAgICBib29sIGxlc3MoY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKTsKKyAgICB9OworICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPiBtUmVvcmRlclN0YXNoOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtSW5wdXRNZXRFb3M7CisKKyAgICBpbmxpbmUgYm9vbCBoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkgeworICAgICAgICByZXR1cm4gbUNyeXB0byAhPSBudWxscHRyIHx8IG1EZXNjcmFtYmxlciAhPSBudWxscHRyOworICAgIH0KK307CisKKy8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCisvLyBvcGVyYXRpb24gdGhhdCByZXR1cm5zIHRoZSBjMl9zdGF0dXNfdCB2YWx1ZS4KK2VudW0gYzJfb3BlcmF0aW9uX3QgeworICAgIEMyX09QRVJBVElPTl9OT05FLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY29ubmVjdFRvT214SW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY3JlYXRlQmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGVzdHJveUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZHJhaW4sCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9mbHVzaCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3F1ZXVlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVsZWFzZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3Jlc2V0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc2V0T3V0cHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RvcCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY29weUJ1ZmZlciwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUludGVyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX2NvbmZpZywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5LAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRQYXJhbXMsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFZhbHVlcywKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlX2Nvbm5lY3RUb0NvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlQ29ubmVjdGlvbl9kaXNjb25uZWN0LAorfTsKKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCA9IEMyX09QRVJBVElPTl9OT05FKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMmU3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gYzIgZXF1aXZhbGVudHMgZm9yICVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX01BUFBFUlM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZvdW5kICV6dSBlcXMgZm9yICVzIiwgaXQtPnNlY29uZC5zaXplKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFNESyA8PT4gQ29kZWMgMi4wIHBhcmFtZXRlciBtYXBwaW5nLiBNdWx0aXBsZSBDb2RlYyAyLjAgcGFyYW1ldGVycyBtYXkgbWFwIHRvIGEKKyAgICAgKiBzaW5nbGUgU0RLIGtleSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNoYWxsIGJlIG9yZGVyZWQgZnJvbSBsZWFzdCBhdXRob3JpdGF0aXZlIHRvIG1vc3QKKyAgICAgKiBhdXRob3JpdGF0aXZlLiBXaGVuIGNvbnN0cnVjdGluZyBTREsgZm9ybWF0cywgdGhlIGxhc3QgbWFwcGVkIENvZGVjIDIuMCBwYXJhbWV0ZXIgdGhhdAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IHdpbGwgZGV0ZXJtaW5lIHRoZSBleHBvc2VkIHZhbHVlLiAoVE9ETzogcGVyaGFwcyByZXN0cmljdCB0aGlzCisgICAgICogYnkgZG9tYWluLikKKyAgICAgKi8KKyAgICB2b2lkIGFkZChjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGNtLm1lZGlhS2V5KCkpOworICAgICAgICBBTE9HVigiJWMlYyVjJWMgJWMlYyVjICUwNHggJTlzICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfSU5QVVQpID8gJ0knIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfT1VUUFVUKSA/ICdPJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPREVEKSA/ICdDJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JBVykgPyAnUicgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT05GSUcpID8gJ2MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUEFSQU0pID8gJ3AnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkVBRCkgPyAncicgOiAnICcpLAorICAgICAgICAgICAgICBjbS5kb21haW4oKSwKKyAgICAgICAgICAgICAgaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkgPyAiYWRkaW5nIiA6ICJleHRlbmRpbmciLAorICAgICAgICAgICAgICBjbS5tZWRpYUtleSgpLmNfc3RyKCksIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IGVxcyA9IHsgY20gfTsKKyAgICAgICAgICAgIG1Db25maWdNYXBwZXJzLmVtcGxhY2UoY20ubWVkaWFLZXkoKSwgZXFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQucHVzaF9iYWNrKGNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGhzIGZvciBhIHNwZWNpZmljIGRvbWFpbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbnkgbWF4aW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgZG9tYWlucworICAgICAqICAgICAgICAgICAgaW4gdGhlIG1hc2suCisgICAgICogXHBhcmFtIGFsbCBtaW5pbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYWxsIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAgICAqICAgICAgICAgICAgbWFzay4gVGhpcyBpcyByZXN0cmljdGVkIHRvIHRoZSBiaXRzIG9mIHRoZSBtYXhpbXVtIG1hc2suCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAorICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImZpbHRlcmluZyAlcyAleCAleCAleCAleCIsIGNtLnBhdGgoKS5jX3N0cigpLCBjbS5kb21haW4oKSwgYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtLmRvbWFpbigpICYgYW55KSwgKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSk7CisgICAgICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGFueSkgJiYgKChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkgPT0gKGFueSAmIGFsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soY20ucGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNESyA8PT4gQ29kZWMgMi4wIG1hcHBpbmdzLgorICAgICAqCisgICAgICogVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJldHRlciBtZXRob2RzIGFzIHRoaXMgZXhwb3NlcyB0aGUgaW5uZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gZ2V0S2V5cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWdNYXBwZXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IG1Db25maWdNYXBwZXJzOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBTdGFuZGFyZFBhcmFtczo6Tk9fTUFQUEVSUzsKKworCitDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCisgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorCit2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgeworICAgIHR5cGVkZWYgRG9tYWluIEQ7CisgICAgbVN0YW5kYXJkUGFyYW1zID0gc3RkOjptYWtlX3NoYXJlZDxTdGFuZGFyZFBhcmFtcz4oKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBhZGQgPQorICAgICAgICBbcGFyYW1zID0gbVN0YW5kYXJkUGFyYW1zXShjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgICAgICBwYXJhbXMtPmFkZChjbSk7CisgICAgfTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBkZXByZWNhdGVkID0gYWRkOworCisgICAgLy8gYWxsb3cgaW50MzIgb3IgZmxvYXQgU0RLIHZhbHVlcyBhbmQgcmVwcmVzZW50IHRoZW0gYXMgZmxvYXQKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBtYWtlRmxvYXQgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KWkzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZwVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbmVnYXRlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUsICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUICYgRDo6UkVBRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSwgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpQQVJBTSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IG1vZGU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmbW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZIGFuZCBuZXcgbW9kZXMKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfQklUUkFURV9NT0RFLCAiY29kZWQuYml0cmF0ZS1tb2RlIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GUkFNRV9SQVRFLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCAiY29kZWQubWF4LWZyYW1lLXNpemUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKworICAgIC8vIFJvdGF0aW9uCisgICAgLy8gTm90ZTogU0RLIHJvdGF0aW9uIGlzIGNsb2NrLXdpc2UsIHdoaWxlIEMyIHJvdGF0aW9uIGlzIGNvdW50ZXItY2xvY2std2lzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9WVUlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworCisgICAgLy8gYW5kcm9pZCAndmlkZW8tc2NhbGluZycKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl92aWRlby1zY2FsaW5nIiwgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6REVDT0RFUiAmIEQ6OlJBVykpOworCisgICAgLy8gQ29sb3IgQXNwZWN0cworICAgIC8vCisgICAgLy8gY29uZmlndXJlIGRlZmF1bHQgZm9yIGRlY29kZXJzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworCisgICAgLy8gcmVhZCBiYWNrIGZpbmFsIGZvciBkZWNvZGVyIG91dHB1dCAoYWxzbywgY29uZmlndXJlIGZpbmFsIGFzcGVjdHMgYXMgd2VsbC4gVGhpcyBzaG91bGQgYmUKKyAgICAvLyBvdmVyd3JpdHRlbiBiYXNlZCBvbiBjb2RlZC9kZWZhdWx0IHZhbHVlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29sb3IgYXNwZWN0cywgYnV0IGlzIHVzZWQKKyAgICAvLyBhcyBmaW5hbCB2YWx1ZXMgaWYgY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQgYXNwZWN0cyBhdCBhbGwpCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIGNvbmZpZ3VyZSBzb3VyY2UgYXNwZWN0cyBmb3IgZW5jb2RlcnMgYW5kIHJlYWQgdGhlbSBiYWNrIG9uIHRoZSBjb2RlZCghKSBwb3J0LgorICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIG11eGluZyB0aGUgZGVzaXJlZCBhc3BlY3RzIGludG8gdGhlIGNvbnRhaW5lci4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisKKyAgICAvLyByZWFkIGJhY2sgY29kZWQgYXNwZWN0cyBmb3IgZW5jb2RlcnMgKG9uIHRoZSByYXcgcG9ydCksIGJ1dCBhbHNvIGNvbmZpZ3VyZQorICAgIC8vIGRlc2lyZWQgYXNwZWN0cyBoZXJlLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gRGF0YXNwYWNlCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgQzJfUEFSQU1LRVlfREFUQV9TUEFDRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICAvLyBIRFIKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1heC1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5taW4tbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1jbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtY2xsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1mYWxsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWZhbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcoS0VZX0ZFQVRVUkVfKSArIEZFQVRVUkVfU2VjdXJlUGxheWJhY2ssCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TRUNVUkVfTU9ERSwgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGluZy5hZGQtY3NkLXRvLXN5bmMtZnJhbWVzIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIC8vIGNvbnZlcnQgdG8gdGltZXN0YW1wIGJhc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMLCAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICAgICAgaW50MzJfdCBpMzJWYWx1ZTsKKyAgICAgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KDEwMDAwMDApICogaTMyVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KGMyX21pbigxMDAwMDAwICogZnBWYWx1ZSArIDAuNSwgKGRvdWJsZSlJTlQ2NF9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIHByb3BlciBjb2RpbmcuZ29wIChhZGQgc3VwcG9ydCBmb3IgY2FsY3VsYXRpbmcgZ29wKQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJpLWZyYW1lLXBlcmlvZCIsICJjb2RpbmcuZ29wIiwgImludHJhLXBlcmlvZCIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCwgInBlcmlvZCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcucmVxdWVzdC1zeW5jIiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURSwgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNIHwgRDo6Q09ORklHKSAvLyB3cml0ZS1vbmx5CisgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIC8vIEMyIHByaW9yaXRpZXMgYXJlIGludmVydGVkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgQzJfUEFSQU1LRVlfUFJJT1JJVFksICAgICAgICAgICAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgICJjdHJsLm9wZXJhdGluZy1yYXRlIiwgICAgICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgImN0cmwucHJpb3JpdHkiLCAgICAgICAgICAgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfV0lEVEgsICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSEVJR0hULCAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1sZWZ0IiwgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAibGVmdCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXRvcCIsICAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ0b3AiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC13aWR0aCIsICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1oZWlnaHQiLCAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX1dJRFRILCAgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0hFSUdIVCwgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgLy8gUGl4ZWwgRm9ybWF0ICh1c2UgbG9jYWwga2V5IGZvciBhY3R1YWwgcGl4ZWwgZm9ybWF0IGFzIHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAvLyBTREsgbGF5b3V0cyBmb3IgZmxleGlibGUgZm9ybWF0IGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgU0RLIGNvbG9yIGZvcm1hdCBpbiB0aGUgbWVkaWEgZm9ybWF0KQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSwgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIHBvcnQgZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgICAgICBpbnQzMl90IHRvOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyID0gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwUHJvZmlsZShjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEVWRUwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJsZXZlbCIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyID0gTEVWRUxfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwTGV2ZWwoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExFVkVMX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcExldmVsKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0NVVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGVmZmVjdCB0eXBlICh0aGVzZSBtYXAgdG8gU0RLIHZhbHVlcykgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZhbHVlIGlzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9PRkY7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEU7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICsgMTsgLy8gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29tcGxleGl0eSIsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfQ09MVU1OUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJjb2x1bW5zIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX1JPV1MsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAicm93cyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9XSURUSCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX0hFSUdIVCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLmhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MQVRFTkNZLCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsICJ2YWx1ZSIpKTsKKworICAgIC8qIHN0aWxsIHRvIGRvCisgICAgY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKKworICAgICAgIG5vdCB5ZXQgdXNlZCBieSBNZWRpYUNvZGVjLCBidXQgZGVmaW5lZCBhcyBNZWRpYUZvcm1hdAorICAgIEtFWV9BVURJT19TRVNTSU9OX0lEIC8vIHdlIHVzZSAiYXVkaW8taHctc3luYyIKKyAgICBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEgKKyAgICAqLworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW4oQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUik7CisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kKEMyQ29tcG9uZW50OjpLSU5EX09USEVSKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyAmZG9tYWluLCAma2luZCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgZG9tYWluICYga2luZCBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUga2luZCBmcm9tIGNvbXBvbmVudCBuYW1lCisgICAgICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGRvbWFpbiBmcm9tIG1lZGlhIHR5cGUgKHBvcnQgKHByZWZlcnJlZCkgb3Igc3RyZWFtICMwKQorICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbURvbWFpbiA9IChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyA/IERvbWFpbjo6SVNfVklERU8gOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgPyBEb21haW46OklTX0lNQUdFIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPID8gRG9tYWluOjpJU19BVURJTyA6IERvbWFpbjo6T1RIRVJfRE9NQUlOKQorICAgICAgICAgICAgfCAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSID8gRG9tYWluOjpJU19ERUNPREVSIDoKKyAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IERvbWFpbjo6SVNfRU5DT0RFUiA6IERvbWFpbjo6T1RIRVJfS0lORCk7CisKKyAgICBtSW5wdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfREVDT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19JTlBVVCk7CisgICAgbU91dHB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19FTkNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX09VVFBVVCk7CisKKyAgICBBTE9HVigiZG9tYWluIGlzICUjeCAoJXUgJXUpIiwgbURvbWFpbiwgZG9tYWluLnZhbHVlLCBraW5kLnZhbHVlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBwYXJhbUluZGljZXM7CisgICAgc3dpdGNoIChraW5kLnZhbHVlKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZShmYWxzZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gIiI7CisgICAgfQorCisgICAgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtUGFyYW1EZXNjcyk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgbVBhcmFtRGVzY3Muc2l6ZSgpLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogbVBhcmFtRGVzY3MpIHsKKyAgICAgICAgbVN1cHBvcnRlZEluZGljZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBtUmVmbGVjdG9yID0gY2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIGlmIChtUmVmbGVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGFyYW0gcmVmbGVjdG9yIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIGVudW1lcmF0ZSBhbGwgZmllbGRzCisgICAgbVBhcmFtVXBkYXRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPigpOworICAgIG1QYXJhbVVwZGF0ZXItPmNsZWFyKCk7CisgICAgbVBhcmFtVXBkYXRlci0+c3VwcG9ydFdob2xlUGFyYW0oCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpDT1JFX0lOREVYKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbVBhcmFtRGVzY3MpOworCisgICAgLy8gVEVNUDogYWRkIHNvbWUgc3RhbmRhcmQgZmllbGRzIGV2ZW4gaWYgbm90IHJlZmxlY3RlZAorICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9JTklUX0RBVEEpOworICAgIH0KKyAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgfHwgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgIT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9DUk9QX1JFQ1QpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dCgwdSwgMXUsIDF1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUElYRUxfQVNQRUNUX1JBVElPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLCBDMl9QQVJBTUtFWV9ST1RBVElPTik7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfREFUQV9TUEFDRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8gc3Vic2NyaWJlIHRvIGFsbCBzdXBwb3J0ZWQgc3RhbmRhcmQgKGV4cG9zZWQpIHBhcmFtcworICAgIC8vIFRPRE86IGxpbWl0IHRoaXMgdG8gcGFyYW1zIHRoYXQgYXJlIGFjdHVhbGx5IGluIHRoZSBkb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZm9ybWF0S2V5cyA9IG1TdGFuZGFyZFBhcmFtcy0+Z2V0UGF0aHNGb3JEb21haW4oRG9tYWluKDEgPDwgMzApKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGb3JLZXlzKGZvcm1hdEtleXMsICZpbmRpY2VzKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisKKyAgICAvLyBhbHNvIHN1YnNjcmliZSB0byBzb21lIG5vbi1TREsgc3RhbmRhcmQgcGFyYW1ldGVycworICAgIC8vIGZvciBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBmb3Igb3V0cHV0IGJ1ZmZlciBhcnJheSBhbGxvY2F0aW9uCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBpbml0IGRhdGEgKENTRCkKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisgICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgd2hlbiBjb21wb25lbnRzIG5vIGxvbmdlciBjcmFzaCBvbiB0aGlzIGNvbmZpZworICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgJiYgZmFsc2UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXM7CisgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBtU3Vic2NyaWJlZEluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBzdWJzY3JpYmVUdW5pbmcgPQorICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdHM7CisgICAgICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5jb25maWcoeyBzdWJzY3JpYmVUdW5pbmcuZ2V0KCkgfSwgYmxvY2tpbmcsICZyZXN1bHRzKTsKKyAgICAgICAgaWYgKGMyRXJyICE9IEMyX09LICYmIGMyRXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBzdWJzY3JpYmUgdG8gcGFyYW1ldGVycyA9PiAlcyIsIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTdWJzY3JpYmVkIHRvICV6dSBwYXJhbXMiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSA9IG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIC8vIHF1ZXJ5IGFsbCBzdWJzY3JpYmVkIHBhcmFtZXRlcnMKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyhtU3Vic2NyaWJlZEluZGljZXMuYmVnaW4oKSwgbVN1YnNjcmliZWRJbmRpY2VzLmVuZCgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9NQVlfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0koInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyAoJXMpIiwgcXVlcmllZC5zaXplKCksIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgfQorCisgICAgdXBkYXRlQ29uZmlndXJhdGlvbihxdWVyaWVkLCBBTEwpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbikgeworICAgIEFMT0dWKCJ1cGRhdGluZyBjb25maWd1cmF0aW9uIHdpdGggJXp1IHBhcmFtcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCkpOworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChwICYmICpwKSB7CisgICAgICAgICAgICBhdXRvIGluc2VydGlvbiA9IG1DdXJyZW50Q29uZmlnLmVtcGxhY2UocC0+aW5kZXgoKSwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uLnNlY29uZCB8fCAqaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgIT0gKnApIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KHAtPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJhY2sgY2hhbmdlcyBpbiBzdXBwb3J0ZWQgKHJlZmxlY3RlZCBvciBsb2NhbCkgaW5kaWNlcworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYW4gdW5saXN0ZWQgY29uZmlnIHdhcyAlczogJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb24uc2Vjb25kID8gImFkZGVkIiA6ICJ1cGRhdGVkIiwgcC0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigidXBkYXRlZCBjb25maWd1cmF0aW9uIGhhcyAlenUgcGFyYW1zICglcykiLCBtQ3VycmVudENvbmZpZy5zaXplKCksCisgICAgICAgICAgICBjaGFuZ2VkID8gIkNIQU5HRUQiIDogIm5vIGNoYW5nZSIpOworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVGb3JtYXRzKGRvbWFpbik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbikgeworICAgIC8vIGdldCBhZGRyZXNzZXMgb2YgcGFyYW1zIGluIHRoZSBjdXJyZW50IGNvbmZpZworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBtQ3VycmVudENvbmZpZykgeworICAgICAgICBwYXJhbVBvaW50ZXJzLnB1c2hfYmFjayhpdC5zZWNvbmQuZ2V0KCkpOworICAgIH0KKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCByZWZsZWN0ZWQgPSBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbXMocGFyYW1Qb2ludGVycyk7CisgICAgQUxPR0QoImMyIGNvbmZpZyBpcyAlcyIsIHJlZmxlY3RlZC5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRvbWFpbiAmIG1JbnB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbUlucHV0Rm9ybWF0OworICAgICAgICBtSW5wdXRGb3JtYXQgPSBtSW5wdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOworICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIG91dHB1dCBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtT3V0cHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbU91dHB1dERvbWFpbikpOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVl9JRihjaGFuZ2VkLCAiZm9ybWF0KHMpIGNoYW5nZWQiKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0NvbmZpZzo6Z2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIHBvcnREb21haW4pIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBwb3J0RG9tYWluKSA9PSAwIC8vIGlucHV0LW91dHB1dC1jb2RlZC1yYXcKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBtRG9tYWluKSAhPSBtRG9tYWluIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIElTX1JFQUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSByZWZsZWN0ZWQuZmluZChjbS5wYXRoKCkpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlZmxlY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBjbS5tYXBUb01lc3NhZ2UoYzJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoYnVmVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHN0clZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIENvZGVjIDIuMCByZWN0IHRvIE1lZGlhRm9ybWF0IHJlY3QgYW5kIGFkZCBjcm9wIHJlY3QgaWYgbm90IHByZXNlbnQKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJmxlZnQpICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXdpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZ0b3ApICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgbGVmdCA+PSAwICYmIHdpZHRoID49MCAmJiB3aWR0aCA8PSBJTlQzMl9NQVggLSBsZWZ0CisgICAgICAgICAgICAgICAgJiYgdG9wID49IDAgJiYgaGVpZ2h0ID49MCAmJiBoZWlnaHQgPD0gSU5UMzJfTUFYIC0gdG9wKSB7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtbGVmdCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC10b3AiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3Atd2lkdGgiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtaGVpZ2h0IikpOworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGggLSAxLCB0b3AgKyBoZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCB0ZW1wb3JhbCBsYXllcmluZyB0byBzY2hlbWEKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nICpsYXllcmluZyA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpGcm9tKEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcgJiYgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPCBsYXllcmluZy0+bS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB3ZWJydGMgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC4yNWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMl0gPT0gLjZmKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJydGMudnA4LiV1LWxheWVyIiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUrJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmxheWVyQ291bnQgLSBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChwcmltYXJpZXMsIG1hdHJpeCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItcHJpbWFyaWVzIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1tYXRyaXgiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkYXRhc3BhY2UgZm9yIHJhdyBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IHNwZWNpZmllZCBieSBjb21wb25lbnQsIG9yIGlmCisgICAgICAgIC8vIHVzaW5nIHN1cmZhY2Ugd2l0aCB1bnNwZWNpZmllZCBhc3BlY3RzIChhcyB0aG9zZSBtdXN0IGJlIGRlZmF1bHRlZCB3aGljaCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRoZSBkYXRhc3BhY2UpCisgICAgICAgIGlmICgocG9ydERvbWFpbiAmIElTX1JBVykgJiYgKG1Eb21haW4gJiAoSVNfSU1BR0UgfCBJU19WSURFTykpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2U7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0cyA9IHsKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkCisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIG9yaWdBc3BlY3RzID0gYXNwZWN0czsKKyAgICAgICAgICAgIGlmIChtVXNpbmdTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGltYWdlIHNpemUgKGRlZmF1bHQgdG8gSEQpCisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IDEyODA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSA3MjA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0RGVmYXVsdENvZGVjQ29sb3JBc3BlY3RzSWZOZWVkZWQoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUmFuZ2UgIT0gb3JpZ0FzcGVjdHMubVJhbmdlCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVByaW1hcmllcyAhPSBvcmlnQXNwZWN0cy5tUHJpbWFyaWVzCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVRyYW5zZmVyICE9IG9yaWdBc3BlY3RzLm1UcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgIT0gb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcykgeworICAgICAgICAgICAgICAgIGRhdGFzcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbworCisgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsICZoZHIubWFzdGVyaW5nLnJlZC54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCAmaGRyLm1hc3RlcmluZy5yZWQueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsICZoZHIubWFzdGVyaW5nLmdyZWVuLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCAmaGRyLm1hc3RlcmluZy5ibHVlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCAmaGRyLm1hc3RlcmluZy5ibHVlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgJmhkci5tYXhDbGwpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsICZoZHIubWF4RmFsbCkpIHsKKyAgICAgICAgICAgIGlmIChoZHIubWFzdGVyaW5nLnJlZC54ID49IDAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPj0gMCAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPD0gNi41NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPj0gMCAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPj0gMCAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPD0gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIG1ldGE7CisgICAgICAgICAgICAgICAgbWV0YS5tSUQgPSBtZXRhLmtUeXBlMTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi54ID0gaGRyLm1hc3RlcmluZy5yZWQueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueSA9IGhkci5tYXN0ZXJpbmcucmVkLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnggPSBoZHIubWFzdGVyaW5nLmdyZWVuLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnkgPSBoZHIubWFzdGVyaW5nLmdyZWVuLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnggPSBoZHIubWFzdGVyaW5nLmJsdWUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueSA9IGhkci5tYXN0ZXJpbmcuYmx1ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy54ID0gaGRyLm1hc3RlcmluZy53aGl0ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy55ID0gaGRyLm1hc3RlcmluZy53aGl0ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJjb252ZXJ0ZWQgdG8gU0RLIHZhbHVlcyBhcyAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOworfQorCisvLy8gY29udmVydHMgYW4gQU1lc3NhZ2UgdmFsdWUgdG8gYSBQYXJhbVVwZGF0ZXIgdmFsdWUKK3N0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZmcm9tLCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICp0bykgeworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKworICAgIGlmIChmcm9tLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50NjRWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGJ1ZlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoc3RyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KEMyVmFsdWUoZmxvYXRWYWx1ZSkpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgLy8gY29udmVydCBkb3VibGUgdG8gZmxvYXQKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKChmbG9hdClkb3VibGVWYWx1ZSkpOworICAgIH0KKyAgICAvLyBpZ25vcmUgYWxsIG90aGVyIEFNZXNzYWdlIHR5cGVzCit9CisKKy8vLyByZWxheGVzIENvZGVjIDIuMCBzcGVjaWZpYyB2YWx1ZSB0eXBlcyB0byBTREsgdHlwZXMgKG1haW5seSByZW1vdmVzIHNpZ25lZG5lc3MgYW5kIGNvdW50ZXJuZXNzCisvLy8gZnJvbSAzMi82NC1iaXQgdmFsdWVzLikKK3N0YXRpYyB2b2lkIHJlbGF4VmFsdWVzKFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJml0ZW0pIHsKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAodm9pZClpdGVtLmZpbmQoJmMyVmFsdWUpOworICAgIGlmIChjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkgfHwgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgQ0NvZGVjQ29uZmlnOjpnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zXywgRG9tYWluIGNvbmZpZ0RvbWFpbikgY29uc3QgeworICAgIC8vIGNyZWF0ZSBhIG1vZGlmaWFibGUgY29weSBvZiBwYXJhbXMKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gcGFyYW1zXy0+ZHVwKCk7CisgICAgQUxPR1YoImZpbHRlcmluZyB3aXRoIGNvbmZpZyBkb21haW4gJXgiLCBjb25maWdEb21haW4pOworCisgICAgLy8gY29udmVydCBzb21lIG1hY3JvIHBhcmFtZXRlcnMgdG8gQ29kZWMgMi4wIHNwZWNpZmljIGV4cHJlc3Npb25zCisKKyAgICB7IC8vIG1ha2UgaS1mcmFtZS1pbnRlcnZhbCBmcmFtZSBiYXNlZAorICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImktZnJhbWUtcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVJhdGUgPD0gMCB8fCBpRnJhbWVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xIC8qIG5vIHN5bmMgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KWMyX21pbihpRnJhbWVJbnRlcnZhbCAqIGZyYW1lUmF0ZSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClJTlQzMl9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRG9tYWluID09IChJU19WSURFTyB8IElTX0VOQ09ERVIpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY2FwdHVyZS1yYXRlIGludG8gaW5wdXQtdGltZS1zdHJldGNoCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSwgY2FwdHVyZVJhdGU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPmZpbmRBc0Zsb2F0KCJ0aW1lLWxhcHNlLWZwcyIsICZjYXB0dXJlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcHR1cmVSYXRlID4gMCAmJiBmcmFtZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgICAvLyByZWZsZWN0IHRlbXBvcmFsIGxheWVyaW5nIGludG8gYSBiaW5hcnkgYmxvYgorICAgICAgICBBU3RyaW5nIHNjaGVtYTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZzY2hlbWEpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIGludCB0YWdzOworICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbGF5ZXJpbmc7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIDF1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjZmIH0sIDB1LCAydSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC40ZiwgLjZmIH0sIDB1LCAzdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuMjVmLCAuNGYsIC42ZiB9LCAwdSwgNHUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIG51bUxheWVycyArIG51bUJMYXllcnMsIG51bUJMYXllcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCBzY2hlbWEuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobGF5ZXJpbmcuZ2V0KCksIGxheWVyaW5nLT5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIE1lZGlhRm9ybWF0IHJlY3QgdG8gQ29kZWMgMi4wIHJlY3QKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3QgZW5kOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1yaWdodCIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXJpZ2h0Iik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC13aWR0aCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1ib3R0b20iLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1ib3R0b20iKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLWhlaWdodCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJnByaW1hcmllcywgJm1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1wcmltYXJpZXMiLCBwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJNZXRhOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJNZXRhKQorICAgICAgICAgICAgICAgICYmIGhkck1ldGEtPnNpemUoKSA9PSBzaXplb2YoSERSU3RhdGljSW5mbykpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gKm1ldGEgPSAoSERSU3RhdGljSW5mbyopaGRyTWV0YS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKG1ldGEtPm1JRCA9PSBtZXRhLT5rVHlwZTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCBtZXRhLT5zVHlwZTEubVIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsIG1ldGEtPnNUeXBlMS5tUi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCBtZXRhLT5zVHlwZTEubUcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgbWV0YS0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgbWV0YS0+c1R5cGUxLm1CLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgbWV0YS0+c1R5cGUxLm1CLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsIG1ldGEtPnNUeXBlMS5tVy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCBtZXRhLT5zVHlwZTEubVcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCBtZXRhLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeVN0cmljdCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfc3RyaWN0X3R5cGUiLCBmYWxzZSk7CisgICAgLy8gdGhpcyBpcyB0byBhbGxvdyB2ZW5kb3JzIHRvIHVzZSB0aGUgd3Jvbmcgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5TGF4ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19sYXhfdHlwZSIsIGZhbHNlKTsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBmaWx0ZXJlZDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGFyYW1zLT5jb3VudEVudHJpZXMoKTsgKytpeCkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBBU3RyaW5nIG5hbWUgPSBwYXJhbXMtPmdldEVudHJ5TmFtZUF0KGl4LCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtc2dJdGVtID0gcGFyYW1zLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSBpdGVtOworICAgICAgICBjb252ZXJ0KG1zZ0l0ZW0sICZpdGVtKTsgLy8gY29udmVydCBpdGVtIHRvIHBhcmFtIHVwZGF0ZXIgaXRlbQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZlbmRvci4iKSkgeworICAgICAgICAgICAgLy8gdmVuZG9yIHBhcmFtcyBwYXNzIHRocm91Z2ggYXMgaXMKKyAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UobmFtZS5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHN0YW5kYXJkIHBhcmFtZXRlcnMgbWF5IGdldCBtb2RpZmllZCwgZmlsdGVyZWQgb3IgZHVwbGljYXRlZAorICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtU3RhbmRhcmRQYXJhbXMtPmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkobmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgLy8gbm90ZTogd2UgaWdub3JlIHBvcnQgZG9tYWluIGZvciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgY29uZmlnRG9tYWluKQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNtLmRvbWFpbigpICYgbURvbWFpbikgPT0gbURvbWFpbikgeworICAgICAgICAgICAgICAgIC8vIG1hcCBhcml0aG1ldGljIHZhbHVlcywgcGFzcyB0aHJvdWdoIHN0cmluZyBvciBidWZmZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IG1hcCBzZXR0aW5ncyB3aXRoIG1hcHBlcnMgYXMgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIDw9PiB1bnNpZ25lZCBtYXBwZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZSBwcmVjaXNlIGFib3V0IHNpZ25lZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeVN0cmljdCB8fCBjbS5tYXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGNtLm1hcEZyb21NZXNzYWdlKHBhcmFtcy0+Z2V0RW50cnlBdChpeCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGFsbG93IHRvIHJlbGF4IHR5cGUgc3RyaWN0bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlMYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhWYWx1ZXMoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShjbS5wYXRoKCksIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmaWx0ZXJlZCAlcyB0byAlcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKKyAgICAgICAgICAgIGZpbHRlcmVkLmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgIHJldHVybiBmaWx0ZXJlZDsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBjb25maWdEb21haW4sCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3QgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBwYXJhbXMgPSBnZXRSZWZsZWN0ZWRGb3JtYXQoc2RrUGFyYW1zLCBjb25maWdEb21haW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UocGFyYW1zLCAmaW5kaWNlcyk7CisgICAgaWYgKGluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgibm8gcmVjb2duaXplZCBwYXJhbXMgaW46ICVzIiwgcGFyYW1zLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25maWdVcGRhdGUtPmNsZWFyKCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN1cHBvcnRlZEluZGljZXM7CisgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IGluZGljZXMpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGl4KSkgeworICAgICAgICAgICAgc3VwcG9ydGVkSW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpeCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdVcGRhdGUtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCppdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgfSwgc3VwcG9ydGVkSW5kaWNlcywgYmxvY2tpbmcsIGNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLT5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKworICAgIGlmIChjb25maWdVcGRhdGUtPnNpemUoKSkgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShwYXJhbXMsIGNvbmZpZ1VwZGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzZXRQYXJhbWV0ZXJzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKGNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtVmVjdG9yOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBjb21wb25lbnQgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbVZlY3Rvci5wdXNoX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2socGFyYW0tPmluZGV4KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBtTG9jYWxQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDMlBhcmFtOjpDb3B5KCpwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdG9yKGNvcHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVkIGxvY2FsIHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW3BhcmFtLT5pbmRleCgpXSA9IHN0ZDo6bW92ZShjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBzZXQgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgc3Vic2NyaWJlZCBwYXJhbSBpbmRpY2VzCisgICAgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29tcG9uZW50LCBpbmRpY2VzLCBibG9ja2luZyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5jb25maWcocGFyYW1WZWN0b3IsIGJsb2NraW5nLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImNvbmZpZyBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBub24tZmF0YWwuCisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICBzd2l0Y2ggKGZhaWx1cmUtPmZhaWx1cmUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgICAgICAgICAgQUxPR0QoIkJhZCBwYXJhbWV0ZXIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsdXJlID0gJWQiLCBpbnQoZmFpbHVyZS0+ZmFpbHVyZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmUtcXVlcnkgcGFyYW1ldGVyIHZhbHVlcyBpbiBjYXNlIGNvbmZpZyBjb3VsZCBub3QgdXBkYXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY3VycmVudAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgYmxvY2tpbmcsICZjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKyAgICAodm9pZCl1cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZ1VwZGF0ZSwgQUxMKTsKKworICAgIC8vIFRPRE86IGVycm9yIHZhbHVlCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgQzJQYXJhbSAqQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWZlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfQ09ORklHX0hfCisjZGVmaW5lIENfQ09ERUNfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBTdGFuZGFyZFBhcmFtczsKKworLyoqCisgKiBTdHJ1Y3QgbWFuYWdpbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIENDb2RlYy4KKyAqLworc3RydWN0IENDb2RlY0NvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBEb21haW4gY29uc2lzdHMgb2YgYSBiaXRtYXNrIGRpdmlkZWQgaW50byBmaWVsZHMsIGFuZCBzcGVjaWZpZXJzIHdvcmsgYnkgZXhjbHVkaW5nIG90aGVyCisgICAgICogdmFsdWVzIGluIHRob3NlIGRvbWFpbnMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgZG9tYWlucyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIElTXyBjb25zdGFudHMsIGUuZy4KKyAgICAgKiBJU19ERUNPREVSIHwgSVNfQVVESU8uCisgICAgICoKKyAgICAgKiBDb25maWcgc3BlY2lmaWVycyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIG1hc2sgY29uc3RhbnRzLCBhbmQKKyAgICAgKiBhbmQtaW5nIHRoZXNlIGdyb3VwczogZS5nLiAoREVDT0RFUiB8IEVOQ09ERVIpICYgQVVESU8uCisgICAgICoKKyAgICAgKiBUaGUgbmFtaW5nIG9mIHRoZXNlIGNvbnN0YW50cyB3YXMgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBtYXNrIG5hbWVzIGFzIHRoZXNlIGFyZSB1c2VkIG1vcmUKKyAgICAgKiBjb21tb25seSBhcyBtYXNrcy4KKyAgICAgKi8KKyAgICBlbnVtIERvbWFpbiA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiAoZG9tYWluICYga2luZCkKKyAgICAgICAgR1VBUkRfQklUICAgPSAoMSA8PCAxKSwgICAvLy88IHRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IGFjY2lkZW50YWwgJiYgb3IgfHwgdXNhZ2UKKyAgICAgICAgSVNfQVVESU8gICAgPSAoMSA8PCAyKSwgICAvLy88IGZvciBhdWRpbyBjb2RlY3MKKyAgICAgICAgSVNfVklERU8gICAgPSAoMSA8PCAzKSwgICAvLy88IGZvciB2aWRlbyBjb2RlY3MKKyAgICAgICAgSVNfSU1BR0UgICAgPSAoMSA8PCA0KSwgICAvLy88IGZvciBpbWFnZSBjb2RlY3MKKyAgICAgICAgT1RIRVJfRE9NQUlOID0gKDEgPDwgNSksICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgSVNfRU5DT0RFUiAgPSAoMSA8PCA2KSwgICAvLy88IGZvciBlbmNvZGVycworICAgICAgICBJU19ERUNPREVSICA9ICgxIDw8IDcpLCAgIC8vLzwgZm9yIGRlY29kZXJzCisgICAgICAgIE9USEVSX0tJTkQgID0gKDEgPDwgOCksICAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIC8vIGNvbmZpZyBkb21haW4KKyAgICAgICAgSVNfUEFSQU0gICAgPSAoMSA8PCA5KSwgICAvLy88IGZvciBzZXRQYXJhbWV0ZXIKKyAgICAgICAgSVNfQ09ORklHICAgPSAoMSA8PCAxMCksICAvLy88IGZvciBjb25maWd1cmUKKyAgICAgICAgSVNfUkVBRCAgICAgPSAoMSA8PCAxMSksICAvLy88IGZvciBnZXRGb3JtYXQKKworICAgICAgICAvLyBwb3J0IGRvbWFpbgorICAgICAgICBJU19JTlBVVCAgICA9ICgxIDw8IDEyKSwgIC8vLzwgZm9yIGlucHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfT1VUUFVUICAgPSAoMSA8PCAxMyksICAvLy88IGZvciBvdXRwdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19SQVcgICAgICA9ICgxIDw8IDE0KSwgIC8vLzwgZm9yIHJhdyBwb3J0IChpbnB1dC1lbmNvZGVyLCBvdXRwdXQtZGVjb2RlcikKKyAgICAgICAgSVNfQ09ERUQgICAgPSAoMSA8PCAxNSksICAvLy88IGZvciBjb2RlZCBwb3J0IChpbnB1dC1kZWNvZGVyLCBvdXRwdXQtZW5jb2RlcikKKworICAgICAgICBBTEwgICAgID0gfjBVLAorICAgICAgICBOT05FICAgID0gMCwKKworICAgICAgICBBVURJTyAgID0gfihJU19JTUFHRSB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgVklERU8gICA9IH4oSVNfQVVESU8gfCBJU19JTUFHRSB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIElNQUdFICAgPSB+KElTX0FVRElPIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorCisgICAgICAgIERFQ09ERVIgPSB+KElTX0VOQ09ERVIgfCBPVEhFUl9LSU5EKSwKKyAgICAgICAgRU5DT0RFUiA9IH4oSVNfREVDT0RFUiB8IE9USEVSX0tJTkQpLAorCisgICAgICAgIFBBUkFNICAgPSB+KElTX0NPTkZJRyB8IElTX1JFQUQpLAorICAgICAgICBDT05GSUcgID0gfihJU19QQVJBTSAgfCBJU19SRUFEKSwKKyAgICAgICAgUkVBRCAgICA9IH4oSVNfQ09ORklHIHwgSVNfUEFSQU0pLAorCisgICAgICAgIElOUFVUICAgPSB+KElTX09VVFBVVCB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgT1VUUFVUICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBSQVcgICAgID0gfihJU19JTlBVVCAgfCBJU19PVVRQVVQgfCBJU19DT0RFRCksCisgICAgICAgIENPREVEICAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX09VVFBVVCksCisgICAgfTsKKworICAgIC8vIHRoaW5ncyByZXF1aXJlZCB0byBtYW5hZ2UgZm9ybWF0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1QYXJhbURlc2NzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4gbVBhcmFtVXBkYXRlcjsKKworICAgIERvbWFpbiBtRG9tYWluOyAvLyBjb21wb25lbnQgZG9tYWluCisgICAgRG9tYWluIG1JbnB1dERvbWFpbjsgLy8gaW5wdXQgcG9ydCBkb21haW4KKyAgICBEb21haW4gbU91dHB1dERvbWFpbjsgLy8gb3V0cHV0IHBvcnQgZG9tYWluCisgICAgc3RkOjpzdHJpbmcgbUNvZGluZ01lZGlhVHlwZTsgIC8vIG1lZGlhIHR5cGUgb2YgdGhlIGNvZGVkIHN0cmVhbQorCisgICAgLy8gc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhbmRhcmRQYXJhbXM+IG1TdGFuZGFyZFBhcmFtczsKKworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3VwcG9ydGVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdWJzY3JpYmVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHRvIHN1YnNjcmliZSB0bworICAgIHNpemVfdCBtU3Vic2NyaWJlZEluZGljZXNTaXplOyAvLy88IGNvdW50IG9mIGN1cnJlbnRseSBzdWJzY3JpYmVkIGluZGljZXMKKworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICBib29sIG1Vc2luZ1N1cmZhY2U7IC8vLzwgdXNpbmcgaW5wdXQgb3Igb3V0cHV0IHN1cmZhY2UKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWc+IG1JU0NvbmZpZzsKKworICAgIC8vLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBVcGRhdGVkIGFmdGVyIGNvbmZpZ3VyZSgpIGFuZCBiYXNlZCBvbiBjb25maWdVcGRhdGUgaW4KKyAgICAvLy8gb25Xb3JrRG9uZQorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1DdXJyZW50Q29uZmlnOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYpPiBMb2NhbFBhcmFtVmFsaWRhdG9yOworCisgICAgLy8vIFBhcmFtZXRlciBpbmRpY2VzIHRyYWNrZWQgaW4gY3VycmVudCBjb25maWcgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgIC8vLyB0aGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiByZW1haW4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAvLy8gYXMgc3VjaCwgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGRlcGVuZGVuY2llcy4gVE9ETzogdXNlIEMySW50ZXJmYWNlSGVscGVyIGZvciB0aGlzLgorICAgIC8vLyBGb3Igbm93IHN1cHBvcnQgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBMb2NhbFBhcmFtVmFsaWRhdG9yPiBtTG9jYWxQYXJhbXM7CisKKyAgICBDQ29kZWNDb25maWcoKTsKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKKyAgICAvLy8gcmVmbGVjdGVkIHBhcmFtIGhlbHBlciwgZG9tYWluLCBzdGFuZGFyZCBwYXJhbXMsIGFuZCBzdWJzY3JpYmVzIHRvIHN0YW5kYXJkCisgICAgLy8vIGluZGljZXMuCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZQorICAgICAqIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpbiBjYXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRTsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSB8fCBtTG9jYWxQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoImlnbm9yaW5nIGxvY2FsIHBhcmFtICVzICglI3gpIGFzIGl0IGlzIGFscmVhZHkgJXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICh1aW50MzJfdClpbmRleCwgbVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpID8gInN1cHBvcnRlZCIgOiAibG9jYWwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCBvciBhbHJlYWR5IGFkZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIHR5cGVkIHZhbGlkYXRvciBpbnRvIHVudHlwZWQgdmFsaWRhdG9yCisgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yOworICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgdmFsaWRhdG9yID0gW3ZhbGlkYXRvcl9dKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCl7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiB0eXBlZChzdGF0aWNfY2FzdDxUKj4ocC5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHR5cGVkCisgICAgICAgICAgICAgICAgaWYgKFQ6OkZyb20odHlwZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRvcl8odHlwZWQpOworICAgICAgICAgICAgICAgICAgICBwLnJlc2V0KHR5cGVkLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbUxvY2FsUGFyYW1zLmVtcGxhY2UoaW5kZXgsIHZhbGlkYXRvcik7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08VD4obmFtZSwgYXR0cmliKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGVmYXVsdF8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBpZiAoYWRkTG9jYWxQYXJhbTxUPihuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pKSB7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHZhbGlkYXRvcl8oZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImRlZmF1bHQgdmFsdWUgZm9yICVzIGlzIGludmFsaWQgPT4gJXMiLCBuYW1lLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbVDo6UEFSQU1fVFlQRV0gPSBzdGQ6Om1vdmUoZGVmYXVsdF8pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgVCAqZGVmYXVsdF8sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NhbFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxUPihkZWZhdWx0XyksIG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXyk7CisgICAgfQorCisgICAgLy8vIEFwcGxpZXMgY29uZmlndXJhdGlvbiB1cGRhdGVzLCBhbmQgdXBkYXRlcyBmb3JtYXQgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdHMgd2VyZSB1cGRhdGVkCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pOworCisgICAgLy8vIFVwZGF0ZXMgZm9ybWF0cyBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBmb3JtYXRzIGhhdmUgY2hhbmdlZC4KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKTsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgU0RLIGNvbmZpZ3VyYXRpb25zIGluIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkb21haW4uCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBkb21haW4sCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSB0byB0aGUgY29tcG9uZW50LgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyk7CisKKyAgICAvLy8gUXVlcmllcyBzdWJzY3JpYmVkIGluZGljZXMgKHdoaWNoIGNvbnRhaW5zIGFsbCBTREstZXhwb3NlZCB2YWx1ZXMpIGFuZCB1cGRhdGVzCisgICAgLy8vIGlucHV0L291dHB1dCBmb3JtYXRzLgorICAgIHN0YXR1c190IHF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvLy8gUXVlcmllcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAvLy8gcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAgY29uc3QgQzJQYXJhbSAqZ2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhbmQgaWYgdGhleSBjaGFuZ2UuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgV2F0Y2hlciB7CisgICAgICAgIH5XYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAgICAgICBib29sIGhhc0NoYW5nZWQoKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgJiYgbVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZSAhPSAqbVZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbVZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgaXQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IHVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdhdGNoZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IENDb2RlY0NvbmZpZyAqcGFyZW50KQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCksIG1JbmRleChpbmRleCkgeworICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RydWN0IENDb2RlY0NvbmZpZzsKKworICAgICAgICBjb25zdCBDQ29kZWNDb25maWcgKm1QYXJlbnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiBtVmFsdWU7CisgICAgICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdGNoZXIgb2JqZWN0IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFdhdGNoZXI8VD4gd2F0Y2goQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFKSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleC50eXBlKCkgIT0gVDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHZvaWQgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLy8gQWRkcyBpbmRpY2VzIHRvIHRoZSBzdWJzY3JpYmVkIGluZGljZXMsIGFuZCB1cGRhdGVkIHN1YnNjcmlwdGlvbiB0byBjb21wb25lbnQKKyAgICAvLy8gXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgIHN0YXR1c190IHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgc3A8QU1lc3NhZ2U+IGdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gZG9tYWluKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhbiBBTWVzc2FnZSB0byBhIGxpc3Qgb2YgcGF0aC1iYXNlZCBDb2RlYworICAgICAqIDIuMCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICovCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmY29uZmlnLCBEb21haW4gZG9tYWluKSBjb25zdDsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyhDQ29kZWNDb25maWc6OkRvbWFpbikKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNTczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENvZGVjMkJ1ZmZlcgorCitib29sIENvZGVjMkJ1ZmZlcjo6Y2FuQ29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICBpZiAoY29uc3RfY2FzdDxDb2RlYzJCdWZmZXIgKj4odGhpcyktPmJhc2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA+IDF1KSB7CisgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIGNvcHkgbW9yZSB0aGFuIG9uZSBibG9ja3MuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgLy8gSXQgd29uJ3QgZml0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjMkJ1ZmZlcjo6Y29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2FuQ29weUxpbmVhcigpIGNoZWNrcyBwYXNzZWQuCisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID09IDB1CisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgc2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJFcnJvciB3aGlsZSBtYXBwaW5nOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuY2FwYWNpdHkoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkMyQ29uc3RMaW5lYXJCbG9jayBsaWVkIC0tLSBpdCBhY3R1YWxseSBkb2Vzbid0IGZpdDogdmlldygldSkgPiB0aGlzKCV6dSkiLAorICAgICAgICAgICAgICAgIHZpZXcuY2FwYWNpdHkoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KGJhc2UoKSwgdmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgc2V0UmFuZ2UoMCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzJCdWZmZXI6OnNldEltYWdlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKSB7CisgICAgbUltYWdlRGF0YSA9IGltYWdlRGF0YTsKK30KKworLy8gTG9jYWxMaW5lYXJCdWZmZXIKKworYm9vbCBMb2NhbExpbmVhckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FuQ29weUxpbmVhcihidWZmZXIpOworfQorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHJldHVybiBjb3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKKy8vIER1bW15Q29udGFpbmVyQnVmZmVyCisKK3N0YXRpYyB1aW50OF90IHNEdW1teUJ5dGVbMV0gPSB7IDAgfTsKKworRHVtbXlDb250YWluZXJCdWZmZXI6OkR1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc0R1bW15Qnl0ZSwgMSkpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpIHsKKyAgICBzZXRSYW5nZSgwLCBidWZmZXIgPyAxIDogMCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gRHVtbXlDb250YWluZXJCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1CdWZmZXJSZWY7Cit9CisKK2Jvb2wgRHVtbXlDb250YWluZXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICBzZXRSYW5nZSgwLCBtQnVmZmVyUmVmID8gMSA6IDApOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPExpbmVhckJsb2NrQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgQzJXcml0ZVZpZXcgd3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgaWYgKHdyaXRlVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHdyaXRlVmlldyksIGJsb2NrKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihtQmxvY2stPnNoYXJlKG9mZnNldCgpLCBzaXplKCksIEMyRmVuY2UoKSkpOworfQorCitib29sIExpbmVhckJsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworTGluZWFyQmxvY2tCdWZmZXI6OkxpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJXcml0ZVZpZXcmJiB3cml0ZVZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcih3cml0ZVZpZXcuZGF0YSgpLCB3cml0ZVZpZXcuc2l6ZSgpKSksCisgICAgICBtV3JpdGVWaWV3KHdyaXRlVmlldyksCisgICAgICBtQmxvY2soYmxvY2spIHsKK30KKworLy8gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3KGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpKTsKKyAgICBpZiAocmVhZFZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHJlYWRWaWV3KSwgYnVmZmVyKTsKK30KKworQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIEMyUmVhZFZpZXcmJiByZWFkVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoCisgICAgICAgICAgICAvLyBOT1RFOiBBQnVmZmVyIG9ubHkgdGFrZXMgbm9uLWNvbnN0IHBvaW50ZXIgYnV0IHRoaXMgZGF0YSBpcworICAgICAgICAgICAgLy8gICAgICAgc3VwcG9zZWQgdG8gYmUgcmVhZC1vbmx5LgorICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KHJlYWRWaWV3LmRhdGEoKSksIHJlYWRWaWV3LmNhcGFjaXR5KCkpKSwKKyAgICAgIG1SZWFkVmlldyhyZWFkVmlldyksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworLy8gR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcgorCituYW1lc3BhY2UgeworCitjbGFzcyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgQzJHcmFwaGljVmlldyA8PT4gTWVkaWFJbWFnZSBjb252ZXJ0ZXIKKyAgICAgKgorICAgICAqIFxwYXJhbSB2aWV3IEMyR3JhcGhpY1ZpZXcgb2JqZWN0CisgICAgICogXHBhcmFtIGNvbG9yRm9ybWF0IGRlc2lyZWQgU0RLIGNvbG9yIGZvcm1hdCBmb3IgdGhlIE1lZGlhSW1hZ2UgKGlmIHRoaXMgaXMgYSBmbGV4aWJsZSBmb3JtYXQsCisgICAgICogICAgICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzaW1wbHkgcmVwcmVzZW50IHRoZSBncmFwaGljIHZpZXcgYXMgYSBmbGV4aWJsZSBTREsgZm9ybWF0CisgICAgICogICAgICAgIHdpdGhvdXQgYSBtZW1jcHkpCisgICAgICovCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcigKKyAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGludDMyX3QgY29sb3JGb3JtYXQpCisgICAgICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgICAgICBtVmlldyh2aWV3KSwKKyAgICAgICAgICBtV2lkdGgodmlldy53aWR0aCgpKSwKKyAgICAgICAgICBtSGVpZ2h0KHZpZXcuaGVpZ2h0KCkpLAorICAgICAgICAgIG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCisgICAgICAgICAgbUFsbG9jYXRlZERlcHRoKDApLAorICAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgICBtTWVkaWFJbWFnZShuZXcgQUJ1ZmZlcihzaXplb2YoTWVkaWFJbWFnZTIpKSkgeworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB2aWV3LmVycm9yKCkgPSAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lZGlhSW1hZ2UyICptZWRpYUltYWdlID0gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICAgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IDAgcGxhbmVzIik7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbXNldChtZWRpYUltYWdlLCAwLCBzaXplb2YoKm1lZGlhSW1hZ2UpKTsKKyAgICAgICAgbUFsbG9jYXRlZERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aDsKKyAgICAgICAgdWludDMyX3QgYml0RGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmJpdERlcHRoOworCisgICAgICAgIC8vIGFsaWduIHdpZHRoIGFuZCBoZWlnaHQgdG8gc3VwcG9ydCBzdWJzYW1wbGluZyBjbGVhbmx5CisgICAgICAgIHVpbnQzMl90IG1TdHJpZGUgPSBhbGlnbihtV2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICB1aW50MzJfdCBtVlN0cmlkZSA9IGFsaWduKG1IZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgeyAgLy8gdHJ5IHRvIG1hcCBkaXJlY3RseS4gY2hlY2sgaWYgdGhlIHBsYW5lcyBhcmUgbmVhciBvbmUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZVNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBtaW5PZmZzZXQgPSBwbGFuZS5taW5PZmZzZXQobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGFuIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IGdyYWxsb2MgZG9lcyBhc3N1bWUgYSBjb250aWd1b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Sb3dJbmMgPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLCBtYXhQdHIgLSBtaW5QdHIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKiA1IC8gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aCA9IGJpdERlcHRoOworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGhBbGxvY2F0ZWQgPSBtQWxsb2NhdGVkRGVwdGg7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicmlnaHRTaGlmdCB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLnJpZ2h0U2hpZnQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoID4gOCAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IEMyUGxhbmVJbmZvOjpOQVRJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZW5kaWFubmVzcyB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLmVuZGlhbm5lc3MpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IG1BbGxvY2F0ZWREZXB0aCB8fCBwbGFuZS5iaXREZXB0aCAhPSBiaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaWZmZXJlbnQgYWxsb2NhdGVkRGVwdGgvYml0RGVwdGggcGVyIHBsYW5lIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJTaXplICs9IG1TdHJpZGUgKiBtVlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbUluaXRDaGVjazsgfQorCisgICAgdWludDMyX3QgYmFja0J1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQmFja0J1ZmZlclNpemU7IH0KKworICAgIC8qKgorICAgICAqIFdyYXAgQzJHcmFwaGljVmlldyB1c2luZyBhIE1lZGlhSW1hZ2UyLiBOb3RlIHRoYXQgaWYgbm90IHdyYXBwZWQsIHRoZSBjb250ZW50IGlzIG5vdCBtYXBwZWQKKyAgICAgKiBpbiB0aGlzIGZ1bmN0aW9uIC0tLSB0aGUgY2FsbGVyIHNob3VsZCB1c2UgQ29weUdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2UoKSBmdW5jdGlvbiB0byBjb3B5IHRoZQorICAgICAqIGRhdGEgaW50byBhIGJhY2tpbmcgYnVmZmVyIGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIG1lZGlhIGJ1ZmZlci4gVGhpcyBpcyBudWxsIGlmIHdyYXBwaW5nIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiB3cmFwKCkgY29uc3QgeworICAgICAgICBpZiAobUJhY2tCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgc2V0QmFja0J1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYmFja0J1ZmZlcikgeworICAgICAgICBpZiAoYmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhY2tCdWZmZXItPmNhcGFjaXR5KCkgPCBtQmFja0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBiYWNrQnVmZmVyLT5zZXRSYW5nZSgwLCBtQmFja0J1ZmZlclNpemUpOworICAgICAgICBtQmFja0J1ZmZlciA9IGJhY2tCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgQzJHcmFwaGljVmlldyB0byBNZWRpYUltYWdlMi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb3B5VG9NZWRpYUltYWdlKCkgeworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltYWdlQ29weShtQmFja0J1ZmZlci0+YmFzZSgpLCBnZXRNZWRpYUltYWdlKCksIG1WaWV3KTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbU1lZGlhSW1hZ2U7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgY29uc3QgQzJHcmFwaGljVmlldyBtVmlldzsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Db2xvckZvcm1hdDsgIC8vLzwgU0RLIGNvbG9yIGZvcm1hdCBmb3IgTWVkaWFJbWFnZQorICAgIHNwPEFCdWZmZXI+IG1XcmFwcGVkOyAgLy8vPCB3cmFwcGVkIGJ1ZmZlciAoaWYgd2UgY2FuIG1hcCBDMkJ1ZmZlciB0byBhbiBBQnVmZmVyKQorICAgIHVpbnQzMl90IG1BbGxvY2F0ZWREZXB0aDsKKyAgICB1aW50MzJfdCBtQmFja0J1ZmZlclNpemU7CisgICAgc3A8QUJ1ZmZlcj4gbU1lZGlhSW1hZ2U7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBtQWxsb2M7CisKKyAgICBzcDxBQnVmZmVyPiBtQmFja0J1ZmZlcjsgICAgLy8vPCBiYWNraW5nIGJ1ZmZlciBpZiB3ZSBoYXZlIHRvIGNvcHkgQzJCdWZmZXIgPD0+IEFCdWZmZXIKKworICAgIE1lZGlhSW1hZ2UyICpnZXRNZWRpYUltYWdlKCkgeworICAgICAgICByZXR1cm4gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gR3JhcGhpY0Jsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBDMkdyYXBoaWNWaWV3IHZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJDMkdyYXBoaWNCbG9jazo6bWFwIGZhaWxlZDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcih2aWV3LCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IGNvbnZlcnRlci53cmFwKCk7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyIGZhaWxlZCB0byBzZXQgYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHdyYXBwZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIGNvbnZlcnRlci5pbWFnZURhdGEoKSwKKyAgICAgICAgICAgIHdyYXBwZWQpOworfQorCitHcmFwaGljQmxvY2tCdWZmZXI6OkdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgYm9vbCB3cmFwcGVkKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgYnVmZmVyKSwKKyAgICAgIG1WaWV3KHZpZXcpLAorICAgICAgbUJsb2NrKGJsb2NrKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgdWludDMyX3Qgd2lkdGggPSBtVmlldy53aWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1WaWV3LmhlaWdodCgpOworICAgIGlmICghbVdyYXBwZWQpIHsKKyAgICAgICAgKHZvaWQpSW1hZ2VDb3B5KG1WaWV3LCBiYXNlKCksIGltYWdlRGF0YSgpKTsKKyAgICB9CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbUJsb2NrLT5zaGFyZShDMlJlY3Qod2lkdGgsIGhlaWdodCksIEMyRmVuY2UoKSkpOworfQorCisvLyBHcmFwaGljTWV0YWRhdGFCdWZmZXIKK0dyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6R3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2MpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpKSwKKyAgICAgIG1BbGxvYyhhbGxvYykgeworICAgICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKSktPnBCdWZmZXIgPSBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyNpZm5kZWYgX19MUDY0X18KKyAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICptZXRhID0gKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYXNlKCk7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIgKiltZXRhLT5wQnVmZmVyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiVmlkZW9OYXRpdmVNZXRhZGF0YSBjb250YWlucyBudWxsIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBBTE9HVigiVmlkZW9OYXRpdmVNZXRhZGF0YTogJWR4JWQiLCBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCk7CisgICAgQzJIYW5kbGUgKmhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICBidWZmZXItPndpZHRoLAorICAgICAgICAgICAgYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICBidWZmZXItPnN0cmlkZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvYy0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHdyYXAgVmlkZW9OYXRpdmVNZXRhZGF0YSBpbnRvIEMyR3JhcGhpY0FsbG9jYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICBtZXRhLT5wQnVmZmVyID0gMDsKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKKyNlbHNlCisgICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGFCdWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSB2aWV3LgorICAgICAgICBob2xkZXIgPSBzdGQ6Om1vdmUodmlldyk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2Mod2lkdGggKiBoZWlnaHQgKiA0KSk7CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBmYWxzZSk7Cit9CisKK0NvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgIGJvb2wgd3JhcHBlZCkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIGFCdWZmZXIpLAorICAgICAgbVZpZXcoc3RkOjptb3ZlKHZpZXcpKSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICBtVmlldy5yZXNldCgpOworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKG1XcmFwcGVkIHx8IG1CdWZmZXJSZWYpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiAlc3dyYXBwZWQgOyBidWZmZXIgcmVmICVzIiwKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA/ICIiIDogIm5vdCAiLCBtQnVmZmVyUmVmID8gImV4aXN0cyIgOiAiZG9lc24ndCBleGlzdCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogYnVmZmVyIHByZWNvbmRpdGlvbiB1bnNhdGlzZmllZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogdG9vIG1hbnkgYmxvY2tzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYmFzZSgpLCBjYXBhY2l0eSgpKTsKKyAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGFCdWZmZXIpKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogc2V0IGJhY2sgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDYxOGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbUltYWdlRGF0YTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgKi8KK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgd2l0aCBsb2NhbCBsaW5lYXIgYnVmZmVyIGZvcgorICAgICAqIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqLworICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBHcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBncmFwaGljIEMyQnVmZmVyIG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBleHBvc2VzIHRoZSB1bmRlcmx5aW5nIGJpdHMgdmlhIGFjY2Vzc29yIEFQSXMgYW5kICJpbWFnZS1kYXRhIgorICogbWV0YWRhdGEsIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhdCBhbGxvY2F0aW9uIHRpbWUuCisgKi8KK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKiBJZiB8YnVmZmVyfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3aGljaCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggbm8gd3JhcHBpbmcgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3A8QUJ1ZmZlcj4gbUltYWdlRGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyTGluZWFyQmxvY2sgZm9yIGNvbXBvbmVudAorICogYW5kIElNZW1vcnkgZm9yIGNsaWVudC4gVW5kZXJseWluZyBDMkxpbmVhckJsb2NrIHdvbid0IGJlIG1hcHBlZCBmb3Igc2VjdXJlCisgKiB1c2VjYXNlcy4uCisgKi8KK2NsYXNzIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEVuY3J5cHRlZExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrCisgICAgICogb2JqZWN0IGFuZCB3cml0YWJsZSBJTWVtb3J5IHJlZ2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICAgICAgQzJMaW5lYXJCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgbWVtb3J5ICAgICAgSU1lbW9yeSBvYmplY3QgdG8gc3RvcmUgZW5jcnlwdGVkIGNvbnRlbnQuCisgICAgICogXHBhcmFtICAgaGVhcFNlcU51bSAgSGVhcCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBJQ3J5cHRvOyAtMSBpZiBOL0EKKyAgICAgKi8KKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnksCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0gPSAtMSk7CisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgfkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIHRoZSBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGJhc2VkIG9uCisgICAgICogaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc291cmNlICBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB0byBmaWxsLgorICAgICAqLworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcihJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgKnNvdXJjZSk7CisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIHxkZWNyeXB0ZWR8IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuIFRoaXMgc2hhbGwKKyAgICAgKiBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgZGVjcnlwdGVkICAgZGVjcnlwdGVkIGNvbnRlbnQgdG8gY29weSBmcm9tLgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudChjb25zdCBzcDxJTWVtb3J5PiAmZGVjcnlwdGVkLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4KKyAgICAgKiBUaGlzIHNoYWxsIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG5hdGl2ZSBoYW5kbGUgb2Ygc2VjdXJlIGJ1ZmZlciB1bmRlcnN0b29kIGJ5IElDcnlwdG8uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNlY3VyZSBidWZmZXIgaGFuZGxlCisgICAgICovCisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSBjb25zdDsKKworcHJpdmF0ZToKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMGE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkluZm9CdWlsZGVyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiQ29kZWMySW5mb0J1aWxkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBUcmFpdHMgPSBDMkNvbXBvbmVudDo6VHJhaXRzOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2Jvb2wgaGFzUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICBzaXplX3QgcHJlZml4TGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgcmV0dXJuIHMuY29tcGFyZSgwLCBwcmVmaXhMZW4sIHByZWZpeCkgPT0gMDsKK30KKworYm9vbCBoYXNTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgIHNpemVfdCBzdWZmaXhMZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICByZXR1cm4gc3VmZml4TGVuID4gcy5zaXplKCkgPyBmYWxzZSA6CisgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOworfQorCit2b2lkIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWVkaWEgdHlwZSwgcGFzcyB0aHJvdWdoIGFsbCB2YWx1ZXMgdW5tYXBwZWQKKworICAgIC8vIFRPRE86IHdlIGNhbm5vdCBmaW5kIGxldmVscyB0aGF0IGFyZSBsb2NhbCAnbWF4aW1hJyB3aXRob3V0IGtub3dpbmcgdGhlIGNvZGluZworICAgIC8vIGUuZy4gSC4yNjMgbGV2ZWwgNDUgYW5kIGxldmVsIDMwIGNvdWxkIGJlIHR3byB2YWx1ZXMgZm9yIGhpZ2hlc3QgbGV2ZWwgYXMKKyAgICAvLyB0aGV5IGRvbid0IGluY2x1ZGUgb25lIGFub3RoZXIuIEZvciBub3cgd2UgdXNlIHRoZSBsYXN0IHN1cHBvcnRlZCB2YWx1ZS4KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvIHBsKGVuY29kZXIgLyogb3V0cHV0ICovLCAwdSk7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBwcm9maWxlUXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLnByb2ZpbGUpKQorICAgIH07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhwcm9maWxlUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgcHJvZmlsZXMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LIHx8IHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIG9ubHkgaGFuZGxlIGVudW1lcmF0ZWQgdmFsdWVzCisgICAgaWYgKHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICBib29sIHN1cHBvcnRzSGRyID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKKyAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOworICAgIGlmIChlcnIxID09IEMyX09LKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKHVpbnQzMl90KWRlc2MtPmluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIxMFBsdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0hkciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIFZQOSwgdGhlIHN0YXRpYyBpbmZvIGlzIGFsd2F5cyBwcm9wYWdhdGVkIGJ5IGZyYW1ld29yay4KKyAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSk7CisKKyAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSBwcm9maWxlIDogcHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgcGwucHJvZmlsZSA9IChDMkNvbmZpZzo6cHJvZmlsZV90KXByb2ZpbGUucmVmPHVpbnQzMl90PigpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGVyciA9IGludGYtPmNvbmZpZyh7JnBsfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQUxPR1YoInNldCBwcm9maWxlIHRvICV1IC0+ICVzIiwgcGwucHJvZmlsZSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbGV2ZWxRdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudChDMlBhcmFtRmllbGQoJnBsLCAmcGwubGV2ZWwpKQorICAgICAgICB9OworICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhsZXZlbFF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBsZXZlbHMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKGxldmVsUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgbGV2ZWxRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUworICAgICAgICAgICAgICAgIHx8IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUgbGV2ZWwgPSBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuYmFjaygpOworICAgICAgICBwbC5sZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdClsZXZlbC5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0aW5nIGxldmVsOiAldSIsIHBsLmxldmVsKTsKKyAgICAgICAgaW50MzJfdCBzZGtQcm9maWxlLCBzZGtMZXZlbDsKKyAgICAgICAgaWYgKG1hcHBlciAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChwbC5sZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgLy8gYWxzbyBsaXN0IEhEUiBwcm9maWxlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgSERSCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaGRyTWFwcGVyICYmIGhkck1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIxMFBsdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5tZWRpYVR5cGUsIHRydWUgLyppc0hkcjEwUGx1cyovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcHBlcikgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBILjI2MyBhbHNvIGFkdmVydGlzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgaWYgdGhlCisgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMAorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gc29tZSBmb3JtIG9mIGEgc2V0dGluZyBzbyBpdCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGJlIGhlcmUKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBuZXh0TGV2ZWwgPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KXYucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1ICYmIGxldmVsID4gbmV4dExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXh0TGV2ZWwgIT0gQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICAmJiBuZXh0TGV2ZWwgIT0gcGwubGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChuZXh0TGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgICh2b2lkKWludGY7CisKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCisgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPworICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gdmVuZG9yIHZpZGVvIGNvZGVjcyBwcmVmZXIgb3BhcXVlIGZvcm1hdAorICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworICAgICAgICAvLyBmcmFtZXdvcmsgdmlkZW8gZW5jb2RlcnMgbXVzdCBzdXBwb3J0IHN1cmZhY2UgZm9ybWF0LCB0aG91Z2ggaXQgaXMgdW5jbGVhcgorICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgaWYgKGVuY29kZXIgJiYgdHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IENvZGVjMkluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgcnVuLXRpbWUgY29uZmlndXJhdGlvbnMgb25jZSBhbGwgY29kZWNzIGFyZSB3b3JraW5nCisgICAgLy8gcHJvcGVybHkuIChBc3N1bWUgImZ1bGwiIGJlaGF2aW9yIGV2ZW50dWFsbHkuKQorICAgIC8vCisgICAgLy8gZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIHN1cHBvcnRzIDUgdmFsdWVzLgorICAgIC8vICAgMCAtIE5vIENvZGVjIDIuMCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gICAxIC0gQXVkaW8gZGVjb2RlcnMgYW5kIGVuY29kZXJzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZQorICAgIC8vICAgICAgIGFuZCByYW5rZWQgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIHdpdGgKKyAgICAvLyAgICAgICB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAyIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMyAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgNCAtIEFsbCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSAoYm9vdCB0aW1lKSBpcyAxLgorICAgIC8vCisgICAgLy8gTm90ZTogQ3VycmVudGx5LCBPTVggY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDEwMCwgd2hpbGUgYWxsCisgICAgLy8gQ29kZWMyLjAgc29mdHdhcmUgY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDIwMC4KKyAgICBpbnQgb3B0aW9uID0gOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIiwgMSk7CisKKyAgICAvLyBPYnRhaW4gQ29kZWMyQ2xpZW50CisgICAgc3RkOjp2ZWN0b3I8VHJhaXRzPiB0cmFpdHMgPSBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCk7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX2MyLnhtbCIsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlX2MyLnhtbCIpOworICAgIGlmIChwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJYTUwgcGFyc2VyIG5vIGdvb2QiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGZvciAoY29uc3QgVHJhaXRzJiB0cmFpdCA6IHRyYWl0cykgeworICAgICAgICBDMkNvbXBvbmVudDo6cmFua190IHJhbmsgPSB0cmFpdC5yYW5rOworCisgICAgICAgIC8vIEludGVyZmFjZSBtdXN0IGJlIGFjY2Vzc2libGUgZm9yIHVzIHRvIGxpc3QgdGhlIGNvbXBvbmVudCwgYW5kIHRoZXJlIGFsc28KKyAgICAgICAgLy8gbXVzdCBiZSBhbiBYTUwgZW50cnkgZm9yIHRoZSBjb2RlYy4gQ29kZWMgYWxpYXNlcyBsaXN0ZWQgaW4gdGhlIHRyYWl0cworICAgICAgICAvLyBhbGxvdyBhZGRpdGlvbmFsIFhNTCBlbnRyaWVzIHRvIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBhbGlhcy4gVGhlc2Ugd2lsbAorICAgICAgICAvLyBiZSBsaXN0ZWQgYXMgc2VwYXJhdGUgY29kZWNzLiBJZiBubyBYTUwgZW50cnkgaXMgc3BlY2lmaWVkIGZvciBhbiBhbGlhcywKKyAgICAgICAgLy8gdGhvc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgYWxpYXMgc3BlY2lmaWVkIGluIHRoZSBYTUwgZW50cnkKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmZhY2UgbmFtZS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVBbmRBbGlhc2VzID0gdHJhaXQuYWxpYXNlczsKKyAgICAgICAgbmFtZUFuZEFsaWFzZXMuaW5zZXJ0KG5hbWVBbmRBbGlhc2VzLmJlZ2luKCksIHRyYWl0Lm5hbWUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lT3JBbGlhcyA6IG5hbWVBbmRBbGlhc2VzKSB7CisgICAgICAgICAgICBib29sIGlzQWxpYXMgPSB0cmFpdC5uYW1lICE9IG5hbWVPckFsaWFzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KKyAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmICghaW50ZikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBmb3IgJXMnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpYXMgPyAiYWxpYXMgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyc2VyLmdldENvZGVjTWFwKCkuY291bnQobmFtZU9yQWxpYXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNBbGlhcykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGJhc2VDb2RlY0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5maW5kTWVkaWFDb2RlY0luZm8odHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlQ29kZWNJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sIGJ1dCBjYW5vbmljYWwgY29kZWMgaW5mbyAnJXMnIG1pc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFsaWFzICclcycgbm90IGZvdW5kIGluIHhtbDsgdXNlIGFuIFhNTCA8QWxpYXM+IHRhZyBmb3IgdGhpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxpYXMgaW50byBleGlzdGluZyBjb2RlYworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNvZGVjSW5mby0+YWRkQWxpYXMobmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcG9uZW50ICclcycgbm90IGZvdW5kIGluIHhtbCIsIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2Fub25OYW1lID0gdHJhaXQubmFtZTsKKworICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmxvY2sgb25jZSBhbGwgY29kZWNzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0LmRvbWFpbiA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgY29kZWMgZW50cnkgZm9yICclcyciLCBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gY29kZWNJbmZvID0gd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXROYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRPd25lcigoImNvZGVjMjo6IiArIHRyYWl0Lm93bmVyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0KKyAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q29kZWNNYXAoKS5hdChuYW1lT3JBbGlhcyk7CisKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJzb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJ2ZW5kb3Itc29mdHdhcmUiKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMucXVpcmtTZXQuZmluZCgiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb2RlYy5xdWlya1NldC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIGlmICghY29kZWMucmFuay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeG1sUmFuazsKKyAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoY29kZWMucmFuay5jX3N0cigpLCAiJXUlYyIsICZ4bWxSYW5rLCAmZHVtbXkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHhtbFJhbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlhcyA6IGNvZGVjLmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGFsaWFzICclcyciLCBhbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZEFsaWFzKGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZhdHRyTWFwID0gdHlwZUl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZE1lZGlhVHlwZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGF0dHJJdCA9IGF0dHJNYXAuYmVnaW4oKTsgYXR0ckl0ICE9IGF0dHJNYXAuZW5kKCk7ICsrYXR0ckl0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGllKGtleSwgdmFsdWUpID0gKmF0dHJJdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5maW5kKCJmZWF0dXJlLSIpID09IDAgJiYga2V5LmZpbmQoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50VmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRyYWlsaW5nIGJhZCBjaGFyYWN0ZXJzIGFuZCBkZWZhdWx0IHRvIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzc2NhbmYodmFsdWUuY19zdHIoKSwgIiVkIiwgJmludFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpDcmVhdGVCdWlsZGVyKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q29kZWMySW5mb0J1aWxkZXI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisjZGVmaW5lIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ29kZWMySW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CitwdWJsaWM6CisgICAgQ29kZWMySW5mb0J1aWxkZXIoKSA9IGRlZmF1bHQ7CisgICAgfkNvZGVjMkluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9JTkZPX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKyNkZWZpbmUgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXBwZXIgaW50ZXJmYWNlIGFyb3VuZCBJbnB1dFN1cmZhY2UuCisgKi8KK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIElucHV0U3VyZmFjZVdyYXBwZXIoKQorICAgICAgICA6IG1EYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGhlIHN1cmZhY2Ugd2l0aCB8Y29tcHwuIEEgc3VyZmFjZSBjYW4KKyAgICAgKiBjb25uZWN0IHRvIGF0IG1vc3Qgb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB8Y29tcHwKKyAgICAgKiBccmV0dXJuIEFMUkVBRFlfRVhJU1RTICAgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYW5vdGhlciBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgPSAwOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCB0aGUgc3VyZmFjZSBmcm9tIHRoZSBjb21wb25lbnQgaWYgYW55LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RhcnQgcHVzaGluZyBidWZmZXJzIHRvIHRoZSBzdXJmYWNlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWY6IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgLy8vIElucHV0IFN1cmZhY2UgY29uZmlndXJhdGlvbgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICAvLyBJTiBQQVJBTVMgKEdCUykKKyAgICAgICAgZmxvYXQgbU1pbkZwczsgLy8gbWluaW11bSBmcHMgKHJlcGVhdCBmcmFtZSB0byBhY2hpZXZlIHRoaXMpCisgICAgICAgIGZsb2F0IG1NYXhGcHM7IC8vIG1heCBmcHMgKHZpYSBmcmFtZSBkcm9wKQorICAgICAgICBmbG9hdCBtQ2FwdHVyZUZwczsgLy8gY2FwdHVyZSBmcHMKKyAgICAgICAgZmxvYXQgbUNvZGVkRnBzOyAgIC8vIGNvZGVkIGZwcworICAgICAgICBib29sIG1TdXNwZW5kZWQ7IC8vIHN1c3BlbmRlZAorICAgICAgICBpbnQ2NF90IG1UaW1lT2Zmc2V0VXM7IC8vIHRpbWUgb2Zmc2V0IChpbnB1dCA9PiBjb2RlYykKKyAgICAgICAgaW50NjRfdCBtU3VzcGVuZEF0VXM7IC8vIHN1c3BlbmQvcmVzdW1lIHRpbWUKKyAgICAgICAgaW50NjRfdCBtU3RhcnRBdFVzOyAvLyBzdGFydCB0aW1lCisgICAgICAgIGJvb2wgbVN0b3BwZWQ7IC8vIHN0b3BwZWQKKyAgICAgICAgaW50NjRfdCBtU3RvcEF0VXM7IC8vIHN0b3AgdGltZQorCisgICAgICAgIC8vIE9VVCBQQVJBTVMgKEdCUykKKyAgICAgICAgaW50NjRfdCBtSW5wdXREZWxheVVzOyAvLyBkZWxheSBiZXR3ZWVuIGVuY29kZXIgaW5wdXQgYW5kIHN1cmZhY2UgaW5wdXQKKworICAgICAgICAvLyBJTiBQQVJBTVMgKENPREVDIFdSQVBQRVIpCisgICAgICAgIGZsb2F0IG1GaXhlZEFkanVzdGVkRnBzOyAvLyBmaXhlZCBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICAgICAgZmxvYXQgbU1pbkFkanVzdGVkRnBzOyAvLyBtaW5pbXVtIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGlucHV0IHN1cmZhY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gY29uZmlnIGNvbmZpZ3VyYXRpb24uIFRoaXMgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCB0byBwcm92aWRlIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycywgYnV0IG5vdCB0byBwcm92aWRlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycyAodG8gYXZvaWQgY29udGludWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgIHJlY29uZmlndXJpbmcpCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgZGVzaXJlZCBkYXRhIHNwYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGFTcGFjZSBkZXNpcmVkIGRhdGEgc3BhY2UKKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXREYXRhU3BhY2UoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODFkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQaXBlbGluZVdhdGNoZXIiCisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtSW5wdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtUGlwZWxpbmVEZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6Om91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbU91dHB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6c21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIG1TbW9vdGhuZXNzRmFjdG9yID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrUXVldWVkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxdWV1ZWRBdCkgeworICAgIEFMT0dWKCJvbldvcmtRdWV1ZWQoZnJhbWVJbmRleD0lbGx1LCBidWZmZXJzKHNpemU9JXp1KSwgcXVldWVkQXQ9JWxsZCkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwKKyAgICAgICAgICBidWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAobG9uZyBsb25nKXF1ZXVlZEF0LnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgIT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uV29ya1F1ZXVlZDogRHVwbGljYXRlIGZyYW1lIGluZGV4ICglbGx1KTsgcHJldmlvdXMgZW50cnkgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLmVyYXNlKGl0KTsKKyAgICB9CisgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUudHJ5X2VtcGxhY2UoZnJhbWVJbmRleCwgc3RkOjptb3ZlKGJ1ZmZlcnMpLCBxdWV1ZWRBdCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gUGlwZWxpbmVXYXRjaGVyOjpvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4PSVsbHUsIGFycmF5SW5kZXg9JXp1KSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChpdC0+c2Vjb25kLmJ1ZmZlcnMuc2l6ZSgpIDw9IGFycmF5SW5kZXgpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogYnVmZmVycyBhdCAlbGx1OiBzaXplICV6dSwgcmVxdWVzdGVkIGluZGV4OiAlenUiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGl0LT5zZWNvbmQuYnVmZmVycy5zaXplKCksIGFycmF5SW5kZXgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIoc3RkOjptb3ZlKGl0LT5zZWNvbmQuYnVmZmVyc1thcnJheUluZGV4XSkpOworICAgIEFMT0dEX0lGKCFidWZmZXIsICJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGJ1ZmZlciBhbHJlYWR5IHJlbGVhc2VkICglbGx1OiV6dSkiLAorICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6Om9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCkgeworICAgIEFMT0dWKCJvbldvcmtEb25lKGZyYW1lSW5kZXg9JWxsdSkiLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCA9PSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZTogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS5lcmFzZShpdCk7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpmbHVzaCgpIHsKKyAgICBtRnJhbWVzSW5QaXBlbGluZS5jbGVhcigpOworfQorCitib29sIFBpcGVsaW5lV2F0Y2hlcjo6cGlwZWxpbmVGdWxsKCkgY29uc3QgeworICAgIGlmIChtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgPj0KKyAgICAgICAgICAgIG1JbnB1dERlbGF5ICsgbVBpcGVsaW5lRGVsYXkgKyBtT3V0cHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBmcmFtZXMgaW4gcGlwZWxpbmUgKCV6dSkiLCBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IHNpemVXaXRoSW5wdXRSZWxlYXNlZCA9IHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5iZWdpbigpLAorICAgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBkZWNsdHlwZShtRnJhbWVzSW5QaXBlbGluZSk6OnZhbHVlX3R5cGUgJnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgOiB2YWx1ZS5zZWNvbmQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc2l6ZVdpdGhJbnB1dFJlbGVhc2VkID49CisgICAgICAgICAgICBtUGlwZWxpbmVEZWxheSArIG1PdXRwdXREZWxheSArIG1TbW9vdGhuZXNzRmFjdG9yKSB7CisgICAgICAgIEFMT0dWKCJwaXBlbGluZUZ1bGw6IHRvbyBtYW55IGZyYW1lcyBpbiBwaXBlbGluZSwgd2l0aCBpbnB1dCByZWxlYXNlZCAoJXp1KSIsCisgICAgICAgICAgICAgIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigicGlwZWxpbmUgaGFzIHJvb20gKHRvdGFsOiAlenUsIGlucHV0IHJlbGVhc2VkOiAlenUpIiwKKyAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCksIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBQaXBlbGluZVdhdGNoZXI6OmVsYXBzZWQoCisgICAgICAgIGNvbnN0IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgJm5vdywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBpZiAobUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpIDw9IG4pIHsKKyAgICAgICAgcmV0dXJuIENsb2NrOjpkdXJhdGlvbjo6emVybygpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxDbG9jazo6ZHVyYXRpb24+IGR1cmF0aW9uczsKKyAgICBmb3IgKGNvbnN0IGRlY2x0eXBlKG1GcmFtZXNJblBpcGVsaW5lKTo6dmFsdWVfdHlwZSAmdmFsdWUgOiBtRnJhbWVzSW5QaXBlbGluZSkgeworICAgICAgICBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG5vdyAtIHZhbHVlLnNlY29uZC5xdWV1ZWRBdDsKKyAgICAgICAgQUxPR1YoImVsYXBzZWQ6IGZyYW1lSW5kZXggPSAlbGx1IGVsYXBzZWQgPSAlbGxkbXMiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXZhbHVlLmZpcnN0LAorICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbGFwc2VkKS5jb3VudCgpKTsKKyAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhlbGFwc2VkKTsKKyAgICB9CisgICAgc3RkOjpudGhfZWxlbWVudChkdXJhdGlvbnMuYmVnaW4oKSwgZHVyYXRpb25zLmVuZCgpLCBkdXJhdGlvbnMuYmVnaW4oKSArIG4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8Q2xvY2s6OmR1cmF0aW9uPigpKTsKKyAgICByZXR1cm4gZHVyYXRpb25zW25dOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUElQRUxJTkVfV0FUQ0hFUl9IXworI2RlZmluZSBQSVBFTElORV9XQVRDSEVSX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUGlwZWxpbmVXYXRjaGVyIHdhdGNoZXMgdGhlIHBpcGVsaW5lIGFuZCBpbmZlcnMgdGhlIHN0YXR1cyBvZiB3b3JrIGl0ZW1zIGZyb20KKyAqIGV2ZW50cy4KKyAqLworY2xhc3MgUGlwZWxpbmVXYXRjaGVyIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2sgQ2xvY2s7CisKKyAgICBQaXBlbGluZVdhdGNoZXIoKQorICAgICAgICA6IG1JbnB1dERlbGF5KDApLAorICAgICAgICAgIG1QaXBlbGluZURlbGF5KDApLAorICAgICAgICAgIG1PdXRwdXREZWxheSgwKSwKKyAgICAgICAgICBtU21vb3RobmVzc0ZhY3RvcigwKSB7fQorICAgIH5QaXBlbGluZVdhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBpbnB1dCBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZpbnB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHBpcGVsaW5lIGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgb3V0cHV0IGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJm91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHNtb290aG5lc3MgZmFjdG9yIHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnNtb290aG5lc3NGYWN0b3IodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQ2xpZW50IHF1ZXVlZCBhIHdvcmsgaXRlbSB0byB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4IG9mIHRoaXMgd29yaworICAgICAqIFxwYXJhbSBidWZmZXJzICAgICBpbnB1dCBidWZmZXJzIG9mIHRoZSBxdWV1ZWQgd29yayBpdGVtCisgICAgICogXHBhcmFtIHF1ZXVlZEF0ICAgIHRpbWUgd2hlbiB0aGUgY2xpZW50IHF1ZXVlZCB0aGUgYnVmZmVyCisgICAgICovCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZidWZmZXJzLAorICAgICAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnF1ZXVlZEF0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgcmVsZWFzZWQgaW5wdXQgYnVmZmVycyBmcm9tIGEgd29yayBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4CisgICAgICogXHBhcmFtIGFycmF5SW5kZXggIGluZGV4IG9mIHRoZSBidWZmZXIgYXQgdGhlIG9yaWdpbmFsIHxidWZmZXJzfCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICBvbldvcmtRdWV1ZWQoKS4KKyAgICAgKiBccmV0dXJuICBidWZmZXJzW2FycmF5SW5kZXhdCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB3b3JrIGl0ZW0uCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgcGlwZWxpbmUuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgcGlwZWxpbmUgZG9lcyBub3QgbmVlZCBtb3JlIHdvcmsgaXRlbXMgdG8gcHJvY2VlZAorICAgICAqICAgICAgICAgICAgICAgIHNtb290aGx5LCBjb25zaWRlcmluZyBkZWxheXMgYW5kIHNtb290aG5lc3MgZmFjdG9yOworICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBpcGVsaW5lRnVsbCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGVsYXBzZWQgcHJvY2Vzc2luZyB0aW1lIG9mIGEgd29yayBpdGVtLCBudGggZnJvbSB0aGUgbG9uZ2VzdAorICAgICAqIHByb2Nlc3NpbmcgdGltZSB0byB0aGUgc2hvcnRlc3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm93IGN1cnJlbnQgdGltZXN0YW1wCisgICAgICogXHBhcmFtIG4gICBudGggd29yayBpdGVtLCBmcm9tIHRoZSBsb25nZXN0IHByb2Nlc3NpbmcgdGltZSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHNob3J0ZXN0LiBJdCdzIGEgMC1iYXNlZCBpbmRleC4KKyAgICAgKiBccmV0dXJuICBlbGFwc2VkIHByb2Nlc3NpbmcgdGltZSBvZiBudGggd29yayBpdGVtLgorICAgICAqLworICAgIENsb2NrOjpkdXJhdGlvbiBlbGFwc2VkKGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZub3csIHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSW5wdXREZWxheTsKKyAgICB1aW50MzJfdCBtUGlwZWxpbmVEZWxheTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RGVsYXk7CisgICAgdWludDMyX3QgbVNtb290aG5lc3NGYWN0b3I7CisKKyAgICBzdHJ1Y3QgRnJhbWUgeworICAgICAgICBGcmFtZShzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmIsCisgICAgICAgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxKQorICAgICAgICAgICAgOiBidWZmZXJzKGIpLAorICAgICAgICAgICAgICBxdWV1ZWRBdChxKSB7fQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCBxdWV1ZWRBdDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBGcmFtZT4gbUZyYW1lc0luUGlwZWxpbmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBJUEVMSU5FX1dBVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZDRhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3Q6OmRlYnVnU3RyaW5nKHNpemVfdCBpbmRlbnRfKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgaW5kZW50KGluZGVudF8sICcgJyk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJEaWN0IHsiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiAqdGhpcykgeworICAgICAgICBzIDw8IGluZGVudCA8PCAiICAiOworCisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYzJWYWx1ZS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppMzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnUzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFIzMjoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmMzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppNjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnU2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFI2NDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmM2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkZMT0FUOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpmbG9hdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGZsb2F0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoZXNlIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dW5zdXBwb3J0ZWQgIiA8PCBpdC5maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgImludDMyX3QgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50NjRfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAic3RyaW5nICIgPDwgaXQuZmlyc3QgPDwgIiA9IFwiIiA8PCBzdHJWYWx1ZS5jX3N0cigpIDw8ICJcIiI7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiQnVmZmVyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICI7CisgICAgICAgICAgICBpZiAoYnVmVmFsdWUgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+ZGF0YSgpICE9IG51bGxwdHIgJiYgYnVmVmFsdWUtPnNpemUoKSA8PSA2NCkgeworICAgICAgICAgICAgICAgIHMgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZlZhbHVlLT5kYXRhKCksIGJ1ZlZhbHVlLT5zaXplKCksIGluZGVudF8gKyA0LCAmdG1wKTsKKyAgICAgICAgICAgICAgICBzIDw8IHRtcC5jX3N0cigpIDw8IGluZGVudCA8PCAiICB9IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA8PCAodm9pZCopYnVmVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkdW1wIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVidWdnaW5nLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgICBzIDw8ICJ1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICB9CisgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzIDw8IGluZGVudCA8PCAifSI7CisKKyAgICByZXR1cm4gcy5zdHIoKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtRGVzYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBkZXNjcmliZSAlcyIsIGRlc2MtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCB0cnVlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgIH0KKworICAgIC8vIFRFTVA6IGFsc28gYWRkIHZlbmRvciBwYXJhbWV0ZXJzIGFzIG5vbi12ZW5kb3IKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIGlmICghZGVzYy0+aW5kZXgoKS5pc1ZlbmRvcigpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCBmYWxzZSAvKiBtYXJrVmVuZG9yICovKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBkZXNjLAorICAgICAgICBDMlN0cmluZyBwYXRoLAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0RGVzYy5iZWdpbigpOyBpdCAhPSBzdHJ1Y3REZXNjLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEMyU3RyaW5nIGZpZWxkTmFtZSA9IHBhdGggKyAiLiIgKyBpdC0+bmFtZSgpOworICAgICAgICBpZiAoaXQtPnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgaWYgKHJlZmxlY3RvciA9PSBudWxscHRyIHx8IGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgc3RydWN0IGZpZWxkICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzY18gPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXgoaXQtPnR5cGUoKSkuY29yZUluZGV4KCkpOworICAgICAgICAgICAgaWYgKHN0cnVjdERlc2NfID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlIHN0cnVjdHVyZSBvZiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFBhcmFtU3RydWN0RGVzYyhkZXNjLCBmaWVsZE5hbWUsIG9mZnNldCArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0RGVzY18sIHJlZmxlY3Rvcik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSBleHRlbnQgYW5kIHR5cGUKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJleHRlbnQoKSAhPSAxIGZvciBzaW5nbGUgdmFsdWUgdHlwZTogJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyByZWdpc3RlcmVkIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIHByb3BlciBzaXplIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBmaWVsZHMuCisgICAgICAgIC8vIG9ubHkgaW5zZXJ0IGZpZWxkcyB0aGUgdmVyeSBmaXJzdCB0aW1lCisgICAgICAgIG1NYXAuZW1wbGFjZShmaWVsZE5hbWUsIEZpZWxkRGVzYyB7CisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgICAgIGl0LT50eXBlKCksIGl0LT5leHRlbnQoKSwgaXQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZSgqaXQpKSwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsIGJvb2wgbWFya1ZlbmRvcikgeworICAgIEMyU3RyaW5nIHBhcmFtTmFtZSA9IGRlc2MtPm5hbWUoKTsKKworICAgIC8vIHByZWZpeCB2ZW5kb3IgcGFyYW1ldGVycworICAgIGlmIChkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkgJiYgbWFya1ZlbmRvcikgeworICAgICAgICBwYXJhbU5hbWUgPSAidmVuZG9yLiIgKyBwYXJhbU5hbWU7CisgICAgfQorICAgIG1QYXJhbU5hbWVzLmVtcGxhY2UoZGVzYy0+aW5kZXgoKSwgcGFyYW1OYW1lKTsKKworICAgIC8vIGFsc28gYWxsb3cgc2V0dGluZyB3aG9sZSBwYXJhbWV0ZXJzIGluIGEgYmluYXJ5IGZhc2hpb24gdmlhIEJ5dGVCdWZmZXIKKyAgICAvLyB0aGlzIGlzIG9wdC1pbiBmb3Igbm93CisgICAgYXV0byBpdCA9IG1XaG9sZVBhcmFtcy5maW5kKHBhcmFtTmFtZSk7CisgICAgaWYgKGl0ICE9IG1XaG9sZVBhcmFtcy5lbmQoKSAmJiBpdC0+c2Vjb25kLmNvcmVJbmRleCgpID09IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgbU1hcC5lbXBsYWNlKHBhcmFtTmFtZSwgRmllbGREZXNjeyBkZXNjLCBudWxscHRyLCAwIC8qIG9mZnNldCAqLyB9KTsKKyAgICAgICAgLy8gZG9uJ3QgYWRkIGZpZWxkcyBvZiB3aG9sZSBwYXJhbWV0ZXJzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIHBhcmFtTmFtZSwgMCAvKiBvZmZzZXQgKi8sIHN0cnVjdERlc2MsIHJlZmxlY3Rvcik7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICBtV2hvbGVQYXJhbXMuZW1wbGFjZShuYW1lLCBpbmRleCk7Cit9CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1QYXJhbU5hbWVzLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCAhPSBtUGFyYW1OYW1lcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXQ7CisgICAgcmV0IDw8ICI8dW5rbm93biAiIDw8IGluZGV4IDw8ICI+IjsKKyAgICByZXR1cm4gcmV0LnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZpbmRpY2VzXShjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSB7CisgICAgICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgfSk7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisgICAgdmVjLT5jbGVhcigpOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleU1hcChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCkpOworCisgICAgQUxPR1YoImluIGdldFBhcmFtSW5kaWNlc0ZvcktleXMgd2l0aCAlenUga2V5cyBhbmQgbWFwIG9mICV6dSBlbnRyaWVzIiwKKyAgICAgICAgICAgIGtleU1hcC5zaXplKCksIG1NYXAuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgQUxPR1YoImNvdW50IG9mICVzIGlzICV6dSIsIG5hbWUuY19zdHIoKSwga2V5TWFwLmNvdW50KG5hbWUpKTsKKyAgICAgICAgaWYgKGtleU1hcC5jb3VudChuYW1lKSA+IDApIHsKKyAgICAgICAgICAgIGluZGljZXMuaW5zZXJ0KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDogaW5kaWNlcykgeworICAgICAgICB2ZWMtPnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6dXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Kj4gcGFyYW1zTWFwOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6ICp2ZWMpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9ICZwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgIFsmcGFyYW1zTWFwXShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgRmllbGREZXNjICZkZXNjLCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICpwYXJhbSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYXV0byBwYXJhbUl0ID0gcGFyYW1zTWFwLmZpbmQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbUl0ID09IHBhcmFtc01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMgZm91bmQsIGJ1dCBwYXJhbSAjJWQgaXNuJ3QgcHJlc2VudCB0byB1cGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKGludDMyX3QpZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1JdC0+c2Vjb25kOworCisgICAgICAgICAgICAgICAgc3RydWN0IF9DMlBhcmFtIDogcHVibGljIEMyUGFyYW0geworICAgICAgICAgICAgICAgICAgICB1c2luZyBDMlBhcmFtOjpDMlBhcmFtOworICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbSh1aW50MzJfdCBzaXplLCB1aW50MzJfdCBpbmRleCkgOiBDMlBhcmFtKHNpemUsIGluZGV4KSB7IH0KKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBoYW5kbGUgd2hvbGUgcGFyYW0gdXBkYXRlcyBhcyBwYXJ0IG9mIGEgZmxleGlibGUgcGFyYW0gdXBkYXRlIHVzaW5nCisgICAgICAgICAgICAgICAgLy8gYSB6ZXJvIG9mZnNldC4KKyAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgbWluT2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZGVzY3JpcHRvciBoYXMgYSBmaWVsZCwgdXNlIHRoZSBvZmZzZXQgYW5kIHNpemUgYW5kIGVuc3VyZSB0aGF0IG9mZnNldAorICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBwYXJ0IG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluT2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgb3IgdHJpbSBmbGV4aWJsZSBwYXJhbSAob3Igd2hvbGUgcGFyYW0pIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MgLyogd2hvbGUgcGFyYW0gKi8gfHwgZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBwYXJhbSBpZiBtb3JlIHNwYWNlIGlzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmdldCgpLT5zaXplKCkgPCBvZmZzZXQgKyBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAtIG9mZnNldCB8fCBvZmZzZXQgPCBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIHRvbyBsb25nIG9yIG9mZnNldCB0b28gZWFybHkgLSBhYmFuZG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSAqbmV3UGFyYW0gPSAoQzJQYXJhbSAqKTo6b3BlcmF0b3IgbmV3KG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChuZXdQYXJhbSkgX0MyUGFyYW0ob2Zmc2V0ICsgc2l6ZSwgcGFyYW0tPmdldCgpLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobmV3UGFyYW0gKyAxLCBwYXJhbS0+Z2V0KCkgKyAxLCBvZmZzZXQgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnJlc2V0KG5ld1BhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA+IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gcGFyYW1ldGVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpUcmltUGFyYW0ocGFyYW0tPmdldCgpLCBvZmZzZXQgKyBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzYy5maWVsZERlc2MtPnR5cGUoKSA9PSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQikgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIGZpbGwgYmxvYnMgaWYgdXBkYXRpbmcgd2l0aCBzbWFsbGVyIGJsb2IKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0ICsgc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgLSBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0LCBwdHIsIHNpemUpOworICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmLCBjb25zdCB2b2lkICosIHNpemVfdCk+IHdvcmspIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgYXV0byBwYXJhbSA9IHBhcmFtcy5maW5kKG5hbWUpOworICAgICAgICBpZiAocGFyYW0gPT0gcGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbWV0ZXJzCisgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJnRtcCkgJiYgdG1wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICp0bXBBc1BhcmFtID0gQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGlmICh0bXBBc1BhcmFtICYmIHRtcEFzUGFyYW0tPnR5cGUoKS50eXBlKCkgPT0gZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiUGFyYW0gYmxvYiBkb2VzIG5vdCBtYXRjaCBwYXJhbSBmb3IgJyVzJyAoJXAsICV4IHZzICV4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCB0bXBBc1BhcmFtLCB0bXBBc1BhcmFtID8gdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA6IDB4REVBRHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQ2NF90KikmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogeworICAgICAgICAgICAgICAgIGZsb2F0IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZ0bXAsIHNpemVvZih0bXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXh0ZW50ID4gMCAmJiB0bXAuc2l6ZSgpID49IGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHJ1bmNhdGVkKHRtcCwgMCwgZmllbGRFeHRlbnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlN0cmluZyB2YWx1ZSB0b28gbG9uZyB0byBmaXQ6IG9yaWdpbmFsIFwiJXNcIiB0cnVuY2F0ZWQgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAuY19zdHIoKSwgdHJ1bmNhdGVkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0cnVuY2F0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLmNfc3RyKCksIHRtcC5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSB8fCB0bXAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC0+c2l6ZSgpID4gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkJsb2IgdmFsdWUgdG9vIGxvbmcgdG8gZml0LiBUcnVuY2F0aW5nLiIpOworICAgICAgICAgICAgICAgICAgICB0bXAtPnNldFJhbmdlKHRtcC0+b2Zmc2V0KCksIGZpZWxkRXh0ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0CitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXNfKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzaXplKHBhcmFtc18uc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShwYXJhbXNfLmJlZ2luKCksIHBhcmFtc18uZW5kKCksIHBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCkgLT4gQzJQYXJhbSogeyByZXR1cm4gcC5nZXQoKTsgfSk7CisgICAgcmV0dXJuIGdldFBhcmFtcyhwYXJhbXMpOworfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKSBjb25zdCB7CisgICAgRGljdCByZXQ7CisKKyAgICAvLyBjb252ZXJ0IHZlY3RvciB0byBtYXAKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgQzJQYXJhbSAqPiBwYXJhbXNNYXA7CisgICAgZm9yIChDMlBhcmFtICpwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gIT0gbnVsbHB0ciAmJiAqcGFyYW0pIHsKKyAgICAgICAgICAgIHBhcmFtc01hcFtwYXJhbS0+aW5kZXgoKV0gPSBwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBpZiAocGFyYW1zTWFwLmNvdW50KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtICpwYXJhbSA9IHBhcmFtc01hcFtkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKV07CisgICAgICAgIFZhbHVlIHZhbHVlOworCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbXMgZmlyc3QKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHBhcmFtLCBwYXJhbS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pICsgZGVzYy5vZmZzZXQKKyAgICAgICAgICAgICAgICArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKmRlc2MuZmllbGREZXNjKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopcGFyYW0gKyBvZmZzZXQ7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgZmllbGRUeXBlID0gZGVzYy5maWVsZERlc2MtPnR5cGUoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zaXplKCkgPCBsZW5ndGggfHwgcGFyYW0tPnNpemUoKSAtIGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicGFyYW0gdG9vIHNtYWxsIGZvciBzdHJpbmc6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KEFTdHJpbmcoKGNoYXIgKilkYXRhLCBzdHJubGVuKChjaGFyICopZGF0YSwgbGVuZ3RoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGJsb2I6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWx1ZVNpemUgPSBDMlZhbHVlOjpTaXplRm9yKChDMlZhbHVlOjp0eXBlX3QpZmllbGRUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IHZhbHVlU2l6ZSB8fCBwYXJhbS0+c2l6ZSgpIC0gdmFsdWVTaXplIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGMydmFsdWU6IHNpemUgJXp1IG9mZnNldCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogIGMyVmFsdWUgPSAqKChpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGMyVmFsdWUgPSAqKCh1aW50MzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOiBjMlZhbHVlID0gKigoYzJfY250cjMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgYzJWYWx1ZSA9ICooKGludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogYzJWYWx1ZSA9ICooKHVpbnQ2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IGMyVmFsdWUgPSAqKChjMl9jbnRyNjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBjMlZhbHVlID0gKigoZmxvYXQgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGZvciAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KGMyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldC5lbXBsYWNlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmNsZWFyKCkgeworICAgIG1NYXAuY2xlYXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworI2RlZmluZSBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gcXVlcnkgYW5kIHVwZGF0ZSBDb2RlYyAyLjAgY29uZmlndXJhdGlvbiB2YWx1ZXMuIFVzZSBjdXN0b20gZGljdGlvbmFyeSBhcworICogQU1lc3NhZ2UgY2Fubm90IHJlcHJlc2VudCBhbGwgdHlwZXMgb2YgQ29kZWMgMi4wIHBhcmFtZXRlcnMgYW5kIEMyVmFsdWUgY2Fubm90IHJlcHJlc2VudAorICogYWxsIHR5cGVzIG9mIFNESyB2YWx1ZXMuIFdlIHdhbnQgdG8gYmUgcHJlY2lzZSB3aGVuIHNldHRpbmcgc3RhbmRhcmQgcGFyYW1ldGVycyAodXNlIEMyVmFsdWUKKyAqIGZvciBhcml0aG1ldGljIHZhbHVlcyksIGJ1dCBhbHNvIHN1cHBvcnQgaW50MzIgYW5kIGludDY0IGZvciBTREsgdmFsdWVzIHNwZWNpZmljYWxseSBmb3IKKyAqIHZlbmRvciBwYXJhbWV0ZXJzIChhcyBTREsgQVBJIGRvZXMgbm90IGFsbG93IHNwZWNpZnlpbmcgcHJvcGVyIHR5cGUuKSBXaGVuIHF1ZXJ5aW5nIGZpZWxkcywKKyAqIHdlIGNhbiB1c2UgQzJWYWx1ZXMgYXMgdGhleSBhcmUgZGVmaW5lZC4KKyAqCisgKiAgICAgIEl0ZW0gPT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBpbmdzOgorICogICAgIENWYWx1ZTo6dHlwZSA9PiB0eXBlCisgKiAgICAgaW50MzIgPT4gaW50MzIsIGN0cjMyIG9yIHVpbnQzMgorICogICAgIGludDY0ID0+IGludDY0LCBjdHI2NCBvciB1aW50NjQKKyAqICAgICBBU3RyaW5nID0+IHN0cmluZworICogICAgIEFCdWZmZXIgPT4gYmxvYgorICogICAgICdSZWN0JyA9PiBDMlJlY3RTdHJ1Y3QgKG5vdCBleHBvc2VkIGluIFNESyBhcyBhIHJlY3RhbmdsZSkKKyAqLworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHsKK3B1YmxpYzoKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIoKSA9IGRlZmF1bHQ7CisgICAgflJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEVsZW1lbnQgZm9yIHZhbHVlcworICAgICAqLworICAgIHN0cnVjdCBWYWx1ZSA6IHB1YmxpYyBBRGF0YTxDMlZhbHVlLCBpbnQzMl90LCBpbnQ2NF90LCBBU3RyaW5nLCBzcDxBQnVmZmVyPj46OkJhc2ljIHsKKyAgICAgICAgLy8gYWxsb3cgY29uc3RydWN0aW9uIGZyb20gYmFzZSB0eXBlcworICAgICAgICBWYWx1ZSgpID0gZGVmYXVsdDsKKyAgICAgICAgZXhwbGljaXQgVmFsdWUoQzJWYWx1ZSBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDMyX3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShpbnQ2NF90IGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3QgQVN0cmluZyAmaSkgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGNvbnN0IHNwPEFCdWZmZXI+ICZpKSB7IHNldChpKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgRGljdCA6IHB1YmxpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVmFsdWU+IHsKKyAgICAgICAgRGljdCgpID0gZGVmYXVsdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudCA9IDApIGNvbnN0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBmaWVsZHMgb2YgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBzdXBwbGllZCwgc28gdGhhdCB0aGlzIG9wYmplY3QgY2FuIGxhdGVyCisgICAgICogcXVlcnkgYW5kIHVwZGF0ZSB0aGVzZS4KKyAgICAgKgorICAgICAqIEZvciBub3cgb25seSBmaXJzdC1sZXZlbCBmaWVsZHMgYXJlIHN1cHBvcnRlZC4gQWxzbywgYXJyYXkgZmllbGRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24uCisgICAgICogXHBhcmFtIHBhcmFtRGVzY3MgIHZlY3RvciBvZiBDMlBhcmFtRGVzY3JpcHRvciBvYmplY3RzIHRoYXQgdGhpcyBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd291bGQgcmVjb2duaXplIHdoZW4gYnVpbGRpbmcgcGFyYW1zLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmcGFyYW1EZXNjcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0YW5kYXJkIHBhcmFtZXRlciAodGhhdCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvcgorICAgICAqIG9yIG1heSBub3QgYmUgbGlzdGVkIGFzIGEgc3VwcG9ydGVkIHZhbHVlIGJ5IHRoZSBjb21wb25lbnQpLiBJZiB0aGUgcGFyYW1ldGVyIG5hbWUgaXMKKyAgICAgKiB1c2VkIGZvciBhbm90aGVyIHBhcmFtZXRlciwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4gKFRlY2huaWNhbGx5LCB0aGlzIGlzIGJ5IGZpZWxkcykuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCBzdGFuZGFyZCBwYXJhbWV0ZXIgdHlwZQorICAgICAqIFxwYXJhbSBuYW1lIHBhcmFtZXRlciBuYW1lCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGFkZFN0YW5kYXJkUGFyYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZKSB7CisgICAgICAgIGFkZFBhcmFtRGVzYyhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChUOjpQQVJBTV9UWVBFKSwgYXR0cmliLCBuYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0ciksIG51bGxwdHIgLyogZGVzY3JpcHRvciAqLyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgKG9yIGEgcGFyYW1lYXRlcikgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYKKyAgICAgKiByZWZsZWN0b3IgaXMgcHJvdmlkZWQsIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbAorICAgICAqIGZ1bmRhbWVudGFsIHR5cGVkIGZpZWxkcyAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHBhdGggcGF0aC9uYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgKGZpZWxkIG9yIHBhcmVudCBwYXJhbWV0ZXIpCisgICAgICogXHBhcmFtIG9mZnNldCBvZmZzZXQgb2YgdGhlIHN0cnVjdHVyZSBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbVN0cnVjdERlc2MoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYywgQzJTdHJpbmcgcGF0aCwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSB0aGUgc3RydWN0IGRlc2NyaXB0b3IuIElmIHJlZmxlY3RvciBpcyBwcm92aWRlZCwKKyAgICAgKiBmaWVsZHMgb2Ygc3ViLXN0cnVjdHVyZXMgYXJlIGFsc28gYWRkZWQuIE90aGVyd2lzZSwgb25seSB0b3AtbGV2ZWwgZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzCisgICAgICogKGFyaXRobWV0aWMsIHN0cmluZyBhbmQgYmxvYikgYXJlIGFkZGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtRGVzYyBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSBmaWVsZERlc2MgZmllbGQgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSByZWZsZWN0b3IgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24gKG1heSBiZSBudWxsKQorICAgICAqIFxwYXJhbSBtYXJrVmVuZG9yIFRFTVAgaWYgdHJ1ZSwgcHJlZml4IHZlbmRvciBwYXJhbWV0ZXIgbmFtZXMgd2l0aCAidmVuZG9yLiIKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtRGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGJvb2wgbWFya1ZlbmRvciA9IHRydWUpOworCisgICAgLyoqCisgICAgICogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgYSBwYXJhbWV0ZXIgYXMgYSBiaW5hcnkgYmxvYi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBjb3JlSW5kZXggcGFyYW1ldGVyIChjb3JlKSBpbmRleAorICAgICAqLworICAgIHZvaWQgc3VwcG9ydFdob2xlUGFyYW0oc3RkOjpzdHJpbmcgbmFtZSwgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgZm9yIGFuIGluZGV4LgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldFBhcmFtTmFtZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBwYXJhbSBpbmRpY2VzIGZyb20gZmllbGQgbmFtZXMgYW5kIHZhbHVlcyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCBiZSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tvdXRdICAgIHZlY3RvciB0byBzdG9yZSB0aGUgaW5kaWNlcyBmcm9tIHxwYXJhbXN8LgorICAgICAqLworICAgIHZvaWQgZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyAob25seSkgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIFZlY3RvciBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZrZXlzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgQzJQYXJhbSBvYmplY3RzIGZyb20gZmllbGQgbmFtZSBhbmQgdmFsdWUgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgRGljdCBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lIHRvIHZhbHVlIHBhaXJzLgorICAgICAqIFxwYXJhbSB2ZWNbaW4sb3V0XSAgIHZlY3RvciBvZiB0aGUgQzJQYXJhbSBvYmplY3RzIHRvIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBmaWVsZHMgZnJvbSBDMlBhcmFtIG9iamVjdHMgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgcXVlcmllZAorICAgICAqIFxyZXR1cm4gYSBEaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBrbm93biBwYXJhbWV0ZXJzCisgICAgICovCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIERpY3QgZ2V0UGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXIgcGFyYW0gZGVzY3JpcHRvcnMgaW4gdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBGaWVsZERlc2MgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZERlc2M7CisgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRmllbGREZXNjPiBtTWFwOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnN0cmluZz4gbVBhcmFtTmFtZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkNvcmVJbmRleD4gbVdob2xlUGFyYW1zOworCisgICAgdm9pZCBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3Q7CisKKyAgICBDMl9ET19OT1RfQ09QWShSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWRlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNraXBDdXRCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NraXBDdXRCdWZmZXI6OlNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkJpdENoYW5uZWxzKSB7CisKKyAgICBtV3JpdGVIZWFkID0gMDsKKyAgICBtUmVhZEhlYWQgPSAwOworICAgIG1DYXBhY2l0eSA9IDA7CisgICAgbUN1dEJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBpZiAobnVtMTZCaXRDaGFubmVscyA9PSAwIHx8IG51bTE2Qml0Q2hhbm5lbHMgPiBJTlQzMl9NQVggLyAyKSB7CisgICAgICAgIEFMT0dXKCIjIGNoYW5uZWxzIG91dCBvZiByYW5nZTogJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwgbnVtMTZCaXRDaGFubmVscyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IG51bTE2Qml0Q2hhbm5lbHMgKiAyOworICAgIGlmIChza2lwID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplIHx8IGN1dCA+IElOVDMyX01BWCAvIGZyYW1lU2l6ZQorICAgICAgICAgICAgfHwgY3V0ICogZnJhbWVTaXplID4gSU5UMzJfTUFYIC0gNDA5NikgeworICAgICAgICBBTE9HVygib3V0IG9mIHJhbmdlIHNraXAvY3V0OiAlenUvJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBza2lwLCBjdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNraXAgKj0gZnJhbWVTaXplOworICAgIGN1dCAqPSBmcmFtZVNpemU7CisKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXAgPSBza2lwOworICAgIG1CYWNrUGFkZGluZyA9IGN1dDsKKyAgICBtQ2FwYWNpdHkgPSBjdXQgKyA0MDk2OworICAgIG1DdXRCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhclttQ2FwYWNpdHldOworICAgIEFMT0dWKCJza2lwY3V0YnVmZmVyICV6dSAlenUgJWQiLCBza2lwLCBjdXQsIG1DYXBhY2l0eSk7Cit9CisKK1NraXBDdXRCdWZmZXI6On5Ta2lwQ3V0QnVmZmVyKCkgeworICAgIGRlbGV0ZVtdIG1DdXRCdWZmZXI7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKChjaGFyKikgYnVmZmVyLT5kYXRhKCkpICsgb2Zmc2V0OworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPnNpemUoKSk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgY29waWVkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBkYXRhIGZyb20gdGhlIGJ1ZmZlciBpZiBuZWVkZWQKKyAgICBpZiAobUZyb250UGFkZGluZyA+IDApIHsKKyAgICAgICAgLy8gc3RpbGwgZGF0YSBsZWZ0IHRvIGRyb3AKKyAgICAgICAgaW50MzJfdCB0b19kcm9wID0gKGJ1ZmxlbiA8IG1Gcm9udFBhZGRpbmcpID8gYnVmbGVuIDogbUZyb250UGFkZGluZzsKKyAgICAgICAgb2Zmc2V0ICs9IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmxlbiAtPSB0b19kcm9wOworICAgICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICB3cml0ZShzcmMsIGJ1Zmxlbik7CisKKworICAgIC8vIHRoZSBtZWRpYWJ1ZmZlciBpcyBub3cgZW1wdHkuIEZpbGwgaXQgZnJvbSBjdXRidWZmZXIsIGFsd2F5cyBsZWF2aW5nCisgICAgLy8gYXQgbGVhc3QgbUJhY2tQYWRkaW5nIGJ5dGVzIGluIHRoZSBjdXRidWZmZXIKKyAgICBjaGFyICpkc3QgPSAoY2hhciopIGJ1ZmZlci0+YmFzZSgpOworICAgIHNpemVfdCBjb3BpZWQgPSByZWFkKGRzdCwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIGNvcGllZCk7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgc3VibWl0SW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpjbGVhcigpIHsKKyAgICBtV3JpdGVIZWFkID0gbVJlYWRIZWFkID0gMDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXA7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6d3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKSB7CisgICAgaW50MzJfdCBzaXpldXNlZCA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoc2l6ZXVzZWQgPCAwKSBzaXpldXNlZCArPSBtQ2FwYWNpdHk7CisKKyAgICAvLyBFdmVyeXRoaW5nIG11c3QgZml0LiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBhIGxpdHRsZSBsYXJnZXIgdGhhbiBuZWVkZWQsCisgICAgLy8gc28gdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFzIHRvIHdoZXRoZXIgbVdyaXRlSGVhZCA9PSBtUmVhZEhlYWQgbWVhbnMgYnVmZmVyCisgICAgLy8gZnVsbCBvciBlbXB0eQorICAgIHNpemVfdCBhdmFpbGFibGUgPSBtQ2FwYWNpdHkgLSBzaXpldXNlZCAtIDMyOworICAgIGlmIChhdmFpbGFibGUgPCBudW0pIHsKKyAgICAgICAgaW50MzJfdCBuZXdjYXBhY2l0eSA9IG1DYXBhY2l0eSArIChudW0gLSBhdmFpbGFibGUpOworICAgICAgICBjaGFyICogbmV3YnVmZmVyID0gbmV3IGNoYXJbbmV3Y2FwYWNpdHldOworICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyLCBtQ2FwYWNpdHkpOworICAgICAgICBkZWxldGUgW10gbUN1dEJ1ZmZlcjsKKyAgICAgICAgbUNhcGFjaXR5ID0gbmV3Y2FwYWNpdHk7CisgICAgICAgIG1DdXRCdWZmZXIgPSBuZXdidWZmZXI7CisgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlZCBidWZmZXIgYXQgc2l6ZSAlZCIsIG5ld2NhcGFjaXR5KTsKKyAgICB9CisKKyAgICBzaXplX3QgY29weWZpcnN0ID0gKG1DYXBhY2l0eSAtIG1Xcml0ZUhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShtQ3V0QnVmZmVyICsgbVdyaXRlSGVhZCwgc3JjLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBzcmMgKz0gY29weWZpcnN0OworICAgICAgICBtV3JpdGVIZWFkICs9IGNvcHlmaXJzdDsKKyAgICAgICAgQ0hFQ0tfTEUobVdyaXRlSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1Xcml0ZUhlYWQgPT0gbUNhcGFjaXR5KSBtV3JpdGVIZWFkID0gMDsKKyAgICAgICAgaWYgKG51bSkgeworICAgICAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIsIHNyYywgbnVtKTsKKyAgICAgICAgICAgIG1Xcml0ZUhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6cmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKworICAgIGF2YWlsYWJsZSAtPSBtQmFja1BhZGRpbmc7CisgICAgaWYgKGF2YWlsYWJsZSA8PTApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhdmFpbGFibGUgPCBpbnQzMl90KG51bSkpIHsKKyAgICAgICAgbnVtID0gYXZhaWxhYmxlOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoY29weWZpcnN0ID4gbnVtKSBjb3B5Zmlyc3QgPSBudW07CisgICAgaWYgKGNvcHlmaXJzdCkgeworICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyICsgbVJlYWRIZWFkLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBkc3QgKz0gY29weWZpcnN0OworICAgICAgICBtUmVhZEhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtUmVhZEhlYWQsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtUmVhZEhlYWQgPT0gbUNhcGFjaXR5KSBtUmVhZEhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyLCBudW0pOworICAgICAgICAgICAgbVJlYWRIZWFkICs9IG51bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6c2l6ZSgpIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTY5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNkZWZpbmUgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIHV0aWxpdHkgY2xhc3MgdG8gY3V0IHRoZSBzdGFydCBhbmQgZW5kIG9mZiBhIHN0cmVhbSBvZiBkYXRhIGluIE1lZGlhQnVmZmVycworICoKKyAqLworY2xhc3MgU2tpcEN1dEJ1ZmZlcjogcHVibGljIFJlZkJhc2UgeworIHB1YmxpYzoKKyAgICAvLyAnc2tpcCcgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcCBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAvLyAnY3V0JyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBjdXQgZnJvbSB0aGUgZW5kCisgICAgLy8gJ251bTE2Qml0Q2hhbm5lbHMnIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIHdoaWNoIGFyZSBhc3N1bWVkIHRvIGJlIDE2IGJpdCB3aWRlIGVhY2gKKyAgICBTa2lwQ3V0QnVmZmVyKHNpemVfdCBza2lwLCBzaXplX3QgY3V0LCBzaXplX3QgbnVtMTZDaGFubmVscyk7CisKKyAgICAvLyBTdWJtaXQgb25lIE1lZGlhQnVmZmVyIGZvciBza2lwcGluZyBhbmQgY3V0dGluZy4gVGhpcyBtYXkgY29uc3VtZSBhbGwgb3IKKyAgICAvLyBzb21lIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIsIG9yIGl0IG1heSBhZGQgZGF0YSB0byBpdC4KKyAgICAvLyBBZnRlciB0aGlzLCB0aGUgY2FsbGVyIHNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBidWZmZXIgYXMgdXN1YWwuCisgICAgdm9pZCBzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7ICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFuIEFCdWZmZXIKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgY2xlYXIoKTsKKyAgICBzaXplX3Qgc2l6ZSgpOyAvLyBob3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYnVmZmVyCisKKyBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U2tpcEN1dEJ1ZmZlcigpOworCisgcHJpdmF0ZToKKyAgICB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSk7CisgICAgc2l6ZV90IHJlYWQoY2hhciAqZHN0LCBzaXplX3QgbnVtKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpOworICAgIGludDMyX3QgbVNraXA7CisgICAgaW50MzJfdCBtRnJvbnRQYWRkaW5nOworICAgIGludDMyX3QgbUJhY2tQYWRkaW5nOworICAgIGludDMyX3QgbVdyaXRlSGVhZDsKKyAgICBpbnQzMl90IG1SZWFkSGVhZDsKKyAgICBpbnQzMl90IG1DYXBhY2l0eTsKKyAgICBjaGFyKiBtQ3V0QnVmZmVyOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNraXBDdXRCdWZmZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZjU1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjY29kZWNfdW5pdF90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWNfc2FuaXR5X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM2ODdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjU2FuaXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhQ29kZWNTYW5pdHlUZXN0KCkKKyAgICAgICAgOiBsb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgICAgIGNmZyhuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIGlmbXQobmV3IEFNZXNzYWdlKSwKKyAgICAgICAgICBvZm10KG5ldyBBTWVzc2FnZSkgeworICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB+TWVkaWFDb2RlY1Nhbml0eVRlc3QoKSB7CisgICAgICAgIGlmIChjb2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGxvb3Blci0+c3RvcCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gY2ZnOworICAgIHNwPEFNZXNzYWdlPiBpZm10OworICAgIHNwPEFNZXNzYWdlPiBvZm10OworfTsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrTGluZWFyQnVmZmVyU2l6ZSA9IDEwNDg1NzY7CisKKy8vIGRhdGEgZm9yIGEgY29kZWMgaW5wdXQgZnJhbWUKK3N0cnVjdCBGcmFtZURhdGEgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgdGVtcGxhdGU8c2l6ZV90IE4+CisgICAgY29uc3RleHByIEZyYW1lRGF0YShjb25zdCB1aW50OF90KCZkYXRhXylbTl0pIDogZGF0YShkYXRhXyksIHNpemUoTikgeyB9Cit9OworCisvLyBvbmUgeWVsbG93IGZyYW1lIG9mIDI0MHgxODAgKGFsYmVpdCA0OjQ6NCkKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0ExW10gPSB7IC8vIElEUiBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4NjQsIDB4MDAsIDB4MGQsIDB4YWMsIDB4ZDksIDB4NDEsIDB4NDEsIDB4ZmEsIDB4MTAsIDB4MDAsIDB4MDAsCisgICAgMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgyMCwgMHhmMSwgMHg0MiwgMHg5OSwgMHg2MCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZWIsIDB4ZTMsIDB4Y2IsIDB4MjIsIDB4YzAsCisKKyAgICAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDg4LCAweDg0LCAweDAwLCAweDJiLCAweGZmLCAweGZlLCAweGQ4LCAweGU3LCAweGYzLCAweDJjLCAweGE1LCAweDYwLAorICAgIDB4Y2EsIDB4YmIsIDB4ZjEsIDB4NWMsIDB4NDQsIDB4N2MsIDB4OWEsIDB4YTUsIDB4YzMsIDB4YWIsIDB4MmYsIDB4NzcsIDB4MGEsIDB4OTQsIDB4MGQsIDB4MTksCisgICAgMHg0MywgMHgzYiwgMHg0ZiwgMHgyNSwgMHhlYSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgzNSwgMHg1ZiwgMHhjMiwgMHgzNCwgMHg4OSwgMHhkMSwKKyAgICAweGE1LCAweDYwLCAweDA5LCAweDk4LCAweDAwLCAweDAxLCAweDFiLCAweDBlLCAweGNiLCAweDBkLCAweDA0LCAweDg2LCAweDk0LCAweGUyLCAweDMyLCAweDNjLAorICAgIDB4ZGQsIDB4MGYsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0FbXSBfX3VudXNlZCA9IHsgYXZjU3RyZWFtX0ExIH07CisKKy8vIEFWQyBzdHJlYW0gb2YgMiB5ZWxsb3cgZnJhbWVzICgyNDB4MTgwKQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwYywgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDgwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MzMsIDB4ZmYsIDB4ZmUsIDB4ZGYsIDB4MzIsIDB4ZjgsIDB4MTQsIDB4ZDYsIDB4MjUsCisgICAgMHhkMCwgMHg3NCwgMHg0MiwgMHg1MCwgMHg4NCwgMHg2ZiwgMHhmNCwgMHhjMiwgMHg1YywgMHg3NiwgMHgzNywgMHgxNywgMHg3MiwgMHhhYywgMHg1MiwgMHhmYywKKyAgICAweGQ2LCAweDFmLCAweGQyLCAweGQwLCAweDYwLCAweGIyLCAweDIwLCAweDAwLCAweDEwLCAweDNkLCAweDJhLCAweGMwLCAweGU0LCAweDI3LCAweGNiLCAweGNlLAorICAgIDB4ZWEsIDB4MjUsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4NDAsIDB4YmMsIDB4ODEsIDB4MTUsIDB4YzEsIDB4NjUsIDB4MjAsIDB4ODAsIDB4ODEsCisgICAgMHg3YSwgMHg1NywgMHg1MSwKK307CisKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0IyW10gPSB7IC8vIFAgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDlhLCAweDIxLCAweDZjLCAweDQyLCAweGJmLCAweGZlLCAweDM4LCAweDQwLCAweDAwLCAweDBkLCAweDQ4LAorfTsKKworRnJhbWVEYXRhIGF2Y1N0cmVhbV9CW10gPSB7IGF2Y1N0cmVhbV9CMSwgYXZjU3RyZWFtX0IyIH07CisKK2NsYXNzIE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXZjRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdFZpZGVvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQudnA4LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX1ZQOCk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdEF1ZGlvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDQ0MTAwKTsKKyAgICBjZmctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMik7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgY29uc3QgaW50MzJfdCBJbnB1dFNpemUgPSBHZXRQYXJhbSgpOworICAgIGlmIChJbnB1dFNpemUgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIElucHV0U2l6ZSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRGb3JtYXQoJmlmbXQpLCBPSyk7CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCAxIDw8IDE5KTsgLy8gNTEyIEtCCisgICAgICAgIH0KKyAgICAgICAgbWF4SW5wdXRTaXplID0ga0xpbmVhckJ1ZmZlclNpemU7IC8vIGlucHV0IHNpemUgaXMgc2V0IGJ5IGNoYW5uZWwKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5wdXRTaXplcywgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKC0xLCAxMjM0LCAxMjM0NTY3OCkpOworCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RBdmNEZWNvZGVySGRyU3RhdGljSW5mbykgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0IpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9CKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgJm9pbmZvKSk7CisgICAgQVNTRVJUX0VRKG9pbmZvLT5zaXplKCksIHNpemVvZihpbmZvKSk7CisgICAgRVhQRUNUX0VRKG1lbWNtcChvaW5mby0+ZGF0YSgpLCAmaW5mbywgc2l6ZW9mKGluZm8pKSwgIDApOworfQorCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RWaWRlb0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK2NsYXNzIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCA6IHB1YmxpYyBNZWRpYUNvZGVjU2FuaXR5VGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIFRlc3RWaWRlb0RlY29kZXI0MjBQbGFuYXIpIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIik7CisvLyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBjb25zdCBpbnQzMl90IENvbG9yID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoQ29sb3IgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDb2xvcik7CisgICAgfQorICAgIGludDMyX3QgeGNvbG9yID0gQ29sb3IgPT0gLTEgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDb2xvcjsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBpbnQzMl90IG9jb2xvciA9IC0xOworICAgIEVYUEVDVF9UUlVFKG9mbXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJm9jb2xvcikpOworICAgIEVYUEVDVF9FUShvY29sb3IsIHhjb2xvcik7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0EpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9BKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKSA8PCBvZm10LT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpIDw8IGJ1Zi0+bWV0YSgpLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpOworICAgIC8vIGV4cGVjdCBhbiBpbWFnZS1kYXRhIGluIGJvdGggZm9ybWF0IGFuZCBtZXRhCisgICAgc3A8QUJ1ZmZlcj4gaW1nQnVmLCBpbWdCdWYyOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmKSk7CisgICAgQVNTRVJUX1RSVUUoYnVmLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmMikpOworICAgIEVYUEVDVF9FUShpbWdCdWYtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgQVNTRVJUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBpbWdCdWYyLT5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoaW1nQnVmLT5kYXRhKCksIGltZ0J1ZjItPmRhdGEoKSwgaW1nQnVmLT5zaXplKCkpKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWdCdWYtPmRhdGEoKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tVHlwZSwgaW1nLT5NRURJQV9JTUFHRV9UWVBFX1lVVik7CisgICAgRVhQRUNUX0VRKGltZy0+bU51bVBsYW5lcywgM3UpOworICAgIEVYUEVDVF9FUShpbWctPm1XaWR0aCwgMzIwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUhlaWdodCwgMjQwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoLCA4dSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoQWxsb2NhdGVkLCA4dSk7CisKKyAgICAvLyByZWFkIHN0cmlkZXMgZnJvbSBmb3JtYXQKKyAgICBpbnQzMl90IHN0cmlkZSwgdnN0cmlkZTsKKyAgICBvZm10LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpICAgICAgICAgIHx8IG9mbXQtPmZpbmRJbnQzMigid2lkdGgiLCAmc3RyaWRlKTsKKyAgICBvZm10LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZ2c3RyaWRlKSAgIHx8IG9mbXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJnZzdHJpZGUpOworCisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUhvcml6U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tVmVydFN1YnNhbXBsaW5nLCAxdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisKKyAgICBzd2l0Y2ggKHhjb2xvcikgeworICAgICAgICAvLyBkZWZpbmVkIGZvcm1hdHMKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCwgMHUpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0KSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSAvIDIpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0ICsgc3RyaWRlIC8gMiAqIDExOSArIDE2MCkpOworICAgICAgICAgICAgRVhQRUNUX0xFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyAxKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICsgc3RyaWRlICogMTE5ICsgMzIwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgLy8gYW55dGhpbmcgZ29lcywgYnV0IHN0cmlkZSBzaG91bGQgbWF0Y2ggWSBwbGFuZQorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCArIDIzOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMTkgKiBpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMgKyAxIH0pKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB2YWxpZGF0ZSBhbGwgcGl4ZWxzCisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiTWVkaWFJbWFnZSB7IEYoJXV4JXUpIEAldSslZCslZCBAJXUrJWQrJWQgQCV1KyVkKyVkIH1cbiIsCisgICAgICAgICAgICBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0LAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMF0ubUNvbEluYywgaW1nLT5tUGxhbmVbMF0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzFdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzFdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVsyXS5tQ29sSW5jLCBpbWctPm1QbGFuZVsyXS5tUm93SW5jKTsKKyNlbmRpZgorICAgIGZvciAoaXggPSAwOyBpeCA8IDM7ICsraXgpIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsgMjEwLCAxNiwgMTQ2IH07CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbWctPm1IZWlnaHQgLyBpbWctPm1QbGFuZVtpeF0ubVZlcnRTdWJzYW1wbGluZyA7ICsreSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGltZy0+bVdpZHRoIC8gaW1nLT5tUGxhbmVbaXhdLm1Ib3JpelN1YnNhbXBsaW5nOyArK3gpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZhbCA9IGJ1Zi0+ZGF0YSgpW2ltZy0+bVBsYW5lW2l4XS5tT2Zmc2V0ICsgaW1nLT5tUGxhbmVbaXhdLm1Db2xJbmMgKiB4CisgICAgICAgICAgICAgICAgICAgICAgICArIGltZy0+bVBsYW5lW2l4XS5tUm93SW5jICogeV07CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZhbCwgZXhwZWN0ZWRbaXhdKSA8PCAiaW5jb3JyZWN0IHZhbHVlIGZvciBwbGFuZSAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpeCA8PCAiIGF0IHg9IiA8PCB4IDw8ICIsIHk9IiA8PCB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAtMSwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGIwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPFJlZmxlY3RlZFBhcmFtVXBkYXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4VGVzdFN0YXJ0ID0gMHgxMDAwLAorICAgIGtQYXJhbUluZGV4SW50LAorICAgIGtQYXJhbUluZGV4U3RyaW5nLAorICAgIGtQYXJhbUluZGV4Q29tcG9zaXRlLAorICAgIGtQYXJhbUluZGV4RmxleFN0cmluZywKKworICAgIGtQYXJhbUluZGV4TG9uZyA9IEMyUGFyYW06OlRZUEVfSU5ERVhfVkVORE9SX1NUQVJULAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleEludD4gQzJJbnRJbmZvOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleExvbmc+IEMyTG9uZ0luZm87CisKK3N0cnVjdCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCB7CisgICAgY2hhciB2YWx1ZVsxMl07CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoRml4ZWRTaXplU3RyaW5nKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJGaXhlZFNpemVTdHJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4U3RyaW5nPiBDMlN0cmluZ0luZm87CisKK3N0cnVjdCBDMkNvbXBvc2l0ZVN0cnVjdCB7CisgICAgaW50MzJfdCBpMzI7CisgICAgdWludDY0X3QgdTY0OworICAgIGNoYXIgc3RyWzEyXTsKKyAgICB1aW50OF90IGJsb2JbOF07CisgICAgdWludDhfdCBmbGV4QmxvYltdOworCisgICAgQzJDb21wb3NpdGVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChDb21wb3NpdGUsIGZsZXhCbG9iKQorICAgIEMyRklFTEQoaTMyLCAiaTMyIikKKyAgICBDMkZJRUxEKHU2NCwgInU2NCIpCisgICAgQzJGSUVMRChzdHIsICJzdHIiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoZmxleEJsb2IsICJmbGV4LWJsb2IiKQorfTsKK3N0YXRpY19hc3NlcnQoQzJDb21wb3NpdGVTdHJ1Y3Q6OkZMRVhfU0laRSA9PSAxLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9DMkZsZXhIZWxwZXI8QzJDb21wb3NpdGVTdHJ1Y3Q+OjpGTEVYX1NJWkUgPT0gMSwgIiIpOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJDb21wb3NpdGVTdHJ1Y3QsIGtQYXJhbUluZGV4Q29tcG9zaXRlPiBDMkNvbXBvc2l0ZUluZm87CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4RmxleFN0cmluZz4gQzJGbGV4U3RyaW5nSW5mbzsKKworI2RlZmluZSBTVVBQT1JURURfVFlQRVMgICBcCisgICAgQzJJbnRJbmZvLCAgICAgICAgICAgIFwKKyAgICBDMkxvbmdJbmZvLCAgICAgICAgICAgXAorICAgIEMyU3RyaW5nSW5mbywgICAgICAgICBcCisgICAgQzJDb21wb3NpdGVJbmZvLCAgICAgIFwKKyAgICBDMkZsZXhTdHJpbmdJbmZvCisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDxULCBUWVBFUy4uLj4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IFQ6OkNPUkVfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlX2ltcGw8VFlQRVMuLi4+OjpkZXNjcmliZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBkZXNjcmliZV9pbXBsPD4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgY2hhciAqR2V0TmFtZSgpICAgICAgICB7IHJldHVybiBudWxscHRyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJJbnRJbmZvPigpICAgICAgIHsgcmV0dXJuICJpbnQiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJMb25nSW5mbz4oKSAgICAgIHsgcmV0dXJuICJsb25nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyU3RyaW5nSW5mbz4oKSAgICB7IHJldHVybiAic3RyaW5nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyQ29tcG9zaXRlSW5mbz4oKSB7IHJldHVybiAiY29tcG9zaXRlIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyRmxleFN0cmluZ0luZm8+KCkgeyByZXR1cm4gImZsZXgtc3RyaW5nIjsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUWVBFUz4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHZvaWQgZmlsbChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqdmVjKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxUWVBFUy4uLj46OmZpbGwodmVjKTsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fVFlQRSwgQzJQYXJhbURlc2NyaXB0b3I6OklTX1BFUlNJU1RFTlQsIEdldE5hbWU8VD4oKSkpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDw+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICopIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUICpDYXN0UGFyYW0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSkgeworICAgIHJldHVybiAoVCAqKXBhcmFtLmdldCgpOworfQorCitjbGFzcyBQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKKyAgICB+UGFyYW1SZWZsZWN0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpkZXNjcmliZShwYXJhbUluZGV4KTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QoKSA6IG1SZWZsZWN0b3IobmV3IFBhcmFtUmVmbGVjdG9yKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpmaWxsKCZtRGVzY3JpcHRvcnMpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1EZXNjcmlwdG9yczsKK307CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTaW5nbGVWYWx1ZVRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImludC52YWx1ZSIsIGludDMyX3QoMTIpKTsKKyAgICBtc2cuZW1wbGFjZSgidmVuZG9yLmxvbmcudmFsdWUiLCBpbnQ2NF90KDM0KSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMySW50SW5mbyk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJMb25nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTIsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMzQsIENhc3RQYXJhbTxDMkxvbmdJbmZvPihwYXJhbXNbMV0pLT52YWx1ZSk7CisKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlID0gMDsKKyAgICBpbnQ2NF90IGludDY0VmFsdWUgPSAwOworICAgIG1zZyA9IHVwZGF0ZXIuZ2V0UGFyYW1zKHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImludC52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJpbnQudmFsdWUiXS5maW5kKCZjMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDEyLCBpbnQzMlZhbHVlKTsKKworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJ2ZW5kb3IubG9uZy52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJ2ZW5kb3IubG9uZy52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMzQsIGludDY0VmFsdWUpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgU3RyaW5nVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgic3RyaW5nLnZhbHVlIiwgQVN0cmluZygiNTYiKSk7CisgICAgbXNnLmVtcGxhY2UoImZsZXgtc3RyaW5nLnZhbHVlIiwgQVN0cmluZygiU29tZSBzdHJpbmciKSk7CisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkZsZXhTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmluZ0luZm8pOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZVswXSk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkZsZXhTdHJpbmdJbmZvOjpBbGxvY1VuaXF1ZSgwKSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIGNoYXIgKmZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiNTYiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDEydSwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlNvbWUgc3RyaW5nIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9ORShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKyAgICBmbGV4U3RyaW5nRGF0YSA9ICZDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZVswXTsKKworICAgIC8vIHZlcmlmeSB0cnVuY2F0aW9uIGFuZCBpbi1wbGFjZSB1cGRhdGUKKyAgICBtc2dbInN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCIxMjM0NTY3ODkwQUJDREUiKSk7CisgICAgbXNnWyJmbGV4LXN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCJhYmMiKSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiMTIzNDU2Nzg5MEEiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDR1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9FUShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgic3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInN0cmluZy52YWx1ZSJdLmZpbmQoJnN0clZhbHVlKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIHN0clZhbHVlLmNfc3RyKCkpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImZsZXgtc3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImFiYyIsIHN0clZhbHVlLmNfc3RyKCkpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIGludDMyX3QoNzgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnU2NCIsIGludDY0X3QoOTEwKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5zdHIiLCBBU3RyaW5nKCIxMTEyIikpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmZmVyMDgiLCA4KSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImZsZXgtYnVmZmVyLTE0IiwgMTQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiXDBcMFwwXDBcMFwwXDBcMCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCkpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIHVpbnQ4X3QgKmZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSg3OCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSg5MTB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX1NUUkVRKCIxMTEyIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5zdHIpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZmZlcjA4IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVN0cmluZyBoZXg7CisgICAgaGV4ZHVtcChDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgsIDAsICZoZXgpOworICAgIHByaW50ZigiJXNcbiIsIGhleC5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9ORShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKyAgICBmbGV4QmxvYkRhdGEgPSAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgemVybyBleHRlbmRpbmcgc2hvcnRlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmMDUiLCA1KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZjA1XDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHNldHRpbmcgYW5kIHRyaW1taW5nIGxhcmdlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiUmVhbGx5TG9uZ0J1ZmZlciIsIDE2KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoIlJlYWxseUxvIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHRyaW1taW5nIGZsZXggYmxvYiBpbi1wbGFjZQorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuZmxleC1ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDV1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDUiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCA1KSk7CisgICAgRVhQRUNUX0VRKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlUGFydGlhbFRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5pMzIiLCBDMlZhbHVlKDEzMTQpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjE1MTYiKSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2soQzJDb21wb3NpdGVJbmZvOjpBbGxvY1VuaXF1ZSgxMnUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDEzMTQsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uaTMyKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjE1MTYiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZjAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMk1hcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4NjYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBjb3B5IGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgdWludDhfdCwgY29uc3QgdWludDhfdD46OnR5cGUgKmltZ1JvdyA9CisgICAgICAgICAgICBpbWdCYXNlICsgaW1nLT5tUGxhbmVbaV0ubU9mZnNldDsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIGNvbnN0IHVpbnQ4X3QsIHVpbnQ4X3Q+Ojp0eXBlICp2aWV3Um93ID0KKyAgICAgICAgICAgIHZpZXdSb3cgPSB2aWV3LmRhdGEoKVtpXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgaWYgKHBsYW5lLmNvbFNhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucm93U2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IGltZy0+bUJpdERlcHRoQWxsb2NhdGVkCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIC8vIE1lZGlhSW1hZ2Ugb25seSBzdXBwb3J0cyBNU0IgdmFsdWVzCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgfHwgKGJwcCA+IDEgJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBwbGFuZS5OQVRJVkUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CisgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgeworICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkNvcHlCeVJvdykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdSb3csIHZpZXdSb3csIHN0ZDo6bWluKHBsYW5lLnJvd0luYywgaW1nLT5tUGxhbmVbaV0ubVJvd0luYykpOworICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW1nUm93KSBpbWdQdHIgPSBpbWdSb3c7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwbGFuZVc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1B0ciwgdmlld1B0ciwgYnBwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgICAgIHZpZXdQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2aWV3Um93ICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICh2aWV3LndpZHRoKCkgIT0gaW1nLT5tV2lkdGggfHwgdmlldy5oZWlnaHQoKSAhPSBpbWctPm1IZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHx8IChJc0k0MjAodmlldykgJiYgSXNOVjEyKGltZykpKSB7CisgICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgorICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgICAgICB1aW50OF90KiBkc3RfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgICAgICBpZiAoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAodmlldy53aWR0aCgpICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuaGVpZ2h0KCkgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB8fCAoSXNJNDIwKGltZykgJiYgSXNOVjEyKHZpZXcpKSkgeworICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKKyAgICAgICAgdWludDhfdCogZHN0X3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICAgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICAgICAgdWludDhfdCogZHN0X3YgPSB2aWV3LmRhdGEoKVsyXTsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfSW1hZ2VDb3B5PGZhbHNlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOworfQorCitib29sIElzWVVWNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5udW1QbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgbGF5b3V0LnR5cGUgPT0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93U2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd1NhbXBsaW5nID09IDIpOworfQorCitib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAxKTsKK30KKworYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5yb290UGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLm9mZnNldCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm9vdEl4ID09IGxheW91dC5QTEFORV9WCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5vZmZzZXQgPT0gMCk7Cit9CisKK2Jvb2wgSXNZVVY0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIHJldHVybiAoaW1nLT5tVHlwZSA9PSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYKKyAgICAgICAgICAgICYmIGltZy0+bU51bVBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aEFsbG9jYXRlZCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tVmVydFN1YnNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubVZlcnRTdWJzYW1wbGluZyA9PSAyKTsKK30KKworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIChpbWctPm1QbGFuZVsyXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCA9PSAxKSk7Cit9CisKK2Jvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKGltZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0ID4gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCk7Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKiA1IC8gNCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CisgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKKyAgICAgICAgLm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLAorICAgICAgICAubU51bVBsYW5lcyA9IDMsCisgICAgICAgIC5tV2lkdGggPSB3aWR0aCwKKyAgICAgICAgLm1IZWlnaHQgPSBoZWlnaHQsCisgICAgICAgIC5tQml0RGVwdGggPSA4LAorICAgICAgICAubUJpdERlcHRoQWxsb2NhdGVkID0gOCwKKyAgICAgICAgLm1QbGFuZSA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKyAxLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMiwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICB9OworfQorCitzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKSB7CisgICAgQ0hFQ0soZHN0WSAhPSBudWxscHRyKTsKKyAgICBDSEVDSygoc3JjLndpZHRoKCkgJiAxKSA9PSAwKTsKKyAgICBDSEVDSygoc3JjLmhlaWdodCgpICYgMSkgPT0gMCk7CisKKyAgICBpZiAoZHN0U3RyaWRlICogZHN0VlN0cmlkZSAqIDMgLyAyID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRCgiY29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVViIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RZICsgZHN0U3RyaWRlICogZHN0VlN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RTdHJpZGUgPj4gMSkgKiAoZHN0VlN0cmlkZSA+PiAxKTsKKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBzcmMubGF5b3V0KCk7CisgICAgY29uc3QgdWludDhfdCAqcFJlZCAgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfUl07CisgICAgY29uc3QgdWludDhfdCAqcEdyZWVuID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfR107CisgICAgY29uc3QgdWludDhfdCAqcEJsdWUgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfQl07CisKKyNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVkID0gKnBSZWQ7CisgICAgICAgICAgICB1aW50OF90IGdyZWVuID0gKnBHcmVlbjsKKyAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZSA9ICpwQmx1ZTsKKworICAgICAgICAgICAgLy8gdXNpbmcgSVRVLVIgQlQuNjAxIGNvbnZlcnNpb24gbWF0cml4CisgICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KKyAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2KSwgMjU1KTsKKworICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7CisKKyAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9CisgICAgICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjgpLCAyNTUpOworCisgICAgICAgICAgICAgICAgZHN0VVt4ID4+IDFdID0gVTsKKyAgICAgICAgICAgICAgICBkc3RWW3ggPj4gMV0gPSBWOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYzsKKyAgICAgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmM7CisgICAgICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBwUmVkICAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBHcmVlbiAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEJsdWUgIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0ucm93SW5jOworICAgICAgICBwR3JlZW4gKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10ucm93SW5jOworICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0ucm93SW5jOworCisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBibG9jayBvZiByYXcgYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrIHsKKyAgICBNZW1vcnlCbG9ja1Bvb2xCbG9jayhzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtRGF0YShuZXcgdWludDhfdFtzaXplXSksIG1TaXplKG1EYXRhID8gc2l6ZSA6IDApIHsgfQorCisgICAgfk1lbW9yeUJsb2NrUG9vbEJsb2NrKCkgeworICAgICAgICBkZWxldGVbXSBtRGF0YTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xCbG9jayk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworfTsKKworLyoqCisgKiBBIHNpbXBsZSByYXcgbWVtb3J5IGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKKyAgICB2b2lkIHJlbGVhc2Uoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgLy8gcmV0dXJuIGJsb2NrIHRvIGZyZWUgYmxvY2tzIGlmIGl0IGlzIHRoZSBjdXJyZW50IHNpemU7IG90aGVyd2lzZSwgZGlzY2FyZAorICAgICAgICBpZiAoYmxvY2stPnNpemUoKSA9PSBtQ3VycmVudFNpemUpIHsKKyAgICAgICAgICAgIG1GcmVlQmxvY2tzLnNwbGljZShtRnJlZUJsb2Nrcy5iZWdpbigpLCBtQmxvY2tzSW5Vc2UsIGJsb2NrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5lcmFzZShibG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBmZXRjaChzaXplX3Qgc2l6ZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRnJlZUJsb2Nrcy5yZW1vdmVfaWYoW3NpemVdKGNvbnN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrICZibG9jaykgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gYmxvY2suc2l6ZSgpICE9IHNpemU7CisgICAgICAgIH0pOworICAgICAgICBtQ3VycmVudFNpemUgPSBzaXplOworICAgICAgICBpZiAobUZyZWVCbG9ja3MuZW1wdHkoKSkgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVtcGxhY2VfZnJvbnQoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2Uuc3BsaWNlKG1CbG9ja3NJblVzZS5iZWdpbigpLCBtRnJlZUJsb2NrcywgbUZyZWVCbG9ja3MuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CbG9ja3NJblVzZS5iZWdpbigpOworICAgIH0KKworICAgIE1lbW9yeUJsb2NrUG9vbEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xJbXBsKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+IG1GcmVlQmxvY2tzOworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUJsb2Nrc0luVXNlOworICAgIHNpemVfdCBtQ3VycmVudFNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sOjpJbXBsIDogTWVtb3J5QmxvY2tQb29sSW1wbCB7Cit9OworCitzdHJ1Y3QgTWVtb3J5QmxvY2s6OkltcGwgeworICAgIEltcGwoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2ssCisgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gcG9vbCkKKyAgICAgICAgOiBtQmxvY2soYmxvY2spLCBtUG9vbChwb29sKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIG1Qb29sLT5yZWxlYXNlKG1CbG9jayk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbG9jay0+ZGF0YSgpOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIG1CbG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gbVBvb2w7Cit9OworCitNZW1vcnlCbG9jayBNZW1vcnlCbG9ja1Bvb2w6OmZldGNoKHNpemVfdCBzaXplKSB7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgcG9vbEJsb2NrID0gbUltcGwtPmZldGNoKHNpemUpOworICAgIHJldHVybiBNZW1vcnlCbG9jayhzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrOjpJbXBsPigKKyAgICAgICAgICAgIHBvb2xCbG9jaywgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PE1lbW9yeUJsb2NrUG9vbEltcGw+KG1JbXBsKSkpOworfQorCitNZW1vcnlCbG9ja1Bvb2w6Ok1lbW9yeUJsb2NrUG9vbCgpCisgICAgOiBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrUG9vbDo6SW1wbD4oKSkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrOjpJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK01lbW9yeUJsb2NrOjp+TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK2NvbnN0IHVpbnQ4X3QqIE1lbW9yeUJsb2NrOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbCA/IG1JbXBsLT5kYXRhKCkgOiBudWxscHRyOworfQorCitzaXplX3QgTWVtb3J5QmxvY2s6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPnNpemUoKSA6IDA7Cit9CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrOjpBbGxvY2F0ZShzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBNZW1vcnlCbG9ja1Bvb2woKS5mZXRjaChzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCisjZGVmaW5lIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvbnZlcnRzIGFuIFJHQiB2aWV3IHRvIHBsYW5hciBZVVYgNDIwIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBkc3RZICAgICAgIHBvaW50ZXIgdG8gbWVkaWEgaW1hZ2UgYnVmZmVyCisgKiBccGFyYW0gZHN0U3RyaWRlICBzdHJpZGUgaW4gYnl0ZXMKKyAqIFxwYXJhbSBkc3RWU3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBidWZmZXJTaXplIG1lZGlhIGltYWdlIGJ1ZmZlciBzaXplCisgKiBccGFyYW0gc3JjIHNvdXJjZSBpbWFnZQorICoKKyAqIFxyZXR2YWwgTk9fTUVNT1JZIG1lZGlhIGltYWdlIGlzIHRvbyBzbWFsbAorICogXHJldHZhbCBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpOworCisvKioKKyAqIFJldHVybnMgYSBwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpOworCisvKioKKyAqIFJldHVybnMgYSBzZW1pcGxhbmFyIFlVViA0MjAgOC1iaXQgbWVkaWEgaW1hZ2UgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBzdHJpZGUgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHZzdHJpZGUgdmVydGljYWwgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICovCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBTZW1pUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogQ29waWVzIGEgZ3JhcGhpYyB2aWV3IGludG8gYSBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIENvcGllcyBhIG1lZGlhIGltYWdlIGludG8gYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weShDMkdyYXBoaWNWaWV3ICZ2aWV3LCBjb25zdCB1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBZVVYgNDIwIDg4OCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNZVVY0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgTlYxMiBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjEyKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgWVVWIDQyMCA4ODggbGF5b3V0LgorICovCitib29sIElzWVVWNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBOVjEyIGxheW91dC4KKyAqLworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgorICoKKyAqIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIEMyTGluZWFyQmxvY2tzIGZyb20gYSBwcml2YXRlIEMyQmxvY2tQb29sCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPHVpbnQ4X3Q+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbmxpbmUgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y29uc3QgTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZXMgYW4gdW5tYW5hZ2VkIGJsb2NrIChub3QgaW4gYSBwb29sKQorICAgIHN0YXRpYyBNZW1vcnlCbG9jayBBbGxvY2F0ZShzaXplX3QpOworCisgICAgLy8gbWVtb3J5IGJsb2NrIHdpdGggbm8gYWN0dWFsIG1lbW9yeSAoc2l6ZSBpcyAwLCBkYXRhIGlzIG51bGwpCisgICAgTWVtb3J5QmxvY2soKTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIE1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlCbG9jaygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSByYXcgbWVtb3J5IG1pbmktcG9vbC4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbCB7CisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJsb2NrIHdpdGggYSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcworICAgICAqLworICAgIE1lbW9yeUJsb2NrIGZldGNoKHNpemVfdCBzaXplKTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCgpOworICAgIH5NZW1vcnlCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMTMxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0wLDAgKzEsOTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIGZvciBJTlQzMl9NQVgKKworI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQWFjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsICAgICAgICAgQUFDT2JqZWN0TEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOLCAgICAgICBBQUNPYmplY3RNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSLCAgICAgICAgQUFDT2JqZWN0U1NSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQLCAgICAgICAgQUFDT2JqZWN0TFRQIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsICAgICAgICAgQUFDT2JqZWN0SEUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDLCAgICAgIEFBQ09iamVjdEVSTEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgQUFDT2JqZWN0RVJTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELCAgICAgICAgIEFBQ09iamVjdExEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsICAgICAgQUFDT2JqZWN0SEVfUFMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsICAgICAgICBBQUNPYmplY3RFTEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUsICAgICAgICBBQUNPYmplY3RYSEUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsICAgIEFWQ0xldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgICBBVkNMZXZlbDFiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwgIEFWQ0xldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCAgQVZDTGV2ZWwxMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsICBBVkNMZXZlbDEzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsICAgIEFWQ0xldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsICBBVkNMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwgIEFWQ0xldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgICAgQVZDTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgIEFWQ0xldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCAgQVZDTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180LCAgICBBVkNMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCAgQVZDTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsICBBVkNMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsICAgIEFWQ0xldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsICBBVkNMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiwgIEFWQ0xldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNiwgICAgQVZDTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSwgIEFWQ0xldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8yLCAgQVZDTGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXZjUHJvZmlsZXMgPSB7CisgICAgLy8gdHJlYXQgcmVzdHJpY3RlZCBwcm9maWxlcyBhcyBmdWxsIHByb2ZpbGUgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCAtIHdoaWNoIHdvcmtzIGZvcgorICAgIC8vIGRlY29kZXJzLCBidXQgbm90IGZvciBlbmNvZGVycworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90PiBzQml0cmF0ZU1vZGVzID0geworICAgIHsgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsICAgICAgQklUUkFURV9NT0RFX0NCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUsICAgQklUUkFURV9NT0RFX1ZCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFLCAgICAgQklUUkFURV9NT0RFX0NRIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4gc0NvbG9yTWF0cmljZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNjAxLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfMjQwTSwgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhTTVBURTI0ME0gfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAsICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMENvbnN0YW50IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfT1RIRVIsICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnByaW1hcmllc190LCBDb2xvckFzcGVjdHM6OlByaW1hcmllcz4gc0NvbG9yUHJpbWFyaWVzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsICBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDksICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNzA5XzUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDQ3MF9NLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ0NzBfNk0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV82MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl82MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV81MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl81MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19HRU5FUklDX0ZJTE0sIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAsICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQyMDIwIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19SUDQzMSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FRzQzMiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FQlUzMjEzLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc090aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnJhbmdlX3QsIGludDMyX3Q+IHNDb2xvclJhbmdlcyA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgIENPTE9SX1JBTkdFX0ZVTEwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIENPTE9SX1JBTkdFX0xJTUlURUQgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgQ29sb3JBc3BlY3RzOjpSYW5nZT4gc0NvbG9yUmFuZ2VzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9GVUxMLCAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsICAgICBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBpbnQzMl90PiBzQ29sb3JUcmFuc2ZlcnMgPSB7CisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVIsIENPTE9SX1RSQU5TRkVSX0xJTkVBUiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCwgQ09MT1JfVFJBTlNGRVJfU1QyMDg0IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9ITEcsICAgIENPTE9SX1RSQU5TRkVSX0hMRyB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyPiBzQ29sb3JUcmFuc2ZlcnNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyTGluZWFyIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TUkdCLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNSR0IgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUxNzBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyLCAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjgsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVySExHIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8yNDBNLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfWFZZQ0MsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJYdllDQyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfQlQxMzYxLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJCVDEzNjEgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUNDI4LCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1Q0MjggfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSLCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvbkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzMwLCAgRG9sYnlWaXNpb25MZXZlbEhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgRG9sYnlWaXNpb25MZXZlbEZoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzYwLCBEb2xieVZpc2lvbkxldmVsRmhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8yNCwgRG9sYnlWaXNpb25MZXZlbFVoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCisKKyAgICAvLyBoaWdoIHRpZXJzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBvbiBhbmRyb2lkLCBmb3Igbm93IG1hcCB0aGVtIHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl9QRVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfREVSLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERU4sIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0biB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfRFRILCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfMDksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0gyNjNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwgSDI2M0xldmVsMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLCBIMjYzTGV2ZWwyMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsIEgyNjNMZXZlbDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwgSDI2M0xldmVsNDAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1LCBIMjYzTGV2ZWw0NSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAsIEgyNjNMZXZlbDUwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M182MCwgSDI2M0xldmVsNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwLCBIMjYzTGV2ZWw3MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSDI2M1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgICAgICAgICAgSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwLCAgICAgICAgICAgICAgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiwgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMywgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OLCAgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQsICAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJuZXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJMQUNFLCAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJsYWNlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSwgICAgICBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSGV2Y0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDTWFpblRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCAgICAgIEhFVkNNYWluVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsICAgIEhFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82LCAgICAgIEhFVkNNYWluVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEsICAgIEhFVkNNYWluVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDYyIH0sCisKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIsICAgIEhFVkNIaWdoVGllckxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2MiB9LAorCisgICAgLy8gbWFwIGhpZ2ggdGllciBsZXZlbHMgYmVsb3cgNCB0byBtYWluIHRpZXIKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEsIEhFVkNQcm9maWxlTWFpbjEwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNIZHIxMFBsdXNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICBNUEVHMkxldmVsSDE0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdILCAgICAgICAgTVBFRzJMZXZlbEhMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCwgICAgICAgTVBFRzJMZXZlbEhQIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnMlByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICBNUEVHMlByb2ZpbGVTTlIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZTQyMiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWc0TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMCwgICBNUEVHNExldmVsMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsICBNUEVHNExldmVsMGIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsICAgTVBFRzRMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsICAgTVBFRzRMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsICAgTVBFRzRMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLCAgTVBFRzRMZXZlbDNiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LCAgIE1QRUc0TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwgIE1QRUc0TGV2ZWw0YSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNSwgICBNUEVHNExldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNiwgICBNUEVHNExldmVsNiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUNvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU5iaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgIE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90PiBzUGNtRW5jb2RpbmdzID0geworICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsICAgIFZQOUxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsICBWUDlMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsICAgIFZQOUxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsICBWUDlMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsICAgIFZQOUxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsICBWUDlMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsICAgIFZQOUxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsICBWUDlMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsICAgIFZQOUxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEsICBWUDlMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiwgIFZQOUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNiwgICAgVlA5TGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSwgIFZQOUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yLCAgVlA5TGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0F2MUxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwgICAgQVYxTGV2ZWwyICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsICBBVjFMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwgIEFWMUxldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8zLCAgQVYxTGV2ZWwyMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zLCAgICBBVjFMZXZlbDMgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSwgIEFWMUxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLCAgQVYxTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzMsICBBVjFMZXZlbDMzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzQsICAgIEFWMUxldmVsNCAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8xLCAgQVYxTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzIsICBBVjFMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMywgIEFWMUxldmVsNDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNSwgICAgQVYxTGV2ZWw1ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzEsICBBVjFMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiwgIEFWMUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8zLCAgQVYxTGV2ZWw1MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82LCAgICBBVjFMZXZlbDYgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMSwgIEFWMUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yLCAgQVYxTGV2ZWw2MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzMsICBBVjFMZXZlbDYzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzcsICAgIEFWMUxldmVsNyAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xLCAgQVYxTGV2ZWw3MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzIsICBBVjFMZXZlbDcyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMywgIEFWMUxldmVsNzMgfSwKK307CisKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xLCBBVjFQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIsIEFWMVByb2ZpbGUyIH0sCit9OworCisKKy8qKgorICogQSBoZWxwZXIgdGhhdCBwYXNzZXMgdGhyb3VnaCB2ZW5kb3IgZXh0ZW5zaW9uIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcy4KKyAqLworc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciA6IEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSA9IDA7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGJvb2wgcGFzc1Rocm91Z2hNYXAoVCBmcm9tLCBVICp0bykgeworICAgICAgICAvLyBhbGxvdyAoYW5kIHBhc3MgdGhyb3VnaCkgdmVuZG9yIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKGZyb20gPj0gKFQpQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgJiYgZnJvbSA8IChUKUlOVDMyX01BWCkgeworICAgICAgICAgICAgKnRvID0gKFUpZnJvbTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaW1wbGVNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gQUFDIG9ubHkgdXNlcyBwcm9maWxlcywgbWFwIGFsbCBsZXZlbHMgdG8gdW51c2VkIG9yIDAKK3N0cnVjdCBBYWNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25MZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEgyNjNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNIZHI7CisgICAgYm9vbCBtSXNIZHIxMFBsdXM7Cit9OworCitzdHJ1Y3QgTXBlZzJQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKKy8vIFZQOCBoYXMgbm8gcHJvZmlsZXMgYW5kIGxldmVscyBpbiBDb2RlYyAyLjAsIGJ1dCB3ZSB1c2UgbWFpbiBwcm9maWxlIGFuZCBsZXZlbCAwIGluIE1lZGlhQ29kZWMKKy8vIG1hcCBhbGwgcHJvZmlsZXMgYW5kIGxldmVscyB0byB0aGF0Lgorc3RydWN0IFZwOFByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gVlA4TGV2ZWxfVmVyc2lvbjA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhQcm9maWxlTWFpbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVnA5UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBWcDlQcm9maWxlTGV2ZWxNYXBwZXIoYm9vbCBpc0hkciA9IGZhbHNlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UpIDoKKyAgICAgICAgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyKCksCisgICAgICAgIG1Jc0hkcihpc0hkciksIG1Jc0hkcjEwUGx1cyhpc0hkcjEwUGx1cykge30KKworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSkgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEFhY1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEgyNjNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWcyUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDhQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cykgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPih0cnVlLCBpc0hkcjEwUGx1cyk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4odHJ1ZSwgaXNIZHIxMFBsdXMpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yUmFuZ2VzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZSBzZlJhbmdlOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sICZzZlJhbmdlKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgaWYgKGZyb20gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgZnJvbSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgc2ZSYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICp0byA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZShzZlJhbmdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisgICAgICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKGZyb20sICZzZlJhbmdlKTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChzZlJhbmdlLCB0bykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgICp0byA9IChDMkNvbG9yOjpyYW5nZV90KXNmUmFuZ2U7CisgICAgICAgICAgICBpZiAoKnRvIDwgQzJDb2xvcjo6UkFOR0VfVkVORE9SX1NUQVJUIHx8ICp0byA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgKnRvID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnJhbmdlX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpSYW5nZSAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeCwgaW50MzJfdCAqc3RhbmRhcmQpIHsKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJnNmUHJpbWFyaWVzKSkgeworICAgICAgICAvLyBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZSBhbmQgdXNlIHN0YXRpYyBjYXN0CisgICAgICAgIGlmIChwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8IHByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG5vbi1leHRlbnNpb24gdmFsdWVzIG1hcCB0byAnT3RoZXInCisgICAgICAgICAgICBzZlByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKXByaW1hcmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAobWF0cml4LCAmc2ZNYXRyaXgpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgaWYgKG1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmTWF0cml4ID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZNYXRyaXggPSAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMpbWF0cml4OworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHNmUHJpbWFyaWVzLCBzZk1hdHJpeCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IHN0YW5kYXJkLCBDMkNvbG9yOjpwcmltYXJpZXNfdCAqcHJpbWFyaWVzLCBDMkNvbG9yOjptYXRyaXhfdCAqbWF0cml4KSB7CisgICAgLy8gZmlyc3QgbWFwIHRvIHN0YWdlZnJpZ2h0IGZvdW5kYXRpb24gYXNwZWN0cyA9PiB0aGVzZSBhY3R1YWxseSBtYXAgbmVhcmx5IDE6MSB0bworICAgIC8vIENvZGVjIDIuMCBhc3BlY3RzCisgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgc2ZQcmltYXJpZXM7CisgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgc2ZNYXRyaXg7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmc2ZQcmltYXJpZXMsICZzZk1hdHJpeCk7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHNmUHJpbWFyaWVzLCBwcmltYXJpZXMpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgKnByaW1hcmllcyA9IChDMkNvbG9yOjpwcmltYXJpZXNfdClzZlByaW1hcmllczsKKyAgICAgICAgaWYgKCpwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8ICpwcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAoc2ZNYXRyaXgsIG1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqbWF0cml4ID0gKEMyQ29sb3I6Om1hdHJpeF90KXNmTWF0cml4OworICAgICAgICBpZiAoKm1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgKm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgKm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIGZyb20sIEMyQ29sb3I6OnByaW1hcmllc190ICp0bykgeworICAgIHJldHVybiBzQ29sb3JQcmltYXJpZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjptYXRyaXhfdCBmcm9tLCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBmcm9tLCBDMkNvbG9yOjptYXRyaXhfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyIHNmVHJhbnNmZXI7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgJnNmVHJhbnNmZXIpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKHNmVHJhbnNmZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnRyYW5zZmVyX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoZnJvbSwgJnNmVHJhbnNmZXIpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHNmVHJhbnNmZXIsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnRyYW5zZmVyX3Qpc2ZUcmFuc2ZlcjsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoCisgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2UsIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyLCB1aW50MzJfdCAqZGF0YVNwYWNlKSB7CisjaWYgMAorICAgIC8vIHB1cmUgcmVpbXBsZW1lbnRhdGlvbgorICAgICpkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047IC8vIHRoaXMgaXMgMAorCisgICAgc3dpdGNoIChyYW5nZSkgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0ZVTEw6ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9GVUxMOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpSQU5HRV9MSU1JVEVEOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfUkFOR0VfTElNSVRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVI6ICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTElORUFSOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQjogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NSR0I7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSXzE3ME06ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TTVBURV8xNzBNOyBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyODogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0dBTU1BMl84OyAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NDogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQ7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9ITEc6ICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfSExHOyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNjI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDoKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5UCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjBfQ09OU1RBTlRfTFVNSU5BTkNFCisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX006CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyNlbHNlCisgICAgLy8gZm9yIG5vdyB1c2UgbGVnYWN5IGltcGxlbWVudGF0aW9uCisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAocmFuZ2UsICZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgYXNwZWN0cy5tUmFuZ2UgPSBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJmFzcGVjdHMubVByaW1hcmllcykpIHsKKyAgICAgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpKSB7CisgICAgICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHRyYW5zZmVyLCAmYXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIH0KKyAgICAqZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM2ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgdG8gbWFwIENvZGVjIDIuMCB2YWx1ZXMgdG8gYW5kcm9pZCB2YWx1ZXMuCisgICAgICovCisgICAgc3RydWN0IEMyTWFwcGVyIHsKKyAgICAgICAgc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgflByb2ZpbGVMZXZlbE1hcHBlcigpID0gZGVmYXVsdDsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGJpdHJhdGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwY20gZW5jb2RpbmdzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwaWN0dXJlIHR5cGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBjb2xvciBhc3BlY3RzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnByaW1hcmllc190KiwgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoCisgICAgICAgICAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBDMkNvbG9yOjp0cmFuc2Zlcl90LAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhU3BhY2UpOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlJhbmdlLCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLCBDMkNvbG9yOjpwcmltYXJpZXNfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6bWF0cml4X3QsIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcywgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXIqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKyAgICB9OworfQorCisjZW5kaWYgIC8vIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U2ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3OSBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl9jb3JlX3BhcmFtX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJQYXJhbV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJfdGVzdC5jcHAiLAorICAgICAgICAiQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAiLAorICAgICAgICAiQzJVdGlsVGVzdC5jcHAiLAorICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2lmICFkZWZpbmVkKFVOVVNFRCkKKyNkZWZpbmUgVU5VU0VEKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpKGV4cHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIWRlZmluZWQoVU5VU0VEKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gYWxsb2NfdW5pcXVlX2NzdHIoY29uc3QgY2hhciAqY3N0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY3N0cik7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHB0ciA9IFQ6OkFsbG9jVW5pcXVlKGxlbik7CisgICAgbWVtY3B5KHB0ci0+bS52YWx1ZSwgY3N0ciwgbGVuKTsKKyAgICByZXR1cm4gcHRyOworfQorCitjbGFzcyBDMkNvbXBJbnRmVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIEMyQ29tcEludGZUZXN0KCkge30KKyAgICB+QzJDb21wSW50ZlRlc3QoKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZXRDb21wb25lbnQoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKSB7CisgICAgICAgIG1JbnRmID0gaW50ZjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0UmVzdWx0cygpIHsKKyAgICAgICAgbUludGYgPSBudWxscHRyOworICAgICAgICBtUGFyYW1SZXN1bHRzLmNsZWFyKCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlc3RTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gdGVzdFJlYWRPbmx5UGFyYW0oKSBhbmQgdGVzdFdyaXRhYmxlUGFyYW0oKSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zIGZvciB0ZXN0aW5nIGEgcGFyYW1ldGVyLgorICAgIC8vIEEgY2FsbGVyIHNob3VsZCBmaW5kIG91dCBpZiBhIHRlc3RlZCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZW0KKyAgICAvLyBhbmQgaXQgbXVzdCBjYWxsIG9uZSBvZiB0aGUgY29ycmVzcG9uZGVkIHRoZW0uCisKKyAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCByZWFkLW9ubHkgcGFyYW1ldGVyIHxwcmVQYXJhbXwuIFRoZSB0ZXN0IGV4cGVjdHMgZmFpbHVyZSB3aGlsZSBjb25maWcoKSB3aXRoIHxuZXdQYXJhbXwsCisgICAgLy8gYW5kIG1ha2Ugc3VyZSB8cHJlUGFyYW18IHN0YXkgdW5jaGFuZ2VkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgdGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlIHRoaXMgaXMgY2FsbGVkLgorICAgIC8vIFRlc3Qgb25lIGZpbGVkIHx3cml0YWJsZUZpZWxkfCBmb3IgZ2l2ZW4gd3JpdGFibGUgcGFyYW1ldGVyIHxwYXJhbXwuCisgICAgLy8gfHZhbGlkVmFsdWVzfCBjb250YWlucyBhbGwgdmFsdWVzIG9idGFpbmVkIGZyb20gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoKSBmb3IgfHdyaXRhYmxlRmllbGR8LgorICAgIC8vIFRoZSB0ZXN0IGNoZWNrcyB2YWxpZGl0eSBmb3IgY29uZmlnKCkgd2l0aCBlYWNoIHZhbHVlLCBhbmQgbWFrZSBzdXJlIHZhbHVlcyBhcmUgY29uZmlnLWVkCisgICAgLy8gYnkgcXVlcnkoKSB0aGVtIG91dC4gfGludmFsaWRWYWx1ZXN8IGNvbnRhaW5zIHNvbWUgdmFsdWVzIHdoaWNoIGFyZSBub3QgaW4gfHZhbGlkVmFsdWVzfC4KKyAgICAvLyBUaGUgdGVzdCBleHBlY3RzIEMyX0JBRF9WQUxVRSB3aGlsZSBjb25maWcoKSB3aXRoIHRoZXNlIHZhbHVlcywKKyAgICAvLyBhbmQgfHBhcmFtfCBzaG91bGQgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgorICAgIHZvaWQgdGVzdFdyaXRhYmxlUGFyYW0oVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBUZXN0IGFsbCB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIGluIEMyUGFyYW0uaC4KKyAgICB2b2lkIHRlc3RNYWluKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb21wb25lbnROYW1lKTsKKworICAgIC8vIENoZWNrIHBlcm1pc3Npb24gb2YgcGFyYW1ldGVyIHR5cGUgfFR8IGZvciB0ZXN0aW5nIGludGVyZmFjZS4KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZmlyc3Qgb2YgdGhlIHRlc3RpbmcgcGVyIHBhcmFtZXRlciB0eXBlLAorICAgIC8vIHRoZXJlZm9yZSBkaWZmZXJlbnQgdGVzdGluZyBwcm9jZXNzIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBwZXJtaXNzaW9uIHR5cGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjaGVja1BhcmFtUGVybWlzc2lvbigKKyAgICAgICAgICAgIGludCAqY29uc3Qgd3JpdGFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc3VwcG9ydGVkUGFyYW1zKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFBhcmFtUGVybWlzc2lvbiA6IGludCB7CisgICAgICAgIFdSSVRBQkxFLAorICAgICAgICBSRUFET05MWSwKKyAgICAgICAgVU5TVVBQT1JURUQsCisgICAgfTsKKworICAgIHN0cnVjdCBwYXJhbVRlc3RJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgcGFyYW1UZXN0SW5mbyhjb25zdCBjaGFyICpuYW1lXywgaW50IHJlc3VsdF8pCisgICAgICAgICAgICA6IG5hbWUobmFtZV8pLCByZXN1bHQocmVzdWx0Xykge30KKyAgICB9OworCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X3ZiKCkgYW5kCisgICAgLy8gY2hlY2sgaWYgYSBjb21wb25lbnQgaGFzIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgfFR8LgorICAgIC8vIElmIGEgY29tcG9uZW50IGhhcywgdGhlIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQgaW50byBhbiBhcmd1bWVudCwgdGhhdCBpcworICAgIC8vIHxwfCBpbiBxdWVyeU9uU3RhY2soKSBhbmQgfGhlYXBQYXJhbXN8IGluIHF1ZXJ5T25IZWFwKCkuCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBjMl9zdGF0dXNfdCAoZS5nLiBDMl9PSykuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IHF1ZXJ5T25TdGFjayhUICpjb25zdCBwKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGMyX3N0YXR1c190IHF1ZXJ5T25IZWFwKGNvbnN0IFQgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcyk7CisKKyAgICAvLyBHZXQgYSB2YWx1ZSB3aG9zZSB0eXBlIGlzIHxUfCBpbiBhIGNvbXBvbmVudC4gVGhlIHZhbHVlIGlzIGNvcGllZCB0byB8cGFyYW18LgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiBjb21wb25lbnQgaXMgZXF1YWwgdG8gfGV4cGVjdGVkfCBhbmQKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlPbkhlYXAoKSBhcmUgc3VjY2VlZGVkLiBXaGVuIHRoaXMgZnVuY3Rpb24gY2FsbGVkLAorICAgIC8vIGl0IHNob3VsZCBiZSBndWFyYW50ZWVkIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKTsKKworICAgIC8vIFRlc3QgaWYgcXVlcnkgZnVuY3Rpb25zIHdvcmtzIGNvcnJlY3RseSBmb3Igc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gVGVzdCBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciB1bnN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIC8vICJVbnN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlVbnN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBFeGVjdXRlIGFuIGludGVyZmFjZSdzIGNvbmZpZ192YigpLiB8VHwgaXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUsIG5vdCBzdGQ6OnZlY3Rvci4KKyAgICAvLyBjb25maWcoKSBjcmVhdGVzIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX3ZiKCkuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QKKyAgICBjb25maWcoVCAqY29uc3QgcCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcyk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgZm9yIHJlYWQtb25seSBwYXJhbWV0ZXJzLgorICAgIC8vIEJlY2F1c2UgdGhlIGZhaWx1cmUgb2YgY29uZmlnKCkgaXMgYXNzdW1lZCwgfG5ld1BhcmFtfCBkb2Vzbid0IG1hdHRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3Igd3JpdGFibGUgcGFyYW1ldGVycy4KKyAgICAvLyBUaGlzIGNoYW5nZXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHRvIHxuZXdQYXJhbXwuCisgICAgLy8gfHN0Q29uZmlnfCBpcyBhIHJldHVybiB2YWx1ZSBvZiBjb25maWcoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKnN0Q29uZmlnKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBpbiB0aGUgY2FzZSBhbiBpbnZhbGlkIHZhbHVlIHxuZXdQYXJhbXwgaXMgdHJpZWQgdG8gd3JpdGUKKyAgICAvLyB0byBhbiB3cml0YWJsZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBDcmVhdGUgdmFsdWVzIGZvciB0ZXN0aW5nIGZyb20gfHZhbGlkVmFsdWVJbmZvc3wuIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IDogdmFsaWQgdmFsdWVzLCB3aGljaCBjYW4gYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyB8SW52YWxpZFZhbHVlc3wgOiBpbnZhbGlkIHZhbHVlcywgd2hpY2ggY2Fubm90IGJlIHdyaXR0ZW4gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgLy8gICAgICAgICAgICAgICAgICAgY29uZmlnKCkgc2hvdWxkIGJlIGZhaWxlZCBpZiB0aGVzZSB2YWx1ZXMgYXJlIHVzZWQgYXMgbmV3IHZhbHVlcy4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igd3JpdGFibGUgYW5kIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCBnZXRUZXN0VmFsdWVzKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpOworCisgICAgLy8gT3V0cHV0IHRoZSBzdW1tYXJ5IG9mIHRlc3QgcmVzdWx0cy4gQ2F0ZWdvcml6ZXMgcGFyYW1ldGVycyB3aXRoIHRoZWlyIGNvbmZpZ3VyYXRpb24uCisgICAgdm9pZCBvdXRwdXRSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8cGFyYW1UZXN0SW5mbz4gbVBhcmFtUmVzdWx0czsKKyAgICBzdGQ6OnN0cmluZyBtQ3VycmVudFBhcmFtTmFtZTsKK307CisKKy8vIGZhY3RvcnkgZnVuY3Rpb24KKy8vIFRPRE8oaGlyb2gpOiBBZGQgZmFjdG9yeSBmdW5jdGlvbnMgZm9yIG90aGVyIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW0oKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8VD4oKTsKK30KKwordGVtcGxhdGUgPD4gc3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtYWtlUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IFNldCBtb3JlIHByZWNpc2UgbGVuZ3RoLgorICAgIHJldHVybiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMTAwKTsKK30KKworI2RlZmluZSBUUkFDRURfRkFJTFVSRShmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKG1DdXJyZW50UGFyYW1OYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICBmdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7ICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlPblN0YWNrKFQgKmNvbnN0IHApIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gc3RhY2tQYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uSGVhcCgKKyAgICAgICAgY29uc3QgVCAmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgeworICAgIHVpbnQzMl90IGluZGV4ID0gcC5pbmRleCgpICYgfjB4MDNGRTAwMDA7CisgICAgaWYgKHAuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgaW5kZXggfD0gKChwLnN0cmVhbSgpIDw8IDE3KSAmIDB4MDFGRTAwMDApIHwgMHgwMjAwMDAwMDsKKyAgICB9CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwge2luZGV4fSwgQzJfRE9OVF9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRWYWx1ZShUICpjb25zdCBwYXJhbSkgeworICAgIC8vIFdoZW4gZ2V0VmFsdWUoKSBpcyBjYWxsZWQsIGEgY29tcG9uZW50IGhhcyB0byBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uU3RhY2socGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVBhcmFtQXNFeHBlY3RlZChjb25zdCBUICZleHBlY3RlZCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjaygmc3RhY2spKTsKKworICAgIC8vIHxzdGFja3wgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgc2l6ZSBzaG91bGRuJ3QgYmUgMC4KKyAgICBFWFBFQ1RfTkUoMHUsIHN0YWNrLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YWNrLCBleHBlY3RlZCk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25IZWFwKCpwSGVhcCwgJmhlYXBQYXJhbXMpKTsKKworICAgIC8vIHwqaGVhcFBhcmFtc1swXXwgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBzaXplIG9mIHxoZWFwUGFyYW1zfCBoYXMgdG8gYmUgb25lLgorICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGhlYXBQYXJhbXNbMF0pOworICAgIEVYUEVDVF9FUSgqaGVhcFBhcmFtc1swXSwgZXhwZWN0ZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhY3F1aXJlZCBieSBnZXRWYWx1ZSgpLCB3aGljaCBzaG91bGQgYmUgc3VjY2VlZGVkLgorICAgIGdldFZhbHVlKHBhcmFtLmdldCgpKTsKKyAgICBxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgLy8gSWYgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIsIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpCisgICAgLy8gc2hvdWxkIHJldHVybiBDMl9CQURfSU5ERVguCisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPblN0YWNrKCZzdGFjaykpOworICAgIEVYUEVDVF9GQUxTRShzdGFjayk7CisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworICAgIEVYUEVDVF9FUSgwdSwgaGVhcFBhcmFtcy5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0Ojpjb25maWcoCisgICAgICAgIFQgKmNvbnN0IHAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3B9OworICAgIHJldHVybiBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgZmFpbHVyZXMpOworfQorCisvLyBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIGNvcGllZCBmcm9tIHxwfC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZVBhcmFtRnJvbShjb25zdCBUICZwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHJldFAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBFWFBFQ1RfVFJVRShyZXRQLT51cGRhdGVGcm9tKHApKTsKKyAgICBFWFBFQ1RfVFJVRShtZW1jbXAocmV0UC5nZXQoKSwgJnAsIHNpemVvZihUKSkgPT0gMCk7CisgICAgcmV0dXJuIHJldFA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnUmVhZE9ubHlQYXJhbShjb25zdCBUICZuZXdQYXJhbSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkIGJlY2F1c2UgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5LgorICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0sIGMyX3N0YXR1c190ICpjb25maWdSZXN1bHQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gSW4gbW9zdCBjYXNlcywgY29uZmlnX3ZiIHJldHVybiBDMl9PSyBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHNob3VsZCBiZSBjaGFuZ2VkCisgICAgLy8gdG8gfG5ld1BhcmFtfCwgd2hpY2ggaXMgY29uZmlybWVkIGluIGEgY2FsbGVyIG9mIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWx1ZVZhbHVlKCkuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gcmV0dXJuIH5+fn4gYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZXMgaXMgbm90IGNoYW5nZWQsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBtYXkgYmUgZGVwZW5kZW50IGxpbWl0YXRpb25zIGJldHdlZW4gZmllbGRzIG9yIGJldHdlZW4gcGFyYW1ldGVycy4KKyAgICAvLyBUT0RPKGhpcm9oKTogSSBoYXZlIHRvIGZpbGwgdGhlIHJldHVybiB2YWx1ZS4gQ29tbWVudHMgaW4gQzJDb21wb25lbnQuaCBkb2Vzbid0IG1lbnRpb24KKyAgICAvLyBhYm91dCB0aGUgcmV0dXJuIHZhbHVlIHdoZW4gY29uZmxpY3QgaGFwcGVucy4gSSBzZXQgQzJfQkFEX1ZBTFVFIHRvIGl0IHRlbXBvcmFyaWx5IG5vdy4KKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZyA9IG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgc3RDb25maWcpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7CisgICAgfQorICAgICpjb25maWdSZXN1bHQgPSBzdENvbmZpZzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIEFsdGhvdWdoIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlLCBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCwKKyAgICAvLyBiZWNhdXNlIGEgbmV3IHZhbHVlIGlzIGludmFsaWQuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKworLy8gVGhlcmUgaXMgb25seSB1c2VkIGVudW0gdHlwZSBmb3IgdGhlIGZpZWxkIHR5cGUsIHRoYXQgaXMgQzJDb21wb25lbnQ6OmRvbWFpbl90LgorLy8gSWYgYW5vdGhlciBmaWVsZCB0eXBlIGlzIGFkZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIGZ1bmN0aW9uIGZvciB0aGF0LgordGVtcGxhdGUgPD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFRlc3RWYWx1ZXMoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OmRvbWFpbl90PiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50Ojpkb21haW5fdD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpIHsKKyAgICBVTlVTRUQodmFsaWRWYWx1ZUluZm9zKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKworICAgIC8vIFRoZXJlIGlzIG5vIGludmFsaWQgdmFsdWUuCisgICAgVU5VU0VEKGludmFsaWRWYWx1ZXMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIHVzaW5nIFRTdG9yYWdlID0gdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxURmllbGQ+Ojp0eXBlOworCisgICAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IEMyVmFsdWVzLiBDMlZhbHVlOjpQcmltaXRpdmUgbmVlZHMgdG8KKyAgICAvLyBiZSB0cmFuc2Zvcm1lZCB0byBhIHByaW1pdGl2ZSB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBpcyBvbmUgdG8gZG8gdGhhdC4KKyAgICBhdXRvIHByaW0yVmFsdWUgPSBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnByaW0pIC0+IFRGaWVsZCB7CisgICAgICAgIHJldHVybiAoVEZpZWxkKXByaW0ucmVmPFRTdG9yYWdlPigpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgaW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCB1aW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGZsb2F0Pjo6dmFsdWUsICJJbnZhbGlkIFRGaWVsZCB0eXBlLiIpOworICAgIH07CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB2YWxpZFZhbHVlSW5mb3MgaXMgb25lLgorICAgIGNvbnN0IGF1dG8gJmMyRlNWID0gdmFsaWRWYWx1ZUluZm9zOworCisgICAgc3dpdGNoIChjMkZTVi50eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkVNUFRZOiB7CisgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoMCkpOworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IFNob3VsZCBvdGhlciBpbnZhbGlkIHZhbHVlcyBiZSB0ZXN0ZWQ/CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6UkFOR0U6IHsKKyAgICAgICAgY29uc3QgYXV0byAmcmFuZ2UgPSBjMkZTVi5yYW5nZTsKKyAgICAgICAgYXV0byBybWluID0gcHJpbTJWYWx1ZShyYW5nZS5taW4pOworICAgICAgICBhdXRvIHJtYXggPSBwcmltMlZhbHVlKHJhbmdlLm1heCk7CisgICAgICAgIGF1dG8gcnN0ZXAgPSBwcmltMlZhbHVlKHJhbmdlLnN0ZXApOworCisgICAgICAgIEFTU0VSVF9MRShybWluLCBybWF4KTsKKworICAgICAgICBpZiAocnN0ZXAgIT0gMCkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgbGluZWFyCisgICAgICAgICAgICBmb3IgKGF1dG8gdiA9IHJtaW47IHYgPD0gcm1heDsgdiA9IFRGaWVsZCh2ICsgcnN0ZXApKSB7CisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdGVwID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgdHdvIGNhc2VzLCBleGNlcHQgbGluZWFyIGNhc2UuCisgICAgICAgICAgICAvLyAxLiBpbnRlZ2VyIGdlb21ldHJpYyBjYXNlCisgICAgICAgICAgICAvLyAyLiBmbG9hdCBnZW9tZXRyaWMgY2FzZQorCisgICAgICAgICAgICBhdXRvIG51bSA9IHByaW0yVmFsdWUocmFuZ2UubnVtKTsKKyAgICAgICAgICAgIGF1dG8gZGVub20gPSBwcmltMlZhbHVlKHJhbmdlLmRlbm9tKTsKKworICAgICAgICAgICAgLy8gSWYgYm90aCByYW5nZS5udW0gYW5kIHJhbmdlLmRlbm9tIGFyZSAxIGFuZCBzdGVwIGlzIDAsIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIFZBTFVFUywgc2hvdWxkbid0IHdlPworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG51bSA9PSAxICYmIGRlbm9tID09IDEpOworCisgICAgICAgICAgICAvLyAobnVtIC8gZGVub20pIGlzIG5vdCBsZXNzIHRoYW4gMS4KKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShkZW5vbSA9PSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9MRShkZW5vbSwgbnVtKTsKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKiBudW0gLyBkZW5vbSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm1pbiA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtaW4gLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1heCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtYXggKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdCgxKSAtIHZhbGlkVmFsdWVzLT5hdCgwKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KDApICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gdmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlZBTFVFUzogeworICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSA6IGMyRlNWLnZhbHVlcykgeworICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhwcmltMlZhbHVlKHByaW0pKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG1pbnYgPSAqc3RkOjptaW5fZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgYXV0byBtYXh2ID0gKnN0ZDo6bWF4X2VsZW1lbnQodmFsaWRWYWx1ZXMtPmJlZ2luKCksIHZhbGlkVmFsdWVzLT5lbmQoKSk7CisgICAgICAgIGlmIChtaW52IC0gMSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWludiAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4diArIDEgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKG1heHYgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpGTEFHUzogeworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IEltcGxlbWVudCB0aGUgY2FzZSB0aGF0IHBhcmFtLnR5cGUgaXMgRkxBR1MuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnUmVhZE9ubHlQYXJhbShuZXdQYXJhbSkpOworICAgIC8vIFBhcmFtZXRlciB2YWx1ZSBtdXN0IG5vdCBiZSBjaGFuZ2VkCisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQocHJlUGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFdyaXRhYmxlUGFyYW0oCisgICAgICAgIFRQYXJhbSAqY29uc3QgcGFyYW0sIFRSZWFsRmllbGQgKmNvbnN0IHdyaXRhYmxlRmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RDb25maWc7CisKKyAgICAvLyBHZXQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIHRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHZhbHVlIGF0IHRoZSBlbmQuCisgICAgVFJBQ0VEX0ZBSUxVUkUoZ2V0VmFsdWUocGFyYW0pKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBkZWZhdWx0UGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAvLyBUZXN0IHZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogdmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gcHJlUGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAgICAgLy8gUGFyYW0gaXMgdHJ5IHRvIGJlIGNoYW5nZWQKKyAgICAgICAgKndyaXRhYmxlRmllbGQgPSB2YWw7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKCpwYXJhbSwgJnN0Q29uZmlnKSk7CisgICAgICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnBhcmFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJhbSBpcyB1bmNoYW5nZWQgYmVjYXVzZSBhIGZpZWxkIHZhbHVlIGNvbmZsaWN0cyB3aXRoIG90aGVyIGZpZWxkIG9yIHBhcmFtZXRlci4KKyAgICAgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwcmVQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGluIG9yZGVyIHRvIHRlc3QgfHBhcmFtfCBpcyB1bmNoYW5nZWQKKyAgICAvLyBhZnRlciB0cnlpbmcgdG8gd3JpdGUgYW4gaW52YWxpZCB2YWx1ZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBsYXN0VmFsaWRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgaW52YWxpZCB2YWx1ZXMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbCA6IGludmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgLy8gUGFyYW0gaXMgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZSgqcGFyYW0pKTsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKmxhc3RWYWxpZFBhcmFtKSk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBwYXJhbWV0ZXIgYnkgY29uZmlnKCkuCisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKmRlZmF1bHRQYXJhbSwgJnN0Q29uZmlnKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVVuc3VwcG9ydGVkUGFyYW08VD4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0U3VwcG9ydGVkUGFyYW0oKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlTdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKworYm9vbCBpc1N1cHBvcnRlZFBhcmFtKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnNQYXJhbXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBkIDogc1BhcmFtcykgeworICAgICAgICBpZiAocGFyYW0udHlwZSgpID09IHBkLT5pbmRleCgpLnR5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgIGludCAqY29uc3QgcmVzdWx0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKworICAgIGlmICghaXNTdXBwb3J0ZWRQYXJhbSgqcGFyYW0sIHN1cHBvcnRlZFBhcmFtcykpIHsKKyAgICAgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLCBpdCBqdXN0IGZpbmlzaCBhZnRlciBjYWxsaW5nIHRlc3RVbnN1cHBvcnRlZFBhcmFtKCkuCisgICAgICAgIHRlc3RVbnN1cHBvcnRlZFBhcmFtPFQ+KCk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlVOU1VQUE9SVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGVzdFN1cHBvcnRlZFBhcmFtPFQ+KCk7CisKKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbS5nZXQoKSkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBDb25maWcgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXIsIGJlY2F1c2UgcGFyYW0gaXMgdGhlIHByZXNlbnQgcGFyYW0uCisgICAgLy8gVGhpcyBjb25maWcgaXMgZXhlY3V0ZWQgdG8gZmluZCBvdXQgaWYgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlLgorICAgIGMyX3N0YXR1c190IHN0U3RhY2sgPSBjb25maWcocGFyYW0uZ2V0KCksICZmYWlsdXJlcyk7CisgICAgaWYgKHN0U3RhY2sgPT0gQzJfQkFEX1ZBTFVFKSB7CisgICAgICAgIC8vIFJlYWQtb25seQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gbmV3UGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAgICAgdGVzdFJlYWRPbmx5UGFyYW0oKnBhcmFtLCAqbmV3UGFyYW0pOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpSRUFET05MWTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0YWJsZQorICAgICAgICBFWFBFQ1RfRVEoc3RTdGFjaywgQzJfT0spOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpXUklUQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQzJDb21wSW50ZlRlc3Q6Om91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFyYW1zWzNdOworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdEluZm8gOiBtUGFyYW1SZXN1bHRzKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0ZXN0SW5mby5yZXN1bHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKDAgPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSAyKTsKKyAgICAgICAgcGFyYW1zW3Jlc3VsdF0uZW1wbGFjZV9iYWNrKHRlc3RJbmZvLm5hbWUpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpyZXN1bHRTdHJpbmdbXSA9IHsiV3JpdGFibGUiLCAiUmVhZC1Pbmx5IiwgIlVuc3VwcG9ydGVkIn07CisgICAgcHJpbnRmKCJcbi0tLS1URVNUIFJFU1VMVFMgKCVzKS0tLS1cblxuIiwgbmFtZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBwcmludGYoIlsgJXMgXVxuIiwgcmVzdWx0U3RyaW5nW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogcGFyYW1zW2ldKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCB0LmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGZpZWxkX25hbWVfKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW1fPiBwYXJhbSA9IG1ha2VQYXJhbTxUUGFyYW1fPigpOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gdmFsaWRWYWx1ZUluZm9zID0geyAgICBcCisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChwYXJhbS5nZXQoKSwgJmZpZWxkX3R5cGVfbmFtZV86OmZpZWxkX25hbWVfKSkgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHZhbGlkVmFsdWVJbmZvcywgQzJfRE9OVF9CTE9DSykpOyAgICAgXAorICAgICAgICBBU1NFUlRfRVEoMXUsIHZhbGlkVmFsdWVJbmZvcy5zaXplKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiB2YWxpZFZhbHVlczsgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiBpbnZhbGlkVmFsdWVzOyAgICAgICAgXAorICAgICAgICBnZXRUZXN0VmFsdWVzKHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXMsICZ2YWxpZFZhbHVlcywgJmludmFsaWRWYWx1ZXMpOyAgIFwKKyAgICAgICAgdGVzdFdyaXRhYmxlUGFyYW0ocGFyYW0uZ2V0KCksICZwYXJhbS0+ZmllbGRfbmFtZV8sIHZhbGlkVmFsdWVzLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB3aWR0aCk7ICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBoZWlnaHQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX1UzMl9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKyNkZWZpbmUgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgIFwKKyAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlKQorCisvLyBUT0RPKGhpcm9oKTogU3VwcG9ydCBwYXJhbWV0ZXJzIGJhc2VkIG9uIGNoYXJbXSBhbmQgdWludDMyX3RbXS4KKy8vI2RlZmluZSBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIG0udmFsdWUpCisvLyNkZWZpbmUgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRChUcGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIHVpbnQzMl90W10sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlcykKKworI2RlZmluZSBFQUNIX1RFU1QoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdGVzdF9uYW1lKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHJlc3VsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGhpcy0+bUN1cnJlbnRQYXJhbU5hbWUgPSAjVFBhcmFtXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hlY2tQYXJhbVBlcm1pc3Npb248VFBhcmFtXz4oJnJlc3VsdCwgc3VwcG9ydGVkUGFyYW1zKTsgICAgICAgICAgXAorICAgICAgaWYgKHJlc3VsdCA9PSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRlc3RfbmFtZShUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbVBhcmFtUmVzdWx0cy5lbXBsYWNlX2JhY2soI1RQYXJhbV8sIHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFQUNIX1RFU1RfU0VMRih0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV8sIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9JTlBVVCh0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV86OmlucHV0LCB0eXBlXywgdGVzdF9uYW1lKQorI2RlZmluZSBFQUNIX1RFU1RfT1VUUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6b3V0cHV0LCB0eXBlXywgdGVzdF9uYW1lKQordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpIHsKKyAgICBzZXRDb21wb25lbnQoaW50Zik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBzdXBwb3J0ZWRQYXJhbXM7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnN1cHBvcnRlZFBhcmFtcykpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRBY3R1YWxEZWxheVR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudFR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluU2V0dGluZywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBvdXRwdXRSZXN1bHRzKGNvbXBvbmVudE5hbWUpOworICAgIHJlc2V0UmVzdWx0cygpOworfQorCitURVNUX0YoQzJDb21wSW50ZlRlc3QsIEMyVjRMMkNvZGVjSW50ZikgeworCisgICAgLy8gUmVhZCBhIHNoYXJlZCBvYmplY3QgbGlicmFyeS4KKyAgICB2b2lkKiBjb21wTGliID0gZGxvcGVuKCJzeXN0ZW0vbGliL2xpYnY0bDJfY29kZWMyLnNvIiwgUlRMRF9OT1cpOworCisgICAgaWYgKCFjb21wTGliKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gbGlicmFyeTogJXMuXG4iLCBkbGVycm9yKCkpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyQ29tcG9uZW50U3RvcmUqIGNyZWF0ZV90KCk7CisgICAgY3JlYXRlX3QqIGNyZWF0ZV9zdG9yZT0gKGNyZWF0ZV90KikgZGxzeW0oY29tcExpYiwgImNyZWF0ZV9zdG9yZSIpOworICAgIGNvbnN0IGNoYXIqIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBjcmVhdGU6ICVzLlxuIiwgZGxzeW1fZXJyb3IpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHZvaWQgZGVzdHJveV90KEMyQ29tcG9uZW50U3RvcmUqKTsKKyAgICBkZXN0cm95X3QqIGRlc3Ryb3lfc3RvcmUgPSAoZGVzdHJveV90KikgZGxzeW0oY29tcExpYiwgImRlc3Ryb3lfc3RvcmUiKTsKKyAgICBkbHN5bV9lcnJvciA9IGRsZXJyb3IoKTsKKyAgICBpZiAoZGxzeW1fZXJyb3IpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbG9hZCBzeW1ib2wgZGVzdHJveTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZShjcmVhdGVfc3RvcmUoKSwgZGVzdHJveV9zdG9yZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wb25lbnRJbnRmOworICAgIGNvbXBvbmVudFN0b3JlLT5jcmVhdGVJbnRlcmZhY2UoInY0bDIuZGVjb2RlciIsICZjb21wb25lbnRJbnRmKTsKKyAgICBhdXRvIGNvbXBvbmVudE5hbWUgPSAiQzJWNEwyQ29kZWMiOworICAgIHRlc3RNYWluKGNvbXBvbmVudEludGYsIGNvbXBvbmVudE5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQYXJhbV90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCit2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmaWQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgICpvcyA8PCAiQCIgPDwgaWQuX21PZmZzZXQgPDwgIisiIDw8IGlkLl9tU2l6ZTsKK30KKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiOworICAgIFByaW50VG8oZmQuX21GaWVsZElkLCBvcyk7CisgICAgKm9zIDw8ICIqIiA8PCBmZC5leHRlbnQoKSA8PCAiKSI7Cit9CisKK2VudW0gQzJQYXJhbUluZGV4VHlwZSA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAga1BhcmFtSW5kZXhOdW1iZXIsCisgICAga1BhcmFtSW5kZXhOdW1iZXJzLAorICAgIGtQYXJhbUluZGV4TnVtYmVyMiwKKyAgICBrUGFyYW1JbmRleFZlbmRvclN0YXJ0ID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCisgICAga1BhcmFtSW5kZXhWZW5kb3JOdW1iZXJzLAorfTsKKwordm9pZCBmZmZmKGludCgqKShpbnQpKSB7fQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVFJVQ1QgREVDTEFSQVRJT04gQU5EIERFU0NSSVBUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3R5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3IgRkQ7CisKK2NsYXNzIEMyUGFyYW1UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitjbGFzcyBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdAorICAgICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PiB7Cit9OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0QSwKKyAgICBrUGFyYW1JbmRleFRlc3RCLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTMzIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemUsCit9OworCitzdHJ1Y3QgQzJTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFNpemUgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgorICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Cit9OworCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCisKKy8vIFRlc3QgMS4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYW55IGhlbHBlciBtZXRob2RzCisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIHsKKyAgICByZXR1cm4gYS50eXBlKCkgPT0gYi50eXBlKCkKKyAgICAgICAgICAgICYmIGEuZXh0ZW50KCkgPT0gYi5leHRlbnQoKQorICAgICAgICAgICAgJiYgYS5uYW1lKCkgPT0gYi5uYW1lKCkKKyAgICAgICAgICAgICYmIGEuX21GaWVsZElkID09IGIuX21GaWVsZElkOworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0EgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0EgX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUID0KKyAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCisgICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAorICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKKyAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCisgICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAorICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCisgICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OworCitURVNUX1AoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBHZXRQYXJhbSgpLCBleHBlY3RlZCA9IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVDsKKworICAgIC8vIHZlcmlmeSBmaXJzdCBmaWVsZCBkZXNjcmlwdG9yCisgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzWzBdLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJzMzIiLCBmaWVsZHNbMF0ubmFtZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzWzBdLmV4dGVudCgpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgZmllbGRzWzBdLl9tRmllbGRJZCk7CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMF0sIGZpZWxkc1swXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzFdLCBmaWVsZHNbMV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFsyXSwgZmllbGRzWzJdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbM10sIGZpZWxkc1szXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzRdLCBmaWVsZHNbNF0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs1XSwgZmllbGRzWzVdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNl0sIGZpZWxkc1s2XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzddLCBmaWVsZHNbN10pOworICAgIGZvciAoc2l6ZV90IGkgPSA4OyBpIDwgZmllbGRzLnNpemUoKSAmJiBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBmaWVsZHNbaV0pOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5pdGlhbGl6ZXJMaXN0LCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUKSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgcG9pbnRlciBjb25zdHJ1Y3RvcgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5mcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCkpOworCisvLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIG1lbWJlci1wb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVtYmVyUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QpKTsKKworLy8gVGVzdCAyLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCB0d28tc3RlcCBoZWxwZXIgbWV0aG9kcworCitzdHJ1Y3QgQzJUZXN0QVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBERUZJTkVfQzJTVFJVQ1QoVGVzdEEpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RBLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChzaWduZWQ2NCwgInM2NCIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDMyLCAidTMyIikKKyAgICBDMkZJRUxEKHVuc2lnbmVkNjQsICJ1NjQiKQorICAgIEMyRklFTEQoZnAzMiwgImZwIikKKyAgICBDMkZJRUxEKHN6LCAic2l6ZSIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChzdHJpbmcsICJzdHIiKQorICAgIC8vIEMyRklFTEQoeWVzTm8sICJ5LW4iKQorfSkgLy8gOyBvcHRpb25hbAorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDJTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QVN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCAzLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBvbmUtc3RlcCBoZWxwZXIgbWV0aG9kCisKK3N0cnVjdCBDMlRlc3RCU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEIpCisKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDFTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QlN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCA0LiBmbGV4aWJsZSBtZW1iZXJzCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyB0eXBlX3Q9RkQ6OnR5cGVfdDsKKworICAgIC8vIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICAgICAgICAgIEdldExpc3RzKCk7CisKKyAgICBjb25zdGV4cHIgc3RhdGljIHR5cGVfdCBGbGV4VHlwZSA9CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlID8gRkQ6OklOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6SU5UNjQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgPyBGRDo6VUlOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlID8gRkQ6OlVJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSA/IEZEOjpGTE9BVCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlID8gRkQ6OkJMT0IgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IEZEOjpTVFJJTkcgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIEMyU2l6ZVN0cnVjdD46OnZhbHVlID8gQzJTaXplU3RydWN0OjpUWVBFIDogKHR5cGVfdCkwOworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IEZMRVhfU0laRSA9IHNpemVvZihUKTsKK307CisKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxpbnQzMl90LCBpbnQ2NF90LCBDMlNpemVTdHJ1Y3Q+IEZsZXhUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIEZsZXhUeXBlcyk7CisKK1RZUEVEX1RFU1QoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKKyAgICBmb3IgKGF1dG8gYSA6IHRoaXMtPkdldExpc3RzKCkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGE7CisgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDAsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzBdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzMyIHsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXgsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzMyIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgMCwgNCB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50MzJfdCBtRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4RW5kLCBGTEVYX1NJWkUgPSA0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDMyX3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDQsIDQgfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCA9IHsKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPnNpZ25lZDMyLCAiczMyIiksCisgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5tRmxleCwgImZsZXgiKSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4UzMyU3RydWN0IHsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTMzIsIG1GbGV4U2lnbmVkMzIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgbUZsZXhTaWduZWQzMikKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50MzJfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0LAorICAgICAgICBDMlRlc3RGbGV4UzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzY0IHsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCAwLCA4IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1TaWduZWQ2NEZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50NjRfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgNCwgOCB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzY0LCBtRmxleFNpZ25lZDY0KQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgbUZsZXhTaWduZWQ2NCkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50NjRfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4UzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSB7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDAsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1TaXplRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCA0LCBzaXplb2YoQzJTaXplU3RydWN0KSB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTaXplU3RydWN0IHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4U2l6ZSwgbUZsZXhTaXplKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplMiwgbUZsZXhTaXplKQorICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxDMlNpemVTdHJ1Y3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGaWVsZElkKSB7CisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKworICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IgaW4gQzJQYXJhbQorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0uc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSopMCktPm0ubUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOworCisgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tRmxleFNpemUpKTsKKworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U6Om0ubUZsZXhTaXplKSk7CisKKworfQorCitzdHJ1Y3QgUzMyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgUzMyKGNvbnN0IFQqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgIH0KK307CisKK3N0cnVjdCBGTFggeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBGTFgoY29uc3QgVCosIGNvbnN0IFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxUPjo6dmFsdWUgPT0gMCwgInNob3VsZCBiZSBhbiBhcnJheSBvZiAwIGV4dGVudCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBVPjo6dmFsdWUsICJzaG91bGQgYmUgdHlwZSBVIik7CisgICAgfQorfTsKKworc3RydWN0IE1QIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFeHBlY3RlZFUsIHR5cGVuYW1lIFVuZXhwZWN0ZWRVPgorICAgIGlubGluZSBNUChUIFU6OiosIGNvbnN0IEV4cGVjdGVkVSosIGNvbnN0IFVuZXhwZWN0ZWRVKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VSwgVW5leHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGJhc2UgdHlwZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxVLCBFeHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgZGVyaXZlZCB0eXBlIik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4KKyAgICBpbmxpbmUgTVAoVCBEOjoqLCBjb25zdCBEKikgeyB9Cit9OworCit2b2lkIGNvbXBpbGVkU3RhdGljX2FycmF5VHlwZVByb3BhZ2F0aW9uVGVzdCgpIHsKKyAgICAodm9pZClTMzIoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5zaWduZWQzMik7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4UzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgLy8gVFJJQ0tZOiAmZGVyaXZlZENsYXNzOjpiYXNlTWVtYmVyIGhhcyB0eXBlIG9mIGJhc2VDbGFzczo6KgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpLCBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6Oio+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYXNlIG1lbWJlciBwb2ludGVyIHNob3VsZCBoYXZlIGJhc2UgY2xhc3MgaW4gdHlwZSIpOworCisgICAgLy8gdGhlcmVmb3JlLCBtZW1iZXIgcG9pbnRlciBleHBhbmRzIHRvIGJhc2VDbGFzczo6KiBpbiB0ZW1wbGF0ZXMKKyAgICAodm9pZClNUCgmQzJUZXN0QUluZm86OnNpZ25lZDMyLAorICAgICAgICAgICAgIChDMlRlc3RBU3RydWN0KikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QUluZm8qKTAgLyogdW5leHBlY3RlZCAqLyk7CisgICAgLy8gYnV0IGNhbiBiZSBjYXN0IHRvIGRlcml2ZWRDbGFzczo6KgorICAgICh2b2lkKU1QKChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFJbmZvKikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QVN0cnVjdCopMCAvKiB1bmV4cGVjdGVkICovKTsKKworICAgIC8vIFRSSUNLWTogYmFzZUNsYXNzOjoqIGRvZXMgbm90IGF1dG9jb252ZXJ0IHRvIGRlcml2ZWRDbGFzczo6KiBldmVuIGluIHRlbXBsYXRlcworICAgIC8vICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsIChDMlRlc3RBSW5mbyopMCk7Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgTWVtYmVyUG9pbnRlckNhc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0QUluZm8sIHNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KiBzMzJwdHIgPSAmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9kZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KikmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9jYXN0MmRlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBSW5mbzo6KilzMzJwdHI7CisgICAgQzJUZXN0QUluZm8gKmluZm8gPSAoQzJUZXN0QUluZm8gKikyNTY7CisgICAgQzJUZXN0QVN0cnVjdCAqc3RydWt0ID0gKEMyVGVzdEFTdHJ1Y3QgKilpbmZvOworICAgIGludDMyX3QgKmluZm9fczMyX2Rlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzJfY2FzdDJkZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Nhc3QyZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzIgPSAmKGluZm8tPipzMzJwdHIpOworICAgIGludDMyX3QgKnN0cnVrdF9zMzIgPSAmKHN0cnVrdC0+KnMzMnB0cik7CisKKyAgICBFWFBFQ1RfRVEoMjU2dSwgKHVpbnRwdHJfdClpbmZvKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3QpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Rlcml2ZWQpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Nhc3QyZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzIpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdF9zMzIpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5zaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSwgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBBUkFNIFVTQUdFIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IEMyTnVtYmVyU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJTdHJ1Y3QoKSB7fQorICAgIEMyTnVtYmVyU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE51bWJlcikKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyQmFzZVN0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyOworICAgIEMyTnVtYmVyQmFzZVN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoTnVtYmVyQmFzZSkKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoTnVtYmVycywgbU51bWJlcnMpCisgICAgQzJGSUVMRChtTnVtYmVycywgIm51bWJlcnMiKQorfTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgIkMyTnVtYmVyc1N0cnVjdCBoYXMgaW5jb3JyZWN0IHNpemUiKTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVySW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJUdW5pbmc7Cit0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclBvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclN0cmVhbVR1bmluZzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1R1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNQb3J0VHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1N0cmVhbVR1bmluZzsKKworLy8KKyNpZiAwCisKK3ZvaWQgdGVzdCgpIHsKKyAgICBDMk51bWJlclN0cnVjdCBzKDEwKTsKKyAgICAodm9pZClDMk51bWJlclN0cnVjdDo6RmllbGRMaXN0KCk7Cit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXJCPiBDMk51bWJlckNvbmZpZzQ7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMk51bWJlckNvbmZpZzM7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMlZpZGVvTmFtZUNvbmZpZzsKKwordm9pZCB0ZXN0MygpIHsKKyAgICBDMk51bWJlckNvbmZpZzMgcygxMCk7CisgICAgcy52YWx1ZSA9IDExOworICAgIHMgPSAxMjsKKyAgICAodm9pZClDMk51bWJlckNvbmZpZzM6OkZpZWxkTGlzdCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvTmFtZUNvbmZpZz4gbiA9IEMyVmlkZW9OYW1lQ29uZmlnOjpBbGxvY1NoYXJlZCgyNSk7CisgICAgc3RyY3B5KG4tPm0udmFsdWUsICJsYWpvcyIpOworICAgIEMyTnVtYmVyQ29uZmlnNCB0KGZhbHNlLCAwLCAxMSk7CisgICAgdC52YWx1ZSA9IDE1OworfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIGVudW0geyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhOdW1iZXIgfTsKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIEZMRVgoQzJOdW1iZXJzU3RydWN0LCBtTnVtYmVycyk7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJ5ZXMiKTsKKworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc0luZm87CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpfRklFTERfTElTVCA9CisvLyAgICB7IHsgRkQ6OklOVDMyLCAwLCAid2lkdGhzIiB9IH07CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMk51bWJlcnNTdHJ1Y3QqKShudWxscHRyKSktPm1OdW1iZXJzLCAibnVtYmVyIikgfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyQ29uZmlnOworCitzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbXlMaXN0ID0gQzJOdW1iZXJDb25maWc6OkZpZWxkTGlzdCgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBfX3Rlc3RfZGVzY3JpYmUodWludDMyX3QgcGFyYW1UeXBlKSB7CisgICAgICAgIHN0ZDo6bGlzdDxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpYmVDMlBhcmFtczxDMk51bWJlckNvbmZpZz4oKTsKKworICAgICAgICBhdXRvIHdpZHRocyA9IEMyTnVtYmVyc0luZm86OkFsbG9jU2hhcmVkKDUpOworICAgICAgICB3aWR0aHMtPmZsZXhDb3VudCgpOworICAgICAgICB3aWR0aHMtPm0ubU51bWJlcnNbNF0gPSAxOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgdGVzdDMoKTsKKworICAgICAgICBDMk51bWJlckNvbmZpZyBvdXRwdXRXaWR0aChmYWxzZSwgMTIzKTsKKworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleChwYXJhbVR5cGUpOworICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZSkgeworICAgICAgICBjYXNlIEMyTnVtYmVyQ29uZmlnOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4obmV3IEMyUGFyYW1EZXNjcmlwdG9yeworICAgICAgICAgICAgICAgIHRydWUgLyogaXNSZXF1aXJlZCAqLywKKyAgICAgICAgICAgICAgICAibnVtYmVyIiwKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2FuU2V0UG9ydChUICZvLCBib29sIG91dHB1dCkgeyByZXR1cm4gby5zZXRQb3J0KG91dHB1dCk7IH0KK2Jvb2wgY2FuU2V0UG9ydCguLi4pIHsgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKCgoUyopMCktPnNldFBvcnQodHJ1ZSkpPgorc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9jYW5DYWxsU2V0UG9ydChpbnQpOwordGVtcGxhdGU8dHlwZW5hbWU+CitzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9jYW5DYWxsU2V0UG9ydCguLi4pOworI2RlZmluZSBjYW5DYWxsU2V0UG9ydCh4KSBkZWNsdHlwZShfY2FuQ2FsbFNldFBvcnQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKHgpPjo6dHlwZT4oMCkpOjp2YWx1ZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8aW50Pjo6dmFsdWUsICJpbnQgaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8dm9pZD46OnZhbHVlLCAidm9pZCBpcyBjb21wYXJhYmxlIik7CisKK3N0cnVjdCBDMl9ISURFIF90ZXN0MCB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MCYpOworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDAmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDEgeworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDEmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDIgeworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDImKTsKK307CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QwPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGFuZCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MT46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0Mj46OnZhbHVlLCAiY2xhc3Mgd2l0aCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQzJQQVJBTSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRnJvbUJhc2VUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRmxleFRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCk7Cit9OworCisvLyBURVNUX0YoX0MyUGFyYW1JbnNwZWN0b3IsIFN0YXRpY1Rlc3QpIHsKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY1Rlc3QoKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJOdW1iZXJTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk51bWJlclR1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSA9PSAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0Zyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDMxMDIgfTsKKyAgICB0eXBlZGVmIEMyTnVtYmVyQmFzZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTZXR0aW5nOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0U2V0dGluZzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtU2V0dGluZzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk15U2V0dGluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4VGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlcnNTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyc1R1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3RlbXBsYXRlPGJvb2wsIHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmcgeyB9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCAuLi5OPgorc3RydWN0IF9wcmludF9hc193YXJuaW5nPHRydWUsIE4uLi4+IDogc3RkOjp0cnVlX3R5cGUgeyB9OworCisjZGVmaW5lIHN0YXRpY19hc3NlcnRfZXF1YWxzKGEsIGIsIG1zZykgXAorc3RhdGljX2Fzc2VydChfcHJpbnRfYXNfd2FybmluZzwoYSkgPT0gKGIpLCBhLCBiPjo6dmFsdWUsIG1zZykKKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleEZyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDEyMDMgfTsKKyAgICB0eXBlZGVmIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlJbmZvOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0SW5mbzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtSW5mbzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlJbmZvOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpDT1JFX0lOREVYLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0X2VxdWFscyhDMk15SW5mbzo6UEFSQU1fVFlQRSwgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0SW5mbzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0SW5mbzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0SW5mbzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtSW5mbzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1JbmZvOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbUluZm86Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbU9wc1Rlc3QpIHsKKyAgICBjb25zdCBDMk51bWJlclN0cnVjdCBzdHIoMTAwKTsKKyAgICBDMk51bWJlclN0cnVjdCBic3RyOworCisgICAgeworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHIubU51bWJlcik7CisgICAgICAgIGJzdHIubU51bWJlciA9IDEwMDsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyVHVuaW5nIHR1bigxMDApOworICAgIEMyTnVtYmVyVHVuaW5nIGJ0dW47CisKKyAgICB7CisgICAgICBDMk51bWJlckluZm8gaW5mKDEwMCk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKworICAgICAgRVhQRUNUX0VRKHR1bi5jb3JlSW5kZXgoKSwgaW5mLmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4uY29yZUluZGV4KCksIHR1bl8tPmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCBpbmYudHlwZSgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCB0dW5fLT50eXBlKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IHR1biwgYnR1biB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZQorICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuID09IGJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLm9wZXJhdG9yPT0oYnR1bikpOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4gIT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi5vcGVyYXRvciE9KGJ0dW4pKTsKKyAgICAgICAgYnR1bi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEodHVuLCBidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnR5cGUoKSwgQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZ0dW4pLCAmdHVuKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGJ0dW4pKSwgYnR1bik7CisgICAgICAgIGJ0dW4uaW52YWxpZGF0ZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoQzJQYXJhbTo6Q29weShidHVuKSk7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nIG91dHAxKHRydWUsIDEwMCksIGlucDEoZmFsc2UsIDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nIGJvdXRwMSwgYmlucDEsIGJpbnAzKGZhbHNlLCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgaW5wMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgYmlucDI7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgb3V0cDIoMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBib3V0cDI7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShib3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGlucDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHAyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworCisgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBpbnAyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgb3V0cDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIG91dHAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgYmlucDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0cDEudHlwZSgpLCBib3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEsIGJvdXRwMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0cDEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gaW5wMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IG91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDEgPT0gYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDIgIT0gYm91dHAyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7CisgICAgICAgIGJpbnAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiAhPSBiaW5wMik7CisgICAgICAgIGJpbnAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDIgPT0gYmlucDIpOworCisgICAgICAgIGJpbnAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7CisgICAgICAgIGJvdXRwMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCFib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyICE9IGJvdXRwMik7CisgICAgICAgIGJvdXRwMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiA9PSBib3V0cDIpOworCisgICAgICAgIGJvdXRwMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYm91dHAxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAxKSwgJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMSksICZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJm91dHAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCopJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksICZpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQqKSZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCAmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5wMSkpLCBpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAyKSksIGlucDIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAxKSksIG91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRwMikpLCBvdXRwMik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmcgb3V0czEodHJ1ZSwgMXUsIDEwMCksIGluczEoZmFsc2UsIDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nIGJvdXRzMSwgYmluczEsIGJpbnMzKGZhbHNlLCAxdSwgMTAwKTsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgaW5zMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgYmluczI7CisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBvdXRzMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGJvdXRzMjsKKworICAgIEVYUEVDVF9FUShpbnMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGJpbnMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgb3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBib3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIG91dHMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgYmluczEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0czEudHlwZSgpLCBib3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEsIGJvdXRzMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0czEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5zMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLnN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHMxIH0gKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5zMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLm1OdW1iZXIpOworCisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czIuc3RyZWFtKCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGluczIpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBvdXRzMik7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMxID09IGJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMyICE9IGJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7CisgICAgICAgIGJpbnMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgPT0gYmluczIpOworCisgICAgICAgIGJpbnMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7CisgICAgICAgIGJvdXRzMi5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiA9PSBib3V0czIpOworCisgICAgICAgIGJvdXRzMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYm91dHMxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMxKSwgJmluczEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMSksICZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZvdXRzMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KikmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCAmaW5zMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Kikmb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCAmb3V0czIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5zMSkpLCBpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMyKSksIGluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMxKSksIG91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRzMikpLCBvdXRzMik7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwgMTAwIH07CisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUocDEsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RhdGljVGVzdEFkZENvcmVJbmRleCgpIHsKKyAgICBzdHJ1Y3Qgbm9iYXNlIHt9OworICAgIHN0cnVjdCBiYXNlIHsgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IDEgfTsgfTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9DMkFkZENvcmVJbmRleDxub2Jhc2UsIDI+OjpDT1JFX0lOREVYID09IDIsICJzaG91bGQgYmUgMiIpOworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PGJhc2UsIDE+OjpDT1JFX0lOREVYID09IDEsICJzaG91bGQgYmUgMSIpOworfQorCitjbGFzcyBUZXN0RmxleEhlbHBlciB7CisgICAgc3RydWN0IF9GbGV4IHsKKyAgICAgICAgaW50MzJfdCBhOworICAgICAgICBjaGFyIGJbXTsKKyAgICAgICAgX0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9GbGV4LCBiKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Cb0ZsZXggeworICAgICAgICBfRmxleCBhOworICAgICAgICBfQm9GbGV4KCkge30KKyAgICAgICAgRkxFWChfQm9GbGV4LCBhKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Ob25GbGV4IHsKKyAgICB9OworCisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCkgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXI+OjpGbGV4VHlwZSwgdm9pZD46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyW10+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0JvRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoX0MyRmxleGlibGU8X0ZsZXg+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbGV4aWJsZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFfQzJGbGV4aWJsZTxfTm9uRmxleD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBmbGV4aWJsZSIpOworICAgIH0KK307CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgRmxleFBhcmFtT3BzVGVzdCkgeworLy8gICAgY29uc3QgQzJOdW1iZXJzU3RydWN0IHN0cnsxMDB9OworICAgIEMyTnVtYmVyc1N0cnVjdCBic3RyOworICAgIHsKKy8vICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHItPm0ubU51bWJlcnNbMF0pOworICAgICAgICAodm9pZCkmYnN0ci5tTnVtYmVyc1swXTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKyAgICB0dW5fLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNUdW5pbmc+IHR1biA9IHN0ZDo6bW92ZSh0dW5fKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzVHVuaW5nPiBidHVuID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1NoYXJlZCgxKTsKKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNUdW5pbmcgKlRbXSA9IHsgdHVuLmdldCgpLCBidHVuLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogVCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCp0dW4gPT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLT5vcGVyYXRvcj09KCpidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCp0dW4gIT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4tPm9wZXJhdG9yIT0oKmJ0dW4pKTsKKyAgICAgICAgYnR1bi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX0VRKCp0dW4sICpidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi0+dHlwZSgpLCBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCB0dW4uZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKnR1bikpLCAqdHVuKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDFfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jVW5pcXVlKDEsIHRydWUpKSwKKyAgICAgICAgICAgIGlucDFfID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UpOworICAgIG91dHAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBpbnAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDEgPSBzdGQ6Om1vdmUob3V0cDFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gaW5wMSA9IHN0ZDo6bW92ZShpbnAxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IGJvdXRwMShDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxKSksCisgICAgICAgICAgICBiaW5wMSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpLAorICAgICAgICAgICAgYmlucDMgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxLCBmYWxzZSk7CisgICAgYmlucDMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIGlucDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMiA9IHN0ZDo6bW92ZShpbnAyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBiaW5wMihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEpKTsKKyAgICBvdXRwMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDIgPSBzdGQ6Om1vdmUob3V0cDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBib3V0cDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUFtdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSwgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqUElbXSA9IHsgaW5wMi5nZXQoKSwgYmlucDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQgKlBPW10gPSB7IG91dHAyLmdldCgpLCBib3V0cDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAyW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAzW10gPSB7IGJvdXRwMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAzKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDItPm0ubU51bWJlcnNbMF0pOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICppbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpvdXRwMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMSA9PSAqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAyICE9ICpib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOworICAgICAgICBiaW5wMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgIT0gKmJpbnAyKTsKKyAgICAgICAgYmlucDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAyID09ICpiaW5wMik7CisKKyAgICAgICAgYmlucDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOworICAgICAgICBib3V0cDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiAhPSAqYm91dHAyKTsKKyAgICAgICAgYm91dHAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgPT0gKmJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBpbnAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilpbnAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBvdXRwMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKW91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQqKWlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIGlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQqKW91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAxKSksICppbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5wMikpLCAqaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAxKSksICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAyKSksICpvdXRwMik7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSwgMXUpKTsKKyAgICBvdXRzMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czEgPSBzdGQ6Om1vdmUob3V0czFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jVW5pcXVlKDEsIGZhbHNlLCAxdSkpOworICAgIGluczFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczEgPSBzdGQ6Om1vdmUoaW5zMV8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJvdXRzMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlLCAxdSkpOworICAgIGJpbnMzLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIGluczJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyID0gc3RkOjptb3ZlKGluczJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gYmluczIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIG91dHMyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyID0gc3RkOjptb3ZlKG91dHMyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBib3V0czIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlNbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCksIGJvdXRzMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCAqU0lbXSA9IHsgaW5zMi5nZXQoKSwgYmluczIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqU09bXSA9IHsgb3V0czIuZ2V0KCksIGJvdXRzMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTMltdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMyKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC0+c3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzNbXSA9IHsgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLT5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmluczIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKm91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMxID09ICpib3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczIgIT0gKmJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOworICAgICAgICBiaW5zMi0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgPT0gKmJpbnMyKTsKKworICAgICAgICBiaW5zMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKKyAgICAgICAgYm91dHMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgPT0gKmJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIGluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilpbnMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKW91dHMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KilpbnMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIGluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQqKW91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgb3V0czIuZ2V0KCkpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczEpKSwgKmluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnMyKSksICppbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czEpKSwgKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czIpKSwgKm91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50MzJWYWx1ZSBpbnQzMlZhbHVlKElOVDMyX01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDMyVmFsdWUudmFsdWUpLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UMzJfTUlOLCBpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQzMlZhbHVlIHVpbnQzMlZhbHVlKFVJTlQzMl9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50MzJWYWx1ZS52YWx1ZSksIHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQzMl9NQVgsIHVpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQzMlZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50NjRWYWx1ZSBpbnQ2NFZhbHVlKElOVDY0X01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDY0VmFsdWUudmFsdWUpLCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UNjRfTUlOLCBpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UNjQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQ2NFZhbHVlIHVpbnQ2NFZhbHVlKFVJTlQ2NF9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50NjRWYWx1ZS52YWx1ZSksIHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQ2NF9NQVgsIHVpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQ2NFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyRmxvYXRWYWx1ZSBmbG9hdFZhbHVlKDEyMy40Zik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGZsb2F0VmFsdWUudmFsdWUpLCBmbG9hdD46OnZhbHVlLCAic2hvdWxkIGJlIGZsb2F0Iik7CisgICAgICAgIEVYUEVDVF9FUSgxMjMuNGYsIGZsb2F0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZmxvYXRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpGTE9BVCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgaW5pdFZhbHVlW10gPSAiQUJDRCI7CisgICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyQmxvYlZhbHVlLCAwPiBCbG9iU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsb2JTZXR0aW5nPiBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBibG9iVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkMiLCAzKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdGV4cHIgY2hhciBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwgMD4gU3RyaW5nU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZ1NldHRpbmc+IHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDYsIGluaXRWYWx1ZSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZ1ZhbHVlLT5tLnZhbHVlKSwgY2hhcltdPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhcltdIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHN0cmluZ1ZhbHVlLT5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpTVFJJTkcsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQiIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoMTEsICJpbml0VmFsdWUiKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgImluaXRWYWx1ZVwwIiwgMTEpKTsKKyAgICAgICAgRVhQRUNUX0VRKDExdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKGluaXRWYWx1ZSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEIiwgNSkpOworICAgICAgICBFWFBFQ1RfRVEoNXUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSh7ICdBJywgJ0InLCAnQycsICdEJyB9KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDQpKTsKKyAgICAgICAgRVhQRUNUX0VRKDR1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICp2c3QgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShwMSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCB2c3QpOworICAgICAgICBpZiAodnN0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHZzdC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgdnN0LT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTZ1LCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSwgMTAxLCAxMDIgfTsKKworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDE2dSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKnZwdCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZwdCk7CisgICAgICAgIGlmICh2cHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgdnB0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAxLCB2cHQtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMiwgdnB0LT5tLm1OdW1iZXJzWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgQzJWYWx1ZVRlc3QpIHsKKyAgICBDMlZhbHVlIHZhbDsKKyAgICBpbnQzMl90IGkzMiA9IC0zMjsKKyAgICBpbnQ2NF90IGk2NCA9IC02NDsKKyAgICB1aW50MzJfdCB1MzIgPSAzMjsKKyAgICB1aW50NjRfdCB1NjQgPSA2NDsKKyAgICBmbG9hdCBmcCA9IDEuNWY7CisKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6Tk9fSU5JVCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyLCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50MzJfdCgtMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDMyX3QoMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQzMiwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50NjRfdCgtNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDY0LCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IHVpbnQ2NF90KDY0MzIpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSAxNS4yNWY7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OkZMT0FULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMTUuMjVmLCBmcCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU2FtcGxlQ29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitjbGFzcyBDMlNhbXBsZUNvbXBvbmVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgeworICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOworICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7CisgICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOworICAgIGlmIChmZC5leHRlbnQoKSA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5leHRlbnQoKSA8PCAiXSI7CisgICAgfSBlbHNlIGlmIChmZC5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICpvcyA8PCAiW10iOworICAgIH0KKyAgICAqb3MgPDwgIiAoIiA8PCBmZC5fbUZpZWxkSWQgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworQzJFTlVNKAorICAgIE1ldGFkYXRhVHlwZSwgaW50MzJfdCwKKyAgICBrSW52YWxpZCA9IC0xLAorICAgIGtOb25lID0gMCwKKyAgICBrR3JhbGxvYywKKyAgICBrTmF0aXZlSGFuZGxlLAorICAgIGtBTmF0aXZlV2luZG93LAorICAgIGtDYW1lcmEsCispCisKK2VudW0geworICAgIGtQYXJhbUluZGV4VmlkZW9Db25maWcgPSAweDEyMzQsCit9OworCitzdHJ1Y3QgQzJWaWRlb0NvbmZpZ1N0cnVjdCB7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgTWV0YWRhdGFUeXBlIG1ldGFkYXRhVHlwZTsKKyAgICBpbnQzMl90IHN1cHBvcnRlZEZvcm1hdHNbXTsKKworICAgIEMyVmlkZW9Db25maWdTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvQ29uZmlnLCBzdXBwb3J0ZWRGb3JtYXRzKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobWV0YWRhdGFUeXBlLCAibWV0YWRhdGEtdHlwZSIpCisgICAgQzJGSUVMRChzdXBwb3J0ZWRGb3JtYXRzLCAiZm9ybWF0cyIpCit9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlZpZGVvQ29uZmlnU3RydWN0PiBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzsKKworY2xhc3MgTXlDb21wb25lbnRJbnN0YW5jZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLy8gXHRvZG8gdGhpcyBzZWVtcyB0b28gc3BlY2lmaWMKKyAgICAgICAgcmV0dXJuICJzYW1wbGUuaW50ZXJmYWNlIjsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyBob3cgYXJlIHRoZXNlIHNoYXJlZD8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgaWYgKCEqcGFyYW0pIHsgLy8gcGFyYW0gaXMgYWxyZWFkeSBpbnZhbGlkIC0gcmVtZW1iZXIgaXQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBkb2VzIG5vdCBoYW5kbGUgc3RyZWFtIHBhcmFtcyAoc2hvdWxkIHVzZSBpbmRleC4uLikKKyAgICAgICAgICAgIGlmICghbU15UGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgbXkgcGFyYW0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChteVBhcmFtLnNpemUoKSAhPSBwYXJhbS0+c2l6ZSgpKSB7IC8vIGluY29ycmVjdCBzaXplCisgICAgICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20obXlQYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaWYgKG1NeVBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKGluZGV4KS0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbUNvcHkoQzJQYXJhbTo6Q29weShteVBhcmFtKSk7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbUNvcHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0gJj4gbU15UGFyYW1zOworCisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIG1Eb21haW5JbmZvOworCisgICAgTXlDb21wb25lbnRJbnN0YW5jZSgpIHsKKyAgICAgICAgbU15UGFyYW1zLmluc2VydCh7bURvbWFpbkluZm8uaW5kZXgoKSwgbURvbWFpbkluZm99KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGNsYXNzIE15UGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmluc3RhbmNlOworCisgICAgcHVibGljOgorICAgICAgICBNeVBhcmFtUmVmbGVjdG9yKGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmkpIDogaW5zdGFuY2UoaSkgeyB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbUluZGV4LnR5cGVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPihuZXcgQzJTdHJ1Y3REZXNjcmlwdG9yeworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+bURvbWFpbkluZm8udHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShpbnN0YW5jZS0+bURvbWFpbkluZm8pOjpGaWVsZExpc3QoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeS5maWVsZCgpID09IEMyUGFyYW1GaWVsZCgmbURvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZsYWcgKi8sCisgICAgICAgICAgICAgICAgICAgICZtRG9tYWluSW5mby52YWx1ZQorICAgICAgICAgICAgICAgICAgICAvLywKKyAgICAgICAgICAgICAgICAgICAgLy97KGludDMyX3QpQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFT30KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPihuZXcgTXlQYXJhbVJlZmxlY3Rvcih0aGlzKSk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSk7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgbmV3IEMyUGFyYW1EZXNjcmlwdG9yKHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+TXlDb21wb25lbnRJbnN0YW5jZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIGJvb2wgUz1zdGQ6OmlzX2VudW08RT46OnZhbHVlPgorc3RydWN0IGdldHRlciB7CisgICAgaW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC5pMzI7CisgICAgfQorICAgIGludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAuaTY0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50MzJfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTMyOworICAgIH0KKyAgICB1aW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTY0OworICAgIH0KKyAgICBmbG9hdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBmbG9hdCopIHsKKyAgICAgICAgcmV0dXJuIHAuZnA7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3N0cnVjdCBnZXR0ZXI8RSwgdHJ1ZT4geworICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgICAgICAgdXNpbmcgdT10eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICAgICAgIHJldHVybiBnZXR0ZXI8dT4oKS5nZXQocCwgKHUqKTApOworICAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGU8VCwgZmFsc2U+IHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEU+Cit0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldCgKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgIHJldHVybiBnZXR0ZXI8RT4oKS5nZXQocCwgKEUqKTApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBkdW1wRlNWKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2LCBUKnQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgPyAoc3RkOjppc19zaWduZWQ8dHlwZW5hbWUgbGF4X3VuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlID8gImkiIDogInUiKQorICAgICAgICAgICAgIDogc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiaSIgOiAidSIgOiAiZiIpCisgICAgICAgICA8PCAoOCAqIHNpemVvZihUKSk7CisgICAgaWYgKHN2LnR5cGUgPT0gc3YuUkFOR0UpIHsKKyAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgZ2V0KHN2LnJhbmdlLm1pbiwgdCk7CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2Uuc3RlcCwgdCkgIT0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5zdGVwLCB0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLm51bSwgdCkgIT0gMSB8fCBnZXQoc3YucmFuZ2UuZGVub20sIHQpICE9IDEpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5udW0sIHQpIDw8ICIvIiA8PCBnZXQoc3YucmFuZ2UuZGVub20sIHQpOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgZ2V0KHN2LnJhbmdlLm1heCwgdCkgPDwgIikiOworICAgIH0KKyAgICBpZiAoc3YudmFsdWVzLnNpemUoKSkgeworICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IHN2LkZMQUdTID8gIi5mbGFncygiIDogIi5saXN0KCIpOworICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAgOiBzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IGdldChwLCB0KTsKKyAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKKyAgICBpZiAodHlwZS5mb3JJbnB1dCgpKSB7CisgICAgICAgIGNvdXQgPDwgIklucHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yT3V0cHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiT3V0cHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yUG9ydCgpICYmICF0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlBvcnQiOworICAgIH0KKyAgICBpZiAodHlwZS5mb3JTdHJlYW0oKSkgeworICAgICAgICBjb3V0IDw8ICJTdHJlYW0iOworICAgIH0KKworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCk7CisKKyAgICBzd2l0Y2ggKHR5cGUua2luZCgpKSB7CisgICAgY2FzZSBDMlBhcmFtOjpJTkZPOiBjb3V0IDw8ICJJbmZvIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTRVRUSU5HOiBjb3V0IDw8ICJTZXR0aW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpUVU5JTkc6IGNvdXQgPDwgIlR1bmluZyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6U1RSVUNUOiBjb3V0IDw8ICJTdHJ1Y3QiOyBicmVhazsKKyAgICBkZWZhdWx0OiBjb3V0IDw8ICJLaW5kIiA8PCAoaW50MzJfdCl0eXBlLmtpbmQoKTsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OkNvcmVJbmRleCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCkgPDwgIlN0cnVjdCI7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiBjb3V0IDw8ICJibG9iICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8ICJmbG9hdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCAiaW50MzJfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogY291dCA8PCAiaW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgInVpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCAidWludDY0X3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBjb3V0IDw8ICJjaGFyICI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgICAgICBkdW1wVHlwZSgoQzJQYXJhbTo6VHlwZSl0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBTdHJ1Y3QoY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoc2QuY29yZUluZGV4KCkpOworICAgIGNvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIC8vQzJGaWVsZERlc2NyaXB0b3IgJmY7CisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZiA6IHNkKSB7CisgICAgICAgIFByaW50VG8oZiwgJmNvdXQpOworICAgICAgICBjb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKGYubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIi5uYW1lZCgiOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmcCA6IGYubmFtZWRWYWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IHAuZmlyc3QgPDwgIj0iOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDY0X3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogY291dCA8PCBnZXQocC5zZWNvbmQsIChmbG9hdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBjb3V0IDw8ICI/Pz8iOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291dCA8PCAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKK30KKwordm9pZCBkdW1wRGVzYyhjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGlmIChwZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgY291dCA8PCAicmVxdWlyZWQgIjsKKyAgICB9CisgICAgaWYgKHBkLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgIGNvdXQgPDwgInBlcnNpc3RlbnQgIjsKKyAgICB9CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZShwZC5pbmRleCgpLnR5cGUoKSkpOworICAgIGNvdXQgPDwgIiAiIDw8IHBkLm5hbWUoKSA8PCAiOyIgPDwgZW5kbDsKK30KKworVEVTVF9GKEMyU2FtcGxlQ29tcG9uZW50VGVzdCwgUmVmbGVjdG9yVGVzdCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW5JbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNeUNvbXBvbmVudEluc3RhbmNlPiBteUNvbXAobmV3IE15Q29tcG9uZW50SW5zdGFuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcCA9IG15Q29tcDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2N7CisgICAgICAgIG15Q29tcC0+Z2V0UGFyYW1SZWZsZWN0b3IoKS0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKX07CisgICAgZHVtcFN0cnVjdCgqZGVzYyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICB7IEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpLAorICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCB9LAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpKSwKKyAgICB9OworCisgICAgRVhQRUNUX0VRKEMyX09LLCBjb21wLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihxdWVyeSwgQzJfRE9OVF9CTE9DSykpOworCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnEgOiBxdWVyeSkgeworICAgICAgICBkdW1wRlNWKHEudmFsdWVzLCAmZG9tYWluSW5mby52YWx1ZSk7CisgICAgfQorfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1Rlc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCAwPiBVaW50MzJUZXN0SW5mbzsKKyAgICBVaW50MzJUZXN0SW5mbyB0OworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMCwgMTAsIDEpKTsgIC8vIG1pbiwgbWF4LCBzdGVwCisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKDEsIDY0LCAyLCAxKSk7ICAvLyBtaW4sIG1heCwgbnVtLCBkZW4KKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHsxLCAyLCAzfSkpOyAgLy8gZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdAorICAgIHVpbnQzMl90IHZhbFtdID0gezEsIDMsIDUsIDd9OworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB2KHN0ZDo6YmVnaW4odmFsKSwgc3RkOjplbmQodmFsKSk7CisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlLCB2KSk7ICAvLyBmbGFncywgc3RkOjp2ZWN0b3IKKworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YgOiB2YWx1ZXMpIHsKKyAgICAgICAgZHVtcEZTVihzdiwgJnQudmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2QzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyVXRpbFRlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPF9DMk1hY3JvVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworLyoqIFxmaWxlCisgKiBUZXN0cyBmb3Igdm5kay91dGlsLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJNYWNyb1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSksICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0KSwgInNob3VsZCBiZSA2NCIpOworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoLCksICJzaG91bGQgYmUgMCIpOworc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEsKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiwpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCksICJzaG91bGQgYmUgNjQiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJFbnVtVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDMlV0aWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitDMkVOVU0oRW51bTEsIHVpbnQzMl90LAorICAgIEVudW0xVmFsdWUxLAorICAgIEVudW0xVmFsdWUyLAorICAgIEVudW0xVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAorKTsKKworQzJFTlVNX0NVU1RPTV9QUkVGSVgoRW51bTIsIHVpbnQzMl90LCAiRW51bSIsCisgICAgRW51bTJWYWx1ZTEsCisgICAgRW51bTJWYWx1ZTIsCisgICAgRW51bTJWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX05BTUVTKEVudW0zLCB1aW50OF90LAorICAgICh7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAorICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSksCisgICAgRW51bTNWYWx1ZTEsCisgICAgRW51bTNWYWx1ZTIsCisgICAgRW51bTNWYWx1ZTQgPSBFbnVtM1ZhbHVlMiArIDIsCisgICAgSW52YWxpZCwKKyk7CisKK1RFU1RfRihDMlV0aWxUZXN0LCBFbnVtVXRpbHNUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nLCBFbnVtMz4+IHBhaXJzICggeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAorICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOworICAgIEVudW0zIGUzOworICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CisKKyAgICAvLyB1cHBlciBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX05PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX19OTyIpKTsKKyAgICBFWFBFQ1RfRVEoImEyZHAiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJBMkRQIikpOworICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyX1RTIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCTE9DS18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QRUdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSElEREVOX1ZBTFVFIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUyIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUUyIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFXzIiKSk7CisKKyAgICAvLyBjYW1lbCBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5vIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNfTm8iKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUcyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWcydHMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlblZhbHVlIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWUyIikpOworCisgICAgLy8gbWl4ZWQgY2FzZQorICAgIEVYUEVDVF9FUSgibXAydC1zIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVF9zIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9ja18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTItZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMl9EIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18ydHMiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlbl9fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZV8yIikpOworICAgIEVYUEVDVF9FUSgiXzIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl9fMjMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfXzIzIikpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTlmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMl90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3RlbXBsYXRlPGludCBOPgorc3RydWN0IGMyX2NvbnN0X2NoZWNrZXIKK3sKKyAgICBpbmxpbmUgY29uc3RleHByIHN0YXRpYyBpbnQgbnVtKCkgeyByZXR1cm4gTjsgfQorfTsKKworY29uc3RleHByIGF1dG8gbWluX2kzMl9pMzIgPSBjMl9taW4oaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5faTMyX2k2NCA9IGMyX21pbihpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pOF9pMzIgPSBjMl9taW4oaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pMzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2k2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWluX3UzMl91MzIgPSBjMl9taW4odWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91NjQgPSBjMl9taW4odWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTY0KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91OCA9IGMyX21pbih1aW50MzJfdCgweGZmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U4KSwgY29uc3QgdWludDhfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91NjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U4Pjo6bnVtKCkgPT0gMHhmZiwgInNob3VsZCBiZSAweGZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTMyID0gYzJfbWF4KGludDMyX3QoMSksIGludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pNjQgPSBjMl9tYXgoaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaThfaTMyID0gYzJfbWF4KGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pNjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTMyID0gYzJfbWF4KHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTY0ID0gYzJfbWF4KHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U2NCksIGNvbnN0IHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTggPSBjMl9tYXgodWludDMyX3QoMHg3ZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91OCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91NjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U4Pjo6bnVtKCkgPT0gMHg3ZmZmZmZmZiwgInNob3VsZCBiZSAweDdmZmZmZmZmIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT1VOVEVSIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGMyX2NudHJfc3RhdGljX3Rlc3QoKSB7CisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgY29uc3RydWN0aW9uL2Fzc2lnbm1lbnQKKyAgICBjb25zdGV4cHIgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjb25zdGV4cHIgYzJfY250cjY0X3QgYzY0X2EoLTQ1Nik7CisgICAgYzJfY250cjMyX3QgYzMyX2IgX191bnVzZWQgPSBjNjRfYTsKKyAgICAvLyBjMzJfYiA9IDY0LjsgLy8gRElTQUxMT1dFRAorICAgIC8vIGMyX2NudHI2NF90IGM2NF9iID0gYzMyX2E7IC8vIERJU0FMTE9XRUQKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHNvbWUgY29uc3RleHByIG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICsgYzY0X2EpLCBkZWNsdHlwZShjNjRfYSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIjEyMyArIC00NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGMzMl9hID09IGMyX2NudHIzMl90KDI0NiksICIxMjMgKyAxMjMgPSAyNDYiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoLTMzMyksICItNDU2ICsgMTIzID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyAxKSwgZGVjbHR5cGUoMSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyA0NTYgPT0gYzJfY250cjMyX3QoNTc5KSwgIjEyMyArIDQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICsgYzY0X2EgPT0gYzJfY250cjY0X3QoMCksICI0NTYgKyAtNDU2ID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjNjRfYSA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzIC0gLTQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgwKSwgIjEyMyAtIDEyMyA9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hIC0gYzMyX2EgPT0gYzJfY250cjMyX3QoLTU3OSksICItNDU2IC0gMTIzID0gLTU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gMSksIGRlY2x0eXBlKDEgLSBjMzJfYSk+Ojp2YWx1ZSwgIi0gc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gNDU2ID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzIC0gNDU2ID0gLTMzMyIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2IC0gYzY0X2EgPT0gYzJfY250cjY0X3QoOTEyKSwgIjQ1NiAtIC00NTYgPSA5MTIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzY0X2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIjEyMyAqIC00NTYgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoMTUxMjkpLCAiMTIzICogMTIzID0gMTUxMjkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIi00NTYgKiAxMjMgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIDEpLCBkZWNsdHlwZSgxICogYzMyX2EpPjo6dmFsdWUsICIqIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NjA4OCksICIxMjMgKiA0NTYgPSA1NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICogYzY0X2EgPT0gYzJfY250cjY0X3QoLTIwNzkzNiksICI0NTYgKiAtNDU2ID0gLTIwNzkzNiIpOworCisgICAgc3RhdGljX2Fzc2VydCgoYzMyX2EgPDwgMjZ1KSA9PSBjMl9jbnRyMzJfdCgweEVDMDAwMDAwKSwgIjEyMyA8PCAyNiA9IDB4RUMwMDAwMDAiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHVuYXJ5IG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gK2MyX2NudHIzMl90KDEpLCAiMSA9PSArMSIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gLWMyX2NudHIzMl90KC0xKSwgIjEgPT0gLS0xIik7CisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb21wYXJpc29uCisgICAgdXNpbmcgYzhfdCA9IGMyX2NudHJfdDx1aW50OF90PjsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID4gYzhfdCgweDdmKSwgIjgwID4gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID49IGM4X3QoMHg3ZiksICI4MCA+PSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA+IGM4X3QoMHg3ZSksICI3RiA+IDdFIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID49IGM4X3QoMHg3ZSksICI3RiA+PSA3RSIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPj0gYzhfdCgwKSksICI4MCAhPj0gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPiBjOF90KC0weDgwKSksICI4MCAhPiA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgtMHg4MCksICI4MCA+PSA4MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA9PSBjOF90KDB4ODApLCAiODAgPT0gODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPT0gYzhfdCgwKSksICI4MCAhPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSAhPSBjOF90KDB4N2YpLCAiODAgIT0gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgweDdmKSAhPSBjOF90KDB4N2YpKSwgIjgwICE9IDdGIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPCBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPD0gYzhfdCgtMHg4MCksICI3RiA8IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2UpIDwgYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPD0gYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KDB4NDApKSwgIi00MCAhPCA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8PSBjOF90KDB4NDApKSwgIi00MCAhPD0gNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KC0weDQwKSksICItNDAgITwgLTQwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDQwKSA8PSBjOF90KC0weDQwKSwgIi00MCA8PSAtNDAiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoLTB4N2ZmZmZmZmYgLSAxKSA+IGMyX2NudHIzMl90KDB4N2ZmZmZmZmYpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09IGMyX2NudHIzMl90KGMyX2NudHI2NF90KDB4MTAwMDAwMDAxdWwpKSwgIjEgPT0gMSIpOworfQorCitjbGFzcyBDMlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihDMlRlc3QsIENvdW50ZXJUZXN0KSB7CisgICAgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gMywgYzJfY250cjMyX3QoMTI2KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICs9IGM2NF9hLCBjMl9jbnRyMzJfdCgtMzMwKSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIDw8PSAydSwgYzJfY250cjMyX3QoLTEzMjApKTsKKyAgICBFWFBFQ1RfRVEoYzY0X2EgKj0gMywgYzJfY250cjY0X3QoLTEzNjgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gYzY0X2EsIGMyX2NudHIzMl90KDQ4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIC09IDQwLCBjMl9jbnRyMzJfdCg4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICo9IGMzMl9hLCBjMl9jbnRyMzJfdCg2NCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5OTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNTZWdtZW50VGVzdCgpIHsKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkub2Zmc2V0ID09IDEyMywgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zaXplID09IDQ1NiwgIiIpOworCisgICAgICAgIC8vIGVtcHR5CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pc0VtcHR5KCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmlzRW1wdHkoKSwgIiIpOworCisgICAgICAgIC8vIHZhbGlkCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzVmFsaWQoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmlzVmFsaWQoKSwgIiIpOworCisgICAgICAgIC8vIGJvb2woKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KChib29sKUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisKKyAgICAgICAgLy8gIQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEhQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAwKSwgIiIpOworCisgICAgICAgIC8vIGNvbnRhaW5zCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjJ1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyNHUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI1dSwgMnUpKSwgIiIpOworCisgICAgICAgIC8vID09CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyNHUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMSArIH4xMjR1KSwgIiIpOworCisgICAgICAgIC8vICE9CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTI0dSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpICE9IEMyU2VnbWVudCgxMjR1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpICE9IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDwgQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpIDwgQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyMnUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTI0dSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID4gQzJTZWdtZW50KDEyMnUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID4gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIGVuZAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5lbmQoKSA9PSA1Nzl1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KS5lbmQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5lbmQoKSA9PSAweGZmZmZmZmZmdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmVuZCgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gaW50ZXJzZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjR1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoNTc5dSwgNDYwdSkpID09IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1ODl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU4OXUsIH45dSAvKiAtMTAgKi8pLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU1dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTIzdSkpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyMnUgLyogLTEyMyAqLyksICIiKTsKKworICAgICAgICAvLyBub3JtYWxpemUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGVtcHR5IHNlZ21lbnRzKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsaXplIGNhbm5vdCBiZSB1c2VkIHRvIG1ha2UgdGhpcyB3b3JrCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gc2F0dXJhdGUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGZ1bGwgc2VnbWVudHMgdXAgdG8gbWF4KQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogc2F0dXJhdGUgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsgYnV0IG9ubHkgcGFydGlhbGx5CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEwMDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoNTc5dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMDAwdSwgMHUpLCAiIik7CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNMaW5lYXJSYW5nZUFuZENhcGFjaXR5VGVzdCgpIHsKKyAgICAgICAgY2xhc3MgVGVzdENhcGFjaXR5IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKyAgICAgICAgICAgIHVzaW5nIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OjpfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdDsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUZXN0UmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KDB1KS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisgICAgICAgIGNvbnN0ZXhwciBUZXN0Q2FwYWNpdHkgY2FwKDEyM3UpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkobnVsbHB0cikuY2FwYWNpdHkoKSA9PSAwdSwgIiIpOworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5UmFuZ2UKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLm9mZnNldCgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLnNpemUoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgICAgICBjb25zdGV4cHIgVGVzdFJhbmdlIHJhbmdlKCZjYXAsIDUwdSwgMTAwdSk7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5vZmZzZXQoKSA9PSA1MHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5zaXplKCkgPT0gNzN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2UuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLm9mZnNldCgpID09IDIwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuc2l6ZSgpID09IDMwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gNTB1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5vZmZzZXQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuc2l6ZSgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgfQorCit9OworCisKK2NsYXNzIEMyQnVmZmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEMyQnVmZmVyVGVzdCgpCisgICAgICAgIDogbUJsb2NrUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICAgICAgbUxpbmVhckFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPignaScpKSwKKyAgICAgICAgICBtU2l6ZSgwdSksCisgICAgICAgICAgbUFkZHIobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KCdnJykpIHsKKyAgICB9CisKKyAgICB+QzJCdWZmZXJUZXN0KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhbGxvY2F0ZUxpbmVhcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUxpbmVhckFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtTGluZWFyQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcExpbmVhcihzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDhfdCAqKmFkZHIpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmbUFkZHIpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyTGluZWFyQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbUFkZHIpOworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltQWRkcjsKKyAgICB9CisKKyAgICB2b2lkIHVubWFwTGluZWFyKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIEFTU0VSVF9ORSgwdSwgbVNpemUpOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUxpbmVhckFsbG9jYXRpb24tPnVubWFwKG1BZGRyLCBtU2l6ZSwgbnVsbHB0cikpOworICAgICAgICBtU2l6ZSA9IDB1OworICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlTGluZWFyQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGVHcmFwaGljKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJm1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3R3JhcGhpY0FsbG9jYXRpb24oKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtYXBHcmFwaGljKEMyUmVjdCByZWN0LCBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRpb24tPm1hcCgKKyAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgICAgICAgICAgICAgYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJHcmFwaGljQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBtTWFwcGVkUmVjdCA9IHJlY3Q7CisgICAgICAgIG1lbWNweShtQWRkckdyYXBoaWMsIGFkZHIsIHNpemVvZih1aW50OF90KikgKiBDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVMpOworICAgIH0KKworICAgIHZvaWQgdW5tYXBHcmFwaGljKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUdyYXBoaWNBbGxvY2F0aW9uLT51bm1hcChtQWRkckdyYXBoaWMsIG1NYXBwZWRSZWN0LCBudWxscHRyKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtTGluZWFyQWxsb2NhdGlvbjsKKyAgICBzaXplX3QgbVNpemU7CisgICAgdm9pZCAqbUFkZHI7CisgICAgQzJSZWN0IG1NYXBwZWRSZWN0OworICAgIHVpbnQ4X3QqIG1BZGRyR3JhcGhpY1tDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUdyYXBoaWNBbGxvY2F0aW9uOworfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTGluZWFyQWxsb2NhdGlvblRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBhbGxvY2F0ZUxpbmVhcihrQ2FwYWNpdHkpOworCisgICAgdWludDhfdCAqYWRkciA9IG51bGxwdHI7CisgICAgbWFwTGluZWFyKDB1LCBrQ2FwYWNpdHksICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGFkZHJbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB1bm1hcExpbmVhcigpOworICAgIGFkZHIgPSBudWxscHRyOworCisgICAgbWFwTGluZWFyKGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ2FwYWNpdHkgLyAzOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDAsIGFkZHJbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHdyaXRlVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcgPSB3cml0ZVZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCB3cml0ZVZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSwgd3JpdGVWaWV3LmNhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSgwdSwgd3JpdGVWaWV3Lm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuc2l6ZSgpKTsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBkYXRhW2ldID0gaSAlIDEwMHU7CisgICAgfQorCisgICAgd3JpdGVWaWV3LnNldE9mZnNldChrQ2FwYWNpdHkgLyAzKTsKKyAgICBkYXRhID0gd3JpdGVWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3cml0ZVZpZXcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBkYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGkKKyAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSk7CisgICAgfQorCisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsIGZlbmNlKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiByZWFkVmlld0hvbGRlciA9IGNvbnN0QmxvY2subWFwKCk7CisgICAgQzJSZWFkVmlldyByZWFkVmlldyA9IHJlYWRWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgcmVhZFZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSAvIDMsIHJlYWRWaWV3LmNhcGFjaXR5KCkpOworCisgICAgLy8gVE9ETzogZmVuY2UKKyAgICBjb25zdCB1aW50OF90ICpjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSkKKyAgICAgICAgICAgICAgICA8PCAiOyBjb25zdERhdGEgPSAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oY29uc3REYXRhKTsKKyAgICB9CisKKyAgICByZWFkVmlldyA9IHJlYWRWaWV3LnN1YlZpZXcoMzMzdSwgMTAwdSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoMTAwdSwgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICBjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsgMzMzdSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgY29uc3REYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGk7CisgICAgfQorfQorCit2b2lkIGZpbGxQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgYWRkcltyb3dPZmZzZXQgKyBjb2xPZmZzZXRdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgdmVyaWZ5UGxhbmUoY29uc3QgQzJSZWN0IHJlY3QsIGNvbnN0IEMyUGxhbmVJbmZvIGluZm8sIGNvbnN0IHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHJlY3QuaGVpZ2h0IC8gaW5mby5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgaW50MzJfdCByb3dPZmZzZXQgPSAocm93ICsgcmVjdC50b3AgLyBpbmZvLnJvd1NhbXBsaW5nKSAqIGluZm8ucm93SW5jOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHJlY3Qud2lkdGggLyBpbmZvLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgaW50MzJfdCBjb2xPZmZzZXQgPSAoY29sICsgcmVjdC5sZWZ0IC8gaW5mby5jb2xTYW1wbGluZykgKiBpbmZvLmNvbEluYzsKKyAgICAgICAgICAgIGlmIChhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBhbGxvY2F0ZUdyYXBoaWMoa1dpZHRoLCBrSGVpZ2h0KTsKKworICAgIHVpbnQ4X3QgKmFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICBDMlJlY3QgcmVjdChrV2lkdGgsIGtIZWlnaHQpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dDsKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgdWludDhfdCAqeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUocmVjdCwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZShyZWN0LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIHVubWFwR3JhcGhpYygpOworCisgICAgbWFwR3JhcGhpYyhyZWN0LCAmbGF5b3V0LCBhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKworICAgIHkgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHUgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHYgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCB2LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKSk7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNCbG9ja1Bvb2xUZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VHcmFwaGljQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgsCisgICAgICAgICAgICBrSGVpZ2h0LAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gZ3JhcGhpY1ZpZXdIb2xkZXIgPSBibG9jay0+bWFwKCk7CisgICAgQzJHcmFwaGljVmlldyBncmFwaGljVmlldyA9IGdyYXBoaWNWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgZ3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGdyYXBoaWNWaWV3LmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhID0gZ3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKworICAgIHVpbnQ4X3QgKnkgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBDMlBsYW5lSW5mbyB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHVpbnQ4X3QgKnUgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBDMlBsYW5lSW5mbyB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVpbnQ4X3QgKnYgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICBDMlBsYW5lSW5mbyB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKTsKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB2SW5mbywgdiwgMCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMik7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1Nik7CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZShDMlJlY3Qoa1dpZHRoLCBrSGVpZ2h0KSwgZmVuY2UpOworICAgIGJsb2NrLnJlc2V0KCk7CisKKyAgICBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gY29uc3RWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IGNvbnN0R3JhcGhpY1ZpZXcgPSBjb25zdFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBjb25zdEdyYXBoaWNWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGNvbnN0R3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGNvbnN0R3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmNvbnN0RGF0YSA9IGNvbnN0R3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworCisgICAgY29uc3QgdWludDhfdCAqY3kgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgY29uc3QgdWludDhfdCAqY3UgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgY29uc3QgdWludDhfdCAqY3YgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIGN5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCBjdSwgMHgzNCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgY3YsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB2SW5mbywgY3YsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB2SW5mbywgY3YsIDApKTsKK30KKworY2xhc3MgQnVmZmVyRGF0YSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9Cit9OworCitjbGFzcyBCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyKGJsb2Nrcykge30KK307CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJ1ZmZlckRhdGFUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBsaW5lYXJCbG9ja1Bvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGdyYXBoaWNCbG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoMSA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodDEgPSAyNDA7CisgICAgY29uc3RleHByIEMyUmVjdCBrQ3JvcDEoa1dpZHRoMSwga0hlaWdodDEpOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgyID0gMTc2OworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MiA9IDE0NDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMihrV2lkdGgyLCBrSGVpZ2h0Mik7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkxID0gMTAyNHU7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkyID0gMjA0OHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazI7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkxLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkyLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2syKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNCbG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoMSwKKyAgICAgICAgICAgIGtIZWlnaHQxLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmZ3JhcGhpY0Jsb2NrMSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgyLAorICAgICAgICAgICAga0hlaWdodDIsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2syKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJEYXRhPiBkYXRhKG5ldyBCdWZmZXJEYXRhKHsgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpLAorICAgICAgICBsaW5lYXJCbG9jazItPnNoYXJlKDAsIGtDYXBhY2l0eTIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2syLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpHUkFQSElDLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxdSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+bGluZWFyQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpLAorICAgICAgICBncmFwaGljQmxvY2syLT5zaGFyZShrQ3JvcDIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgydSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKK30KKwordm9pZCBEZXN0cm95Q2FsbGJhY2soY29uc3QgQzJCdWZmZXIgKiAvKiBidWYgKi8sIHZvaWQgKmFyZykgeworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKmNiID0gKHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKilhcmc7CisgICAgKCpjYikoKTsKK30KKworZW51bSA6IHVpbnQzMl90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlcjEsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcjE+IEMyTnVtYmVyMUluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMj4gQzJOdW1iZXIySW5mbzsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYWxsb2MobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYWxsb2MtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworCisgICAgc3RkOjphdG9taWNfYm9vbCBkZXN0cm95ZWQoZmFsc2UpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYXJnID0gWyZkZXN0cm95ZWRdKCl7IGRlc3Ryb3llZCA9IHRydWU7IH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcihuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX0RVUExJQ0FURSwgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgRVhQRUNUX1RSVUUoZGVzdHJveWVkKTsKKworICAgIGJ1ZmZlci5yZXNldChuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIGRlc3Ryb3llZCA9IGZhbHNlOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssIG51bGxwdHIpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8xKG5ldyBDMk51bWJlcjFJbmZvKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMihuZXcgQzJOdW1iZXIySW5mbygyKSk7CisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5pbmZvKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMSkpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8xLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8yKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCpyZW1vdmVkLCAqaW5mbzEpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8yLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzMobmV3IEMyTnVtYmVyMkluZm8oMykpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8zKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8yLT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgqaW5mbzMsICpyZW1vdmVkKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTXVsdGlwbGVMaW5lYXJNYXBUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJXcml0ZVZpZXc+IHdWaWV3czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJSZWFkVmlldz4gclZpZXdzOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjEzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTAyIEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJEZWJ1Zy5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyUGFyYW1VdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgY29tcG9uZW50cworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyIsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsIC8vIGZvciBDMl9MT0cKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBmcmFtZXdvcmsgdXRpbGl0aWVzCisvLyBUSElTIElTIE9OTFkgRk9SIEZSQU1FV09SSyBVU0UgT05MWQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW50ZXJuYWwtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICBdLAorCisgICAgLy8gVE9ETzogc2VwYXJhdGUgaW50ZXJuYWwgaGVhZGVycyBzbyB0aGV5IGNhbiBiZSBleHBvc2VkIGhlcmUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5OGJmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9yR3JhbGxvYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYWxsb2NhdG9yLzIuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9tYXBwZXIvMi4wL0lNYXBwZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2FnZSBtYXNrIHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggZnJvbSBncmFsbG9jIHRvIENvZGVjIDIuMCB1c2FnZS4KKyAgICAgICAgICovCisgICAgICAgIFBBU1NUSFJPVUdIX1VTQUdFX01BU0sgPQorICAgICAgICAgICAgfihHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSyB8IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKQorICAgIH07CisKKyAgICAvLyB2ZXJpZnkgdGhhdCBwYXNzdGhyb3VnaCBtYXNrIGlzIHdpdGhpbiB0aGUgcGxhdGZvcm0gbWFzaworICAgIHN0YXRpY19hc3NlcnQoKH5DMk1lbW9yeVVzYWdlOjpQTEFURk9STV9NQVNLICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykgPT0gMCwgIiIpOworfQorCitDMk1lbW9yeVVzYWdlIEMyQW5kcm9pZE1lbW9yeVVzYWdlOjpGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiBDMk1lbW9yeVVzYWdlKAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpID8gQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAodXNhZ2UgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VpbnQ2NF90IEMyQW5kcm9pZE1lbW9yeVVzYWdlOjphc0dyYWxsb2NVc2FnZSgpIGNvbnN0IHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuICgoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgPyBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEKSA/IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKGV4cGVjdGVkICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YWxsb2NhdG9yOjpWMl8wOjpJQWxsb2NhdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6QnVmZmVyVXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkJ1ZmZlckRlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpFcnJvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OklNYXBwZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpZQ2JDckxheW91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyB7CisgICAgSU1hcHBlcjo6QnVmZmVyRGVzY3JpcHRvckluZm8gbWFwcGVySW5mbzsKKyAgICB1aW50MzJfdCBzdHJpZGU7Cit9OworCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGMyX3N0YXR1c190IG1hcGVycjJlcnJvcihFcnJvciBtYXBlcnIpIHsKKyAgICBzd2l0Y2ggKG1hcGVycikgeworICAgICAgICBjYXNlIEVycm9yOjpOT05FOiAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIEVycm9yOjpCQURfREVTQ1JJUFRPUjogcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX0JVRkZFUjogICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9WQUxVRTogICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpOT19SRVNPVVJDRVM6ICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgY2FzZSBFcnJvcjo6VU5TVVBQT1JURUQ6ICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3N0YXRpYworYm9vbCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUpIHsKKyAgICAvLyBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb24gb2YgYSBuYXRpdmUgaGFuZGxlCisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIG51bGwgaGFuZGxlIGlzIGNvbnNpZGVyZWQgdmFsaWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChzaXplX3QpaGFuZGxlLT52ZXJzaW9uICE9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA8IDAgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IDAgfHwKKyAgICAgICAgICAgIC8vIGZvciBzYW5pdHkgYXNzdW1lIGhhbmRsZXMgbXVzdCBvY2N1cHkgbGVzcyBtZW1vcnkgdGhhbiBJTlRfTUFYIGJ5dGVzCisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBoYW5kbGUtPm51bUludHMpOworfQorCitjbGFzcyBDMkhhbmRsZUdyYWxsb2MgOiBwdWJsaWMgQzJIYW5kbGUgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRXh0cmFEYXRhIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50MzJfdCB1c2FnZV9sbzsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfaGk7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9sbzsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9oaTsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90OworICAgICAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE5VTV9JTlRTID0gc2l6ZW9mKEV4dHJhRGF0YSkgLyBzaXplb2YoaW50KSwKKyAgICB9OworICAgIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBNQUdJQyA9ICdceGMyZ3JceDAwJzsKKworICAgIHN0YXRpYworICAgIGNvbnN0IEV4dHJhRGF0YSogZ2V0RXh0cmFEYXRhKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkKKyAgICAgICAgICAgICAgICB8fCBoYW5kbGUtPm51bUludHMgPCBOVU1fSU5UUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0cmFEYXRhKj4oCisgICAgICAgICAgICAgICAgJmhhbmRsZS0+ZGF0YVtoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTXSk7CisgICAgfQorCisgICAgc3RhdGljCisgICAgRXh0cmFEYXRhICpnZXRFeHRyYURhdGEoQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHRyYURhdGEgKj4oZ2V0RXh0cmFEYXRhKGNvbnN0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUgKmNvbnN0PihoYW5kbGUpKSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBnZXRJZ2JwRGF0YSh1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICplZCA9IGdldEV4dHJhRGF0YSh0aGlzKTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSBlZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZChlZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZChlZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0gZWQtPmlnYnBfc2xvdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICpjb25zdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIpIHsgLy8gbnVsbCBoYW5kbGUgaXMgYWx3YXlzIHZhbGlkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKG8pOworICAgICAgICAvLyB3ZSBjYW5ub3QgdmFsaWRhdGUgd2lkdGgvaGVpZ2h0L2Zvcm1hdC91c2FnZSB3aXRob3V0IGFjY2Vzc2luZyBncmFsbG9jIGRyaXZlcgorICAgICAgICByZXR1cm4geGQgIT0gbnVsbHB0ciAmJiB4ZC0+bWFnaWMgPT0gTUFHSUM7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIC8vQ0hFQ0soaGFuZGxlICE9IG51bGxwdHIpOworICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBOVU1fSU5UUyAtIGhhbmRsZS0+bnVtRmRzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgeGQgPSB7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVpbnQzMl90KHVzYWdlICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KHVzYWdlID4+IDMyKSwKKyAgICAgICAgICAgIHN0cmlkZSwgZ2VuZXJhdGlvbiwgdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdChpZ2JwX2lkID4+IDMyKSwKKyAgICAgICAgICAgIGlnYnBfc2xvdCwgTUFHSUMKKyAgICAgICAgfTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOworICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNsb25lID0gbmF0aXZlX2hhbmRsZV9jbG9uZShoYW5kbGUpOworICAgICAgICBpZiAoY2xvbmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgQzJIYW5kbGVHcmFsbG9jICpyZXMgPSBXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICBjbG9uZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworICAgICAgICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNsb25lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgQzJIYW5kbGVHcmFsbG9jKiBJbXBvcnQoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAorICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICp3aWR0aCA9IHhkLT53aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IHhkLT5oZWlnaHQ7CisgICAgICAgICpmb3JtYXQgPSB4ZC0+Zm9ybWF0OworICAgICAgICAqdXNhZ2UgPSB4ZC0+dXNhZ2VfbG8gfCAodWludDY0X3QoeGQtPnVzYWdlX2hpKSA8PCAzMik7CisgICAgICAgICpzdHJpZGUgPSB4ZC0+c3RyaWRlOworICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHhkLT5pZ2JwX2lkX2xvIHwgKHVpbnQ2NF90KHhkLT5pZ2JwX2lkX2hpKSA8PCAzMik7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZUdyYWxsb2MgKj4oaGFuZGxlKTsKKyAgICB9Cit9OworCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUpOworfQorCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6V3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK2NsYXNzIEMyQWxsb2NhdGlvbkdyYWxsb2MgOiBwdWJsaWMgQzJHcmFwaGljQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QzJBbGxvY2F0aW9uR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAoCisgICAgICAgICAgICB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQWxsb2NhdG9ySWQ7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTG9ja2VkSGFuZGxlID8gOiBtSGFuZGxlOyB9CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICAvLyB8aGFuZGxlfCB3aWxsIGJlIG1vdmVkLgorICAgIEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvICZpbmZvLAorICAgICAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyPiAmbWFwcGVyLAorICAgICAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKTsKKyAgICBpbnQgZHVwKCkgY29uc3Q7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gbUluZm87CisgICAgY29uc3Qgc3A8SU1hcHBlcj4gbU1hcHBlcjsKKyAgICBjb25zdCBoaWRsX2hhbmRsZSBtSGlkbEhhbmRsZTsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1IYW5kbGU7CisgICAgYnVmZmVyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptTG9ja2VkSGFuZGxlOworICAgIGJvb2wgbUxvY2tlZDsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtQWxsb2NhdG9ySWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6OkMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gJmluZm8sCisgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcj4gJm1hcHBlciwKKyAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCkKKyAgICA6IEMyR3JhcGhpY0FsbG9jYXRpb24oaW5mby5tYXBwZXJJbmZvLndpZHRoLCBpbmZvLm1hcHBlckluZm8uaGVpZ2h0KSwKKyAgICAgIG1JbmZvKGluZm8pLAorICAgICAgbU1hcHBlcihtYXBwZXIpLAorICAgICAgbUhpZGxIYW5kbGUoc3RkOjptb3ZlKGhpZGxIYW5kbGUpKSwKKyAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgIG1CdWZmZXIobnVsbHB0ciksCisgICAgICBtTG9ja2VkSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUxvY2tlZChmYWxzZSksCisgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpIHsKK30KKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6fkMyQWxsb2NhdGlvbkdyYWxsb2MoKSB7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIGFkZHJlc3NzIGFuZCByZWN0CisgICAgICAgIHVpbnQ4X3QqIGFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXSA9IHt9OworICAgICAgICB1bm1hcChhZGRyLCBDMlJlY3QoKSwgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgIG1NYXBwZXItPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlcikpOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPihtSGFuZGxlKSkpOworICAgIH0KKyAgICBpZiAobUxvY2tlZEhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+KG1Mb2NrZWRIYW5kbGUpKSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjptYXAoCisgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJtYXBwaW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICAvLyBUT0RPCisgICAgKHZvaWQpIGZlbmNlOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGlmIChtQnVmZmVyICYmIG1Mb2NrZWQpIHsKKyAgICAgICAgQUxPR0QoImFscmVhZHkgbWFwcGVkIik7CisgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgfQorICAgIGlmICghbGF5b3V0IHx8ICFhZGRyKSB7CisgICAgICAgIEFMT0dEKCJ3cm9uZyBwYXJhbSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBtTWFwcGVyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUhpZGxIYW5kbGUsIFsmZXJyLCB0aGlzXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IHN0YXRpY19jYXN0PGJ1ZmZlcl9oYW5kbGVfdD4oYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIHJldHVybmVkIG51bGwgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICB1aW50NjRfdCBpZ2JwX2lkID0gMDsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90ID0gMDsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG1IYW5kbGUtPmdldElnYnBEYXRhKCZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIH0KKyAgICAgICAgbUxvY2tlZEhhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8ubWFwcGVySW5mby53aWR0aCwgbUluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mby5tYXBwZXJJbmZvLnVzYWdlLCBtSW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JbmZvLm1hcHBlckluZm8uZm9ybWF0KSB7CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfMTAxMDEwMjogeworICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCisgICAgICAgICAgICAvLyBTdXJmYWNlLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgUkdCQS4gV2UgZG9uJ3Qga25vdyB3aGljaCBjYXNlIGl0IGlzIGhlcmUsIHNvCisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFlVViBmb3Igbm93LgorICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRyZWF0IGFzIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQTsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9BLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCQV84ODg4OgorICAgICAgICAgICAgLy8gVE9ETzogYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQlhfODg4ODogeworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSAodWludDhfdCAqKXBvaW50ZXIgKyAxOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSAodWludDhfdCAqKXBvaW50ZXIgKyAyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9SLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9HLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9CLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpZVjEyOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIFlDYkNyTGF5b3V0IHljYmNyTGF5b3V0OworICAgICAgICAgICAgbU1hcHBlci0+bG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IG1hcExheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2tZQ2JDciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY2I7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueVN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUxvY2tlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6OnVubWFwKAorICAgICAgICB1aW50OF90ICoqYWRkciwgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSB7CisgICAgLy8gVE9ETzogY2hlY2sgYWRkciBhbmQgc2l6ZSwgdXNlIGZlbmNlCisgICAgKHZvaWQpYWRkcjsKKyAgICAodm9pZClyZWN0OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIG1NYXBwZXItPnVubG9jaygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgWyZlcnIsICZmZW5jZV0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZyZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICh2b2lkKSByZWxlYXNlRmVuY2U7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgbUxvY2tlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEMyQWxsb2NhdGlvbkdyYWxsb2M6OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG90aGVyICYmIG90aGVyLT5oYW5kbGUoKSA9PSBoYW5kbGUoKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKTsKKworICAgIGlkX3QgZ2V0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5pZDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0czsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzcDxJQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgYm9vbCBtQnVmZmVyUXVldWU7Cit9OworCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCx1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICh2b2lkKUMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6SW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgIDogbUluaXQoQzJfT0spLCBtQnVmZmVyUXVldWUoYnVmZmVyUXVldWUpIHsKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGFsbG9jYXRvcgorICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfSwgbWF4VXNhZ2UgPSB7IH4odWludDY0X3QpMCwgfih1aW50NjRfdCkwIH07CisgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmdyYWxsb2MiLCBpZCwgQzJBbGxvY2F0b3I6OkdSQVBISUMsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yOjpUcmFpdHM+KHRyYWl0cyk7CisKKyAgICAvLyBncmFsbG9jIGFsbG9jYXRvciBpcyBhIHNpbmdsZXRvbiwgc28gYWxsIG9iamVjdHMgc2hhcmUgYSBnbG9iYWwgc2VydmljZQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCk7CisgICAgbU1hcHBlciA9IElNYXBwZXI6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUFsbG9jYXRvciA9PSBudWxscHRyIHx8IG1NYXBwZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigiYWxsb2NhdGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAxdSwgIC8vIGxheWVyQ291bnQKKyAgICAgICAgICAgIChQaXhlbEZvcm1hdClmb3JtYXQsCisgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgIH0sCisgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBCdWZmZXJEZXNjcmlwdG9yIGRlc2M7CisgICAgbU1hcHBlci0+Y3JlYXRlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGluZm8ubWFwcGVySW5mbywgWyZlcnIsICZkZXNjXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBJQWxsb2NhdG9yIHNoYXJlcyBJTWFwcGVyIGVycm9yIGNvZGVzLgorICAgIGhpZGxfaGFuZGxlIGJ1ZmZlcjsKKyAgICBtQWxsb2NhdG9yLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAxdSwKKyAgICAgICAgICAgIFsmZXJyLCAmYnVmZmVyLCAmaW5mb10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZzdHJpZGUsIGF1dG8gJmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJzWzBdOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICBpbmZvLCBtTWFwcGVyLCBidWZmZXIsCisgICAgICAgICAgICBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWluZm8ubWFwcGVySW5mby5mb3JtYXQsIGluZm8ubWFwcGVySW5mby51c2FnZSwgaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1CdWZmZXJRdWV1ZSA/IH4wIDogMCksCisgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvOworICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBpZ2JwX2lkOworICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmdyYWxsb2NIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OkltcG9ydCgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQzMl90ICopJmluZm8ubWFwcGVySW5mby5mb3JtYXQsICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsICZpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgaWYgKGdyYWxsb2NIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGhpZGxfaGFuZGxlIGhpZGxIYW5kbGU7CisgICAgaGlkbEhhbmRsZS5zZXRUbyhDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShncmFsbG9jSGFuZGxlKSwgdHJ1ZSk7CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYyhpbmZvLCBtTWFwcGVyLCBoaWRsSGFuZGxlLCBncmFsbG9jSGFuZGxlLCBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICAgICAgOiBtSW1wbChuZXcgSW1wbChpZCwgYnVmZmVyUXVldWUpKSB7fQorCitDMkFsbG9jYXRvckdyYWxsb2M6On5DMkFsbG9jYXRvckdyYWxsb2MoKSB7IGRlbGV0ZSBtSW1wbDsgfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvckdyYWxsb2M6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SWQoKTsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0TmFtZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUcmFpdHMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIxNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvcklvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxpb24vaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworfQorCisvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50TG8oc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gaW50KHMgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRIaShzaXplX3QgcykgeworICAgIC8vIGNhc3QgdG8gdWludDY0X3QgYXMgc2l6ZV90IG1heSBiZSAzMiBiaXRzIHdpZGUKKyAgICByZXR1cm4gaW50KCh1aW50NjRfdChzKSA+PiAzMikgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBzaXplX3QgaW50czJzaXplKGludCBpbnRMbywgaW50IGludEhpKSB7CisgICAgLy8gY29udmVydCBpbiAyIHN0YWdlcyB0byA2NCBiaXRzIGFzIGludEhpIG1heSBiZSBuZWdhdGl2ZQorICAgIHJldHVybiBzaXplX3QodW5zaWduZWQoaW50TG8pKSB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChpbnRIaSkpIDw8IDMyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIElPTiBoYW5kbGUKKyAqCisgKiBUaGVyZSBjYW4gYmUgb25seSBhIHNvbGUgaW9uIGNsaWVudCBwZXIgcHJvY2VzcywgdGhpcyBpcyBjYXB0dXJlZCBpbiB0aGUgaW9uIGZkIHRoYXQgaXMgcGFzc2VkCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGlzIHNob3VsZCBiZSBtYW5hZ2VkIGJ5IHRoZSBpb24gYnVmZmVyIGFsbG9jYXRvci9tYXBwZXIuCisgKgorICogaW9uIHVzZXMgaW9uX3VzZXJfaGFuZGxlX3QgZm9yIGJ1ZmZlcnMuIFdlIGRvbid0IHN0b3JlIHRoaXMgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgYXMKKyAqIGl0IHJlcXVpcmVzIGFuIGlvbl9mcmVlIHRvIGRlY3JlZi4gSW5zdGVhZCwgd2Ugc2hhcmUgdGhlIGJ1ZmZlciB0byBnZXQgYW4gZmQgdGhhdCBhbHNvIGhvbGRzCisgKiBhIHJlZmNvdW50LgorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEgZ2xvYmFsIG11dGV4LgorICovCisKK3N0cnVjdCBDMkhhbmRsZUlvbiA6IHB1YmxpYyBDMkhhbmRsZSB7CisgICAgLy8gaW9uIGhhbmRsZSBvd25zIGlvbkZkKCEpIGFuZCBidWZmZXJGZAorICAgIEMySGFuZGxlSW9uKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKKyAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtQnVmZmVyOyAvLyBzaGFyZWQgaW9uIGJ1ZmZlcgorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgLy8gbG93IDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbVNpemVIaTsgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVJb24gX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvL2NvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVJb246OmNIZWFkZXIgPSB7CisgICAgQzJIYW5kbGVJb246OnZlcnNpb24sCisgICAgQzJIYW5kbGVJb246Om51bUZkcywKKyAgICBDMkhhbmRsZUlvbjo6bnVtSW50cywKKyAgICB7fQorfTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworICAgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KG8pOworICAgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworLy8gVE9ETzogaXMgdGhlIGR1cCBvZiBhbiBpb24gZmQgaWRlbnRpY2FsIHRvIGlvbl9zaGFyZT8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRpb25Jb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbklvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBjbGFzcyBJbXBsVjI7CisgICAgSW1wbCAqbUltcGw7CisKKyAgICAvLyBUT0RPOiB3ZSBjb3VsZCBtYWtlIHRoaXMgZW5jYXBzdWxhdGUgc2hhcmVkX3B0ciBhbmQgY29waWFibGUKKyAgICBDMl9ET19OT1RfQ09QWShDMkFsbG9jYXRpb25Jb24pOworfTsKKworY2xhc3MgQzJBbGxvY2F0aW9uSW9uOjpJbXBsIHsKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gYnVmZmVyICAgIGlvbiBidWZmZXIgdXNlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGwoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBtSW9uRmQoaW9uRmQpLAorICAgICAgICAgIG1IYW5kbGUoYnVmZmVyRmQsIGNhcGFjaXR5KSwKKyAgICAgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW5pdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oZXJyKSksCisgICAgICAgICAgbU1hcEZkKC0xKSB7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgLy8gY2xvc2UgaW9uRmQgbm93IG9uIGVycm9yCisgICAgICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICAgICAgICAgIG1Jb25GZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyRmQgPCAwKTsKKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlciA8IDApOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBpbXBvcnRpbmcgYSBzaGFyZWQgYnVmZmVyIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGltcG9ydCBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGFsbG9jYXRpbmcgYW4gaW9uIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBzaXplICAgICAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGFsaWduICAgICBkZXNpcmVkIGFsaWdubWVudCBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGhlYXBNYXNrICBtYXNrIG9mIGhlYXBzIGNvbnNpZGVyZWQKKyAgICAgKiBccGFyYW0gZmxhZ3MgICAgIGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqQWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IG1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgICAgICh2b2lkKWZlbmNlOyAvLyBUT0RPOiB3YWl0IGZvciBmZW5jZQorICAgICAgICAqYWRkciA9IG51bGxwdHI7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtdWx0aXBsZSBtYXAiKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHRlY2huaWNhbGx5IHdlIHNob3VsZCByZXR1cm4gRFVQTElDQVRFIGhlcmUsIGJ1dCBvdXIgYmxvY2sgdmlld3MgZG9uJ3QKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVubWFwLCBzbyB3ZSBlbmQgdXAgcmVtYXBwaW5nIGFuIGlvbiBidWZmZXIgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByb3QgPSBQUk9UX05PTkU7CisgICAgICAgIGludCBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfUkVBRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlcyA9IG9mZnNldCAlIFBBR0VfU0laRTsKKyAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IG9mZnNldCAtIGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3QgbWFwU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgTWFwcGluZyBtYXAgPSB7IG51bGxwdHIsIGFsaWdubWVudEJ5dGVzLCBtYXBTaXplIH07CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbWFwSW50ZXJuYWwobWFwU2l6ZSwgbWFwT2Zmc2V0LCBhbGlnbm1lbnRCeXRlcywgcHJvdCwgZmxhZ3MsICYobWFwLmFkZHIpLCBhZGRyKTsKKyAgICAgICAgaWYgKG1hcC5hZGRyKSB7CisgICAgICAgICAgICBtTWFwcGluZ3MucHVzaF9iYWNrKG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgaWYgKG1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgidHJpZWQgdG8gdW5tYXAgdW5tYXBwZWQgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1NYXBwaW5ncy5iZWdpbigpOyBpdCAhPSBtTWFwcGluZ3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChhZGRyICE9ICh1aW50OF90ICopaXQtPmFkZHIgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArIGl0LT5hbGlnbm1lbnRCeXRlcyAhPSBpdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVyciA9IG11bm1hcChpdC0+YWRkciwgaXQtPnNpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOyAvLyBub3QgdXNpbmcgZmVuY2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCltTWFwcGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSB1bm1hcHBlZDogJWQiLCBtSGFuZGxlLmJ1ZmZlckZkKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCJ1bm1hcCBmYWlsZWQgdG8gZmluZCBzcGVjaWZpZWQgbWFwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpIHsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nICZtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICAodm9pZCltdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcEZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1NYXBGZCk7CisgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAodm9pZClpb25fZnJlZShtSW9uRmQsIG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtSGFuZGxlOworICAgIH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcEludGVybmFsKHNpemVfdCBtYXBTaXplLCBzaXplX3QgbWFwT2Zmc2V0LCBzaXplX3QgYWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICBpbnQgcHJvdCwgaW50IGZsYWdzLCB2b2lkKiogYmFzZSwgdm9pZCoqIGFkZHIpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgIGlmIChtTWFwRmQgPT0gLTEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBpb25fbWFwKG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtYXBPZmZzZXQsICh1bnNpZ25lZCBjaGFyKiopYmFzZSwgJm1NYXBGZCk7CisgICAgICAgICAgICBBTE9HVigiaW9uX21hcChpb25GZCA9ICVkLCBoYW5kbGUgPSAlZCwgc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAib2Zmc2V0ID0gJXp1KSByZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1hcE9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPigtcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYmFzZSA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmICgqYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBtSW9uRmQ7CisgICAgQzJIYW5kbGVJb24gbUhhbmRsZTsKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1JZDsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbU1hcEZkOyAvLyBvbmx5IG9uZSBmb3Igbm93CisgICAgc3RydWN0IE1hcHBpbmcgeworICAgICAgICB2b2lkICphZGRyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBzaXplOworICAgIH07CisgICAgc3RkOjpsaXN0PE1hcHBpbmc+IG1NYXBwaW5nczsKK307CisKK2NsYXNzIEMyQWxsb2NhdGlvbklvbjo6SW1wbFYyIDogcHVibGljIEMyQWxsb2NhdGlvbklvbjo6SW1wbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBmb3IgcGxhdGZvcm1zIHdpdGggbmV3IChpb25fNC4xMi5oKSBhcGkKKyAgICAgKgorICAgICAqIFxub3RlIFdlIGFsd2F5cyBjcmVhdGUgYW4gaW9uIGFsbG9jYXRpb24sIGV2ZW4gaWYgdGhlIGFsbG9jYXRpb24gb3IgaW1wb3J0IGZhaWxzCisgICAgICogc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGUgZXJyb3IuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJubyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24gb3IgaW1wb3J0CisgICAgICovCisgICAgSW1wbFYyKGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkLCBpbnQgZXJyKQorICAgICAgICA6IEltcGwoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgLTEgLypidWZmZXIqLywgaWQsIGVycikgeworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGxWMigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhbmRsZS5idWZmZXJGZCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwSW50ZXJuYWwoc2l6ZV90IG1hcFNpemUsIHNpemVfdCBtYXBPZmZzZXQsIHNpemVfdCBhbGlnbm1lbnRCeXRlcywKKyAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MsIHZvaWQqKiBiYXNlLCB2b2lkKiogYWRkcikgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgKmJhc2UgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCk7CisgICAgICAgIEFMT0dWKCJtbWFwVjIoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgaWYgKCpiYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKK307CisKK0MyQWxsb2NhdGlvbklvbjo6SW1wbCAqQzJBbGxvY2F0aW9uSW9uOjpJbXBsOjpJbXBvcnQoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoaW9uX2lzX2xlZ2FjeShpb25GZCkpIHsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIHJldCA9IGlvbl9pbXBvcnQoaW9uRmQsIGJ1ZmZlckZkLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitDMkFsbG9jYXRpb25Jb246OkltcGwgKkMyQWxsb2NhdGlvbklvbjo6SW1wbDo6QWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgaW50IGJ1ZmZlckZkID0gLTE7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgc2l6ZV90IGFsaWduZWRTaXplID0gYWxpZ24gPT0gMCA/IHNpemUgOiAoc2l6ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisgICAgaW50IHJldDsKKworICAgIGlmIChpb25faXNfbGVnYWN5KGlvbkZkKSkgeworICAgICAgICByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvYyhpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyID0gJWQiLAorICAgICAgICAgICAgICBpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBnZXQgYnVmZmVyIGZkIGZvciBuYXRpdmUgaGFuZGxlIGNvbnN0cnVjdG9yCisgICAgICAgICAgICByZXQgPSBpb25fc2hhcmUoaW9uRmQsIGJ1ZmZlciwgJmJ1ZmZlckZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlvbl9mcmVlKGlvbkZkLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gaW9uX2FsbG9jX2ZkKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlckZkKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvY19mZChpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyRmQgPSAlZCIsCisgICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXJGZCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246Om1hcCgKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXAob2Zmc2V0LCBzaXplLCB1c2FnZSwgZmVuY2UsIGFkZHIpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgIHJldHVybiBtSW1wbC0+dW5tYXAoYWRkciwgc2l6ZSwgZmVuY2UpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRpb25Jb246OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworYm9vbCBDMkFsbG9jYXRpb25Jb246OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIW90aGVyIHx8IG90aGVyLT5nZXRBbGxvY2F0b3JJZCgpICE9IGdldEFsbG9jYXRvcklkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBnZXQgdXNlciBoYW5kbGUgdG8gY29tcGFyZSBvYmplY3RzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gb3RoZXJBc0lvbiA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkFsbG9jYXRpb25Jb24+KG90aGVyKTsKKyAgICByZXR1cm4gbUltcGwtPmlvbkhhbmRsZSgpID09IG90aGVyQXNJb24tPm1JbXBsLT5pb25IYW5kbGUoKTsKK30KKworY29uc3QgQzJIYW5kbGUgKkMyQWxsb2NhdGlvbklvbjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6fkMyQWxsb2NhdGlvbklvbigpIHsKKyAgICBkZWxldGUgbUltcGw7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpBbGxvYyhpb25GZCwgc2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgaWQpKSB7IH0KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6SW1wb3J0KGlvbkZkLCBzaXplLCBzaGFyZUZkLCBpZCkpIHsgfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQzJBbGxvY2F0b3JJb246OkMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpCisgICAgOiBtSW5pdChDMl9PSyksCisgICAgICBtSW9uRmQoaW9uX29wZW4oKSkgeworICAgIGlmIChtSW9uRmQgPCAwKSB7CisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgY2FzZSBFTk9FTlQ6ICAgIG1Jbml0ID0gQzJfT01JVFRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICBtSW5pdCA9IGMyX21hcF9lcnJubzxFQUNDRVM+KGVycm5vKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH07CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4VXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmlvbiIsIGlkLCBMSU5FQVIsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgICAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgICAgIG1CbG9ja1NpemUgPSA6OmdldHBhZ2VzaXplKCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcklvbjo6fkMyQWxsb2NhdG9ySW9uKCkgeworICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICBpb25fY2xvc2UobUlvbkZkKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9ySW9uOjpnZXRJZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+aWQ7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9ySW9uOjpnZXROYW1lKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JJb246OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKwordm9pZCBDMkFsbG9jYXRvcklvbjo6c2V0VXNhZ2VNYXBwZXIoCisgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBtVXNhZ2VNYXBwZXJDYWNoZS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlckxydS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlciA9IG1hcHBlcjsKKyAgICBUcmFpdHMgdHJhaXRzID0geworICAgICAgICBtVHJhaXRzLT5uYW1lLCBtVHJhaXRzLT5pZCwgTElORUFSLAorICAgICAgICBDMk1lbW9yeVVzYWdlKG1pblVzYWdlKSwgQzJNZW1vcnlVc2FnZShtYXhVc2FnZSkKKyAgICB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICBtQmxvY2tTaXplID0gYmxvY2tTaXplOworfQorCitzdGQ6OnNpemVfdCBDMkFsbG9jYXRvcklvbjo6TWFwcGVyS2V5SGFzaDo6b3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJmspIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHVpbnQ2NF90Pnt9KGsuZmlyc3QpIF4gc3RkOjpoYXNoPHNpemVfdD57fShrLnNlY29uZCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjptYXBVc2FnZSgKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgIC8vIGFsaWduIGNhcGFjaXR5CisgICAgY2FwYWNpdHkgPSAoY2FwYWNpdHkgKyBtQmxvY2tTaXplIC0gMSkgJiB+KG1CbG9ja1NpemUgLSAxKTsKKyAgICBNYXBwZXJLZXkga2V5ID0gc3RkOjptYWtlX3BhaXIodXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICBhdXRvIGVudHJ5ID0gbVVzYWdlTWFwcGVyQ2FjaGUuZmluZChrZXkpOworICAgIGlmIChlbnRyeSA9PSBtVXNhZ2VNYXBwZXJDYWNoZS5lbmQoKSkgeworICAgICAgICBpZiAobVVzYWdlTWFwcGVyKSB7CisgICAgICAgICAgICByZXMgPSBtVXNhZ2VNYXBwZXIodXNhZ2UsIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphbGlnbiA9IDA7IC8vIFRPRE8gbWFrZSB0aGlzIDEKKyAgICAgICAgICAgICpoZWFwTWFzayA9IH4wOyAvLyBkZWZhdWx0IG1hc2sKKyAgICAgICAgICAgICpmbGFncyA9IDA7IC8vIGRlZmF1bHQgZmxhZ3MKKyAgICAgICAgICAgIHJlcyA9IEMyX05PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIHVzYWdlIHRvIGNhY2hlCisgICAgICAgIE1hcHBlclZhbHVlIHZhbHVlID0gc3RkOjptYWtlX3R1cGxlKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcyk7CisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5lbXBsYWNlX2Zyb250KGtleSwgdmFsdWUpOworICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGtleSwgbVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCkpKTsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlckNhY2hlLnNpemUoKSA+IFVTQUdFX0xSVV9DQUNIRV9TSVpFKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgTFJVIGVudHJ5CisgICAgICAgICAgICBNYXBwZXJLZXkgbHJ1S2V5ID0gbVVzYWdlTWFwcGVyTHJ1LmZyb250KCkuZmlyc3Q7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lcmFzZShscnVLZXkpOworICAgICAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb3ZlIGVudHJ5IHRvIE1SVQorICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuc3BsaWNlKG1Vc2FnZU1hcHBlckxydS5iZWdpbigpLCBtVXNhZ2VNYXBwZXJMcnUsIGVudHJ5LT5zZWNvbmQpOworICAgICAgICBjb25zdCBNYXBwZXJWYWx1ZSAmdmFsdWUgPSBlbnRyeS0+c2Vjb25kLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dGllKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcykgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246Om5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIGlmIChhbGxvY2F0aW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc2l6ZV90IGFsaWduID0gMDsKKyAgICB1bnNpZ25lZCBoZWFwTWFzayA9IH4wOworICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBtYXBVc2FnZSh1c2FnZSwgY2FwYWNpdHksICZhbGlnbiwgJmhlYXBNYXNrLCAmZmxhZ3MpOworICAgIGlmIChyZXQgJiYgcmV0ICE9IEMyX05PX0lOSVQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgY2FwYWNpdHksIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIG1UcmFpdHMtPmlkKTsKKyAgICByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGlmICghQzJIYW5kbGVJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRPRE86IGdldCBjYXBhY2l0eSBhbmQgdmFsaWRhdGUgaXQKKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqaCA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4oaGFuZGxlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgaC0+c2l6ZSgpLCBoLT5idWZmZXJGZCgpLCBtVHJhaXRzLT5pZCk7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUlvbjo6aXNWYWxpZChvKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjUzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApAQCAtMCwwICsxLDEzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorCituYW1lc3BhY2UgeworCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRvcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpJTlZBTElEX0NPTk5FQ1RJT05JRDsKKworLy8gVGhpcyBhbm9ueW1vdXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBoZWxwZXIgY2xhc3NlcyB0aGF0IGFsbG93IG91ciBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUKKy8vIGJsb2NrL2J1ZmZlciBvYmplY3RzLgorLy8KKy8vIEluaGVyaXQgZnJvbSB0aGUgcGFyZW50LCBzaGFyZSB3aXRoIHRoZSBmcmllbmQuCitjbGFzcyBSZWFkVmlld0J1ZGR5IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIHVzaW5nIEMyUmVhZFZpZXc6OkMyUmVhZFZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdExpbmVhckJsb2NrOworfTsKKworY2xhc3MgV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJXcml0ZVZpZXcgeworICAgIHVzaW5nIEMyV3JpdGVWaWV3OjpDMldyaXRlVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJDb25zdExpbmVhckJsb2NrOjpDMkNvbnN0TGluZWFyQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJMaW5lYXJCbG9jazo6QzJMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sOworfTsKKworY2xhc3MgQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljVmlldyB7CisgICAgdXNpbmcgQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQ29uc3RHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkNvbnN0R3JhcGhpY0Jsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY0Jsb2NrQnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDsKK307CisKK2NsYXNzIEJ1ZmZlckRhdGFCdWRkeSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworICAgIHVzaW5nIEMyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQnVmZmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAxRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCAxRCBibG9jayBhbmQgdmlldyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciB0aGUgdW5kZXJseWluZyAxRCBhbGxvY2F0aW9uIGFuZCB0aGUgcmFuZ2Ugb2YgdGhlCisgKiBhbGxvdGVkIHBvcnRpb24gdG8gdGhpcyBibG9jay4gVGhlcmUgaXMgYWxzbyBhIHBsYWNlaG9sZGVyIGZvciBhIGJsb2NrcG9vbCBkYXRhLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMURJbXBsIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoYWxsb2MuZ2V0KCksIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmb3RoZXIsIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJm90aGVyLCBvZmZzZXQsIHNpemUpLAorICAgICAgICAgIG1BbGxvY2F0aW9uKG90aGVyLm1BbGxvY2F0aW9uKSwKKyAgICAgICAgICBtUG9vbERhdGEob3RoZXIubVBvb2xEYXRhKSB7IH0KKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgKgorICogcmFuZ2UgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLgorICovCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMURJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmYmxvY2ssIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChibG9jaywgb2Zmc2V0LCBzaXplKSwgbURhdGEoZGF0YSksIG1FcnJvcihDMl9PSykgeyB9CisKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChudWxscHRyKSwgbURhdGEobnVsbHB0ciksIG1FcnJvcihlcnJvcikgeworICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEoKSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgYzJfc3RhdHVzX3QgbUVycm9yOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazFEOjpJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJCbG9jazFESW1wbDo6X0MyQmxvY2sxREltcGw7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazFEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK307CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2sxRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfTsKKworQzJCbG9jazFEOjpDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICAvLyBhbHdheXMgY2xhbXAgc3VicmFuZ2UgdG8gcGFyZW50IChpbXBsKSByYW5nZSBmb3Igc2FmZXR5CisgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChpbXBsLmdldCgpLCByYW5nZS5vZmZzZXQoKSwgcmFuZ2Uuc2l6ZSgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIFJlYWQgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiAod2hpY2ggaXMgcGFydCBvZiB0aGUgYWxsb3R0ZWQKKyAqIHJhbmdlKS4gcmFuZ2Ugb2YgVmlldyBpcyAwIHRvIGNhcGFjaXR5KCkgKG5vdCByZXByZXNlbnRlZCBhcyBhbiBhY3R1YWwgcmFuZ2UpLiBUaGlzIG1hcHMgdG8gYQorICogc3VicmFuZ2Ugb2YgSW1wbCByYW5nZSBzdGFydGluZyBhdCBtSW1wbC0+b2Zmc2V0KCkgKyBfbU9mZnNldC4KKyAqLworY2xhc3MgQzJSZWFkVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2sxREltcGw6Ol9DMk1hcHBlZEJsb2NrMURJbXBsOworfTsKKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoQzJMaW5lYXJDYXBhY2l0eShpbXBsLT5zaXplKCkpLnJhbmdlKG9mZnNldCwgc2l6ZSkuc2l6ZSgpKSwKKyAgICAgIG1JbXBsKGltcGwpLAorICAgICAgbU9mZnNldChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5vZmZzZXQoKSkgeyB9CisKK0MyUmVhZFZpZXc6OkMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCgwdSksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSwgbU9mZnNldCgwdSkgeworICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKK30KKworY29uc3QgdWludDhfdCAqQzJSZWFkVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVycm9yKCkgPyBudWxscHRyIDogbUltcGwtPmRhdGEoKSArIG1PZmZzZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyUmVhZFZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKTsKK30KKworQzJSZWFkVmlldyBDMlJlYWRWaWV3OjpzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gQzJSZWFkVmlldyhtSW1wbCwgbU9mZnNldCArIHN1YlJhbmdlLm9mZnNldCgpLCBzdWJSYW5nZS5zaXplKCkpOworfQorCisvKioKKyAqIFdyaXRlIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisvLyBVR0xZOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCByZXF1aXJlcyBhIGJvbmEtZmlkZSBvYmplY3QgZm9yIGNhcGFjaXR5IHRvIHByZXZlbnQgc3Bvb2ZpbmcsIHNvCisvLyB0aGlzIGlzIHdoYXQgd2UgaGF2ZSB0byBkby4KKy8vIFRPRE86IHVzZSBjaGlsZFJhbmdlCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KHN0ZDo6bWFrZV91bmlxdWU8QzJMaW5lYXJDYXBhY2l0eT4oaW1wbC0+c2l6ZSgpKS5nZXQoKSksIG1JbXBsKGltcGwpIHsgfQorCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KG51bGxwdHIpLCBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGVycm9yKSkge30KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmJhc2UoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK3VpbnQ4X3QgKkMyV3JpdGVWaWV3OjpkYXRhKCkgeyByZXR1cm4gbUltcGwtPmRhdGEoKSArIG9mZnNldCgpOyB9CisKK2MyX3N0YXR1c190IEMyV3JpdGVWaWV3OjplcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT5lcnJvcigpOyB9CisKKy8qKgorICogQ29uc3QgbGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazFEKGltcGwsIHJhbmdlKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IEMyQ29uc3RMaW5lYXJCbG9jazo6bWFwKCkgY29uc3QgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIDAgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxSZWFkVmlld0J1ZGR5OjpJbXBsPigKKyAgICAgICAgICAgICAgICBuZXcgUmVhZFZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgb2Zmc2V0KCksIGxlbiksCisgICAgICAgICAgICAgICAgW2Jhc2UsIGxlbl0oUmVhZFZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFJlYWRWaWV3QnVkZHkocnZpLCAwLCBsZW4pKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShlcnJvcikpOworICAgIH0KK30KKworQzJDb25zdExpbmVhckJsb2NrIEMyQ29uc3RMaW5lYXJCbG9jazo6c3ViQmxvY2soc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXykgY29uc3QgeworICAgIEMyTGluZWFyUmFuZ2Ugc3ViUmFuZ2UoKm1JbXBsLCBvZmZzZXRfLCBzaXplXyk7CisgICAgcmV0dXJuIEMyQ29uc3RMaW5lYXJCbG9jayhtSW1wbCwgc3ViUmFuZ2UsIG1GZW5jZSk7Cit9CisKKy8qKgorICogTGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IEMyTGluZWFyQmxvY2s6Om1hcCgpIHsKKyAgICB2b2lkICpiYXNlID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsZW4gPSBzaXplKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICBvZmZzZXQoKSwgbGVuLCB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdyaXRlVmlld0J1ZGR5OjpJbXBsPiBydmkgPSBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBXcml0ZVZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgMCwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShXcml0ZVZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBXcml0ZVZpZXdCdWRkeShydmkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJMaW5lYXJCbG9jazo6c2hhcmUoc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXywgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdExpbmVhckJsb2NrQnVkZHkobUltcGwsIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldF8sIHNpemVfKSwgZmVuY2UpOworfQorCitDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsgfQorCitjMl9zdGF0dXNfdCBDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKGNhcGFjaXR5LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0cnVjdCBDMl9ISURFIEMyUG9vbGVkQmxvY2tQb29sRGF0YSA6IF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUE9PTDsKKyAgICB9CisKKyAgICB2b2lkIGdldEJ1ZmZlclBvb2xEYXRhKHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmRhdGEpIGNvbnN0IHsKKyAgICAgICAgKmRhdGEgPSBtRGF0YTsKKyAgICB9CisKKyAgICBDMlBvb2xlZEJsb2NrUG9vbERhdGEoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgOiBtRGF0YShkYXRhKSB7fQorCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGUge30KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IG1EYXRhOworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUE9PTCkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5nZXRCdWZmZXJQb29sRGF0YShidWZmZXJQb29sRGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazFEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMUQ6OkltcGw+KGFsbG9jLCBkYXRhLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4obmV3IEMyTGluZWFyQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazFEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBwYXJhbXM/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisvKioKKyAqIFdyYXBwZWQgQzJBbGxvY2F0b3Igd2hpY2ggaXMgaW5qZWN0ZWQgdG8gYnVmZmVyIHBvb2wgb24gYmVoYWxmIG9mCisgKiBDMkJsb2NrUG9vbC4KKyAqLworY2xhc3MgX0MyQnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICBfQzJCdWZmZXJQb29sQWxsb2NhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworICAgIH5fQzJCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgICAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBmb3IgY29kZWMyIGNvbXBvbmVudCAoQzJCbG9ja1Bvb2wpLgorICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgbGluZWFyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgICAgIHNpemUgb2YgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gdXNhZ2UgICAgICAgICBtZW1vcnkgdXNhZ2UgcGF0dGVybiBmb3IgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRMaW5lYXJQYXJhbXModWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGdyYXBoaWMgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgICAgICAgd2lkdGggb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCAgICAgICAgaGVpZ2h0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBmb3JtYXQgICAgICAgIGNvbG9yIGZvcm1hdCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlciBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldEdyYXBoaWNQYXJhbXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkxpbmVhckFsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yTGluZWFyQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkdyYXBoaWNBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckdyYXBoaWNBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEludFBhcmFtcyA9IDU7IC8vIGxhcmdlIGVub3VnaCBudW1iZXI7CisKKyAgICBlbnVtIEFsbG9jVHlwZSA6IHVpbnQ4X3QgeworICAgICAgICBBTExPQ19OT05FID0gMCwKKworICAgICAgICBBTExPQ19MSU5FQVIsCisgICAgICAgIEFMTE9DX0dSQVBISUMsCisgICAgfTsKKworICAgIHVuaW9uIEFsbG9jUGFyYW1zIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEFsbG9jVHlwZSBhbGxvY1R5cGU7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlOworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zW2tNYXhJbnRQYXJhbXNdOworICAgICAgICB9IGRhdGE7CisgICAgICAgIHVpbnQ4X3QgYXJyYXlbMF07CisKKyAgICAgICAgQWxsb2NQYXJhbXMoKSA6IGRhdGF7QUxMT0NfTk9ORSwgezAsIDB9LCB7MH19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0xJTkVBUiwgdXNhZ2UsIHtbMF0gPSBjYXBhY2l0eX19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKAorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0KQorICAgICAgICAgICAgICAgIDogZGF0YXtBTExPQ19HUkFQSElDLCB1c2FnZSwge3dpZHRoLCBoZWlnaHQsIGZvcm1hdH19IHt9CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK3N0cnVjdCBMaW5lYXJBbGxvY2F0aW9uRHRvciB7CisgICAgTGluZWFyQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitzdHJ1Y3QgR3JhcGhpY0FsbG9jYXRpb25EdG9yIHsKKyAgICBHcmFwaGljQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK1Jlc3VsdFN0YXR1cyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZwYXJhbXMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zOworICAgIG1lbWNweSgmYzJQYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgc3dpdGNoKGMyUGFyYW1zLmRhdGEuYWxsb2NUeXBlKSB7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xJTkVBUjogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYzJMaW5lYXI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyTGluZWFyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJMaW5lYXIpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyTGluZWFyLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgTGluZWFyQWxsb2NhdGlvbkR0b3IoYzJMaW5lYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IChzaXplX3QpYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFMTE9DX0dSQVBISUM6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBjMkdyYXBoaWM7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1syXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyR3JhcGhpYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyR3JhcGhpYykgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJHcmFwaGljLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGMyR3JhcGhpYykpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0gKiBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZuZXdQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmb2xkUGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgbmV3QWxsb2M7CisgICAgQWxsb2NQYXJhbXMgb2xkQWxsb2M7CisgICAgbWVtY3B5KCZuZXdBbGxvYywgbmV3UGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgbmV3UGFyYW1zLnNpemUoKSkpOworICAgIG1lbWNweSgmb2xkQWxsb2MsIG9sZFBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG9sZFBhcmFtcy5zaXplKCkpKTsKKworICAgIC8vIFRPRE86IHN1cHBvcnQgbm90IGV4YWN0IG1hdGNoaW5nLiBlLmcpIG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkKKyAgICBpZiAobmV3QWxsb2MuZGF0YS5hbGxvY1R5cGUgPT0gb2xkQWxsb2MuZGF0YS5hbGxvY1R5cGUgJiYKKyAgICAgICAgICAgIG5ld0FsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQgPT0gb2xkQWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhJbnRQYXJhbXM7ICsraSkgeworICAgICAgICAgICAgaWYgKG5ld0FsbG9jLmRhdGEucGFyYW1zW2ldICE9IG9sZEFsbG9jLmRhdGEucGFyYW1zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0TGluZWFyUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCBjYXBhY2l0eSk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0R3JhcGhpY1BhcmFtcygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2w6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICAgICAgOiBtSW5pdChDMl9PSyksCisgICAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlcihDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgICAgICAgICAgbUFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+KGFsbG9jYXRvcikpIHsKKyAgICAgICAgaWYgKG1BbGxvY2F0b3IgJiYgbUJ1ZmZlclBvb2xNYW5hZ2VyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlclBvb2xNYW5hZ2VyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKSA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Jbml0ID0gQzJfTk9fSU5JVDsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldExpbmVhclBhcmFtcyhjYXBhY2l0eSwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSwgMCwgY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRHcmFwaGljUGFyYW1zKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvYywgcG9vbERhdGEsIEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtSW5pdCAhPSBDMl9PSyA/IElOVkFMSURfQ09OTkVDVElPTklEIDogbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbUJ1ZmZlclBvb2xNYW5hZ2VyOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOyAvLyBsb2NhbGx5CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitDMlBvb2xlZEJsb2NrUG9vbDo6QzJQb29sZWRCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyUG9vbGVkQmxvY2tQb29sOjp+QzJQb29sZWRCbG9ja1Bvb2woKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitpbnQ2NF90IEMyUG9vbGVkQmxvY2tQb29sOjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gMkQgQkxPQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCAyRCBibG9ja3MgYW5kIHZpZXdzLgorICoKKyAqIEZvciBibG9ja3MnIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgYWxsb3R0ZWQgY3JvcCwgZXZlbiBpZiBpdCBpcyBhIHN1YiBibG9jay4KKyAqCisgKiBGb3Igdmlld3MnIEltcGwncyBjcm9wIGlzIHRoZSBtYXBwZWQgcG9ydGlvbiAtIHdoaWNoIGZvciBub3cgaXMgYWx3YXlzIHRoZQorICogYWxsb3R0ZWQgY3JvcC4KKyAqLworY2xhc3MgQzJfSElERSBfQzJCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIG9yIHBhcnQgb2YgdGhlIGFsbG90dGVkIGNyb3Agb2YgdGhlIGFsbG9jYXRpb24uCisgICAgICovCisgICAgX0MyQmxvY2syREltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoYWxsb2MuZ2V0KCksIGFsbG90dGVkQ3JvcCksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9jazJESW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBnZXRBbGxvY2F0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwaW5nQmxvY2syREltcGwKKyAgICA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsPiB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyQmxvY2syREltcGw6Ol9DMkJsb2NrMkRJbXBsOworCisgICAgdmlydHVhbCB+X0MyTWFwcGluZ0Jsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgICAgICovCisgICAgc3RydWN0IE1hcHBlZCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIF9DMk1hcHBpbmdCbG9jazJESW1wbDsKKworICAgICAgICBNYXBwZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiAmaW1wbCwgYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UgX191bnVzZWQpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpLCBtV3JpdGFibGUod3JpdGFibGUpIHsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBjb25zdCBDMlJlY3QgY3JvcCA9IG1JbXBsLT5jcm9wKCk7CisgICAgICAgICAgICAvLyBncmFsbG9jIHJlcXVpcmVzIG1hcHBpbmcgdGhlIHdob2xlIHJlZ2lvbiBvZiBpbnRlcmVzdCBhcyB3ZSBjYW5ub3QKKyAgICAgICAgICAgIC8vIG1hcCBtdWx0aXBsZSByZWdpb25zCisgICAgICAgICAgICBtRXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICAgICAgICAgIGNyb3AsCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIHdyaXRhYmxlID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIDogMCB9LAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAmbUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgbURhdGEpOworICAgICAgICAgICAgaWYgKG1FcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHBsYW5lIGxheW91dCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgZGF0YSBwb2ludGVycyB0byB0aGUgY3JvcCByZWdpb24ncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICAgICAgICAgICAgLy8gZmFpbCBpZiBpdCBpcyBub3Qgb24gYSBzdWJzYW1wbGluZyBib3VuZGFyeQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHBsYW5lSXggPSAwOyBwbGFuZUl4IDwgbUxheW91dC5udW1QbGFuZXM7ICsrcGxhbmVJeCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByb3dTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcC5sZWZ0ICUgY29sU2FtcGxpbmcgfHwgY3JvcC5yaWdodCgpICUgY29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjcm9wLnRvcCAlIHJvd1NhbXBsaW5nIHx8IGNyb3AuYm90dG9tKCkgJSByb3dTYW1wbGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGNhbGN1bGF0ZSBkYXRhIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBjcm9wLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUVycm9yID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXREYXRhW3BsYW5lSXhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhW3BsYW5lSXhdICsgKHNzaXplX3QpY3JvcC5sZWZ0ICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sSW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNzaXplX3QpY3JvcC50b3AgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwbGljaXQgTWFwcGVkKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICAgICAgOiBtSW1wbChudWxscHRyKSwgbVdyaXRhYmxlKGZhbHNlKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICB+TWFwcGVkKCkgeworICAgICAgICAgICAgaWYgKG1EYXRhWzBdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgbUltcGwtPmNyb3AoKSwgbnVsbHB0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogcmV0dXJucyBtYXBwaW5nIHN0YXR1cyAqLworICAgICAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1FcnJvcjsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIGRhdGEgcG9pbnRlciAqLworICAgICAgICB1aW50OF90ICpjb25zdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXREYXRhOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIHBsYW5lIGxheW91dCAqLworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdCB7IHJldHVybiBtTGF5b3V0OyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgbWFwcGluZyBpcyB3cml0YWJsZSAqLworICAgICAgICBib29sIHdyaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gbVdyaXRhYmxlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+IG1JbXBsOworICAgICAgICBib29sIG1Xcml0YWJsZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgbUVycm9yOworICAgICAgICB1aW50OF90ICptRGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICB1aW50OF90ICptT2Zmc2V0RGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICBDMlBsYW5hckxheW91dCBtTGF5b3V0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoZSBhbGxvdHRlZCByZWdpb24uCisgICAgICoKKyAgICAgKiBJZiBhbHJlYWR5IG1hcHBlZCBhbmQgaXQgaXMgY3VycmVudGx5IGluIHVzZSwgcmV0dXJucyB0aGUgZXhpc3RpbmcgbWFwcGluZy4KKyAgICAgKiBJZiBmZW5jZSBpcyBwcm92aWRlZCwgYW4gYWNxdWlyZSBmZW5jZSBpcyBzdG9yZWQgdGhlcmUuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gbWFwKGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gZXhpc3RpbmcgPSBtTWFwcGVkLmxvY2soKTsKKyAgICAgICAgaWYgKCFleGlzdGluZykgeworICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKHNoYXJlZF9mcm9tX3RoaXMoKSwgd3JpdGFibGUsIGZlbmNlKSk7CisgICAgICAgICAgICBtTWFwcGVkID0gZXhpc3Rpbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBtYXBwZWQgdGhlIHJlZ2lvbiByZWFkLW9ubHksIHdlIGNhbm5vdCByZW1hcCBpdCByZWFkLXdyaXRlCisgICAgICAgICAgICBpZiAod3JpdGFibGUgJiYgIWV4aXN0aW5nLT53cml0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKEMyX0NBTk5PVF9ETykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPE1hcHBlZD4gbU1hcHBlZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwZWRCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgX0MyTWFwcGVkQmxvY2syREltcGwoY29uc3QgX0MyQmxvY2syREltcGwgJmltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKQorICAgICAgICA6IF9DMkJsb2NrMkRJbXBsKGltcGwpLCBtTWFwcGluZyhtYXBwaW5nKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+X0MyTWFwcGVkQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcoKSBjb25zdCB7IHJldHVybiBtTWFwcGluZzsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbU1hcHBpbmc7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMkQ6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwaW5nQmxvY2syREltcGw6Ol9DMk1hcHBpbmdCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworY29uc3QgQzJIYW5kbGUgKkMyQmxvY2syRDo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2syRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfQorCitDMkJsb2NrMkQ6OkMyQmxvY2syRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICAvLyBhbHdheXMgY2xhbXAgc3Vic2VjdGlvbiB0byBwYXJlbnQgKGltcGwpIGNyb3AgZm9yIHNhZmV0eQorICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworLyoqCisgKiBHcmFwaGljIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKgorICogcmFuZ2Ugb2YgSW1wbCBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24uIHJhbmdlIG9mIFZpZXcgaXMgdGhlIGN1cnJlbnQKKyAqIGNyb3AuCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMkRJbXBsOjpfQzJNYXBwZWRCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworY29uc3QgdWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKwordWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKworY29uc3QgQzJQbGFuYXJMYXlvdXQgQzJHcmFwaGljVmlldzo6bGF5b3V0KCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5sYXlvdXQoKTsKK30KKworY29uc3QgQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK0MyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitjMl9zdGF0dXNfdCBDMkdyYXBoaWNWaWV3OjplcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZXJyb3IoKTsKK30KKworLyoqCisgKiBDb25zdCBncmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSkKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IEMyQ29uc3RHcmFwaGljQmxvY2s6Om1hcCgpIGNvbnN0IHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAoZmFsc2UgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyQ29uc3RHcmFwaGljQmxvY2s6OnN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkNvbnN0R3JhcGhpY0Jsb2NrKG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkuaW50ZXJzZWN0KHJlY3QpKSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBHcmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkdyYXBoaWNCbG9jazo6QzJHcmFwaGljQmxvY2soCisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbikgeyB9CisKK0MyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBDMkdyYXBoaWNCbG9jazo6bWFwKCkgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcCh0cnVlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJHcmFwaGljQmxvY2s6OnNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKSwgZmVuY2UpOworfQorCisvKioKKyAqIEJhc2ljIGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb25zLgorICovCitDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworYzJfc3RhdHVzX3QgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3ApIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazJEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMkQ6OkltcGw+KGFsbG9jLCBkYXRhLCBhbGxvdHRlZENyb3ApOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KG5ldyBDMkdyYXBoaWNCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazJEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHNldHVwPworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCVUZGRVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworY2xhc3MgQzJCdWZmZXJEYXRhOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBMSU5FQVIgOiBMSU5FQVJfQ0hVTktTKSwKKyAgICAgICAgICBtTGluZWFyQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBHUkFQSElDIDogR1JBUEhJQ19DSFVOS1MpLAorICAgICAgICAgIG1HcmFwaGljQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZsaW5lYXJCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtTGluZWFyQmxvY2tzOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmdyYXBoaWNCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtR3JhcGhpY0Jsb2NrczsgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBtVHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IG1MaW5lYXJCbG9ja3M7CisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gbUdyYXBoaWNCbG9ja3M7Cit9OworCitDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KKworQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJCdWZmZXJEYXRhOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPnR5cGUoKTsgfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IEMyQnVmZmVyRGF0YTo6bGluZWFyQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bGluZWFyQmxvY2tzKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdyYXBoaWNCbG9ja3MoKTsKK30KKworY2xhc3MgQzJCdWZmZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVRoaXModGhpeiksIG1EYXRhKGJsb2Nrcykge30KKworICAgIH5JbXBsKCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtTm90aWZ5KSB7CisgICAgICAgICAgICBwYWlyLmZpcnN0KG1UaGlzLCBwYWlyLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgJmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorCisgICAgYzJfc3RhdHVzX3QgcmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbU5vdGlmeS5iZWdpbigpLCBtTm90aWZ5LmVuZCgpLAorICAgICAgICAgICAgICAgIFtvbkRlc3Ryb3lOb3RpZnksIGFyZ10gKGNvbnN0IGF1dG8gJnBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3QgPT0gb25EZXN0cm95Tm90aWZ5ICYmIHBhaXIuc2Vjb25kID09IGFyZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Ob3RpZnkuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmeS5lbXBsYWNlX2JhY2sob25EZXN0cm95Tm90aWZ5LCBhcmcpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgPT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gcmVzdWx0KG1JbmZvcy5zaXplKCkpOworICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBtSW5mb3MuYmVnaW4oKSwgbUluZm9zLmVuZCgpLCByZXN1bHQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBbXSAoY29uc3QgYXV0byAmZWxlbSkgeyByZXR1cm4gZWxlbS5zZWNvbmQ7IH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICAgICAgLy8gVG8gInVwZGF0ZSIgeW91IG5lZWQgdG8gZXJhc2UgdGhlIGV4aXN0aW5nIG9uZSBpZiBhbnksIGFuZCB0aGVuIGluc2VydC4KKyAgICAgICAgKHZvaWQpIG1JbmZvcy5lcmFzZShpbmZvLT5jb3JlSW5kZXgoKSk7CisgICAgICAgICh2b2lkKSBtSW5mb3MuaW5zZXJ0KHsgaW5mby0+Y29yZUluZGV4KCksIGluZm8gfSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluZm9zLmNvdW50KGluZGV4LmNvcmVJbmRleCgpKSA+IDA7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxjb25zdCBDMkluZm8+KGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgeworICAgICAgICBhdXRvIGl0ID0gbUluZm9zLmZpbmQoaW5kZXguY29yZUluZGV4KCkpOworICAgICAgICBpZiAoaXQgPT0gbUluZm9zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZXQgPSBpdC0+c2Vjb25kOworICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCdWZmZXIgKiBjb25zdCBtVGhpczsKKyAgICBCdWZmZXJEYXRhQnVkZHkgbURhdGE7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPj4gbUluZm9zOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8T25EZXN0cm95Tm90aWZ5LCB2b2lkICo+PiBtTm90aWZ5OworfTsKKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbXBsKG5ldyBJbXBsKHRoaXMsIGJsb2NrcykpIHt9CisKK0MyQnVmZmVyOjpDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworY29uc3QgQzJCdWZmZXJEYXRhIEMyQnVmZmVyOjpkYXRhKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmRhdGEoKTsgfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjp1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgIHJldHVybiBtSW1wbC0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBDMkJ1ZmZlcjo6aW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZm8oKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEluZm8oaW5mbyk7Cit9CisKK2Jvb2wgQzJCdWZmZXI6Omhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFzSW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IEMyQnVmZmVyOjpnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEluZm8oaW5kZXgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBDMkJ1ZmZlcjo6cmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZW1vdmVJbmZvKGluZGV4KTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jaykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KG5ldyBDMkJ1ZmZlcih7IGJsb2NrIH0pKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ODBhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb25maWciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8qKgorICogRGVmaW5lIGFuZCBpbml0aWFsaXplIGdsb2JhbCBjb25maWcgZmllbGQgZGVzY3JpcHRvcnMgaW4gdGhpcyBjcHAgZmlsZQorICovCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OnByb2ZpbGVfdCwgKHsKKyAgICAgICAgeyAidW51c2VkIiwgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEIH0sCisgICAgICAgIHsgImFhYy1sYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQyB9LAorICAgICAgICB7ICJhYWMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOIH0sCisgICAgICAgIHsgImFhYy1zc3IiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSIH0sCisgICAgICAgIHsgImFhYy1sdHAiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQIH0sCisgICAgICAgIHsgImFhYy1oZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSB9LAorICAgICAgICB7ICJhYWMtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAiYWFjLWVyLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDIH0sCisgICAgICAgIHsgImFhYy1lci1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQgfSwKKyAgICAgICAgeyAiYWFjLWhlLXBzIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTIH0sCisgICAgICAgIHsgImFhYy1lbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEIH0sCisgICAgICAgIHsgImFhYy14aGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFIH0sCisgICAgICAgIHsgIm1wMnYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOIH0sCisgICAgICAgIHsgIm1wMnYtc25yLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXAydi1zcGF0aWFsbHktc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0ggfSwKKyAgICAgICAgeyAibXAydi00MjIiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWXzQyMiB9LAorICAgICAgICB7ICJtcDJ2LW11bHRpdmlldyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTVVMVElWSUVXIH0sCisgICAgICAgIHsgImgyNjMtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImgyNjMtaDMyMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSDMyMCB9LAorICAgICAgICB7ICJoMjYzLXYxYmMiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MiIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjIgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjMgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWNvbXByZXNzaW9uIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJuZXQiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTkVUIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJsYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWxhdGVuY3kiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXA0di1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiB9LAorICAgICAgICB7ICJtcDR2LW5iaXQiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX05CSVQgfSwKKyAgICAgICAgeyAibXA0di1hcnRzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BUlRTIH0sCisgICAgICAgIHsgIm1wNHYtY29yZS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWFjZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQUNFIH0sCisgICAgICAgIHsgIm1wNHYtYWR2YW5jZWQtY29yZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZS1zdHVkaW8iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDR2LWZncyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfRkdTIH0sCisgICAgICAgIHsgImF2Yy1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiB9LAorICAgICAgICB7ICJhdmMtZXh0ZW5kZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRVhURU5ERUQgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMiB9LAorICAgICAgICB7ICJhdmMtaGlnaC00NDQtcHJlZGljdGl2ZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtY2F2bGMtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtaGlnaC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfSElHSCB9LAorICAgICAgICB7ICJhdmMtc3RlcmVvLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU1RFUkVPX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW1mYy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01GQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWVuaGFuY2VkLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImhldmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbW9ubyIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OTyB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vLTE2IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PXzE2IH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4taW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtbXVsdGl2aWV3LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01VTFRJVklFV19NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy0zZC1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ18zRF9NQUlOIH0sCisgICAgICAgIHsgInZwOS0wIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0zIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMgfSwKKyAgICAgICAgeyAiYXYxLTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCB9LAorICAgICAgICB7ICJhdjEtMSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xIH0sCisgICAgICAgIHsgImF2MS0yIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQ29uZmlnOjpsZXZlbF90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEIH0sCisgICAgICAgIHsgIm1wMnYtbG93IiwgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XIH0sCisgICAgICAgIHsgIm1wMnYtbWFpbiIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1oaWdoLTE0NDAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAgfSwKKyAgICAgICAgeyAibXAydi1oaWdoIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2hwIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSFAgfSwKKyAgICAgICAgeyAiaDI2My0xMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwIH0sCisgICAgICAgIHsgImgyNjMtMjAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCB9LAorICAgICAgICB7ICJoMjYzLTMwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAgfSwKKyAgICAgICAgeyAiaDI2My00MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwIH0sCisgICAgICAgIHsgImgyNjMtNDUiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSB9LAorICAgICAgICB7ICJoMjYzLTUwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAgfSwKKyAgICAgICAgeyAiaDI2My02MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwIH0sCisgICAgICAgIHsgImgyNjMtNzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M183MCB9LAorICAgICAgICB7ICJtcDR2LTAiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wIH0sCisgICAgICAgIHsgIm1wNHYtMGIiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiB9LAorICAgICAgICB7ICJtcDR2LTEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xIH0sCisgICAgICAgIHsgIm1wNHYtMiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIgfSwKKyAgICAgICAgeyAibXA0di0zIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMyB9LAorICAgICAgICB7ICJtcDR2LTNiIiwgQzJDb25maWc6OkxFVkVMX01QNFZfM0IgfSwKKyAgICAgICAgeyAibXA0di00IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNCB9LAorICAgICAgICB7ICJtcDR2LTRhIiwgQzJDb25maWc6OkxFVkVMX01QNFZfNEEgfSwKKyAgICAgICAgeyAibXA0di01IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNSB9LAorICAgICAgICB7ICJtcDR2LTYiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82IH0sCisgICAgICAgIHsgImF2Yy0xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xIH0sCisgICAgICAgIHsgImF2Yy0xYiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIgfSwKKyAgICAgICAgeyAiYXZjLTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xIH0sCisgICAgICAgIHsgImF2Yy0xLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiB9LAorICAgICAgICB7ICJhdmMtMS4zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMgfSwKKyAgICAgICAgeyAiYXZjLTIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzIgfSwKKyAgICAgICAgeyAiYXZjLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xIH0sCisgICAgICAgIHsgImF2Yy0yLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiB9LAorICAgICAgICB7ICJhdmMtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMyB9LAorICAgICAgICB7ICJhdmMtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEgfSwKKyAgICAgICAgeyAiYXZjLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yIH0sCisgICAgICAgIHsgImF2Yy00IiwgQzJDb25maWc6OkxFVkVMX0FWQ180IH0sCisgICAgICAgIHsgImF2Yy00LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSB9LAorICAgICAgICB7ICJhdmMtNC4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIgfSwKKyAgICAgICAgeyAiYXZjLTUiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzUgfSwKKyAgICAgICAgeyAiYXZjLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xIH0sCisgICAgICAgIHsgImF2Yy01LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiB9LAorICAgICAgICB7ICJhdmMtNiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNiB9LAorICAgICAgICB7ICJhdmMtNi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ182XzEgfSwKKyAgICAgICAgeyAiYXZjLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMyIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMyB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMy4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81IH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNS4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi02LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yIH0sCisgICAgICAgIHsgInZwOS0xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0xLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMiB9LAorICAgICAgICB7ICJ2cDktMi4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzMgfSwKKyAgICAgICAgeyAidnA5LTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xIH0sCisgICAgICAgIHsgInZwOS00IiwgQzJDb25maWc6OkxFVkVMX1ZQOV80IH0sCisgICAgICAgIHsgInZwOS00LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSB9LAorICAgICAgICB7ICJ2cDktNSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSB9LAorICAgICAgICB7ICJ2cDktNS4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEgfSwKKyAgICAgICAgeyAidnA5LTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8yIH0sCisgICAgICAgIHsgInZwOS02IiwgQzJDb25maWc6OkxFVkVMX1ZQOV82IH0sCisgICAgICAgIHsgInZwOS02LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSB9LAorICAgICAgICB7ICJ2cDktNi4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV82XzIgfSwKKyAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzIgfSwKKyAgICAgICAgeyAiYXYxLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xIH0sCisgICAgICAgIHsgImF2MS0yLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiB9LAorICAgICAgICB7ICJhdjEtMi4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzMgfSwKKyAgICAgICAgeyAiYXYxLTMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzMgfSwKKyAgICAgICAgeyAiYXYxLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xIH0sCisgICAgICAgIHsgImF2MS0zLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiB9LAorICAgICAgICB7ICJhdjEtMy4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzMgfSwKKyAgICAgICAgeyAiYXYxLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzQgfSwKKyAgICAgICAgeyAiYXYxLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8xIH0sCisgICAgICAgIHsgImF2MS00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMiB9LAorICAgICAgICB7ICJhdjEtNC4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzMgfSwKKyAgICAgICAgeyAiYXYxLTUiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzUgfSwKKyAgICAgICAgeyAiYXYxLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8xIH0sCisgICAgICAgIHsgImF2MS01LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiB9LAorICAgICAgICB7ICJhdjEtNS4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzMgfSwKKyAgICAgICAgeyAiYXYxLTYiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzYgfSwKKyAgICAgICAgeyAiYXYxLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8xIH0sCisgICAgICAgIHsgImF2MS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMiB9LAorICAgICAgICB7ICJhdjEtNi4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzMgfSwKKyAgICAgICAgeyAiYXYxLTciLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzcgfSwKKyAgICAgICAgeyAiYXYxLTcuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xIH0sCisgICAgICAgIHsgImF2MS03LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMiB9LAorICAgICAgICB7ICJhdjEtNy4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzMgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQnVmZmVyRGF0YTo6dHlwZV90LCAoeworICAgICAgICB7ICJpbnZhbGlkIiwgICAgICAgIEMyQnVmZmVyRGF0YTo6SU5WQUxJRCB9LAorICAgICAgICB7ICJsaW5lYXIiLCAgICAgICAgIEMyQnVmZmVyRGF0YTo6TElORUFSIH0sCisgICAgICAgIHsgImxpbmVhci1jaHVua3MiLCAgQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTIH0sCisgICAgICAgIHsgImdyYXBoaWMiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpHUkFQSElDIH0sCisgICAgICAgIHsgImdyYXBoaWMtY2h1bmtzIiwgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUyB9LAorfSkpCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMzBlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgiCisKKy8qIHN0YXRpYyAqLyBhbmRyb2lkOjpNdXRleCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNNdXRleDsKKy8qIHN0YXRpYyAqLyBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitjb25zdGV4cHIgY29uc3QgY2hhciBrU3RvcmVQbHVnaW5QYXRoW10gPSAibGliYzJwbHVnaW5fc3RvcmUuc28iOworCit9ICAvLyB1bm5hbWVkCisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpIHsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNyZWF0ZUJsb2NrUG9vbCA9IChDcmVhdGVCbG9ja1Bvb2xGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVCbG9ja1Bvb2wiKTsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUJsb2NrUG9vbCAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9CisgICAgbUNyZWF0ZUFsbG9jYXRvciA9IChDcmVhdGVBbGxvY2F0b3JGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVBbGxvY2F0b3IiKTsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUFsbG9jYXRvciAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9Cit9CisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6fkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpIHsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQmxvY2tQb29sIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPDo6QzJCbG9ja1Bvb2w+IHB0cihtQ3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBibG9ja1Bvb2xJZCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVCbG9ja1Bvb2wgYnkgYWxsb2NhdG9yIGlkOiAldSIsIGFsbG9jYXRvcklkKTsKKyAgICByZXR1cm4gQzJfQkFEX0lOREVYOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUFsbG9jYXRvcigKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSB7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUFsbG9jYXRvciBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KG1DcmVhdGVBbGxvY2F0b3IoYWxsb2NhdG9ySWQsICZyZXMpKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQWxsb2NhdG9yIGJ5IGlkOiAldSwgcmVzOiAlZCIsIGFsbG9jYXRvcklkLCByZXMpOworICAgICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gc3RhdGljCitjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGtTdG9yZVBsdWdpblBhdGgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NTg0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCkBAIC0wLDAgKzEsOTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMlN0b3JlIgorI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgaW4gdGhpcyBwcm9jZXNzIHRvIGFjY2VzcyBpdHMgaW50ZXJmYWNlLgorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBUaGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIHByb3ZpZGVzIGJhc2ljIGFsbG9jYXRvci10eXBlcyBmb3IgdGhlIGZyYW1ld29yayBiYXNlZCBvbiBpb24gYW5kCisgKiBncmFsbG9jLiBBbGxvY2F0b3JzIGFyZSBub3QgbWVhbnQgdG8gYmUgdXBkYXRhYmxlLgorICoKKyAqIFx0b2RvIFByb3ZpZGUgYWxsb2NhdG9yIGJhc2VkIG9uIGFzaG1lbQorICogXHRvZG8gTW92ZSBpb24gYWxsb2NhdGlvbiBpbnRvIGl0cyBISURMIG9yIHByb3ZpZGUgc29tZSBtYXBwaW5nIGZyb20gbWVtb3J5IHVzYWdlIHRvIGlvbiBmbGFncworICogXHRvZG8gTWFrZSB0aGlzIGFsbG9jYXRvciBzdG9yZSBleHRlbmRhYmxlCisgKi8KK2NsYXNzIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwgOiBwdWJsaWMgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PiBsaXN0QWxsb2NhdG9yc19uYigpCisgICAgICAgICAgICBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+KCk7IC8vLyBcdG9kbworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJhbmRyb2lkLmFsbG9jYXRvci1zdG9yZSI7CisgICAgfQorCisgICAgdm9pZCBzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCisgICAgfkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGlvbiBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoSW9uQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGJ1ZmZlcnF1ZXVlIHN1cHBvcnRpbmcgZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKworICAgIC8vLyBjb21wb25lbnQgc3RvcmUgdG8gdXNlCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlU2V0TG9jazsgLy8gcHJvdGVjdHMgdGhlIGVudGlyZSB1cGRhdGluZyBfbUNvbXBvbmVudFN0b3JlIGFuZCBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jazsgLy8gbXVzdCBwcm90ZWN0IG9ubHkgcmVhZC93cml0ZSBvZiBfbUNvbXBvbmVudFN0b3JlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IF9tQ29tcG9uZW50U3RvcmU7Cit9OworCitDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSB7CisgICAgYWxsb2NhdG9yLT5yZXNldCgpOworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgaW1wbGVtZW50IGEgZ2VuZXJpYyByZWdpc3RyeSBmb3IgYWxsLCBhbmQgdXNlIHRoYXQ/CisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVBbGxvY2F0b3IoaWQsIGFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Om11dGV4IGdJb25BbGxvY2F0b3JNdXRleDsKK3N0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3JJb24+IGdJb25BbGxvY2F0b3I7CisKK3ZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICBDMkFsbG9jYXRvcklvbjo6VXNhZ2VNYXBwZXJGbiBtYXBwZXI7CisgICAgdWludDY0X3QgbWluVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IG1heFVzYWdlID0gQzJNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKS5leHBlY3RlZDsKKyAgICBzaXplX3QgYmxvY2tTaXplID0gZ2V0cGFnZXNpemUoKTsKKworICAgIC8vIHF1ZXJ5IG1pbiBhbmQgbWF4IHVzYWdlIGFzIHdlbGwgYXMgYmxvY2sgc2l6ZSB2aWEgc3VwcG9ydGVkIHZhbHVlcworICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLnVzYWdlKSksCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLmNhcGFjaXR5KSksCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20ocXVlcnkpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgaWYgKHF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMF0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTICYmICFmc3YudmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5Vc2FnZSA9IGZzdi52YWx1ZXNbMF0udTY0OworICAgICAgICAgICAgICAgIG1heFVzYWdlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogZnN2LnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBtYXhVc2FnZSB8PSB2LnU2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5WzFdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMV0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFICYmIGZzdi5yYW5nZS5zdGVwLnUzMiA+IDApIHsKKyAgICAgICAgICAgICAgICBibG9ja1NpemUgPSBmc3YucmFuZ2Uuc3RlcC51MzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXBwZXIgPSBbc3RvcmVdKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgaWYgKGNhcGFjaXR5ID4gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbyA9IHsgdXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5IH07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7IC8vIFRPRE86IHJlbW92ZQorICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPmNvbmZpZ19zbSh7JnVzYWdlSW5mb30sICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgKmFsaWduID0gdXNhZ2VJbmZvLm1pbkFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAqaGVhcE1hc2sgPSB1c2FnZUluZm8uaGVhcE1hc2s7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gdXNhZ2VJbmZvLmFsbG9jRmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9OworICAgIH0KKworICAgIGFsbG9jYXRvci0+c2V0VXNhZ2VNYXBwZXIobWFwcGVyLCBtaW5Vc2FnZSwgbWF4VXNhZ2UsIGJsb2NrU2l6ZSk7Cit9CisKK30KKwordm9pZCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICAvLyB0ZWNobmljYWxseSB0aGlzIHNldCBsb2NrIGlzIG5vdCBuZWVkZWQsIGJ1dCBpcyBoZXJlIGZvciBzYWZldHkgaW4gY2FzZSB3ZSBhZGQgbW9yZQorICAgIC8vIGdldHRlciBvcmRlcnMKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlU2V0TG9jayk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICBfbUNvbXBvbmVudFN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBzdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoSW9uQWxsb2NhdG9yKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICAgICAgY29tcG9uZW50U3RvcmUgPSBfbUNvbXBvbmVudFN0b3JlOworICAgICAgICB9CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OKTsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBjb21wb25lbnRTdG9yZSk7CisgICAgICAgIGdJb25BbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgdHJ1ZSk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK25hbWVzcGFjZSB7CisgICAgc3RkOjptdXRleCBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlOworCisgICAgc3RkOjptdXRleCBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4OworICAgIHN0ZDo6d2Vha19wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBzdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4oKTsKKyAgICAgICAgc3RvcmUtPnNldENvbXBvbmVudFN0b3JlKEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkpOworICAgICAgICBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICByZXR1cm4gc3RvcmU7Cit9CisKK3ZvaWQgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOyAvLyBkb24ndCBpbnRlcmxldmUgc2V0LXMKKworICAgIC8vIHVwZGF0ZSBwcmVmZXJyZWQgc3RvcmUKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICAgICAgZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID0gY29tcG9uZW50U3RvcmU7CisgICAgfQorCisgICAgLy8gdXBkYXRlIHBsYXRmb3JtIGFsbG9jYXRvcidzIHN0b3JlIGFzIHdlbGwgaWYgaXQgaXMgYWxpdmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gYWxsb2NhdG9yU3RvcmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3JTdG9yZSkgeworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoY29tcG9uZW50U3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICByZXR1cm4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID8gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlIDogR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBfQzJCbG9ja1Bvb2xDYWNoZSB7CitwdWJsaWM6CisgICAgX0MyQmxvY2tQb29sQ2FjaGUoKSA6IG1CbG9ja1Bvb2xTZXFJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQgKyAxKSB7fQorCisgICAgYzJfc3RhdHVzX3QgX2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPQorICAgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgICAgICBzd2l0Y2goYWxsb2NhdG9ySWQpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICAgICAgICAgIHJlcyA9IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9ySWQsIHBvb2xJZCwgJnB0cik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgcmV0dXJuIF9jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgbUJsb2NrUG9vbFNlcUlkKyssIHBvb2wpOworICAgIH0KKworICAgIGJvb2wgZ2V0QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9uZSBpdGVyYXRvciBmb3IgbXVsdGlwbGUgYmxvY2twb29sIHR5cGUgc2NhbGFiaWxpdHkuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICBhdXRvIGl0ID0gbUJsb2NrUG9vbHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgIGlmIChpdCAhPSBtQmxvY2tQb29scy5lbmQoKSkgeworICAgICAgICAgICAgcHRyID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIXB0cikgeworICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50cy5lcmFzZShibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ29tcG9uZW50cy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09IGZvdW5kLT5zZWNvbmQubG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sU2VxSWQ7CisKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gbUNvbXBvbmVudHM7Cit9OworCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPF9DMkJsb2NrUG9vbENhY2hlPiBzQmxvY2tQb29sQ2FjaGUgPQorICAgIHN0ZDo6bWFrZV91bmlxdWU8X0MyQmxvY2tQb29sQ2FjaGU+KCk7CitzdGF0aWMgc3RkOjptdXRleCBzQmxvY2tQb29sQ2FjaGVNdXRleDsKKworfSAvLyBhbnlueW1vdXMgbmFtZXNwYWNlCisKK2MyX3N0YXR1c190IEdldENvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgIGlmIChpZCA+PSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpIHsKKyAgICAgICAgaWYgKHNCbG9ja1Bvb2xDYWNoZS0+Z2V0QmxvY2tQb29sKGlkLCBjb21wb25lbnQsIHBvb2wpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0xpbmVhckJsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNHcmFwaGljQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzLiB0aGlzIGlzIHRlbXBvcmFyeQorICAgIGNhc2UgQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUOgorICAgICAgICByZXMgPSBzQmxvY2tQb29sQ2FjaGUtPl9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgY29tcG9uZW50LCBpZCwgcG9vbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworY2xhc3MgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBzcmMsIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlOworICAgIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworCisgICAgdmlydHVhbCB+QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHByb3ZpZGUgYSB3YXkgdG8gYWRkIHRyYWl0cyB0byBrbm93biBjb21wb25lbnRzIGhlcmUgdG8gYXZvaWQgbG9hZGluZyB0aGUgLnNvLXMKKyAgICAgKiBmb3IgbGlzdENvbXBvbmVudHMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TW9kdWxlIDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENvbXBvbmVudE1vZHVsZT4geworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICBDb21wb25lbnREZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50PigpKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudEludGVyZmFjZT4oKSkgb3ZlcnJpZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFxyZXR1cm5zIHRoZSB0cmFpdHMgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGlzIG1vZHVsZS4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBnZXRUcmFpdHMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBuYW1lW2luXSAgY29tcG9uZW50IG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRNb2R1bGUoKQorICAgICAgICAgICAgOiBtSW5pdChDMl9OT19JTklUKSwKKyAgICAgICAgICAgICAgbUxpYkhhbmRsZShudWxscHRyKSwKKyAgICAgICAgICAgICAgY3JlYXRlRmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgZGVzdHJveUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIG1Db21wb25lbnRGYWN0b3J5KG51bGxwdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBtb2R1bGUgd2l0aCBhIGdpdmVuIGxpYnJhcnkgcGF0aC4gTXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbGliUGF0aFtpbl0gbGlicmFyeSBwYXRoCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBsb2FkIHRoZSBtb2R1bGUgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgaW5pdChzdGQ6OnN0cmluZyBsaWJQYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5Db21wb25lbnRNb2R1bGUoKSBvdmVycmlkZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbUxvY2s7IC8vLzwgbG9jayBwcm90ZWN0aW5nIG1UcmFpdHMKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IG1UcmFpdHM7IC8vLzwgY2FjaGVkIGNvbXBvbmVudCB0cmFpdHMKKworICAgICAgICBjMl9zdGF0dXNfdCBtSW5pdDsgLy8vPCBpbml0aWFsaXphdGlvbiByZXN1bHQKKworICAgICAgICB2b2lkICptTGliSGFuZGxlOyAvLy88IGxvYWRlZCBsaWJyYXJ5IGhhbmRsZQorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jIGNyZWF0ZUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGNyZWF0ZSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYyBkZXN0cm95RmFjdG9yeTsgLy8vPCBsb2FkZWQgZGVzdHJveSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3RvcnkgKm1Db21wb25lbnRGYWN0b3J5OyAvLy88IGxvYWRlZC9jcmVhdGVkIGNvbXBvbmVudCBmYWN0b3J5CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGFibGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIG1ha2UgdGhpcyBhbHNvIHdvcmsgZm9yIGVudW1lcmF0aW9ucworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRMb2FkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGNvbXBvbmVudCBtb2R1bGUgaWYgaXQgaXMgYWxyZWFkeSBjdXJyZW50bHkgbG9hZGVkLCBvcgorICAgICAgICAgKiBhdHRlbXB0cyB0byBsb2FkIGl0IGlmIGl0IGlzIG5vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG1vZHVsZVtvdXRdIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBsb2FkZWQgbW9kdWxlIHNoYWxsIGJlIHN0b3JlZC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBiZSBudWxscHRyIG9uIGVycm9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGZldGNoTW9kdWxlKHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+ICptb2R1bGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IGxvY2FsTW9kdWxlID0gbU1vZHVsZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAobG9jYWxNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KCk7CisgICAgICAgICAgICAgICAgcmVzID0gbG9jYWxNb2R1bGUtPmluaXQobUxpYlBhdGgpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICptb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBsb2FkZXIgZm9yIGEgc3BlY2lmaWMgbGlicmFyeSBwYXRoIChvciBuYW1lKS4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudExvYWRlcihzdGQ6OnN0cmluZyBsaWJQYXRoKQorICAgICAgICAgICAgOiBtTGliUGF0aChsaWJQYXRoKSB7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIG1vZHVsZQorICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudE1vZHVsZT4gbU1vZHVsZTsgLy8vPCB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgbG9hZGVkIG1vZHVsZQorICAgICAgICBzdGQ6OnN0cmluZyBtTGliUGF0aDsgLy8vPCBsaWJyYXJ5IHBhdGgKKyAgICB9OworCisgICAgc3RydWN0IEludGVyZmFjZSA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworCisgICAgICAgIEludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgICAgIHN0cnVjdCBTZXR0ZXIgeworICAgICAgICAgICAgICAgIHN0YXRpYyBDMlIgc2V0SW9uVXNhZ2UoYm9vbCAvKiBtYXlCbG9jayAqLywgQzJQPEMyU3RvcmVJb25Vc2FnZUluZm8+ICZtZSkgeworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5oZWFwTWFzayA9IH4wOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5hbGxvY0ZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubWluQWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlvblVzYWdlSW5mbywgImlvbi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0b3JlSW9uVXNhZ2VJbmZvKCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgdXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgY2FwYWNpdHkpLmluUmFuZ2UoMCwgVUlOVDMyX01BWCwgMTAyNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBoZWFwTWFzaykuYW55KCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBhbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBtaW5BbGlnbm1lbnQpLmVxdWFsVG8oMCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29tcG9uZW50IG1vZHVsZSBmb3IgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kdWxlIHBvaW50ZXIgdG8gYSBzaGFyZWRfcG9pbnRlciB3aGVyZSB0aGUgY29tcG9uZW50IG1vZHVsZSB3aWxsIGJlIHN0b3JlZCBvbgorICAgICAqICAgICAgICAgICAgICAgc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbG9hZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2NhdGUgdGhlIGNvbXBvbmVudCBsb2FkZXIKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgdG8gYmUgbG9hZGVkCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBsb2FkZXIgY291bGQgbm90IGJlIGlkZW50aWZpZWQgZHVlIHRvIHNvbWUgbW9kdWxlcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRlZCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVkIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYmFkIGxpYnJhcnkpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gZmluZCB0aGUgY29tcG9uZW50IGxvYWRlciBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeSBpZGVudGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gbGFjayBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGZpbmRDb21wb25lbnQoQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBlYWNoIGNvbXBvbmVudCBtb2R1bGUgYW5kIGRpc2NvdmVyIGl0cyBjb250ZW50cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIGNvbXBvbmVudCBsaXN0cyBkdXJpbmcgY29uc3RydWN0aW9uCisgICAgYm9vbCBtVmlzaXRlZDsgLy8vPCBjb21wb25lbnQgbW9kdWxlcyB2aXNpdGVkCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIENvbXBvbmVudExvYWRlcj4gbUNvbXBvbmVudHM7IC8vLzwgcGF0aCAtPiBjb21wb25lbnQgbW9kdWxlCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIEMyU3RyaW5nPiBtQ29tcG9uZW50TmFtZVRvUGF0aDsgLy8vPCBuYW1lIC0+IHBhdGgKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IG1Db21wb25lbnRMaXN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIEludGVyZmFjZSBtSW50ZXJmYWNlOworfTsKKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmluaXQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpYlBhdGgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoImxvYWRpbmcgZGxsIik7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gY291bGQgYmUgYWNjZXNzL3N5bWJvbCBvciBzaW1wbHkgbm90IGJlaW5nIHRoZXJlCisgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgZGxvcGVuICVzOiAlcyIsIGxpYlBhdGguY19zdHIoKSwgZGxlcnJvcigpKTsKKyAgICAgICAgbUluaXQgPSBDMl9DT1JSVVBURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JlYXRlRmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQ29kZWMyRmFjdG9yeSIpOworICAgICAgICBkZXN0cm95RmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7CisKKyAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCk7CisgICAgICAgIGlmIChtQ29tcG9uZW50RmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiY291bGQgbm90IGNyZWF0ZSBmYWN0b3J5IGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluaXQgPSBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBjcmVhdGVJbnRlcmZhY2UoMCwgJmludGYpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzKG5ldyAoc3RkOjpub3Rocm93KSBDMkNvbXBvbmVudDo6VHJhaXRzKTsKKyAgICBpZiAodHJhaXRzKSB7CisgICAgICAgIHRyYWl0cy0+bmFtZSA9IGludGYtPmdldE5hbWUoKTsKKworICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQ7CisgICAgICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW47CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHsgJmtpbmQsICZkb21haW4gfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgICAgIGJvb2wgZml4RG9tYWluID0gcmVzICE9IEMyX09LOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPSBraW5kLnZhbHVlOworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBkb21haW4udmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmYWxsLWJhY2sKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlIGZvciBraW5kIGFuZCBkb21haW46ICVkIiwgcmVzKTsKKworICAgICAgICAgICAgdHJhaXRzLT5raW5kID0KKyAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSIDoKKyAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSIDoKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IG1lZGlhVHlwZUluZGV4ID0KKyAgICAgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIDogQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBtZWRpYVR5cGVJbmRleCB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogdW5leHBlY3RlZCB2ZWN0b3Igc2l6ZTogJXp1IiwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyAqbWVkaWFUeXBlQ29uZmlnID0gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICBpZiAobWVkaWFUeXBlQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgbWVkaWEgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHRyYWl0cy0+bWVkaWFUeXBlID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4obWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLCBtZWRpYVR5cGVDb25maWctPmZsZXhDb3VudCgpKSk7CisKKyAgICAgICAgaWYgKGZpeERvbWFpbikgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImltYWdlLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIHByb3Blcmx5IGZyb20gdGhlIHN0b3JlIGR1cmluZyBlbXBsYWNlCisgICAgICAgIHN3aXRjaCAodHJhaXRzLT5kb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOgorICAgICAgICAgICAgdHJhaXRzLT5yYW5rID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdHJhaXRzLT5yYW5rID0gNTEyOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OlBBUkFNX1RZUEUgfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nICphbGlhc2VzU2V0dGluZyA9CisgICAgICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgaWYgKGFsaWFzZXNTZXR0aW5nKSB7CisgICAgICAgICAgICAgICAgLy8gU3BsaXQgYWxpYXNlcyBvbiAnLCcKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGxvb2tzIHNpbXBsZXIgaW4gcGxhaW4gQyBhbmQgZXZlbiBzdGQ6OnN0cmluZyB3b3VsZCBzdGlsbCBtYWtlIGEgY29weS4KKyAgICAgICAgICAgICAgICBjaGFyICphbGlhc2VzID0gOjpzdHJuZHVwKGFsaWFzZXNTZXR0aW5nLT5tLnZhbHVlLCBhbGlhc2VzU2V0dGluZy0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCInJXMnIGhhcyBhbGlhc2VzOiAnJXMnIiwgaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCksIGFsaWFzZXMpOworCisgICAgICAgICAgICAgICAgZm9yIChjaGFyICp0b2ssICpwdHIsICpzdHIgPSBhbGlhc2VzOyAodG9rID0gOjpzdHJ0b2tfcihzdHIsICIsIiwgJnB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICB0cmFpdHMtPmFsaWFzZXMucHVzaF9iYWNrKHRvayk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhZGRpbmcgYWxpYXM6ICclcyciLCB0b2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKGFsaWFzZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1UcmFpdHMgPSB0cmFpdHM7CisKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjp+Q29tcG9uZW50TW9kdWxlKCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAoZGVzdHJveUZhY3RvcnkgJiYgbUNvbXBvbmVudEZhY3RvcnkpIHsKKyAgICAgICAgZGVzdHJveUZhY3RvcnkobUNvbXBvbmVudEZhY3RvcnkpOworICAgIH0KKyAgICBpZiAobUxpYkhhbmRsZSkgeworICAgICAgICBBTE9HVigidW5sb2FkaW5nIGRsbCIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIHsKKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBpZCwgaW50ZXJmYWNlLCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudEludGVyZmFjZSAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgaW50ZXJmYWNlIGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudCopPiBkZWxldGVyKSB7CisgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgaWQsIGNvbXBvbmVudCwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnQgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgY29tcG9uZW50CisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGNvbXBvbmVudCBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmdldFRyYWl0cygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKQorICAgIDogbVZpc2l0ZWQoZmFsc2UpLAorICAgICAgbVJlZmxlY3RvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyUmVmbGVjdG9ySGVscGVyPigpKSwKKyAgICAgIG1JbnRlcmZhY2UobVJlZmxlY3RvcikgeworCisgICAgYXV0byBlbXBsYWNlID0gW3RoaXNdKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICAgICAgbUNvbXBvbmVudHMuZW1wbGFjZShsaWJQYXRoLCBsaWJQYXRoKTsKKyAgICB9OworCisgICAgLy8gVE9ETzogbW92ZSB0aGlzIGFsc28gaW50byBhIC5zbyBzbyBpdCBjYW4gYmUgdXBkYXRlZAorICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FhY2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXYxZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZmxhY2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZ3NtZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaDI2M2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaGV2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wM2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzRkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9vcHVzZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfcmF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA4ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA4ZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA5ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA5ZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfeGFhY2RlYy5zbyIpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSB7CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29uZmlnX3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworfQorCit2b2lkIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6dmlzaXRDb21wb25lbnRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1WaXNpdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvICZwYXRoQW5kTG9hZGVyIDogbUNvbXBvbmVudHMpIHsKKyAgICAgICAgY29uc3QgQzJTdHJpbmcgJnBhdGggPSBwYXRoQW5kTG9hZGVyLmZpcnN0OworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IHBhdGhBbmRMb2FkZXIuc2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIGlmIChsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIG1Db21wb25lbnRMaXN0LnB1c2hfYmFjayh0cmFpdHMpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9QYXRoLmVtcGxhY2UodHJhaXRzLT5uYW1lLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IHRyYWl0cy0+YWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbXBsYWNlKGFsaWFzLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVZpc2l0ZWQgPSB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMoKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICB2aXNpdENvbXBvbmVudHMoKTsKKyAgICByZXR1cm4gbUNvbXBvbmVudExpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICgqbW9kdWxlKS5yZXNldCgpOworICAgIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgYXV0byBwb3MgPSBtQ29tcG9uZW50TmFtZVRvUGF0aC5maW5kKG5hbWUpOworICAgIGlmIChwb3MgIT0gbUNvbXBvbmVudE5hbWVUb1BhdGguZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnRzLmF0KHBvcy0+c2Vjb25kKS5mZXRjaE1vZHVsZShtb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUNvbXBvbmVudCgwLCBjb21wb25lbnQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUludGVyZmFjZSgwLCBpbnRlcmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworfQorCitDMlN0cmluZyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJhbmRyb2lkLmNvbXBvbmVudFN0b3JlLnBsYXRmb3JtIjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZWZsZWN0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmU7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IHBsYXRmb3JtU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU+KCk7CisgICAgICAgIHBsYXRmb3JtU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ5ODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVud3JhcCB0aGUgbmF0aXZlIGhhbmRsZSBmcm9tIGEgQ29kZWMyIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4gVGhpcyBpbmNsdWRlcyBoYW5kbGVzIHJldHVybmVkIGZvciBhCisgKiBncmFwaGljIGJsb2NrIGFsbG9jYXRpb24gaGFuZGxlIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBuYXRpdmUgaGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qKgorICogV3JhcCB0aGUgZ3JhbGxvYyBoYW5kbGUgYW5kIG1ldGFkYXRhIGludG8gQ29kZWMyIGhhbmRsZSByZWNvZ25pemVkIGJ5CisgKiBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIEMySGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCk7CisKKy8qKgorICogXHRvZG8gR2V0IHRoaXMgZnJvbSB0aGUgYnVmZmVyCisgKi8KK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LCB1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCk7CisKK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYyA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUgPSBmYWxzZSk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBJbXBsICptSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjA1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJBbGxvY2F0b3JJb24gOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8vIFVzYWdlIG1hcHBlciBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBhbGxvY2F0b3IKKyAgICAvLyAgICh1c2FnZSwgY2FwYWNpdHkpID0+IChhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvIHJlZHVjZSBjYWNoaW5nCisgICAgLy8gb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIHNpemVfdCosIHVuc2lnbmVkKiwgdW5zaWduZWQqKT4gVXNhZ2VNYXBwZXJGbjsKKworICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBDMkFsbG9jYXRvcklvbihpZF90IGlkKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9ySW9uKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIHVzYWdlIG1hcHBlciBmb3Igc3Vic2VxdWVudCBuZXcgYWxsb2NhdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN1cHBvcnRlZAorICAgICAqIG1pbmltdW0gYW5kIG1heGltdW0gdXNhZ2UgbWFza3MgYW5kIGRlZmF1bHQgYmxvY2stc2l6ZSB0byB1c2UgZm9yIHRoZSBtYXBwZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWFwcGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBtYXAgQ29kZWMgMi4wIGJ1ZmZlciB1c2FnZSB0byBpb24gZmxhZ3MKKyAgICAgKiAgICAgICAgcmVxdWlyZWQgYnkgdGhlIGlvbiBkZXZpY2UKKyAgICAgKiBccGFyYW0gbWluVXNhZ2UgbWluaW11bSBidWZmZXIgdXNhZ2UgcmVxdWlyZWQgZm9yIHN1cHBvcnRlZCBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKiBccGFyYW0gbWF4VXNhZ2UgbWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yIChkZWZhdWx0cyB0byBTV19SRUFECisgICAgICogICAgICAgIHwgU1dfV1JJVEUpCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSBhbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqICAgICAgICBUaGlzIGFsc28gaGVscHMgcmVkdWNlIHRoZSBzaXplIG9mIGNhY2hlIHJlcXVpcmVkIGZvciBjYWNoaW5nIG1hcHBlciByZXN1bHRzLgorICAgICAqICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKAorICAgICAgICAgICAgY29uc3QgVXNhZ2VNYXBwZXJGbiAmbWFwcGVyLCB1aW50NjRfdCBtaW5Vc2FnZSwgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSk7CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncyk7CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbUlvbkZkOworCisgICAgLy8gdGhpcyBsb2NrcyBtVHJhaXRzLCBtQmxvY2tTaXplLCBtVXNhZ2VNYXBwZXIsIG1Vc2FnZU1hcHBlckxydSBhbmQgbVVzYWdlTWFwcGVyQ2FjaGUKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVVzYWdlTWFwcGVyTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIFVzYWdlTWFwcGVyRm4gbVVzYWdlTWFwcGVyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ2NF90LCBzaXplX3Q+IE1hcHBlcktleTsKKyAgICBzdHJ1Y3QgTWFwcGVyS2V5SGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICYpIGNvbnN0OworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnR1cGxlPHNpemVfdCwgdW5zaWduZWQsIHVuc2lnbmVkLCBjMl9zdGF0dXNfdD4gTWFwcGVyVmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8TWFwcGVyS2V5LCBNYXBwZXJWYWx1ZT4gTWFwcGVyS2V5VmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+OjppdGVyYXRvciBNYXBwZXJLZXlWYWx1ZVBvaW50ZXI7CisgICAgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPiBtVXNhZ2VNYXBwZXJMcnU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPE1hcHBlcktleSwgTWFwcGVyS2V5VmFsdWVQb2ludGVyLCBNYXBwZXJLZXlIYXNoPiBtVXNhZ2VNYXBwZXJDYWNoZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MWE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQlFfQlVGRkVSX1BSSVZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfTsKKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpPiBPblJlbmRlckNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogU2V0cyByZW5kZXIgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVuZGVyQ2FsbGJhayBjYWxsYmFjayB0byBjYWxsIGZvciBhbGwgZGVxdWV1ZSBidWZmZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrID0gT25SZW5kZXJDYWxsYmFjaygpKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgYW4gSUdCUCBpbiBvcmRlciB0byBjcmVhdGUgYmxvY2tzLiBBIG5ld2x5IGNyZWF0ZWQgYmxvY2sgaXMKKyAgICAgKiBkZXF1ZXVlZCBmcm9tIHRoZSBjb25maWd1cmVkIElHQlAuIFVuaXF1ZSBJZCBvZiBJR0JQIGFuZCB0aGUgc2xvdCBudW1iZXIgb2YKKyAgICAgKiBibG9ja3MgYXJlIHBhc3NlZCB2aWEgbmF0aXZlX2hhbmRsZS4gTWFuYWdpbmcgSUdCUCBpcyByZXNwb25zaWJpbGl0eSBvZiBjYWxsZXIuCisgICAgICogV2hlbiBJR0JQIGlzIG5vdCBjb25maWd1cmVkLCBibG9jayB3aWxsIGJlIGNyZWF0ZWQgdmlhIGFsbG9jYXRvci4KKyAgICAgKiBTaW5jZSB6ZXJvIGlzIG5vdCB1c2VkIGZvciBVbmlxdWUgSWQgb2YgSUdCUCwgaWYgSUdCUCBpcyBub3QgY29uZmlndXJlZCBvciBwcm9kdWNlcgorICAgICAqIGlzIGNvbmZpZ3VyZWQgYXMgbnVsbHB0ciwgdW5pcXVlIGlkIHdoaWNoIGlzIGJ1bmRsZWQgaW4gbmF0aXZlX2hhbmRsZSBpcyB6ZXJvLgorICAgICAqCisgICAgICogXHBhcmFtIHByb2R1Y2VyICAgICAgdGhlIElHQlAsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmZXRjaCBibG9ja3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKK307CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWY2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorCitjbGFzcyBDMkJhc2ljTGluZWFyQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMkJhc2ljTGluZWFyQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB2aXJ0dWFsIH5DMkJhc2ljTGluZWFyQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19MSU5FQVI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIC8vIFRPRE86IGZldGNoQ2lyY3VsYXJCbG9jaworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK2NsYXNzIEMyQmFzaWNHcmFwaGljQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEJBU0lDX0dSQVBISUM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK2NsYXNzIEMyUG9vbGVkQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBDMlBvb2xlZEJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTG9jYWxJZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29ubmVjdGlvbiBJZCBmb3IgdW5kZXJseWluZyBidWZmZXJwb29sCisgICAgICovCisgICAgaW50NjRfdCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgYWNjZXNzb3Igd2hpY2ggaXMgdXNlZCBieSB1bmRlcmx5aW5nIGJ1ZmZlcnBvb2wuIChJdCBjYW4gYmUKKyAgICAgKiBwYXNzZWQgdG8gcmVjZWl2aW5nIHByb2Nlc3MuKQorICAgICAqCisgICAgICogXHBhcmFtIGFjY2Vzc29yICAgICAgICAgIElBY2Nlc3NvciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXQgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlICAgICAgICAgICAgIElBY2Vzc29yIGlzIHdyaXRlbiBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHVybiBmYWxzZSAgICAgICAgICAgIElBY2Nlc3NvciBpcyBub3Qgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBib29sIGdldEFjY2Vzc29yKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBjb25zdCBsb2NhbF9pZF90IG1Mb2NhbElkOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ4Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ29tcG9uZW50IGZhY3Rvcnkgb2JqZWN0IHRoYXQgZW5hYmxlcyB0byBjcmVhdGUgYSBjb21wb25lbnQgYW5kL29yIGludGVyZmFjZSBmcm9tIGEgZHluYW1pY2FsbHkKKyAqIGxpbmtlZCBsaWJyYXJ5LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBjb21wb25lbnQvaW50ZXJmYWNlcyBhcmUgbWFuYWdlZCBvYmplY3RzLCBidXQgd2UKKyAqIGNhbm5vdCBzYWZlbHkgY3JlYXRlIGEgbWFuYWdlZCBvYmplY3QgYW5kIHBhc3MgaXQgaW4gQy4KKyAqCisgKiBDb21wb25lbnRzL2ludGVyZmFjZXMgdHlwaWNhbGx5IGluaGVyaXQgZnJvbSBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLCBidXQgQyByZXF1aXJlcworICogcGFzc2luZyBzaW1wbGUgcG9pbnRlciwgYW5kIHNoYXJlZF9wdHIgY29uc3RydWN0b3IgbmVlZHMgdG8ga25vdyB0aGUgY2xhc3MgdG8gYmUgY29uc3RydWN0ZWQKKyAqIGRlcml2ZXMgZnJvbSBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAqCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudCopPiBDb21wb25lbnREZWxldGVyOworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnRJbnRlcmZhY2UqKT4gSW50ZXJmYWNlRGVsZXRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgSUQgZm9yIHRoZSBjcmVhdGVkIGNvbXBvbmVudAorICAgICAqIFxwYXJhbSBjb21wb25lbnQgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgorICAgICAqICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBDb21wb25lbnREZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50PigpKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICAgIGNvbXBvbmVudCBpbnRlcmZhY2UgSUQgZm9yIHRoZSBjcmVhdGVkIGludGVyZmFjZQorICAgICAqIFxwYXJhbSBpbnRlcmZhY2Ugc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgorICAgICAqICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIEludGVyZmFjZURlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICAgIHR5cGVkZWYgOjpDMkNvbXBvbmVudEZhY3RvcnkqICgqQ3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpKHZvaWQpOworICAgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYykoOjpDMkNvbXBvbmVudEZhY3RvcnkqKTsKK307CisKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFjZGFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisKKy8vIFRvIGFsbG93IGFyYml0cmFyeSBvcmRlcmluZyBvZiBDMkRlYnVnLmggYW5kIEFQSSBoZWFkZXJzIGFuZCB0byBrZWVwIGRlYnVnIHV0aWxpdGllcyBzZXBhcmF0ZWx5CisvLyBmcm9tIHRoZSBBUEkgZGVmaW5pdGlvbnMsIHdlIHByb3ZpZGUgQVBJIGhlYWRlciBzcGVjaWZpYyBkZWJ1ZyBoZWFkZXJzLgorI2lmZGVmIEMyUEFSQU1fSF8KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTk1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisvLyBzdGFuZGFyZCBFUlJOTyBtYXBwaW5ncwordGVtcGxhdGU8aW50IE4+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGwoKTsKK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDwwPigpICAgICAgIHsgcmV0dXJuIEMyX09LOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUlOVkFMPigpICB7IHJldHVybiBDMl9CQURfVkFMVUU7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFQUNDRVM+KCkgIHsgcmV0dXJuIEMyX1JFRlVTRUQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFUEVSTT4oKSAgIHsgcmV0dXJuIEMyX1JFRlVTRUQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFTk9NRU0+KCkgIHsgcmV0dXJuIEMyX05PX01FTU9SWTsgfQorCisvLyBtYXAgc3RhbmRhcmQgZXJybm8tcyB0byB0aGUgZXF1aXZhbGVudCBjMl9zdGF0dXNfdAordGVtcGxhdGU8aW50Li4uIE4+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw7Cit0ZW1wbGF0ZTxpbnQgRSwgaW50IC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsPEUsIE4uLi4+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFKSB7CisgICAgICAgICAgICByZXR1cm4gX2MyX2Vycm5vMnN0YXR1c19pbXBsIDxFPigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9tYXBfZXJybm9faW1wbDxOLi4uPjo6bWFwKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsPD4geworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBtYXAoaW50IHJlc3VsdCkgeworICAgICAgICByZXR1cm4gcmVzdWx0ID09IDAgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxpbnQuLi4gTj4KK2MyX3N0YXR1c190IGMyX21hcF9lcnJubyhpbnQgcmVzdWx0KSB7CisgICAgcmV0dXJuIF9jMl9tYXBfZXJybm9faW1wbDxOLi4uPjo6bWFwKHJlc3VsdCk7Cit9CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMDY0MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCisKKyNkZWZpbmUgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworLyoqCisgKiBFeHRlcm4gQyBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgKgorICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAqIFxwYXJlbSBibG9ja1Bvb2xJZCB0aGUgSUQgb2YgY3JlYXRlZCBibG9jayBwb29sLgorICoKKyAqIFxyZXR1cm4gcG9pbnRlciBvZiBjcmVhdGVkIEMyQmxvY2tQb29sLCBudWxscHRyIG9uIGVycm9yLgorICovCit0eXBlZGVmIDo6QzJCbG9ja1Bvb2wqICgqQ3JlYXRlQmxvY2tQb29sRnVuYykoOjpDMkFsbG9jYXRvcjo6aWRfdCwgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCk7CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgKgorICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYWxsb2NhdG9yIHRvIGNyZWF0ZS4KKyAqIFxwYXJhbSBzdGF0dXMgICAgICB0aGUgcmV0dXJuZWQgc3RhdHVzIGZyb20gY3JlYXRpbmcgYWxsb2NhdG9yLgorICoKKyAqIFxyZXR1cm4gcG9pbnRlciBvZiBjcmVhdGVkIEMyQWxsb2NhdG9yLCBudWxscHRyIG9uIGVycm9yLgorICovCit0eXBlZGVmIDo6QzJBbGxvY2F0b3IqICgqQ3JlYXRlQWxsb2NhdG9yRnVuYykoOjpDMkFsbG9jYXRvcjo6aWRfdCwgOjpjMl9zdGF0dXNfdCopOworCitjbGFzcyBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgR2V0SW5zdGFuY2UoKTsKKyAgICB+QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBiYWNraW5nIGFsbG9jYXRvciB0eXBlLgorICAgICAqIFxwYXJhbSBibG9ja1Bvb2xJZCB0aGUgSUQgb2YgY3JlYXRlZCBibG9jayBwb29sLgorICAgICAqIFxwYXJhbSBwb29sICAgICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBibG9jayBwb29sIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBibG9jayBwb29sIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgZXh0ZW5zaW9uIHN5bWJvbCB3YXMgbm90IGZvdW5kLgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSBpbnB1dCBhbGxvY2F0b3JJZCBpcyBub3QgZGVmaW5lZCBpbiBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBhbGxvY2F0b3IgaXMgbm90IGNyZWF0ZWQgYXMgc2hhcmVkIHNpbmdsZXRvbiBhcyBDMkFsbG9jYXRvclN0b3JlIGRvZXMsIGJlY2F1c2UKKyAgICAgKiBDIGludGVyZmFjZSBvbmx5IGFsbG93cyByYXcgcG9pbnRlciB0cmFuc21pc3Npb24gZm9yIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgICAgICogXHBhcmFtIGFsbG9jYXRvciAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdG9yIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBhbGxvY2F0b3Igd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBhbGxvY2F0b3IgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgYWxsb2NhdG9yCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQWxsb2NhdG9yKDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcik7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpOworCisgICAgc3RhdGljIGFuZHJvaWQ6Ok11dGV4IHNNdXRleDsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOworCisgICAgdm9pZCAqbUxpYkhhbmRsZTsKKyAgICBDcmVhdGVCbG9ja1Bvb2xGdW5jIG1DcmVhdGVCbG9ja1Bvb2w7CisgICAgQ3JlYXRlQWxsb2NhdG9yRnVuYyBtQ3JlYXRlQWxsb2NhdG9yOworfTsKKworI2VuZGlmICAvLyBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxMjgyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnRGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUuCisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKworLyoqCisgKiBQbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgSURzCisgKi8KK2NsYXNzIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSA6IHB1YmxpYyBDMkFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgaW9uIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGNvbnNpc3RzIG9mOgorICAgICAgICAgKiAgIGZkICBzaGFyZWQgaW9uIGJ1ZmZlciBoYW5kbGUKKyAgICAgICAgICogICBpbnQgc2l6ZSAobG8gMzIgYml0cykKKyAgICAgICAgICogICBpbnQgc2l6ZSAoaGkgMzIgYml0cykKKyAgICAgICAgICogICBpbnQgbWFnaWMgJ1x4YzJpb1x4MDAnCisgICAgICAgICAqLworICAgICAgICBJT04gPSBQTEFURk9STV9TVEFSVCwKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGdyYWxsb2MgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgbGF5b3V0IGlzIG5vdCBwdWJsaWMuIFVzZSBDMkFsbG9jYXRvckdyYWxsb2M6OlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGdyYWxsb2MgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBncmFsbG9jIGhhbmRsZSAtIGZvciBDMkFsbG9jYXRvcjo6cHJpb3JBbGxvY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgR1JBTExPQywKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBoYW5kbGUgZnJvbSBhIEMySGFuZGxlLCBhbmQgV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gY3JlYXRlIGEgQzJIYW5kbGUgZnJvbSBhIGhhbmRsZSAtIGZvciBDMkFsbG9jYXRvcjo6cHJpb3JBbGxvY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQlVGRkVSUVVFVUUsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIGluZGljYXRpbmcgdGhlIGVuZCBvZiBwbGF0Zm9ybSBhbGxvY2F0b3IgZGVmaW5pdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgYWx3YXlzIHB1dCB0aGlzIG1hY3JvIGluIHRoZSBsYXN0IHBsYWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBFeHRlbmRlZCBwbGF0Zm9ybSBzdG9yZSBwbHVnaW4gc2hvdWxkIHVzZSB0aGlzIG1hY3JvIGFzIHRoZSBzdGFydCBJRCBvZiBpdHMgb3duIGFsbG9jYXRvcgorICAgICAgICAgKiB0eXBlcy4KKyAgICAgICAgICovCisgICAgICAgIFBMQVRGT1JNX0VORCwKKyAgICB9OworfTsKKworLyoqCisgKiBSZXRyaWV2ZXMgYSBibG9jayBwb29sIGZvciBhIGNvbXBvbmVudC4KKyAqCisgKiBccGFyYW0gaWQgICAgICAgIHRoZSBsb2NhbCBJRCBvZiB0aGUgYmxvY2sgcG9vbAorICogXHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBibG9jayBwb29sIChtdXN0IGJlIG5vbi1udWxsKQorICogXHBhcmFtIHBvb2wgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBvYnRhaW5lZCBibG9jayBwb29sIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICoKKyAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBjb21wb25lbnQgaXMgbnVsbAorICogXHJldHZhbCBDMl9OT1RfRk9VTkQgaWYgdGhlIGJsb2NrIHBvb2wgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGZldGNoIHRoZSBibG9jayBwb29sICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seSBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkLAorICogICAgICAgICAgICAgICAgICAgICAgdGhpcyByZXR1cm4gdmFsdWUgaXMgb25seSBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKi8KK2MyX3N0YXR1c190IEdldENvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCisgKiBDcmVhdGVzIGEgYmxvY2sgcG9vbC4KKyAqIFxwYXJhbSBhbGxvY2F0b3JJZCAgdGhlIGFsbG9jYXRvciBJRCB3aGljaCBpcyB1c2VkIHRvIGFsbG9jYXRlIGJsb2NrcworICogXHBhcmFtIGNvbXBvbmVudCAgICAgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZSBvbiBzdWNjZXNzLgorICogICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0b3IgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBhIGJsb2NrIHBvb2wKKyAqLworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBTZXRzIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBhY2Nlc3NpbmcgaXRzCisgKiBpbnRlcmZhY2UuIElmIHRoaXMgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCAoaWYgZXhpc3RzKSBpcyB0aGUgcHJlZmVycmVkCisgKiBzdG9yZSBmb3IgdGhpcyBwdXJwb3NlLiBJZiB0aGUgZGVmYXVsdCBJQ29tcG9uZW50U3RvcmUgSEFMIGlzIG5vdCBwcmVzZW50LCB0aGUgcGxhdGZvcm0KKyAqIGNvbXBvbmVudCBzdG9yZSBpcyB1c2VkLgorICovCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTAyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KKworLyoKKyAqIEFuZHJvaWQgcHJvdmlkZXMgbG9nZ2luZyBhbmQgZGVidWcgbWFjcm9zLiBSZWRlZmluZSB0aGVtIHdpdGggQzIgcHJlZml4IGFuZCBhZGQgc3VwcG9ydCBmb3IKKyAqIG9wdGluZyBvdXQgb2YgdmVyYm9zZSBsb2dzLgorICovCisKKyNpZmRlZiBDMl9MT0dfVEFHCisjZGVmaW5lIExPR19UQUcgQzJfTE9HX1RBRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaWZkZWYgQzJfTE9HX1ZFUkJPU0UKKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBMT0coOjphbmRyb2lkOjpiYXNlOjpMRVZFTCkKKyNlbHNlCisvKioKKyAqIFVzZSBhcyBmb2xsb3dzOgorICoKKyAqICNkZWZpbmUgQzJfTE9HX1RBRyAidGFnIgorICogLy8jZGVmaW5lIEMyX0xPR19WRVJCT1NFICAvLyBlbmFibGUgdmVyYm9zZSBsb2dzIGluIHRoaXMgZmlsZQorICogI2luY2x1ZGUgPEMyRGVidWcuaD4KKyAqCisgKiBDMl9MT0coREVCVUcpIDw8IGV4cHIgLi4uOworICoKKyAqIExvZyBsZXZlbHMgYXJlOiBWRVJCT1NFLCBERUJVRywgSU5GTywgV0FSTklORywgRVJST1IsIEZBVEFMIChhYm9ydHMpLgorICoKKyAqIE5vIGVuZGwgaXMgcmVxdWlyZWQuCisgKi8KKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBcCisgICAgICAgICg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMICE9IDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSkgJiYgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZW5kaWYKKworI2RlZmluZSBDMl9DSEVDSyAgICBDSEVDSworI2RlZmluZSBDMl9DSEVDS19MVCBDSEVDS19MVAorI2RlZmluZSBDMl9DSEVDS19MRSBDSEVDS19MRQorI2RlZmluZSBDMl9DSEVDS19FUSBDSEVDS19FUQorI2RlZmluZSBDMl9DSEVDS19HRSBDSEVDS19HRQorI2RlZmluZSBDMl9DSEVDS19HVCBDSEVDS19HVAorI2RlZmluZSBDMl9DSEVDS19ORSBDSEVDS19ORQorCisjZGVmaW5lIEMyX0RDSEVDSyAgICBEQ0hFQ0sKKyNkZWZpbmUgQzJfRENIRUNLX0xUIERDSEVDS19MVAorI2RlZmluZSBDMl9EQ0hFQ0tfTEUgRENIRUNLX0xFCisjZGVmaW5lIEMyX0RDSEVDS19FUSBEQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfRENIRUNLX0dFIERDSEVDS19HRQorI2RlZmluZSBDMl9EQ0hFQ0tfR1QgRENIRUNLX0dUCisjZGVmaW5lIEMyX0RDSEVDS19ORSBEQ0hFQ0tfTkUKKworI2VuZGlmICAvLyBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MGU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19CQVNFX0hfCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1ZyBwcmludCB1dGlsaXRpZXMgZm9yIENvZGVjIDIuMCBiYXNlIG9iamVjdHMuCisgKi8KKworI2RlZmluZSBDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQodHlwZSkgXAorY29uc3QgY2hhciAqYXNTdHJpbmcodHlwZSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKTsgXAoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0eXBlICZpKSB7IFwKKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaSk7IFwKK30KKworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKGMyX3N0YXR1c190KQorCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMTg3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1YzRjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfTE9HX0hfCisKKy8vIFBsYXRmb3JtIHNwZWNpZmljIGRlYnVnIHV0aWxpdGllcworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkRlYnVnLWxvZy5oPgorI2Vsc2UKKy8vIFRPRE86IGltcGxlbWVudCBiYXNlIGRlYnVnIHV0aWxzCisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWRlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19QQVJBTV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnL3ByaW50IGRlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBkZWZpbmVkIGluIEMyUGFyYW0uaAorICovCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCkKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6SW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIEludGVyZmFjZSBIZWxwZXIKKyAqLwordXNpbmcgQzJSID0gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFQsIHRydWU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcGFyYW1ldGVyIHJlZmxlY3RvcnMuIFRoaXMgY2xhc3MgaXMgZHluYW1pYyBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAqIHNoYXJlZCBieSBtdWx0aXBsZSBpbnRlcmZhY2VzLiBUaGlzIGFsbG93cyBpbnRlcmZhY2VzIHRvIGFkZCBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgYXMgbmVlZGVkLgorICovCitjbGFzcyBDMlJlZmxlY3RvckhlbHBlciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBDMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5DMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIFBhcmFtcyB0eXBlcyBvZiBjb2RlYyAyLjAgc3RydWN0cyAob3IgcGFyYW1ldGVycykgdG8gZGVzY3JpYmUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0czsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIGEgc3BlY2lmaWMgc3RydWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVrdCBkZXNjcmlwdG9yIGZvciB0aGUgc3RydWN0IHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQuCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9yKEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCk7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIGNsYXNzIEMyX0hJREUgX1R1cGxlIHsgfTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWN0cyBMaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0byBhZGQgc3VwcG9ydCBmb3IKKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKik7CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMgaW4gYSByZWN1cnNpdmUgbWFubmVyCisgICAgICogb25lIHN0cnVjdHVyZSBhdCBhIHRpbWUgdXNpbmcgYSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0ZW1wb3JhcnkuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0aGUgdHlwZSBvZiBjb2RlYyAyLjAgc3RydWN0IHRvIGRlc2NyaWJlCisgICAgICogXHBhcmFtIFBhcmFtcyByZXN0IG9mIHRoZSBzdHJ1Y3RzCisgICAgICogXHBhcmFtIHN0cnVjdHMgVGVtcG9yYXJ5IGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHVzZWQgdG8gb3B0aW1pemUgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8VCwgUGFyYW1zLi4uPiAqKSB7CisgICAgICAgIHN0cnVjdHMuZW1wbGFjZV9iYWNrKChUKiludWxscHRyKTsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IF9tTXV0ZXg7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3I+IF9tU3RydWN0czsgLy8vPCBkZXNjcmlwdG9ycworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29kZWMgMi4wIGludGVyZmFjZSBBUEktcyBmb3Igc29tZSBwYXJhbWV0ZXJzLgorICoKKyAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkLgorICovCitjbGFzcyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBvZmZzZXQgb2YgYSBmaWVsZCBhdCB8b2Zmc2V0fCB0aGF0IGNvdWxkIGJlIHBhcnQgb2YgYW4gYXJyYXkgb3IgcGFydCBvZiBhCisgICAgICogc3ViLXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGZpZWxkIHNpemUgdmVyaWZpY2F0aW9uLCBlLmcuIGlmIG9mZnNldCBpZiBvYnRhaW5lZCBmcm9tIGEgc3RydWN0dXJlLAorICAgICAqIGl0IHdpbGwgbm90IHN0b3AgYXQgdGhlIHN0cnVjdHVyZSBib3VuZGFyeSAtIHRoaXMgaXMgb2theSwgYXMgd2UganVzdCB3YW50IHRoZSBiYXNlIG9mZnNldAorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBzYW1lLgorICAgICAqLworICAgIHN0YXRpYworICAgIHNpemVfdCBHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSBoZWxwZXIgY2xhc3MgdXNlcyByZWZlcmVuY2VzIHRvIHN0ZDo6c2hhcmVkX3B0cjxUPiBjb25maWcgcGFyYW1ldGVycy4KKyAgICAgKiBJbnRlcm5hbGx5LCB0aGVzZSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIHRvIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiByZWZzLCBidXQgdGhlIGNhc3QgaXMKKyAgICAgKiBub3QgYWxsb3dlZCAoYXMgdGhlc2UgYXJlIHJlZmVyZW5jZXMpLiBBcyBzdWNoLCB0aGlzIGNsYXNzIG5ldmVyIHJldHVybnMgcG9pbnRlciB0byB0aGUKKyAgICAgKiBzaGFyZWRfcHRycy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgUGFyYW1SZWYgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBlbmFibGU9CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxULCBDMlBhcmFtPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpbmxpbmUgQzJfSElERSBQYXJhbVJlZihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtKQorICAgICAgICAgICAgOiBfbVJlZihyZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPio+KCZwYXJhbSkpIHsgfQorCisgICAgICAgIC8vIHVzZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgY29udGFpbmVycworICAgICAgICBvcGVyYXRvciBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKigpIGNvbnN0IHsgcmV0dXJuIF9tUmVmOyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGdldCgpIGNvbnN0IHsgcmV0dXJuICpfbVJlZjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICpfbVJlZjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRmllbGQgaGVscGVyLgorICAgICAqCisgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkOiBwb3NzaWJsZSB2YWx1ZXMsIGFuZCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIGNsYXNzIEZpZWxkSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGhlbHBlciBmb3IgYSBmaWVsZCB3aXRoIGdpdmVuIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciByZWZlcmVuY2UuIFRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBhdCB0aGlzCisgICAgICAgICAqICAgICAgICBwb2ludC4KKyAgICAgICAgICogXHBhcmFtIGZpZWxkIGZpZWxkIGlkZW50aWZpZXIKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBmaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgRmllbGRIZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHBhcmFtLWZpZWxkIGlkZW50aWZpZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgICAgICAgICogdW5kZXJseWluZyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFxhcmFtIGluZGV4CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQzJQYXJhbUZpZWxkCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGQgbWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0CisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gVGhpcyBkZWZhdWx0cyB0byB0aGUgcG9zc2libGUgdmFsdWVzCisgICAgICAgICAqIGlmIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHdlcmUgbmV2ZXIgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gaW1wbCBmb3Igc2FmZXR5CisgICAgICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICAgICAgX0MyRmllbGRJZCBtRmllbGRJZDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1Qb3NzaWJsZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1TdXBwb3J0ZWQ7IC8vLzwgaWYgZGlmZmVyZW50IGZyb20gcG9zc2libGUKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbTsKKyAgICBjbGFzcyBQYXJhbUhlbHBlcjsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgaXMgYW4gaW50ZXJmYWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGhlbHBlcnMgZnJvbSBhIHN0ZDo6c2hhcmVkX3B0cjxUPiAmLgorICAgICAqLworICAgIGNsYXNzIEZhY3RvcnkgeworICAgICAgICAvLyBcdG9kbyB0aGlzIG1heSBiZSBhbHJlYWR5IGluIFBhcmFtSGVscGVyCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFJlZmxlY3RvcigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCA9IDA7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUGFyYW08VD4gZ2V0KHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxUPiBhbHRWYWx1ZSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbTxUPihnZXRQYXJhbUhlbHBlcihQYXJhbVJlZihwYXJhbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdFZhbHVlID09IG51bGxwdHIgPyBwYXJhbSA6IGFsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmxlY3RvcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBmaWVsZCBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRmllbGQgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBoZWxwZXIgaGVscGVyIGZvciB0aGlzIGZpZWxkCisgICAgICAgICAqIFxwYXJhbSBpbmRleCAgcGFyYW1ldGVyIGluZGV4ICh0aGlzIGlzIG5lZWRlZCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBwYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgIGNvbnN0cnVjdGlvbikgXHRvZG8gcmVtb3ZlCisgICAgICAgICAqLworICAgICAgICBGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIGJvb2wgc3VwcG9ydHNBdEFsbChUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFBvc3NpYmxlVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc3VwcG9ydHNOb3coVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCByZXNvbHV0aW9uIHN1Z2dlc3Rpb24gYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gc2hvdWxkQmUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQKKyAgICAgICAgICogZm9yIG5vbi1jb25zdCBmaWVsZHMgdG8gZGlzYWxsb3cgc2V0dGluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IG11c3RCZSgpOworCisgICAgICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbUZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETworICAgICAgICBDMlIgdmFsaWRhdGVQb3NzaWJsZShjb25zdCBUICZ2YWx1ZSBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgLy8vIFRPRE8KKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIH07CisKKyAgICBjbGFzcyBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICBQYXJhbUhlbHBlcihQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJik7CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtSGVscGVyICYmKTsKKyAgICAgICAgflBhcmFtSGVscGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZiBmb3IgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgbW9kaWZpYWJsZS4gVGhlIGNvbnN0bmVzcyBvZiB0aGlzCisgICAgICAgIC8vLyBvYmplY3QgZGV0ZXJtaW5lcyB0aGUgY29uc3RuZXNzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgY29uc3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IHZhbHVlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgcmVxdWVzdCBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZSAgICB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBhc3NpZ25lZCB0byB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICogICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgbXVzdCBub3QgY2hhbmdlLgorICAgICAgICAgKiBccGFyYW0gbWF5QmxvY2sgd2hldGhlciBibG9ja2luZyBpcyBhbGxvd2VkCisgICAgICAgICAqIFxwYXJhbSBlbmRWYWx1ZSB0aGUgcmVzdWx0aW5nIHZhbHVlCisgICAgICAgICAqIFxwYXJhbSBmYWN0b3J5ICBwYXJhbWV0ZXIgZmFjdG9yeSAodG8gYWNjZXNzIGRlcGVuZGVuY2llcykKKyAgICAgICAgICogXHBhcmFtIGZhaWx1cmVzIHZlY3RvciBvZiBmYWlsdXJlcyB0byBhcHBlbmQgYW55IGZhaWx1cmVzIGZyb20gdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGNvbmZpZ3VyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdmFsdWUgaXMgaW5jb3JyZWN0IChUQkQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY29uZmlndXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgY29uZmlndXJhdGlvbiByZXF1aXJlcyBibG9ja2luZyB0byBiZSBhbGxvd2VkCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGludGVyZmFjZSBpcyBjb3JydXB0ZWQKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBib29sICpjaGFuZ2VkLAorICAgICAgICAgICAgICAgIEZhY3RvcnkgJmZhY3RvcnksCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICAgICAgLy8vIHJldHVybnMgcGFyYW1ldGVyIGluZGljZXMgdGhhdCBkZXBlbmQgb24gdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdDsKKworICAgICAgICAvLy8gYWRkcyBhIGRlcGVuZGVudCBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBhZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhhdCBwYXJhbWV0ZXIgcmVmcyBmb3IgcGFyYW1ldGVycyB0aGF0IGRlcGVuZCBvbiB0aGlzCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbmQgbW92ZXMgb3V0IHN0b3JlZCBzdHJ1Y3QgZGVzY3JpcHRvcgorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3IgcmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsaWRhdGVzIHBhcmFtIGhlbHBlci4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIG5vdywgdGhpcyBmaWxscyBmaWVsZCBpbmZvIGZvciBjb25zdCBwYXJhbXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGFkZGVkIGFzIHN1Y2gKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgICAgIGF0dHJpYl90JiBhdHRyaWIoKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0R2V0dGVyKHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZmllbGRzIGFuZCB0aGVpciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpOworCisgICAgICAgIC8vLyBidWlsZCB0aGlzIGludG8gYSBmaW5hbCBQYXJhbUhlbHBlciBvYmplY3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpOworCisgICAgICAgIGNsYXNzIEltcGw7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgcGFyYW1ldGVyIGhlbHBlci4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWVtYmVycyBhcyB3ZWxsIGFzIGZpZWxkIGhlbHBlcnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbSB7CisgICAgICAgIFBhcmFtKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyLCBzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IHYoKnBhcmFtLmdldCgpKSwKKyAgICAgICAgICAgICAgX21UeXBlZFBhcmFtKHBhcmFtKSwKKyAgICAgICAgICAgICAgX21IZWxwZXIoaGVscGVyKSwKKyAgICAgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICB1c2luZyBGaWVsZFR5cGUgPSBGaWVsZDwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZT46OnR5cGU+Ojp0eXBlPjsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgeworICAgICAgICAgICAgc2l6ZV90IG9mZnMgPSAodWludHB0cl90KSZmaWVsZCAtICh1aW50cHRyX3QpJmdldCgpOworICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGZhbGwgZWl0aGVyIHdpdGhpbiBzaXplb2YoVCkgKyBGTEVYX1NJWkUgb3IgcGFyYW0tPnNpemUoKQorICAgICAgICAgICAgLy8gc2l6ZV90IHNpemUgPSBzaXplb2YoZmllbGQpOworICAgICAgICAgICAgLy8gbVBhcmFtIG1heSBiZSBudWxsCisgICAgICAgICAgICBzaXplX3QgYmFzZVNpemUgPSBzaXplb2YodHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlKTsKKyAgICAgICAgICAgIHNpemVfdCBiYXNlT2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIF9tUmVmbGVjdG9yLCBUOjpDT1JFX0lOREVYLCBvZmZzIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgICAgIGlmICh+YmFzZU9mZnMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEMyX0xPRyhGQVRBTCkgPDwgInVua25vd24gZmllbGQgYXQgb2Zmc2V0ICIgPDwgb2ZmcyA8PCAiIHNpemUgIiA8PCBzaXplb2YoUykKKyAgICAgICAgICAgICAgICAvLyAgICAgICA8PCAiIGJhc2Utc2l6ZSAiIDw8IGJhc2VTaXplOworICAgICAgICAgICAgICAgIC8vIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2VPZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIgPSBfbUhlbHBlci0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlPFM+KGhlbHBlciwgX21UeXBlZFBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0IFBhcmFtIGhhdmUgY29uc3QgRmllbGRzOyBob3dldmVyLCByZW1vdmUgY29uc3QgZnJvbSBTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIGNvbnN0IEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBGaWVsZFR5cGU8Uz4+KGNvbnN0X2Nhc3Q8UGFyYW0gKj4odGhpcyktPkYoZmllbGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3QgcmVmIHZhbHVlIG9mIHRoaXMgY29uc3QgcGFyYW0uCisgICAgICAgIGNvbnN0IFQgJmdldCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBtb2RpZmlhYmxlIHJlZiB2YWx1ZSBvZiB0aGlzIG5vbi1jb25zdCBwYXJhbS4KKyAgICAgICAgVCAmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gQ29uc3QtcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZS5zCisgICAgICAgIFQgY29uc3QgJnY7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gX21UeXBlZFBhcmFtOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IF9tSGVscGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgQzJQID0gUGFyYW08VD47CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZWQgbW92ZSBidWlsZGVyIGNsYXNzIGZvciBhIHBhcmFtZXRlciBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBDMl9ISURFIFBhcmFtQnVpbGRlciA6IHByaXZhdGUgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENvbnN0cnVjdCB0aGUgcGFyYW1ldGVyIGJ1aWxkZXIgZnJvbSBtaW5pbWFsIGluZm8gcmVxdWlyZWQuICovCisgICAgICAgIFBhcmFtQnVpbGRlcihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgICAgIDogUGFyYW1IZWxwZXIocGFyYW0sIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0cikpLAorICAgICAgICAgICAgICBtVHlwZWRQYXJhbSgmcGFyYW0pIHsKKyAgICAgICAgICAgIGF0dHJpYigpID0gYXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnJlcXVpcmVkKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFUVVJUkVEOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHRyYW5zaWVudCAobm90IHBlcnNpc3RlbnQpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ0cmFuc2llbnQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSAmPSB+YXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaGlkZGVuIChub3QgZXhwb3NlZCBpbiBKQVZBIEFQSSkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmhpZGRlbigpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19ISURERU47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaW50ZXJuYWwgKG5vdCBleHBvc2VkIHRvIHF1ZXJ5L3NldHRpbmdzKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaW50ZXJuYWwoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSU5URVJOQUw7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICAvLyBDSEVDSyghbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAvLyBXQVJOX0lGKCFkZWZhdWx0Xyk7IC8vIGNvdWxkIGJlIG51bGxwdHIgaWYgT09NCisgICAgICAgICAgICAvLyB0ZWNobmljYWxseSwgdGhpcyBjb3VsZCBiZSBpbiB0aGUgcGFyZW50CisgICAgICAgICAgICAqbVR5cGVkUGFyYW0gPSBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCpkZWZhdWx0XykucmVsZWFzZSgpKSk7CisgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRHZXR0ZXIoW3R5cGVkUGFyYW1dKGJvb2wpIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlBhcmFtPigqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgYWxsIGZpZWxkcyB0byB0aGlzIHBhcmFtZXRlciB3aXRoIHRoZWlyIHBvc3NpYmxlIHZhbHVlcy4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzXykgeworICAgICAgICAgICAgc2V0RmllbGRzKHN0ZDo6bW92ZShmaWVsZHNfKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQ29uc3QgcGFyYW1ldGVycyBieSBkZWZpbml0aW9uIGhhdmUgbm8gZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgICAgICBzZXRTZXR0ZXIoW2RlZmF1bHRfXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2sgX191bnVzZWQsIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJikgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCp0eXBlZFZhbHVlICE9ICpkZWZhdWx0XykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBSZWFkT25seSgqZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChkZWZhdWx0Xyk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgY29uc3QgQzJQPFQ+ICYsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1NUUklDVDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJQPFQ+IG9sZFZhbHVlID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIG9sZFZhbHVlLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgbm9uLXN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXJrcyB0aGlzIGEgY2FsY3VsYXRlZCAocmVhZC1vbmx5KSBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIgKGNhbGN1bGF0b3IpCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZjYWxjdWxhdGVkQXMoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRUFEX09OTFk7CisgICAgICAgICAgICByZXR1cm4gd2l0aFNldHRlcihmbiwgc3RkOjpmb3J3YXJkPGRlY2x0eXBlKGRlcHMpPihkZXBzKS4uLik7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbUhlbHBlcjo6YnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKm1UeXBlZFBhcmFtOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBQYXJhbUJ1aWxkZXI8VD4gRGVmaW5lUGFyYW0oc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFBhcmFtQnVpbGRlcjxUPihwYXJhbSwgbmFtZSk7CisgICAgfQorCitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogSGVscGVyIGltcGxlbWVudGluZyBjb25maWcgY2FsbHMgYXMgd2VsbCBhcyBvdGhlciBjb25maWd1cmF0aW9uIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB2aXJ0dWFsLCBzbyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kIGl0IChhbmQgcGVyZm9ybQorICAgICAqIGFjdGlvbnMganVzdCBiZWZvcmUgYW5kIGFmdGVyIGEgY29uZmlndXJhdGlvbikuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zCisgICAgICogXHBhcmFtIG1heUJsb2NrCisgICAgICogXHBhcmFtIGZhaWx1cmVzCisgICAgICogXHBhcmFtIHVwZGF0ZVBhcmFtcyBpZiB0cnVlLCB0aGUgdXBkYXRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb3BpZWQgYmFjayBpbnRvIHRoZSBhcmd1bWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbiB8cGFyYW1zfAorICAgICAqIFxwYXJhbSBjaGFuZ2VzICAgICAgcG9pbnRlZCB0byBhIHZlY3RvciB0byByZWNlaXZlIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQuIElmIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZCBhcmUgYWRkZWQgdG8gdGhpcy4KKyAgICAgKiBccmV0dXJuIHJlc3VsdCBmcm9tIGNvbmZpZworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzLAorICAgICAgICAgICAgYm9vbCB1cGRhdGVQYXJhbXMgPSB0cnVlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyA9IG51bGxwdHIpOworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gZ2V0UmVmbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTG9jazsKKworICAgIC8qKgorICAgICAqIExvY2tzIHRoZSBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBsb2NrLiBUaGlzIGxvY2sgbXVzdCBiZSB1bmxvY2tlZCBvciByZWxlYXNlZCB3aXRob3V0CisgICAgICogY2FsbGluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KKyAgICAgKi8KKyAgICBMb2NrIGxvY2soKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHModWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3QgZW5kKSB7CisgICAgICAgIC8vIFRPRE86IGV4Y2x1ZGUgdGhpcyBoZWxwZXIKKyAgICAgICAgKHZvaWQpc3RhcnQ7CisgICAgICAgICh2b2lkKWVuZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBzdHJ1Y3QgRmFjdG9yeUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEZhY3RvcnlJbXBsPiBfbUZhY3Rvcnk7CisKKyAgICBDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIHRvIHRoaXMgaW50ZXJmYWNlLgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIENIRUNLcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gYWRkLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVwZW5kZW5jeSBpbmRleCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaXggdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJJbnRlcmZhY2VIZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN1YmNsYXNzIGluc3RhbmNlJ3MgYWRkcmVzcyBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIGFsbG93IHN1YmNsYXNzIHRvIHNwZWNpZnkgcGFyYW1ldGVyIGFkZHJlc3MgcmFuZ2UgZGlyZWN0bHkgKGUuZy4gZG8gbm90IGFzc3VtZSB0aGF0CisgICAgICogICAgICAgdGhleSBhcmUgbG9jYWwgdG8gdGhlIHN1YmNsYXNzIGluc3RhbmNlKQorICAgICAqCisgICAgICogXHBhcmFtIFQgdHlwZSBvZiB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqIFxwYXJhbSBpbnN0YW5jZSBwb2ludGVyIHRvIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJfSElERSB2b2lkIHNldERlcml2ZWRJbnN0YW5jZShUICppbnN0YW5jZSkgeworICAgICAgICBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKCh1aW50cHRyX3QpaW5zdGFuY2UsICh1aW50cHRyX3QpKGluc3RhbmNlICsgMSkpOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKEMySW50ZXJmYWNlSGVscGVyKTsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgY2xhc3MgZm9yIGEgZmllbGQgb2YgYSBwYXJhbWV0ZXIKKyAqCisgKiBccGFyYW0gc3BQYXJhbSBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGluIGFuIGludGVyZmFjZSBjbGFzcyBzdWJjbGFzc2VkIGZyb20gQzJJbnRlcmZhY2VIZWxwZXIuCisgKiBccGFyYW0gZmllbGQgICBhIGZpZWxkIG9mIHN1Y2ggcGFyYW1ldGVyCisgKi8KKyNkZWZpbmUgQzJGKHNwUGFyYW0sIGZpZWxkKSBcCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjwgXAorICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwgXAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHNwUGFyYW0tPmZpZWxkKT46OnR5cGU+Ojp0eXBlPjo6dHlwZT4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHNwUGFyYW0uZ2V0KCksICZzcFBhcmFtLT5maWVsZCkpCisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTAzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIG1hcCB1bmRlcmx5aW5nIHR5cGVzIHRvIEMyVmFsdWUgdHlwZXMgYXMgd2VsbCBhcyB0byBwcmludCBmaWVsZCB2YWx1ZXMuIFRoaXMgaXMKKyAqIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBzaW1wbHkgdGhlIHVuZGVybHlpbmcgdHlwZSBleGNlcHQgZm9yIGNoYXJhY3RlcnMgKFNUUklORykgYW5kIGJ5dGVzIChCTE9CKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXIgeworICAgIHR5cGVkZWYgVCBWYWx1ZVR5cGU7CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IHAucmVmPFQ+KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90PiB7CisgICAgdHlwZWRlZiB1aW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+IHsKKyAgICB0eXBlZGVmIGludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWUgcmFuZ2UgdXRpbGl0eSBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBtaW1pY3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlIGZvciBSQU5HRSB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCisvL3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNQVhfVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1NURVAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSByYW5nZSB3aXRoIG5vIHN1cHBvcnRlZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNQVhfVkFMVUUsIE1JTl9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYWxsIHZhbHVlcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBBbnkoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBzdXBwb3J0ZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHNvbGUgc3VwcG9ydGVkIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUFYX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNQVhfVkFMVUUpLCBNQVhfVkFMVUUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUgKyBNSU5fU1RFUCwgTUFYX1ZBTFVFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgbGVzcyB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgZ3JlYXRlciB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1JTl9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNSU5fVkFMVUUpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUgLSBNSU5fU1RFUCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb250aW51b3VzIG9yIGFyaXRobWV0aWMgcmFuZ2UgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBNSU5fU1RFUCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXRyaWMgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIDAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogcmFuZ2UgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBSQU5HRSB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gX21NYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBSYW5nZXMgYXJlIHZhbGlkIGlmIHRoZXkgYXJlIGNvbnRpbnVvdXMgb3IgbW9ub3RvbmljLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3ZlcmZsb3cgb3IgbmVnYXRpdmUgc2VyaWVzCisgICAgICAgIHJldHVybiBfbURlbm9tID4gMCAmJiBfbU51bSA+PSBfbURlbm9tICYmIF9tTWluICogKF9tRGVub20gLSBfbU51bSkgPCBfbVN0ZXAgKiBfbURlbm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmFuZ2UgYW5kIGFub3RoZXIsIGlmIGl0IGlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIHJhbmdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIGlubGluZSBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhfbU1pbiwgX21NYXgsIF9tU3RlcCwgX21OdW0sIF9tRGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1pbigpIGNvbnN0ICAgeyByZXR1cm4gX21NaW47ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtYXgoKSBjb25zdCAgIHsgcmV0dXJuIF9tTWF4OyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0ZXAgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBzdGVwKCkgY29uc3QgIHsgcmV0dXJuIF9tU3RlcDsgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWVyYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG51bSgpIGNvbnN0ICAgeyByZXR1cm4gX21OdW07ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVub21pbmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBkZW5vbSgpIGNvbnN0IHsgcmV0dXJuIF9tRGVub207IH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBhbGwgdmFsdWVzIGJldHdlZW4gX21NaW4gYW5kIF9tTWF4LgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzU2ltcGxlUmFuZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPT0gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSArIF9tU3RlcCwgd2hlcmUgX21TdGVwID4gMCBhbmQgX21NaW4gPD0geFtpXSA8PSBfbU1heAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzQXJpdGhtZXRpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA+IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2ldID0geFswXSAqIChfbU51bSAvIF9tRGVub20pIF4gaSAod2l0aCByb3VuZGluZyksIHdoZXJlIF9tTnVtID4gX21EZW5vbSA+IDAgYW5kIHhbMF0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNHZW9tZXRyaWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IDAgJiYgX21TdGVwID09IDAgJiYgX21OdW0gPiBfbURlbm9tICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKiBfbU51bSAvIF9tRGVub20gKyBfbVN0ZXAgKHdpdGggcm91bmRpbmcpLCB3aGlsZSB4W2kgKyAxXSA+IHhbaV0sIHdoZXJlCisgICAgICogX21TdGVwICE9IDAsIF9tRGVub20gPiAwIGFuZCBfbU51bSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc01hY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCAhPSAwICYmIF9tTnVtID4gMCAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGFyaXRobWV0aWMgb3IgY29udGludW91cyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0oMSksIF9tRGVub20oMSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21lcnRpYyBzb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuIFRoaXMgaXMgMCBmb3IgYSBwdXJlIGdlb21ldHJpYworICAgICAqICAgICAgICBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bShudW0pLCBfbURlbm9tKGRlbikgeyB9CisKKyAgICBUIF9tTWluOyAvLy88IGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludAorICAgIFQgX21NYXg7IC8vLzwgdXBwZXIgYm91bmQKKyAgICBUIF9tU3RlcDsgLy8vPCBzdGVwIG9mIGFuIGFyaXRobWV0aWMgc2VyaWVzICgwIGlmIGNvbnRpbnVvdXMgZmxvYXRpbmcgcG9pbnQgcmFuZ2UpCisgICAgVCBfbU51bTsgLy8vPCBudW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCisgICAgVCBfbURlbm9tOyAvLy88IGRlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZEZsYWdzIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGZsYWcgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIGZsYWdzIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJWYWx1ZTo6UHJpbWl0aXZlPigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncy4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBGTEFHUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNldCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBmbGFnIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoIWlzRW1wdHkoKSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IGZsYWdzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNldCBvZiBmbGFncyBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgVCBtaW4oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBkaXJlY3RseSBmcm9tIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyBhIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgZmxhZ3MgYW5kIGEgbWluaW11bSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0CisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHZhbHVlIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoeyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBWQUxVRVMgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIHZhbHVlIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgZmxhZyBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIHN1cHBvcnRlZCBzZXQgb2YgdmFsdWVzCit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQzJGaWVsZFN1cHBvcnRlVmFsdWVzIG9iamVjdCBmb3IgZmllbGRzIG9mIHZhcmlvdXMgdHlwZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyOworCisvLyB0ZW1wbGF0ZWQgb3BlcmF0b3IgbXVzdCBiZSBwcmVkZWNsYXJlZCBmb3IgZnJpZW5kIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYSBzcGVjaWZpYyB0eXBlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgc3RydWN0LgorICAgICAqLworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8vIFRSSUNLWTogbmVlZGVkIGZvciBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gZGVjbGFyYXRpb24KKyAgICB+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXImIG9wZXJhdG9yPShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworCisgICAgYm9vbCBzdXBwb3J0cyhUIHZhbHVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB1c2UgcGltcGwgYXMgaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworICAgIC8vZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICZpKTsKK307CisKKy8qKgorICogQnVpbGRlciBmb3Igc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIHN1Y2Nlc3NpdmVseSByZXN0cmljdCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4gVXBvbgorICogY3JlYXRpb24sIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgdmFsdWVzIHNwZWNpZmllZCAtIHdoaWNoIGZvciB0aGlzIGJ1aWxkZXIgbWVhbnMgdGhhdCBhbGwKKyAqIHZhbHVlcyBhcmUgc3VwcG9ydGVkLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBubyBkZWZpbmVkIHZhbHVlcyAtIGJ1dCBpbXBsaWNpdGx5IGFueSB2YWx1ZSBhbGxvd2VkLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmYW55KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGZyb20gdGhlIGJ1aWxkZXIgYXMgYWxsIHBhcmFtcyBtdXN0IGhhdmUgc3VwcG9ydGVkCisgICAgICogICAgICAgdmFsdWVzLCBidXQgaXMgaGVyZSBpbiBjYXNlIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZXF1YWxUbyhUIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdEdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIFsgfG1pbnwsIHxtYXh8IF0KKyAgICAgKiB3aXRoIG9wdGlvbmFsIHxzdGVwfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblJhbmdlKAorICAgICAgICAgICAgVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IFQoMCkgOiBUKDEpKSAgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblJhbmdlKG1pbiwgbWF4LCBzdGVwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBnZW9tZXRyaWMgc2VyaWVzIHN0YXJ0aW5nCisgICAgICogZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblNlcmllcyhtaW4sIG1heCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBzdGFydGluZyBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCBhbmQgfHN0ZXB8LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJbk1hY1NlcmllcyhtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHxmbGFnc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfHZhbHVlc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXImIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHJhbmdlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpOworCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKK307CisKKy8qKgorICogQnVpbGRlciBmb3IgYSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICovCitjbGFzcyBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSBzZXR0aW5nIGNvbmZsaWN0LgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbmZsaWN0IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIGFuZCByZXR1cm5zIHRoaXMKKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiB3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgKGFuZCBtb3ZlcyB0aGVtIG91dCBvZiB0aGlzIGJ1aWxkZXIuKQorICAgICAqICh0aGlzIGlzIHdoeSBpdCBpcyBub3QgY29uc3QpCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiByZXRyaWV2ZUNvbmZsaWN0cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGxpc3QgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfbUNvbmZsaWN0cy5lbXB0eSgpOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGVtcHR5KCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IF9tQ29uZmxpY3RzOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdCBidWlsZGVyIGZvciBhIHBhcmFtZXRlci4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgb25seSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgUmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYmFkLXZhbHVlIG9yIGluZm9pbmZvcm1hdGlvbmFsIGJhZC12YWx1ZSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyB0aGUgdmFsdWUgaXMgb3V0c2lkZSBvZiB0aGUgcG9zc2libGUgdmFsdWVzLiBBcyBzdWNoLCB0aGVyZSBhcmUgbm8KKyAgICAgKiBjb25mbGljdHMgZm9yIHRoaXMgY2FzZSBlaXRoZXIuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBCYWRWYWx1ZShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtRmllbGQsIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IChvciBpbmZvcm1hdGlvbmFsIGNvbmZsaWN0KSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyB0YWtlcyBGU1Ygc28gdXNlIHBhcmFtRmllbGRWYWx1ZXMgYW5kIG9wdGlvbmFsIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IENvbmZsaWN0KAorICAgICAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLAorICAgICAgICAgICAgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvLyBUT0RPOiByZXRyaWV2ZSByZXN1bHRzCisKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIEMyU2V0dGluZ1Jlc3VsdCBfbVJlc3VsdDsKKworICAgIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAmKSA9IGRlbGV0ZTsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHRzIChQTFVSQUwpIGJ1aWxkZXIuCisgKgorICogU2V0dGluZyByZXN1bHRzIGNvbnRhaW4gYSBmYWlsdXJlIHN0YXR1cyBhbG9uZyB3aXRoIGEgbGlzdCBvZiBmYWlsaW5nIGZpZWxkcyBvciBwYXJhbXMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciB7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImKSA9IGRlbGV0ZTsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgJm9wZXJhdG9yPShDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogXHJldHVybnMgKGRlZmF1bHQpIHN1Y2Nlc3NmdWwgcmVzdWx0IHdpdGggbm8gZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE9rKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfT0spOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgaXMgaW4gYmFkIHN0YXRlLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEJhZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQkFEX1NUQVRFKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIFRpbWVkT3V0KCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfVElNRURfT1VUKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gaXMgY29ycnVwdGVkLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIENvcnJ1cHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0NPUlJVUFRFRCk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBOb01lbW9yeShDMlBhcmFtOjpJbmRleCBpbmRleF8gX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGFkZCBmYWlsdXJlIHJlc3VsdAorICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfTk9fTUVNT1JZKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgYSBjb25zdHJ1Y3RvcgorICAgIC8qKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIGEgc2luZ2xlIGJhZCB2YWx1ZSBzZXR0aW5nIHJlc3VsdC4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHQgJiZyZXN1bHQpOworCisgICAgLyoqIENvbWJpbmVzIHRoaXMgcmVzdWx0cyB3aXRoIG90aGVyIHJlc3VsdHMuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgcGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpOworCisgICAgLyoqIFJldHJpZXZlIChnZXQgYW5kIG1vdmUgb3V0KSBmYWlsdXJlcyBhbmQgcmV0dXJuIHRoZSBmYWlsdXJlIHN0YXR1cy4gKi8KKyAgICBjMl9zdGF0dXNfdCByZXRyaWV2ZUZhaWx1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCitwcml2YXRlOgorICAgIC8qKiBTZXR0aW5nIHJlc3VsdHMgYmFzZWQgb24gYSBzaW5nbGUgc3RhdHVzLiBUaGlzIGlzIHVzZWQgd2hlbiBhY3R1YWwgc2V0dGluZyBjb3VsZCBub3QgYmUKKyAgICAgKiAgYXR0ZW1wdGVkIHRvIGdldCBhIHNpbmdsZSBDMlNldHRpbmdSZXN1bHQsIG9yIHdoZW4gYSBzZXR0aW5nIHN1Y2NlZWRlZCB3aXRob3V0CisgICAgICogICdjb21wbGFpbnRzJy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjMl9zdGF0dXNfdCBzdGF0dXMpOworICAgICAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VULCBDT1JSVVBURUQgb3IgTk9fTUVNT1JZCisgICAgICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQsIGJ1dAorICAgICAgICAvLyBOT19NRU1PUlkgbWF5IG5vdCBhbGxvdyB1cyB0byBjcmVhdGUgYSByZXN1bHRzIHN0cnVjdHVyZS4KKworICAgIC8qKgorICAgICAqIE9uZSBvZiBPSywgQkFEX0lOREVYLCBCQURfVkFMVUUsIEJBRF9TVEFURSwgTk9fTUVNT1JZLCBUSU1FRF9PVVQsIEJMT0NLSU5HIG9yIENPUlJVUFRFRC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBfbVN0YXR1cyBfX3VudXNlZDsKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBpbmRpdmlkdWFsIHNldHRpbmcgcmVzdWx0IGRldGFpbHMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IF9tUmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBlbnVtZXJhdGUgZmllbGRzIG9mIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHMgeworICAgIHN0cnVjdCBfSW5zcGVjdG9yOworCisgICAgLyoqCisgICAgICogQW4gZXh0ZW5kZWQgZmllbGQgZGVzY3JpcHRvciBvYmplY3Qgd2l0aCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIChsaW5lYWdlIGJhY2sgdG8gdGhlIHJvb3Qgb2YKKyAgICAgKiB0aGUgcGFyYW0pLgorICAgICAqLworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGVfdDsgLy8vPCBmaWVsZCB0eXBlCisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBOYW1lZFZhbHVlc1R5cGU7IC8vLzwgbmFtZWQgdmFsdWVzIGxpc3QgdHlwZQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgICAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIG5hbWUtdmFsdWUgcGFpcmluZ3MgZm9yIHRoaXMgZmllbGQuIFRoZSByZXR1cm5lZCByZWZlcmVuY2UgaXMKKyAgICAgICAgICogb25seSB2YWxpZCBkdXJpbmcgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhbiBpbmRleCBvZiAwLCBhbmQKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGhhcyBhbiBpbmRleCBvZiAzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgICAgICAvLy8gVFtdIGFycmF5cyBpZiB0aGlzIGluZm8gY29tZXMgZnJvbSBhIEMyUGFyYW06OkluZGV4IG9iamVjdCwgYW5kIHRoZSBjdXJyZW50bHkgdXNlZAorICAgICAgICAvLy8gZXh0ZW50IGlmIGl0IGNvbWVzIGZyb20gYSBDMlBhcmFtIG9iamVjdC4gUmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZQorICAgICAgICAvLy8gZmllbGQgaXMgbm90IGFuIGFycmF5LgorICAgICAgICBzaXplX3QgZXh0ZW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAoc3RydWN0dXJhbCkgZGVwdGggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZgorICAgICAgICAgKiAgMCwgYW5kIHBhcmFtLnN0cnVjdC5maWVsZCBvciBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YgMS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkZXB0aCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQncyBhcnJheS4gRS5nLiBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIHRoaXMgaXMgdGhlIG9mZnNldAorICAgICAgICAgKiBvZiBpdHMgc21hbGxlc3Qgc2libGluZzogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzBdLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5T2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZXh0ZW50KCkgKiBzaXplKCkKKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheVNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGUgYmFzZSBmaWVsZC4gVGhlIGJhc2UgZmllbGQgaXMgYSBjb3VzaW4gb2YgdGhlIGN1cnJlbnQgZmllbGQgd2hlcmUKKyAgICAgICAgICogYWxsIGluZGljZXMgYXJlIDAuIEUuZy4gdGhlIHRoZSBiYXNlIGZpZWxkIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaXMKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdLiBCYXNlIGZpZWxkcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yCisgICAgICAgICAqIGFsbCBjb3VzaW4gZmllbGRzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGJhc2VGaWVsZE9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhbiBhcml0aG1ldGljIChpbnRlZ3JhbCwgY291bnRlciBvciBmbG9hdCkgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzQXJpdGhtZXRpYygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gaGF2ZSBhIGZsZXhpYmxlIGV4dGVudC4gZXh0ZW50KCkgcmV0dXJucyB0aGUgY3VycmVudAorICAgICAgICAgKiBleHRlbnQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzRmxleGlibGUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gX21JbXBsICE9IG51bGxwdHI7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5mbyBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIGZpZWxkLCBvciBhbiBpbnZhbGlkIEluZm8gb2JqZWN0IGlmIGl0IGhhcyBubworICAgICAgICAvLy8gcGFyZW50cworICAgICAgICBJbmZvIHBhcmVudCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEluZm8oc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBfbUltcGw7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0luc3BlY3RvcjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYXRvciBvYmplY3Qgb3ZlciBmaWVsZHMgdXNpbmcgSW5mbyBvYmplY3RzLgorICAgICAqLworICAgIHN0cnVjdCBJdGVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCB2YWx1ZV90eXBlOworICAgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCAqIHBvaW50ZXI7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCByZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgICAgLy8vIHJldHVybiBJbmZvIGF0IGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgdmlydHVhbCByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIG1vdmUgdG8gdGhlIG5leHQgZmllbGQKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICYpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CisKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBmaWVsZHMuCisgICAgICovCisgICAgc3RydWN0IExpc3QgeworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdCgpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgTGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIChiYXNlKSBmaWVsZHMgYXQgaW5kZXggMCBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIHRoZQorICAgICAqIGZvbGxvd2luZzoKKyAgICAgKiAgIEZpZWxkcyBvZiBhIHN0cnVjdHVyZSBhcmUgZW51bWVyYXRlZCBpbiBmaWVsZCBvcmRlci4gSG93ZXZlciwgc3ViLWZpZWxkcyBvZiBhIHN0cnVjdHVyZQorICAgICAqICAgYXJlIGVudW1lcmF0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBmaWVsZCwgYW5kIHByaW9yIHRvIHNpYmxpbmcgZmllbGRzLgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSB0aGUgb3JkZXIgb2YgZW51bWVyYXRpb24gaXMgZmlyc3QgYnkgaW5jcmVhc2luZyBvZmZzZXQsIHRoZW4gYnkgZGVjcmVhc2luZyBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBlbnVtZXJhdGUgaXRzIGZpZWxkcworICAgICAqIFxwYXJhbSByZWZsZWN0b3IgcGFyYW1ldGVyIHJlZmxlY3RvciB1c2VkIGZvciBlbnVtZXJhdGlvbgorICAgICAqCisgICAgICogXHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVGaWVsZHMoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGNvdXNpbiBmaWVsZHMgdXAgdG8gZGVwdGggLSBsZXZlbCBmb3IgYSBmaWVsZC4gSWYgbGV2ZWwgaXMgMCwgaXQgZW51bWVyYXRlcworICAgICAqIG9ubHkgdGhlIGZpZWxkLiBGb3IgbGV2ZWwgMSwgaXQgZW51bWVyYXRlcyBhbGwgZmllbGRzIGluIGl0cyBjdXJyZW50IGFycmF5ICh3aGljaCBtYXkgYmUKKyAgICAgKiBpdHNlbGYgaWYgZXh0ZW50IGlzIDEpLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGJ5IGluY3JlYXNpbmcgZmllbGQgb2Zmc2V0LgorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUNvdXNpbnMoCisgICAgICAgICAgICBjb25zdCBJbmZvICZmaWVsZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxldmVsID0gfjApOworCisgICAgLyoqCisgICAgICogTG9jYXRlcyB0aGUgZmllbGQgaW4gYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBsaXN0IG9mIDIgZWxlbWVudHMgLSB0aGUgbW9zdC1zcGVjaWZpYyBmaWVsZAorICAgICAqIGFycmF5IG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIGZpZWxkLiBJZiB0aGUgZmllbGQgaXMgbm90IGEgdmFsaWQgZmllbGQKKyAgICAgKiBzcGVjaWZpZXIgZm9yIHRoaXMgcGFyYW1ldGVyIChlLmcuIGl0IGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgcGFyYW1ldGVyKSwgaXQgcmV0dXJucworICAgICAqIGFuIGVtcHR5IGxpc3QuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCit9OworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWludGVyZmFjZS5oPgorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxYmQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworc3RydWN0IEMyUGFyYW07CisKK2NsYXNzIEMyUGFyYW1VdGlscyB7CisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfUGFyYW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorCisgICAgLy8vIHNhZmUocikgcGFyc2luZyBmcm9tIHBhcmFtZXRlciBibG9iCisgICAgc3RhdGljCisgICAgQzJQYXJhbSAqUGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSk7Cit9OworCisvLy8gXGVuZGNvbmQKKworI2VuZGlmICAvLyBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiZjNhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhOworCit9Cit9Cit9Cit9CisKKy8qKgorICogU3RvcmVzIGluZm9ybWF0aW9ucyBmcm9tIEMyQmxvY2tQb29sIGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgQzJCbG9jay4KKyAqLworc3RydWN0IEMyX0hJREUgX0MyQmxvY2tQb29sRGF0YSB7CisgICAgZW51bSB0eXBlX3QgOiBpbnQgeworICAgICAgICBUWVBFX0JVRkZFUlBPT0wgPSAwLAorICAgICAgICBUWVBFX0JVRkZFUlFVRVVFLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgX0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfl9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7Cit9OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKy8qKgorICogSW50ZXJuYWwgb25seSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrcyBieSBibG9jayBwb29sL2J1ZmZlciBwYXNzaW5nIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcdG9kbyB0aGlzIG11c3QgYmUgaGlkZGVuCisgKi8KK3N0cnVjdCBfQzJCbG9ja0ZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIG9mZnNldCBhbGxvdHRlZCByYW5nZSBvZmZzZXQKKyAgICAgKiBccGFyYW0gc2l6ZSAgYWxsb3R0ZWQgc2l6ZQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCBzZWN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGNyb3AgIGFsbG90dGVkIGNyb3AgcmVnaW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAxRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMUQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazFEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAyRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMkQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2syRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJwb29sIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgICAgICAgICAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gYnVmZmVyUG9vbERhdGEgICAgcG9pbnRlciB0byBidWZmZXJwb29sIGRhdGEgd2hlcmUgdGhlIGJ1ZmZlcnBvb2wKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHtcY29kZSB0cnVlfSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnBvb2wgZGF0YSwge1xjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKTsKKworICAgIC8qCisgICAgICogTGlmZSBDeWNsZSBNYW5hZ2VtZW50IG9mIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrcworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIEEgYmxvY2sgdGhhdCBpcyBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIHJlcXVpcmVzIHNvbWUKKyAgICAgKiBzcGVjaWFsIHRyZWF0bWVudCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gSW4gcGFydGljdWxhciwgaWYgdGhlIGJsb2NrCisgICAgICogY29ycmVzcG9uZHMgdG8gYSBoZWxkIChkZXF1ZXVlZC9hdHRhY2hlZCkgR3JhcGhpY0J1ZmZlciBpbiBhIHNsb3Qgb2YgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBpdHMgZGVzdHJ1Y3Rpb24gc2hvdWxkIHRyaWdnZXIgYSBjYWxsIHRvCisgICAgICogSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyKCkuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAgKiBHcmFwaGljQnVmZmVyIGlzIG5vdCBoZWxkLCBpLmUuLCBpZiBpdCBoYXMgYmVlbiBxdWV1ZWQgb3IgZGV0YWNoZWQsCisgICAgICogY2FuY2VsQnVmZmVyKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdXBvbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqCisgICAgICogX0MyQmxvY2tQb29sRGF0YSBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIGluY2x1ZGVzIHR3bworICAgICAqIG1haW4gcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgICAqICAgLSAiaGVsZCIgc3RhdHVzOiBXaGV0aGVyIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQgdXBvbgorICAgICAqICAgICBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICogICAtIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQ6IFRoZSBxdWFkcnVwbGUgKGlnYnAsIGdlbmVyYXRpb24sIGJxSWQsCisgICAgICogICAgIGJxU2xvdCksIHdoZXJlIGlnYnAgaXMgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBnZW5lcmF0aW9uIGlzIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIsIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgYnFJZCBpcyB0aGUgZ2xvYmFsbHkgdW5pcXVlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZSwgYW5kCisgICAgICogICAgIGJxU2xvdCBpcyB0aGUgc2xvdCBpbiB0aGUgYnVmZmVycXVldWUuCisgICAgICoKKyAgICAgKiBpZ2JwIGlzIHRoZSBpbnN0YW5jZSBvZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIG9uIHdoaWNoIGNhbmNlbEJ1ZmZlcigpCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgImhlbGQiIHN0YXR1cyBpcyB0cnVlIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4KKyAgICAgKiAoYnFTbG90IGlzIGFuIGlucHV0IHRvIGNhbmNlbEJ1ZmZlcigpLikgSG93ZXZlciwgb25seSBnZW5lcmF0aW9uLCBicUlkCisgICAgICogYW5kIGJxU2xvdCBhcmUgcmV0YWluZWQgd2hlbiBhIGJsb2NrIGlzIHRyYW5zZmVycmVkIGZyb20gb25lIHByb2Nlc3MgdG8KKyAgICAgKiBhbm90aGVyLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nCisgICAgICogcHJvY2Vzc2VzIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IG9mICJoZWxkIiBzdGF0dXMgYW5kIGlnYnAuIEJlbG93IGFyZQorICAgICAqIGZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlOgorICAgICAqCisgICAgICogICAtIEdldEJ1ZmZlclF1ZXVlRGF0YSgpOiBSZXR1cm5zIGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdC4KKyAgICAgKiAgIC0gSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byB0cnVlLgorICAgICAqICAgLSBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpOiBTZXRzICJoZWxkIiBzdGF0dXMgdG8gZmFsc2UuCisgICAgICogICAtIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgpOiBTZXRzIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGFuZAorICAgICAqICAgICAiaGVsZCIgc3RhdHVzLgorICAgICAqCisgICAgICogQWxsIHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIF9DMkJsb2NrUG9vbERhdGEsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieQorICAgICAqIGNhbGxpbmcgR2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoKS4KKyAgICAgKgorICAgICAqIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIHdpbGwgbWFyayB0aGUgYmxvY2sgYXMgaGVsZCwgd2hpbGUKKyAgICAgKiBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHdpbGwgZG8gdGhlIG9wcG9zaXRlLiBUaGVzZSB0d28gZnVuY3Rpb25zIGRvCisgICAgICogbm90IG1vZGlmeSB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCwgc28gaXQgaXMgbm90IHdyb25nIHRvIGNhbGwKKyAgICAgKiBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSBhZnRlciBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIGlmIGl0IGNhbiBiZQorICAgICAqIGd1YXJhbnRlZWQgdGhhdCB0aGUgYmxvY2sgaXMgbm90IGRlc3Ryb3llZCBkdXJpbmcgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZQorICAgICAqIHR3byBjYWxscy4KKyAgICAgKgorICAgICAqIEFzc2luZ0Jsb2NrVG9CdWZmZXJRdWV1ZSgpIGhhcyBhICJoZWxkIiBzdGF0dXMgYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKgorICAgICAqIE1haW50YWluaW5nIENvbnNpc3RlbmN5IHdpdGggSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBPcGVyYXRpb25zCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIGRlcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmxvY2twb29sLiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZAorICAgICAqICAgICBtYW51YWxseS4gVGhlIGJsb2NrcG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIGNvcnJlY3QKKyAgICAgKiAgICAgaW5mb3JtYXRpb24gZm9yIF9DMkJsb2NrUG9vbERhdGEsIHdpdGggImhlbGQiIHN0YXR1cyBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIHF1ZXVlQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgcXVldWVCdWZmZXIoKSBpcyBjYWxsZWQsIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZC4KKyAgICAgKgorICAgICAqIGF0dGFjaEJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIGF0dGFjaEJ1ZmZlcigpIGlzIGNhbGxlZCwgQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZCB3aXRoICJoZWxkIiBzdGF0dXMgc2V0IHRvIHRydWUuCisgICAgICoKKyAgICAgKiBkZXRhY2hCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBkZXRhY2hCdWZmZXIoKSBpcyBjYWxsZWQsIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBHZXQgYnVmZmVycXVldWUgZGF0YSBmcm9tIHRoZSBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIFxwIGdlbmVyYXRpb24gc2V0IHRvIG51bGxwdHIgd2lsbCByZXR1cm4KKyAgICAgKiB3aGV0aGVyIHRoZSBibG9jayBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLCBidXQgd2lsbCBub3QKKyAgICAgKiBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIFxwIGdlbmVyYXRpb24sIFxwIGJxSWQgb3IgXHAgYnFTbG90LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgcG9vbERhdGEgICBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKiBccGFyYW1bb3V0XSBnZW5lcmF0aW9uIEdlbmVyYXRpb24gbnVtYmVyIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIuCisgICAgICogXHBhcmFtW291dF0gYnFJZCAgICAgICBJZCBvZiB0aGUgYnVmZmVycXVldWUgb3duaW5nIHRoZSBidWZmZXIgKGJsb2NrKS4KKyAgICAgKiBccGFyYW1bb3V0XSBicVNsb3QgICAgIFNsb3QgbnVtYmVyIG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFxjIHRydWUgd2hlbiB0aGVyZSBpcyB2YWxpZCBidWZmZXJxdWV1ZSBkYXRhOworICAgICAqICAgICAgICAgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgR2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogU2V0IGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgYW5kICJoZWxkIiBzdGF0dXMgdG8gYSBibG9jayBjcmVhdGVkIGJ5IGEKKyAgICAgKiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICogXHBhcmFtIGlnYnAgICAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSBmcm9tIHRoZSBkZXNpZ25hdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgYnVmZmVycXVldWUuCisgICAgICogXHBhcmFtIGdlbmVyYXRpb24gR2VuZXJhdGlvbiBudW1iZXIgdGhhdCB0aGUgYnVmZmVyIGJlbG9uZ3MgdG8uCisgICAgICogXHBhcmFtIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIHRoYXQgd2lsbCBvd24gdGhlIGJ1ZmZlciAoYmxvY2spLgorICAgICAqIFxwYXJhbSBicVNsb3QgICAgIFNsb3QgbnVtYmVyIG9mIHRoZSBidWZmZXIuCisgICAgICogXHBhcmFtIGhlbGQgICAgICAgV2hldGhlciB0aGUgYmxvY2sgaXMgaGVsZC4gVGhpcyAiaGVsZCIgc3RhdHVzIGNhbiBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgbGF0ZXIgYnkgY2FsbGluZyBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFxjIHRydWUgaWYgXHAgcG9vbERhdGEgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIE5vdGU6IFxwIGdlbmVyYXRpb24gc2hvdWxkIG1hdGNoIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIgc2V0IG9uIHRoZQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBhbmQgXHAgYnFJZCBzaG91bGQgbWF0Y2ggdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGJ1ZmZlcnF1ZXVlCisgICAgICogKG9idGFpbmFibGUgYnkgY2FsbGluZyBpZ2JwLT5nZXRVbmlxdWVJZCgpKS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGJvb2wgaGVsZCA9IHRydWUpOworCisgICAgLyoqCisgICAgICogSG9sZCBhIGJsb2NrIGZyb20gdGhlIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUuIFRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbgorICAgICAqIG9mIHRoZSBibG9jayB0byB0cmlnZ2VyIGEgY2FsbCB0byBjYW5jZWxCdWZmZXIoKS4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFxwIHBvb2xEYXRhIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZAorICAgICAqIGJsb2NrLiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGF0IGlzIHRoZSBjYXNlLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBibG9jay4gVGhpcyBpcyBub3QgbmVlZGVkIHdoZW4gdGhlIGJsb2NrIGlzIGxvY2FsLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogWWllbGQgYSBibG9jayB0byB0aGUgZGVzaWduYXRlZCBidWZmZXJxdWV1ZS4gVGhpcyBjYXVzZXMgdGhlIGRlc3RydWN0aW9uCisgICAgICogb2YgdGhlIGJsb2NrIG5vdCB0byB0cmlnZ2VyIGEgY2FsbCB0byBjYW5jZWxCdWZmZXIoKTsKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFxwIHBvb2xEYXRhIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZAorICAgICAqIGJsb2NrLiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGF0IGlzIHRoZSBjYXNlLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEpOworCit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhOGYyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKK3N0cnVjdCBDMl9ISURFIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgU2V0T2Zmc2V0KEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgIGZkLl9tRmllbGRJZC5fbU9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEVuZE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IHBhcmFtU2l6ZSA9IDApIHsKKyAgICAgICAgdWludDMyX3QgZW5kT2Zmc2V0ID0gZmQuX21GaWVsZElkLl9tT2Zmc2V0ICsgZmQuX21FeHRlbnQgKiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgICAgICAvLy8gZm9yIGZsZXggcGFyYW1ldGVycyByZXR1cm4gcGFyYW1TaXplIGlmIGdpdmVuCisgICAgICAgIHJldHVybiBmZC5fbUV4dGVudCA/IGVuZE9mZnNldCA6IHN0ZDo6bWF4KGVuZE9mZnNldCwgcGFyYW1TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0SW5kZXgoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21JbmRleDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0QXR0cmliKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgICAgICByZXR1cm4gcGQuX21BdHRyaWI7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBvZmZzZXQsIHNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgX0MyRmllbGRJZCBmaWVsZCkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBmaWVsZC5fbU9mZnNldCwgZmllbGQuX21TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgdm9pZCBUcmltUGFyYW0oQzJQYXJhbSAqcGFyYW0sIHVpbnQzMl90IG5ld1NpemUpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSAmJiBwYXJhbS0+c2l6ZSgpID4gbmV3U2l6ZSAmJiBuZXdTaXplID49IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcGFyYW0tPl9tU2l6ZSA9IG5ld1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgQWRkTmFtZWRWYWx1ZXMoCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgJiZuYW1lZFZhbHVlcykgeworICAgICAgICBmZC5fbU5hbWVkVmFsdWVzID0gc3RkOjptb3ZlKG5hbWVkVmFsdWVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIENyZWF0ZVN0cnVjdERlc2NyaXB0b3IoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykgeworICAgICAgICByZXR1cm4gQzJTdHJ1Y3REZXNjcmlwdG9yKGluZGV4LCBzdGQ6Om1vdmUoZmllbGRzKSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyRmllbGREZXNjcmlwdG9yIE9mZnNldEZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHNpemVfdCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yKGZkLCBvZmZzZXQpOworICAgIH0KKworICAgIC8vIGV4cG9zZSBhdHRyaWJ1dGVzCisgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhNWIzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJxQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlRGVmcy5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKwordXNpbmcgOjphbmRyb2lkOjpBbndCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgOjphbmRyb2lkOjpDMkFuZHJvaWRNZW1vcnlVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6RmVuY2U7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyA6OmFuZHJvaWQ6OndwOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhIDogcHVibGljIF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgYm9vbCBoZWxkOworICAgIGJvb2wgbG9jYWw7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IGxvY2FsUG9vbDsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIgPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGxvY2FsIEJsb2NrUG9vbERhdGEuCisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlOworCit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLCB1aW50NjRfdCogYnFJZCwgaW50MzJfdCogYnFTbG90KSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgaWYgKGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgKmdlbmVyYXRpb24gPSBwb29sRGF0YS0+Z2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChicUlkKSB7CisgICAgICAgICAgICAgICAgKmJxSWQgPSBwb29sRGF0YS0+YnFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAqYnFTbG90ID0gcG9vbERhdGEtPmJxU2xvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgYm9vbCBoZWxkKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgICAgICBwb29sRGF0YS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgICAgIHBvb2xEYXRhLT5icUlkID0gYnFJZDsKKyAgICAgICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBoZWxkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmhlbGQpIHsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50NjRfdCB1c2FnZTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICB1aW50MzJfdCBicVNsb3Q7CisgICAgICAgIGFuZHJvaWQ6Ol9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBpZiAoYnFJZCB8fCBicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAvLyBCUUJCUAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClicVNsb3QpOworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7Citwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBJR0JQIG5vdy4KKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKCk7CisgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlIGFuZHJvaWRVc2FnZSA9IHVzYWdlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGZvcm1hdCk7CisgICAgICAgIGludCBzbG90OworICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBhbmRyb2lkVXNhZ2UuYXNHcmFsbG9jVXNhZ2UoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmZmVuY2VdKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0U3RhdHVzLCBpbnQzMl90IHRTbG90LCBoaWRsX2hhbmRsZSBjb25zdCYgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdFRzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHNsb3QgPSB0U2xvdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oZmVuY2UuZ2V0KCksIHRGZW5jZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdFRzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAvLyBkZXF1ZXVlQnVmZmVyIHJldHVybnMgZmxhZy4KKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkgfHwgc3RhdHVzIDwgYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJjYW5ub3QgZGVxdWV1ZSBidWZmZXIgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT04gfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OlRJTUVEX09VVCB8fAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXIgaXMgYmxvY2tlZCB0ZW1wb3JhcmlseS4gUmV0cnlpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGhpZGxfaGFuZGxlIGZlbmNlSGFuZGxlOworICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmZmVuY2VIYW5kbGUsICZuaCwgKmZlbmNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGZW5jZVdhaXRUaW1lTXMgPSAxMDsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmVuY2UtPndhaXQoa0ZlbmNlV2FpdFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IC1FVElNRSkgeworICAgICAgICAgICAgICAgIC8vIGZlbmNlIGlzIG5vdCBzaWduYWxsZWQgeWV0LgorICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgZmVuY2Ugd2FpdCBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzaWduYWxUaW1lID49IDAgJiYgc2lnbmFsVGltZSA8IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ2FsbGJhY2sobVByb2R1Y2VySWQsIHNsb3QsIHNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgZmVuY2Ugc2lnbmFsIHRpbWUgb2YgJWxsZCIsIChsb25nIGxvbmcpc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gJnNsb3RCdWZmZXIgPSBtQnVmZmVyc1tzbG90XTsKKyAgICAgICAgaWYgKHN0YXR1cyAmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gfHwgIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICghc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTi5CLiBUaGlzIGFzc3VtZXMgcmVxdWVzdEJ1ZmZlciMgcmV0dXJucyBhbiBleGlzdGluZyBhbGxvY2F0aW9uCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGEgbmV3IGFsbG9jYXRpb24uCisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtUHJvZHVjZXItPnJlcXVlc3RCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2xvdEJ1ZmZlcl0oaW50MzJfdCB0U3RhdHVzLCBBbndCdWZmZXIgY29uc3QmIHRCdWZmZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKHNsb3RCdWZmZXIuZ2V0KCksIHRCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlciB3cmFwcyAlbGx1ICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICBDMkhhbmRsZSAqYzJIYW5kbGUgPSBhbmRyb2lkOjpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgaWYgKGMySGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oYzJIYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmxvY2sgd2FzIG5vdCBjcmVhdGVkLiBjYWxsIHJlcXVlc3RCdWZmZXIjIGFnYWluIG5leHQgdGltZS4KKyAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtSW5pdChDMl9PSyksIG1Qcm9kdWNlcklkKDApLCBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgUmV0dXJuPGludDMyX3Q+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHJhbnNSZXN1bHQpID09IGFuZHJvaWQ6Ok5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeSA9IDIwOyAvLyBUT0RPOiBzbWFsbCBudW1iZXIgY2FuIGNhdXNlIGNyYXNoIGluIHJlbGVhc2luZy4KKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5RGVsYXlVcyA9IDEwMDAwOworCisgICAgICAgIGludCBjdXJUcnkgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJUcnkrKyA8IGtNYXhJZ2JwUmV0cnkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIEMyX05PX0lOSVQKKyAgICAgICAgICAgIGlmIChtUHJvZHVjZXJJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWc/CisgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpIHsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIDo6dXNsZWVwKGtNYXhJZ2JwUmV0cnlEZWxheVVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgIH0KKworICAgIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBhbmRyb2lkOjpPSzsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gcHJvZHVjZXItPmdldFVuaXF1ZUlkKAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnByb2R1Y2VySWRdKGludDMyX3QgdFN0YXR1cywgaW50NjRfdCB0UHJvZHVjZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VySWQgPSB0UHJvZHVjZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWd1cmVQcm9kdWNlciAtLSBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgcHJvZHVjZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9kdWNlciAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoaWdicF9pZCA9PSBtUHJvZHVjZXJJZCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKGlnYnBfc2xvdCwgbnVsbHB0cikuaXNPaygpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CisgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcikgOgorICAgICAgICBoZWxkKHByb2R1Y2VyICYmIGJxSWQgIT0gMCksIGxvY2FsKGZhbHNlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocHJvZHVjZXIpLAorICAgICAgICBsb2NhbFBvb2woKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgorICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAorICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgeworICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwgJiYgbG9jYWxQb29sKSB7CisgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGJxSWQsIGJxU2xvdCk7CisgICAgfSBlbHNlIGlmIChpZ2JwKSB7CisgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIG51bGxwdHIpOworICAgIH0KK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSB7fQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y29uZmlndXJlUHJvZHVjZXIocHJvZHVjZXIpOworICAgIH0KK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzU3RyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGMyX3N0YXR1c190IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyX09LOiAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQzJfQkFEX0lOREVYOiByZXR1cm4gIkJBRF9JTkRFWCI7CisgICAgICAgIGNhc2UgQzJfQ0FOTk9UX0RPOiByZXR1cm4gIkNBTk5PVF9ETyI7CisgICAgICAgIGNhc2UgQzJfRFVQTElDQVRFOiByZXR1cm4gIkRVUExJQ0FURSI7CisgICAgICAgIGNhc2UgQzJfTk9UX0ZPVU5EOiByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgICAgIGNhc2UgQzJfQkFEX1NUQVRFOiByZXR1cm4gIkJBRF9TVEFURSI7CisgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICByZXR1cm4gIkJMT0NLSU5HIjsKKyAgICAgICAgY2FzZSBDMl9DQU5DRUxFRDogIHJldHVybiAiQ0FOQ0VMRUQiOworICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIEMyX1JFRlVTRUQ6ICAgcmV0dXJuICJSRUZVU0VEIjsKKyAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHJldHVybiAiVElNRURfT1VUIjsKKyAgICAgICAgY2FzZSBDMl9PTUlUVEVEOiAgIHJldHVybiAiT01JVFRFRCI7CisgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiByZXR1cm4gIkNPUlJVUFRFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fSU5JVDogICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgcmV0dXJuICJ1OCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogcmV0dXJuICJjMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IHJldHVybiAiYzY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICByZXR1cm4gImZwIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICByZXR1cm4gImkzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgcmV0dXJuICJpNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHJldHVybiAiY2hyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiByZXR1cm4gInUzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogcmV0dXJuICJ1NjQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gKGkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID8gInN0cnVjdCIgOiBkZWY7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1Db3JlSW5kZXgoY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJWMlYyUwM3giLAorICAgICAgICAgICAgaS5pc0ZsZXhpYmxlKCkgPyAnRicgOiAnLScsCisgICAgICAgICAgICBpLmlzVmVuZG9yKCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICBpLmNvcmVJbmRleCgpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtSW5kZXgoCisgICAgICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgJmksIGJvb2wgYWRkU3RyZWFtLCB1bnNpZ25lZCBzdHJlYW1JZCkgeworICAgIHN0ZDo6c3RyaW5nIHYgPSBTdHJpbmdQcmludGYoIiVjJWMiLAorICAgICAgICAgICAgaS5mb3JJbnB1dCgpID8gJ0knIDogaS5mb3JPdXRwdXQoKSA/ICdPJyA6ICctJywKKyAgICAgICAgICAgIGkuZm9yU3RyZWFtKCkgPyAnUycgOiBpLmZvclBvcnQoKSA/ICdQJyA6ICdHJyk7CisgICAgaWYgKGFkZFN0cmVhbSkgeworICAgICAgICBpZiAoaS5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgdiArPSBTdHJpbmdQcmludGYoIiUwMmQiLCBzdHJlYW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ICs9ICItLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdgorICAgICAgICAgICAgKyBTdHJpbmdQcmludGYoIiVjICIsCisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNUUlVDVCAgPyAnUycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpJTkZPICAgID8gJ2knIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6VFVOSU5HICA/ICd0JyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNFVFRJTkcgPyAncycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpOT05FICAgID8gJy0nIDogJz8nKQorICAgICAgICAgICAgKyBhdHRyaWJQYXJhbUNvcmVJbmRleChpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiUGFyYW06OkNvcmVJbmRleCgiIDw8IGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6VHlwZSglMDh4OiAiLCBpLnR5cGUoKSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgZmFsc2UsIDApIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OkluZGV4KCUwOHg6ICIsICh1aW50MzJfdClpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCB0cnVlLCBpLnN0cmVhbSgpKSA8PCAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJGaWVsZElkKGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCJGaWVsZChAJTAyeCslMDJ4KSIsCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICI8IiA8PCBhdHRyaWJGaWVsZElkKGkpIDw8ICI+IjsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpIHsKKyAgICBvcyA8PCBhdHRyaWJGaWVsZElkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChpKSkgPDwgIiAiOworICAgIGlmIChpLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIG9zIDw8ICJlbnVtICI7CisgICAgfQorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpLnR5cGUoKSkgPDwgIiAiIDw8IGkubmFtZSgpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIlslenVdIiwgaS5leHRlbnQoKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSkgeworICAgIG9zIDw8ICI8IiA8PCBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoaSkpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjo6RmllbGQoQCUwMngrJTAyeCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKKyAgICByZXR1cm4gb3M7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRmllbGRWYWx1ZUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICBpZiAoaXNwcmludChwLmkzMikpIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJyVjJyIsIHAuaTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInXFx4JTAyeCciLCAodWludDMyX3QpcC5pMzIpOworICAgIH0KK30KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgcC51MzIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGMyX2NudHJfdDxUPiAmdikgeworICAgIHJldHVybiBvcyA8PCAiY3RyKCIgPDwgdi5wZWVrdSgpIDw8ICIpIjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKSB7CisgICAgb3MgPDwgIlJhbmdlKCI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICBvcyA8PCAiLi4iOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5tYXgoKSk7CisgICAgb3MgPDwgIiAqPSAiIDw8IGkubnVtKCkgPDwgIiAvPSAiIDw8IGkuZGVub20oKSA8PCAiICs9ICIgPDwgaS5zdGVwKCkgPDwgIikiOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZpKSB7CisgICAgb3MgPDwgIkZsYWdzWyI7CisgICAgaWYgKCFpLmlzRW1wdHkoKSkgeworICAgICAgICBvcyA8PCAibWluPSI7CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgfQorICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLmZsYWdzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKSB7CisgICAgb3MgPDwgIlZhbHVlc1siOworICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFZhbHVlVHlwZT4gX21GbGFnczsKKworcHVibGljOgorLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0IHsKKyAgICBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIG9zIDw8IF9tUmFuZ2U7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIG9zIDw8IF9tVmFsdWVzOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgIG9zIDw8IF9tRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgIlVua25vd24gRlNWIHR5cGU6ICIgPDwgKHVpbnQzMl90KV9tVHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpIHsKKyAgICByZXR1cm4gaS5fbUltcGwtPnN0cmVhbU91dChvcyk7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PiAmaSk7CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0N2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmbGVjdG9ySGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEMyUmVmbGVjdG9ySGVscGVyOjphZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGZvciAoQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1a3QgOiBzdHJ1Y3RzKSB7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHN0cnVjdHVyZSBkZXNjcmlwdGlvbnMgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBvbmVzCisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3Ioc3RkOjptb3ZlKHN0cnVrdCkpOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4KK0MyUmVmbGVjdG9ySGVscGVyOjpkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBfbVN0cnVjdHMuZmluZChwYXJhbUluZGV4KTsKKyAgICBpZiAoaXQgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oaXQtPnNlY29uZCk7CisgICAgfQorfTsKKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpIHsKKyAgICBpZiAoX21TdHJ1Y3RzLmZpbmQoc3RydWt0LmNvcmVJbmRleCgpKSAhPSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBhZGRlZAorICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IGRlc2NyaXB0b3IgbWF0Y2hlcyBzdG9yZWQgZGVzY3JpcHRvcgorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGF0IGFsbCBzdHJ1Y3QgZmllbGRzIGFyZSBrbm93biB0byB0aGlzIHJlZmxlY3RvcgorICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkIDogc3RydWt0KSB7CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBmZC50eXBlKCkgJn4gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHOworICAgICAgICAgICAgaWYgKF9tU3RydWN0cy5maW5kKGNvcmVJbmRleCkgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKElORk8pIDw8ICJtaXNzaW5nIHN0cnVjdCBkZXNjcmlwdG9yICMiIDw8IGNvcmVJbmRleCA8PCAiIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmZC5uYW1lKCkgPDwgIiBvZiBzdHJ1Y3QgIyIgPDwgc3RydWt0LmNvcmVJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9tU3RydWN0cy5lbXBsYWNlKHN0cnVrdC5jb3JlSW5kZXgoKSwgc3RydWt0KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmFtSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgICAgICA6IG1QYXJhbShwYXJhbSksIG1OYW1lKG5hbWUpLCBfbVN0cnVjdChzdHJ1a3QpIHsgfQorCisgICAgSW1wbChJbXBsJiYpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICAgICAgbURvd25EZXBlbmRlbmNpZXMucHVzaF9iYWNrKGluZGV4KTsKKyAgICB9CisKKyAgICBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBhdHRyaWIoKSB7CisgICAgICAgIHJldHVybiBtQXR0cmliOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoKSB7CisgICAgICAgIC8vIG1vdmUgZGVwZW5kZW5jaWVzIGludG8gZGVzY3JpcHRvcgorICAgICAgICBtRGVzY3JpcHRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIGluZGV4KCksIChDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpbUF0dHJpYiwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobU5hbWUpLCBzdGQ6Om1vdmUobURlcGVuZGVuY2llcykpOworICAgIH0KKworICAgIHZvaWQgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmIDoKKyAgICAgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcygqbURlZmF1bHRWYWx1ZSwgcmVmbGVjdG9yKSkgeworICAgICAgICAgICAgaWYgKCFmLmlzQXJpdGhtZXRpYygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gZnN2UG9pbnRlcjsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnJlYWthYmxlIHN0cnVjdHVyZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgZnN2OworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJyZWFrIG91dCBvZiBkbyB7fSB3aGlsZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmc3ZQb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPihmc3YpOworICAgICAgICAgICAgfSB3aGlsZSAoZmFsc2UpOworCisgICAgICAgICAgICBtRmllbGRzLmVtcGxhY2VfaGludCgKKyAgICAgICAgICAgICAgICAgICAgbUZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RmllbGRIZWxwZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbSwgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksIHN0ZDo6bW92ZShmc3ZQb2ludGVyKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtRmllbGRzLmZpbmQoX0MyRmllbGRJZChiYXNlT2ZmcywgYmFzZVNpemUpKTsKKyAgICAgICAgaWYgKGl0ID09IG1GaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURvd25EZXBlbmRlbmNpZXM7CisgICAgfQorCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7CisgICAgICAgIGlmICghbURlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBtaXNzaW5nIGRlZmF1bHQgdmFsdWVcbiIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGVmYXVsdFZhbHVlLT5pbmRleCgpOworICAgIH0KKworICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW07CisgICAgfQorCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfbVN0cnVjdCk7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKSB7CisgICAgICAgIG1EZWZhdWx0VmFsdWUgPSBkZWZhdWx0XzsKKyAgICB9CisKKyAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICAgICAgbURlcGVuZGVuY2llcyA9IGluZGljZXM7CisgICAgICAgIG1EZXBlbmRlbmNpZXNBc1JlZnMgPSByZWZzOworICAgIH0KKworICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IGFkZGluZyBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIG9yIHRvIGNvbnN0IHZhbHVlcworICAgICAgICBpZiAoIW1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gcGFyYW0gIiA8PCBtTmFtZSA8PCAiIG11bHRpcGxlIHRpbWVzIjsKKyAgICAgICAgfSBlbHNlIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJUcnlpbmcgdG8gYWRkIGZpZWxkcyB0byBjb25zdCBwYXJhbSAiIDw8IG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDMlBhcmFtRmllbGRWYWx1ZXMgJnBmdiA6IGZpZWxkcykgeworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIC8vIF9DMkZpZWxkSWQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmdi5wYXJhbU9yRmllbGQpLAorICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPihtUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBmdi52YWx1ZXMpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgICAgICBDMlIgcmVzdWx0ID0gbVNldHRlcih2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYpOworICAgICAgICByZXR1cm4gcmVzdWx0LnJldHJpZXZlRmFpbHVyZXMoZmFpbHVyZXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGlmICghbVNldHRlciAmJiBtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhXQVJOSU5HKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBzZXR0ZXIsIG1ha2luZyBpdCBjb25zdCI7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGVtcHR5IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgbUF0dHJpYiB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TZXR0ZXIpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBjcmVhdGVGaWVsZHNBbmRTdXBwb3J0ZWRWYWx1ZXMocmVmbGVjdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBkZWZhdWx0IGJhc2VkIG9uIHNldHRlciBhbmQgdmVyaWZ5IHRoYXQgRlNWIGNvdmVycyB0aGUgdmFsdWVzCisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIGZpZWxkcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVBhcmFtLmdldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfQzJQYXJhbUluc3BlY3Rvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgUGFyYW1SZWYgbVBhcmFtOworICAgIEMyU3RyaW5nIG1OYW1lOworICAgIEMyU3RydWN0RGVzY3JpcHRvciBfbVN0cnVjdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbURlZmF1bHRWYWx1ZTsKKyAgICBhdHRyaWJfdCBtQXR0cmliOworICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBtU2V0dGVyOworICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBtR2V0dGVyOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRGVwZW5kZW5jaWVzOworICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRG93bkRlcGVuZGVuY2llczsgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCB3b3JrIGZvciBzdHJlYW0gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptYXA8X0MyRmllbGRJZCwgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPj4gbUZpZWxkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IG1EZXNjcmlwdG9yOworfTsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcigKKyAgICAgICAgUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpCisgICAgOiBtSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbD4oCisgICAgICAgICAgICBwYXJhbSwgbmFtZSwgc3RkOjptb3ZlKHN0cnVrdCkpKSB7IH0KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcihDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXIgJiYpID0gZGVmYXVsdDsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp+UGFyYW1IZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+YWRkRG93bkRlcGVuZGVuY3koaW5kZXgpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYigpIHsKKyAgICByZXR1cm4gbUltcGwtPmF0dHJpYigpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmJ1aWxkKCkgeworICAgIG1JbXBsLT5idWlsZCgpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4oc3RkOjptb3ZlKCp0aGlzKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlc2NyaXB0b3IoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERvd25EZXBlbmRlbmNpZXMoKTsKK30KKworQzJQYXJhbTo6SW5kZXggQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjppbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZGV4KCk7Cit9CisKK0MyU3RyaW5nIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm5hbWUoKTsKK30KKworY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtUmVmIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6cmVmKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+cmVmKCk7Cit9CisKK0MyU3RydWN0RGVzY3JpcHRvciBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gbUltcGwtPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgIG1JbXBsLT5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVwZW5kZW5jaWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICBtSW1wbC0+c2V0RGVwZW5kZW5jaWVzKGluZGljZXMsIHJlZnMpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRHZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0R2V0dGVyKGdldHRlcik7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRTZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0U2V0dGVyKHNldHRlcik7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dHJ5U2V0KAorICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW1wbC0+dHJ5U2V0KHZhbHVlLCBtYXlCbG9jaywgY2hhbmdlZCwgZiwgZmFpbHVyZXMpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbGlkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBtSW1wbC0+dmFsaWRhdGUocmVmbGVjdG9yKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnZhbHVlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGRIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlBhcmFtRmllbGQgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjptYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZChpbmRleCwgbUZpZWxkSWQpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OkZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpCisgICAgOiBtUGFyYW0ocGFyYW0pLAorICAgICAgbUZpZWxkSWQoZmllbGQpLAorICAgICAgbVBvc3NpYmxlKHN0ZDo6bW92ZSh2YWx1ZXMpKSB7CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJDcmVhdGluZyBmaWVsZCBoZWxwZXIgIiA8PCBmaWVsZCA8PCAiICIKKyAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+KCptUG9zc2libGUpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6c2V0U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpIHsKKyAgICBtU3VwcG9ydGVkID0gc3RkOjptb3ZlKHZhbHVlcyk7Cit9CisKK2NvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKkMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6Z2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAobVN1cHBvcnRlZCA/IG1TdXBwb3J0ZWQgOiBtUG9zc2libGUpLmdldCgpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtUG9zc2libGUuZ2V0KCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgZmllbGQtc3VwcG9ydGVkLXZhbHVlcyBidWlsZGVyIHRoYXQgZ2V0cyBzdG9yZWQgaW4gdGhlCisgKiBmaWVsZCBoZWxwZXIgd2hlbiB0aGUgYnVpbGRlciBnb2VzIG91dCBvZiBzY29wZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiB7CisgICAgU3VwcG9ydGVkVmFsdWVzQnVpbGRlcigKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZCAmZmllbGQsIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IGhlbHBlcikKKyAgICAgICAgOiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KGZpZWxkKSwgX21IZWxwZXIoaGVscGVyKSwgX21GaWVsZChmaWVsZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYnVpbGRlciB2YWx1ZXMgb24gZGVzdHJ1Y3Rpb24uCisgICAgICovCisgICAgdmlydHVhbCB+U3VwcG9ydGVkVmFsdWVzQnVpbGRlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgX21IZWxwZXItPnNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6Om1vdmUoQzJQYXJhbUZpZWxkVmFsdWVzKCp0aGlzKS52YWx1ZXMpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6c2hvdWxkQmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4oX21GaWVsZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6bXVzdEJlKCkgeworICAgIHJldHVybiBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQsIF9tSGVscGVyKTsKK30KKworLyoKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6dmFsaWRhdGVQb3NzaWJsZShUICZ2YWx1ZSkKK2NvbnN0IHsKKyAgICAvLy8gVE9ETworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6T2soKTsKK30KKyovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OkZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICA6IF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoaGVscGVyLT5tYWtlUGFyYW1GaWVsZChpbmRleCkpIHsgfQorCit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQ4X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjaGFyPjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50NjRfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZhY3RvcnlJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5IHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4KKyAgICBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIF9tUGFyYW1zLmZpbmQocGFyYW0pLT5zZWNvbmQ7CisgICAgfQorCitwdWJsaWM6CisgICAgRmFjdG9yeUltcGwoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgdmlydHVhbCB+RmFjdG9yeUltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICAgICAgX21QYXJhbXMuaW5zZXJ0KHsgcGFyYW0tPnJlZigpLCBwYXJhbSB9KTsKKyAgICAgICAgX21JbmRleFRvSGVscGVyLmluc2VydCh7cGFyYW0tPmluZGV4KCksIHBhcmFtfSk7CisKKyAgICAgICAgLy8gYWRkIGRvd24tZGVwZW5kZW5jaWVzIChhbmQgdmFsaWRhdGUgZGVwZW5kZW5jaWVzIGFzIGEgcmVzdWx0KQorICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IFBhcmFtUmVmICZyZWYgOiBwYXJhbS0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkpIHsKKyAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBtdXN0IGFscmVhZHkgYmUgZGVmaW5lZAorICAgICAgICAgICAgaWYgKCFfbVBhcmFtcy5jb3VudChyZWYpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW1ldGVyICIgPDwgcGFyYW0tPm5hbWUoKSA8PCAiIGhhcyBhIGRlcGVuZGVuY3kgYXQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXggPDwgIiB0aGF0IGlzIG5vdCB5ZXQgZGVmaW5lZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhcmFtcy5maW5kKHJlZiktPnNlY29uZC0+YWRkRG93bkRlcGVuZGVuY3kocGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorCisgICAgICAgIF9tRGVwZW5kZW5jeUluZGV4LmVtcGxhY2UocGFyYW0tPmluZGV4KCksIF9tRGVwZW5kZW5jeUluZGV4LnNpemUoKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgc3RyZWFtcyBzZXBhcmF0ZWx5CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBfbUluZGV4VG9IZWxwZXIuZmluZChpeCk7CisgICAgICAgIGlmIChpdCA9PSBfbUluZGV4VG9IZWxwZXIuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IHRoaXMgY291bGQgcmV0dXJuIGEgY29weSB1c2luZyBwcm9wZXIgcG9pbnRlciBjYXN0LgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXRQYXJhbVZhbHVlKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyID0gZ2V0UGFyYW0oaXgpOworICAgICAgICByZXR1cm4gaGVscGVyID8gaGVscGVyLT52YWx1ZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IF9tUGFyYW1zKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgcXVlcnlTdXBwb3J0ZWRQYXJhbXMgc2lnbmF0dXJlPworICAgICAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PEMyUGFyYW1EZXNjcmlwdG9yPihpdC5zZWNvbmQtPmdldERlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBlcnJvcnMKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXgoQzJQYXJhbTo6SW5kZXggaXgpIHsKKyAgICAgICAgLy8gaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBoZWxwZXIgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzdHJlYW0gc28KKyAgICAgICAgLy8gd2UgY2FuIGxvb2sgdXAgZGlyZWN0bHkgYnkgaW5kZXgKKyAgICAgICAgYXV0byBpdCA9IF9tRGVwZW5kZW5jeUluZGV4LmZpbmQoaXgpOworICAgICAgICByZXR1cm4gaXQgPT0gX21EZXBlbmRlbmN5SW5kZXguZW5kKCkgPyBTSVpFX01BWCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFBhcmFtUmVmLCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+PiBfbVBhcmFtczsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21JbmRleFRvSGVscGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc2l6ZV90PiBfbURlcGVuZGVuY3lJbmRleDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhc1N0cmluZyhDMlBhcmFtICpwKSB7CisgICAgY2hhciBhZGRyWzIwXTsKKyAgICBzcHJpbnRmKGFkZHIsICIlcDpbIiwgcCk7CisgICAgc3RkOjpzdHJpbmcgdiA9IGFkZHI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwLT5zaXplKCk7ICsraSkgeworICAgICAgICBjaGFyIGRbNF07CisgICAgICAgIHNwcmludGYoZCwgIiAlMDJ4IiwgKigoKHVpbnQ4X3QgKilwKSArIGkpKTsKKyAgICAgICAgdiArPSBkICsgKGkgPT0gMCk7CisgICAgfQorICAgIHJldHVybiB2ICsgIl0iOworfQorCit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICA6IG1SZWZsZWN0b3IocmVmbGVjdG9yKSwKKyAgICAgIF9tRmFjdG9yeShzdGQ6Om1ha2Vfc2hhcmVkPEZhY3RvcnlJbXBsPihyZWZsZWN0b3IpKSB7IH0KKworCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OkdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHBhcmFtID0gcmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIHBhcmFtIHN0cnVjdHVyZSBub3QgZGVzY3JpYmVkCisgICAgfQorCisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQgOiAqcGFyYW0pIHsKKyAgICAgICAgc2l6ZV90IGZpZWxkT2Zmc2V0ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZFNpemUgPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpOworICAgICAgICBpZiAob2Zmc2V0IDwgZmllbGRPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID09IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICAvLyBleGFjdCBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQuZXh0ZW50KCkgPT0gMCB8fCBvZmZzZXQgPCBmaWVsZE9mZnNldCArIGZpZWxkU2l6ZSAqIGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAvLyByZWR1Y2UgdG8gZmlyc3QgZWxlbWVudCBpbiBjYXNlIG9mIGFycmF5CisgICAgICAgICAgICBvZmZzZXQgPSBmaWVsZE9mZnNldCArIChvZmZzZXQgLSBmaWVsZE9mZnNldCkgJSBmaWVsZFNpemU7CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSgpID49IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgb2Zmc2V0IGlzIHdpdGhpbiBhIGZpZWxkCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3RvciwgZmllbGQudHlwZSgpICYgfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtIGZpZWxkT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gfm9mZnNldCA/IGZpZWxkT2Zmc2V0ICsgb2Zmc2V0IDogb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6YWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1SZWZsZWN0b3ItPmFkZFN0cnVjdERlc2NyaXB0b3IocGFyYW0tPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwYXJhbS0+dmFsaWRhdGUobVJlZmxlY3Rvcik7CisgICAgaWYgKGVyciAhPSBDMl9DT1JSVVBURUQpIHsKKyAgICAgICAgX21GYWN0b3J5LT5hZGRQYXJhbShwYXJhbSk7CisKKyAgICAgICAgLy8gcnVuIHNldHRlciB0byBlbnN1cmUgY29ycmVjdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpcGFyYW0tPnRyeVNldChwYXJhbS0+dmFsdWUoKS5nZXQoKSwgQzJfTUFZX0JMT0NLLCAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgJmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpjb25maWcoCisgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywgYm9vbCB1cGRhdGVQYXJhbXMsCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyBfX3VudXNlZCAvKiBUT0RPICovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOyAvLyBUT0RPIGlzIHRoaXMgdGhlIHNhbWUgYXMgYmFkIHZhbHVlPworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CYWRWYWx1ZSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CbG9ja2luZyA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1UaW1lZE91dCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Db3JydXB0ZWQgPSBmYWxzZTsKKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIC8vIGRvd24gZGVwZW5kZW5jaWVzIGFyZSBtYXJrZWQgZGlydHksIGJ1dCBwYXJhbXMgc2V0IGFyZSBub3QgaW1tZWRpYXRlbHkKKyAgICAvLyBtYXJrZWQgZGlydHkgKHVubGVzcyB0aGV5IGJlY29tZSBkb3duIGRlcGVuZGVuY3kpIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gYXZvaWQgc2V0dGluZyB0aGVtIGlmIHRoZXkgZGlkIG5vdCBjaGFuZ2UKKworICAgIC8vIFRPRE86IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluZGljZXMgZm9yIHRoZSBzYW1lIGRlcGVuZGVuY3kgaW5kZXgKKyAgICAvLyB7IGRlcEl4LCBwYXJhbUl4IH0gbWF5IGJlIGEgc3VpdGFibGUga2V5CisgICAgc3RkOjptYXA8c2l6ZV90LCBzdGQ6OnBhaXI8QzJQYXJhbTo6SW5kZXgsIGJvb2w+PiBkZXBlbmRlbmNpZXM7CisKKyAgICAvLyB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBsYXN0IHZhbGlkIHBhcmFtZXRlciwgc28gYWRkIGFuIGV4dHJhCisgICAgLy8gbG9vcCBpdGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgcGFyYW1ldGVyCisgICAgZm9yIChzaXplX3QgcF9peCA9IDA7IHBfaXggPD0gcGFyYW1zLnNpemUoKTsgKytwX2l4KSB7CisgICAgICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworICAgICAgICBDMlBhcmFtOjpJbmRleCBwYXJhbUl4ID0gMHU7CisgICAgICAgIHNpemVfdCBwYXJhbURlcEl4ID0gU0laRV9NQVg7CisgICAgICAgIGJvb2wgbGFzdCA9IHBfaXggPT0gcGFyYW1zLnNpemUoKTsKKyAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICBwID0gcGFyYW1zW3BfaXhdOworICAgICAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbUl4ID0gcC0+aW5kZXgoKTsKKyAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChwYXJhbUl4KTsKKyAgICAgICAgICAgIGlmIChwYXJhbURlcEl4ID09IFNJWkVfTUFYKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBmaXJzdCBpbnNlcnQgLSBtYXJrIG5vdCBkaXJ0eQorICAgICAgICAgICAgLy8gaXQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgZGlydHkgYnkgYSBkZXBlbmRlbmN5IHVwZGF0ZQorICAgICAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBvdmVycndyaXRlKCEpCisgICAgICAgICAgICAodm9pZClkZXBlbmRlbmNpZXMuaW5zZXJ0KHsgcGFyYW1EZXBJeCwgeyBwYXJhbUl4LCBmYWxzZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQocGFyYW1EZXBJeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZGVwZW5kZW5jeSBmb3Igc2V0dGluZyBhdCAjIiA8PCBwYXJhbURlcEl4IDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPnNlY29uZC5maXJzdCA8PCAiLCB1cGRhdGUgIgorICAgICAgICAgICAgICAgICAgICA8PCAoaXQtPnNlY29uZC5zZWNvbmQgPyAiYWx3YXlzIChkaXJ0eSkiIDogIm9ubHkgaWYgY2hhbmdlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcHJvY2VzcyBhbnkgcmVtYWluaW5nIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImhhbmRsaW5nIGRpcnR5IGRvd24gZGVwZW5kZW5jaWVzIGFmdGVyIGxhc3Qgc2V0dGluZyI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGFueSBkaXJ0aWVkIGRvd24tZGVwZW5kZW5jaWVzIHVudGlsIHRoZSBuZXh0IHBhcmFtCisgICAgICAgIHdoaWxlIChkZXBlbmRlbmNpZXMuc2l6ZSgpICYmIGRlcGVuZGVuY2llcy5iZWdpbigpLT5maXJzdCA8PSBwYXJhbURlcEl4KSB7CisgICAgICAgICAgICBhdXRvIG1pbiA9IGRlcGVuZGVuY2llcy5iZWdpbigpOworICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggaXggPSBtaW4tPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgIGJvb2wgZGlydHkgPSBtaW4tPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZXJhc2UobWluKTsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJvbGQgdmFsdWUgIiA8PCBhc1N0cmluZyhwYXJhbS0+dmFsdWUoKS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm5ldyB2YWx1ZSAiIDw8IGFzU3RyaW5nKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsYXN0ICYmICFkaXJ0eSAmJiBpeCA9PSBwYXJhbUl4ICYmICpwYXJhbS0+dmFsdWUoKSA9PSAqcCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBpbiB2YWx1ZSAtIGFuZCBkZXBlbmRlbmNpZXMgd2VyZSBub3QgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJpZ25vcmluZyBzZXR0aW5nIHVuY2hhbmdlZCBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBseSBzZXR0aW5nCisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAic2V0dGluZyBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG9sZFZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBwYXJhbS0+dHJ5U2V0KAorICAgICAgICAgICAgICAgICAgICAoIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgPyBwIDogcGFyYW0tPnZhbHVlKCkuZ2V0KCksIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgZmFpbHVyZXMpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG5ld1ZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBDMl9DSEVDS19FUShvbGRWYWx1ZSA9PSBuZXdWYWx1ZSwgKm9sZFZhbHVlID09ICpuZXdWYWx1ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgICAgIGNhc2UgQzJfT0s6IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiBwYXJhbUJhZFZhbHVlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHBhcmFtTm9NZW1vcnkgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX1RJTUVEX09VVDogcGFyYW1UaW1lZE91dCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICBwYXJhbUJsb2NraW5nID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9DT1JSVVBURUQ6IHBhcmFtQ29ycnVwdGVkID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogOy8vIFRPRE8gZmF0YWwKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBiYWNrIHJlc3VsdCBmb3IgY29uZmlndXJlZCB2YWx1ZXMgKG9yIGludmFsaWRhdGUgaWYgaXQgZG9lcyBub3QgZml0IG9yIG1hdGNoKQorICAgICAgICAgICAgaWYgKHVwZGF0ZVBhcmFtcyAmJiAhbGFzdCAmJiBwYXJhbUl4ID09IGl4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFwLT51cGRhdGVGcm9tKCpwYXJhbS0+dmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcGFyZSBwdHJzIGFzIHBhcmFtcyBhcmUgY29weSBvbiB3cml0ZQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInBhcmFtICIgPDwgaXggPDwgIiB2YWx1ZSBjaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBjaGFuZ2VkIHVwZGF0ZSBkb3duLWRlcGVuZGVuY2llcyBhbmQgbWFyayB0aGVtIGRpcnR5CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IHBhcmFtLT5nZXREb3duRGVwZW5kZW5jaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IDE7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW5zZXJ0X3JlcyA9IGRlcGVuZGVuY2llcy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCksIHsgaXgsIHRydWUgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWluc2VydF9yZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKmluc2VydF9yZXMuZmlyc3QpLnNlY29uZC5zZWNvbmQgPSB0cnVlOyAvLyBtYXJrIGRpcnR5CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQoZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfQ0hFQ0soaXQtPnNlY29uZC5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZG93biBkZXBlbmRlbmNpZXMgdG8gdXBkYXRlIGF0ICMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpIDw8ICI6ICIgPDwgaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDoKKyAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIG5vdCBtYXJrZWQgaW4gdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA/IEMyX09LIDoKKyAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID8gQzJfT0sgOiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJxdWVyeWluZyBmaWVsZCAiIDw8IHF1ZXJ5LmZpZWxkKCk7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHF1ZXJ5LmZpZWxkKCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgIGlmICghcGFyYW0pIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIHBhcmFtIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBvZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICBtUmVmbGVjdG9yLCBpeCwKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHF1ZXJ5LmZpZWxkKCkpIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgaWYgKH5vZmZzID09IDApIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiZmllbGQgY291bGQgbm90IGJlIGZvdW5kIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIHJlc29sdmVkIHRvICIKKyAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIkAlMDJ6eCslMDJ4Iiwgb2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpZWxkID0KKyAgICAgICAgICAgIHBhcmFtLT5maW5kRmllbGQob2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBpZiAoIWZpZWxkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBmaWVsZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKnZhbHVlcyA9IG51bGxwdHI7CisgICAgICAgIHN3aXRjaCAocXVlcnkudHlwZSgpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOgorICAgICAgICAgICAgdmFsdWVzID0gZmllbGQtPmdldFN1cHBvcnRlZFZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRQb3NzaWJsZVZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBxdWVyeSB0eXBlOiAiIDw8IHF1ZXJ5LnR5cGUoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgICAgICBxdWVyeS52YWx1ZXMgPSAqdmFsdWVzOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJubyB2YWx1ZXMgcHVibGlzaGVkIGJ5IGNvbXBvbmVudCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IEMySW50ZXJmYWNlSGVscGVyOjpsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+KG1NdXRleCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjOTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApAQCAtMCwwICsxLDEyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXBhcmFtZXRlciIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YWx1ZSIKKworI2RlZmluZSBDMl9MT0dfVkVSQk9TRQorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkUmFuZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc3VwcG9ydGVkIHZhbHVlcyByYW5nZSBjYWxjdWxhdGlvbnMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRlA9c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlciB7CisgICAgLyoqCisgICAgICogdHlwZSBvZiByYW5nZSBzaXplOiBhIC0gYiBpZiBhID49IGIgYW5kIGEgYW5kIGIgYXJlIG9mIHR5cGUgVAorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlIERpZmZUeXBlOworCisgICAgLyoqCisgICAgICogY2FsY3VsYXRlIChoaWdoIC0gbG93KSBtb2Qgc3RlcAorICAgICAqLworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBEaWZmVHlwZShoaWdoIC0gbG93KSAlIERpZmZUeXBlKHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxULCB0cnVlPiB7CisgICAgdHlwZWRlZiBUIERpZmZUeXBlOworCisgICAgc3RhdGljIERpZmZUeXBlIG1vZChUIGxvdywgVCBoaWdoLCBUIHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIGZtb2QoaGlnaCAtIGxvdywgc3RlcCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD46OkMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIF9tTWluID0gdmFsdWVzLnJhbmdlLm1pbi5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbU1heCA9IHZhbHVlcy5yYW5nZS5tYXgucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21TdGVwID0gdmFsdWVzLnJhbmdlLnN0ZXAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21OdW0gPSB2YWx1ZXMucmFuZ2UubnVtLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tRGVub20gPSB2YWx1ZXMucmFuZ2UuZGVub20ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfbU1pbiA9IE1BWF9WQUxVRTsKKyAgICAgICAgX21NYXggPSBNSU5fVkFMVUU7CisgICAgICAgIF9tU3RlcCA9IE1JTl9TVEVQOworICAgICAgICBfbU51bSA9IDA7CisgICAgICAgIF9tRGVub20gPSAwOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgZmFsbCBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKHZhbHVlIDwgX21NaW4gfHwgdmFsdWUgPiBfbU1heCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNpbXBsZSByYW5nZXMgY29udGFpbiBhbGwgdmFsdWVzIGJldHdlZW4gbWluIGFuZCBtYXgKKyAgICBpZiAoaXNTaW1wbGVSYW5nZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBtaW4gaXMgYWx3YXlzIHBhcnQgb2YgdGhlIHJhbmdlCisgICAgaWYgKHZhbHVlID09IF9tTWluKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBzdGVwcGVkIHJhbmdlcyByZXF1aXJlICh2YWwgLSBtaW4pICUgc3RlcCB0byBiZSB6ZXJvCisgICAgaWYgKGlzQXJpdGhtZXRpY1NlcmllcygpKSB7CisgICAgICAgIHJldHVybiBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyPFQ+Ojptb2QoX21NaW4sIHZhbHVlLCBfbVN0ZXApID09IDA7CisgICAgfQorICAgIC8vIHB1cmUgZ2VvbWV0cmljIHNlcmllcyByZXF1aXJlICh2YWwgLyBtaW4pIHRvIGJlIGludGVnZXIgbXVsdGlwbGUgb2YgKG51bS9kZW5vbSkKKyAgICBpZiAoaXNHZW9tZXRyaWNTZXJpZXMoKSkgeworICAgICAgICBpZiAodmFsdWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBsb2cyYmFzZSA9IGxvZzIoX21OdW0gLyBfbURlbm9tKTsKKyAgICAgICAgZG91YmxlIHBvd2VyID0gbGxyb3VuZChsb2cyKHZhbHVlIC8gZG91YmxlKF9tTWluKSkgLyBsb2cyYmFzZSk7CisgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHRoYXQgcmVzdWx0IGZhbGxzIHdpdGhpbiBwcmVjaXNpb24gKG90aGVyIHRoYW4gcm91bmQpCisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBUKF9tTWluICogcG93KF9tTnVtIC8gX21EZW5vbSwgcG93ZXIpICsgTUlOX1NURVAgLyAyKTsKKyAgICB9CisgICAgLy8gbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgcmVxdWlyZSB2YWxpZGF0aW5nIGJ5IHdhbGtpbmcgdGhyb3VnaCB0aGUgc2VyaWVzCisgICAgaWYgKGlzTWFjU2VyaWVzKCkpIHsKKyAgICAgICAgZG91YmxlIGxhc3RWYWx1ZSA9IF9tTWluOworICAgICAgICBkb3VibGUgYmFzZSA9IF9tTnVtIC8gX21EZW5vbTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzdCBpcyBzYWZlIGFzIF9tTWluIDw9IGxhc3RWYWx1ZSA8PSBfbU1heAorICAgICAgICAgICAgaWYgKFQobGFzdFZhbHVlICsgTUlOX1NURVAgLyAyKSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIG5leHRWYWx1ZSA9IGZtYShsYXN0VmFsdWUsIGJhc2UsIF9tU3RlcCk7CisgICAgICAgICAgICBpZiAobmV4dFZhbHVlIDw9IGxhc3RWYWx1ZSB8fCBuZXh0VmFsdWUgPiBfbU1heCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2VyaWVzIGlzIG5vIGxvbmdlciBtb25vdG9uaWMgb3Igd2l0aGluIHJhbmdlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0VmFsdWUgPSBuZXh0VmFsdWU7CisgICAgICAgIH07CisgICAgfQorICAgIC8vIGlmIHdlIGFyZSBoZXJlLCB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCByYW5nZQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD4gQzJTdXBwb3J0ZWRSYW5nZTxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgLy8gVE9ETyAtIHRoaXMgb25seSB3b3JrcyBmb3Igc2ltcGxlIHJhbmdlcworICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bWF4KF9tTWluLCBsaW1pdC5fbU1pbiksIHN0ZDo6bWluKF9tTWF4LCBsaW1pdC5fbU1heCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChfbVN0ZXAsIGxpbWl0Ll9tU3RlcCkpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KKy8vIGZsb2F0IGZsYWdzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgZGVmaW5lIGEgZmV3IG1ldGhvZHMgdG8gc3VwcG9ydCBnZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgY29kZQordGVtcGxhdGU8PgorYm9vbCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6Y29udGFpbnMoZmxvYXQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGZsb2F0PigpOworfQorCit0ZW1wbGF0ZTw+CitDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzOworICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8PgorZmxvYXQgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46Om1pbigpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgY29udGFpbiB0aGUgbWluaW1hbCBtYXNrCisgICAgVCBtaW5NYXNrID0gbWluKCk7CisgICAgaWYgKH52YWx1ZSAmIG1pbk1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAmPSB+bWluTWFzazsKKyAgICAvLyBvdGhlcndpc2UsIHJlbW92ZSBmbGFncyBmcm9tIHZhbHVlIGFuZCBzZWUgaWYgd2UgYXJyaXZlIGF0IDAKKyAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKH52YWx1ZSAmIHYucmVmPFZhbHVlVHlwZT4oKSkgPT0gMCkgeworICAgICAgICAgICAgdmFsdWUgJj0gfnYucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWUgPT0gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkRmxhZ3M8VD46OmZsYWdzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoYzJfbWF4KF9tVmFsdWVzLnNpemUoKSwgMXUpIC0gMSk7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKF9tVmFsdWVzLmNiZWdpbigpICsgMSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCktPlQgeworICAgICAgICAgICAgcmV0dXJuIHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRGbGFnczxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIFQgbWluTWFzayA9IG1pbigpIHwgbGltaXQubWluKCk7CisgICAgLy8gbWluaW11bSBtYXNrIG11c3QgYmUgY292ZXJlZCBieSBib3RoIHRoaXMgYW5kIG90aGVyCisgICAgaWYgKGxpbWl0LmNvbnRhaW5zKG1pbk1hc2spICYmIGNvbnRhaW5zKG1pbk1hc2spKSB7CisgICAgICAgIHZhbHVlc1swXSA9IG1pbk1hc2s7CisgICAgICAgIC8vIGtlZXAgb25seSBmbGFncyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGxpbWl0CisgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXQsIG1pbk1hc2tdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBtaW5NYXNrIHx8ICFsaW1pdC5jb250YWlucyh2YWx1ZSk7IH0pOworICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gZG8gaXQgdmljZSB2ZXJzYQorICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBtaW5NYXNrICYmIGNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soKFZhbHVlVHlwZSl2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBDMlN1cHBvcnRlZEZsYWdzPFQ+OjptaW4oKSBjb25zdCB7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5mcm9udCgpLnRlbXBsYXRlIHJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFQoMCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFZhbHVlU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwKKyAgICAgICAgICAgIFt2YWx1ZV0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICAgICAgfSkgIT0gX21WYWx1ZXMuY2VuZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6dmFsdWVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoX21WYWx1ZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gVCB7CisgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSk7CisgICAgcmV0dXJuIHZhbHM7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykKKyAgICAgICAgOiBfbVR5cGUodmFsdWVzLnR5cGUpLAorICAgICAgICAgIF9tUmFuZ2UodmFsdWVzKSwKKyAgICAgICAgICBfbVZhbHVlcyh2YWx1ZXMpLAorICAgICAgICAgIF9tRmxhZ3ModmFsdWVzKSB7IH0KKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCBfbVR5cGU7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxWYWx1ZVR5cGU+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbUZsYWdzOworCisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsICZpKTsKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW1wbCAmaSk7CisgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsOjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRTogcmV0dXJuIF9tUmFuZ2UuY29udGFpbnModmFsdWUpOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzogcmV0dXJuIF9tVmFsdWVzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzogcmV0dXJuIF9tRmxhZ3MuY29udGFpbnModmFsdWUpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsPih2YWx1ZXMpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46On5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+c3VwcG9ydHModmFsdWUpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgICAgIDogX21QYXJhbUZpZWxkKGZpZWxkKSwKKyAgICAgICAgICBfbVR5cGUodHlwZV90OjpSQU5HRSksCisgICAgICAgICAgX21EZWZpbmVkKGZhbHNlKSwKKyAgICAgICAgICBfbVJhbmdlKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkFueSgpKSwKKyAgICAgICAgICBfbVZhbHVlcyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpOb25lKCkpLAorICAgICAgICAgIF9tRmxhZ3MoQzJTdXBwb3J0ZWRGbGFnczxUPjo6Tm9uZSgpKSB7IH0KKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVZhbHVlcyk7CisgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVJhbmdlKTsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tRmxhZ3MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVFJFU1BBU1MKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLiAqLworICAgIHZvaWQgYW55KCkgeworICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLiAqLworICAgIHZvaWQgbm9uZSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgX21UeXBlID0gdHlwZV90OjpWQUxVRVM7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuICovCisgICAgdm9pZCBlcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHt2YWx1ZX0pKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuICovCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQubGltaXRlZFRvKF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmbGFncworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIGZsYWcgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tRmxhZ3MgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbUZsYWdzID0gX21GbGFncy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyByYW5nZXMgdG8gZmxhZ3MgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbVJhbmdlID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyBmbGFncyB0byByYW5nZXMgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21SYW5nZSA9IF9tUmFuZ2UubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBDMl9EQ0hFQ0soX21WYWx1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5zdGFudGlhdGUoKSBfX3VudXNlZCB7CisgICAgICAgICh2b2lkKV9tVmFsdWVzLnZhbHVlcygpOyAvLyBpbnN0YW50aWF0ZSBub24tY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgY29uc3QgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCB0eXBlX3Q7CisKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CisgICAgYm9vbCBfbURlZmluZWQ7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBfbUZsYWdzOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6b3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAoQzJQYXJhbUZpZWxkVmFsdWVzKSgqX21JbXBsLmdldCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCkKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KGZpZWxkKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjphbnkoKSB7CisgICAgX21JbXBsLT5hbnkoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojpub25lKCkgeworICAgIF9tSW1wbC0+bm9uZSgpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmVxdWFsVG8oVCB2YWx1ZSkgeworICAgIF9tSW1wbC0+ZXF1YWxUbyh2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvdGhlcikKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yPSgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpIHsKKyAgICBfbUltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46On5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKSA6IF9tQ29uZmxpY3RzKCkgeyB9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7Cit9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OndpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OnJldHJpZXZlQ29uZmxpY3RzKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoX21Db25mbGljdHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdC9zQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKSB7CisgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7IEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCB7IHBhcmFtIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbykgeworICAgIHJldHVybiB7IGlzSW5mbyA/IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUUgOiBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwKKyAgICAgICAgICAgICB7IHBhcmFtRmllbGQgfSwgeyB9IH07Cit9CisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpDb25mbGljdCgKKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLCBib29sIGlzSW5mbykgeworICAgIEMyX0NIRUNLKCFjb25mbGljdHMuZW1wdHkoKSk7CisgICAgaWYgKGlzSW5mbykgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShwYXJhbUZpZWxkVmFsdWVzKSwgY29uZmxpY3RzLnJldHJpZXZlQ29uZmxpY3RzKCkKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfQorfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KQorICAgICAgICA6IF9tU3RhdHVzKEMyX0JBRF9WQUxVRSkgeworICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2sobmV3IEMyU2V0dGluZ1Jlc3VsdChzdGQ6Om1vdmUocmVzdWx0KSkpOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6cGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogcmVzdWx0cy5fbVJlc3VsdHMpIHsKKyAgICAgICAgX21SZXN1bHRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocikpOworICAgIH0KKyAgICByZXN1bHRzLl9tUmVzdWx0cy5jbGVhcigpOworICAgIC8vIFRPRE86IG1TdGF0dXMKKyAgICByZXR1cm4gc3RkOjptb3ZlKCp0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnJldHJpZXZlRmFpbHVyZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogX21SZXN1bHRzKSB7CisgICAgICAgIGZhaWx1cmVzLT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgX21SZXN1bHRzLmNsZWFyKCk7CisgICAgcmV0dXJuIF9tU3RhdHVzOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IF9tU3RhdHVzKHN0YXR1cykgeworICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQgb3IgQ09SUlVQVEVECisgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdAorfQorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yIHsKKyAgICAvLy8gcmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW5mbzo6SW1wbD4gR2V0SW1wbChjb25zdCBJbmZvICZpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLl9tSW1wbDsKKyAgICB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCB7CisgICAgQzJGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudDsKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICB1aW50MzJfdCBkZXB0aDsKKyAgICB1aW50MzJfdCBiYXNlRmllbGRPZmZzZXQ7CisgICAgdWludDMyX3QgYXJyYXlPZmZzZXQ7CisgICAgdWludDMyX3QgdXNlZEV4dGVudDsKKworICAgIC8vLyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdCBpbmNsdWRpbmcgY29waWVzIG9mIGl0cyBwYXJlbnQgY2hhaW4KKyAgICBJbXBsIGNsb25lKCkgY29uc3Q7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEltcGw+IENsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmKTsKKworICAgIEltcGwoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkXywgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudF8sCisgICAgICAgICAgICB1aW50MzJfdCBpbmRleF8sIHVpbnQzMl90IGRlcHRoXywgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0XywKKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0XywgdWludDMyX3QgdXNlZEV4dGVudF8pCisgICAgICAgIDogZmllbGQoZmllbGRfKSwgcGFyZW50KHBhcmVudF8pLCBpbmRleChpbmRleF8pLCBkZXB0aChkZXB0aF8pLAorICAgICAgICAgIGJhc2VGaWVsZE9mZnNldChiYXNlRmllbGRPZmZzZXRfKSwgYXJyYXlPZmZzZXQoYXJyYXlPZmZzZXRfKSwgdXNlZEV4dGVudCh1c2VkRXh0ZW50XykgeyB9Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OkNsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmaW5mbykgeworICAgIGlmIChpbmZvKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGluZm8tPmNsb25lKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Y2xvbmUoKSBjb25zdCB7CisgICAgSW1wbCByZXMgPSBJbXBsKCp0aGlzKTsKKyAgICByZXMucGFyZW50ID0gQ2xvbmUocmVzLnBhcmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogX21JbXBsKGltcGwpIHsgfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjphcnJheU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5hcnJheU9mZnNldDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBleHRlbnQoKSAqIHNpemUoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YmFzZUZpZWxkT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmJhc2VGaWVsZE9mZnNldDsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmRlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmRlcHRoOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpleHRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+dXNlZEV4dGVudDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+aW5kZXg7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0FyaXRobWV0aWMoKSBjb25zdCB7CisgICAgc3dpdGNoIChfbUltcGwtPmZpZWxkLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDMkZpZWxkVXRpbHM6OkluZm86OmlzRmxleGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQuZXh0ZW50KCkgPT0gMDsKK30KKworQzJTdHJpbmcgQzJGaWVsZFV0aWxzOjpJbmZvOjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWUoKTsKK30KKworY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpOYW1lZFZhbHVlc1R5cGUgJkMyRmllbGRVdGlsczo6SW5mbzo6bmFtZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQubmFtZWRWYWx1ZXMoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6b2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm8gQzJGaWVsZFV0aWxzOjpJbmZvOjpwYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8oX21JbXBsLT5wYXJlbnQpOworfTsKKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoX21JbXBsLT5maWVsZCk7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6dHlwZV90IEMyRmllbGRVdGlsczo6SW5mbzo6dHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC50eXBlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpJdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgOiBwdWJsaWMgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8vIGltcGxlbWVudHMgb2JqZWN0IGVxdWFsaXR5CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmIG1IZWFkID09IG90aGVyLT5tSGVhZDsKKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGluZm8gcG9pbnRlZCB0byBieSB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2YWx1ZV90eXBlIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEluZm8obUhlYWQpOworICAgIH0KKworICAgIC8vLyBpbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IKKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgICAvLyBub3RlOiB0aGlzIGNhbm5vdCBiZSBhYnN0cmFjdCBhcyB3ZSBpbnN0YW50aWF0ZSB0aGlzIGZvciBMaXN0OjplbmQoKS4gaW5jcmVtZW50IHRvIGVuZCgpCisgICAgICAgIC8vIGluc3RlYWQuCisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBoZWFkKQorICAgICAgICA6IG1IZWFkKGhlYWQpIHsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IG1IZWFkOyAvLy88IGN1cnJlbnQgZmllbGQKK307CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6Okl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6OnZhbHVlX3R5cGUgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0KCk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3ImIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgbUltcGwtPmluY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXF1YWxzKG90aGVyLm1JbXBsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6Okxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJdGVyYXRvcjo6SW1wbD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworfTsKKworQzJGaWVsZFV0aWxzOjpMaXN0OjpMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjpiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpJdGVyYXRvcihtSW1wbC0+YmVnaW4oKSk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjplbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmVuZCgpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgYmFzZSBjbGFzcyBoZWxwZXIgdGhhdCBhbGxvd3MgZGVzY2VuZGluZyBpbnRvIHRoZSBmaWVsZCBoaWVyYXJjaHkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyByZXR1cm5zIHRoZSBiYXNlLWZpZWxkJ3Mgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSBvZmZzZXQgaWYgbm8gcGFyZW50KQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gcGFyZW50KSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbHB0ciA/IHNpemVvZihDMlBhcmFtKSA6IHBhcmVudC0+YmFzZUZpZWxkT2Zmc2V0OworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBmaWVsZCAob3IgdGhlIHBhcmFtKQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50T2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBHZXRPZmZzZXQocGFyZW50LT5maWVsZCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yLAorICAgICAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCA9IG51bGxwdHIpCisgICAgICAgIDogQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbChoZWFkKSwKKyAgICAgICAgICBtUGFyYW1TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgLy8vIHJldHVybnMgYSBsZWFmIGluZm8gb2JqZWN0IGF0IGEgc3BlY2lmaWMgaW5kZXggZm9yIGEgY2hpbGQgZmllbGQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBtYWtlTGVhZigKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCwgdWludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgdWludDMyX3QgcGFyZW50T2Zmc2V0ID0gR2V0UGFyZW50T2Zmc2V0KG1IZWFkKTsKKyAgICAgICAgdWludDMyX3QgYXJyYXlPZmZzZXQgPSBwYXJlbnRPZmZzZXQgKyBHZXRPZmZzZXQoZmllbGQpOworICAgICAgICB1aW50MzJfdCB1c2VkRXh0ZW50ID0gZmllbGQuZXh0ZW50KCkgPyA6CisgICAgICAgICAgICAgICAgKHN0ZDo6bWF4KGFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIGFycmF5T2Zmc2V0KSAvIEdldFNpemUoZmllbGQpOworCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4oCisgICAgICAgICAgICAgICAgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGZpZWxkLCBwYXJlbnRPZmZzZXQgKyBpbmRleCAqIEdldFNpemUoZmllbGQpKSwKKyAgICAgICAgICAgICAgICBtSGVhZCAvKiBwYXJlbnQgKi8sIGluZGV4LCBtSGVhZCA9PSBudWxscHRyID8gMCA6IG1IZWFkLT5kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkKSArIEdldE9mZnNldChmaWVsZCksCisgICAgICAgICAgICAgICAgYXJyYXlPZmZzZXQsIHVzZWRFeHRlbnQpOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBzdHJ1Y3QgaW5kZXggaGF2ZSBiZWVuIHRyYXZlcnNlZCB0byBnZXQgdG8gdGhpcyBmaWVsZAorICAgIGJvb2wgdmlzaXRlZChDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc2QgOiBtSGlzdG9yeSkgeworICAgICAgICAgICAgaWYgKHNkLT5jb3JlSW5kZXgoKSA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtUGFyYW1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtSGlzdG9yeTsgLy8gc3RydWN0dXJlIHR5cGVzIHZpc2l0ZWQKK307CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpIHRoYXQgdmlzaXRzIGVhY2ggYmFzZSBmaWVsZC4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgcGFyYW1ldGVyCisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbS5zaXplKCkpIHsKKyAgICAgICAgZGVzY2VuZEludG8ocGFyYW0uY29yZUluZGV4KCkpOworICAgIH0KKworICAgIC8vLyBlbnVtZXJhdGUgYmFzZSBmaWVsZHMgb2YgYSBmaWVsZAorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcj4gaW1wbCkKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihpbXBsLT5tUmVmbGVjdG9yLCBpbXBsLT5tUGFyYW1TaXplLCBpbXBsLT5tSGVhZCkgeworICAgICAgICBtSGlzdG9yeSA9IGltcGwtPm1IaXN0b3J5OworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgZGVzY2VuZEludG8oaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yIGJ5IHZpc2l0aW5nIGVhY2ggYmFzZSBmaWVsZC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBkb24ndCBnbyBwYXN0IGVuZAorICAgICAgICBpZiAobUhlYWQgPT0gbnVsbHB0ciB8fCBfbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXNjZW5kIGludG8gc3RydWN0dXJlcworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICAvLyBkbyBub3QgcmVjdXJzZSBpbnRvIHRoZSBzYW1lIHN0cnVjdHMKKyAgICAgICAgICAgIGlmICghdmlzaXRlZChpbmRleCkgJiYgZGVzY2VuZEludG8oaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXNjZW5kIGFmdGVyIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICB3aGlsZSAoIW1IaXN0b3J5LmVtcHR5KCkgJiYgX21GaWVsZHMuYmFjaygpID09IG1IaXN0b3J5LmJhY2soKS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbUhlYWQtPnBhcmVudDsKKyAgICAgICAgICAgIG1IaXN0b3J5LnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfbUZpZWxkcy5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG9uZSBpZiBoaXN0b3J5IGlzIG5vdyBlbXB0eQorICAgICAgICBpZiAoX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gd2UgY291bGQgYmUgdHJhdmVyc2luZyBhIHN1Yi10cmVlIHNvIGNsZWFyIGhlYWQKKyAgICAgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIG5leHQgPSBfbUZpZWxkcy5iYWNrKCk7CisgICAgICAgIG1IZWFkLT5maWVsZCA9IE9mZnNldEZpZWxkRGVzY3JpcHRvcigqbmV4dCwgR2V0UGFyZW50T2Zmc2V0KG1IZWFkLT5wYXJlbnQpKTsKKyAgICAgICAgbUhlYWQtPmluZGV4ID0gMDsgLy8gcmVzZXQgaW5kZXgganVzdCBpbiBjYXNlIGZvciBjb3JyZWN0bmVzcworICAgICAgICBtSGVhZC0+YmFzZUZpZWxkT2Zmc2V0ID0gR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkLT5wYXJlbnQpICsgR2V0T2Zmc2V0KCpuZXh0KTsKKyAgICAgICAgbUhlYWQtPmFycmF5T2Zmc2V0ID0gR2V0T2Zmc2V0KG1IZWFkLT5maWVsZCk7CisgICAgICAgIG1IZWFkLT51c2VkRXh0ZW50ID0gbUhlYWQtPmZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChtSGVhZC0+YXJyYXlPZmZzZXQsIG1QYXJhbVNpemUpIC0gbUhlYWQtPmFycmF5T2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyBHZXRTaXplKG1IZWFkLT5maWVsZCk7CisgICAgICAgICsrX21GaWVsZHMuYmFjaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCBpdCBkb2VzIG5vdAorICAgIC8vLyBtb2RpZnkgdGhpcyBpdGVyYXRvciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGRlc2NlbmRJbnRvKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisgICAgICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIGZpcnN0ID0gZGVzYy0+YmVnaW4oKTsKKyAgICAgICAgICAgIG1IZWFkID0gbWFrZUxlYWYoKmZpcnN0LCAwIC8qIGluZGV4ICovKTsKKyAgICAgICAgICAgIF9tRmllbGRzLmVtcGxhY2VfYmFjaygrK2ZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gbmV4dCBmaWVsZCBwb2ludGVycyBmb3IgZWFjaCBkZXB0aC4KKyAgICAvLy8gbm90ZTogX21GaWVsZHMgbWF5IGJlIHNob3J0ZWQgdGhhbiBtSGlzdG9yeSwgaWYgaXRlcmF0aW5nIGF0IGEgZGVwdGgKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZSA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+KCpfbVBhcmFtLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21QYXJhbSgmcGFyYW0pLCBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW0gKl9tUGFyYW07CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlPihwYXJhbSwgcmVmbGVjdG9yKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGUgc2libGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgeworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiAmaW5mbywgc2l6ZV90IGxldmVsKQorICAgICAgICAgIC8vIGNsb25lIGluZm8gY2hhaW4gYXMgdGhpcyBpdGVyYXRvciB3aWxsIGNoYW5nZSBpdAorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShpbmZvKSkgeworICAgICAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgcGFyZW50IGNoYWluICh1cCB0byBsZXZlbCkgZm9yIHF1aWNrIGFjY2VzcworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBub2RlID0gbUhlYWQ7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoOyBpeCA8IGxldmVsICYmIG5vZGU7ICsraXgpIHsKKyAgICAgICAgICAgIG5vZGUtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIF9tUGF0aC5lbXBsYWNlX2JhY2sobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgICAgICB9CisgICAgICAgIHNldHVwUGF0aChpeCk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGluZGV4LgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIHdoaWxlIChpeCA8IF9tUGF0aC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICgrK19tUGF0aFtpeF0tPmluZGV4IDwgX21QYXRoW2l4XS0+dXNlZEV4dGVudCkgeworICAgICAgICAgICAgICAgIHNldHVwUGF0aChpeCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9tUGF0aFtpeCsrXS0+aW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBhZGp1c3RzIGZpZWxkIG9mZnNldHMgYWxvbmcgdGhlIHBhdGggdXAgdG8gdGhlIHNwZWNpZmljIGxldmVsIC0gMS4KKyAgICAvLy8gVGhpcyBpbi1mYWN0IGhhcyB0byBiZSBkb25lIGRvd24gdGhlIHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgYXMgY2hpbGQgZmllbGRzIG11c3QKKyAgICAvLy8gZmFsbCB3aXRoaW4gcGFyZW50IGZpZWxkcy4KKyAgICB2b2lkIHNldHVwUGF0aChzaXplX3QgbGV2ZWwpIHsKKyAgICAgICAgQzJfQ0hFQ0tfTEUobGV2ZWwsIF9tUGF0aC5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBvbGRBcnJheU9mZnNldCA9IGxldmVsID8gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IDogMCAvKiB1bnVzZWQgKi87CisgICAgICAgIHdoaWxlIChsZXZlbCkgeworICAgICAgICAgICAgLS1sZXZlbDsKKyAgICAgICAgICAgIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCAmcGF0aCA9ICpfbVBhdGhbbGV2ZWxdOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IEdldFNpemUocGF0aC5maWVsZCk7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBwYXRoLmFycmF5T2Zmc2V0ICsgc2l6ZSAqIHBhdGguaW5kZXg7CisgICAgICAgICAgICBTZXRPZmZzZXQocGF0aC5maWVsZCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNoaWxkJ3MgYXJyYXkgb2Zmc2V0IHRvIGZhbGwgd2l0aGluIGN1cnJlbnQgaW5kZXgsIGJ1dCBob2xkIG9udG8gdGhlCisgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGFycmF5T2Zmc2V0IHNvIHRoYXQgd2UgY2FuIGFkanVzdCBzdWJzZXF1ZW50IGNoaWxkcmVuLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxvIGlzIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hpbGRBcnJheU9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIChfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgLSBvbGRBcnJheU9mZnNldCkgJSBzaXplOworICAgICAgICAgICAgICAgIG9sZEFycmF5T2Zmc2V0ID0gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0OworICAgICAgICAgICAgICAgIF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA9IGNoaWxkQXJyYXlPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPj4gX21QYXRoOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcj4oX21IZWFkLCBfbUxldmVsKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKQorICAgICAgICA6IF9tSGVhZChDMkZpZWxkVXRpbHM6Ol9JbnNwZWN0b3I6OkdldEltcGwoZmllbGQpKSwgX21MZXZlbChsZXZlbCkgeyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21IZWFkOworICAgIHNpemVfdCBfbUxldmVsOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVDb3VzaW5zKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKSB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6TGlzdChzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZT4oZmllbGQsIGxldmVsKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgeworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbVNpemUpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpIHsKKyAgICAgICAgd2hpbGUgKGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgaWYgKChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChtSGVhZC0+ZmllbGQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgbUhlYWQgPSBfbVRhaWw7CisgICAgICAgIF9tVGFpbCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBJZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIGtub3duLCB2YWxpZCAodW50cmF2ZXJzZWQpIHN0cnVjdHVyZSwgaXQgbW9kaWZpZXMgdGhpcyBpdGVyYXRvcgorICAgIC8vLyB0byBwb2ludCB0byB0aGUgZmllbGQgYXQgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIGdpdmVuIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMKKyAgICAvLy8gdHJ1ZS4gT3RoZXJ3aXNlLCBpbmNsdWRpbmcgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMgaW4gdGhlIHN0cnVjdHVyZSwgaXQgZG9lcyBub3QgbW9kaWZ5IHRoaXMKKyAgICAvLy8gaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgYm91bmRhcmllcyBvZiB0aGUgZmllbGQgdG8gYmUgbG9jYXRlZCBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudAorICAgICAgICAvLyBmaWVsZAorICAgICAgICBpZiAobUhlYWQgIT0gX21UYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaWVsZCB1c2luZyBhIGR1bW15IGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yIGR1bW15ID0geworICAgICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpCTE9CLCAxIC8qIGV4dGVudCAqLywgIm5hbWUiLAorICAgICAgICAgICAgICAgIEdldE9mZnNldChfbUZpZWxkKSAtIHBhcmVudE9mZnNldCwgR2V0U2l6ZShfbUZpZWxkKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gbG9jYXRlIGZpcnN0IGZpZWxkIHdoZXJlIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gZHVtbXkgb2Zmc2V0ICh3aGljaCBpcyBvbmUgcGFzdCkKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5jYmVnaW4oKSwgZGVzYy0+Y2VuZCgpLCBkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmEsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZiKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChhKSA8IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBkZXNjLT5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZmllbGQgaXMgcHJpb3IgdG8gZmlyc3QgZmllbGQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkID0gKml0OworCisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGR1bW15IGVuZC1vZmZzZXQgaXMgd2l0aGluIHRoaXMgZmllbGQKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cnVjdFNpemUgPSBzdGQ6Om1heChtUGFyYW1TaXplLCBwYXJlbnRPZmZzZXQpIC0gcGFyZW50T2Zmc2V0OworICAgICAgICAgICAgaWYgKEdldEVuZE9mZnNldChkdW1teSkgPiBHZXRFbmRPZmZzZXQoZmllbGQsIHN0cnVjdFNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4ID0gKEdldE9mZnNldChkdW1teSkgLSBHZXRPZmZzZXQoZmllbGQpKSAvIEdldFNpemUoZmllbGQpOworICAgICAgICAgICAgdWludDMyX3QgZW5kSW5kZXggPQorICAgICAgICAgICAgICAgIChHZXRFbmRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSArIEdldFNpemUoZmllbGQpIC0gMSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChlbmRJbmRleCA+IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWVsZCBzaXplIGNvdWxkIGJlIHplcm8sIGluIHdoaWNoIGNhc2UgZW5kIGluZGV4IGlzIHN0aWxsIG9uIHN0YXJ0IGluZGV4LgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBhbGwgb3RoZXIgY2FzZXMsIGVuZEluZGV4IHdhcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGluZGV4LCBzbworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBpdC4KKyAgICAgICAgICAgICAgICAtLWVuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gc3RhcnRMZWFmID0KKyAgICAgICAgICAgICAgICBtYWtlTGVhZihmaWVsZCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT0gc3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX21UYWlsID0gbWFrZUxlYWYoZmllbGQsIGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21UYWlsOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgbG9jYXRlRmllbGQoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24gOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcj4oCisgICAgICAgICAgICAgICAgX21JbmRleCwgX21GaWVsZCwgX21QYXJhbVNpemUsIF9tUmVmbGVjdG9yKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChDMlBhcmFtOjpDb3JlSW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHBmKSkpLAorICAgICAgICAgIF9tRmllbGQoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmKSksCisgICAgICAgICAgX21QYXJhbVNpemUoMCksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChwYXJhbS5jb3JlSW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZChmaWVsZCksCisgICAgICAgICAgX21QYXJhbVNpemUocGFyYW0uc2l6ZSgpKSwKKyAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIEMyUGFyYW06OkNvcmVJbmRleCBfbUluZGV4OworICAgIF9DMkZpZWxkSWQgX21GaWVsZDsKKyAgICB1aW50MzJfdCBfbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7Cit9OworCit9CisKK3N0ZDo6dmVjdG9yPEMyRmllbGRVdGlsczo6SW5mbz4gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7IHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGYsIHJlZmxlY3RvcikgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGFyYW0sIGZpZWxkLCByZWZsZWN0b3IpCisgICAgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fIC8vIHRvIGJlIGFibGUgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGRlZmluZWQKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc2l6ZV90IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKEMyU3RyaW5nTGl0ZXJhbCBhKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhW2ldID09ICdfJykgeworICAgICAgICArK2k7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitzdGF0aWMgc2l6ZV90IGNvdW50TWF0Y2hpbmcoQzJTdHJpbmdMaXRlcmFsIGEsIGNvbnN0IEMyU3RyaW5nICZiKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghYVtpXSB8fCBhW2ldICE9IGJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiLnNpemUoKTsKK30KKworLy8gQUJDRGVmID0+IGFiYy1kZWYKKy8vIEFCQ0QyZWYgPT4gYWJjZDItZWYgLy8gMAorLy8gQUJDRDJFZiA9PiBhbmNkMi1lZiAvLyAtMQorLy8gQWJjRGVmID0+IGFiYy1kZWYgLy8gLTEKKy8vIEFiYzJEZWYgPT4gYWJjLTJkZWYKKy8vIEFiYzJkZWYgPT4gYWJjLTItZGVmCisvLyBfWW8gPT4gX3lvCisvLyBfeW8gPT4gX3lvCisvLyBDMl95byA9PiBjMi15bworLy8gQzJfX3lvID0+IGMyLXlvCisKKy8vc3RhdGljCitDMlN0cmluZyBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpIHsKKyAgICBlbnVtIHsKKyAgICAgICAga05vbmUgPSAnLicsCisgICAgICAgIGtMb3dlciA9ICdhJywKKyAgICAgICAga1VwcGVyID0gJ0EnLAorICAgICAgICBrRGlnaXQgPSAnMScsCisgICAgICAgIGtEYXNoID0gJy0nLAorICAgICAgICBrVW5kZXJzY29yZSA9ICdfJywKKyAgICB9IHR5cGUgPSBrTm9uZTsKKyAgICBzaXplX3Qgd29yZF9zdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG5hbWUuc2l6ZSgpOyArK2l4KSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBuYW1lLnN1YnN0cigwLCB3b3JkX3N0YXJ0KSA8PCAifCIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cih3b3JkX3N0YXJ0LCBpeCAtIHdvcmRfc3RhcnQpIDw8ICJbIgorICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKGl4LCAxKSA8PCAiXSIgPDwgbmFtZS5zdWJzdHIoaXggKyAxKQorICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGNoYXIpdHlwZTsKKyAgICAgICAgaWYgKGlzdXBwZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVbaXhdID0gdG9sb3dlcihuYW1lW2l4XSk7CisgICAgICAgICAgICB0eXBlID0ga1VwcGVyOworICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGlnaXQgJiYgaXggPiAwKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1VwcGVyICYmIGl4ID4gd29yZF9zdGFydCArIDEpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrIC0gMSwgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtMb3dlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0ga0RpZ2l0OworICAgICAgICB9IGVsc2UgaWYgKG5hbWVbaXhdID09ICdfJykgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Rhc2gpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmVyYXNlKGl4LS0sIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IGtOb25lICYmIHR5cGUgIT0ga1VuZGVyc2NvcmUpIHsKKyAgICAgICAgICAgICAgICBuYW1lW2l4XSA9ICctJzsKKyAgICAgICAgICAgICAgICB0eXBlID0ga0Rhc2g7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtVbmRlcnNjb3JlOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lLnJlc2l6ZShpeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICI9PiAiIDw8IG5hbWU7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vc3RhdGljCitzdGQ6OnZlY3RvcjxDMlN0cmluZz4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCkgeworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lczsKKyAgICBDMlN0cmluZyBwcmVmaXg7CisgICAgc2l6ZV90IGV4dHJhVW5kZXJzY29yZXMgPSAwOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChfcHJlZml4KSB7CisgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhfcHJlZml4KTsKKyAgICAgICAgcHJlZml4ID0gX3ByZWZpeCArIGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgcHJlZml4IGFuZCBtaW5pbXVtIGxlYWRpbmcgdW5kZXJzY29yZXMKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIHByZWZpeCA9IHMgKyB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgbWF0Y2hpbmcgPSBjb3VudE1hdGNoaW5nKAorICAgICAgICAgICAgICAgIHMgKyB1bmRlcnNjb3JlcywKKyAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgICAgICAgICAgcHJlZml4LnJlc2l6ZShtYXRjaGluZyk7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gc3RkOjptaW4odW5kZXJzY29yZXMsIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICAgICAgaWYgKHByZWZpeC5zaXplKCkgPT0gMCAmJiBleHRyYVVuZGVyc2NvcmVzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2Ugc3dhbGxvdyB0aGUgZmlyc3QgdW5kZXJzY29yZSBhZnRlciB1cHBlciBjYXNlIHByZWZpeGVzCisgICAgYm9vbCB1cHBlckNhc2VQcmVmaXggPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZml4LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpc2xvd2VyKHByZWZpeFtpXSkpIHsKKyAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7CisgICAgICAgIEMyU3RyaW5nIHNhbml0aXplZCA9IEMyU3RyaW5nKHMsIHVuZGVyc2NvcmVzIC0gZXh0cmFVbmRlcnNjb3Jlcyk7CisgICAgICAgIHNhbml0aXplZC5hcHBlbmQocyArIHByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3JlcyArCisgICAgICAgICAgICAgICAgICAgICh1cHBlckNhc2VQcmVmaXggJiYgc1twcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXNdID09ICdfJykpOworICAgICAgICBzYW5pdGl6ZWROYW1lcy5wdXNoX2JhY2soY2FtZWxDYXNlVG9EYXNoZWQoc2FuaXRpemVkKSk7CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZyBzIDogc2FuaXRpemVkTmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgfQorCisgICAgcmV0dXJuIHNhbml0aXplZE5hbWVzOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6cGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gZm91bmROYW1lczsKKyAgICBzaXplX3QgcG9zID0gMCwgbGVuID0gc3RybGVuKHZhbHVlKTsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBlbmRQb3MgPSBzdHJjc3BuKHZhbHVlICsgcG9zLCAiICw9IikgKyBwb3M7CisgICAgICAgIGlmIChlbmRQb3MgPiBwb3MpIHsKKyAgICAgICAgICAgIGZvdW5kTmFtZXMuZW1wbGFjZV9iYWNrKHZhbHVlICsgcG9zLCBlbmRQb3MgLSBwb3MpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZVtlbmRQb3NdICYmIHZhbHVlW2VuZFBvc10gIT0gJywnKSB7CisgICAgICAgICAgICBlbmRQb3MgKz0gc3RyY3Nwbih2YWx1ZSArIGVuZFBvcywgIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBzdHJzcG4odmFsdWUgKyBlbmRQb3MsICIgLCIpICsgZW5kUG9zOworICAgIH0gd2hpbGUgKHBvcyA8IGxlbik7CisgICAgcmV0dXJuIGZvdW5kTmFtZXM7Cit9CisKKy8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorLy9zdGF0aWMKK0MyUGFyYW0gKkMyUGFyYW1VdGlsczo6UGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICBDMlBhcmFtICpwYXJhbSA9IChDMlBhcmFtKilibG9iOworICAgIGlmIChwYXJhbS0+c2l6ZSgpID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li45ZDE4M2Q0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMwLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw3ICsxNDgsOSBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIHByb2ZpbGUgKyAxKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKICAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKQEAgLTE3NCwyOSArMTczLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjA0LDEzICsyMDQsMTIgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIxOSw4ICsyMTgsOCBAQAogY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CiAKIEFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKQEAgLTIyOCw3ICsyMjcsNiBAQAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKIH0KQEAgLTIzOSw3ICsyMzcsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKQEAgLTI0OSwzMCArMjQ3LDI1IEBACiAgICAgfQogCiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI4Miw3ICsyNzUsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwogCkBAIC0yOTIsMTMgKzI4NSwxMyBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgZnJhbWVTaXplV2l0aG91dEhlYWRlciwgaGVhZGVyU2l6ZTsKICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChtRGF0YVNvdXJjZSwgbU9mZnNldCwgJmhlYWRlclNpemUpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsMzcgKzMwMCwzOSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IG1GcmFtZUR1cmF0aW9uVXM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXAobmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBvZmZzZXQpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCiAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTM2NCw3ICszNTksNyBAQAogCiAgICAgdWludDhfdCBoZWFkZXJbMl07CiAKLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMzgzLDE3ICszNzgsMjEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYWFjIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI0ZmQ4MGVhZS0wM2QyLTRkNzItOWViOS00OGZhNmJiNTQ2MTMiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiQUFDIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKaW5kZXggOWRhZGJlZC4uNjQzZDNmNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKQEAgLTE4LDggKzE4LDkgQEAKIAogI2RlZmluZSBBQUNfRVhUUkFDVE9SX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CkBAIC01NSw3ICs1Niw3IEBACiB9OwogCiBib29sIFNuaWZmQUFDKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA3YzU2Yzk3Li5hNTgxNjdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCmluZGV4IGJlYTZmMWQuLmZmZWZmNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTMxLDI5ICsyOSwyOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHB1YmxpYzoKICAgICBBTVJTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgYm9vbCBpc1dpZGUsCiAgICAgICAgICAgICBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBib29sIG1Jc1dpZGU7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CkBAIC05OCwyNyArOTYsMjcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKICAgICB1aW50OF90IGhlYWRlcjsKICAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgKmZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKICAgICBpZiAoKmZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdGljIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0FNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKDApIHsKQEAgLTE1MywxMiArMTUxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOwogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplOwpAQCAtMTY2LDExICsxNjQsMTEgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKIAogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc3RyZWFtU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7Ci0gICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTg1LDMwICsxODMsMzMgQEAKICAgICAgICAgICAgIG51bUZyYW1lcyArKzsKICAgICAgICAgfQogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiAiYXVkaW8vYW1yIik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjE3LDE5ICsyMTgsMTggQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFNUlNvdXJjZTo6QU1SU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKQEAgLTI1MCwzNSArMjUwLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKDEyOCkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigxMjgpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI5Niw3ICsyOTEsNyBAQAogICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zMDksNyArMzA0LDcgQEAKICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsICZoZWFkZXIsIDEpOwogCiAgICAgaWYgKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgaWYgKGhlYWRlciAmIDB4ODMpIHsKQEAgLTMxNywyMCArMzEyLDIwIEBACiAKICAgICAgICAgQUxPR0UoInBhZGRpbmcgYml0cyBtdXN0IGJlIDAsIGhlYWRlciBpcyAweCUwMngiLCBoZWFkZXIpOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CiAKICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsIEZUKTsKICAgICBpZiAoZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGZyYW1lU2l6ZSk7CkBAIC0zNDAsNTAgKzMzNSw2MyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KICAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYW1yIiwKKyAgICAiYXdiIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJjODY2MzljOS0yZjMxLTQwYWMtYTcxNS1mYTAxYjQ0OTNhYWYiKSwKICAgICAgICAgMSwKICAgICAgICAgIkFNUiBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmQU1SKHNvdXJjZSwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmQU1SKCZoZWxwZXIsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgIH0sCisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAppbmRleCBjOTBiMzI1Li5iNzZlZTljIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApAQCAtMTksOCArMTksOSBAQAogI2RlZmluZSBBTVJfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogY2xhc3MgU3RyaW5nODsKICNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKIAotY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFNUkV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbUlzV2lkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKaW5kZXggYjJmYjg4MC4uNGJkOTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDQyNDJkNzYuLjNhM2QwNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCkBAIC04LDEzICs4LDE3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYmZsYWNleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCmluZGV4IGNjZjgwZDAuLjg4NTQ2MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTI0LDQxICsyNCw1NiBAQAogLy8gbGliRkxBQyBwYXJzZXIKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9kZWNvZGVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBXQVZFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBGTEFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKQEAgLTc1LDE0ICs5MCwxNSBAQAogCiBwdWJsaWM6CiAgICAgZW51bSB7Ci0gICAgICAgIGtNYXhDaGFubmVscyA9IDgsCisgICAgICAgIGtNYXhDaGFubmVscyA9IEZDQ184LAogICAgIH07CiAKICAgICBleHBsaWNpdCBGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgLy8gSWYgbWV0YWRhdGEgcG9pbnRlcnMgYXJlbid0IHByb3ZpZGVkLCB3ZSBkb24ndCBmaWxsIHRoZW0KLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEgPSAwLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEgPSAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEgPSAwLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEgPSAwKTsKIAogICAgIHZpcnR1YWwgfkZMQUNQYXJzZXIoKTsKIApAQCAtMTA4LDI0ICsxMjQsMjUgQEAKICAgICB9CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgdm9pZCByZWxlYXNlQnVmZmVycygpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcigpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcigpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIoZmFsc2UsIDBMTCk7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcih0cnVlLCBzYW1wbGUpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICptRmlsZU1ldGFkYXRhOwotICAgIE1ldGFEYXRhQmFzZSAqbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogCiAgICAgLy8gbWVkaWEgYnVmZmVycwogICAgIHNpemVfdCBtTWF4QnVmZmVyU2l6ZTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOwogICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7CiAKICAgICAvLyBoYW5kbGUgdG8gdW5kZXJseWluZyBsaWJGTEFDIHBhcnNlcgpAQCAtMTQ5LDcgKzE2Niw3IEBACiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAogICAgIHN0YXR1c190IGluaXQoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKIAogICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAogICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKQEAgLTE2OSw2ICsxODYsNyBAQAogICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKICAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKICAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisgICAgc2l6ZV90IGdldE91dHB1dFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOyB9CiAKICAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKICAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKQEAgLTM2NCw5ICszODIsOCBAQAogICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFOgogICAgICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9QaWN0dXJlICpwID0gJm1ldGFkYXRhLT5kYXRhLnBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGE6OlRZUEVfTk9ORSwgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBwLT5taW1lX3R5cGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMzgxLDEyMiArMzk4LDYxIEBACiAgICAgbUVycm9yU3RhdHVzID0gc3RhdHVzOwogfQogCi0vLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IHNpZ25lZAorLy8gb3IgMzItYml0IGZsb2F0IGludGVybGVhdmVkLgorLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRvIGF1ZGlvX3V0aWxzLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2g4KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gxNihpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgICAgICAqZHN0KysgPSBmbG9hdF9mcm9tX2kzMihzcmNbY11baV0gPDwgbGVmdFNoaWZ0KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLQotc3RhdGljIHZvaWQgY29weU1vbm8yNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcygKLSAgICAgICAgaW50MTZfdCAqIC8qIGRzdCAqLywKLSAgICAgICAgY29uc3QgaW50ICpbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSAvKiBzcmMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5TYW1wbGVzICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBUUkVTUEFTUygpOwotfQotCiAvLyBGTEFDUGFyc2VyCiAKIEZMQUNQYXJzZXI6OkZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbUZpbGVNZXRhZGF0YShmaWxlTWV0YWRhdGEpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKICAgICAgIG1NYXhCdWZmZXJTaXplKDApLAogICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbUNvcHkoY29weVRyZXNwYXNzKSwKICAgICAgIG1EZWNvZGVyKE5VTEwpLAogICAgICAgbUN1cnJlbnRQb3MoMExMKSwKICAgICAgIG1FT0YoZmFsc2UpLApAQCAtNTY3LDggKzUyMywxMCBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSBub3QgZXhwZWN0ZWQgZm9yIEZMQUMKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm90ZTogaW50ZXJuYWxseSB0aGUgRkxBQyBleHRyYWN0b3Igc3VwcG9ydHMgMi0zMiBiaXRzLgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIGJpdHMgcGVyIHNhbXBsZSAldSIsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQpAQCAtNTg1LDcxICs1NDMsNTMgQEAKICAgICAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgY2FzZSA4ODIwMDoKICAgICAgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIGNhc2UgMTkyMDAwOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHdlIHN1cHBvcnQgYXJiaXRyYXJ5IHNhbXBsZSByYXRlcyBmcm9tIDhrSHogdG8gMTkya0h6LgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICV1IiwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1DaGFubmVsczsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICAgICAgfSB0YWJsZVtdID0gewotICAgICAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgIH0sCi0gICAgICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgfSwKLSAgICAgICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICB9LAotICAgICAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2IH0sCi0gICAgICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCB9LAotICAgICAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgICAgICB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZVtpXS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgICAgICBtQ29weSA9IHRhYmxlW2ldLm1Db3B5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHBvcHVsYXRlIHRyYWNrIG1ldGFkYXRhCiAgICAgICAgIGlmIChtVHJhY2tNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycygpCit2b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkKIHsKICAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKG1NYXhCdWZmZXJTaXplKSk7CisgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtTWF4QnVmZmVyU2l6ZSk7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG1NYXhCdWZmZXJTaXplKTsKIH0KIAogdm9pZCBGTEFDUGFyc2VyOjpyZWxlYXNlQnVmZmVycygpCiB7Ci0gICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKIH0KIAotTWVkaWFCdWZmZXJCYXNlICpGTEFDUGFyc2VyOjpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKQorTWVkaWFCdWZmZXJIZWxwZXIgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCiB7CiAgICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKICAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKQEAgLTY4Niw0MSArNjI2LDUzIEBACiAgICAgfQogICAgIC8vIGFjcXVpcmUgYSBtZWRpYSBidWZmZXIKICAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CiAgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7Ci0gICAgaW50MTZfdCAqZGF0YSA9IChpbnQxNl90ICopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGJ1ZmZlclNpemUpOwogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3VyIG1lZGlhIGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShkYXRhLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5VG8xNlNpZ25lZChyZWludGVycHJldF9jYXN0PHNob3J0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgIC8vIGZpbGwgaW4gYnVmZmVyIG1ldGFkYXRhCiAgICAgQ0hFQ0sobVdyaXRlSGVhZGVyLm51bWJlcl90eXBlID09IEZMQUNfX0ZSQU1FX05VTUJFUl9UWVBFX1NBTVBMRV9OVU1CRVIpOwogICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGVOdW1iZXIgPSBtV3JpdGVIZWFkZXIubnVtYmVyLnNhbXBsZV9udW1iZXI7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAoMTAwMDAwMExMICogc2FtcGxlTnVtYmVyKSAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAogLy8gRkxBQ3NvdXJjZQogCiBGTEFDU291cmNlOjpGTEFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbVBhcnNlcigwKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKKyAgICAgIG1QYXJzZXIobmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIG91dHB1dEZsb2F0LCAwLCBtVHJhY2tNZXRhZGF0YSkpLAorICAgICAgbUluaXRDaGVjayhtUGFyc2VyLT5pbml0Q2hlY2soKSksCiAgICAgICBtU3RhcnRlZChmYWxzZSkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOwotICAgIC8vIHJlLXVzZSB0aGUgc2FtZSB0cmFjayBtZXRhZGF0YSBwYXNzZWQgaW50byBjb25zdHJ1Y3RvciBmcm9tIEZMQUNFeHRyYWN0b3IKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UpOwotICAgIG1Jbml0Q2hlY2sgID0gbVBhcnNlci0+aW5pdENoZWNrKCk7CiB9CiAKIEZMQUNTb3VyY2U6On5GTEFDU291cmNlKCkKQEAgLTczMiwxOCArNjg0LDE4IEBACiAgICAgZGVsZXRlIG1QYXJzZXI7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0gICAgbVBhcnNlci0+YWxsb2NhdGVCdWZmZXJzKCk7CisgICAgbVBhcnNlci0+YWxsb2NhdGVCdWZmZXJzKG1CdWZmZXJHcm91cCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0b3AiKTsKIApAQCAtNzUxLDE5ICs3MDMsMjMgQEAKICAgICBtUGFyc2VyLT5yZWxlYXNlQnVmZmVycygpOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQogewotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CkBAIC03ODQsMjAgKzc0MCwyMiBAQAogICAgICAgICBidWZmZXIgPSBtUGFyc2VyLT5yZWFkQnVmZmVyKCk7CiAgICAgfQogICAgICpvdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogLy8gRkxBQ0V4dHJhY3RvcgogCiBGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVBhcnNlcihudWxscHRyKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICAvLyBGTEFDUGFyc2VyIHdpbGwgZmlsbCBpbiB0aGUgbWV0YWRhdGEgZm9yIHVzCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCAmbUZpbGVNZXRhZGF0YSwgJm1UcmFja01ldGFkYXRhKTsKKyAgICBtRmlsZU1ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1UcmFja01ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgZmFsc2UgLyogb3V0cHV0RmxvYXQgKi8sIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbVBhcnNlci0+aW5pdENoZWNrKCk7CiB9CiAKQEAgLTgwNSw2ICs3NjMsOSBAQAogewogICAgIEFMT0dWKCJ+RkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwogICAgIGRlbGV0ZSBtUGFyc2VyOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YWRhdGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobVRyYWNrTWV0YWRhdGEpOwogfQogCiBzaXplX3QgRkxBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKQpAQCAtODEyLDQyICs3NzMsNzYgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UobURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhKTsKKworICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZSgKKyAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKSk7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtRmlsZU1ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhZGF0YSk7CiB9CiAKIC8vIFNuaWZmZXIKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCitib29sIFNuaWZmRkxBQyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewotICAgIC8vIGZpcnN0IDQgaXMgdGhlIHNpZ25hdHVyZSB3b3JkCi0gICAgLy8gc2Vjb25kIDQgaXMgdGhlIHNpemVvZiBTVFJFQU1JTkZPCi0gICAgLy8gMDQyIGlzIHRoZSBtYW5kYXRvcnkgU1RSRUFNSU5GTwotICAgIC8vIG5vIG5lZWQgdG8gcmVhZCByZXN0IG9mIHRoZSBoZWFkZXIsIGFzIGEgcHJlbWF0dXJlIEVPRiB3aWxsIGJlIGNhdWdodCBsYXRlcgotICAgIHVpbnQ4X3QgaGVhZGVyWzQrNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpCi0gICAgICAgICAgICB8fCBtZW1jbXAoImZMYUNcMFwwXDBcMDQyIiwgaGVhZGVyLCA0KzQpKQotICAgIHsKKyAgICAvLyBTa2lwIElEMyB0YWdzCisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIHVpbnQ4X3QgaGVhZGVyWzEwXTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIG1vcmUgZmlsZSB0byByZWFkLgorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIElEMyB0YWcKKyAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaGVhZGVyLCAzKSAhPSAwKSB7CisgICAgICAgICAgICBicmVhazsgLy8gbm90IGFuIElEMyB0YWcuCisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwIHRoZSBJRDN2MiBkYXRhIGFuZCBjaGVjayBhZ2FpbgorICAgICAgICBjb25zdCB1bnNpZ25lZCBpZDNMZW4gPSAxMCArCisgICAgICAgICAgICAgICAgKCgoaGVhZGVyWzZdICYgMHg3ZikgPDwgMjEpCisgICAgICAgICAgICAgICAgIHwgKChoZWFkZXJbN10gJiAweDdmKSA8PCAxNCkKKyAgICAgICAgICAgICAgICAgfCAoKGhlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICAgICAgIHwgKGhlYWRlcls5XSAmIDB4N2YpKTsKKyAgICAgICAgcG9zICs9IGlkM0xlbjsKKworICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnIG9mIGxlbiAldSBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICUjMDE2bGx4IiwKKyAgICAgICAgICAgICAgICBpZDNMZW4sIChsb25nIGxvbmcpcG9zKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBGTEFDIGhlYWRlci4KKyAgICAvLyBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjc3RyZWFtCisgICAgLy8KKyAgICAvLyBOb3RlOiBjb250ZW50IHN0b3JlZCBiaWcgZW5kaWFuLgorICAgIC8vIGJ5dGUgb2Zmc2V0ICBiaXQgc2l6ZSAgY29udGVudAorICAgIC8vIDAgICAgICAgICAgICAzMiAgICAgICAgZkxhQworICAgIC8vIDQgICAgICAgICAgICA4ICAgICAgICAgbWV0YWRhdGEgdHlwZSBTVFJFQU1JTkZPICgwKSAobm90ZTogT1Igd2l0aCAweDgwIGlmIGxhc3QgbWV0YWRhdGEpCisgICAgLy8gNSAgICAgICAgICAgIDI0ICAgICAgICBzaXplIG9mIG1ldGFkYXRhLCBmb3IgU1RSRUFNSU5GTyAoMHgyMikuCisKKyAgICBpZiAobWVtY21wKCJmTGFDXHgwMFx4MDBceDAwXHgyMiIsIGhlYWRlciwgOCkgIT0gMCAmJgorICAgICAgICBtZW1jbXAoImZMYUNceDgwXHgwMFx4MDBceDIyIiwgaGVhZGVyLCA4KSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTg1NiwyOSArODUxLDQwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImZsYWMiLAorICAgICJmbCIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgICAgICBVVUlEKCIxMzY0YjA0OC1jYzQ1LTRmZGEtOTkzNC0zMjdkMGViZjk4MjkiKSwKICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAiRkxBQyBFeHRyYWN0b3IiLAotICAgICAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICAgICAgaWYgKFNuaWZmRkxBQyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRkxBQ0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCiAgICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCmluZGV4IDdmYjZlYzYuLjVhNzNkMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaApAQCAtMTgsNDUgKzE4LDQ0IEBACiAjZGVmaW5lIEZMQUNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEZMQUNQYXJzZXI7CiAKLWNsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKICAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKIAogfTsKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCmluZGV4IDZlOTgxMTQuLjdkNDJlNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggYTMwYjZmOC4uOWY0ZjllNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApAQCAtMjQsMzUgKzI0LDM0IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlckJhc2UKKy8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyCiBzdGF0aWMgY29uc3QgaW50IE5VTV9DT01CSU5FX0JVRkZFUlMgPSA0OwogCi1jbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIAogcHVibGljOgogICAgIE1pZGlTb3VyY2UoCiAgICAgICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTWlkaUVuZ2luZSAmbUVuZ2luZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKQEAgLTY5LDcgKzY4LDcgQEAKIAogTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1FbmdpbmUoZW5naW5lKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCkBAIC04NywxNyArODYsMTcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKG1CdWZmZXJHcm91cCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOwogCkBAIC0xMDUsMjAgKzEwNCwxOSBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCIpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CkBAIC0xMzEsNyArMTI5LDcgQEAKICAgICBidWZmZXIgPSBtRW5naW5lLnJlYWRCdWZmZXIoKTsKICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwogICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiBzdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKQEAgLTE0MiwxMCArMTQwLDkgQEAKIAogLy8gTWlkaUVuZ2luZQogCi1NaWRpRW5naW5lOjpNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKSA6Ci0gICAgICAgICAgICBtR3JvdXAoTlVMTCksCitNaWRpRW5naW5lOjpNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKSA6CiAgICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKICAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCiAgICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLApAQCAtMTcwLDE2ICsxNjcsMjAgQEAKICAgICB9CiAKICAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOwogICAgIH0KIAogICAgIGlmICh0cmFja01ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KICAgICAgICAgbUVhc0NvbmZpZyA9IEVBU19Db25maWcoKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwogICAgIH0KICAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7CiB9CkBAIC0xOTEsNyArMTkyLDYgQEAKICAgICBpZiAobUVhc0RhdGEpIHsKICAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICB9Ci0gICAgZGVsZXRlIG1Hcm91cDsKICAgICBkZWxldGUgbUlvV3JhcHBlcjsKIH0KIApAQCAtMTk5LDIyICsxOTksMjAgQEAKICAgICByZXR1cm4gbUlzSW5pdGlhbGl6ZWQgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLXN0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycygpIHsKK3N0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgewogICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKICAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7CiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CiAgICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKICAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKICAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoYnVmc2l6ZSkpOworICAgIG1Hcm91cCA9IGdyb3VwOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihidWZzaXplKTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE1pZGlFbmdpbmU6OnJlbGVhc2VCdWZmZXJzKCkgewotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyNCwxMyArMjIyLDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdCA9PSBFQVNfU1VDQ0VTUyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIAotTWVkaWFCdWZmZXJCYXNlKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgeworTWVkaWFCdWZmZXJIZWxwZXIqIE1pZGlFbmdpbmU6OnJlYWRCdWZmZXIoKSB7CiAgICAgRUFTX1NUQVRFIHN0YXRlOwogICAgIEVBU19TdGF0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnN0YXRlKTsKICAgICBpZiAoKHN0YXRlID09IEVBU19TVEFURV9TVE9QUEVEKSB8fCAoc3RhdGUgPT0gRUFTX1NUQVRFX0VSUk9SKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoInJlYWRCdWZmZXI6IG5vIGJ1ZmZlciIpOwpAQCAtMjM5LDcgKzIzNyw5IEBACiAgICAgRUFTX0kzMiB0aW1lTXM7CiAgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGltZU1zKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IDEwMDBsbCAqIHRpbWVNczsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIEVBU19QQ00qIHAgPSAoRUFTX1BDTSopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGludCBudW1CeXRlc091dHB1dCA9IDA7CkBAIC0yNjMsMTggKzI2MywyMyBAQAogLy8gTWlkaUV4dHJhY3RvcgogCiBNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgY3RvciIpOwotICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CiB9CiAKIE1pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKKyAgICBkZWxldGUgbUVuZ2luZTsKIH0KIAogc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTI4Miw3ICsyODcsNyBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTAsMjcgKzI5NSwyNSBAQAogICAgIHJldHVybiBuZXcgTWlkaVNvdXJjZSgqbUVuZ2luZSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSIpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEiKTsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7CiAgICAgTWlkaUVuZ2luZSBwKHNvdXJjZSwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKHAuaW5pdENoZWNrKCkgPT0gT0spIHsKQEAgLTMyMywyOCArMzI2LDQ2IEBACiAKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiaW15IiwKKyAgICAibWlkIiwKKyAgICAibWlkaSIsCisgICAgIm14bWYiLAorICAgICJvdGEiLAorICAgICJydHR0bCIsCisgICAgInJ0eCIsCisgICAgInNtZiIsCisgICAgInhtZiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiZWY2Y2NhMGEtZjhhMi00M2U2LWJhNWYtZGZjZDdjOWE3ZWYyIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNSURJIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaWRpRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAppbmRleCAyNDRkZDBmLi4yZTc4MDg2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKQEAgLTE4LDExICsxOCwxMiBAQAogI2RlZmluZSBNSURJX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+CiAKQEAgLTMwLDQ4ICszMSw0OCBAQAogCiBjbGFzcyBNaWRpRW5naW5lIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpOworICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAgICAgfk1pZGlFbmdpbmUoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpOwogCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKTsKICAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVycygpOwogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpOwotICAgIE1lZGlhQnVmZmVyQmFzZSogcmVhZEJ1ZmZlcigpOworICAgIE1lZGlhQnVmZmVySGVscGVyKiByZWFkQnVmZmVyKCk7CiBwcml2YXRlOgogICAgIE1pZGlJb1dyYXBwZXIgKm1Jb1dyYXBwZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1Hcm91cDsKICAgICBFQVNfREFUQV9IQU5ETEUgbUVhc0RhdGE7CiAgICAgRUFTX0hBTkRMRSBtRWFzSGFuZGxlOwogICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIG1FYXNDb25maWc7CiAgICAgYm9vbCBtSXNJbml0aWFsaXplZDsKIH07CiAKLWNsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTWlkaUV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1pZGlFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQ0RhdGFTb3VyY2UgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIE1pZGlFbmdpbmUgKm1FbmdpbmU7CiAKQEAgLTg4LDcgKzg5LDcgQEAKIAogfTsKIAotYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCBmN2VkMGM4Li4xNzQ0ZDNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTExLDcgKzExLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IGQ2NTc1ODIuLjcyMzkzMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTIzLDE3ICsyMywxNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApAQCAtNDQsNyArNDEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKLSAgICBleHBsaWNpdCBEYXRhU291cmNlQmFzZVJlYWRlcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBtU291cmNlKHNvdXJjZSkgewogICAgIH0KIApAQCAtNjgsOCArNjUsMTIgQEAKICAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKICAgICAgICAgb2ZmNjRfdCBzaXplOwogICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgICp0b3RhbCA9IC0xOwotICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgaWYgKHRvdGFsKSB7CisgICAgICAgICAgICAgICAgKnRvdGFsID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtODYsNyArODcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogCiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKQEAgLTEyNCwxNiArMTI1LDE2IEBACiAgICAgQmxvY2tJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7CiB9OwogCi1zdHJ1Y3QgTWF0cm9za2FTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgTWF0cm9za2FTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTWF0cm9za2FTb3VyY2UoTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWF0cm9za2FTb3VyY2UoKTsKQEAgLTE1MywxMiArMTU0LDEyIEBACiAgICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOwogICAgIHNzaXplX3QgbU5BTFNpemVMZW47ICAvLyBmb3IgdHlwZSBBVkMgb3IgSEVWQwogCi0gICAgTGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbVBlbmRpbmdGcmFtZXM7CisgICAgTGlzdDxNZWRpYUJ1ZmZlckhlbHBlciAqPiBtUGVuZGluZ0ZyYW1lczsKIAogICAgIHN0YXR1c190IGFkdmFuY2UoKTsKIAotICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKTsKLSAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKKyAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZWFkQmxvY2soKTsKICAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogCiAgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CkBAIC0yMjIsNDMgKzIyMywzMSBAQAogICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAogICAgICAgICAgICAgICAgICBpbmRleCksCiAgICAgICBtTkFMU2l6ZUxlbigtMSkgewotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubU1ldGE7CisgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAmdHJhY2tJbmZvID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSB0cmFja0luZm8ubU1ldGE7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpOwogCiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgbVR5cGUgPSBBVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmF2Y2M7Ci0gICAgICAgIHNpemVfdCBhdmNjU2l6ZTsKLSAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gMDsKLSAgICAgICAgaWYgKG1ldGEuZmluZEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAmbmFsU2l6ZUxlbikpIHsKLSAgICAgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmF2Y2MsICZhdmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBhdmNjU2l6ZSA+PSA1dSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGF2Y2NbNF0gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6ZCIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gQVZDIG1OQUxTaXplTGVuIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CiAgICAgICAgIG1UeXBlID0gSEVWQzsKIAotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqaHZjYzsKLSAgICAgICAgc2l6ZV90IGh2Y2NTaXplOwotICAgICAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5SFZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmaHZjYywgJmh2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGh2Y2NTaXplID49IDIydSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGh2Y2NbMTQrN10gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gSEVWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIG1UeXBlID0gQUFDOwpAQCAtMjY5LDI1ICsyNTgsMjYgQEAKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KCkgewogICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAorICAgIC8vIGFsbG9jYXRlIG9uZSBzbWFsbCBpbml0aWFsIGJ1ZmZlciwgYnV0IGxlYXZlIHBsZW50eSBvZiByb29tIHRvIGdyb3cKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBudW1iZXIgb2YgYnVmZmVycyAqLywgMTAyNCAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogZ3Jvd3RoIGxpbWl0ICovKTsKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTU3OSw3ICs1NjksNyBAQAogCiB2b2lkIE1hdHJvc2thU291cmNlOjpjbGVhclBlbmRpbmdGcmFtZXMoKSB7CiAgICAgd2hpbGUgKCFtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOwogCiAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CkBAIC01ODcsNyArNTc3LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zikgeworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJIZWxwZXIgKm1idWYpIHsKICAgICBpZiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPCAxIHx8IG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSA+IElOVDMyX01BWCkgewogICAgICAgICAvLyAxLWJ5dGUgc2lnbmFsCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC02MDEsMTcgKzU5MSwxNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOwogICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OwotICAgICAgICB1aW50MzJfdCB0eXBlOwogICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKICAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKLSAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICZ0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgICAgIENIRUNLKHRyYWNrTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCisgICAgICAgICAgICAgICAgKHZvaWQqKikma2V5SWQsICZrZXlJZFNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwga2V5SWQsIGtleUlkU2l6ZSk7CiAgICAgICAgIG1lbWNweShjdHJDb3VudGVyLCBkYXRhICsgMSwgOCk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGN0ckNvdW50ZXIsIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgY3RyQ291bnRlciwgMTYpOwogICAgICAgICBpZiAocGFydGl0aW9uZWQpIHsKICAgICAgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCkBAIC02NjQsOCArNjU0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZQbGFpblNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIHBsYWluU2l6ZXMuc2l6ZSgpOwogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogZW5jcnlwdGVkU2l6ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZShmcmFtZU9mZnNldCwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZU9mZnNldCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKgpAQCAtNjg1LDggKzY3NywxMCBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgMCB9OwogICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyBzdGF0aWNfY2FzdDxpbnQzMl90PihtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpIH07Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZSg5LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTcwMywxOSArNjk3LDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKSB9OwogICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IDAgfTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOwogICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgewogICAgIENIRUNLKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpOwogCiAgICAgaWYgKG1CbG9ja0l0ZXIuZW9zKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKQEAgLTcyNywxOCArNzIzLDIxIEBACiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKICAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKICAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBsZW4gKz0gdHJhY2tJbmZvLT5tSGVhZGVyTGVuOwotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShsZW4pOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1ZjsKKyAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbWJ1ZiwgZmFsc2UgLyogbm9uYmxvY2tpbmcgKi8sIGxlbiAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgIG1idWYtPnNldF9yYW5nZSgwLCBsZW4pOwogICAgICAgICB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYnVmLT5kYXRhKCkpOwogICAgICAgICBpZiAodHJhY2tJbmZvLT5tSGVhZGVyKSB7CiAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgdHJhY2tJbmZvLT5tSGVhZGVyLCB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgYmxvY2stPklzS2V5KCkpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgYmxvY2stPklzS2V5KCkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZyYW1lLlJlYWQobUV4dHJhY3Rvci0+bVJlYWRlciwgZGF0YSArIHRyYWNrSW5mby0+bUhlYWRlckxlbik7CiAgICAgICAgIGlmIChlcnIgPT0gT0sKQEAgLTc1Miw3ICs3NTEsNyBAQAogCiAgICAgICAgICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5wdXNoX2JhY2sobWJ1Zik7CkBAIC03NjAsMTEgKzc1OSwxMSBAQAogCiAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTFsbDsKQEAgLTc3Myw3ICs3NzIsNyBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgewpAQCAtNzkxLDcgKzc5MCw3IEBACiAgICAgfQogCiAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwpAQCAtODAwLDE4ICs3OTksMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgIGlmICgobVR5cGUgIT0gQVZDICYmIG1UeXBlICE9IEhFVkMpIHx8IG1OQUxTaXplTGVuID09IDApIHsKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgIGZyYW1lLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZnJhbWUtPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgKm91dCA9IGZyYW1lOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICAvLyBFYWNoIGlucHV0IGZyYW1lIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCBmcmFnbWVudHMsIGVhY2ggZnJhZ21lbnQKQEAgLTgyOSw3ICs4MjgsNyBAQAogICAgIHNpemVfdCBzcmNTaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgc2l6ZV90IGRzdFNpemUgPSAwOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gTlVMTDsKICAgICB1aW50OF90ICpkc3RQdHIgPSBOVUxMOwogCiAgICAgZm9yIChpbnQzMl90IHBhc3MgPSAwOyBwYXNzIDwgMjsgKytwYXNzKSB7CkBAIC04NTAsNyArODQ5LDcgQEAKICAgICAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA+IHNyY1NpemUpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg3OCw3ICs4NzcsNyBAQAogICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBhc3MgPT0gMCkgewpAQCAtODg5LDE2ICs4ODgsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBlYWNoIDQtYnl0ZSBuYWwgc2l6ZSB3aXRoIGEgNC1ieXRlIHN0YXJ0IGNvZGUKICAgICAgICAgICAgICAgICBidWZmZXIgPSBmcmFtZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZHN0U2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBkc3RTaXplIC8qIHJlcXVlc3RlZCBzaXplICovKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBkc3RTaXplKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmcmFtZU1ldGEgPSBmcmFtZS0+bWV0YV9kYXRhKCk7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgIENIRUNLKGZyYW1lLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVVcykpOwogICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKGZyYW1lTWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAmaXNTeW5jKSk7CiAKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmTWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmTWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgaXNTeW5jKTsKIAogICAgICAgICAgICAgZHN0UHRyID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgfQpAQCAtOTEwLDE4ICs5MTMsMTggQEAKICAgICB9CiAKICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgIH0KIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitNYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKQEAgLTk5NCwxMyArOTk3LDE1IEBACiAKICAgICBkZWxldGUgbVJlYWRlcjsKICAgICBtUmVhZGVyID0gTlVMTDsKKworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1hdHJvc2thRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTAwOCwxMSArMTAxMywxMSBAQAogICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKQEAgLTEwMjEsOCArMTAyNiw3IEBACiAgICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhKTsKIH0KIAogYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgewpAQCAtMTA1Nyw3ICsxMDYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzQXVkaW8sIGNvbnN0IHZvaWQgKnByaXYsIHNpemVfdCBwcml2U2l6ZSkgewogCiAgICAgaW50IHByaXZTaXplQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShwcml2U2l6ZSk7CkBAIC0xMDg1LDE0ICsxMDg5LDE0IEBACiAgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOwogICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIHByaXYsIHByaXZTaXplKTsKIAogICAgIGRlbGV0ZVtdIGVzZHM7CiAgICAgZXNkcyA9IE5VTEw7CiB9CiAKIHN0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIApAQCAtMTE1MCw3ICsxMTU0LDggQEAKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBtZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0luZm8KKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CiAKICAgICBvZmZzZXQgKz0gbGVuMTsKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMykgewpAQCAtMTE2MiwxOSArMTE2NywyMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlWb3JiaXNCb29rcywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLAotICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0Jvb2tzCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAorICAgICAgICAgICAgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdGljIHN0YXR1c190IGFkZEZsYWNNZXRhZGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5RmxhY01ldGFkYXRhCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemUgPSA2NCA8PCAxMDsKICAgICBGTEFDRGVjb2RlciAqZmxhY0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CkBAIC0xMTk2LDcgKzEyMDIsNyBAQAogICAgICAgICAgICAgICAgICogc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogc3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CiAKICAgICBkZWxldGUgZmxhY0RlY29kZXI7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTIyNSw3ICsxMjMxLDcgQEAKICAgICB9CiAKICAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICB0cmFja0luZm8tPm1NZXRhLnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gMDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEyNDcsNyArMTI1Myw3IEBACiB9CiAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29sb3VyICpjb2xvciA9IHZ0cmFjay0+R2V0Q29sb3VyKCk7CiAgICAgaWYgKGNvbG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI1Niw3ICsxMjYyLDcgQEAKICAgICAvLyBDb2xvciBBc3BlY3RzCiAgICAgewogICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCisgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsgLy8gZGVmYXVsdAogICAgICAgICBib29sIHJhbmdlU3BlY2lmaWVkID0gZmFsc2U7CkBAIC0xMjY1LDcgKzEyNzEsNyBAQAogICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIGlzb3RyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7CiAgICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKQEAgLTEyNzgsMTQgKzEyODQsMjEgQEAKICAgICAgICAgICAgIHJhbmdlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7CisgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBIRFIgU3RhdGljIEluZm8KQEAgLTEzMjksMjYgKzEzNDIsMjggQEAKICAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KICAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKICAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mbywgbWV0YSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewogICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwogICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKICAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAtMTsKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKICAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzk3LDkgKzE0MTIsMTAgQEAKIAogICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKIAotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpbnQzMl90IG5hbFNpemUgPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKICAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CkBAIC0xNDA4LDIwICsxNDI0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVs0XSAmIDMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUdIL0lTTy9IRVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAxNCArIDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbMTQgKyA3XSAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkhFVkMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MzAsMTYgKzE0NTQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDkiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgVlA5IGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcwogICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvLgotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY29kZWNQcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX0FWMSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0NTUsOCArMTQ4MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBoZWlnaHQgZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCl3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SGVpZ2h0LCAoaW50MzJfdCloZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCl3aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAoaW50MzJfdCloZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkaXNwbGF5IHdpZHRoL2hlaWdodCBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBkaXNwbGF5VW5pdCA9IHZ0cmFjay0+R2V0RGlzcGxheVVuaXQoKTsKQEAgLTE0NjYsOCArMTQ5MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheUhlaWdodCA+IDAgJiYgZGlzcGxheUhlaWdodCA8PSBJTlQzMl9NQVgpIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXNwbGF5VW5pdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIHBpeGVscwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gY2VudGltZXRlcnMKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBpbmNoZXMKQEAgLTE0ODEsOCArMTUwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNTAyLDM0ICsxNTMxLDU0IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKIAogICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCB0cnVlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKIAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb2RlY0RlbGF5ID0gdHJhY2stPkdldENvZGVjRGVsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY0RlbGF5LCBzaXplb2YoY29kZWNEZWxheSkpOwogICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJm1TZWVrUHJlUm9sbE5zLCBzaXplb2YobVNlZWtQcmVSb2xsTnMpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX0ZMQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCghc3RyY21wKCJBX01TL0FDTSIsIGNvZGVjSUQpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gY29kZWNQcml2YXRlKSB8fCAoY29kZWNQcml2YXRlU2l6ZSA8IDMwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInVuc3VwcG9ydGVkIGF1ZGlvOiBBX01TL0FDTSBoYXMgbm8gdmFsaWQgcHJpdmF0ZSBkYXRhOiAlcywgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGUgPT0gTlVMTCA/ICJudWxsIiA6ICJub24tbnVsbCIsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBJRCA9ICoodWludDE2X3QgKiljb2RlY1ByaXZhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSUQgPT0gMHgwMDU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkFfTVMvQUNNIHVuc3VwcG9ydGVkIHR5cGUgLCBjb250aW51ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU0Miw3ICsxNTkxLDcgQEAKICAgICAgICAgICAgY2hhciBsYW5nWzRdOwogICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKICAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7Ci0gICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNTUxLDEyICsxNjAwLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBsb25nIGxvbmcgZHVyYXRpb25OcyA9IG1TZWdtZW50LT5HZXREdXJhdGlvbigpOwotICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKIAogICAgICAgICBtVHJhY2tzLnB1c2goKTsKICAgICAgICAgc2l6ZV90IG4gPSBtVHJhY2tzLnNpemUoKSAtIDE7CiAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChuKTsKICAgICAgICAgaW5pdFRyYWNrSW5mbyh0cmFjaywgbWV0YSwgdHJhY2tJbmZvKTsKKyAgICAgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IG5hbFNpemU7CiAKICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgewogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gQVZDIHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCkBAIC0xNTczLDcgKzE2MjMsNyBAQAogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGluZm8tPm1NZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhpbmZvLT5tTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTU5OSwxNiArMTY0OSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEuc2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChpbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCB0aHVtYm5haWxUaW1lVXMpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1Jc1dlYm0gPyAidmlkZW8vd2VibSIgOiBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMTYyMSw3ICsxNjcxLDcgQEAKIH0KIAogYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CiAgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CiAgICAgbG9uZyBsb25nIHBvczsKQEAgLTE2MzQsMjggKzE2ODQsNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibWthIiwKKyAgICAibWt2IiwKKyAgICAid2VibSIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYSgmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLjM4NzFiZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKIAotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKQEAgLTU3LDkgKzU4LDE3IEBACiAgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIFRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIG1NZXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB+VHJhY2tJbmZvKCkgeworICAgICAgICAgICAgaWYgKG1NZXRhKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOwogCkBAIC02OCw2ICs3Nyw3IEBACiAgICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KICAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKICAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47CisgICAgICAgIGludDMyX3QgbU5hbExlbmd0aFNpemU7CiAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKQEAgLTc2LDcgKzg2LDcgQEAKICAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKQEAgLTg3LDEzICs5NywxMyBAQAogICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKICAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CiAKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDQ5NGNlYWMuLjRlMmYyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTIsMTMgKzEyLDEzIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLmE4MzhhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKIAotICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIpOwogCiAgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICBtZXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIGtNYXBbaV0ua2V5LCBzLnN0cmluZygpKTsKICAgICB9CiAKICAgICBzaXplX3QgZGF0YVNpemU7CkBAIC02NjIsMjggKzY2MiwyOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICBpZiAoZGF0YSkgewotICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworICAgIHJldHVybiB3cmFwKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIHVpbnQ4X3QgbXBlZ19oZWFkZXJbNV07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgQUxPR1YoIk1QRUcxUFMgY29udGFpbmVyIGlzIG5vdCBzdXBwb3J0ZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgaWYgKCFSZXN5bmMoJmhlbHBlciwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDcsMTYgKzcwNywyNSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm1wMiIsCisgICAgIm1wMyIsCisgICAgIm1wZWciLAorICAgICJtcGciLAorICAgICJtcGdhIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4xZTM4YWI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CiAgICAgfk1QM0V4dHJhY3RvcigpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAppbmRleCBjZDE3OTY1Li5jYTUxYjg4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsNyArMzksNyBAQAogCiAvLyBzdGF0aWMKIFZCUklTZWVrZXIgKlZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKICAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCmluZGV4IDkyMTNmNmUuLjUwNzg5OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTI0LDExICsyNCwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKaW5kZXggMDFlMDZjYS4uOWYxZmQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTIxLDcgKzIxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc5LDcgKzgxLDcgQEAKIAogLy8gc3RhdGljCiBYSU5HU2Vla2VyICpYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CiAKICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCmluZGV4IDU4NjdlYWUuLjlhY2VlMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKQEAgLTIyLDExICsyMiwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTJlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQzRQYXJzZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkFDNFBhcnNlci5oIgorCisjZGVmaW5lIEJPT0xTVFIoYSkgICgoYSk/InRydWUiOiJmYWxzZSIpCisjZGVmaW5lIEJZVEVfQUxJR04gbUJpdFJlYWRlci5za2lwQml0cyhtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4KQorI2RlZmluZSBDSEVDS19CSVRTX0xFRlQobikgaWYgKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSA8IG4pIHtyZXR1cm4gZmFsc2U7fQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FDNFBhcnNlcjo6QUM0UGFyc2VyKCkgeworfQorCitBQzREU0lQYXJzZXI6OkFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicikKKyAgICA6IG1CaXRSZWFkZXIoYnIpeworCisgICAgbURTSVNpemUgPSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCk7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorc3RhdGljIGNvbnN0IGNoYXIgKkNoYW5uZWxNb2Rlc1tdID0geworICAgICJtb25vIiwKKyAgICAic3RlcmVvIiwKKyAgICAiMy4wIiwKKyAgICAiNS4wIiwKKyAgICAiNS4xIiwKKyAgICAiNy4wICgzLzQvMCkiLAorICAgICI3LjEgKDMvNC8wLjEpIiwKKyAgICAiNy4wICg1LzIvMCkiLAorICAgICI3LjEgKDUvMi8wLjEpIiwKKyAgICAiNy4wICgzLzIvMikiLAorICAgICI3LjEgKDMvMi8yLjEpIiwKKyAgICAiNy4wLjQiLAorICAgICI3LjEuNCIsCisgICAgIjkuMC40IiwKKyAgICAiOS4xLjQiLAorICAgICIyMi4yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIENvbnRlbnRDbGFzc2lmaWVyW10gPSB7CisgICAgIkNvbXBsZXRlIE1haW4iLAorICAgICJNdXNpYyBhbmQgRWZmZWN0cyIsCisgICAgIlZpc3VhbGx5IEltcGFpcmVkIiwKKyAgICAiSGVhcmluZyBJbXBhaXJlZCIsCisgICAgIkRpYWxvZyIsCisgICAgIkNvbW1lbnRhcnkiLAorICAgICJFbWVyZ2VuY3kiLAorICAgICJWb2ljZSBPdmVyIgorfTsKKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgdWludDMyX3Qgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgaWYgKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzIDwgMiB8fCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA+PSA0MikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVChuX2xhbmd1YWdlX3RhZ19ieXRlcyAqIDgpOworICAgIGNoYXIgbGFuZ3VhZ2VfdGFnX2J5dGVzWzQyXTsgLy8gVFMgMTAzIDE5MCBwYXJ0IDEgNC4zLjMuOC43CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzOyBpKyspIHsKKyAgICAgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW2ldID0gKGNoYXIpbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIH0KKyAgICBsYW5ndWFnZV90YWdfYnl0ZXNbbl9sYW5ndWFnZV90YWdfYnl0ZXNdID0gMDsKKyAgICBBTE9HVigiJXUuJXU6IGxhbmd1YWdlX3RhZyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGxhbmd1YWdlX3RhZ19ieXRlcyk7CisKKyAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZShsYW5ndWFnZV90YWdfYnl0ZXMsIG5fbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKyAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUxhbmd1YWdlID0gbGFuZ3VhZ2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSBFLjUgYW5kIFRTIDEwMyAxOTAtMiB2MS4xLjEgRS45Citib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgdWludDMyX3QgY2hhbm5lbF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBjaGFubmVsX21vZGUgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGNoYW5uZWxfbW9kZSwKKyAgICBjaGFubmVsX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8gQ2hhbm5lbE1vZGVzW2NoYW5uZWxfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKyAgICBBTE9HVigiJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgZHNpX3NmX211bHRpcGxpZXIpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgfQorICAgIGlmIChjaGFubmVsX21vZGUgPj0gNyAmJiBjaGFubmVsX21vZGUgPD0gMTApIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICB1aW50MzJfdCBhZGRfY2hfYmFzZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBhZGRfY2hfYmFzZSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGFkZF9jaF9iYXNlKTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIGNvbnRlbnRfY2xhc3NpZmllciwgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSk7CisKKyAgICAgICAgLy8gRm9yIHN0cmVhbXMgYmFzZWQgb24gVFMgMTAzIDE5MCBwYXJ0IDEgdGhlIHByZXNlbnRhdGlvbiBsZXZlbCBjaGFubmVsX21vZGUgZG9lc24ndAorICAgICAgICAvLyBleGlzdCBhbmQgc28gd2UgdXNlIHRoZSBjaGFubmVsX21vZGUgZnJvbSBlaXRoZXIgdGhlIENNIG9yIE0mRSBzdWJzdHJlYW0KKyAgICAgICAgLy8gKHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPT0gLTEgJiYKKyAgICAgICAgICAgIChjb250ZW50X2NsYXNzaWZpZXIgPT0gMCB8fCBjb250ZW50X2NsYXNzaWZpZXIgPT0gMSkpIHsKKyAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGU7CisgICAgICAgIH0KKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgdjEuMS4xIHNlY3Rpb24gRS4xMQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpCit7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoOCk7CisgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1zX3ByZXNlbnQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NoYW5uZWxfY29kZWQpKTsKKyAgICBBTE9HVigiJXUuJXU6IG5fc3Vic3RyZWFtcyA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgbl9zdWJzdHJlYW1zKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3N1YnN0cmVhbXM7IGkrKykgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChiX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWpvYyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfYWpvYyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgQk9PTFNUUihiX2Fqb2MpKTsKKyAgICAgICAgICAgIGlmIChiX2Fqb2MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3N0YXRpY19kbXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdGF0aWNfZG14ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfc3RhdGljX2RteCkpOworICAgICAgICAgICAgICAgIGlmICghYl9zdGF0aWNfZG14KSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9kbXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl9kbXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2RteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3VteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fdW14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBuX3VteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBvYmplY3RzX2Fzc2lnbm1lbnRfbWFzaworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXMgKCV1KVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdLCBjb250ZW50X2NsYXNzaWZpZXIpOworCisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlQml0cmF0ZURzaSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMiArIDMyICsgMzIpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGJpdF9yYXRlX21vZGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGVfcHJlY2lzaW9uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHNlY3Rpb24gRS40IChhYzRfZHNpKSBhbmQgVFMgMTAzIDE5MC0yIHNlY3Rpb24gRS42IChhYzRfZHNpX3YxKQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICB1aW50MzJfdCBhYzRfZHNpX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBkc2k6IG9ubHkgdmVyc2lvbnMgMCBhbmQgMSBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoNyArIDEgKyA0ICsgOSk7CisgICAgdWludDMyX3QgYml0c3RyZWFtX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygxKTsgLy8gZnNfaW5kZXgKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBmcmFtZV9yYXRlX2luZGV4CisgICAgdWludDMyX3Qgbl9wcmVzZW50YXRpb25zID0gbUJpdFJlYWRlci5nZXRCaXRzKDkpOworCisgICAgaW50MzJfdCBzaG9ydF9wcm9ncmFtX2lkID0gLTE7CisgICAgaWYgKGJpdHN0cmVhbV92ZXJzaW9uID4gMSkgeworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApeworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgYWM0IGRzaSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX3Byb2dyYW1faWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBpZiAoYl9wcm9ncmFtX2lkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYgKyAxKTsKKyAgICAgICAgICAgIHNob3J0X3Byb2dyYW1faWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgYm9vbCBiX3V1aWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgaWYgKGJfdXVpZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGtBQzRVVUlEU2l6ZUluQnl0ZXMgPSAxNjsKKyAgICAgICAgICAgICAgICBjaGFyIHByb2dyYW1fdXVpZFtrQUM0VVVJRFNpemVJbkJ5dGVzXTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoa0FDNFVVSURTaXplSW5CeXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrQUM0VVVJRFNpemVJbkJ5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV91dWlkW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJVVUlEID0gJXMiLCBwcm9ncmFtX3V1aWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCWVRFX0FMSUdOOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgcHJlc2VudGF0aW9uID0gMDsgcHJlc2VudGF0aW9uIDwgbl9wcmVzZW50YXRpb25zOyBwcmVzZW50YXRpb24rKykgeworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Qcm9ncmFtSUQgPSBzaG9ydF9wcm9ncmFtX2lkOworICAgICAgICAvLyBrbm93biBhcyBiX3NpbmdsZV9zdWJzdHJlYW0gaW4gYWM0X2RzaV92ZXJzaW9uIDAKKyAgICAgICAgYm9vbCBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2NvbmZpZyA9IDAsIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gMDsKKyAgICAgICAgdWludDMyX3QgcHJlc19ieXRlcyA9IDA7CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDUgKyA1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg4ICsgOCk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHByZXNfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBpZiAocHJlc19ieXRlcyA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICBwcmVzX2J5dGVzICs9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYnl0ZXMgPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzX2J5dGVzKTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKSwgYWM0X3ByZXNlbnRhdGlvbl92MV9kc2koKSBhbmQgYWM0X3ByZXNlbnRhdGlvbl92Ml9kc2koKQorICAgICAgICAgICAgLy8gYWxsIHN0YXJ0IHdpdGggYSBwcmVzZW50YXRpb25fY29uZmlnIG9mIDUgYml0cworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChwcmVzZW50YXRpb25fY29uZmlnID09IDB4MWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKlByZXNlbnRhdGlvbkNvbmZpZ1tdID0geworICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2ciLAorICAgICAgICAgICAgIk1haW4gKyBERSIsCisgICAgICAgICAgICAiTWFpbiArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTWFpbiArIERFICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJBcmJpdHJhcnkgc3Vic3RyZWFtIGdyb3VwcyIsCisgICAgICAgICAgICAiRU1ERiBvbmx5IgorICAgICAgICB9OworICAgICAgICBBTE9HVigiJXU6IGJfc2luZ2xlX3N1YnN0cmVhbS9ncm91cCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICBCT09MU1RSKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkpOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl92ZXJzaW9uID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX3ZlcnNpb24pOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jb25maWcgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9jb25maWcsCisgICAgICAgICAgICAocHJlc2VudGF0aW9uX2NvbmZpZyA+PSBORUxFTShQcmVzZW50YXRpb25Db25maWcpID8KKyAgICAgICAgICAgICJyZXNlcnZlZCIgOiBQcmVzZW50YXRpb25Db25maWdbcHJlc2VudGF0aW9uX2NvbmZpZ10pKTsKKworICAgICAgICAvKiByZWNvcmQgYSBtYXJrZXIsIGxlc3MgdGhlIHNpemUgb2YgdGhlIHByZXNlbnRhdGlvbl9jb25maWcgKi8KKyAgICAgICAgdWludDY0X3Qgc3RhcnQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKworICAgICAgICBib29sIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IGZhbHNlOworICAgICAgICBpZiAoIWJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCAmJiBwcmVzZW50YXRpb25fY29uZmlnID09IDYpIHsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyArIDEpOworICAgICAgICAgICAgdWludDMyX3QgbWRjb21wYXQgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICBBTE9HVigiJXU6IG1kY29tcGF0ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgbWRjb21wYXQpOworCisgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4ID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvKTsKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSAmJiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2tleV9pZCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9rZXlfaWQpOworCisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gJWQgKCVzKVxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTW9kZXNbZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlXSA6ICJyZXNlcnZlZCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID49IDExICYmIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc190b3BfY2hhbm5lbF9wYWlycyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNfdG9wX2NoYW5uZWxfcGFpcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2sgaW4gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBkc2lfcHJlc2VudGF0aW9uX2NoYW5uZWxfbW9kZV9jb3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZmlsdGVyID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9maWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJfZW5hYmxlX3ByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9lbmFibGVfcHJlc2VudGF0aW9uID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfZW5hYmxlX3ByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9maWx0ZXJfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9maWx0ZXJfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2ZpbHRlcl9ieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gZmlsdGVyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogYWM0X2RzaV92ZXJzaW9uID09IDEgKi8KKworICAgICAgICAgICAgaWYgKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX211bHRpX3BpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9tdWx0aV9waWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfbXVsdGlfcGlkKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb25fY29uZmlnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNnID0gMDsgc2cgPCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyICsgMjsgc2crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9za2lwX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9za2lwX2J5dGVzICogOCkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fc2tpcF9ieXRlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZV92aXJ0dWFsaXplZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJlVmlydHVhbGl6ZWQgPSBiX3ByZV92aXJ0dWFsaXplZDsKKyAgICAgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVfdmlydHVhbGl6ZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfcHJlX3ZpcnR1YWxpemVkKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiX2FkZF9lbWRmX3N1YnN0cmVhbXMpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5fYWRkX2VtZGZfc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX2FkZF9lbWRmX3N1YnN0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBlbWRmX3N1YnN0cmVhbVslZF06IHZlcnNpb249JWQsIGtleV9pZD0lZFxuIiwgcHJlc2VudGF0aW9uLCBqLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uLCBzdWJzdHJlYW1fa2V5X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gZmFsc2U7CisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gJXNcbiIsIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSk7CisgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWx0ZXJuYXRpdmUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoImJfYWx0ZXJuYXRpdmUgPSAlc1xuIiwgQk9PTFNUUihiX2FsdGVybmF0aXZlKSk7CisgICAgICAgICAgICBpZiAoYl9hbHRlcm5hdGl2ZSkgeworICAgICAgICAgICAgICAgIEJZVEVfQUxJR047CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lX2xlbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5hbWVfbGVuICogOCk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJnByZXNlbnRhdGlvbl9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5yZXNpemUobmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3RhcmdldHMgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fdGFyZ2V0cyAqICgzICsgOCkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3RhcmdldHM7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMyk7IC8vIHRhcmdldF9tZF9jb21wYXQKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gdGFyZ2V0X2RldmljZV9jYXRlZ29yeQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJZVEVfQUxJR047CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICB1aW50NjRfdCBlbmQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKyAgICAgICAgICAgIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbmQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uX2J5dGVzID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICB1aW50NjRfdCBza2lwX2J5dGVzID0gcHJlc19ieXRlcyAtIHByZXNlbnRhdGlvbl9ieXRlczsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyA9ICUiIFBSSXU2NCAiIGJ5dGVzIiwgc2tpcF9ieXRlcyk7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhza2lwX2J5dGVzICogOCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQga25vdyB0aGlzIG9yIHNvbWV0aGluZyBpcyBwcm9iYWJseSB3cm9uZworICAgICAgICAvLyB3aXRoIHRoZSBiaXRzdHJlYW0gKG9yIHdlIGRvbid0IHN1cHBvcnQgaXQpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9PSAtMSl7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGRldGVybWluZyBjaGFubmVsIG1vZGUgb2YgcHJlc2VudGF0aW9uICVkIiwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLyogZWFjaCBwcmVzZW50YXRpb24gKi8KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I2ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFDNF9QQVJTRVJfSF8KKyNkZWZpbmUgQUM0X1BBUlNFUl9IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBBQzRQYXJzZXIoKTsKKyAgICB2aXJ0dWFsIH5BQzRQYXJzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZSgpID0gMDsKKworICAgIHN0cnVjdCBBQzRQcmVzZW50YXRpb24geworICAgICAgICBpbnQzMl90IG1DaGFubmVsTW9kZSA9IC0xOworICAgICAgICBpbnQzMl90IG1Qcm9ncmFtSUQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtR3JvdXBJbmRleCA9IC0xOworCisgICAgICAgIC8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgNC4zLjMuOC4xCisgICAgICAgIGVudW0gQ29udGVudENsYXNzaWZpZXJzIHsKKyAgICAgICAgICAgIGtDb21wbGV0ZU1haW4sCisgICAgICAgICAgICBrTXVzaWNBbmRFZmZlY3RzLAorICAgICAgICAgICAga1Zpc3VhbGx5SW1wYWlyZWQsCisgICAgICAgICAgICBrSGVhcmluZ0ltcGFpcmVkLAorICAgICAgICAgICAga0RpYWxvZywKKyAgICAgICAgICAgIGtDb21tZW50YXJ5LAorICAgICAgICAgICAga0VtZXJnZW5jeSwKKyAgICAgICAgICAgIGtWb2ljZU92ZXIKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ29udGVudENsYXNzaWZpZXIgPSBrQ29tcGxldGVNYWluOworCisgICAgICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorICAgICAgICBlbnVtIElucHV0Q2hhbm5lbE1vZGUgeworICAgICAgICAgICAga0NoYW5uZWxNb2RlX01vbm8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfU3RlcmVvLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzNfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8xLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfMjJfMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9SZXNlcnZlZCwKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1IYXNEaWFsb2dFbmhhbmNlbWVudHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtUHJlVmlydHVhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtRW5hYmxlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgICAgICBzdGQ6OnN0cmluZyBtRGVzY3JpcHRpb247CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCBBQzRQcmVzZW50YXRpb24+IEFDNFByZXNlbnRhdGlvbnM7CisKKyAgICBjb25zdCBBQzRQcmVzZW50YXRpb25zJiBnZXRQcmVzZW50YXRpb25zKCkgY29uc3QgeyByZXR1cm4gbVByZXNlbnRhdGlvbnM7IH0KKworcHJvdGVjdGVkOgorICAgIEFDNFByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCitjbGFzcyBBQzREU0lQYXJzZXI6IHB1YmxpYyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicik7CisgICAgdmlydHVhbCB+QUM0RFNJUGFyc2VyKCkgeyB9CisKKyAgICBib29sIHBhcnNlKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCk7CisgICAgYm9vbCBwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZUJpdHJhdGVEc2koKTsKKworICAgIHVpbnQ2NF90IG1EU0lTaXplOworICAgIEFCaXRSZWFkZXImIG1CaXRSZWFkZXI7Cit9OworCit9OworCisjZW5kaWYgIC8vIEFDNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGYzMTZkZjYuLjFiMzA4YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFDNFBhcnNlci5jcHAiLAogICAgICAgICAiSXRlbVRhYmxlLmNwcCIsCiAgICAgICAgICJNUEVHNEV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiU2FtcGxlSXRlcmF0b3IuY3BwIiwKQEAgLTE0LDcgKzE1LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCBhNDYyZGU5Li5hNzJlNTg5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxJdGVtVGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC05Miw3ICs5NSw3IEBACiAKIHN0cnVjdCBCb3ggewogcHJvdGVjdGVkOgotICAgIEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQogCiAgICAgdmlydHVhbCB+Qm94KCkge30KQEAgLTEwNCwxNCArMTA3LDE0IEBACiAKICAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICBpbmxpbmUgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisgICAgaW5saW5lIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICB1aW50MzJfdCBtVHlwZTsKIH07CiAKQEAgLTE4Niw3ICsxODksNyBAQAogCiBzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewogcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CiAKICAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KQEAgLTIyMSw3ICsyMjQsNyBAQAogLy8KIAogc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgUGl0bUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygicGl0bSIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7CkBAIC0zMDEsNyArMzA0LDcgQEAKIH07CiAKIHN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgorICAgIElsb2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlsb2MiKSksCiAgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQogCkBAIC00NzEsNyArNDc0LDcgQEAKIC8vCiAKIHN0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgewotICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjI2LDcgKzYyOSw3IEBACiB9CiAKIHN0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElyZWZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CisgICAgSXJlZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpcmVmIikpLCBtUmVmSWRTaXplKDApLCBtSXRlbVJlZnMoaXRlbVJlZnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjg4LDcgKzY5MSw3IEBACiB9OwogCiBzdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJc3BlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpc3BlIikpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03MjQsNyArNzI3LDcgQEAKIH0KIAogc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBIdmNjQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImh2Y0MiKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03NTcsNyArNzYwLDcgQEAKIH0KIAogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlyb3QiKSksIG1BbmdsZSgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc4Niw3ICs3ODksNyBAQAogfQogCiBzdHJ1Y3QgQ29sckJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIENvbHJCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIENvbHJCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiY29sciIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTgzNCw3ICs4MzcsNyBAQAogfQogCiBzdHJ1Y3QgSXBtYUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcG1hQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgSXBtYUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlwbWEiKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTkwOCw3ICs5MTEsNyBAQAogfQogCiBzdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgorICAgIElwY29Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBjbyIpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTY1LDcgKzk2OCw3IEBACiB9CiAKIHN0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgIElwcnBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKICAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBycCIpKSwKQEAgLTEwMjIsNyArMTAyNSw3IEBACiB9OwogCiBzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJbmZlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpbmZlIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7CkBAIC0xMTI3LDIwICsxMTMwLDE5IEBACiB9CiAKIHN0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElpbmZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlpbmYiKSksCi0gICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQorICAgIElpbmZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWluZiIpKSwgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgYm9vbCBoYXNHcmlkcygpIHsgcmV0dXJuIG1IYXNHcmlkczsgfQorICAgIGJvb2wgaGFzRm91ckNDKHVpbnQzMl90IHR5cGUpIHsgcmV0dXJuIG1Gb3VyQ0NTZWVuLmNvdW50KHR5cGUpID4gMDsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBWZWN0b3I8SXRlbUluZm8+ICptSXRlbUluZm9zOwotICAgIGJvb2wgbUhhc0dyaWRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gbUZvdXJDQ1NlZW47CiB9OwogCiBzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTExODcsNyArMTE4OSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOwotICAgICAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygiZ3JpZCIpKTsKKyAgICAgICAgbUZvdXJDQ1NlZW4uaW5zZXJ0KGl0ZW1JbmZvLml0ZW1UeXBlKTsKICAgICB9CiAgICAgLy8gSW5mZUJveCBwYXJzZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSBib3ggaWYgYW4gdW5zdXBwb3J0ZWQKICAgICAvLyB2ZXJzaW9uLiBJZ25vcmUgdGhpcyBlcnJvciBhcyBpdCdzIG5vdCBmYXRhbC4KQEAgLTExOTYsNyArMTE5OCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1JdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QcmltYXJ5SXRlbUlkKDApLAogICAgICAgbUlkYXRPZmZzZXQoMCksCkBAIC0xMjc2LDcgKzEyNzgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChpaW5mQm94Lmhhc0dyaWRzKCkpIHsKKyAgICBpZiAoaWluZkJveC5oYXNGb3VyQ0MoRk9VUkNDKCJncmlkIikpIHx8IGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiRXhpZiIpKSkgewogICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKICAgICB9CiAKQEAgLTE0NzYsNyArMTQ3OCw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMyw3OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogCiAgICAgaWYgKGltYWdlLT5pdGVtSWQgPT0gbVByaW1hcnlJdGVtSWQpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwgMSk7CiAgICAgfQogCiAgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKICAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQogICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCiAgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMzYwIC0gaW1hZ2UtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpbWFnZVsldV06IHRodW1ibmFpbDogc2l6ZSAlZHglZCwgaXRlbSBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdGh1bWJuYWlsIGRhdGEgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywgaW1hZ2UtPnJvd3MpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCiAgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1ldGE7CiB9CkBAIC0xNjcxLDggKzE2ODgsMzEgQEAKICAgICB9CiAKICAgICAvLyBza2lwIHRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIG9mZnNldCB0byBUSUZGIGhlYWRlcgotICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgNDsKLSAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gNDsKKyAgICB1aW50MzJfdCB0aWZmT2Zmc2V0OworICAgIGlmICghbURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgIG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQsICZ0aWZmT2Zmc2V0LCA0KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgLy8gV2UgbmVlZCAnRXhpZlwwXDAnIGJlZm9yZSB0aGUgdGlmZiBoZWFkZXIKKyAgICB0aWZmT2Zmc2V0ID0gbnRvaGwodGlmZk9mZnNldCk7CisgICAgaWYgKHRpZmZPZmZzZXQgPCA2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIFRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIGl0ZW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgdGlmZiBoZWFkZXIgd2l0aGluIHRoZQorICAgIC8vIGV4aWYgZGF0YS4gVGhlIHNpemUgb2YgdGhlIGl0ZW0gc2hvdWxkIGJlID4gNCBmb3IgYSBub24tZW1wdHkgZXhpZiAodGhpcworICAgIC8vIHdhcyBhbHJlYWR5IGNoZWNrZWQgd2hlbiB0aGUgaXRlbSB3YXMgYWRkZWQpLiBBbHNvIGNoZWNrIHRoYXQgdGhlIHRpZmYKKyAgICAvLyBoZWFkZXIgb2Zmc2V0IGlzIHZhbGlkLgorICAgIGlmIChtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSA8PSA0IHx8CisgICAgICAgICAgICB0aWZmT2Zmc2V0ID4gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gT2Zmc2V0IG9mICdFeGlmXDBcMCcgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiAnRXhpZicgaXRlbQorICAgIC8vIChmaXJzdCA0LWJ5dGUgaXMgdGhlIHRpZmYgaGVhZGVyIG9mZnNldCkKKyAgICB1aW50MzJfdCBleGlmT2Zmc2V0ID0gNCArIHRpZmZPZmZzZXQgLSA2OworICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgZXhpZk9mZnNldDsKKyAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gZXhpZk9mZnNldDsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKaW5kZXggNTM2ZGNiMC4uYmU4MWI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKQEAgLTE5LDEzICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8c2V0PgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogY2xhc3MgTWV0YURhdGE7CiAKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTQ1LDEzICs0NywxMyBAQAogCiBjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgaXNWYWxpZCgpIHsgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQ7IH0KICAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OwotICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZEltYWdlSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCkBAIC02Miw3ICs2NCw3IEBACiAgICAgfkl0ZW1UYWJsZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7CiAgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZWVjYTYyOS4uYzc3NmM1MQotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNiwyNiArMjYsMjcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CkBAIC02OCwzNyArNjksMzggQEAKICAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAogfTsKIAorY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgIE1QRUc0U291cmNlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlLAorICAgICAgICAgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgfk1QRUc0U291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1Gb3JtYXQ7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBpbnQzMl90IG1UaW1lc2NhbGU7CiAgICAgc3A8U2FtcGxlVGFibGU+IG1TYW1wbGVUYWJsZTsKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtMTA4LDcgKzExMCw3IEBACiAgICAgb2ZmNjRfdCBtRmlyc3RNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbU5leHRNb29mT2Zmc2V0OwotICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7IC8vIGluIG1lZGlhIHRpbWVzY2FsZSB0aWNrcwogICAgIGludDMyX3QgbUxhc3RQYXJzZWRUcmFja0lkOwogICAgIGludDMyX3QgbVRyYWNrSWQ7CiAKQEAgLTEyOSwyMiArMTMxLDIzIEBACiAKICAgICBib29sIG1Jc0FWQzsKICAgICBib29sIG1Jc0hFVkM7CisgICAgYm9vbCBtSXNBQzQ7CiAgICAgYm9vbCBtSXNQY207CiAgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwogCiAgICAgYm9vbCBtU3RhcnRlZDsKIAotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLQotICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZmZlcjsKLQotICAgIGJvb2wgbVdhbnRzTkFMRnJhZ21lbnRzOworICAgIE1lZGlhQnVmZmVySGVscGVyICptQnVmZmVyOwogCiAgICAgdWludDhfdCAqbVNyY0J1ZmZlcjsKIAogICAgIGJvb2wgbUlzSGVpZjsKICAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CiAKKyAgICAvLyBTdGFydCBvZmZzZXQgZnJvbSBjb21wb3NpdGlvbiB0aW1lIHRvIHByZXNlbnRhdGlvbiB0aW1lLgorICAgIC8vIFN1cHBvcnQgc2hpZnQgb25seSBmb3IgdmlkZW8gdHJhY2tzIHRocm91Z2ggbUVsc3RTaGlmdFN0YXJ0VGlja3MgZm9yIG5vdy4KKyAgICBpbnQzMl90IG1FbHN0U2hpZnRTdGFydFRpY2tzOworCiAgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwpAQCAtMTUzLDYgKzE1Niw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpOwogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlRW5jcnlwdGlvbihvZmY2NF90IG9mZnNldCk7CisgICAgLy8gcmV0dXJucyAtMSBmb3IgaW52YWxpZCBsYXllciBJRAorICAgIGludDMyX3QgcGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTE5OCwxNCArMjAzLDE0IEBACiAvLyBwb3NzaWJseSB3cmFwcGluZyBtdWx0aXBsZSB0aW1lcyB0byBjb3ZlciBhbGwgdHJhY2tzLCBpLmUuCiAvLyBFYWNoIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgY2FjaGVzIHRoZSBzYW1wbGV0YWJsZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgdHJhY2suCiAKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKLSAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworY2xhc3MgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAgICAgdmlydHVhbCB+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZmxhZ3MoKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBhc3N1bWVTb3VyY2VPd25lcnNoaXBPblN1Y2Nlc3MpOwogCkBAIC0yMTMsNyArMjE4LDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIGJvb2wgbU93bnNEYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CkBAIC0yMjUsOCArMjMwLDkgQEAKICAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmKTsKIH07CiAKLUNhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKK0NhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQorICAgIDogRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU93bnNEYXRhU291cmNlKGZhbHNlKSwKICAgICAgIG1DYWNoZWRPZmZzZXQoMCksCiAgICAgICBtQ2FjaGVkU2l6ZSgwKSwKQEAgLTIzNiw3ICsyNDIsNyBAQAogQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CiAgICAgY2xlYXJDYWNoZSgpOwogICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKLSAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgICAgICBkZWxldGUgbVNvdXJjZTsKICAgICB9CiB9CiAKQEAgLTI1MCwxMCArMjU2LDYgQEAKICAgICBtQ2FjaGVkU2l6ZSA9IDA7CiB9CiAKLXN0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Ci19Ci0KIHNzaXplX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMxNSw2ICszMTcsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygic2F3YiIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKIAorICAgICAgICBjYXNlIEZPVVJDQygiZWMtMyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CisKICAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIApAQCAtMzI5LDYgKzMzNCw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJodmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJoZXYxIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKQEAgLTMzNiw2ICszNDMsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOworICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgorICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIlVua25vd24gZm91cmNjOiAlYyVjJWMlYyIsCiAgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiAyNCkgJiAweGZmLApAQCAtMzYyLDEyICszNzQsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQorTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAogICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCiAgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkU291cmNlKE5VTEwpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCkBAIC0zNzcsNiArMzg4LDcgQEAKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworICAgIG1GaWxlTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0zODQsNiArMzk2LDcgQEAKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKIAorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrLT5tZXRhKTsKICAgICAgICAgZGVsZXRlIHRyYWNrOwogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQpAQCAtMzk0LDcgKzQwNyw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNDAzLDEzICs0MTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDMwLDE4ICs0NDQsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00NDksMTcgKzQ2MywxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCi0gICAgICAgICAgICAvLyBlbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgICAgICAgICAgLy8gRWxzdCBoYXMgdG8gYmUgcHJvY2Vzc2VkIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPiBJTlQ2NF9NQVgpIHsKQEAgLTQ3NSw3NyArNDkwLDc2IEBACiAgICAgICAgICAgICAgICAgICBoYWxmc2NhbGUsIG1IZWFkZXJUaW1lc2NhbGUsIHRyYWNrLT50aW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KXNhbXBsZXJhdGUgIT0gdHJhY2stPnRpbWVzY2FsZSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGU6JSIgUFJJZDMyICIsIHRyYWNrLT50aW1lc2NhbGUgYW5kIHNhbXBsZXJhdGUgYXJlIGRpZmZlcmVudCEiLCBzYW1wbGVyYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5OwotICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY2FsY3VsYXRlZCBkZWxheSBzaG91bGQgYmUgc21hbGwsIGJ1dCBzb21lIGFwcHMKLSAgICAgICAgICAgICAgICAgICAgICogYXBwZWFyIHRvIHdyaXRlIGEgYm9ndXMgZWRpdCBsaXN0IHRoYXQgY2F1c2VzIGEgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhcmdlIGRlbGF5LCByZXN1bHRpbmcgaW4gcGxheWJhY2sgcHJvYmxlbXMuCi0gICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBzdWNoIGVkaXQgbGlzdHMuCi0gICAgICAgICAgICAgICAgICAgICAqICg0MDk2IGlzIGVub3VnaCB0byBkcm9wIDQgZnVsbCBzYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCBib2d1cyB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLQotICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247Ci0gICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uX2U2OwotICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7Ci0gICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCkgKwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZVNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQotICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQotICAgICAgICAgICAgLy8gbWVkaWFfdGltZSBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgdHJhY2sgaGVhZGVyL21lZGlhIHRpbWVzY2FsZQotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lX3NjYWxlZCwgMTAwMDAwMCwgJm1lZGlhX3RpbWVfc2NhbGVkX2U2KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lZGlhX3RpbWVfc2NhbGVkX2U2IC89IHRyYWNrLT50aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZihfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OwotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXNjYWxlX2U2OwotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOwotICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAvLyBCb3RoIGRlbGF5IGFuZCBwYWRkaW5nc2FtcGxlcyBoYXZlIHRvIGJlIHNldCBpbm9yZGVyIGZvciBlaXRoZXIgdG8gYmUKKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZSBpbiB0aGUgbG93ZXIgbGF5ZXJzLgorICAgICAgICAgICAgaW50NjRfdCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobWVkaWFfdGltZSA+IDApIHsgLy8gR2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSB0cmFjay0+dGltZXNjYWxlLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisKKyAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOworICAgICAgICAgICAgaWYgKHNlZ21lbnRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgLy8gc2NhbGVkX2R1cmF0aW9uID0gZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOworICAgICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZzsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb25fZTY7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkOworICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgPSBzY2FsZWRfZHVyYXRpb24gLSAoKHNlZ21lbnRfZHVyYXRpb24gKiAxMDAwMDAwKSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQorICAgICAgICAgICAgICAgIC8vIHNlZ21lbnRfZHVyYXRpb24gaXMgYmFzZWQgb24gdGltZXNjYWxlIGluIG1vdmllIGhlYWRlciBib3gobWRoZCkKKyAgICAgICAgICAgICAgICAvLyBtZWRpYV90aW1lIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSB0cmFjayBoZWFkZXIvbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgbUhlYWRlclRpbWVzY2FsZSwgJm1lZGlhX3RpbWVfc2NhbGVkKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWVfc2NhbGVkLCAxMDAwMDAwLCAmbWVkaWFfdGltZV9zY2FsZWRfZTYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVkaWFfdGltZV9zY2FsZWRfZTYgLz0gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uX2U2LCBtZWRpYV90aW1lX3NjYWxlZF9lNiwgJnNlZ21lbnRfZW5kKQorICAgICAgICAgICAgICAgICAgICB8fCBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBpcykKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBpZiAocGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfbWh0ID0gbUhlYWRlclRpbWVzY2FsZSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZ3NhbXBsZXMgPSAoKHBhZGRpbmcgKiBzYW1wbGVyYXRlKSArIChoYWxmc2NhbGVfbWh0ICogMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8gKG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlX21odCwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJwYWRkaW5nc2FtcGxlcyA9ICUiIFBSSWQ2NCwgcGFkZGluZ3NhbXBsZXMpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9KCk7CiAKQEAgLTU1NCw3ICs1NjgsNyBAQAogICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewpAQCAtNTY3LDM2ICs1ODEsMzggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiwgaGVhZGVyLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwgZHVyYXRpb24gLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIGR1cmF0aW9uIC8gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgIT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZVRhYmxlLT5maW5kVGh1bWJuYWlsU2FtcGxlKCZzYW1wbGVJbmRleCkgPT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwgLyogb2Zmc2V0ICovLCBOVUxMIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIG1ldGEgPSB0cmFjay0+bWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgdHJhY2stPm1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7CkBAIC02MzEsMTIgKzY0NywxNCBAQAogICAgICAgICBvZmY2NF90IGV4aWZPZmZzZXQ7CiAgICAgICAgIHNpemVfdCBleGlmU2l6ZTsKICAgICAgICAgaWYgKG1JdGVtVGFibGUtPmdldEV4aWZPZmZzZXRBbmRTaXplKCZleGlmT2Zmc2V0LCAmZXhpZlNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmT2Zmc2V0LCAoaW50NjRfdClleGlmT2Zmc2V0KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUV4aWZTaXplLCAoaW50NjRfdClleGlmU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCwgKGludDY0X3QpZXhpZk9mZnNldCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUsIChpbnQ2NF90KWV4aWZTaXplKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKHVpbnQzMl90IGltYWdlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPCBtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpOyBpbWFnZUluZGV4KyspIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOwogICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJoZWlmIGltYWdlICV1IGhhcyBubyBtZXRhISIsIGltYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjYxLDI2ICs2NzksMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOworICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTcwNSw3ICs3MjYsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtOTIxLDggKzk0Miw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NTYsMTQgKzk3NywzMyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBwYXNzIHVkYXRhIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIGlmIChtSXNRVCAmJiBzdG9wX29mZnNldCAtICpvZmZzZXQgPT0gNCAmJiBjaHVua190eXBlID09IEZPVVJDQygidWR0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHVkdGEgdGVybWluYXRlcyB3aXRoIHRlcm1pbmF0ZSBjb2RlIHgwMDAwMDAwMAorICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgMCB0ZXJtaW5hdG9yIGlzIG9wdGlvbmFsIGFuZCB3ZSBqdXN0IGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlcm1pbmF0ZV9jb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmdGVybWluYXRlX2NvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB0ZXJtaW5hdGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlRlcm1pbmFsIGNvZGUgZm9yIHVkdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgdWR0YSBUZXJtaW5hbCBjb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CkBAIC05ODAsOCArMTAyMCwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwNTcsNyArMTA5OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDg0LDYgKzExMjYsNyBAQAogCiAgICAgICAgICAgICBpZiAoZW50cnlfY291bnQgIT0gMSkgewogICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBlbnRyeSBhdCB0aGUgbW9tZW50LCBmb3IgZ2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIG9yIHN0YXJ0IG9mZnNldAogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCAlZCBlbnRyaWVzIiwgZW50cnlfY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CkBAIC0xMTMzLDEyICsxMTc2LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwogICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgdHlwZSBpcyAnYWxhYycsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHBhcmFtZXRlcnMKQEAgLTExNjcsMTEgKzEyMTMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKIAogICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgc2l6ZSBvZiBBTEFDIFNwZWNpZmljIEluZm8gKDM2IGJ5dGVzKSBhbmQgdGVybWluYXRvcgogICAgICAgICAgICAgICAgIC8vIGF0b20gKDggYnl0ZXMpLgpAQCAtMTI3MiwxNiArMTMyMSwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHRtcEFsZ29yaXRobUlkOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnRtcEFsZ29yaXRobUlkKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmdG1wQWxnb3JpdGhtSWQpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIGRlZmF1bHRJVlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQzMCw4ICsxNDg2LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OCw4ICsxNTE0LDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTMsNyArMTU0OCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUzMyw5ICsxNTg4LDQwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUHJpb3IgdG8gQVBJIDI5LCB0aGUgbWV0YWRhdGEgdHJhY2sgd2FzIG5vdCBjb21wbGlhbnQgd2l0aCBJU08vSUVDCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMi0yMDE1LiBUaGlzIGxlZCB0byBzb21lIElTTy1jb21wbGlhbnQgcGFyc2VycyBmYWlsaW5nIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAvLyBtZXRhdHJhY2suIEFzIG9mIEFQSSAyOSBhbmQgb253YXJkcywgYSBjaGFuZ2Ugd2FzIG1hZGUgdG8gbWV0YWRhdGEgdHJhY2sgdG8KKyAgICAgICAgICAgIC8vIG1ha2UgaXQgY29tcGxpYW50IHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBpbnQgbnVsbF9wb3MgPSAwOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgd2hpbGUgKG51bGxfcG9zIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgIGlmICgqKHN0ciArIG51bGxfcG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytudWxsX3BvczsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG51bGxfcG9zID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRFbmNvZGluZygoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4KSk7CisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4ICsgY29udGVudEVuY29kaW5nLnNpemUoKSArIDEpLAorICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplIC0gOCAtIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NDYsMTAgKzE2MzIsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygibXA0YSIpCi0gICAgICAgICAgICAgICAgICAgICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBtcDRhIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgYXRvbXMgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCiAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTU3OCw3ICsxNjY1LDcgQEAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwogCi0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1wNGEiKSkgeworICAgICAgICAgICAgaWYgKG1Jc1FUKSB7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIDE2KSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xNjEzLDIwICsxNzAwLDIzIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jYSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIHNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ0d29zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJhbGFjIikpIHsKIApAQCAtMTY1MiwxMSArMTc0MiwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNvb2tpZVs5XSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgVTMyX0FUKCZjb29raWVbMjBdKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoY29va2llKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOwpAQCAtMTY4Myw2ICsxNzc2LDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImh2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImhldjEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKICAgICAgICAgewogICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNzE0LDEwICsxODA4LDExIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTgwNSwxMiArMTkwMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgibWF4IHNhbXBsZSBzaXplIHRvbyBiaWc6ICV6dSIsIG1heF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSArIDEwICogMik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSArIDEwICogMik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIHNpemUgd2FzIHNwZWNpZmllZC4gUGljayBhIGNvbnNlcnZhdGl2ZWx5IGxhcmdlIHNpemUuCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlXaWR0aCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlIZWlnaHQsKGludDMyX3QqKSAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsKGludDMyX3QqKSAmaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gd2lkdGggb3IgaGVpZ2h0LCBhc3N1bWluZyB3b3JzdCBjYXNlIDEwODBwIik7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTA4MDsKQEAgLTE4MjUsNyArMTkyMyw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhdWRpbywgdXNlIDEyOEtCCiAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gMTAyNCAqIDEyODsKQEAgLTE4NDIsMjYgKzE5NDAsMjggQEAKICAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgogICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKICAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBmcmFtZSByYXRlLgogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgblNhbXBsZXMgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Y291bnRTYW1wbGVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5TYW1wbGVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgLyB0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg2OSwxNSArMTk2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAoblNhbXBsZXMgKiAxMDAwMDAwTEwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvblVzID4+IDEpKSAvIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIGZyYW1lIGNvdW50ICV6dSIsIG5TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVDb3VudCwgblNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCBuU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xODkxLDYgKzE5OTQsMTMgQEAKIAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCisgICAgICAgICAgICBpZiAoZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdICE9IEZPVVJDQygic3RibCIpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaHVua1s1XTsKKyAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoW2RlcHRoIC0gMV0sIGNodW5rKTsKKyAgICAgICAgICAgICAgICBBTE9HVygic3R0cydzIHBhcmVudCBib3ggKCVzKSBpcyBub3Qgc3RibCwgc2tpcCBpdC4iLCBjaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFRpbWVUb1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTk4NSw3ICsyMDk1LDcgQEAKICAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiwgJmJ1ZmZlclswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTk3LDkgKzIxMDcsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA+IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IHRtcC5nZXQoKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTIwMTUsOCArMjEyNiw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKICAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCJtcDRhIikpIHsKQEAgLTIwNDAsNyArMjE1MSw4IEBACiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDY3LDEwICsyMTc5LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbNF0pOwogICAgICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjA5NCw4ICsyMjA4LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxMTYsMTMgKzIyMzAsMzUgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZDI2MyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0yMTUyLDcgKzIyODgsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyODAsMTUgKzI0MTcsMTUgQEAKICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJiBkdXJhdGlvbiA8IFVJTlQ2NF9NQVggLyAxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggczsKICAgICAgICAgICAgIGlmIChjb252ZXJ0VGltZVRvRGF0ZShjcmVhdGlvblRpbWUsICZzKSkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUsIHMuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIzMzAsNyArMjQ2Nyw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjQsNyArMjUwMiw4IEBACiAgICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCiAgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoInRleHQiKSB8fCB0eXBlID09IEZPVVJDQygic2J0bCIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjQwOCwxMSArMjU0NywxMCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjQzOSw4ICsyNTc3LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKIAogICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogCkBAIC0yNDcyLDggKzI2MTAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ3LDcgKzI2ODUsNDAgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVjLTMiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGVjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlRUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgZWMtMyIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBhYy00IGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUFDNFNwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgYWMtNCIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCJmdHlwIik6CkBAIC0yNjIxLDM2ICsyNzkyLDMzMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpIHsKICAgICAvLyBza2lwIDE2IGJ5dGVzOgogICAgIC8vICArIDYtYnl0ZSByZXNlcnZlZCwKICAgICAvLyAgKyAyLWJ5dGUgZGF0YSByZWZlcmVuY2UgaW5kZXgsCiAgICAgLy8gICsgOC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDE2OwotICAgIHVpbnQxNl90IGNoYW5uZWxDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmY2hhbm5lbENvdW50KSkgeworICAgICpvZmZzZXQgKz0gMTY7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIGNoYW5uZWwgY291bnQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCA4IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAogICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICpvZmZzZXQgKz0gODsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotCiAgICAgLy8gc2tpcCA0IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBzYW1wbGVSYXRlLAogICAgIC8vICArIDItYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA0OwotICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KG9mZnNldCwgc2FtcGxlUmF0ZSk7CisgICAgKm9mZnNldCArPSA0OworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVsQ291bnQsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0TWluaW11bUJveFNpemUgPSA0ICsgNCArIDM7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUM0TWluaW11bUJveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkYWM0IikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSA9IDExNzY7CisgICAgdWludDhfdCBjaHVua1trQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZV07CisgICAgc3NpemVfdCBkc2lTaXplID0gc2l6ZSAtIDg7IC8vIHNpemUgb2YgYm94IC0gc2l6ZSBhbmQgdHlwZSBmaWVsZHMKKyAgICBpZiAoZHNpU2l6ZSA+PSAoc3NpemVfdClrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSB8fAorICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIGRzaVNpemUpICE9IGRzaVNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gKyBzaXplLWJ5dGUgcGF5bG9hZAorICAgIG9mZnNldCArPSBkc2lTaXplOworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIGRzaVNpemUpOworICAgIEFDNERTSVBhcnNlciBwYXJzZXIoYnIpOworICAgIGlmICghcGFyc2VyLnBhcnNlKCkpeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBzcGVjaWZpYyBibG9jayIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIHByZXNlbnRhdGlvbnM7CisgICAgLy8gdHJhbnNsYXRlIHRoZSBBQzQgcHJlc2VudGF0aW9uIGluZm9ybWF0aW9uIHRvIGF1ZGlvIHByZXNlbnRhdGlvbnMgZm9yIHRoaXMgdHJhY2sKKyAgICBBQzREU0lQYXJzZXI6OkFDNFByZXNlbnRhdGlvbnMgYWM0UHJlc2VudGF0aW9ucyA9IHBhcnNlci5nZXRQcmVzZW50YXRpb25zKCk7CisgICAgaWYgKCFhYzRQcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhYzRQcmVzZW50YXRpb24gOiBhYzRQcmVzZW50YXRpb25zKSB7CisgICAgICAgICAgICBhdXRvJiBwcmVzZW50YXRpb24gPSBhYzRQcmVzZW50YXRpb24uc2Vjb25kOworICAgICAgICAgICAgaWYgKCFwcmVzZW50YXRpb24ubUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb24ubUdyb3VwSW5kZXg7CisgICAgICAgICAgICBhcC5tUHJvZ3JhbUlkID0gcHJlc2VudGF0aW9uLm1Qcm9ncmFtSUQ7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBwcmVzZW50YXRpb24ubUxhbmd1YWdlOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbi5tUHJlVmlydHVhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uLm1DaGFubmVsTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfTW9ubzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX1N0ZXJlbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NURVJFTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfM18wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8xOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzUyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzUyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1VSUk9VTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8yMl8yOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbW9kZSBpbiBBQzQgcHJlc2VudGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1Zpc3VhbGx5SW1wYWlyZWQpOworICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVm9pY2VPdmVyKTsKKyAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gcHJlc2VudGF0aW9uLm1IYXNEaWFsb2dFbmhhbmNlbWVudHM7CisgICAgICAgICAgICBpZiAoIWFwLm1MYW5ndWFnZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKGFwLm1MYW5ndWFnZSwgcHJlc2VudGF0aW9uLm1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gQ2xlYXIgYXVkaW8gcHJlc2VudGF0aW9uIGluZm8gaW4gbWV0YWRhdGEuCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgbnVsbHB0ciwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICAgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSA9IDExOworICAgIC8vIDEzICsgMyArICg4ICogKDIgKyA1ICsgNSArIDMgKyAxICsgMyArIDQgKyAoMTQgKiA5ICsgMSkpKSBiaXRzID09IDE1MiBieXRlcyB0aGVvcmV0aWNhbCBtYXgKKyAgICAvLyBjYWxjdWxhdGVkIGZyb20gdGhlIHJlcXVpcmVkIGJpdHMgcmVhZCBiZWxvdyBhcyB3ZWxsIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRlcGVuZGVudAorICAgIC8vIGFuZCBkZXBlbmRhbnQgc3ViIHN0cmVhbXMgeW91IGNhbiBoYXZlCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1heFNpemUgPSAxNTI7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8CisgICAgICAgIHNpemUgPCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSB8fAorICAgICAgICBzaXplID4ga0VBQzNTcGVjaWZpY0JveE1heFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkZWMzIikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRlYzMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50OF90KiBjaHVuayA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemVdOworICAgIGlmIChjaHVuayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZSk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdW5zaWduZWQgZGF0YV9yYXRlID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQUxPR1YoIkVBQzMgZGF0YSByYXRlID0gJWQiLCBkYXRhX3JhdGUpOworCisgICAgdW5zaWduZWQgbnVtX2luZF9zdWIgPSBici5nZXRCaXRzKDMpICsgMTsKKyAgICBBTE9HVigiRUFDMyBpbmRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1faW5kX3N1Yik7CisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAobnVtX2luZF9zdWIgKiAyMykpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2luZF9zdWI7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IGZzY29kICgzKSBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGJveFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlVGFibGVbZnNjb2RdOworICAgICAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICBib3hTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOworICAgICAgICBpZiAoYnNpZCA9PSA5IHx8IGJzaWQgPT0gMTApIHsKKyAgICAgICAgICAgIEFMT0dXKCJFQUMzIHN0cmVhbSAoYnNpZD0lZCkgbWF5IGJlIHNpbGVuY2VkIGJ5IHRoZSBkZWNvZGVyIiwgYnNpZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYnNpZCA+IDE2KSB7CisgICAgICAgICAgICBBTE9HRSgiRUFDMyBzdHJlYW0gKGJzaWQ9JWQpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRVRTSSBUUyAxMDIgMzY2IHYxLjQuMSIsIGJzaWQpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcAorICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgdW5zaWduZWQgYnNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoImJzbW9kID0gJWQsIGFjbW9kID0gJWQsIGxmZW9uID0gJWQiLCBic21vZCwgYWNtb2QsIGxmZW9uKTsKKworICAgICAgICBici5za2lwQml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX2RlcF9zdWIgPSBici5nZXRCaXRzKDQpOworICAgICAgICBBTE9HVigiRUFDMyBkZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2RlcF9zdWIpOworICAgICAgICBpZiAobnVtX2RlcF9zdWIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA5KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjaGFuX2xvY190YmxbXSA9IHsgIkxjL1JjIiwiTHJzL1JycyIsIkNzIiwiVHMiLCJMc2QvUnNkIiwKKyAgICAgICAgICAgICAgICAiTHcvUnciLCJMdmgvUnZoIiwiQ3ZoIiwiTGZlMiIgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5fbG9jID0gYnIuZ2V0Qml0cyg5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1hc2sgPSAxOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDk7IGorKywgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbl9sb2MgJiBtYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSAyIGNoYW5uZWxzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwIHx8IGogPT0gMSB8fCBqID09IDQgfHwgaiA9PSA1IHx8IGogPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgJXMiLCBjaGFuX2xvY190Ymxbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBici5nZXRCaXRzKDgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiYgbWFzaykgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV4aXR5ID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGEgSk9DIHN0cmVhbSB3aXRoIGNvbXBsZXhpdHkgPSAlZCIsIGNvbXBsZXhpdHkpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBkZWxldGVbXSBjaHVuazsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAvLyArIDQtYnl0ZSBzaXplCiAgICAgLy8gKyA0LWJ5dGUgdHlwZQpAQCAtMjcwNSwxMiArMzE3MCw5IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4MzAsOCArMzI5Miw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjkyOSw3ICszMzkyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLCAqKGZsb2F0ICopJnZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKICAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCkBAIC0yOTM4LDcgKzM0MDEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQsIHZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZApAQCAtMjk5Miw3ICszNDU2LDcgQEAKICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CkBAIC0zMDI4LDE1ICszNDkyLDE1IEBACiAgICAgfQogCiAgICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKICAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IEFNRURJQUZPUk1BVF9LRVlfV0lEVEggYW5kIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULgogICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCB3aWR0aCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGhlaWdodCA+PiAxNik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zMDY0LDUwICszNTI4LDUwIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKICAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxYWxiIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFBUlQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFkYXkiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInllYXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFuYW0iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MXdydCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImNvdnIiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnQ7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bWFydCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWdlbiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJjcGlsIik6CkBAIC0zMTE3LDcgKzM1ODEsNyBAQAogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxMjksNyArMzU5Myw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbFRyYWNrcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwVHJhY2spLCBudG9ocygqcFRvdGFsVHJhY2tzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE0MSw3ICszNjA1LDcgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsRGlzY3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcERpc2MpLCBudG9ocygqcFRvdGFsRGlzY3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGlzY051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTg1LDggKzM2NDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTMyMDEsMTIgKzM2NjcsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYgIW1GaWxlTWV0YURhdGEuaGFzRGF0YShtZXRhZGF0YUtleSkpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgdm9pZCAqdG1wRGF0YTsKKyAgICBzaXplX3QgdG1wRGF0YVNpemU7CisgICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJgorICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpKSB7CisgICAgICAgIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiYWxidW1hcnQiKSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgOCwgc2l6ZSAtIDgpOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlHZW5yZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJnZW5yZSIpKSB7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQogICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0CkBAIC0zMjIwLDE4ICszNjg4LDE4IEBACiAgICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07CiAgICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIGdlbnJlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKICAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI2MSwyMSArMzcyOSwzMSBAQAogICAgIGludDMyX3QgdHlwZSA9IFUzMl9BVCgmYnVmZmVyWzBdKTsKICAgICBpZiAoKHR5cGUgPT0gRk9VUkNDKCJuY2x4IikgJiYgc2l6ZSA+PSAxMSkKICAgICAgICAgICAgIHx8ICh0eXBlID09IEZPVVJDQygibmNsYyIpICYmIHNpemUgPj0gMTApKSB7Ci0gICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOwotCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotCiAgICAgICAgIC8vIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGNvbG9yIHNwZWNpZmljYXRpb24KLSAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmhhc0RhdGEoa0tleUNvbG9yUHJpbWFyaWVzKSkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUmFuZ2UsIGFzcGVjdHMubVJhbmdlKTsKKyAgICAgICAgaW50MzJfdCBleGlzdGluZ0NvbG9yOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsICZleGlzdGluZ0NvbG9yKSkgeworICAgICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7CisgICAgICAgICAgICBpbnQzMl90IGlzb3RyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygibmNseCIpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7CisKKyAgICAgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZCA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMDsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWVzLCBpc290cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworCisgICAgICAgICAgICBpZiAocmFuZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhbmRhcmQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhbnNmZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMzMDIsMjYgKzM3ODAsMjYgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgIH0KIAotICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBjb25zdCBjaGFyICptZXRhZGF0YUtleSA9IG51bGxwdHI7CiAgICAgc3dpdGNoIChtUGF0aFtkZXB0aF0pIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoInRpdGwiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygicGVyZiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImF1dGgiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJnbnJlIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiZ2VucmUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYm0iKToKQEAgLTMzMzAsMTAgKzM4MDgsMTAgQEAKICAgICAgICAgICAgICAgY2hhciB0bXBbNF07CiAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCBidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJ5cnJjIik6CkBAIC0zMzUxLDcgKzM4MjksNyBAQAogICAgICAgICAgICAgaWYgKHllYXIgPCAxMDAwMCkgewogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCB5ZWFyKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5WWVhciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfWUVBUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMzYwLDcgKzM4MzgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1ldGFkYXRhS2V5ID4gMCkgeworICAgIGlmIChtZXRhZGF0YUtleSkgewogICAgICAgICBib29sIGlzVVRGOCA9IHRydWU7IC8vIENvbW1vbiBjYXNlCiAgICAgICAgIGNoYXIxNl90ICpmcmFtZWRhdGEgPSBOVUxMOwogICAgICAgICBpbnQgbGVuMTYgPSAwOyAvLyBOdW1iZXIgb2YgVVRGLTE2IGNoYXJhY3RlcnMKQEAgLTMzOTYsMTEgKzM4NzQsMTEgQEAKIAogICAgICAgICBpZiAoaXNVVEY4KSB7CiAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBVVEYtMTYgc3RyaW5nIHRvIFVURi04IHN0cmluZy4KICAgICAgICAgICAgIFN0cmluZzggdG1wVVRGOHN0cihmcmFtZWRhdGEsIGxlbjE2KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzQxNSwyNyArMzg5MywyOSBAQAogCiAgICAgaWYgKGlkMy5pc1ZhbGlkKCkpIHsKICAgICAgICAgc3RydWN0IE1hcCB7Ci0gICAgICAgICAgICBpbnQga2V5OworICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgICAgIH07CiAgICAgICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKLSAgICAgICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAotICAgICAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BTEJVTSwgIlRBTEIiLCAiVEFMIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIsICJUQ09NIiwgIlRDTSIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfWUVBUiwgIlRZRSIsICJUWUVSIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCAiVFBBIiwgIlRQT1MiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKIAorICAgICAgICB2b2lkICp0bXBEYXRhOworICAgICAgICBzaXplX3QgdG1wRGF0YVNpemU7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwga01hcFtpXS5rZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpKSB7CiAgICAgICAgICAgICAgICAgSUQzOjpJdGVyYXRvciAqaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMSk7CiAgICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwpAQCAtMzQ1MSw3ICszOTMxLDcgQEAKICAgICAgICAgICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwga01hcFtpXS5rZXksIHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM0NjAsMTMgKzM5NDAsMTIgQEAKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwgZGF0YSwgZGF0YVNpemUpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUc0RXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDg5LDcgKzM5NjgsNyBAQAogCiAgICAgVHJleCAqdHJleCA9IE5VTEw7CiAgICAgaW50MzJfdCB0cmFja0lkOwotICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CkBAIC0zNTA1LDE2ICszOTg0LDE1IEBACiAgICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJXp1IiwgbVBzc2guc2l6ZSgpKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgaWYgKCF0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3A8SXRlbVRhYmxlPiBpdGVtVGFibGU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCkBAIC0zNTI1LDEwICs0MDAzLDkgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzU0MCwxMSArNDAxNywyOSBAQAogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgewogICAgICAgICAgICAgaXRlbVRhYmxlID0gbUl0ZW1UYWJsZTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCBhbmQgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSBhbmQgdHJhY2stPmVsc3RfbWVkaWFfdGltZSA+IDApIHsKKyAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOworICAgICAgICBBTE9HVigidmlkZW8gdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgOiUiIFBSSWQ2NCwgdHJhY2stPmVsc3RfbWVkaWFfdGltZSk7CiAgICAgfQogCiAgICAgTVBFRzRTb3VyY2UgKnNvdXJjZSA9ICBuZXcgTVBFRzRTb3VyY2UoCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSk7CisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUsCisgICAgICAgICAgICB0cmFjay0+ZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CiAgICAgICAgIGRlbGV0ZSBzb3VyY2U7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzU1NSwyNiArNDA1MCwyNiBAQAogLy8gc3RhdGljCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKSB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlRVNEUykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRVNEUywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NTksMTYgKzQxNTQsMTQgQEAKICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uICA9PSAweDZiKSB7Ci0gICAgICAgIC8vIFRoZSBtZWRpYSBzdWJ0eXBlIGlzIE1QMyBhdWRpbwotICAgICAgICAvLyBPdXIgc29mdHdhcmUgTVAzIGF1ZGlvIGRlY29kZXIgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZQotICAgICAgICAvLyBwYWNrZXRpemVkIE1QMyBhdWRpbzsgZm9yIG5vdywgbGV0cyBqdXN0IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRAotICAgICAgICBBTE9HRSgiTVAzIHRyYWNrIGluIE1QNC8zR1BQIGZpbGUgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NkIgfHwgb2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2OSkgeworICAgICAgICAvLyBtcDMgYXVkaW8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CkBAIC0zNjc2LDEwICs0MTY5LDEyIEBACiAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSAwOwogICAgICAgICBlc2RzLmdldEJpdFJhdGUoJm1heEJpdHJhdGUsICZhdmdCaXRyYXRlKTsKICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3MjMsNyArNDIxOCw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAvL2tlZXAgQU9UIHR5cGUKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlBQUNBT1QsIG9iamVjdFR5cGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCBvYmplY3RUeXBlKTsKIAogICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAKQEAgLTM3NDQsNyArNDIzOSw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCisgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YmwgMS4xMwogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKQEAgLTM3NjEsNyArNDI1Niw3IEBACiAgICAgICAgICAgICBleHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogc2F2ZSB0aGUgZXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgdmFsdWUgaW4gbWV0YSBkYXRhID0+Ci0gICAgICAgIC8vICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CisgICAgICAgIC8vICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CkBAIC0zOTE0LDI0ICs0NDA5LDI1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQzMl90IHByZXZTYW1wbGVSYXRlOwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnByZXZTYW1wbGVSYXRlKSk7CiAKICAgICBpZiAocHJldlNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gc2FtcGxlIHJhdGUgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKIAogICAgIGludDMyX3QgcHJldkNoYW5uZWxDb3VudDsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmcHJldkNoYW5uZWxDb3VudCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmcHJldkNoYW5uZWxDb3VudCkpOwogCiAgICAgaWYgKHByZXZDaGFubmVsQ291bnQgIT0gbnVtQ2hhbm5lbHMpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWwgY291bnQgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldkNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bUNoYW5uZWxzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5MzksMTQgKzQ0MzUsMTUgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKQorICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzk2Nyw0NiArNDQ2NCw1MCBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCiAgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CisgICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSksCisgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyhlbHN0U2hpZnRTdGFydFRpY2tzKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMTYsMTAgKzQ1MTcsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMzQsMzIgKzQ1MzQsNTQgQEAKICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKTsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CiAKICAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKICAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKIAogICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgeworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKQorICAgICAgICAgICAgICAgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgewogICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICAgICAgbUlzUGNtID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybWF0LnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYoZXJyID09IE9LICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikKKyAgICAgICAgICAgICYmICFtQ3VycmVudFNhbXBsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgICAgICAvLyBJU08gOiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQsIHZlcnNpb24gMCAodW5zaWduZWQpIGZvciBtYWpvciBicmFuZHMuCisgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLAorICAgICAgICAgICAgICAgICgqbUN1cnJlbnRTYW1wbGVzLmJlZ2luKCkpLmNvbXBvc2l0aW9uT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICB1aW50NjRfdCBmaXJzdFNhbXBsZUNUUyA9IDA7CisgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoMCwgTlVMTCwgTlVMTCwgJmZpcnN0U2FtcGxlQ1RTKTsKKyAgICAgICAgLy8gU3RhcnQgb2Zmc2V0IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2YgZmlyc3Qgc2FtcGxlLgorICAgICAgICAvLyBDb21wb3NpdGlvbiB0aW1lIHN0YW1wIG9mIGZpcnN0IHNhbXBsZSBjYW5ub3QgYmUgbmVnYXRpdmUuCisgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzID0gc3RkOjptaW4obUVsc3RTaGlmdFN0YXJ0VGlja3MsIChpbnQzMl90KWZpcnN0U2FtcGxlQ1RTKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBNUEVHNFNvdXJjZTo6fk1QRUc0U291cmNlKCkgewpAQCAtNDA3MCwyMSArNDU5MiwxMyBAQAogICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgaW50MzJfdCB2YWw7Ci0gICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZ2YWwpCi0gICAgICAgICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gZmFsc2U7Ci0gICAgfQotCiAgICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmdG1wKSk7CiAgICAgc2l6ZV90IG1heF9zaXplID0gdG1wOwogCiAgICAgLy8gQSBzb21ld2hhdCBhcmJpdHJhcnkgbGltaXQgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgOGsgdmlkZW8gZnJhbWVzCkBAIC00MDkyLDMyICs0NjA2LDMwIEBACiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJTaXplID0gNjQgKiAxMDI0ICogMTAyNDsKICAgICBpZiAobWF4X3NpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewogICAgICAgICBBTE9HRSgiYm9ndXMgbWF4IGlucHV0IHNpemU6ICV6dSA+ICV6dSIsIG1heF9zaXplLCBrTWF4QnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBpZiAobWF4X3NpemUgPT0gMCkgewogICAgICAgICBBTE9HRSgiemVybyBtYXggaW5wdXQgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICAvLyBBbGxvdyB1cCB0byBrTWF4QnVmZmVycywgYnV0IG5vdCBpZiB0aGUgdG90YWwgZXhjZWVkcyBrTWF4QnVmZmVyU2l6ZS4KICAgICBjb25zdCBzaXplX3Qga0luaXRpYWxCdWZmZXJzID0gMjsKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlcnMgPSA4OwogICAgIGNvbnN0IHNpemVfdCByZWFsTWF4QnVmZmVycyA9IG1pbihrTWF4QnVmZmVyU2l6ZSAvIG1heF9zaXplLCBrTWF4QnVmZmVycyk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOworICAgIG1CdWZmZXJHcm91cC0+aW5pdChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CiAgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKICAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCi0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CkBAIC00MTMwLDEzICs0NjQyLDEwIEBACiAgICAgZGVsZXRlW10gbVNyY0J1ZmZlcjsKICAgICBtU3JjQnVmZmVyID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CkBAIC00MjU0LDcgKzQ3NjMsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJzYWlvIik6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC00Mzg1LDcgKzQ4OTUsOCBAQAogICAgIGlmIChlbnRyeWNvdW50ID4gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSkgewogICAgICAgICB1aW50NjRfdCAqbmV3UHRyID0gKHVpbnQ2NF90ICopcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID0gbmV3UHRyOwpAQCAtNDQyNCwxMCArNDkzNSwxMyBAQAogICAgIHJldHVybiBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoZHJtb2Zmc2V0LCBmYWxzZSwgMCk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgewogCi0gICAgaW50IGl2bGVuZ3RoOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmaXZsZW5ndGgpKTsKKyAgICBpbnQzMl90IGl2bGVuZ3RoOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJml2bGVuZ3RoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIC8vIG9ubHkgMCwgOCBhbmQgMTYgYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzIGFyZSBzdXBwb3J0ZWQKICAgICBpZiAoaXZsZW5ndGggIT0gMCAmJiBpdmxlbmd0aCAhPSA4ICYmIGl2bGVuZ3RoICE9IDE2KSB7CkBAIC00NjEwLDcgKzUxMjQsNyBAQAogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VUcmFja0ZyYWdtZW50UnVuKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpIHsKIAotICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuIik7CisgICAgQUxPR1YoIk1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKICAgICBpZiAoc2l6ZSA8IDgpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtNDcxNyw3ICs1MjMxLDcgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IChvZmY2NF90KShzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSkgeworICAgIGlmIChzaXplIDwgKG9mZjY0X3Qpc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTQ3NTIsMTAgKzUyNjYsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCisgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IGN0c09mZnNldCAlIiBQUkl1MzIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MsIHNhbXBsZUN0c09mZnNldCk7CiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOwpAQCAtNDc3MSwxMCArNTI4NSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtZXRhID0gbUZvcm1hdDsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewpAQCAtNDc5NiwxNSArNTMxMCw0NCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworaW50MzJfdCBNUEVHNFNvdXJjZTo6cGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLKGRhdGEgIT0gbnVsbHB0ciAmJiBzaXplID49IChtTkFMTGVuZ3RoU2l6ZSArIDIpKTsKKworICAgIC8vIEhFVkMgTkFMLWhlYWRlciAoMTYtYml0KQorICAgIC8vICAxICAgNiAgICAgIDYgICAgIDMKKyAgICAvLyB8LXx1dXV1dXV8LS0tLS0tfGlpaXwKKyAgICAvLyAgICAgIF4gICAgICAgICAgICBeCisgICAgLy8gIE5BTF90eXBlICAgICAgICBsYXllcl9pZCArIDEKKyAgICAvLworICAgIC8vIExheWVyLWlkIGlzIG5vbi16ZXJvIG9ubHkgZm9yIFRlbXBvcmFsIFN1Yi1sYXllciBBY2Nlc3MgcGljdHVyZXMgKFRTQSkKKyAgICBlbnVtIHsKKyAgICAgICAgVFNBX04gPSAyLAorICAgICAgICBUU0FfUiA9IDMsCisgICAgICAgIFNUU0FfTiA9IDQsCisgICAgICAgIFNUU0FfUiA9IDUsCisgICAgfTsKKworICAgIGRhdGEgKz0gbU5BTExlbmd0aFNpemU7CisgICAgdWludDE2X3QgbmFsSGVhZGVyID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKworICAgIHVpbnQxNl90IG5hbFR5cGUgPSAobmFsSGVhZGVyID4+IDkpICYgMHgzRnU7CisgICAgaWYgKG5hbFR5cGUgPT0gVFNBX04gfHwgbmFsVHlwZSA9PSBUU0FfUiB8fCBuYWxUeXBlID09IFNUU0FfTiB8fCBuYWxUeXBlID09IFNUU0FfUikgeworICAgICAgICBpbnQzMl90IGxheWVySWRQbHVzT25lID0gbmFsSGVhZGVyICYgMHg3dTsKKyAgICAgICAgQUxPR0RfSUYobGF5ZXJJZFBsdXNPbmUgPT0gMCwgImdvdCBsYXllcklkIDAgZm9yIFRTQSBwaWN0dXJlIik7CisgICAgICAgIHJldHVybiBsYXllcklkUGx1c09uZSAtIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA+IDApIHsKQEAgLTQ4MTgsMTIgKzUzNjEsMTMgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKwogICAgICAgICBpZiAobUlzSGVpZikgewogICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VJbmRleDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZpbWFnZUluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmaW1hZ2VJbmRleCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNDgzMyw3ICs1Mzc3LDcgQEAKICAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kVGh1bWJuYWlsSXRlbShpbWFnZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVJbmRleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBmaW5kRmxhZ3MgPSAwOwpAQCAtNDg1NSw2ICs1Mzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1vZGUgIT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzICs9ICgoaW50NjRfdCltRWxzdFNoaWZ0U3RhcnRUaWNrcyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCkBAIC00ODc1LDcgKzU0MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVUaW1lOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpOwpAQCAtNDg4OCwxNCArNTQzNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAogICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbi4gTGVnYWN5IGJlaGF2aW91ciBhcHBlYXJzIHRvIGJlIHRvIGJlaGF2ZSBhcyBpZgogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYWQgc2Vla2VkIHRvIHRoZSBlbmQgb2Ygc3RyZWFtLCBlbmRpbmcgbm9ybWFsbHkuCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVAogICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOwogICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5MjQsNyArNTQ3Miw3IEBACiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGN0cywgc3R0czsKKyAgICB1aW50NjRfdCBjdHMsIHN0dHM7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGU7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CkBAIC00OTM0LDYgKzU0ODIsMTAgQEAKICAgICAgICAgaWYgKCFtSXNIZWlmKSB7CiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmN0cywgJmlzU3luY1NhbXBsZSwgJnN0dHMpOworICAgICAgICAgICAgaWYoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgY3RzIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOworICAgICAgICAgICAgfQorCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPwpAQCAtNDk0NSwyNCArNTQ5NywyNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOyAvLyBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDICYmICFtSXNBQzQpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgaWYgKG1Jc1BjbSkgewogICAgICAgICAgICAgICAgIC8vIFRoZSB0d29zJyBQQ00gYmxvY2sgcmVhZGVyIGFzc3VtZXMgdGhhdCBhbGwgc2FtcGxlcyBoYXMgdGhlIHNhbWUgc2l6ZS4KQEAgLTQ5NzcsMjIgKzU1MzIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzVG9SZWFkLCBzaXplLCBtQ3VycmVudFNhbXBsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKIAotICAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKKyAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKICAgICAgICAgICAgICAgICB1aW50OF90KiBidWYgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IChzc2l6ZV90KXRvdGFsU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU9yZGVyOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlQY21CaWdFbmRpYW4sICZieXRlT3JkZXIpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgJmJ5dGVPcmRlcik7CiAKICAgICAgICAgICAgICAgICBpZiAoYnl0ZU9yZGVyID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQmlnLWVuZGlhbiAtPiBsaXR0bGUtZW5kaWFuCkBAIC01MDE0LDE2NiArNTU3Miw4MSBAQAogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICAgICAgICAgIH0KLQorIAogICAgICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gQU1FRElBX09LOwogCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKLSAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOwotCisgICAgfSBlbHNlIGlmIChtSXNBQzQpIHsKICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQotICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCi0gICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgc3luYyBoZWFkZXIgYW5kIHRoZSByYXcgZnJhbWUKKyAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgKDcgKyBzaXplKSkgewogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgLy8gQWRkIEFDLTQgc3luYyBoZWFkZXIgdG8gTVBFRzQgZW5jYXBzdWxhdGVkIEFDLTQgcmF3IGZyYW1lCisgICAgICAgIC8vIEFDNDAgc3luYyB3b3JkLCBtZWFuaW5nIG5vIENSQyBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZQorICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4QUM7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHg0MDsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEZGOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDE2KSAmIDB4RkYpOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiA4KSAmIDB4RkYpOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiAwKSAmIDB4RkYpOwogCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkc3REYXRhICsgZHN0T2Zmc2V0LCBzaXplKTsKKyAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwotICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjcyMDg2MjEiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KIAotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0ICsgc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01MTgxLDEyICs1NjU0LDEwNSBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKKyAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgorICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKKyAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7CisKKyAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIC8vaWYgbmFsbGVuZ3RoIGFibm9ybWFsLGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICBBTE9HVygiYWJub3JtYWwgbmFsbGVuZ3RoLCBpZ25vcmUgdGhpcyBOQUwiKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgPSBzaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0FWQykgeworICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAKICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkIik7CiAKQEAgLTUyMDAsNiArNTc2NiwxMCBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAKKyAgICAgICAgc2Vla1RpbWVVcyArPSAoKGludDY0X3QpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgIEFMT0dWKCJzaGlmdGVkIHNlZWtUaW1lVXMgOiUiIFBSSWQ2NCAiLCBtRWxzdFNoaWZ0U3RhcnRUaWNrczolIiBQUklkMzIsIHNlZWtUaW1lVXMsCisgICAgICAgICAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MpOworCiAgICAgICAgIGludCBudW1TaWR4RW50cmllcyA9IG1TZWdtZW50cy5zaXplKCk7CiAgICAgICAgIGlmIChudW1TaWR4RW50cmllcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRvdGFsVGltZSA9IDA7CkBAIC01MjI3LDcgKzU3OTcsNyBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOwogICAgICAgICB9IGVsc2UgewpAQCAtNTIzOSw3ICs1ODA5LDcgQEAKICAgICAgICAgICAgIG9mZjY0X3QgdG1wID0gbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG1wKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CiAgICAgICAgIH0KQEAgLTUyNTcsMTMgKzU4MjcsMTcgQEAKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAorICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKQEAgLTUyNzEsMTAgKzU4NDUsMTAgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01MjgyLDU5ICs1ODU2LDYxIEBACiAgICAgICAgIG9mZnNldCA9IHNtcGwtPm9mZnNldDsKICAgICAgICAgc2l6ZSA9IHNtcGwtPnNpemU7CiAgICAgICAgIGN0cyA9IG1DdXJyZW50VGltZSArIHNtcGwtPmNvbXBvc2l0aW9uT2Zmc2V0OwotICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247Ci0gICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOyAvLyBYWFgKKyAgICAgICAgY3RzIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOworCisgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICBNZXRhRGF0YUJhc2UgJmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBidWZtZXRhLmNsZWFyKCk7CisgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKGJ1Zm1ldGEpOwogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCiAgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOwotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgICAgIGNvbnN0IHZvaWQgKml2ID0gTlVMTDsKKyAgICAgICAgdm9pZCAqaXYgPSBOVUxMOwogICAgICAgICBzaXplX3QgaXZsZW5ndGggPSAwOwotICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZERhdGEoCi0gICAgICAgICAgICAgICAga0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZsZW5ndGgpKSB7Ci0gICAgICAgICAgICBpdiA9IHNtcGwtPml2OworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAiY3J5cHRvLWl2IiwgJml2LCAmaXZsZW5ndGgpKSB7CisgICAgICAgICAgICBpdiA9ICh2b2lkICopIHNtcGwtPml2OwogICAgICAgICAgICAgaXZsZW5ndGggPSAxNjsgLy8gdXNlIDE2IG9yIHRoZSBhY3R1YWwgc2l6ZT8KICAgICAgICAgfQotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBpdiwgaXZsZW5ndGgpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGl2LCBpdmxlbmd0aCk7CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CkBAIC01MzQ1LDEwMyArNTkyMSw1NyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUlzQVZDKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewotICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKIAotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKLSAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOwotCi0gICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJ3aG9sZSBOQUwiKTsKICAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQogICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCiAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKICAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7CiAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1heF9zaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmbWF4X3NpemUpCisgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heF9zaXplKQotICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzTWFsRm9ybWVkIHx8IGRhdGEgPT0gTlVMTCkgewpAQCAtNTQ1MCw3ICs1OTgwLDcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAKQEAgLTU0NTksNzUgKzU5ODksNjkgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwogCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwotICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwotICAgICAgICB9CiAKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgfQogCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTU1MzUsMTUgKzYwNTksMTcgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBNUEVHNEV4dHJhY3Rvcjo6VHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpIHsKICAgICBmb3IgKFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOyB0cmFjayAhPSBOVUxMOyB0cmFjayA9IHRyYWNrLT5uZXh0KSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkKICAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobWltZSwgbWltZVByZWZpeCwgc3RybGVuKG1pbWVQcmVmaXgpKSkgewogICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9CkBAIC01NTUyLDcgKzYwNzgsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CitzdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICB1aW50OF90IGhlYWRlcls4XTsKIAogICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KDQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOwpAQCAtNTU4Myw2ICs2MTA5LDcgQEAKICAgICAgICAgRk9VUkNDKCJhdmMxIiksCiAgICAgICAgIEZPVVJDQygiaHZjMSIpLAogICAgICAgICBGT1VSQ0MoImhldjEiKSwKKyAgICAgICAgRk9VUkNDKCJhdjAxIiksCiAgICAgICAgIEZPVVJDQygiM2dwNCIpLAogICAgICAgICBGT1VSQ0MoIm1wNDEiKSwKICAgICAgICAgRk9VUkNDKCJtcDQyIiksCkBAIC01NTkyLDYgKzYxMTksNyBAQAogICAgICAgICAvLyBKdXN0IGdpdmUgdGhlc2UgZmlsZSB0eXBlcyBhIGNoYW5jZS4KICAgICAgICAgRk9VUkNDKCJxdCAgIiksICAvLyBBcHBsZSdzIFF1aWNrVGltZQogICAgICAgICBGT1VSQ0MoIk1TTlYiKSwgIC8vIFNvbnkncyBQU1AKKyAgICAgICAgRk9VUkNDKCJ3bWYgIiksCiAKICAgICAgICAgRk9VUkNDKCIzZzJhIiksICAvLyAzR1BQMgogICAgICAgICBGT1VSQ0MoIjNnMmIiKSwKQEAgLTU2MTcsNyArNjE0NSw3IEBACiAvLyBBbHNvIHRyeSB0byBpZGVudGlmeSB3aGVyZSB0aGlzIGZpbGUncyBtZXRhZGF0YSBlbmRzCiAvLyAoZW5kIG9mIHRoZSAnbW9vdicgYXRvbSkgYW5kIHJlcG9ydCBpdCB0byB0aGUgY2FsbGVyIGFzIHBhcnQgb2YKIC8vIHRoZSBtZXRhZGF0YS4KLXN0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK3N0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIC8vIFdlIHNjYW4gdXAgdG8gMTI4IGJ5dGVzIHRvIGlkZW50aWZ5IHRoaXMgZmlsZSBhcyBhbiBNUDQuCiAgICAgc3RhdGljIGNvbnN0IG9mZjY0X3Qga01heFNjYW5PZmZzZXQgPSAxMjhsbDsKIApAQCAtNTY2Myw3ICs2MTkxLDggQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwKKyAgICAgICAgICAgICAgICBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIEZPVVJDQygiZnR5cCIpOgogICAgICAgICAgICAgewpAQCAtNTcyNCwxOCArNjI1MywxOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7CitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqKSB7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgewotICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICBpZiAoQmV0dGVyU25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICBpZiAoTGVnYWN5U25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICBBTE9HVygiSWRlbnRpZmllZCBzdXBwb3J0ZWQgbXBlZzQgdGhyb3VnaCBMZWdhY3lTbmlmZk1QRUc0LiIpOwogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KQEAgLTU3NDMsMTYgKzYyNzMsMzEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiM2cyIiwKKyAgICAiM2dhIiwKKyAgICAiM2dwIiwKKyAgICAiM2dwcCIsCisgICAgIjNncHAyIiwKKyAgICAibTRhIiwKKyAgICAibTRyIiwKKyAgICAibTR2IiwKKyAgICAibW92IiwKKyAgICAibXA0IiwKKyAgICAicXQiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAotICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgIDIsIC8vIHZlcnNpb24KICAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAzZWEwOTYzLi5mYWRmYjUwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgpAQCAtMzEsOCArMzEsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOworc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIFNhbXBsZVRhYmxlOwogY2xhc3MgU3RyaW5nODsKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTUzLDE1ICs1MywxNSBAQAogICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwogfTsKIAotY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKKyAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzRFeHRyYWN0b3IiOyB9CiAKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB9OwogICAgIHN0cnVjdCBUcmFjayB7CiAgICAgICAgIFRyYWNrICpuZXh0OwotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhOwogICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CiAgICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKICAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CkBAIC04NSw2ICs4NSw3IEBACiAgICAgICAgIGJvb2wgaGFzX2Vsc3Q7CiAgICAgICAgIGludDY0X3QgZWxzdF9tZWRpYV90aW1lOwogICAgICAgICB1aW50NjRfdCBlbHN0X3NlZ21lbnRfZHVyYXRpb247CisgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgYm9vbCBzdWJzYW1wbGVfZW5jcnlwdGlvbjsKICAgICB9OwogCkBAIC05Nyw4ICs5OCw3IEBACiAKICAgICBWZWN0b3I8VHJleD4gbVRyZXg7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAqbUNhY2hlZFNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIHVpbnQzMl90IG1IZWFkZXJUaW1lc2NhbGU7CiAgICAgYm9vbCBtSXNRVDsKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAgICAgVHJhY2sgKm1GaXJzdFRyYWNrLCAqbUxhc3RUcmFjazsKIAotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFEYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhRGF0YTsKIAogICAgIFZlY3Rvcjx1aW50MzJfdD4gbVBhdGg7CiAgICAgU3RyaW5nOCBtTGFzdENvbW1lbnRNZWFuOwpAQCAtMTM5LDE3ICsxMzksMTYgQEAKIAogICAgIFRyYWNrICpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoY29uc3QgY2hhciAqbWltZVByZWZpeCk7CiAKLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKTsKKyAgICBzdGF0dXNfdCBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHVpbnQxNl90ICpjaGFubmVsQ291bnQsIHVpbnQxNl90ICpzYW1wbGVSYXRlKTsKKyAgICBzdGF0dXNfdCBwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUVBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CiAKICAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKICAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogfTsKIAotYm9vbCBTbmlmZk1QRUc0KAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNUEVHNF9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcAppbmRleCA5M2VlN2M2Li4yODkwYjI2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0xMTEsOCArMTExLDE1IEBACiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldFNhbXBsZVNpemVEaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVua1NhbXBsZUluZGV4ICsgaSwgJnNhbXBsZVNpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTYW1wbGVTaXplRGlyZWN0IHJldHVybiBlcnJvciIpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgLy8gc3RzYyBzYW1wbGUgY291bnQgaXMgbm90IHN5bmMgd2l0aCBzdHN6IHNhbXBsZSBjb3VudAorICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdHNjIHNhbXBsZXMoJWQpIG5vdCBzeW5jIHdpdGggc3RzeiBzYW1wbGVzKCVkKSIsIG1TYW1wbGVzUGVyQ2h1bmssIGkpOworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckNodW5rID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5wdXNoKHNhbXBsZVNpemUpOwpAQCAtMzAxLDcgKzMwOCw3IEBACiB9CiAKIHN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbikgeworICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDY0X3QgKnRpbWUsIHVpbnQ2NF90ICpkdXJhdGlvbikgewogICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgewogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTMxNCw4ICszMjEsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1UaW1lVG9TYW1wbGVJbmRleCA9PSBtVGFibGUtPm1UaW1lVG9TYW1wbGVDb3VudCB8fAotICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQzMl9NQVggLyBtVFRTRHVyYXRpb24pIHx8Ci0gICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgeworICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQ2NF9NQVggLyBtVFRTRHVyYXRpb24pIHx8CisgICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQ2NF9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfQogCkBAIC0zMjgsMTkgKzMzNSwyNyBAQAogICAgICAgICArK21UaW1lVG9TYW1wbGVJbmRleDsKICAgICB9CiAKLSAgICAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICAvLyBiZWxvdyBpcyBlcXVpdmFsZW50IHRvOgorICAgIC8vICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAoX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzYW1wbGVJbmRleCwgbVRUU1NhbXBsZUluZGV4LCAmdG1wKSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtVFRTRHVyYXRpb24sIHRtcCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobVRUU1NhbXBsZVRpbWUsIHRtcCwgJnRtcCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgKnRpbWUgPSB0bXA7CiAKICAgICBpbnQzMl90IG9mZnNldCA9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKICAgICBpZiAoKG9mZnNldCA8IDAgJiYgKnRpbWUgPCAob2Zmc2V0ID09IElOVDMyX01JTiA/Ci0gICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtb2Zmc2V0KSkpIHx8Ci0gICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQzMl9NQVggLSBvZmZzZXQpKSB7Ci0gICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93IiwgKnRpbWUsIG9mZnNldCk7CisgICAgICAgICAgICBJTlQ2NF9NQVggOiB1aW50NjRfdCgtb2Zmc2V0KSkpIHx8CisgICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQ2NF9NQVggLSBvZmZzZXQpKSB7CisgICAgICAgIEFMT0dFKCIlbGx1ICsgJWQgd291bGQgb3ZlcmZsb3ciLCAodW5zaWduZWQgbG9uZyBsb25nKSAqdGltZSwgb2Zmc2V0KTsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAgICAgaWYgKG9mZnNldCA+IDApIHsKICAgICAgICAgKnRpbWUgKz0gb2Zmc2V0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UMzJfTUlOID8gSU5UMzJfTUFYIDogKC1vZmZzZXQpKTsKKyAgICAgICAgKnRpbWUgLT0gKG9mZnNldCA9PSBJTlQ2NF9NSU4gPyBJTlQ2NF9NQVggOiAoLW9mZnNldCkpOwogICAgIH0KIAogICAgICpkdXJhdGlvbiA9IG1UVFNEdXJhdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCmluZGV4IDZlNGY2MGUuLjVhMGVhNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaApAQCAtMzMsOCArMzMsOCBAQAogICAgIHVpbnQzMl90IGdldERlc2NJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1DaHVua0Rlc2M7IH0KICAgICBvZmY2NF90IGdldFNhbXBsZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlT2Zmc2V0OyB9CiAgICAgc2l6ZV90IGdldFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVNpemU7IH0KLSAgICB1aW50MzJfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9Ci0gICAgdWludDMyX3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CisgICAgdWludDY0X3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQorICAgIHVpbnQ2NF90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQogCiAgICAgdWludDMyX3QgZ2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DdXJyZW50U2FtcGxlSW5kZXggKyBtU2FtcGxlc1BlckNodW5rIC0KQEAgLTYzLDIwICs2MywyMCBAQAogCiAgICAgdWludDMyX3QgbVRpbWVUb1NhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1UVFNTYW1wbGVJbmRleDsKLSAgICB1aW50MzJfdCBtVFRTU2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtVFRTU2FtcGxlVGltZTsKICAgICB1aW50MzJfdCBtVFRTQ291bnQ7Ci0gICAgdWludDMyX3QgbVRUU0R1cmF0aW9uOworICAgIHVpbnQ2NF90IG1UVFNEdXJhdGlvbjsKIAogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFNhbXBsZU9mZnNldDsKICAgICBzaXplX3QgbUN1cnJlbnRTYW1wbGVTaXplOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlVGltZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOworICAgIHVpbnQ2NF90IG1DdXJyZW50U2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOwogCiAgICAgdm9pZCByZXNldCgpOwogICAgIHN0YXR1c190IGZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRDaHVua09mZnNldCh1aW50MzJfdCBjaHVuaywgb2ZmNjRfdCAqb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKTsKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50NjRfdCAqdGltZSwgdWludDY0X3QgKmR1cmF0aW9uKTsKIAogICAgIFNhbXBsZUl0ZXJhdG9yKGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwogICAgIFNhbXBsZUl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggMjVmOGUyYS4uYmYyOWJmMSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitTYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1DaHVua09mZnNldE9mZnNldCgtMSksCiAgICAgICBtQ2h1bmtPZmZzZXRUeXBlKDApLApAQCAtNjE0LDcgKzYxNCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi11aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50MzJfdCB0aW1lMSwgdWludDMyX3QgdGltZTIpIHsKK3VpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQ2NF90IHRpbWUxLCB1aW50NjRfdCB0aW1lMikgewogICAgIHJldHVybiB0aW1lMSA+IHRpbWUyID8gdGltZTEgLSB0aW1lMiA6IHRpbWUyIC0gdGltZTE7CiB9CiAKQEAgLTY2Miw3ICs2NjIsNyBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IHNhbXBsZUluZGV4ID0gMDsKLSAgICB1aW50MzJfdCBzYW1wbGVUaW1lID0gMDsKKyAgICB1aW50NjRfdCBzYW1wbGVUaW1lID0gMDsKIAogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtVGltZVRvU2FtcGxlQ291bnQ7ICsraSkgewogICAgICAgICB1aW50MzJfdCBuID0gbVRpbWVUb1NhbXBsZVsyICogaV07CkBAIC02ODQsMTMgKzY4NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBUaW1lRGVsdGEgPT0gSU5UMzJfTUlOID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLWNvbXBUaW1lRGVsdGEpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjb21wVGltZURlbHRhID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgY29tcFRpbWVEZWx0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gY29tcFRpbWVEZWx0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVsbHUgKyAlZCB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhbXBsZVRpbWUsIGNvbXBUaW1lRGVsdGEpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29tcFRpbWVEZWx0YSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQzMl9NQVg7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDY0X01BWDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjb21wVGltZURlbHRhID0gMDsKICAgICAgICAgICAgICAgICB9CkBAIC03MDEsMTAgKzcwMSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICArK3NhbXBsZUluZGV4OwotICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXUgKyAldSB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQzMl9NQVg7CisgICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IFVJTlQ2NF9NQVggLSBkZWx0YSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlbGx1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FtcGxlVGltZSwgZGVsdGEpOworICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UNjRfTUFYOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICs9IGRlbHRhOwogICAgICAgICAgICAgfQpAQCAtODcwLDE5ICs4NzAsMTkgQEAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0XSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHVwcGVyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHVwcGVyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKIAogICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnQgLSAxXSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IGxvd2VyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGxvd2VyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKIAogICAgICAgICAgICAgLy8gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKICAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSh1cHBlcl90aW1lLCBzYW1wbGVfdGltZSkgPgpAQCAtOTU1LDkgKzk1NSw5IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgdWludDY0X3QgKmNvbXBvc2l0aW9uVGltZSwKICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlLAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24pIHsKKyAgICAgICAgdWludDY0X3QgKnNhbXBsZUR1cmF0aW9uKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IGVycjsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCmluZGV4IGRkNjg4NjAuLjU3ZjZlNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApAQCAtMjEsMTggKzIxLDE5IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CiAKIGNsYXNzIFNhbXBsZVRhYmxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIGV4cGxpY2l0IFNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IFNhbXBsZVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKIApAQCAtNjUsOSArNjYsOSBAQAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAorICAgICAgICAgICAgdWludDY0X3QgKmNvbXBvc2l0aW9uVGltZSwKICAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwsCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKKyAgICAgICAgICAgIHVpbnQ2NF90ICpzYW1wbGVEdXJhdGlvbiA9IE5VTEwpOwogCiAgICAgLy8gY2FsbCBvbmx5IGFmdGVyIGdldE1ldGFEYXRhRm9yU2FtcGxlIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkuCiAgICAgdWludDMyX3QgZ2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpOwpAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgLy8gTGltaXQgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGludGVybmFsIHRhYmxlcyB0byAyMDBNaUIuCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VG90YWxTaXplID0gMjAwICogKDEgPDwgMjApOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgb2ZmNjRfdCBtQ2h1bmtPZmZzZXRPZmZzZXQ7CkBAIC0xMjMsNyArMTI0LDcgQEAKIAogICAgIHN0cnVjdCBTYW1wbGVUaW1lRW50cnkgewogICAgICAgICB1aW50MzJfdCBtU2FtcGxlSW5kZXg7Ci0gICAgICAgIHVpbnQzMl90IG1Db21wb3NpdGlvblRpbWU7CisgICAgICAgIHVpbnQ2NF90IG1Db21wb3NpdGlvblRpbWU7CiAgICAgfTsKICAgICBTYW1wbGVUaW1lRW50cnkgKm1TYW1wbGVUaW1lRW50cmllczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IDM4Yzg2ZWIuLjBmMGM3MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTE1LDIzICsxNSwyNiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKaW5kZXggOGEwZmEwMy4uOTQ2YTJhOSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcApAQCAtMTgsMzkgKzE4LDU0IEBACiAjZGVmaW5lIExPR19UQUcgIk1QRUcyRXh0cmFjdG9yQnVuZGxlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgIk1QRUcyUFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgIm0ycCIsCisgICAidHMiLAorICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiM2QxZGNmZWItZTQwYS00MzZkLWE1NzQtYzI0MzhhNTU1ZTVmIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNUEVHMi1QUy9UUyBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlRTRXh0cmFjdG9yKHNvdXJjZSk7fTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUygmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlBTRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJQU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggNjk4MGI4Mi4uNzMxNTg0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9FU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsMjIgKzMzLDIzIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjaywgcHVibGljIFJlZkJhc2Ugeworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflRyYWNrKCk7CkBAIC03MiwyOSArNzIsMjkgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7CiB9OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrIDogcHVibGljIE1lZGlhVHJhY2sgewotICAgIFdyYXBwZWRUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spOworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKKyAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBUcmFjayAqdHJhY2spOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+V3JhcHBlZFRyYWNrKCk7CiAKIHByaXZhdGU6CiAgICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKLSAgICBzcDxNUEVHMlBTRXh0cmFjdG9yOjpUcmFjaz4gbVRyYWNrOworICAgIE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrICptVHJhY2s7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVkVHJhY2spOwogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1GaW5hbFJlc3VsdChPSyksCkBAIC0xMDgsMjUgKzEwOCwyNyBAQAogICAgIH0KIAogICAgIC8vIFJlbW92ZSBhbGwgdHJhY2tzIHRoYXQgd2VyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZWlyIGZvcm1hdC4KLSAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgZm9yIChzaXplX3QgaSA9IG1UcmFja3Muc2l6ZSgpOyBpID4gMDspIHsKICAgICAgICAgaS0tOwotICAgICAgICBpZiAobVRyYWNrcy52YWx1ZUF0KGkpLT5nZXRGb3JtYXQobWV0YSkgIT0gT0spIHsKKyAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmVJdGVtc0F0KGkpOwogICAgICAgICB9CiAgICAgfQorICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWV0YSk7CiAKICAgICBtU2Nhbm5pbmcgPSBmYWxzZTsKIH0KIAogTVBFRzJQU0V4dHJhY3Rvcjo6fk1QRUcyUFNFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMzQsMjAgKzEzNiwyMCBAQAogICAgIHJldHVybiBuZXcgV3JhcHBlZFRyYWNrKHRoaXMsIG1UcmFja3MudmFsdWVBdChpbmRleCkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbVRyYWNrcy52YWx1ZUF0KGluZGV4KS0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQzMl90IE1QRUcyUFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNjM1LDQyICs2MzcsNTUgQEAKICAgICBtUXVldWUgPSBOVUxMOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAvLyBpbml0aWFsaXplIHdpdGggb25lIHNtYWxsIGJ1ZmZlciwgYnV0IGFsbG93IGdyb3d0aAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG9uZSBidWZmZXIgKi8sIDI1NiAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKworICAgIGlmIChtU291cmNlLT5zdGFydChOVUxMKSA9PSBPSykgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdG9wKCkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworICAgIGlmIChtU291cmNlLT5zdG9wKCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewordm9pZCBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCwgc3A8QU1lc3NhZ2U+IG1zZyk7CisKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBzb3VyY2VNZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICpzb3VyY2VNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2VNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwogICAgIHdoaWxlICghbVNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmZlZWRNb3JlKCk7CkBAIC02ODAsNyArNjk1LDUwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKKyAgICBtU291cmNlLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKmJ1ZmZlciA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6YXBwZW5kUEVTRGF0YSgKQEAgLTcyNiw3ICs3ODQsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpXcmFwcGVkVHJhY2soCi0gICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjaykKKyAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBUcmFjayAqdHJhY2spCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtVHJhY2sodHJhY2spIHsKIH0KQEAgLTczNCwyNyArNzkyLDI4IEBACiBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6On5XcmFwcGVkVHJhY2soKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zdGFydChwYXJhbXMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydCgpIHsKKyAgICBtVHJhY2stPm1CdWZmZXJHcm91cCA9IG1CdWZmZXJHcm91cDsKKyAgICByZXR1cm4gbVRyYWNrLT5zdGFydCgpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtVHJhY2stPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBTbmlmZk1QRUcyUFMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICB1aW50OF90IGhlYWRlcls1XTsKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCmluZGV4IDhiOWRhZDkuLmU1ZDU5MWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCkBAIC0xOSw3ICsxOSw4IEBACiAjZGVmaW5lIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzEsMTQgKzMyLDE0IEBACiBzdHJ1Y3QgVHJhY2s7CiBjbGFzcyBTdHJpbmc4OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJQU0V4dHJhY3RvciI7IH0KQEAgLTUxLDEyICs1MiwxMiBAQAogICAgIHN0cnVjdCBXcmFwcGVkVHJhY2s7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKKyAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgVHJhY2sqID4gbVRyYWNrczsKICAgICBib29sIG1TY2FubmluZzsKIAogICAgIGJvb2wgbVByb2dyYW1TdHJlYW1NYXBWYWxpZDsKQEAgLTcyLDcgKzczLDcgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlBTRXh0cmFjdG9yKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHMlBTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNUEVHMlBTKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCAyNjBjODhlLi40OWRkMGI0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtMzUsNiArMzQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgpAQCAtNTEsMTkgKzUxLDE5IEBACiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKIAotc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBNUEVHMlRTU291cmNlKAogICAgICAgICAgICAgTVBFRzJUU0V4dHJhY3RvciAqZXh0cmFjdG9yLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCiAgICAgICAgICAgICBib29sIGRvZXNTZWVrKTsKICAgICB2aXJ0dWFsIH5NUEVHMlRTU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByaXZhdGU6CiAgICAgTVBFRzJUU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKQEAgLTg4LDQ0ICs4OCwxNTIgQEAKIE1QRUcyVFNTb3VyY2U6On5NUEVHMlRTU291cmNlKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgewotICAgIHJldHVybiBtSW1wbC0+c3RhcnQoTlVMTCk7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KCkgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydCgpIHsKKyAgICAvLyBpbml0aWFsaXplIHdpdGggb25lIHNtYWxsIGJ1ZmZlciwgYnV0IGFsbG93IGdyb3d0aAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG9uZSBidWZmZXIgKi8sIDI1NiAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKworICAgIGlmICghbUltcGwtPnN0YXJ0KE5VTEwpKSB7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KCkgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKLSAgICByZXR1cm4gbUltcGwtPnN0b3AoKTsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7CisgICAgaWYgKCFtSW1wbC0+c3RvcCgpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewordm9pZCBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCwgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIHNpemVfdCBudW1FbnRyaWVzID0gbXNnLT5jb3VudEVudHJpZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbXNnLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpZCA9IG1zZy0+Z2V0RW50cnlBdChpKTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXQsIG5hbWUsIHZhbDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgIGludDY0X3QgdmFsNjQ7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbDY0KSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZm9ybWF0LCBuYW1lLCB2YWw2NCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWxmbG9hdDsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsZmxvYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChmb3JtYXQsIG5hbWUsIHZhbGZsb2F0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsZG91YmxlOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWxkb3VibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoZm9ybWF0LCBuYW1lLCB2YWxkb3VibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgIGlmIChBU3RyaW5nIHM7IGlkLmZpbmQoJnMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LCBuYW1lLCBzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZvcm1hdCwgbmFtZSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyB1bnN1cHBvcnRlZCB0eXBlICVkICclcyciLCB0eXBlLCBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IG1JbXBsLT5nZXRGb3JtYXQoKTsKLSAgICBtZXRhID0gKmltcGxNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShpbXBsTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CiAgICAgaWYgKG1Eb2VzU2VlayAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewogICAgICAgICAvLyBzZWVrIGlzIG5lZWRlZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIHNlZWtNb2RlKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCAoUmVhZE9wdGlvbnM6OlNlZWtNb2RlKXNlZWtNb2RlKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobUV4dHJhY3Rvci0+ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKG1JbXBsKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAotICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKKyAgICBtSW1wbC0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpvdXQgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihvdXRNZXRhKTsKKyAgICBpbnQ2NF90IHZhbDY0OworICAgIGlmIChpbk1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdmFsNjQpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHZhbDY0KTsKKyAgICB9CisgICAgaW50MzJfdCB2YWwzMjsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgdmFsMzIpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgdmFsMzIpOworICAgIH0KKyAgICB1aW50MzJfdCBidWZUeXBlOworICAgIGNvbnN0IHZvaWQgKmJ1ZkRhdGE7CisgICAgc2l6ZV90IGJ1ZlNpemU7CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVNFSSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NFSSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCiAgICAgICBtTGFzdFN5bmNFdmVudCgwKSwKQEAgLTEzMywxMSArMjQxLDE1IEBACiAgICAgaW5pdCgpOwogfQogCitNUEVHMlRTRXh0cmFjdG9yOjp+TVBFRzJUU0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7Cit9CisKIHNpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVNvdXJjZUltcGxzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xNDgsMjIgKzI2MCwyMyBAQAogICAgICAgICAgICAgKG1TZWVrU3luY1BvaW50cyA9PSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCkpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCiAgICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7CiAgICAgaWYgKGltcGxNZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOwotCi0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvL3N0YXRpYwpAQCAtMTc0LDcgKzI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwgbWltZSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgewogICAgIEhhbFRva2VuIGhhbFRva2VuOwogICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLCBzaXplKTsKICAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwpAQCAtMTg0LDIwICsyOTcsMjYgQEAKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIEFMT0dJKCJBbGwgdHJhY2tzIG5vdyBoYXZlIGRlc2NyYW1ibGVycyIpOwogICAgICAgICBpbml0KCk7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpmaW5kSW5kZXhPZlNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwgc2l6ZV90ICppbmRleCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgeworICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKIHZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6YWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKSB7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgewotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgeworICAgIHNpemVfdCBpbmRleDsKKyAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSAhPSBPSykgewogICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwogICAgIH0KIH0KIApAQCAtMjA1LDYgKzMyNCw3IEBACiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgIGludDY0X3Qgc3RhcnRUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBzaXplX3QgaW5kZXg7CiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgd2hpbGUgKChlcnIgPSBmZWVkTW9yZSh0cnVlIC8qIGlzSW5pdCAqLykpID09IE9LCkBAIC0yMjMsOCArMzQzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGltcGwpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2NyYW1ibGVkRm9ybWF0KCooZm9ybWF0LmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzOCwxMCArMzU5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGltcGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2NyYW1ibGVkRm9ybWF0KCooZm9ybWF0LmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpICYmICFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXhPZlNvdXJjZShpbXBsLCAmaW5kZXgpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDkxLDcgKzYxMSw3IEBACiB9CiAKIHN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICBjb25zdCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CisgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSAmc2Vla01vZGUpIHsKICAgICBpZiAobVNlZWtTeW5jUG9pbnRzID09IE5VTEwgfHwgbVNlZWtTeW5jUG9pbnRzLT5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR1coIk5vIHN5bmMgcG9pbnQgdG8gc2VlayB0by4iKTsKICAgICAgICAgLy8gLi4uIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byBkbyBoZXJlLgpAQCAtNTEyLDE4ICs2MzIsMTggQEAKICAgICB9CiAKICAgICBzd2l0Y2ggKHNlZWtNb2RlKSB7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJOZXh0IHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3Qgc3luYy4iKTsKICAgICAgICAgICAgICAgICAtLWluZGV4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CiAgICAgICAgICAgICBBTE9HVygic2Vla01vZGUgbm90IHN1cHBvcnRlZDogJWQ7IGZhbGxpbmcgYmFjayB0byBQUkVWSU9VU19TWU5DIiwKICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUpOwogICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgogICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOwpAQCAtNjY2LDcgKzc4Niw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLWJvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7Citib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICAgY2hhciBoZWFkZXI7CiAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChrVFNQYWNrZXRTaXplICogaSwgJmhlYWRlciwgMSkgIT0gMQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBjYmRkM2NiLi4yNTM3ZDNiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOCBAQAogI2RlZmluZSBNUEVHMl9UU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0zNCwzMCArMzQsMzMgQEAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IEFUU1BhcnNlcjsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogc3RydWN0IE1QRUcyVFNTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1zdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQogCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TVBFRzJUU0V4dHJhY3RvcigpOworCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBzcDxBVFNQYXJzZXI+IG1QYXJzZXI7CiAKQEAgLTgxLDE3ICs4NCwxOCBAQAogICAgIC8vIFRyeSB0byBmZWVkIG1vcmUgZGF0YSBmcm9tIHNvdXJjZSB0byBwYXJzZXIuCiAgICAgLy8gfGlzSW5pdHwgbWVhbnMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW5zaWRlIGluaXQoKS4gVGhpcyBpcyBhIHNpZ25hbCB0bwogICAgIC8vIHNhdmUgU3luY0V2ZW50IHNvIHRoYXQgaW5pdCgpIGNhbiBhZGQgU3luY1BvaW50IGFmdGVyIGl0IHVwZGF0ZXMgfG1Tb3VyY2VJbXBsc3wuCi0gICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VCYXNlIHRvCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VIZWxwZXIgdG8KICAgICAvLyBwYXJzZXIgYW5kIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuIE90aGVyd2lzZSwgdmFyaW91cyBlcnJvciBjb2RlcyBjb3VsZCBiZQotICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VCYXNlLCBvcgorICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VIZWxwZXIsIG9yCiAgICAgLy8gdGhlIGRhdGEgaGFzIHN5bnRheCBlcnJvciBkdXJpbmcgcGFyc2luZywgZXRjLgogICAgIHN0YXR1c190IGZlZWRNb3JlKGJvb2wgaXNJbml0ID0gZmFsc2UpOwogICAgIHN0YXR1c190IHNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOworICAgICAgICAgICAgY29uc3QgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7CiAgICAgc3RhdHVzX3QgcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKTsKIAogICAgIHN0YXR1c190IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCk7CisgICAgc3RhdHVzX3QgZmluZEluZGV4T2ZTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsIHNpemVfdCAqaW5kZXgpOwogCiAgICAgLy8gQWRkIGEgU3luUG9pbnQgZGVyaXZlZCBmcm9tIHxldmVudHwuCiAgICAgdm9pZCBhZGRTeW5jUG9pbnRfbChjb25zdCBBVFNQYXJzZXI6OlN5bmNFdmVudCAmZXZlbnQpOwpAQCAtMTAxLDcgKzEwNSw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggZjNkMjc5NC4uNjA0ZWM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC03LDEzICs3LDE4IEBACiAgICAgICAgICJleHRlcm5hbC90cmVtb2xvIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGIyZmU2OWMuLmQ5OTQ5M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApAQCAtMjEsMTkgKzIxLDE3IEBACiAjaW5jbHVkZSAiT2dnRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0cmFjdG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIGV4dGVybiAiQyIgewpAQCAtNDcsMTYgKzQ1LDE2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgZXhwbGljaXQgT2dnU291cmNlKE9nZ0V4dHJhY3RvciAqZXh0cmFjdG9yKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+T2dnU291cmNlKCk7CkBAIC03MSwyOCArNjksMzAgQEAKIAogc3RydWN0IE15T2dnRXh0cmFjdG9yIHsKICAgICBNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKTsKICAgICB2aXJ0dWFsIH5NeU9nZ0V4dHJhY3RvcigpOwogCi0gICAgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKSBjb25zdDsKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopIGNvbnN0OwogCiAgICAgLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KICAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7CiAKICAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcikgPSAwOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCi0gICAgc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgICAgICBtZXRhID0gbUZpbGVNZXRhOwotICAgICAgICByZXR1cm4gT0s7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgICAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhKTsKICAgICB9CiAKKyAgICB2b2lkIHNldEJ1ZmZlckdyb3VwKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKSB7CisgICAgICAgIG1CdWZmZXJHcm91cCA9IGdyb3VwOworICAgIH0KIHByb3RlY3RlZDoKICAgICBzdHJ1Y3QgUGFnZSB7CiAgICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247CkBAIC0xMTAsNyArMTEwLDggQEAKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwogICAgIH07CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptQnVmZmVyR3JvdXA7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgUGFnZSBtQ3VycmVudFBhZ2U7CiAgICAgdWludDY0X3QgbUN1ckdyYW51bGVQb3NpdGlvbjsKQEAgLTEyOSwxMSArMTMwLDEzIEBACiAgICAgdm9yYmlzX2luZm8gbVZpOwogICAgIHZvcmJpc19jb21tZW50IG1WYzsKIAotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGE7CiAKICAgICBWZWN0b3I8VE9DRW50cnk+IG1UYWJsZU9mQ29udGVudHM7CiAKKyAgICBpbnQzMl90IG1IYXB0aWNDaGFubmVsQ291bnQ7CisKICAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKICAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7CiAKQEAgLTE0Niw3ICsxNDksNyBAQAogICAgIC8vIDEgLSBiaXRzdHJlYW0gaWRlbnRpZmljYXRpb24gaGVhZGVyCiAgICAgLy8gMyAtIGNvbW1lbnQgaGVhZGVyCiAgICAgLy8gNSAtIGNvZGVjIHNldHVwIGhlYWRlciAoVm9yYmlzIG9ubHkpCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOwogCiAgICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKICAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKQEAgLTE1NCw5ICsxNTcsOSBAQAogICAgIC8vCiAgICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOwogICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KLSAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworICAgIG1lZGlhX3N0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKIAotICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKIAogICAgIHZvaWQgcGFyc2VGaWxlTWV0YURhdGEoKTsKIApAQCAtMTY0LDEyICsxNjcsMTQgQEAKIAogICAgIHZvaWQgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKIAorICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soaW50IGNoYW5uZWxDb3VudCk7CisKICAgICBNeU9nZ0V4dHJhY3Rvcihjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKICAgICBNeU9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOwogfTsKIAogc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCiAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKQEAgLTE3OCw3ICsxODMsNyBAQAogCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgeworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpIHsKICAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKICAgICB9CiAKQEAgLTE5MCwxNCArMTk1LDE0IEBACiAgICAgICAgIHJldHVybiBncmFudWxlUG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKIH07CiAKIHN0cnVjdCBNeU9wdXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgewogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOwogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAvLyA4MCBtcwogCi0gICAgZXhwbGljaXQgTXlPcHVzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgTXlPcHVzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCiAgICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKICAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKQEAgLTIwOCwxNiArMjEzLDE2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0OwogCiAgICAgdWludDhfdCBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OwpAQCAtMjM3LDI4ICsyNDIsMzAgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1JbXBsLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KCkgewogICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCisgICAgLy8gaW5pdGlhbGl6ZSBidWZmZXIgZ3JvdXAgd2l0aCBhIHNpbmdsZSBzbWFsbCBidWZmZXIsIGJ1dCBhIGdlbmVyb3VzIHVwcGVyIGxpbWl0CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgKi8sIDEyOCAvKiBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworICAgIG1FeHRyYWN0b3ItPm1JbXBsLT5zZXRCdWZmZXJHcm91cChtQnVmZmVyR3JvdXApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0b3AoKSB7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yNjYsNDEgKzI3Myw0MyBAQAogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpwYWNrZXQ7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOwogCi0gICAgaWYgKGVyciAhPSBPSykgeworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gcGFja2V0LT5tZXRhX2RhdGEoKTsKICNpZiAwCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaWYgKHBhY2tldC0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZmluZEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpKSB7CiAgICAgICAgIEFMT0dJKCJmb3VuZCB0aW1lID0gJWxsZCB1cyIsIHRpbWVVcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0koIk5PIHRpbWUiKTsKICAgICB9CiAjZW5kaWYKIAotICAgIHBhY2tldC0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgICpvdXQgPSBwYWNrZXQ7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgQUxPR1YoInJldHVybmluZyBidWZmZXIgJXAiLCBwYWNrZXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE15T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCiAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcykKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICA6IG1CdWZmZXJHcm91cChOVUxMKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24oMCksCkBAIC0zMTEsMjEgKzMyMCwyNSBAQAogICAgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKICAgICAgIG1OdW1IZWFkZXJzKG51bUhlYWRlcnMpLAogICAgICAgbVNlZWtQcmVSb2xsVXMoc2Vla1ByZVJvbGxVcyksCi0gICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CisgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSwKKyAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQoMCkgewogICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwogCiAgICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKICAgICB2b3JiaXNfY29tbWVudF9pbml0KCZtVmMpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1GaWxlTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIH0KIAogTXlPZ2dFeHRyYWN0b3I6On5NeU9nZ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CiAgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSBjb25zdCB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSBjb25zdCB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKQEAgLTM1MSw3ICszNjQsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCi0gICAgICAgICsrKnBhZ2VPZmZzZXQ7CisgICAgICAgIC8vIHNlZSBob3cgZmFyIGFoZWFkIHRvIHNraXA7IGF2b2lkIHNvbWUgZnJ1aXRsZXNzIGNvbXBhcmlzb25zCisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNCA7IGkrKykgeworICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVtpXSA9PSAnTycpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnBhZ2VPZmZzZXQgKz0gaTsKICAgICB9CiB9CiAKQEAgLTUwMiwzMCArNTIxLDMwIEBACiAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgKGxvbmcgbG9uZylvZmZzZXQsIG4pOwogCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKG4gPT0gMCB8fCBuID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiT2dnUyIsIDQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIGlmIChoZWFkZXJbNF0gIT0gMCkgewogICAgICAgICAvLyBXcm9uZyB2ZXJzaW9uLgogCi0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKICAgICBwYWdlLT5tRmxhZ3MgPSBoZWFkZXJbNV07CiAKICAgICBpZiAocGFnZS0+bUZsYWdzICYgfjcpIHsKICAgICAgICAgLy8gT25seSBiaXRzIDAtMiBhcmUgZGVmaW5lZCBpbiB2ZXJzaW9uIDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHBhZ2UtPm1HcmFudWxlUG9zaXRpb24gPSBVNjRMRV9BVCgmaGVhZGVyWzZdKTsKQEAgLTU0Miw3ICs1NjEsNyBAQAogICAgIGlmIChtU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgc2l6ZW9mKGhlYWRlciksIHBhZ2UtPm1MYWNlLCBwYWdlLT5tTnVtU2VnbWVudHMpCiAgICAgICAgICAgICA8IChzc2l6ZV90KXBhZ2UtPm1OdW1TZWdtZW50cykgewotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7OwpAQCAtNTY1LDIyICs1ODQsMjIgQEAKICAgICByZXR1cm4gc2l6ZW9mKGhlYWRlcikgKyBwYWdlLT5tTnVtU2VnbWVudHMgKyB0b3RhbFNpemU7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqb3V0KSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqb3V0KSB7CiAgICAgaWYgKG1PZmZzZXQgPD0gbUZpcnN0RGF0YU9mZnNldCAmJiBtU3RhcnRHcmFudWxlUG9zaXRpb24gPCAwKSB7CiAgICAgICAgIC8vIFRoZSBmaXJzdCBzYW1wbGUgbWlnaHQgbm90IHN0YXJ0IGF0IHRpbWUgMDsgZmluZCBvdXQgd2hlcmUgYnkgc3VidHJhY3RpbmcKICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBmaXJzdCBwYWdlIGZyb20gdGhlIGdyYW51bGUgcG9zaXRpb24KICAgICAgICAgLy8gKHBvc2l0aW9uIG9mIGxhc3QgY29tcGxldGUgc2FtcGxlKSBvZiB0aGUgZmlyc3QgcGFnZS4gVGhpcyBoYXBwZW5zCiAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgZmlyc3QgcGFnZS4KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptQnVmOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbUJ1ZjsKICAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IDA7CiAgICAgICAgIHVpbnQ2NF90IGN1ckdyYW51bGVQb3NpdGlvbiA9IDA7CiAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldCgmbUJ1ZiwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgICAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0sgJiYgZXJyICE9IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZpcnN0IHR3byBwYWdlcyBhcmUgaGVhZGVyIHBhZ2VzLgotICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgeworICAgICAgICAgICAgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKICAgICAgICAgICAgICAgICBpZiAobUJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZiA9IE5VTEw7CkBAIC02MDEsMzIgKzYyMCwzMyBAQAogICAgICAgICBzZWVrVG9PZmZzZXQoMCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKICAgICBpbnQzMl90IGN1cnJlbnRQYWdlU2FtcGxlczsKICAgICAvLyBDYWxjdWxhdGUgdGltZXN0YW1wcyBieSBhY2N1bXVsYXRpbmcgZHVyYXRpb25zIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHNhbXBsZSBvZiBhIHBhZ2U7CiAgICAgLy8gV2UgYXNzdW1lIHRoYXQgd2Ugb25seSBzZWVrIHRvIHBhZ2UgYm91bmRhcmllcy4KLSAgICBpZiAoKCpvdXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSAoKm91dCktPm1ldGFfZGF0YSgpOworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgewogICAgICAgICAvLyBmaXJzdCBwYWNrZXQgaW4gcGFnZQogICAgICAgICBpZiAobU9mZnNldCA9PSBtRmlyc3REYXRhT2Zmc2V0KSB7CiAgICAgICAgICAgICBjdXJyZW50UGFnZVNhbXBsZXMgLT0gbVN0YXJ0R3JhbnVsZVBvc2l0aW9uOwotICAgICAgICAgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCBjdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgY3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgfQogICAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBjdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobUN1ckdyYW51bGVQb3NpdGlvbik7Ci0gICAgKCpvdXQpLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogCiAgICAgdWludDMyX3QgZnJhbWVzID0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KCpvdXQpOwogICAgIG1DdXJHcmFudWxlUG9zaXRpb24gKz0gZnJhbWVzOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi11aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3QgewordWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgY29uc3QgewogICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC02NzIsMTAgKzY5Miw2NiBAQAogICAgIHJldHVybiBudW1TYW1wbGVzOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6X3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CisvKgorICogYmFzaWMgbWVkaWFidWZmZXIgaW1wbGVtZW50YXRpb24gdXNlZCBkdXJpbmcgaW5pdGlhbCBwYXJzaW5nIG9mIHRoZQorICogaGVhZGVyIHBhY2tldHMsIHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgYSBidWZmZXIgZ3JvdXAKKyAqLworY2xhc3MgU3RhbmRBbG9uZU1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgdm9pZCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworICAgIHNpemVfdCBtT2Zmc2V0OworICAgIHNpemVfdCBtTGVuZ3RoOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK3B1YmxpYzoKKyAgICBTdGFuZEFsb25lTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpIDogTWVkaWFCdWZmZXJIZWxwZXIoTlVMTCkgeworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgIG1EYXRhID0gbWFsbG9jKG1TaXplKTsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgICAgIG1MZW5ndGggPSBtU2l6ZTsKKyAgICAgICAgbUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQUxPR1YoImNyZWF0ZWQgc3RhbmRhbG9uZSBtZWRpYSBidWZmZXIgJXAgb2Ygc2l6ZSAlenUiLCB0aGlzLCBtU2l6ZSk7CisgICAgfQorCisgICAgflN0YW5kQWxvbmVNZWRpYUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZvcm1hdCk7CisgICAgICAgIEFMT0dWKCJkZWxldGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorCisgICAgdm9pZCogZGF0YSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgc2l6ZV90IHJhbmdlX29mZnNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1PZmZzZXQ7CisgICAgfQorCisgICAgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfQorCisgICAgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgeworICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXQgKm1ldGFfZGF0YSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CisgICAgfQorfTsKKworbWVkaWFfc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAtMTsKIAogICAgIGZvciAoOzspIHsKQEAgLTcwOSwxNiArNzg1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICp0bXA7CisgICAgICAgICAgICBpZiAobUJ1ZmZlckdyb3VwKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wLCBmYWxzZSwgZnVsbFNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlZCBidWZmZXIgJXAgZnJvbSBncm91cCIsIHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRtcCA9IG5ldyBTdGFuZEFsb25lTWVkaWFCdWZmZXIoZnVsbFNpemUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIodG1wLT5tZXRhX2RhdGEoKSk7CiAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKQEAgLTczNyw3ICs4MjAsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnVsbFNpemUpOwpAQCAtNzQ4LDggKzgzMSw5IEBACiAgICAgICAgICAgICAgICAgLy8gV2UndmUganVzdCByZWFkIHRoZSBlbnRpcmUgcGFja2V0LgogCiAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBhY2tldEluUGFnZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzAsMTEgKzg1NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICs9IGFjdHVhbEJsb2NrU2l6ZSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLCB0aGUgYnVmZmVyIG5vdyBjb250YWlucyB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KQEAgLTc5Myw3ICs4NzgsNyBAQAogCiAgICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJXpkIiwgbik7CiAKLSAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiAobWVkaWFfc3RhdHVzX3QpIG47CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IGEgaGFybWxlc3MgdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBieSBjbGFtcGluZyB0byAwCkBAIC04MTYsMzYgKzkwMSwzOCBAQAogICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29tcGxldGUuCiAKICAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKLSAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1NaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpwYWNrZXQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CiAgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cwotICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgLyogdHlwZSA9ICovIGkgKiAyICsgMSk7CiAgICAgICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgICAgICBwYWNrZXQgPSBOVUxMOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpAQCAtODY1LDEyICs5NTIsMTIgQEAKIAogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobGFzdEdyYW51bGVQb3NpdGlvbik7CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKIAogICAgICAgICBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKQEAgLTkwMiw3ICs5ODksNyBAQAogICAgICAgICBzaXplX3QgZGVub20gPSBudW1lcmF0b3IgLSBrTWF4TnVtVE9DRW50cmllczsKIAogICAgICAgICBzaXplX3QgYWNjdW0gPSAwOwotICAgICAgICBmb3IgKHNzaXplX3QgaSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGkgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsgaSA+IDA7IC0taSkgewogICAgICAgICAgICAgYWNjdW0gKz0gZGVub207CiAgICAgICAgICAgICBpZiAoYWNjdW0gPj0gbnVtZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5yZW1vdmVBdChpKTsKQEAgLTkxMiw3ICs5OTksNyBAQAogICAgIH0KIH0KIAotaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CitpbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIApAQCAtOTUyLDcgKzEwMzksNyBAQAogICAgIHJldHVybiBwY21TYW1wbGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIC8vIHRoZXJlIGFyZSBhY3R1YWxseSBubyBoZWFkZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgT3B1cyBzcGVjOyB3ZSBjaG9vc2UgMSBhbmQgMyB0byBtZWFuCiAgICAgICAgIC8vIGhlYWRlciBhbmQgY29tbWVudHMgc3VjaCB0aGF0IHdlIGNhbiBzaGFyZSBjb2RlIHdpdGggTXlWb3JiaXNFeHRyYWN0b3IuCkBAIC05NjEsMTEgKzEwNDgsMTEgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNDb21tZW50cyhidWZmZXIpOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwpAQCAtOTc1LDI5ICsxMDYyLDMxIEBACiAgICAgaWYgKHNpemUgPCBrT3B1c0hlYWRlclNpemUKICAgICAgICAgICAgIHx8IG1lbWNtcChkYXRhLCAiT3B1c0hlYWQiLCA4KQogICAgICAgICAgICAgfHwgLyogdmVyc2lvbiA9ICovIGRhdGFbOF0gIT0gMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtQ2hhbm5lbENvdW50ID0gZGF0YVs5XTsKICAgICBtQ29kZWNEZWxheSA9IFUxNkxFX0FUKCZkYXRhWzEwXSk7CiAKLSAgICBtTWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBkYXRhLCBzaXplKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsIC8qIG5zICovLCBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLyk7Ci0gICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAotICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGUpOworICAgIC8vIGtLZXlPcHVzSGVhZGVyIGlzIGNzZC0wCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgZGF0YSwgc2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBrT3B1c1NhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtQ2hhbm5lbENvdW50KTsKKyAgICBpbnQ2NF90IGNvZGVjZGVsYXkgPSBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNkZWxheSwgc2l6ZW9mKGNvZGVjZGVsYXkpKTsKKyAgICBpbnQ2NF90IHByZXJvbGwgPSBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLzsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAmcHJlcm9sbCwgc2l6ZW9mKHByZXJvbGwpKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CiAgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOwogICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90Pihjb21tZW50U2l6ZSk7CiAgICAgdWludDhfdCAqY29tbWVudERhdGEgPSB0bXAuZ2V0KCk7CiAgICAgaWYgKGNvbW1lbnREYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbWVtY3B5KGNvbW1lbnREYXRhLApAQCAtMTAyNiwxNCArMTExNSwxNCBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTGVuOyArK2kpIHsKICAgICAgICAgY2hhciBjaHIgPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOwogICAgICAgICBpZiAoY2hyICE9IE9wdXNUYWdzW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IHZlbmRvckxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAodmVuZG9yTGVuIDwgMCB8fCB2ZW5kb3JMZW4gPiBjb21tZW50U2l6ZSAtIDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIC8vIHNraXAgdmVuZG9yIHN0cmluZwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gdmVuZG9yTGVuOwpAQCAtMTA0NCwxMyArMTEzMywxMyBAQAogICAgIGludDMyX3QgbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAobiA8IDAgfHwgbiA+ICgoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkgPj4gMikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGludDMyX3QgbGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICAgICAgaWYgKGxlbiAgPCAwIHx8IGxlbiAgPiAoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IGxlbjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgewpAQCAtMTA1OCw3ICsxMTQ3LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZnJhbWluZ0JpdE9mZnNldCA8IDAgfHwgZnJhbWluZ0JpdE9mZnNldCA+PSBjb21tZW50U2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgY29tbWVudERhdGFbZnJhbWluZ0JpdE9mZnNldF0gPSAxOwogCkBAIC0xMDc1LDIyICsxMTY0LDIzIEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOwogICAgIGlmICgwICE9IGVycikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOwotICAgIHJldHVybiBPSzsKKyAgICBzZXRDaGFubmVsTWFzayhtQ2hhbm5lbENvdW50KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICBpZiAoc2l6ZSA8IDcgfHwgZGF0YVswXSAhPSB0eXBlIHx8IG1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG9nZ19idWZmZXIgYnVmOwpAQCAtMTEwOSw3ICsxMTk5LDcgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKIAogICAgIGlmIChvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpICE9IHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNjsgKytpKSB7CiAgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7ICAvLyBza2lwICd2b3JiaXMnCkBAIC0xMTE5LDEzICsxMjA5LDEzIEBACiAgICAgICAgIGNhc2UgMToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfaW5mbygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWV0YS5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmkucmF0ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtVmkuY2hhbm5lbHMpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaS5iaXRyYXRlX25vbWluYWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1WaS5yYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtVmkuY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKIAogICAgICAgICAgICAgQUxPR1YoImxvd2VyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9sb3dlcik7CiAgICAgICAgICAgICBBTE9HVigidXBwZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3VwcGVyKTsKQEAgLTExNDAsNyArMTIzMCw3IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGJwcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTQ5LDI1ICsxMjM5LDI2IEBACiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOworICAgICAgICAgICAgc2V0Q2hhbm5lbE1hc2sobVZpLmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSA1OgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWV0YS5zZXREYXRhKGtLZXlWb3JiaXNCb29rcywgMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCBkYXRhLCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgY29uc3QgewpAQCAtMTE4MCwyMCArMTI3MSw0MyBAQAogCiAKIHZvaWQgTXlPZ2dFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgewotICAgIG1GaWxlTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WYy5jb21tZW50czsgKytpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQgPSBtVmMudXNlcl9jb21tZW50c1tpXTsKICAgICAgICAgc2l6ZV90IGNvbW1lbnRMZW5ndGggPSBtVmMuY29tbWVudF9sZW5ndGhzW2ldOwotICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQoJm1GaWxlTWV0YSwgY29tbWVudCwgY29tbWVudExlbmd0aCk7CisgICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudChtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOwogICAgICAgICAvL0FMT0dJKCJjb21tZW50ICMlZDogJyVzJyIsIGkgKyAxLCBtVmMudXNlcl9jb21tZW50c1tpXSk7CiAgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1GaWxlTWV0YSwgImhhcHRpYyIsICZtSGFwdGljQ2hhbm5lbENvdW50KTsKK30KKwordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6c2V0Q2hhbm5lbE1hc2soaW50IGNoYW5uZWxDb3VudCkgeworICAgIC8vIFNldCBjaGFubmVsIG1hc2sgYWNjb3JkaW5nIHRvIGNoYW5uZWwgY291bnQuIFdoZW4gaGFwdGljIGNoYW5uZWwgY291bnQgaXMgZm91bmQgaW4KKyAgICAvLyBmaWxlIG1ldGEsIHNldCBoYXB0aWMgY2hhbm5lbCBtYXNrIHRvIHRyeSBoYXB0aWMgcGxheWJhY2suCisgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBoYXB0aWNfY2hhbm5lbF9tYXNrX2Zyb21fY291bnQobUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgYXVkaW9DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQgLSBtSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElECisgICAgICAgICAgICAgICAgfHwgYXVkaW9DaGFubmVsQ291bnQgPD0gMCB8fCBhdWRpb0NoYW5uZWxDb3VudCA+IEZDQ184KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBoYXB0aWMgY2hhbm5lbCBjb3VudCBmb3VuZCBpbiBtZXRhZGF0YTogJWQiLCBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhdWRpb0NoYW5uZWxDb3VudCkgfCBoYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCkpOworICAgIH0KIH0KIAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1PZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7CkBAIC0xMjIwLDEzICsxMzM0LDE0IEBACiBPZ2dFeHRyYWN0b3I6On5PZ2dFeHRyYWN0b3IoKSB7CiAgICAgZGVsZXRlIG1JbXBsOwogICAgIG1JbXBsID0gTlVMTDsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBPZ2dFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSAxKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEyMzQsMzMgKzEzNDksMzQgQEAKICAgICByZXR1cm4gbmV3IE9nZ1NvdXJjZSh0aGlzKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSAxKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtSW1wbC0+Z2V0RmlsZU1ldGFEYXRhKG1ldGEpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciB0bXBbNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTI2OSwxNiArMTM4NSwyMyBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm9nYSIsCisgICAgIm9nZyIsCisgICAgIm9wdXMiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjhjYzVjZDA2LWY3NzItNDk1ZS04YTYyLWNiYTk2NDkzNzRlOSIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJPZ2cgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaAppbmRleCA5ZmUyOTQ0Li5jNzVkZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaApAQCAtMTksMjUgKzE5LDI2IEBACiAjZGVmaW5lIE9HR19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3I7CiBzdHJ1Y3QgT2dnU291cmNlOwogCi1zdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKQEAgLTQ2LDcgKzQ3LDcgQEAKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIE15T2dnRXh0cmFjdG9yICptSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IGRkMDQ1YjkuLjdlODkyNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtNywxMSArNywxMyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAppbmRleCBmZTUwOWJmLi5lNThiZDFmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTIwLDIxICsyMCwzMiBAQAogCiAjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+IC8vIGZvciBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4gLy8gZm9yIEFJRF9NRURJQQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKICNkZWZpbmUgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSIDAKIAorLy8gTk9URTogVGhpcyBjb2RlIGFzc3VtZXMgdGhlIGRldmljZSBwcm9jZXNzb3IgaXMgbGl0dGxlIGVuZGlhbi4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNZWRpYVNlcnZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGZsb2F0IGV4dHJhY3RvciBvdXRwdXQsIGJ1dCBnZW5lcmFsIHByb2Nlc3NlcworLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGRvIHNvLgorLy8gVE9ETzogSW1wcm92ZSBBUEkgdG8gc2V0IGV4dHJhY3RvciBmbG9hdCBvdXRwdXQuCisvLyAoTm90ZTogZHVwbGljYXRlZCB3aXRoIEZMQUNFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogZW51bSB7CiAgICAgV0FWRV9GT1JNQVRfUENNICAgICAgICA9IDB4MDAwMSwKICAgICBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUID0gMHgwMDAzLApAQCAtNTUsMjAgKzY2LDIwIEBACiAgICAgcmV0dXJuIHB0clsxXSA8PCA4IHwgcHRyWzBdOwogfQogCi1zdHJ1Y3QgV0FWU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBXQVZTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQogCkBAIC03OCw2NCArODksNzIgQEAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSAmbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDMyX3QgbU51bUNoYW5uZWxzOwogICAgIGludDMyX3QgbUJpdHNQZXJTYW1wbGU7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIHNpemVfdCBtU2l6ZTsKICAgICBib29sIG1TdGFydGVkOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogCiAgICAgV0FWU291cmNlKGNvbnN0IFdBVlNvdXJjZSAmKTsKICAgICBXQVZTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBXQVZTb3VyY2UgJik7CiB9OwogCi1XQVZFeHRyYWN0b3I6OldBVkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1WYWxpZEZvcm1hdChmYWxzZSksCiAgICAgICBtQ2hhbm5lbE1hc2soQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CisgICAgbVRyYWNrTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBtSW5pdENoZWNrID0gaW5pdCgpOwogfQogCiBXQVZFeHRyYWN0b3I6On5XQVZFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobVRyYWNrTWV0YSk7CiB9CiAKLXN0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IFdBVkV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqV0FWRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBuZXcgV0FWU291cmNlKAogICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGEsCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCwgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOworICAgICAgICAgICAgbVdhdmVGb3JtYXQsIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CiB9CiAKLXN0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobUJpdHNQZXJTYW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjppbml0KCkgewpAQCAtMTg1LDcgKzIwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXCiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01TR1NNCiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBmbXRTaXplID0gMTY7CkBAIC0xOTgsMTMgKzIxNywxMyBAQAogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMl0pOwogCi0gICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiA4KSB7CisgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiBGQ0NfOCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSIsIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSBGQ0NfMikgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiTW9yZSB0aGFuIDIgY2hhbm5lbHMgKCVkKSBpbiBub24tV0FWRV9FWFQsIHVua25vd24gY2hhbm5lbCBtYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIyNCw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ2YWxpZEJpdHMoJWQpICE9IGJpdHNQZXJTYW1wbGUoJWQpIGFyZSBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IHZhbGl0Qml0c1BlclNhbXBsZSA9PSBiaXRzUGVyU2FtcGxlIGJ1dCBzb21lIFdBVl9FWFQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcnMgZG9uJ3QgY29ycmVjdGx5IHNldCB0aGUgdmFsaWQgYml0cyB2YWx1ZSwgYW5kIGxlYXZlIGl0IGF0IDAuCkBAIC0yODQsMzUgKzMwMywzMyBAQAogICAgICAgICAgICAgICAgIG1EYXRhT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGNodW5rU2l6ZTsKIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobVRyYWNrTWV0YSk7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XYXZlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfQUxBVzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9NU0dTTToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtV2F2ZUZvcm1hdCwgKHVpbnQxNl90KVdBVkVfRk9STUFUX01VTEFXKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssIG1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgbUJpdHNQZXJTYW1wbGUpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCkBAIC0zMjIsMTggKzMzOSwxOCBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZXNQZXJTYW1wbGUgfHwgIW1OdW1DaGFubmVscykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwTEwgKiBudW1fc2FtcGxlcyAvIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CkBAIC0zNDgsMjUgKzM2NSwyMSBAQAogY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OwogCiBXQVZTb3VyY2U6OldBVlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCiAgICAgICBtV2F2ZUZvcm1hdCh3YXZlRm9ybWF0KSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbU51bUNoYW5uZWxzKDApLAotICAgICAgbUJpdHNQZXJTYW1wbGUoYml0c1BlclNhbXBsZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbU9mZnNldChvZmZzZXQpLAogICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCkgewotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKLQotICAgIG1NZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOworICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZtU2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmbU51bUNoYW5uZWxzKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJm1CaXRzUGVyU2FtcGxlKSk7CiB9CiAKIFdBVlNvdXJjZTo6fldBVlNvdXJjZSgpIHsKQEAgLTM3NSw1MiArMzg4LDUxIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOwotCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBpZiAoIW1CdWZmZXJHcm91cC0+aW5pdCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBtQ3VycmVudFBvcyA9IG1PZmZzZXQ7CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0b3AiKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpnZXRGb3JtYXQiKTsKIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGtNYXhGcmFtZVNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgewotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC00NDIsMTggKzQ1NCwyMiBAQAogICAgICAgICBtQ3VycmVudFBvcyA9IHBvcyArIG1PZmZzZXQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1heEJ5dGVzVG9SZWFkIGlzIG11bHRpcGxlIG9mIDMsIGluIDI0LWJpdCBjYXNlCi0gICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0KLSAgICAgICAgbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGtNYXhGcmFtZVNpemUgLyAyIDogCi0gICAgICAgIChtQml0c1BlclNhbXBsZSA9PSAyNCA/IDMqKGtNYXhGcmFtZVNpemUvMyk6IGtNYXhGcmFtZVNpemUpOworICAgIC8vIG1heEJ5dGVzVG9SZWFkIG1heSBiZSByZWR1Y2VkIHNvIHRoYXQgaW4tcGxhY2UgZGF0YSBjb252ZXJzaW9uIHdpbGwgZml0IGluIGJ1ZmZlciBzaXplLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkOworICAgIGlmIChtT3V0cHV0RmxvYXQpIHsgLy8gZGVzdGluYXRpb24gaXMgZmxvYXQgYXQgNCBieXRlcyBwZXIgc2FtcGxlLCBzb3VyY2UgbWF5IGJlIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gKG1CaXRzUGVyU2FtcGxlIC8gOCkgKiAoYnVmZmVyU2l6ZSAvIDQpOworICAgIH0gZWxzZSB7IC8vIGRlc3RpbmF0aW9uIGlzIGludDE2X3QgYXQgMiBieXRlcyBwZXIgc2FtcGxlLCBvbmx5IHNvdXJjZSBvZiA4IGJpdHMgaXMgbGVzcy4KKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtQml0c1BlclNhbXBsZSA9PSA4ID8gYnVmZmVyU2l6ZSAvIDIgOiBidWZmZXJTaXplOworICAgIH0KIAotICAgIHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CisgICAgY29uc3Qgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KICAgICAgICAgKG1DdXJyZW50UG9zIC0gbU9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkKICAgICAgICAgICAgID8gMCA6IG1TaXplIC0gKG1DdXJyZW50UG9zIC0gbU9mZnNldCk7CiAKQEAgLTQ4Miw0NSArNDk4LDY0IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7CiAKICAgICAvLyBUT0RPOiBhZGQgY2FwYWJpbGl0eSB0byByZXR1cm4gZGF0YSBhcyBmbG9hdCBQQ00gaW5zdGVhZCBvZiAxNiBiaXQgUENNLgogICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgOC1iaXQgdW5zaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGJ1ZmZlciB3aXRoIDIgYnl0ZSB3aWRlIHNhbXBsZXMKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqdG1wOwotICAgICAgICAgICAgQ0hFQ0tfRVEobUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KChpbnQxNl90ICopdG1wLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOwotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSB0bXA7Ci0gICAgICAgIH0gZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMjQpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMjQtYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0gIGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgICAgICBmbG9hdCAqZmRlc3QgPSAoZmxvYXQgKilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV91OChmZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDI7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmZGVzdCwgKGNvbnN0IGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeyAvLyBidWZmZXIgcmFuZ2UgaXMgY29ycmVjdAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTMyKGZkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQxNl90ICppZGVzdCA9IChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbik7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KGlkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBubyB0cmFuc2xhdGlvbiBuZWVkZWQKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KGlkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMihpZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgZmxvYXQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCisgICAgICAgIGlmICghbU91dHB1dEZsb2F0KSB7IC8vIG1CaXRzUGVyU2FtcGxlID09IDMyCisgICAgICAgICAgICBpbnQxNl90ICppZGVzdCA9IChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KGlkZXN0LCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CiAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gTm90ZTogaWYgb3V0cHV0IGVuY29kaW5nIGlzIGZsb2F0LCBubyBuZWVkIHRvIGNvbnZlcnQgaWYgc291cmNlIGlzIGZsb2F0LgogICAgIH0KIAogICAgIGludDY0X3QgdGltZVN0YW1wVXMgPSAwOwpAQCAtNTMzLDM5ICs1NjgsNDMgQEAKICAgICAgICAgICAgICAgICAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSkgLyBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lU3RhbXBVcyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lU3RhbXBVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CiAgICAgbUN1cnJlbnRQb3MgKz0gbjsKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgcmV0dXJuIHdyYXAobmV3IFdBVkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyICpoZWxwZXIgPSBuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpOwogICAgIGNoYXIgaGVhZGVyWzEyXTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgIGlmIChoZWxwZXItPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIGRlbGV0ZSBoZWxwZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7CisgICAgICAgIGRlbGV0ZSBoZWxwZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgV0FWRXh0cmFjdG9yICpleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKGhlbHBlcik7IC8vIGV4dHJhY3RvciBvd25zIHRoZSBoZWxwZXIKICAgICBpbnQgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGRlbGV0ZSBleHRyYWN0b3I7CiAgICAgaWYgKG51bVRyYWNrcyA9PSAwKSB7CkBAIC01NzcsMTYgKzYxNiwyMSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIndhdiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIldBViBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCmluZGV4IDQ2N2QwYjcuLmI1MTQxOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCkBAIC0xOSwzMCArMTksMzEgQEAKICNkZWZpbmUgV0FWX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLWNsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJXQVZFeHRyYWN0b3IiOyB9CiAKICAgICB2aXJ0dWFsIH5XQVZFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1WYWxpZEZvcm1hdDsKICAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKQEAgLTUyLDcgKzUzLDcgQEAKICAgICB1aW50MTZfdCBtQml0c1BlclNhbXBsZTsKICAgICBvZmY2NF90IG1EYXRhT2Zmc2V0OwogICAgIHNpemVfdCBtRGF0YVNpemU7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCmluZGV4IGRlOGYxMjAuLjg4MTlmODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICAgICAgICBDRkFfUkdHQiwKICAgICAgICAgICAgIENGQV9CR0dSLAogICAgICAgICAgICAgQ0ZBX0dCUkcsCisgICAgICAgICAgICBDRkFfTk9ORSwKICAgICAgICAgfTsKIAogICAgICAgICBPcGNvZGVMaXN0QnVpbGRlcigpOwpAQCAtODksNyArOTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogQWRkIGEgR2Fpbk1hcCBvcGNvZGUgd2l0aCB0aGUgZ2l2ZW4gZmllbGRzLiAgVGhlIG1hcEdhaW5zIGFycmF5CiAgICAgICAgICAqIG11c3QgaGF2ZSBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyBlbGVtZW50cy4KQEAgLTE5Nyw2ICsxOTcsMzMgQEAKIAogICAgICAgICBzdGF0dXNfdCBhZGRPcGNvZGVQcmVhbWJsZSh1aW50MzJfdCBvcGNvZGVJZCk7CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogfTsKIAogfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAppbmRleCA5YWM3ZTJhLi45MzA0ZjUzIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtNjAsMzQgKzYwLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoID0gYWN0aXZlQXJlYVJpZ2h0IC0gYWN0aXZlQXJlYUxlZnQ7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCA9IGFjdGl2ZUFyZWFCb3R0b20gLSBhY3RpdmVBcmVhVG9wOwotICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKLSAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKIAotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpyZWRNYXAgPSByZWRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuRXZlbk1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuRXZlbk1hcCA9IGdyZWVuRXZlbk1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5PZGRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbk9kZE1hcCA9IGdyZWVuT2RkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBibHVlTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqYmx1ZU1hcCA9IGJsdWVNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7Ci0KLSAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCi0gICAgc2l6ZV90IGogPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKLSAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07Ci0gICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKLSAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07Ci0gICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICBzd2l0Y2ggKGNmYSkgeworICAgICAgICBjYXNlIENGQV9SR0dCOgorICAgICAgICBjYXNlIENGQV9HUkJHOgorICAgICAgICBjYXNlIENGQV9HQlJHOgorICAgICAgICBjYXNlIENGQV9CR0dSOgorICAgICAgICAgICAgZXJyID0gYWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKGxzbVdpZHRoLCBsc21IZWlnaHQsIGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlQXJlYUhlaWdodCwgY2ZhLCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfTk9ORToKKyAgICAgICAgICAgIGVyciA9IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKGxzbVdpZHRoLCBsc21IZWlnaHQsIGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlQXJlYUhlaWdodCwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gQ0ZBIGxheW91dCAlZCIsIF9fRlVOQ1RJT05fXywgY2ZhKTsKKyAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICByZXR1cm4gZXJyOworfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKICAgICB1aW50MzJfdCByZWRUb3AgPSAwOwogICAgIHVpbnQzMl90IHJlZExlZnQgPSAwOwogICAgIHVpbnQzMl90IGdyZWVuRXZlblRvcCA9IDA7CkBAIC0xNDMsNiArMTQ1LDMyIEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpyZWRNYXAgPSByZWRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuRXZlbk1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuRXZlbk1hcCA9IGdyZWVuRXZlbk1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5PZGRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbk9kZE1hcCA9IGdyZWVuT2RkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBibHVlTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqYmx1ZU1hcCA9IGJsdWVNYXBWZWN0b3IuZGF0YSgpOworCisgICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOworICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07CisgICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKKyAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07CisgICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9yZWRUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL3JlZExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCkBAIC0yMTYsNiArMjQ0LDQ2IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICptYXAgPSBtYXBWZWN0b3IuZGF0YSgpOworCisgICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOworICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgbWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaV07CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL21hcCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI5ODFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3IuY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yX2NhbGxiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvX3ByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbGliYWF1ZGlvLnNvCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLWluY2x1ZGUgJChQUkVCVUlMVF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0NDc1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVE9ETyByZW1vdmUgdGhlbiB3aGVuIHdlIHN1cHBvcnQgb3RoZXIgYXJjaGl0ZWN0dXJlcwotQVBQX0FCSSA6PSBhcm02NC12OGEKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmU4NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9sb29wYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNuZGZpbGUKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmF1ZGlvdXRpbHMKLUxPQ0FMX01PRFVMRSA6PSBhYXVkaW9fbG9vcGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCmluZGV4IDk3MTFiODYuLjhlYjcwYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCkBAIC0zMTAsNyArMzEwLDcgQEAKICAgICB9CiAKICAgICAvLyBXcml0ZSBTSE9SVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCB3cml0ZShpbnQxNl90ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgogICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewogICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7CkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICB9CiAKICAgICAvLyBXcml0ZSBGTE9BVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50IHdyaXRlKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgd3JpdGUoZmxvYXQgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCiAgICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKQEAgLTMzMyw3ICszMzMsNyBAQAogICAgICAgICByZXR1cm4gbnVtRnJhbWVzOwogICAgIH0KIAotICAgIGludCBzaXplKCkgeworICAgIGludDMyX3Qgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50ZXI7CiAgICAgfQogCkBAIC00NDMsOSArNDQzLDE0IEBACiAgICAgdmlydHVhbCB+TG9vcGJhY2tQcm9jZXNzb3IoKSA9IGRlZmF1bHQ7CiAKIAorICAgIGVudW0gcHJvY2Vzc19yZXN1bHQgeworICAgICAgICBQUk9DRVNTX1JFU1VMVF9PSywKKyAgICAgICAgUFJPQ0VTU19SRVNVTFRfR0xJVENICisgICAgfTsKKwogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgdmlydHVhbCBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpID0gMDsKIApAQCAtNjM5LDcgKzY0NCw3IEBACiAgICAgICAgIHJldHVybiBnZXRTYW1wbGVSYXRlKCkgLyA4OwogICAgIH0KIAotICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7CiAgICAgICAgIGludCBjaGFubmVsc1ZhbGlkID0gc3RkOjptaW4oaW5wdXRDaGFubmVsQ291bnQsIG91dHB1dENoYW5uZWxDb3VudCk7CkBAIC03NTAsNiArNzU1LDcgQEAKIAogICAgICAgICBtU3RhdGUgPSBuZXh0U3RhdGU7CiAgICAgICAgIG1Mb29wQ291bnRlcisrOworICAgICAgICByZXR1cm4gUFJPQ0VTU19SRVNVTFRfT0s7CiAgICAgfQogCiAgICAgaW50IHNhdmUoY29uc3QgY2hhciAqZmlsZU5hbWUpIG92ZXJyaWRlIHsKQEAgLTg5Niw5ICs5MDIsMTAgQEAKICAgICAgKiBAcGFyYW0gaW5wdXREYXRhIGNvbnRhaW5zIG1pY3JvcGhvbmUgZGF0YSB3aXRoIHNpbmUgc2lnbmFsIGZlZWRiYWNrCiAgICAgICogQHBhcmFtIG91dHB1dERhdGEgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBzaW5lIHdhdmUKICAgICAgKi8KLSAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICBwcm9jZXNzX3Jlc3VsdCByZXN1bHQgPSBQUk9DRVNTX1JFU1VMVF9PSzsKICAgICAgICAgbVByb2Nlc3NDb3VudCsrOwogCiAgICAgICAgIGZsb2F0IHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwpAQCAtOTc4LDYgKzk4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1NYXhHbGl0Y2hEZWx0YSA9IHN0ZDo6bWF4KG1NYXhHbGl0Y2hEZWx0YSwgYWJzRGlmZik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhYnNEaWZmID4gbVRvbGVyYW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUdsaXRjaENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQUk9DRVNTX1JFU1VMVF9HTElUQ0g7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBHb3QgYSBnbGl0Y2ggIyAlZCwgcHJlZGljdGVkID0gJWYsIGFjdHVhbCA9ICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUZyYW1lQ291bnRlciwgbUdsaXRjaENvdW50LCBwcmVkaWN0ZWQsIHNhbXBsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7CkBAIC0xMDE4LDYgKzEwMjYsNyBAQAogCiAgICAgICAgICAgICBtRnJhbWVDb3VudGVyKys7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICB2b2lkIHJlc2V0QWNjdW11bGF0b3IoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IDJhMDJiMjAuLjY1NzgxNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC0zNCw5ICszNCwxMyBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVJlY29yZGVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiTG9vcGJhY2tBbmFseXplci5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oIgogCi0vLyBWMC40LjAwID0gcmVjdGlmeSBhbmQgbG93LXBhc3MgZmlsdGVyIHRoZSBlY2hvcywgdXNlIGF1dG8tY29ycmVsYXRpb24gb24gZW50aXJlIGVjaG8KLSNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuNC4wMCIKKy8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCBhdXRvLWNvcnJlbGF0ZSBlbnRpcmUgZWNobworLy8gVjAuNC4wMSA9IGFkZCAtaCBoYW5nIG9wdGlvbgorLy8gICAgICAgICAgIGZpeCAtbiBvcHRpb24gdG8gc2V0IG91dHB1dCBidWZmZXIgZm9yIC10bQorLy8gICAgICAgICAgIHBsb3QgZmlyc3QgZ2xpdGNoCisjZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjQuMDEiCiAKIC8vIFRhZyBmb3IgbWFjaGluZSByZWFkYWJsZSByZXN1bHRzIGFzIHByb3BlcnR5ID0gdmFsdWUgcGFpcnMKICNkZWZpbmUgUkVTVUxUX1RBRyAgICAgICAgICAgICAgIlJFU1VMVDogIgpAQCAtNDcsMTAgKzUxLDE0IEBACiBjb25zdGV4cHIgaW50IGtMb2dQZXJpb2RNaWxsaXMgICAgICAgPSAxMDAwOwogY29uc3RleHByIGludCBrTnVtSW5wdXRDaGFubmVscyAgICAgID0gMTsKIGNvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRHJhaW4gICA9IDIwOworY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID0gMDsgLy8gbGV0IGlucHV0IGZpbGwgYmFjayB1cAogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0gMjA7Citjb25zdGV4cHIgaW50IGtEZWZhdWx0SGFuZ1RpbWVNaWxsaXMgPSA1MDsKK2NvbnN0ZXhwciBpbnQga01heEdsaXRjaEV2ZW50c1RvU2F2ZSA9IDMyOwogCiBzdHJ1Y3QgTG9vcGJhY2tEYXRhIHsKICAgICBBQXVkaW9TdHJlYW0gICAgICAqaW5wdXRTdHJlYW0gPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICpvdXRwdXRTdHJlYW0gPSBudWxscHRyOwogICAgIGludDMyX3QgICAgICAgICAgICBpbnB1dEZyYW1lc01heGltdW0gPSAwOwogICAgIGludDE2X3QgICAgICAgICAgICppbnB1dFNob3J0RGF0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgICAgICAgICAgICAgKmlucHV0RmxvYXREYXRhID0gbnVsbHB0cjsKQEAgLTU4LDYgKzY2LDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsSW5wdXRDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxPdXRwdXRDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb0RyYWluID0ga051bUNhbGxiYWNrc1RvRHJhaW47CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvTm90UmVhZCA9IGtOdW1DYWxsYmFja3NUb05vdFJlYWQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRGlzY2FyZCA9IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG1pbk51bUZyYW1lcyA9IElOVDMyX01BWDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKQEAgLTY1LDYgKzc0LDkgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgaW5zdWZmaWNpZW50UmVhZEZyYW1lcyA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGZyYW1lc1JlYWRUb3RhbCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW5Ub3RhbCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdQZXJpb2RNaWxsaXMgPSA1ICogMTAwMDsgLy8gdGltZSBiZXR3ZWVuIGhhbmdzCisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgPSA1ICogNDgwMDA7IC8vIGZyYW1lcyB0aWwgbmV4dCBoYW5nCisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzID0gMDsgLy8gMCBmb3Igbm8gaGFuZwogICAgIGJvb2wgICAgICAgICAgICAgICBpc0RvbmUgPSBmYWxzZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICBpbnB1dEVycm9yID0gQUFVRElPX09LOwpAQCAtNzQsNiArODYsMjkgQEAKICAgICBFY2hvQW5hbHl6ZXIgICAgICAgZWNob0FuYWx5emVyOwogICAgIEF1ZGlvUmVjb3JkaW5nICAgICBhdWRpb1JlY29yZGluZzsKICAgICBMb29wYmFja1Byb2Nlc3NvciAqbG9vcGJhY2tQcm9jZXNzb3I7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgZ2xpdGNoRnJhbWVzW2tNYXhHbGl0Y2hFdmVudHNUb1NhdmVdOworICAgIGludDMyX3QgICAgICAgICAgICBudW1HbGl0Y2hFdmVudHMgPSAwOworCisgICAgdm9pZCBoYW5nSWZSZXF1ZXN0ZWQoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgaWYgKGhhbmdUaW1lTWlsbGlzID4gMCkgeworICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICBpZiAoaGFuZ0NvdW50ZG93bkZyYW1lcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydE5hbm9zID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoaGFuZ1RpbWVNaWxsaXMgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVuZE5hbm9zID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVsYXBzZWRNaWNyb3MgPSAoaW50MzJfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZW5kTmFub3MgLSBzdGFydE5hbm9zKSAvIDEwMDApOworICAgICAgICAgICAgICAgIHByaW50ZigiY2FsbGJhY2sgaGFuZ2luZyBmb3IgJWQgbWlsbGlzLCBhY3R1YWwgPSAlZCBtaWNyb3NcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzLCBlbGFwc2VkTWljcm9zKTsKKyAgICAgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzID0gKGludDY0X3QpIGhhbmdQZXJpb2RNaWxsaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUob3V0cHV0U3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAxMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgIH0KIH07CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRQY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLApAQCAtMTA1LDkgKzE0MCwxNCBAQAogICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgIH0KICAgICBpZiAoZnJhbWVzUmVhZCA8IDApIHsKLSAgICAgICAgbXlEYXRhLT5pbnB1dEVycm9yID0gZnJhbWVzUmVhZDsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQgPSAlc1xuIiwgZnJhbWVzUmVhZCwKLSAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGZyYW1lc1JlYWQpKTsKKyAgICAgICAgLy8gRXhwZWN0IElOVkFMSURfU1RBVEUgaWYgU1RBVEVfU1RBUlRJTkcKKyAgICAgICAgaWYgKG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsID4gMCkgeworICAgICAgICAgICAgbXlEYXRhLT5pbnB1dEVycm9yID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW4gcmVhZCA9ICVkID0gJXNcbiIsIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVzUmVhZCA9IDA7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBteURhdGEtPmZyYW1lc1JlYWRUb3RhbCArPSBmcmFtZXNSZWFkOwogICAgIH0KQEAgLTE0OSw4ICsxODksMTAgQEAKICAgICAgICAgaW50MzJfdCB0b3RhbEZyYW1lc1JlYWQgPSAwOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOwotICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQpIHsKKyAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkID4gMCkgewogICAgICAgICAgICAgICAgIHRvdGFsRnJhbWVzUmVhZCArPSBhY3R1YWxGcmFtZXNSZWFkOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgYmVjYXVzZSBpbnB1dCBzdHJlYW0gbWF5IG5vdCBiZSBzdGFydGVkIHlldC4KICAgICAgICAgfSB3aGlsZSAoYWN0dWFsRnJhbWVzUmVhZCA+IDApOwpAQCAtMTU5LDYgKzIwMSw5IEBACiAgICAgICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvRHJhaW4tLTsKICAgICAgICAgfQogCisgICAgfSBlbHNlIGlmIChteURhdGEtPm51bUNhbGxiYWNrc1RvTm90UmVhZCA+IDApIHsKKyAgICAgICAgLy8gTGV0IHRoZSBpbnB1dCBmaWxsIHVwIGEgYml0IHNvIHdlIGFyZSBub3Qgc28gY2xvc2UgdG8gdGhlIHdyaXRlIHBvaW50ZXIuCisgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9Ob3RSZWFkLS07CiAgICAgfSBlbHNlIGlmIChteURhdGEtPm51bUNhbGxiYWNrc1RvRGlzY2FyZCA+IDApIHsKICAgICAgICAgLy8gSWdub3JlLiBBbGxvdyB0aGUgaW5wdXQgdG8gZmlsbCBiYWNrIHVwIHRvIGVxdWlsaWJyaXVtIHdpdGggdGhlIG91dHB1dC4KICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKQEAgLTE2OCw2ICsyMTMsNyBAQAogICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvRGlzY2FyZC0tOwogCiAgICAgfSBlbHNlIHsKKyAgICAgICAgbXlEYXRhLT5oYW5nSWZSZXF1ZXN0ZWQobnVtRnJhbWVzKTsKIAogICAgICAgICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBudW1GcmFtZXMgKiBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICAgbWVtc2V0KG15RGF0YS0+aW5wdXRGbG9hdERhdGEsIDAgLyogdmFsdWUgKi8sIG51bUlucHV0Qnl0ZXMpOwpAQCAtMTg0LDcgKzIzMCw3IEBACiAKICAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgbnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAgICAgaWYoYWN0dWFsRnJhbWVzUmVhZCA8IChpbnQzMl90KSBmcmFtZXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgYnV0IG51bUZyYW1lcyA9ICVkIgorICAgICAgICAgICAgICAgICAgICBwcmludGYoImluc3VmZmljaWVudCBmb3Igbm8gcmVhc29uLCBudW1GcmFtZXMgPSAlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYWN0dWFsRnJhbWVzUmVhZCA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnB1dEZyYW1lc1dyaXR0ZW4gPSAlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaW5wdXRGcmFtZXNSZWFkID0gJWQiCkBAIC0yMDUsMTYgKzI1MSwyNSBAQAogICAgICAgICAgICAgaWYgKG15RGF0YS0+YWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CiAgICAgICAgICAgICAgICAgY29udmVydFBjbTE2VG9GbG9hdChteURhdGEtPmlucHV0U2hvcnREYXRhLCBteURhdGEtPmlucHV0RmxvYXREYXRhLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgotICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworCiAgICAgICAgICAgICAvLyBBbmFseXplIHRoZSBkYXRhLgotICAgICAgICAgICAgbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+cHJvY2VzcyhteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgTG9vcGJhY2tQcm9jZXNzb3I6OnByb2Nlc3NfcmVzdWx0IHByb2NSZXN1bHQgPSBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5wcm9jZXNzKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworCisgICAgICAgICAgICBpZiAocHJvY1Jlc3VsdCA9PSBMb29wYmFja1Byb2Nlc3Nvcjo6UFJPQ0VTU19SRVNVTFRfR0xJVENIKSB7CisgICAgICAgICAgICAgICAgaWYgKG15RGF0YS0+bnVtR2xpdGNoRXZlbnRzIDwga01heEdsaXRjaEV2ZW50c1RvU2F2ZSkgeworICAgICAgICAgICAgICAgICAgICBteURhdGEtPmdsaXRjaEZyYW1lc1tteURhdGEtPm51bUdsaXRjaEV2ZW50cysrXSA9IG15RGF0YS0+YXVkaW9SZWNvcmRpbmcuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIuCisgICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLndyaXRlKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQpOworCiAgICAgICAgICAgICBteURhdGEtPmlzRG9uZSA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPmlzRG9uZSgpOwogICAgICAgICAgICAgaWYgKG15RGF0YS0+aXNEb25lKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwpAQCAtMjQyLDYgKzI5Nyw3IEBACiAgICAgcHJpbnRmKCIgICAgICAtQ3tjaGFubmVsc30gICAgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHNcbiIpOwogICAgIHByaW50ZigiICAgICAgLUZ7MCwxLDJ9ICAgICAgICAgaW5wdXQgZm9ybWF0LCAxPUkxNiwgMj1GTE9BVFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtZ3tnYWlufSAgICAgICAgICByZWNpcmN1bGF0aW5nIGxvb3BiYWNrIGdhaW5cbiIpOworICAgIHByaW50ZigiICAgICAgLWh7aGFuZ01pbGxpc30gICAgb2NjYXNpb25hbGx5IGhhbmcgaW4gdGhlIGNhbGxiYWNrXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1Qe2luUGVyZn0gICAgICAgIHNldCBpbnB1dCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSpcbiIpOwogICAgIHByaW50ZigiICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBsIGZvciBfTEFURU5DWVxuIik7CkBAIC0zMDAsOSArMzU2LDcgQEAKICAgICByZXR1cm4gdGVzdE1vZGU7CiB9CiAKLXZvaWQgcHJpbnRBdWRpb0dyYXBoKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludCBudW1TYW1wbGVzKSB7Ci0gICAgaW50MzJfdCBzdGFydCA9IHJlY29yZGluZy5zaXplKCkgLyAyOwotICAgIGludDMyX3QgZW5kID0gc3RhcnQgKyBudW1TYW1wbGVzOwordm9pZCBwcmludEF1ZGlvR3JhcGhSZWdpb24oQXVkaW9SZWNvcmRpbmcgJnJlY29yZGluZywgaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQpIHsKICAgICBpZiAoZW5kID49IHJlY29yZGluZy5zaXplKCkpIHsKICAgICAgICAgZW5kID0gcmVjb3JkaW5nLnNpemUoKSAtIDE7CiAgICAgfQpAQCAtMzQ1LDcgKzM5OSw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2FwYWNpdHkgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgaW5wdXRQZXJmb3JtYW5jZUxldmVsICA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwogCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgIG91dHB1dEZyYW1lc1BlckJ1cnN0ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgICAgICAgPSAwOwogCiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIGFjdHVhbE91dHB1dEZvcm1hdCAgICAgICAgID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlICAgICAgICAgICA9IDA7CkBAIC0zNTMsNiArNDA3LDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICAgICB0ZXN0TW9kZSAgICAgICAgICAgICAgICAgICA9IFRFU1RfRUNIT19MQVRFTkNZOwogICAgIGRvdWJsZSAgICAgICAgICAgICAgICBnYWluICAgICAgICAgICAgICAgICAgICAgICA9IDEuMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgICAgICAgICAgICAgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0zODIsNiArNDM3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGF0b2YoJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYXMgdGhlcmUgYSBudW1iZXIgYWZ0ZXIgdGhlICItaCI/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnWzJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBudW1iZXIgdGhlbiB1c2UgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gcGFyc2VQZXJmb3JtYW5jZU1vZGUoYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE1LDYgKzQ3OSw4IEBACiAgICAgaW50MzJfdCB0aW1lTWlsbGlzID0gMDsKICAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAgKiA1LCByZXF1ZXN0ZWREdXJhdGlvbik7CiAKKyAgICBpbnQzMl90IHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9IGFyZ1BhcnNlci5nZXROdW1iZXJPZkJ1cnN0cygpOworCiAgICAgc3dpdGNoKHRlc3RNb2RlKSB7CiAgICAgICAgIGNhc2UgVEVTVF9TSU5FX01BR05JVFVERToKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuc2luZUFuYWx5emVyOwpAQCAtNDQ2LDcgKzUxMiw3IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9Ci0gICAgb3V0cHV0U3RyZWFtID0gcGxheWVyLmdldFN0cmVhbSgpOworICAgIG91dHB1dFN0cmVhbSA9IGxvb3BiYWNrRGF0YS5vdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CiAKICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG91dHB1dFN0cmVhbSk7CiAgICAgaWYgKGFjdHVhbE91dHB1dEZvcm1hdCAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewpAQCAtNDgyLDI0ICs1NDgsMjkgQEAKIAogICAgIHsKICAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwotICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKLSAgICAgICAgfSBlbHNlIHt9Ci0gICAgfQorICAgICAgICAodm9pZCkgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwogCi0gICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0ZWRPdXRwdXRCdXJzdHMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG91dHB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMob3V0cHV0KSByZXR1cm5lZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiT3V0cHV0IGJ1ZmZlciBzaXplIHNldCB0byBtYXRjaCBpbnB1dCBjYXBhY2l0eSA9ICVkIGZyYW1lcyFcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KLSAgICB7Ci0gICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7CisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KICAgICAgICAgaWYgKGFjdHVhbENhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0KSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gaW5wdXQgY2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3RcbiIpOwogICAgICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworCiAgICAgLy8gLS0tLS0tLSBTZXR1cCBsb29wYmFja0RhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBsb29wYmFja0RhdGEuYWN0dWFsSW5wdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KGlucHV0U3RyZWFtKTsKIApAQCAtNTE4LDYgKzU4OSw4IEBACiAKICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlc2V0KCk7CiAKKyAgICBsb29wYmFja0RhdGEuaGFuZ1RpbWVNaWxsaXMgPSBoYW5nVGltZU1pbGxpczsKKwogICAgIC8vIFN0YXJ0IE9VVFBVVCBmaXJzdCBzbyBJTlBVVCBkb2VzIG5vdCBvdmVyZmxvdy4KICAgICByZXN1bHQgPSBwbGF5ZXIuc3RhcnQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNjA0LDcgKzY3NywxNyBAQAogCiAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgewogICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgewotICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgMjAwKTsKKyAgICAgICAgICAgIGlmIChsb29wYmFja0RhdGEubnVtR2xpdGNoRXZlbnRzID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEdyYXBoIGFyb3VuZCB0aGUgZmlyc3QgZ2xpdGNoIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHN0YXJ0ID0gbG9vcGJhY2tEYXRhLmdsaXRjaEZyYW1lc1swXSAtIDg7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbmQgPSBzdGFydCArIG91dHB1dEZyYW1lc1BlckJ1cnN0ICsgOCArIDg7CisgICAgICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE9yIGdyYXBoIHRoZSBtaWRkbGUgb2YgdGhlIHNpZ25hbC4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHN0YXJ0ID0gbG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLnNpemUoKSAvIDI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbmQgPSBzdGFydCArIDIwMDsKKyAgICAgICAgICAgICAgICBwcmludEF1ZGlvR3JhcGhSZWdpb24obG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVwb3J0KCk7CkBAIC02NTQsNiArNzM3LDExIEBACiAgICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0U2hvcnREYXRhOwogCiByZXBvcnRfcmVzdWx0OgorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wYmFja0RhdGEubnVtR2xpdGNoRXZlbnRzOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIgIGdsaXRjaCBhdCBmcmFtZSAlZFxuIiwgbG9vcGJhY2tEYXRhLmdsaXRjaEZyYW1lc1tpXSk7CisgICAgfQorCiAgICAgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+c2F2ZShGSUxFTkFNRV9QUk9DRVNTRUQpOwogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gXCIlc1wiIG9uIEFuZHJvaWQgZGV2aWNlXG4iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggYTJiOTE3Ny4uZjVlZDdhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0xMzAsMTIgKzEzMCwxMCBAQAogICAgIH0KIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCB7Ci0gICAgICAgIHByaW50ZigiJXMoKSByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eTsKICAgICB9CiAKICAgICB2b2lkIHNldEJ1ZmZlckNhcGFjaXR5KGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIHByaW50ZigiJXMoJWQpXG4iLCBfX2Z1bmNfXywgZnJhbWVzKTsKICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ID0gZnJhbWVzOwogICAgIH0KIApAQCAtMjgzLDcgKzI4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYXJnKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBNTUFQIHBvbGljeSBtb2RlICVpXG4iLCBwb2xpY3kpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCAxNjQ1OTg2Li40MzczZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC0zMiw4ICszMiw2IEBACiAKIC8vIEFyYml0cmFyeSBwZXJpb2QgZm9yIGdsaXRjaGVzCiAjZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTICAgICgyICogNDgwMDApCi0vLyBIb3cgbG9uZyB0byBzbGVlcCBpbiBhIGNhbGxiYWNrIHRvIGNhdXNlIGFuIGludGVudGlvbmFsIGdsaXRjaC4gRm9yIHRlc3RpbmcuCi0jZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MgICAgICgxMCAqIDEwMDApCiAKICNkZWZpbmUgTUFYX1RJTUVTVEFNUFMgICAgICAgICAgICAgICAgICAgMTYKIApAQCAtMjc1LDcgKzI3Myw3IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgc2NoZWR1bGVyID0gMDsKICAgICBib29sICAgICAgICAgICAgICAgc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwotICAgIGJvb2wgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOwogCiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKICAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CkBAIC0zMjcsMTAgKzMyNSwxMiBAQAogICAgICAgICBzaW5lRGF0YS0+c2V0dXBTaW5lU3dlZXBzKCk7CiAgICAgfQogCi0gICAgaWYgKHNpbmVEYXRhLT5mb3JjZVVuZGVycnVucykgeworICAgIGlmIChzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjID4gMCkgewogICAgICAgICBpZiAoc2luZURhdGEtPmZyYW1lc1RvdGFsID4gc2luZURhdGEtPm5leHRGcmFtZVRvR2xpdGNoKSB7Ci0gICAgICAgICAgICB1c2xlZXAoRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyk7Ci0gICAgICAgICAgICBwcmludGYoIlNpbXVsYXRlIGdsaXRjaCBhdCAlbGxkXG4iLCAobG9uZyBsb25nKSBzaW5lRGF0YS0+ZnJhbWVzVG90YWwpOworICAgICAgICAgICAgdXNsZWVwKHNpbmVEYXRhLT5oYW5nVGltZU1TZWMgKiAxMDAwKTsKKyAgICAgICAgICAgIHByaW50ZigiSGFuZyBjYWxsYmFjayBhdCAlbGxkIGZyYW1lcyBmb3IgJWQgbXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgc2luZURhdGEtPmZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5oYW5nVGltZU1TZWMpOwogICAgICAgICAgICAgc2luZURhdGEtPm5leHRGcmFtZVRvR2xpdGNoICs9IEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExYmQ0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZV9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCA3YTQ4MTUzLi4yYjA1ZjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0yNiwxMSArMjYsMTQgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgogCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAiMC4xLjUiCisjZGVmaW5lIEFQUF9WRVJTSU9OICAiMC4xLjYiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SGFuZ1RpbWVNU2VjID0gMTA7CiAKIC8qKgogICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCkBAIC00MSw3ICs0NCw3IEBACiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsb29wQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlZml4VG9uZU1zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VVbmRlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGFuZ1RpbWVNU2VjKQogewogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7CiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOwpAQCAtNTMsMTAgKzU2LDEyIEBACiAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBydW4gY29tcGxldGUgdGVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgbXlEYXRhLnNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBteURhdGEuY2FsbGJhY2tDb3VudCA9IDA7Ci0gICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZm9yY2VVbmRlcnJ1bnM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCisgICAgbXlEYXRhLmhhbmdUaW1lTVNlYyA9IGhhbmdUaW1lTVNlYzsgLy8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKIAogICAgIHJlc3VsdCA9IHBsYXllci5vcGVuKGFyZ1BhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLCBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CkBAIC0xMTUsMTIgKzEyMCwxNyBAQAogICAgICAgICAgICAgaW50NjRfdCBtaWxsaXMgPQogICAgICAgICAgICAgICAgICAgICAoZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0ZWRBdE5hbm9zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKICAgICAgICAgICAgIHJlc3VsdCA9IG15RGF0YS53YWtlci5nZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNSZWFkID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhydW5zID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgcHJpbnRmKCIgd2FrZXIgcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXMgd3JpdHRlbiAlOGQgLSByZWFkICU4ZCA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCAoaW50KSBtaWxsaXMsCiAgICAgICAgICAgICAgICAgICAgc2Vjb25kLAotICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCi0gICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgeHJ1bnMpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIGJhaWxPdXQgPSB0cnVlOwpAQCAtMjEwLDcgKzIyMCw5IEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1se2NvdW50fSBsb29wQ291bnQgc3RhcnQvc3RvcCwgZXZlcnkgb3RoZXIgb25lIGlzIHNpbGVudFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtdHttc2VjfSAgcGxheSBhIGhpZ2ggcGl0Y2hlZCB0b25lIGF0IHRoZSBiZWdpbm5pbmdcbiIpOwotICAgIHByaW50ZigiICAgICAgLXogICAgICAgIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBzbGVlcGluZyBpbiBjYWxsYmFja1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtaHttc2VjfSAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IGhhbmdpbmcgaW4gY2FsbGJhY2tcbiIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHNwZWNpZmllZCB0aGVuICVkIHVzZWQuXG4iLAorICAgICAgICAgICAga0RlZmF1bHRIYW5nVGltZU1TZWMpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCkBAIC0yMTksMTMgKzIzMSwxNCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGxvb3BDb3VudCA9IDE7CiAgICAgaW50MzJfdCAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjID0gMDsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWJXNcbiIsIGFyZ3ZbMF0sIEFQUF9WRVJTSU9OKTsKKyAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYlc1xuIiwKKyAgICAgICAgYXJndlswXSwgQVBQX1ZFUlNJT04pOwogCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKQEAgLTI0MCw4ICsyNTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IHRydWU7ICAvLyBaenp6enp6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gKGFyZ1syXSkgLy8gdmFsdWUgc3BlY2lmaWVkPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0b2koJmFyZ1syXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrRGVmYXVsdEhhbmdUaW1lTVNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKQEAgLTI1Nyw3ICsyNzIsOCBAQAogICAgIH0KIAogICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBjYW4gY29tcGxldGUgdGhlIHRlc3Qgd2l0aG91dCBkaXNjb25uZWN0aW5nLgotICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwgcHJlZml4VG9uZU1zZWMsIGZvcmNlVW5kZXJydW5zKSkKKyAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsCisgICAgICAgICAgICBwcmVmaXhUb25lTXNlYywgaGFuZ1RpbWVNU2VjKSkKICAgICAgICAgICAgID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogCiAgICAgcmV0dXJuIChyZXN1bHQpID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IDE0OTNiMjYuLjhlMzZjNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTM3Myw2ICszNzMsMTMgQEAKICAgICAgKiBzbyB0aGUgcmVjb3JkZWQgdm9sdW1lIG1heSBiZSB2ZXJ5IGxvdy4KICAgICAgKi8KICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID0gOSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCBmb3IgY2FwdHVyaW5nIGF1ZGlvIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBpbiByZWFsIHRpbWUKKyAgICAgKiBhbmQgcGxheWVkIGJhY2sgZm9yIGxpdmUgcGVyZm9ybWFuY2UgKGUuZyBrYXJhb2tlKS4KKyAgICAgKiBUaGUgY2FwdHVyZSBwYXRoIHdpbGwgbWluaW1pemUgbGF0ZW5jeSBhbmQgY291cGxpbmcgd2l0aCBwbGF5YmFjayBwYXRoLgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKIH07CiB0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2lucHV0X3ByZXNldF90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggYjllMjhhMC4uNDA5MDI4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtNiw2ICs2LDcgQEAKICAgICAgICAgImNsaWVudCIsCiAgICAgICAgICJjb3JlIiwKICAgICAgICAgImZpZm8iLAorICAgICAgICAiZmxvd2dyYXBoIiwKICAgICAgICAgImxlZ2FjeSIsCiAgICAgICAgICJ1dGlsaXR5IiwKICAgICBdLApAQCAtMjUsOSArMjYsOSBAQAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIiwKLSAgICAgICAgInV0aWxpdHkvTGluZWFyUmFtcC5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQnVmZmVyLmNwcCIsCiAgICAgICAgICJmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAiLAorICAgICAgICAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIiwKQEAgLTQyLDYgKzQzLDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9SYW1wTGluZWFyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0kxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMjQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCA5NTlkYjYxLi4zZDFiYzliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgpAQCAtMzYsNiArNDAsNyBAQAogCiBzdGF0dXNfdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldERldmljZUlkKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNhbXBsZVJhdGUoKSk7CkBAIC00Niw2ICs1MSw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXREaXJlY3Rpb24oKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CkBAIC02MCw3ICs2Niw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi53cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MCw3ICs4Niw4IEBACiAgICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGFhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworICAgIHNldEZvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXREaXJlY3Rpb24oKGFhdWRpb19kaXJlY3Rpb25fdCkgdmFsdWUpOwpAQCAtOTksOCArMTA2LDkgQEAKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0U2Vzc2lvbklkKHZhbHVlKTsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiByZWFkIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDYyMGVkYzcuLjliMzI1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApAQCAtNzIsNyArNzIsNiBAQAogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IHRyYW5zYWN0KE9QRU5fU1RSRUFNKSByZWFkSW50ICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBPUEVOX1NUUkVBTSBwYXNzZWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gY29uZmlndXJhdGlvbk91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IDBiMGNmNzcuLjY3OTU1ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7CiAgICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAotICAgIEFMT0dWKCJzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOworICAgIEFMT0dWKCJzZXR1cChmZCA9ICVkIC0+ICVkLCBzaXplID0gJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCkBAIC0xMDQsNyArMTA0LDggQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlZCwgZXJybm8gPSAlcyIsCisgICAgICAgICAgICAgIGZkLmdldCgpLCBtU2l6ZUluQnl0ZXMsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAppbmRleCA4MmMyMjQwLi40ZWMzOGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKQEAgLTcwLDggKzcwLDggQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKLSAgICBpbnQzMl90ICAgICBtU2l6ZUluQnl0ZXMgPSAwOwotICAgIHVpbnQ4X3QgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKIAogcHJpdmF0ZToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0M2M2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0Zsb3dHcmFwaCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBdWRpb0Zsb3dHcmFwaC5oIgorCisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTI0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9GbG93R3JhcGg6OmNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CisKKyAgICBBTE9HRCgiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgc291cmNlQ2hhbm5lbENvdW50LCBzaW5rRm9ybWF0LCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHN3aXRjaCAoc291cmNlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUZsb2F0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMTY+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMjQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dCA9ICZtU291cmNlLT5vdXRwdXQ7CisKKyAgICAvLyBBcHBseSB2b2x1bWUgYXMgYSByYW1wIHRvIGF2b2lkIHBvcHMuCisgICAgbVZvbHVtZVJhbXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVZvbHVtZVJhbXAtPmlucHV0KTsKKyAgICBsYXN0T3V0cHV0ID0gJm1Wb2x1bWVSYW1wLT5vdXRwdXQ7CisKKyAgICAvLyBGb3IgYSBwdXJlIGZsb2F0IGdyYXBoLCB0aGVyZSBpcyBjaGFuY2UgdGhhdCB0aGUgZGF0YSByYW5nZSBtYXkgYmUgdmVyeSBsYXJnZS4KKyAgICAvLyBTbyB3ZSBzaG91bGQgY2xpcCB0byBhIHJlYXNvbmFibGUgdmFsdWUgdGhhdCBhbGxvd3MgYSBsaXR0bGUgaGVhZHJvb20uCisgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUICYmIHNpbmtGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtQ2xpcHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpcFRvUmFuZ2U+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DbGlwcGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNsaXBwZXItPm91dHB1dDsKKyAgICB9CisKKyAgICAvLyBFeHBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpZiByZXF1aXJlZC4KKyAgICBpZiAoc291cmNlQ2hhbm5lbENvdW50ID09IDEgJiYgc2lua0NoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgbUNoYW5uZWxDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vbm9Ub011bHRpQ29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNoYW5uZWxDb252ZXJ0ZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2hhbm5lbENvbnZlcnRlci0+b3V0cHV0OworICAgIH0gZWxzZSBpZiAoc291cmNlQ2hhbm5lbENvdW50ICE9IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgQ2hhbm5lbCByZWR1Y3Rpb24gbm90IHN1cHBvcnRlZC4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNpbmtGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtGbG9hdD4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTE2PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNpbmsgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc2lua0Zvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1TaW5rLT5pbnB1dCk7CisKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6cHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Tb3VyY2UtPnNldERhdGEoc291cmNlLCBudW1GcmFtZXMpOworICAgIG1TaW5rLT5yZWFkKGRlc3RpbmF0aW9uLCBudW1GcmFtZXMpOworfQorCisvKioKKyAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICovCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisKK2NsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CitwdWJsaWM6CisgICAgLyoqIENvbm5lY3Qgc2V2ZXJhbCBtb2R1bGVzIHRvZ2V0aGVyIHRvIGNvbnZlcnQgZnJvbSBzb3VyY2UgdG8gc2luay4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZvcm1hdAorICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsQ291bnQKKyAgICAgKiBAcGFyYW0gc2lua0Zvcm1hdAorICAgICAqIEBwYXJhbSBzaW5rQ2hhbm5lbENvdW50CisgICAgICogQHJldHVybgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKK307CisKKworI2VuZGlmIC8vQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IGY4ZTM0ZDEuLjIxNGY4ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKQpAQCAtMjA2LDE1ICsyMDYsMTUgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVJlYWRDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCmluZGV4IDkyMDQ4MjQuLmVjMjcwZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIApAQCAtNjMsNyArNjIsNyBAQAogICAgICAgICAsIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKEFBVURJT19IQU5ETEVfSU5WQUxJRCkKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkKICAgICAgICAgLCBtU2VydmljZUludGVyZmFjZShzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQorICAgICAgICAsIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcCgpCiAgICAgICAgICwgbVdha2V1cERlbGF5TmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgICwgbU1pbmltdW1TbGVlcE5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgewpAQCAtOTIsMTEgKzkxLDExIEBACiAgICAgfQogCiAgICAgLy8gV2UgaGF2ZSB0byBkbyB2b2x1bWUgc2NhbGluZy4gU28gd2UgcHJlZmVyIEZMT0FUIGZvcm1hdC4KLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCi0gICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwpAQCAtMTI2LDEzICsxMjUsMTIgQEAKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgogICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaW4gdGhlIGNsaWVudC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGEgbW9ubyBtaXhlciBpbiB0aGUgc2VydmljZQogICAgICAgICAvLyB0aGF0IHdyaXRlcyB0byBhIHN0ZXJlbyBNTUFQIHN0cmVhbS4KLSAgICAgICAgQUxPR0QoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBtU2VydmljZVN0cmVhbUhhbmRsZTsKICAgICB9CiAKQEAgLTIxMiw5ICsyMTAsNyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOwotICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOwogICAgIH0KIApAQCAtMzUzLDggKzM0OSw3IEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQoteworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzY4LDcgKzM2Myw3IEBACiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKyAgICBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAuY2xlYXIoKTsKIAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KQEAgLTQxNyw4ICs0MTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0ludGVybmFsVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0ludGVybmFsVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgICAgICBpZiAocG9zaXRpb24gPj0gMCkgewogICAgICAgICAgICAgKmZyYW1lUG9zaXRpb24gPSBwb3NpdGlvbjsKQEAgLTQ2NSw3ICs0NjAsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAobWVzc2FnZS0+dGltZXN0YW1wLnBvc2l0aW9uLCBtZXNzYWdlLT50aW1lc3RhbXAudGltZXN0YW1wKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtNjk2LDcgKzY5MSw2IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7Ci0gICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC03MTksMyArNzEzLDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICByZXR1cm4gQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQocmV0dXJuQXJnLCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChnZXRGcmFtZXNQZXJCdXJzdCgpKSk7CiB9CisKK2Jvb2wgQXVkaW9TdHJlYW1JbnRlcm5hbDo6aXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3QgeworICAgIHJldHVybiBpc0FjdGl2ZSgpICYmIG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSAmJiBtQ2xvY2tNb2RlbC5pc1J1bm5pbmcoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCAwNDI1Y2Q1Li44NmM0Njk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CkBAIC0xNDUsNiArMTQ0LDE0IEBACiAgICAgICovCiAgICAgYm9vbCBpc0luU2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1JblNlcnZpY2U7IH0KIAorICAgIC8qKgorICAgICAqIElzIHRoZSBzZXJ2aWNlIEZJRk8gcG9zaXRpb24gY3VycmVudGx5IGNvbnRyb2xsZWQgYnkgdGhlIEFBdWRpbyBzZXJ2aWNlIG9yIEhBTCwKKyAgICAgKiBvciBzZXQgYmFzZWQgb24gdGhlIENsb2NrIE1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDbG9ja01vZGVsIGlzIGN1cnJlbnRseSBkZXRlcm1pbmluZyB0aGUgRklGTyBwb3NpdGlvbgorICAgICAqLworICAgIGJvb2wgaXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3Q7CisKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKIAogICAgIEF1ZGlvRW5kcG9pbnQgICAgICAgICAgICBtQXVkaW9FbmRwb2ludDsgICAvLyBzb3VyY2UgZm9yIHJlYWRzIG9yIHNpbmsgZm9yIHdyaXRlcwpAQCAtMTY0LDcgKzE3MSw3IEBACiAKICAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmbVNlcnZpY2VJbnRlcmZhY2U7ICAgLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlCiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgIG1OZWVkQ2F0Y2hVcDsgICAvLyBBc2sgcmVhZCgpIG9yIHdyaXRlKCkgdG8gc3luYyBvbiBmaXJzdCB0aW1lc3RhbXAuCiAKQEAgLTE5Myw2ICsyMDAsOCBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIAorICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudCBmcm9tIHRoZSBhcHAuCisgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAwNzE5ZmUxLi5hNmNjNDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgpAQCAtMTY1LDM1ICsxNjYsMzYgQEAKICAgICAvLyBSZWFkIGRhdGEgaW4gb25lIG9yIHR3byBwYXJ0cy4KICAgICBmb3IgKGludCBwYXJ0SW5kZXggPSAwOyBmcmFtZXNMZWZ0ID4gMCAmJiBwYXJ0SW5kZXggPCBXcmFwcGluZ0J1ZmZlcjo6U0laRTsgcGFydEluZGV4KyspIHsKICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNMZWZ0OwotICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOworICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOwogICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlIDw9IDApIGJyZWFrOwogCiAgICAgICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiBmcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgIGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0F2YWlsYWJsZTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBjb25zdCBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOworICAgICAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZGVzdGluYXRpb25Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IGdldEZvcm1hdCgpKSB7CisgICAgICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gZGVzdGluYXRpb25Gb3JtYXQpIHsKICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBudW1CeXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAogICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEgYXVkaW9fZm9ybWF0X3Qgc291cmNlID0gJXUsIGRlc3QgPSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgfQogICAgICAgICBkZXN0aW5hdGlvbiArPSBudW1CeXRlczsKQEAgLTIwOCwxNyArMjEwLDEyIEBACiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1dyaXR0ZW4oKSB7Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmU7Ci0gICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlID0gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKLSAgICB9Ci0gICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpCisgICAgICAgICAgICA/IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKQorICAgICAgICAgICAgOiBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgogICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwotICAgIC8vQUxPR0QoImdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAotICAgIC8vICAgICAgKGxvbmcgbG9uZyltTGFzdEZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBtTGFzdEZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTI1Niw3ICsyNTMsOCBAQAogICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1heWJlQ2FsbERhdGFDYWxsYmFjayhtQ2FsbGJhY2tCdWZmZXIsIG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR0QoImNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIpOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDc5NWJhMmMuLmUxNDQzZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQzLDkgKzQzLDE3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgcmVzdWx0ID0gbUZsb3dHcmFwaC5jb25maWd1cmUoZ2V0Rm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CiAgICAgICAgIC8vIFNhbXBsZSByYXRlIGlzIGNvbnN0cmFpbmVkIHRvIGNvbW1vbiB2YWx1ZXMgYnkgbm93IGFuZCBzaG91bGQgbm90IG92ZXJmbG93LgogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyA9IGtSYW1wTVNlYyAqIGdldFNhbXBsZVJhdGUoKSAvIEFBVURJT19NSUxMSVNfUEVSX1NFQ09ORDsKLSAgICAgICAgbVZvbHVtZVJhbXAuc2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICAgICAgbUZsb3dHcmFwaC5zZXRSYW1wTGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTYzLDcgKzcxLDcgQEAKIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnBhdXNlU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIApAQCAtMjE2LDIyICsyMjQsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICAvLyBEYXRhIGNvbnZlcnNpb24uCi0gICAgICAgICAgICBmbG9hdCBsZXZlbEZyb207Ci0gICAgICAgICAgICBmbG9hdCBsZXZlbFRvOwotICAgICAgICAgICAgbVZvbHVtZVJhbXAubmV4dFNlZ21lbnQoZnJhbWVzVG9Xcml0ZSwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwogCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIHNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilieXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBkZXN0aW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwotCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwgbGV2ZWxUbyk7CisgICAgICAgICAgICBtRmxvd0dyYXBoLnByb2Nlc3MoKHZvaWQgKilieXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlKTsKIAogICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKQEAgLTI0NiwyNyArMjQyLDE3IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKQotewotICAgIGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1JlYWRIYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICB9Ci0gICAgaW50NjRfdCBmcmFtZXNSZWFkID0gZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCi0gICAgaWYgKGZyYW1lc1JlYWQgPCBtTGFzdEZyYW1lc1JlYWQpIHsKLSAgICAgICAgZnJhbWVzUmVhZCA9IG1MYXN0RnJhbWVzUmVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkOwotICAgIH0KLSAgICByZXR1cm4gZnJhbWVzUmVhZDsKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgIG1MYXN0RnJhbWVzUmVhZCA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzUmVhZCwgZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKKyAgICByZXR1cm4gbUxhc3RGcmFtZXNSZWFkOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CkBAIC0yOTcsNyArMjgzLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTMsNiArMzAwLDYgQEAKICAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOwogICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCiAgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOworICAgIG1GbG93R3JhcGguc2V0VGFyZ2V0Vm9sdW1lKGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCA5NzdhOTA5Li5jYWIyOTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7CkBAIC05Myw3ICs5NCw3IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgQUF1ZGlvRmxvd0dyYXBoICAgICAgICAgIG1GbG93R3JhcGg7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCmluZGV4IDk1YjUyYmUuLjc0N2QwZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcApAQCAtNjAsMTAgKzYwLDE0IEBACiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAotYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7Citib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNTdGFydGluZygpIGNvbnN0IHsKICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1NUQVJUSU5HOwogfQogCitib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNSdW5uaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CiAvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCiAvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKaW5kZXggNzE4MjM3Ni4uNDZjYTQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKQEAgLTM2LDcgKzM2LDE1IEBACiAgICAgdm9pZCBzdGFydChpbnQ2NF90IG5hbm9UaW1lKTsKICAgICB2b2lkIHN0b3AoaW50NjRfdCBuYW5vVGltZSk7CiAKLSAgICBib29sIGlzU3RhcnRpbmcoKTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHN0YXJ0aW5nIHVwCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0aW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHJ1bm5pbmcgYW5kIHByb2R1Y2luZyB2YWxpZCByZXN1bHRzCisgICAgICovCisgICAgYm9vbCBpc1J1bm5pbmcoKSBjb25zdDsKIAogICAgIHZvaWQgcHJvY2Vzc1RpbWVzdGFtcChpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkZjBkYjc5Li4wZDcxZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTE0NiwxNCArMTQ2LDE0IEBACiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoY2hhbm5lbENvdW50KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTE2Nyw3ICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoZm9ybWF0KTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgZXZlcnl3aGVyZSBpbnRlcm5hbGx5LgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGludGVybmFsRm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGZvcm1hdCk7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIzOSw3ICsyNDEsNyBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CiAgICAgLy8gUGxlYXNlIGxlYXZlIHRoZXNlIGxvZ3MgYmVjYXVzZSB0aGV5IGFyZSB2ZXJ5IGhlbHBmdWwgd2hlbiBkZWJ1Z2dpbmcuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXyk7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gQ09NTU9OX0dFVF9GUk9NX0JVSUxERVJfT1JfUkVUVVJOKHN0cmVhbVB0cik7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0cmVhbUJ1aWxkZXItPmJ1aWxkKCZhdWRpb1N0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHJldHVybnMgJWQgPSAlcyBmb3IgKCVwKSAtLS0tLS0tLS0tLS0tLS0tIiwKQEAgLTI2Nyw3ICsyNjksNyBAQAogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zYWZlQ2xvc2UoKTsKICAgICAgICAgLy8gQ2xvc2Ugd2lsbCBvbmx5IGZhaWwgaWYgY2FsbGVkIGlsbGVnYWxseSwgZm9yIGV4YW1wbGUsIGZyb20gYSBjYWxsYmFjay4KQEAgLTI4Miw3ICsyODQsNyBAQAogICAgIC8vIFdlJ3JlIHBvdGVudGlhbGx5IGZyZWVpbmcgYHN0cmVhbWAgYWJvdmUsIHNvIGl0cyB1c2UgaGVyZSBtYWtlcyBzb21lCiAgICAgLy8gc3RhdGljIGFuYWx5c2lzIHRvb2xzIHVuaGFwcHkuIENhc3RpbmcgdG8gdWludHB0cl90IGhlbHBzIGFzc3VyZQogICAgIC8vIHNhaWQgdG9vbHMgdGhhdCB3ZSdyZSBub3QgZG9pbmcgYW55dGhpbmcgYmFkIGhlcmUuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLAorICAgIEFMT0dEKCIlcyglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywKICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oc3RyZWFtKSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjkwLDMxICsyOTIsMzEgQEAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKKyAgICBBTE9HRCgiJXMoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0sIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1QYXVzZSgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCVwKSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnNhZmVGbHVzaCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCglcCkiLCBzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdG9wRnJvbUFwcCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLApAQCAtNDA4LDcgKzQxMCw5IEBACiBBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxseS4KKyAgICBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBkNTY3MDFiLi44OGRhNTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC00OCw2ICs0OCwyMCBAQAogICAgIG1JbnB1dFByZXNldCAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CiB9CiAKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQsIGF1ZGlvX2Zvcm1hdF90ID0gMHglMDh4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZXNQZXJGcmFtZSA8IFNBTVBMRVNfUEVSX0ZSQU1FX01JTiB8fCBtU2FtcGxlc1BlckZyYW1lID4gU0FNUExFU19QRVJfRlJBTUVfTUFYKSkgewpAQCAtNzksMTYgKzkzLDggQEAKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAobUF1ZGlvRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgLy8gYnJlYWs7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBpc0Zvcm1hdFZhbGlkIChtQXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7CkBAIC0xNTIsNiArMTU4LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBwcmVzZXQgbm90IHZhbGlkID0gJWQiLCBtSW5wdXRQcmVzZXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggY2U1ZGFjZC4uNmJlYjRiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BdWRpb0Zvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKICAgICB9CiAKQEAgLTEyMCw4ICsxMjAsMTEgQEAKICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ5dGVzIHBlciBmcmFtZSBvZiBnZXRGb3JtYXQoKQorICAgICAqLwogICAgIGludDMyX3QgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXRGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksNyArMTQyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICBtRGlyZWN0aW9uICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMzU4MDIxYi4uZTM5YTA3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC0zNyw3ICszNyw2IEBACiB9CiAKIEF1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7Ci0gICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtMTIwLDIxICsxMTksMjkgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdGFydCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RhcnQoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworCiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICByZXR1cm4gcmVxdWVzdFN0YXJ0KCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFN0YXJ0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RhcnQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlUGF1c2UoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVBhdXNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIGlmICghaXNQYXVzZVN1cHBvcnRlZCgpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMTcwLDcgKzE3NywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAotICAgIHJldHVybiByZXF1ZXN0UGF1c2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFBhdXNlKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlRmx1c2goKSB7CkBAIC0xOTMsMTIgKzIwNSwzMSBAQAogICAgIHJldHVybiByZXF1ZXN0Rmx1c2goKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RvcEZyb21DYWxsYmFjaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQXBwKCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewotICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBzdG9wcGVkIGZyb20gYSBjYWxsYmFjayEiKTsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgc3RvcHBlZCBieSBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayEiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2FmZVN0b3AoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdG9wKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CiAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgLy8gUHJvY2VlZCB3aXRoIHN0b3BwaW5nLgpAQCAtMjI1LDcgKzI1Niw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coInJlcXVlc3RTdG9wKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQpAQCAtMzUwLDIxICszODEsMzMgQEAKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyBfX3VudXNlZCkKIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKICAgICAgICAgQUxPR0UoImpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAvLyBJZiB0aGUgY2FsbGJhY2sgaXMgc3RvcHBpbmcgdGhlIHN0cmVhbSBiZWNhdXNlIHRoZSBhcHAgcGFzc2VkIGJhY2sgU1RPUAorICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBqb2luKCkuIFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBhYm91dCB0byBleGl0LgorICAgIGlmIChwdGhyZWFkX3NlbGYoKSAhPSBtVGhyZWFkKSB7CisgICAgICAgIC8vIENhbGxlZCBmcm9tIGFuIGFwcCB0aHJlYWQuIE5vdCB0aGUgY2FsbGJhY2suCiAjaWYgMAotICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQotICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOwotICAgIGludCBlcnIgPSBwdGhyZWFkX3RpbWVkam9pbl9ucChtVGhyZWFkLCByZXR1cm5BcmcsICZhYnN0aW1lKTsKKyAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZXF1aXZhbGVudCBvZiBwdGhyZWFkX3RpbWVkam9pbl9ucCgpCisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOworICAgICAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7CiAjZWxzZQotICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgcmV0dXJuQXJnKTsKKyAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCByZXR1cm5BcmcpOwogI2VuZGlmCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIHB0aHJlYWRfam9pbigpIHJldHVybnMgZXJyID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgZmFsc2Ugc28gdGhhdCB0aGUgY2FsbGJhY2sgdGhyZWFkIGNhbiBiZSBjcmVhdGVkCisgICAgLy8gd2hlbiB0aGUgc3RyZWFtIGlzIHJlc3RhcnRlZC4KICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGVyciA/IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnJubykgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OworICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyByZXN1bHQgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OwogfQogCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6bWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggMzFiODk1Yy4uNDY5NTFmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTUxLDIxICs1MSw2IEBACiAKICAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbSgpOwogCi0gICAgLyoqCi0gICAgICogTG9jayBhIG11dGV4IGFuZCBtYWtlIHN1cmUgd2UgYXJlIG5vdCBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiByZXF1ZXN0U3RhcnQoKTsKLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0YXJ0KCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVBhdXNlKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKLQotICAgIC8vID09PT09PT09PT09IEJlZ2luIEFCU1RSQUNUIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiBwcm90ZWN0ZWQ6CiAKICAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCkBAIC03NCw3ICs1OSw3IEBACiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpZiBjdXJyZW50bHkgbGVnYWwuCisgICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpcyBjdXJyZW50bHkgbGVnYWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IHBvaW50ZXIgdG8gcmV0dXJuIGNvZGUKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgT0sgdG8gY29udGludWUsIGlmIGZhbHNlIHRoZW4gcmV0dXJuIHJlc3VsdApAQCAtMTkyLDcgKzE3Nyw3IEBACiAgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgewogICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICB9CiAKQEAgLTI0OSwyMSArMjM0LDE0IEBACiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldEZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1Gb3JtYXQpOworICAgICAgICByZXR1cm4gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZUZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldERldmljZUZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXREZXZpY2VGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSA9IDA7CkBAIC0zNjMsMzMgKzM0MSwyOCBAQAogICAgICAgICBtUGxheWVyQmFzZS0+dW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKICAgICB9CiAKLSAgICAvLyBQYXNzIHN0YXJ0IHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RhcnQoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdGFydCgpOwotICAgICAgICAvLyBQYXNzIGFhdWRpb19yZXN1bHRfdCBhcm91bmQgdGhlIFBsYXllckJhc2UgaW50ZXJmYWNlLCB3aGljaCB1c2VzIHN0YXR1c19fdC4KLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCk7CiAKLSAgICAvLyBQYXNzIHBhdXNlIHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5wYXVzZSgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKTsKIAotICAgIC8vIFBhc3Mgc3RvcCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3AoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdG9wKCk7Ci0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gYXBwIGNhbGxzIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpOworICAgICAqIEl0IHByZXZlbnRzIGNhbGxzIGZyb20gYSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcEZyb21BcHAoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBhbiBhcHAgY2FsbGJhY2sgcmV0dXJucyBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKIAogcHJvdGVjdGVkOgogCi0gICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0uCi0gICAgLy8gQ2FsbGluZyB0aHJvdWdoIFBsYXllckJhc2UtPnN0YXJ0KCkgbm90aWZpZXMgdGhlIEF1ZGlvTWFuYWdlciBvZiB0aGUgcGxheWVyIHN0YXRlLgotICAgIC8vIFRoZSBBdWRpb01hbmFnZXIgYWxzbyBjYW4gc3RhcnQvc3RvcCBhIHN0cmVhbSBieSBjYWxsaW5nIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpLgotICAgIC8vIHN5c3RlbVN0YXJ0KCkgPT0+IG1QbGF5ZXJCYXNlLT5zdGFydCgpICAgbVBsYXllckJhc2UtPnBsYXllclN0YXJ0KCkgPT0+IHJlcXVlc3RTdGFydCgpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLSBBdWRpb01hbmFnZXIgLS0tLS0tLQorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtIHZvbHVtZS4KICAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CkBAIC00MTMsMjAgKzM4NiwxOSBAQAogCiAgICAgICAgIHZvaWQgY2xlYXJQYXJlbnRSZWZlcmVuY2UoKSB7IG1QYXJlbnQgPSBudWxscHRyOyB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0YXJ0IGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdGFydCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8vIG1QYXJlbnQgc2hvdWxkIE5PVCBiZSBudWxsLiBTbyBnbyBhaGVhZCBhbmQgY3Jhc2ggaWYgaXQgaXMuCi0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0YXJ0KCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gcGF1c2UgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVQYXVzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0b3AgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0b3AoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0b3AoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclNldFZvbHVtZSgpIG92ZXJyaWRlIHsKQEAgLTQ3OCwxOCArNDUwLDE4IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldERldmljZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JtYXQ7CiAgICAgfQogCkBAIC01NTUsNiArNTI3LDggQEAKIAogcHJpdmF0ZToKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOworCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CiAKICAgICBjb25zdCBhbmRyb2lkOjpzcDxNeVBsYXllckJhc2U+ICAgbVBsYXllckJhc2U7CkBAIC01NjUsNyArNTM5LDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIApAQCAtNTc3LDcgKzU1MSw3IEBACiAKICAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGZvcm1hdCBmcm9tIHRoZSBhcHAuCiAgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCiAgICAgLy8gY2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYjA5MjU4ZS4uZjUxMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjMsMzAgKzIzLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckluZGlyZWN0LmgiCiAjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtU3RvcmFnZShudWxscHRyKQotICAgICAgICAsIG1GcmFtZXNSZWFkQ291bnQoMCkKLSAgICAgICAgLCBtRnJhbWVzVW5kZXJydW5Db3VudCgwKQotICAgICAgICAsIG1VbmRlcnJ1bkNvdW50KDApCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKIHsKLSAgICAvLyBUT0RPIEhhbmRsZSBwb3NzaWJsZSBmYWlsdXJlcyB0byBhbGxvY2F0ZS4gTW92ZSBvdXQgb2YgY29uc3RydWN0b3I/Ci0gICAgbUZpZm8gPSBuZXcgRmlmb0NvbnRyb2xsZXIoY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVyPihjYXBhY2l0eUluRnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKICAgICBpbnQzMl90IGJ5dGVzUGVyQnVmZmVyID0gYnl0ZXNQZXJGcmFtZSAqIGNhcGFjaXR5SW5GcmFtZXM7CiAgICAgbVN0b3JhZ2UgPSBuZXcgdWludDhfdFtieXRlc1BlckJ1ZmZlcl07CiAgICAgbVN0b3JhZ2VPd25lZCA9IHRydWU7Ci0gICAgQUxPR1YoImNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKLSAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICBBTE9HVigiJXMoKSBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKQEAgLTU1LDE0ICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgd3JpdGVJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogIGRhdGFTdG9yYWdlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQogICAgICAgICAsIG1TdG9yYWdlKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGF0YVN0b3JhZ2VBZGRyZXNzKSkKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQogewotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVySW5kaXJlY3QoY2FwYWNpdHlJbkZyYW1lcywKKyAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdD4oY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbmRleEFkZHJlc3MpOwpAQCAtNzMsMTAgKzY1LDggQEAKICAgICBpZiAobVN0b3JhZ2VPd25lZCkgewogICAgICAgICBkZWxldGVbXSBtU3RvcmFnZTsKICAgICB9Ci0gICAgZGVsZXRlIG1GaWZvOwogfQogCi0KIGludDMyX3QgRmlmb0J1ZmZlcjo6Y29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpIHsKICAgICByZXR1cm4gZnJhbWVzICogbUJ5dGVzUGVyRnJhbWU7CiB9CkBAIC04NywxMSArNzcsMTIgQEAKICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9IG51bGxwdHI7CiAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IDA7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvLT5nZXRDYXBhY2l0eSgpOwogICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwotICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gbUZyYW1lQ2FwYWNpdHkpIHsKKyAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IGNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gY2FwYWNpdHkgLSBzdGFydEluZGV4OwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CkBAIC0xMDcsNyArOTgsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewogICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGJlIG92ZXJmdWxsIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTExNSw3ICsxMDcsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlmby0+Z2V0Q2FwYWNpdHkoKSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFdyaXRlSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTE4MywyMyArMTc2LDYgQEAKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAotZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpyZWFkTm93KHZvaWQgKmJ1ZmZlciwgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKLSAgICBtTGFzdFJlYWRTaXplID0gbnVtRnJhbWVzOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1JlYWQgPSByZWFkKGJ1ZmZlciwgbnVtRnJhbWVzKTsKLSAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7Ci0gICAgbUZyYW1lc1JlYWRDb3VudCArPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNVbmRlcnJ1bkNvdW50ICs9IGZyYW1lc0xlZnQ7Ci0gICAgLy8gWmVybyBvdXQgYW55IHNhbXBsZXMgd2UgY291bGQgbm90IHNldC4KLSAgICBpZiAoZnJhbWVzTGVmdCA+IDApIHsKLSAgICAgICAgbVVuZGVycnVuQ291bnQrKzsKLSAgICAgICAgaW50MzJfdCBieXRlc1RvWmVybyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGZyYW1lc0xlZnQpOwotICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc1RvWmVybyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7Ci19Ci0KIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0VGhyZXNob2xkKCkgewogICAgIHJldHVybiBtRmlmby0+Z2V0VGhyZXNob2xkKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCBmNWE5ZTI3Li4wZDE4OGM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgRklGT19GSUZPX0JVRkZFUl9ICiAjZGVmaW5lIEZJRk9fRklGT19CVUZGRVJfSAogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCkBAIC03NywyNCArNzgsMTIgQEAKICAgICAgKi8KICAgICBmaWZvX2ZyYW1lc190IGdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpOwogCi0gICAgLyoqCi0gICAgICogQ29weSBkYXRhIGZyb20gdGhlIEZJRk8gaW50byB0aGUgYnVmZmVyLgotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGZpZm9fZnJhbWVzX3QgcmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKTsKLQotICAgIGludDY0X3QgZ2V0TmV4dFJlYWRUaW1lKGludDMyX3QgZnJhbWVSYXRlKTsKLQotICAgIGludDMyX3QgZ2V0VW5kZXJydW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1VbmRlcnJ1bkNvdW50OyB9Ci0KLSAgICBGaWZvQ29udHJvbGxlckJhc2UgKmdldEZpZm9Db250cm9sbGVyQmFzZSgpIHsgcmV0dXJuIG1GaWZvOyB9Ci0KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSB7CiAgICAgICAgIHJldHVybiBtQnl0ZXNQZXJGcmFtZTsKICAgICB9CiAKKyAgICAvLyBQcm94eSBtZXRob2RzIGZvciB0aGUgaW50ZXJuYWwgRmlmb0NvbnRyb2xsZXIKKwogICAgIGZpZm9fY291bnRlcl90IGdldFJlYWRDb3VudGVyKCkgewogICAgICAgICByZXR1cm4gbUZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgfQpAQCAtMTExLDYgKzEwMCwyMiBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIHZvaWQgYWR2YW5jZVJlYWRJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBtRmlmby0+YWR2YW5jZVJlYWRJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVdyaXRlSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VXcml0ZUluZGV4KG51bUZyYW1lcyk7CisgICAgfQorCisgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1c2VkLgogICAgICAqLwpAQCAtMTIxLDE1ICsxMjYsMTIgQEAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUsIGludDMyX3Qgc3RhcnRJbmRleCk7CiAKLSAgICBjb25zdCBmaWZvX2ZyYW1lc190IG1GcmFtZUNhcGFjaXR5OwotICAgIGNvbnN0IGludDMyX3QgbUJ5dGVzUGVyRnJhbWU7Ci0gICAgdWludDhfdCAqbVN0b3JhZ2U7Ci0gICAgYm9vbCBtU3RvcmFnZU93bmVkOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/Ci0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICptRmlmbzsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzUmVhZENvdW50OwotICAgIGZpZm9fY291bnRlcl90IG1GcmFtZXNVbmRlcnJ1bkNvdW50OwotICAgIGludDMyX3QgbVVuZGVycnVuQ291bnQ7IC8vIG5lZWQ/IGp1c3QgdXNlIGZyYW1lcwotICAgIGludDMyX3QgbUxhc3RSZWFkU2l6ZTsKKyAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lOworICAgIC8vIFdlIGRvIG5vdCB1c2UgYSBzdGQ6OnVuaXF1ZV9wdHIgZm9yIG1TdG9yYWdlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBwb2ludGVyIHRvCisgICAgLy8gbWVtb3J5IHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgY2Fubm90IGJlIGRlbGV0ZWQgdHJpdmlhbGx5LgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqbVN0b3JhZ2UgPSBudWxscHRyOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VPd25lZCA9IGZhbHNlOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZm9Db250cm9sbGVyQmFzZT4gbUZpZm97fTsKIH07CiAKIH0gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggNzlkOThhMS4uMDU3YTk0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIEZpZm9Db250cm9sbGVyIDogcHVibGljIEZpZm9Db250cm9sbGVyQmFzZQogewogcHVibGljOgotICAgIEZpZm9Db250cm9sbGVyKGZpZm9fY291bnRlcl90IGJ1ZmZlclNpemUsIGZpZm9fY291bnRlcl90IHRocmVzaG9sZCkKKyAgICBGaWZvQ29udHJvbGxlcihmaWZvX2ZyYW1lc190IGJ1ZmZlclNpemUsIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKQogICAgIDogRmlmb0NvbnRyb2xsZXJCYXNlKGJ1ZmZlclNpemUsIHRocmVzaG9sZCkKICAgICAsIG1SZWFkQ291bnRlcigwKQogICAgICwgbVdyaXRlQ291bnRlcigwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAppbmRleCA1MWE4ZTM0Li42NmUyNDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcApAQCAtNTksNSArNTksMTAgQEAKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OnNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkgeworICAgIGlmICh0aHJlc2hvbGQgPiBtQ2FwYWNpdHkpIHsKKyAgICAgICAgdGhyZXNob2xkID0gbUNhcGFjaXR5OworICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgMCkgeworICAgICAgICB0aHJlc2hvbGQgPSAwOworICAgIH0KICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCmluZGV4IDY0YWY3NzcuLjFlZGI4YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKQEAgLTEwMiw2ICsxMDIsOSBAQAogICAgIC8qKgogICAgICAqIFlvdSBjYW4gcmVxdWVzdCB0aGF0IHRoZSBidWZmZXIgbm90IGJlIGZpbGxlZCBhYm92ZSBhIG1heGltdW0KICAgICAgKiBudW1iZXIgb2YgZnJhbWVzLgorICAgICAqCisgICAgICogVGhlIHRocmVzaG9sZCB3aWxsIGJlIGNsaXBwZWQgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCiAgICAgICogQHBhcmFtIHRocmVzaG9sZCBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAgICovCiAgICAgdm9pZCBzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2N2ZkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKKyAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCisgICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgeworICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKK30KKworQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7CisgICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7CisgICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKK30KKwordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQorICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCisgICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKK2Zsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7CisgICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEF1ZGlvUHJvY2Vzc29yQmFzZS5oCisgKgorICogQXVkaW8gcHJvY2Vzc2luZyBub2RlIGFuZCBwb3J0cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2ltcGxlIGRhdGEgZmxvdyBncmFwaC4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gVE9ETyBjb25zaWRlciBwdWJsaXNoaW5nIGFsbCBoZWFkZXIgZmlsZXMgdW5kZXIgImluY2x1ZGUvbGliYWF1ZGlvL0Zsb3dHcmFwaC5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgQXVkaW9GbG9hdEJsb2NrUG9ydCBpcyBjcmVhdGVkLgorLy8gSWYgaXQgaXMgdG9vIHNtYWxsIHRoZW4gd2Ugd2lsbCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkIGZyb20gc3dpdGNoaW5nIGJldHdlZW4gbm9kZXMuCisvLyBJZiBpdCBpcyB0b28gaGlnaCB0aGVuIHdlIHdpbGwgdGhyYXNoIHRoZSBjYWNoZXMuCitjb25zdGV4cHIgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUHJvY2Vzc29yQmFzZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gY3VzdG9tIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGZyYW1lUG9zaXRpb24gaXMgYXQgb3IgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgcG9zaXRpb24gdGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgaW50NjRfdCAgbUxhc3RGcmFtZVBvc2l0aW9uID0gLTE7IC8vIFN0YXJ0IGF0IC0xIHNvIHRoYXQgdGhlIGZpcnN0IHB1bGwgd29ya3MuCisKK3ByaXZhdGU6CisgICAgaW50MzJfdCAgbUZyYW1lc1ZhbGlkID0gMDsgLy8gbnVtIHZhbGlkIGZyYW1lcyBpbiB0aGUgYmxvY2sKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICovCitjbGFzcyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIC8vIFBvcnRzIGFyZSBvZnRlbiBkZWNsYXJlZCBwdWJsaWMuIFNvIGxldCdzIG1ha2UgdGhlbSBub24tY29weWFibGUuCisgICAgQXVkaW9Qb3J0KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworICAgIEF1ZGlvUG9ydCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworCisgICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogVGhpcyBwb3J0IGNvbnRhaW5zIGEgZmxvYXQgdHlwZSBidWZmZXIuCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCbG9jayAqIHNhbXBsZXNQZXJGcmFtZSkuCisgKi8KK2NsYXNzIEF1ZGlvRmxvYXRCbG9ja1BvcnQgIDogcHVibGljIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jayA9IGtEZWZhdWx0QmxvY2tTaXplCisgICAgICAgICAgICAgICAgKTsKKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRCbG9ja1BvcnQoKTsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQmxvY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQmxvY2s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ1ZmZlciBpbnRlcm5hbCB0byB0aGUgcG9ydCBvciBmcm9tIGEgY29ubmVjdGVkIHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGZsb2F0ICpnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVCbG9jazsKKyAgICB9CisKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1GcmFtZXNQZXJCbG9jayA9IDE7CisgICAgZmxvYXQgICAgICAgICAgICptU2FtcGxlQmxvY2sgPSBudWxscHRyOyAvLyBhbGxvY2F0ZWQgaW4gY29uc3RydWN0b3IKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGUgcmVzdWx0cyBvZiBhIG1vZHVsZSBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXIgb2YgdGhlIG91dHB1dCBwb3J0cy4KKyAgKi8KK2NsYXNzIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRPdXRwdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwYXJlbnQgbW9kdWxlJ3Mgb25Qcm9jZXNzKCkgbWV0aG9kLgorICAgICAqIFRoYXQgbWF5IHB1bGwgZGF0YSBmcm9tIGl0cyBpbnB1dHMgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICogcHJvY2VzcyB0aGUgZW50aXJlIGdyYXBoLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwdWxsZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIElmIHlvdSBjb25uZWN0IGEgc2Vjb25kIG91dHB1dCBwb3J0IHRvIGFuIGlucHV0IHBvcnQKKyAgICAgKiB0aGVuIGl0IG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4gRG8gbm90IG1vZGlmeSB0aGUgZ3JhcGggdG9wb2xvZ3kgZm9ybSBhbm90aGVyIHRocmVhZCB3aGlsZSBydW5uaW5nLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdElucHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0SW5wdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSWYgY29ubmVjdGVkIHRvIGFuIG91dHB1dCBwb3J0IHRoZW4gdGhpcyB3aWxsIHJldHVybgorICAgICAqIHRoYXQgb3V0cHV0IHBvcnRzIGJ1ZmZlcnMuCisgICAgICogSWYgbm90IGNvbm5lY3RlZCB0aGVuIGl0IHJldHVybnMgdGhlIGlucHV0IHBvcnRzIG93biBidWZmZXIKKyAgICAgKiB3aGljaCBjYW4gYmUgbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkuCisgICAgICovCisgICAgZmxvYXQgKmdldEJsb2NrKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBQdWxsIGRhdGEgZnJvbSBhbnkgb3V0cHV0IHBvcnQgdGhhdCBpcyBjb25uZWN0ZWQuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QmxvY2tTaXplICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGZsb2F0ICpidWZmZXIgPSBnZXRCbG9jaygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZsb2F0czsgaSsrKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIG91dHB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQobUNvbm5lY3RlZCA9PSBwb3J0KTsKKyAgICAgICAgKHZvaWQpIHBvcnQ7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICptQ29ubmVjdGVkID0gbnVsbHB0cjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NpbmsgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NpbmsoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworCisgICAgLyoqCisgICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmcmFtZVBvc2l0aW9uOworICAgICAgICAodm9pZCkgbnVtRnJhbWVzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgcHVsbChpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRnJhbWVQb3NpdGlvbiA9IDA7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5YzIyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK0NsaXBUb1JhbmdlOjpDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgQ2xpcFRvUmFuZ2U6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworCisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzdGQ6Om1pbihtTWF4aW11bSwgc3RkOjptYXgobU1pbmltdW0sICppbnB1dEJ1ZmZlcisrKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCisvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOworCitjbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IENsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfkNsaXBUb1JhbmdlKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1pbmltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NaW5pbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1pbmltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWluaW11bTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1heGltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NYXhpbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1heGltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4aW11bTsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKyAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CisgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIk1vbm9Ub011bHRpQ29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK01vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgMSkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6fk1vbm9Ub011bHRpQ29udmVydGVyKCkgeyB9CisKK2ludDMyX3QgTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworCisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgLy8gVE9ETyBtYXliZSBtb3ZlIHRvIGF1ZGlvX3V0aWwgYXMgYXVkaW9fbW9ub190b19tdWx0aSgpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1Byb2Nlc3M7IGkrKykgeworICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQorICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJSYW1wTGluZWFyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1JhbXBMaW5lYXI6OlJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKKyAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgeworICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKK30KKworZmxvYXQgUmFtcExpbmVhcjo6aW50ZXJwb2xhdGVDdXJyZW50KCkgeworICAgIHJldHVybiBtTGV2ZWxUbyAtIChtUmVtYWluaW5nICogbVNjYWxlcik7Cit9CisKK2ludDMyX3QgUmFtcExpbmVhcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmbG9hdCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7CisgICAgICAgIC8vIFN0YXJ0IG5ldyByYW1wLiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgorICAgICAgICBtTGV2ZWxGcm9tID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OworICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOworICAgICAgICBBTE9HVigiJXMoKSBtTGV2ZWxGcm9tID0gJWYsIG1MZXZlbFRvID0gJWYsIG1SZW1haW5pbmcgPSAlZCwgbVNjYWxlciA9ICVmIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1MZXZlbEZyb20sIG1MZXZlbFRvLCBtUmVtYWluaW5nLCBtU2NhbGVyKTsKKyAgICAgICAgbVNjYWxlciA9IChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbUxlbmd0aEluRnJhbWVzOyAvLyBmb3IgaW50ZXJwb2xhdGlvbgorICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIGlmIChtUmVtYWluaW5nID4gMCkgeyAvLyBSYW1waW5nPyBUaGlzIGRvZXNuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCisgICAgICAgIGludDMyX3QgZnJhbWVzVG9SYW1wID0gc3RkOjptaW4oZnJhbWVzTGVmdCwgbVJlbWFpbmluZyk7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9SYW1wOworICAgICAgICB3aGlsZSAoZnJhbWVzVG9SYW1wID4gMCkgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudExldmVsID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBjdXJyZW50TGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVtYWluaW5nLS07CisgICAgICAgICAgICBmcmFtZXNUb1JhbXAtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgYW55IGZyYW1lcyBhZnRlciB0aGUgcmFtcC4KKyAgICBpbnQzMl90IHNhbXBsZXNMZWZ0ID0gZnJhbWVzTGVmdCAqIGNoYW5uZWxDb3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZXNMZWZ0OyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzhmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorI2RlZmluZSBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuZXh0IHJhbXAuCisgICAgICogQ2FsbGluZyB0aGlzIGRvZXMgbm90IGFmZmVjdCBhIHJhbXAgdGhhdCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKTsKKworICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtYXkgYmUgc2FmZWx5IGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KTsKKworICAgIGZsb2F0IGdldFRhcmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCisgICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKi8KKyAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgeworICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7CisgICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisKKyAgICBmbG9hdCBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgbVRhcmdldDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwLjBmIC8gMTAwLjBmIDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIejsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1SZW1haW5pbmcgICAgICAgPSAwOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbVNjYWxlciAgICAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rRmxvYXQ6OlNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU2lua0Zsb2F0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IChmbG9hdCAqKSBkYXRhOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgbWVtY3B5KGZsb2F0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc1YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtJMTY6OlNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTE2OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHNob3J0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc2hvcnREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIHNpZ25hbCArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKnNpZ25hbCsrICogMzI3NjguMGYpOworICAgICAgICAgICAgKnNob3J0RGF0YSsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTE2IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworCitTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kyNDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHVpbnQ4X3QgKmJ5dGVEYXRhID0gKHVpbnQ4X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX3AyNF9mcm9tX2Zsb2F0KGJ5dGVEYXRhLCBmbG9hdERhdGEsIG51bVNhbXBsZXMpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisgICAgICAgIGJ5dGVEYXRhICs9IG51bVNhbXBsZXMgKiBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWF4ID0gMHgwMDdGRkZGRjsKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWluID0gMHhGRjgwMDAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmZsb2F0RGF0YSsrICogMHgwMDgwMDAwMCk7CisgICAgICAgICAgICBuID0gc3RkOjptaW4oa0kyNFBhY2tlZE1heCwgc3RkOjptYXgoa0kyNFBhY2tlZE1pbiwgbikpOyAvLyBjbGlwCisgICAgICAgICAgICAvLyBXcml0ZSBhcyBhIHBhY2tlZCAyNC1iaXQgaW50ZWdlciBpbiBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIG47CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiA4KTsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDE2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YjUwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VGbG9hdDo6U291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CisgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworICAgIG1lbWNweShvdXRwdXRCdWZmZXIsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VGbG9hdCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2ZjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydEJhc2UgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1EYXRhKTsKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydERhdGEgPSAmc2hvcnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gKnNob3J0RGF0YSsrICogKDEuMGYgLyAzMjc2OCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTk4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLy8gQXNzZW1ibGUgdGhlIGRhdGEgYXNzdW1pbmcgTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgIGludDMyX3QgcGFkID0gYnl0ZURhdGFbMl07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzFdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVswXTsKKyAgICAgICAgcGFkIDw8PSA4OyAvLyBTaGlmdCB0byAzMiBiaXQgZGF0YSBzbyB0aGUgc2lnbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlRGF0YSArPSBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgICpmbG9hdERhdGErKyA9IHBhZCAqIHNjYWxlOyAvLyBzY2FsZSB0byByYW5nZSAtMS4wIHRvIDEuMAorICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggYTZiOWY1ZC4uMmVkYWI1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtNzgsOCArNzgsOSBAQAogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwotICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRvIHN0b3AgY2FsbGluZyB1cy4KLSAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiBBdWRpb0ZsaW5nZXIga2lsbGluZyB0aGUgc3RyZWFtLgorICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCisgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgorICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAKQEAgLTk1LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0b3BwaW5nIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewpAQCAtMTE1LDEwICsxMTYsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJlcXVlc3RlZCBzdG9wLCBmYWtlIGFuIGVycm9yIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSBBdWRpb0ZsaW5nZXIga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA0OTRlZGJjLi44ZTc4NTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTc3LDcgKzc3LDYgQEAKIAogICAgIHZpcnR1YWwgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpICA9IDA7CiAKLQogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gbUZyYW1lc1dyaXR0ZW4uZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDUwNWYyZWUuLjRhNjVmYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTU3LDYgKzU3LDkgQEAKIAogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9SZWNvcmQKIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRPRE8gU3VwcG9ydCBVTlNQRUNJRklFRCBpbiBBdWRpb1JlY29yZC4gRm9yIG5vdywgdXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKQEAgLTY2LDIzICs2OSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCk7CiAKIAotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoIChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fSU5QVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gTm8gZmxhZ3MuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIFByZXNlcnZlIGJlaGF2aW9yIG9mIEFQSSAyNgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAKICAgICAvLyBNYXliZSBjaGFuZ2UgZGV2aWNlIGZvcm1hdCB0byBnZXQgYSBGQVNUIHBhdGguCkBAIC05OSwxMiArMTA2LDEyIEBACiAgICAgLy8gV2UganVzdCBtYXkgbm90IGdldCBhIEZBU1QgdHJhY2suCiAgICAgLy8gQnV0IHdlIHdvdWxkbid0IGhhdmUgYW55d2F5IHdpdGhvdXQgdGhpcyBoYWNrLgogICAgIGNvbnN0ZXhwciBpbnQzMl90IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QgPSA0ODAwMDsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAogICAgICAgICAgICAgJiYgcGVyZk1vZGUgPT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKICAgICAgICAgICAgICYmIChzYW1wbGVzUGVyRnJhbWUgPD0gMikgLy8gRkFTVCBvbmx5IGZvciBtb25vIGFuZCBzdGVyZW8KICAgICAgICAgICAgICYmIChnZXRTYW1wbGVSYXRlKCkgPT0ga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdAogICAgICAgICAgICAgICAgIHx8IGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpKSB7Ci0gICAgICAgIHNldERldmljZUZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgICAgICBzZXREZXZpY2VGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAgICAgfQpAQCAtMTQxLDE0ICsxNDgsMTAgQEAKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwogCi0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwotCiAgICAgLy8gLS0tLS0tLS0tLS0gb3BlbiB0aGUgQXVkaW9SZWNvcmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gTWlnaHQgcmV0cnksIGJ1dCBuZXZlciBtb3JlIHRoYW4gb25jZS4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPQotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CiAKICAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lIC8vIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lIFRPRE8gZG9lcyBub3QgY29tcGlsZQpAQCAtMjE0LDggKzIxNyw4IEBACiAgICAgfQogCiAgICAgLy8gQWxsb2NhdGUgZm9ybWF0IGNvbnZlcnNpb24gYnVmZmVyIGlmIG5lZWRlZC4KLSAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKIAogICAgICAgICBpZiAoYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHRoZW4gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYW4gaW50ZXJuYWwgZmxvYXQKQEAgLTMyMywxNiArMzI2LDEzIEBACiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gc28gd2UgY2FuIGRldGVjdCB3aGVuIHRoZSB0cmFjayBpcyByZWNvcmRpbmcuCi0gICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmbVBvc2l0aW9uV2hlblN0YXJ0aW5nKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgIH0KIAotICAgIC8vIEVuYWJsZSBjYWxsYmFjayBiZWZvcmUgc3RhcnRpbmcgQXVkaW9UcmFjayB0byBhdm9pZCBzaHV0dGluZworICAgIC8vIEVuYWJsZSBjYWxsYmFjayBiZWZvcmUgc3RhcnRpbmcgQXVkaW9SZWNvcmQgdG8gYXZvaWQgc2h1dHRpbmcKICAgICAvLyBkb3duIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKKyAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7IC8vIHNlcnZpY2Ugd3JpdGVzIGZyYW1lcworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUmVjb3JkLT5zdGFydCgpOyAvLyByZXNldHMgcG9zaXRpb24gdG8gemVybwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfSBlbHNlIHsKQEAgLTM0NiwxMiArMzQ2LDEwIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihnZXRGcmFtZXNSZWFkKCkgLSBnZXRGcmFtZXNXcml0dGVuKCkpOyAvLyBUT0RPIHJldmlldwotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzUmVhZCgpKTsKKyAgICBtRnJhbWVzV3JpdHRlbi5jYXRjaFVwVG8oZ2V0RnJhbWVzUmVhZCgpKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMsIHNlcnZpY2UgcG9zaXRpb24gcmVzZXQgb24gZmx1c2gKLSAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIC8vIFBhc3MgZmFsc2UgdG8gcHJldmVudCBlcnJvckNhbGxiYWNrIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIGRpc2Nvbm5lY3QKICAgICAvLyB3aGVuIGFwcCBoYXMgYWxyZWFkeSByZXF1ZXN0ZWQgYSBzdG9wKCkuCiAgICAgcmV0dXJuIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoZmFsc2UpOwpAQCAtMzY1LDEwICszNjMsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAvLyBUT0RPIGFkZCBiZXR0ZXIgc3RhdGUgdmlzaWJpbGl0eSB0byBBdWRpb1JlY29yZAogICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgLy8gV2hlbiBzdGFydGluZywgdGhlIHBvc2l0aW9uIHdpbGwgYmVnaW4gYXQgemVybyBhbmQgdGhlbiBnbyBwb3NpdGl2ZS4KKyAgICAgICAgLy8gVGhlIHBvc2l0aW9uIGNhbiB3cmFwIGJ1dCBieSB0aGF0IHRpbWUgdGhlIHN0YXRlIHdpbGwgbm90IGJlIFNUQVJUSU5HLgogICAgICAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gIT0gbVBvc2l0aW9uV2hlblN0YXJ0aW5nKSB7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiAwKSB7CiAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDgzLDYgKzQ4Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV4dGVuZGVkVGltZXN0YW1wOworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+Z2V0VGltZXN0YW1wKCZleHRlbmRlZFRpbWVzdGFtcCk7CiAgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC00OTgsMTIgKzUwMSwxMiBAQAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgotICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CiAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIocG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNTA1Y2Q3Ny4uZmY5NWFlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTU5LDE4ICs1OSwyNSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9UcmFjawogICAgIC8vIFVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKIAotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CiAgICAgICAgICAgICAvLyBCeXBhc3MgdGhlIG5vcm1hbCBtaXhlciBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIEZBU1QgbWl4ZXIuCi0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgpAQCAtODEsNiArODgsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyBObyBmbGFncy4gVXNlIGEgbm9ybWFsIG1peGVyIGluIGZyb250IG9mIHRoZSBGQVNUIG1peGVyLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC04OCw5ICs5Niw5IEBACiAKICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpCiAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgIDogQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgIDogZ2V0Rm9ybWF0KCk7CiAKICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lLgogICAgIEF1ZGlvVHJhY2s6OmNhbGxiYWNrX3QgY2FsbGJhY2sgPSBudWxscHRyOwpAQCAtMTM1LDExICsxNDMsNiBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBzdGF0aWNfYXNzZXJ0KEFBVURJT19VTlNQRUNJRklFRCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLCAiU2Vzc2lvbiBJRHMgc2hvdWxkIG1hdGNoIik7Ci0KLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwpAQCAtMTc4LDEwICsxODEsOCBAQAogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKLSAgICBzZXRGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLSAgICBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKKyAgICBzZXREZXZpY2VGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKIAogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCkBAIC0yODcsNyArMjg4LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMDMsNyArMzA0LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdEZsdXNoKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMTcsMTMgKzMxOCwxMyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOyAvLyBUT0RPIHJldmlldwotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtRnJhbWVzUmVhZC5jYXRjaFVwVG8oZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uY2F0Y2hVcFRvKGdldEZyYW1lc1dyaXR0ZW4oKSk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHJlYWRzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBzdG9wCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAppbmRleCA0MGViYjc2Li43MjNjYmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcApAQCAtMzMsMzk1ICszMyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi0vLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgotLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCi0jZGVmaW5lIE1BWF9IRUFEUk9PTSAoMS40MTI1Mzc1NGYpCi0jZGVmaW5lIE1JTl9IRUFEUk9PTSAoMCAtIE1BWF9IRUFEUk9PTSkKLQotaW50MzJfdCBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgIGludDMyX3Qgc2l6ZSA9IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihmbG9hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gVE9ETyBleHBvc2UgYW5kIGNhbGwgY2xhbXAxNl9mcm9tX2Zsb2F0IGZ1bmN0aW9uIGluIHByaW1pdGl2ZXMuaAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTZfZnJvbV9mbG9hdChmbG9hdCBmKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMSA8PCAxNTsKLSAgICByZXR1cm4gKGludDE2X3QpIHJvdW5kZihmbWF4ZihmbWluZihmICogc2NhbGUsIHNjYWxlIC0gMS5mKSwgLXNjYWxlKSk7Ci19Ci0KLS8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotLy8gQnkgdXNpbmcgZm1pbiBhbmQgZm1heCB3ZSBhbHNvIHByb3RlY3QgYWdhaW5zdCBOYU4uCi1zdGF0aWMgZmxvYXQgY2xpcFRvTWluTWF4SGVhZHJvb20oZmxvYXQgaW5wdXQpIHsKLSAgICByZXR1cm4gZm1pbihNQVhfSEVBRFJPT00sIGZtYXgoTUlOX0hFQURST09NLCBpbnB1dCkpOwotfQotCi1zdGF0aWMgZmxvYXQgY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KGZsb2F0IHNhbXBsZSwgZmxvYXQgc2NhbGVyKSB7Ci0gICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgIC8vIFNjYWxlIGFuZCBjb252ZXJ0IHRvIGEgc2hvcnQuCi0gICAgZmxvYXQgZnZhbCA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KGZ2YWwpOwotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgLy8gZGl2aWRlIGJ5IG51bUZyYW1lcyBzbyB0aGF0IHdlIGFsbW9zdCByZWFjaCBhbXBsaXR1ZGUyCi0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgU0hPUlRfU0NBTEUgIDMyNzY4Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICAgICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAgKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29udmVydCBNb25vIFRvIFN0ZXJlbyBhdCB0aGUgc2FtZSB0aW1lIGFzIGNvbnZlcnRpbmcgZm9ybWF0Lgotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIxID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZsb2F0IHNjYWxlciA9IHNjYWxlcjEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ZyYW1lSW5kZXhdICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0KLSAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBmbG9hdCBzYW1wbGVTY2FsZWQgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCi0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydCgKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotCi0gICAgaWYgKHNvdXJjZS5jaGFubmVsQ291bnQgPT0gMSAmJiBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjb252ZXJ0TW9ub1RvU3RlcmVvKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBtb25vIHRvIHN0ZXJlbyBjb252ZXJzaW9uLiBPdGhlcndpc2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbgotICAgICAgICAvLyBtdXN0IG1hdGNoLgotICAgICAgICBhc3NlcnQoc291cmNlLmNoYW5uZWxDb3VudCA9PSBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQpOwotICAgICAgICBjb252ZXJ0Q2hhbm5lbHNNYXRjaChzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRNb25vVG9TdGVyZW8oCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydENoYW5uZWxzTWF0Y2goCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLSAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBzb3VyY2UuY2hhbm5lbENvdW50OwotCi0gICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXR1c190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpIHsKICAgICAvLyBUaGlzIGNvdmVycyB0aGUgY2FzZSBmb3IgQUFVRElPX09LIGFuZCBmb3IgcG9zaXRpdmUgcmVzdWx0cy4KICAgICBpZiAocmVzdWx0ID49IDApIHsKQEAgLTUxMyw2ICsxMjQsOSBAQAogYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQpIHsKICAgICBhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0OwogICAgIHN3aXRjaCAoYWF1ZGlvRm9ybWF0KSB7CisgICAgY2FzZSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOgorICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgogICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIGJyZWFrOwpAQCAtNTIwLDE2ICsxMzQsMTkgQEAKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYWF1ZGlvRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFhdWRpb0Zvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYW5kcm9pZEZvcm1hdDsKIH0KIAogYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0KSB7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0OwogICAgIHN3aXRjaCAoYW5kcm9pZEZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKICAgICAgICAgYnJlYWs7CkBAIC01MzgsNyArMTU1LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgICAgICBBTE9HRSgiQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0IDB4JTA4WCB1bnJlY29nbml6ZWQiLCBhbmRyb2lkRm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhbmRyb2lkRm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBhYXVkaW9Gb3JtYXQ7CkBAIC01OTMsNiArMjEwLDcgQEAKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKTsKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID09IEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID09IEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSk7CiAgICAgaWYgKHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgcHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggNGI5NzVlOC4uZGMyYjE5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtNDUsMTU2ICs0NSw2IEBACiBhdWRpb19zZXNzaW9uX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQoYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpOwogCiAvKioKLSAqIENvbnZlcnQgYW4gYXJyYXkgb2YgZmxvYXRzIHRvIGFuIGFycmF5IG9mIGludDE2X3QuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcyBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGFtcGxpdHVkZSBsZXZlbCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIHBhc3QgZW5kIG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tIC0xLjAgdG8gKzEuMC4KLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMKLSAqLwotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbik7Ci0KLS8qKgotICoKLSAqIENvbnZlcnQgaW50MTZfdCBhcnJheSB0byBmbG9hdCBhcnJheSByYW5naW5nIGZyb20gKy8tIGFtcGxpdHVkZS4KLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotCi0vKioKLSAqIENvbnZlcnQgZmxvYXRzIHRvIGludDE2X3QgYW5kIHNjYWxlIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgQUtBIG51bWJlciBvZiBjaGFubmVscwotICogQHBhcmFtIGFtcGxpdHVkZTEgbGV2ZWwgYXQgc3RhcnQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICogQHBhcmFtIGFtcGxpdHVkZTIgbGV2ZWwgYXQgZW5kIG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBmbG9hdHMgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIFNjYWxlIGludDE2X3QncyBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lCi0gKiBAcGFyYW0gYW1wbGl0dWRlMQotICogQHBhcmFtIGFtcGxpdHVkZTIKLSAqLwotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi1jbGFzcyBBQXVkaW9EYXRhQ29udmVydGVyIHsKLXB1YmxpYzoKLQotICAgIHN0cnVjdCBGb3JtYXR0ZWREYXRhIHsKLQotICAgICAgICBGb3JtYXR0ZWREYXRhKHZvaWQgKmRhdGEsIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICAgICAgOiBkYXRhKGRhdGEpCi0gICAgICAgICAgICAsIGZvcm1hdChmb3JtYXQpCi0gICAgICAgICAgICAsIGNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9Ci0KLSAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgICpkYXRhID0gbnVsbHB0cjsKLSAgICAgICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgICAgICBjb25zdCBpbnQzMl90ICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgfTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNb25vVG9TdGVyZW8oY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydENoYW5uZWxzTWF0Y2goY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLX07Ci0KLS8qKgogICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIHByZXZlbnQgbnVtZXJpYyBvdmVyZmxvdy4KICAqIFRoZSAqc2l6ZUluQnl0ZXMgd2lsbCBiZSBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAqCkBAIC0yMzQsMTIgKzg0LDYgQEAKICAqLwogYXVkaW9fc291cmNlX3QgQUF1ZGlvQ29udmVydF9pbnB1dFByZXNldFRvQXVkaW9Tb3VyY2UoYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCk7CiAKLS8qKgotICogQHJldHVybiB0aGUgc2l6ZSBvZiBhIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluIGJ5dGVzIG9yIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCi0gKi8KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotCi0KIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGJlIHJlcGxhY2VkIGJ5IFNldHRpbmdzIG9yIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdG9vbC4KIAogI2RlZmluZSBBQVVESU9fUFJPUF9NTUFQX1BPTElDWSAgICAgICAgICAgImFhdWRpby5tbWFwX3BvbGljeSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxNGJiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTGluZWFyUmFtcC5oIgotCi1ib29sIExpbmVhclJhbXA6OmlzUmFtcGluZygpIHsKLSAgICBmbG9hdCB0YXJnZXQgPSBtVGFyZ2V0LmxvYWQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7Ci0gICAgICAgIC8vIFVwZGF0ZSB0YXJnZXQuIENvbnRpbnVlIGZyb20gcHJldmlvdXMgbGV2ZWwuCi0gICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OwotICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVJlbWFpbmluZyA+IDA7Ci0gICAgfQotfQotCi1ib29sIExpbmVhclJhbXA6Om5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbykgewotICAgIGJvb2wgcmFtcGluZyA9IGlzUmFtcGluZygpOwotICAgICpsZXZlbEZyb20gPSBtTGV2ZWxGcm9tOwotICAgIGlmIChyYW1waW5nKSB7Ci0gICAgICAgIGZsb2F0IGxldmVsOwotICAgICAgICBpZiAoZnJhbWVzID49IG1SZW1haW5pbmcpIHsKLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsVG87Ci0gICAgICAgICAgICBtUmVtYWluaW5nID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEludGVycG9sYXRlIHRvIGEgcG9pbnQgYWxvbmcgdGhlIGZ1bGwgcmFtcC4KLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsRnJvbSArIChmcmFtZXMgKiAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1SZW1haW5pbmcpOwotICAgICAgICAgICAgbVJlbWFpbmluZyAtPSBmcmFtZXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOyAvLyBmb3IgbmV4dCByYW1wCi0gICAgICAgICpsZXZlbFRvID0gbGV2ZWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmxldmVsVG8gPSBtTGV2ZWxUbzsKLSAgICB9Ci0gICAgcmV0dXJuIHJhbXBpbmc7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWI4ZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQUFVRElPX0xJTkVBUl9SQU1QX0gKLSNkZWZpbmUgQUFVRElPX0xJTkVBUl9SQU1QX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyoqCi0gKiBHZW5lcmF0ZSBzZWdtZW50cyBhbG9uZyBhIGxpbmVhciByYW1wLgotICogVGhlIHJhbXAgdGFyZ2V0IGNhbiBiZSB1cGRhdGVkIGZyb20gYW5vdGhlciB0aHJlYWQuCi0gKiBXaGVuIHRoZSB0YXJnZXQgaXMgdXBkYXRlZCwgYSBuZXcgcmFtcCBpcyBzdGFydGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKgotICogVGhlIGZpcnN0IHJhbXAgc3RhcnRzIGF0IDAuMC4KLSAqCi0gKi8KLWNsYXNzIExpbmVhclJhbXAgewotcHVibGljOgotICAgIExpbmVhclJhbXAoKSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcykgewotICAgICAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRMZW5ndGhJbkZyYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1MZW5ndGhJbkZyYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0gICAgICogQHBhcmFtIHRhcmdldAotICAgICAqLwotICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0VGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbVRhcmdldC5sb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yY2UgdGhlIG5leHRTZWdtZW50IHRvIHN0YXJ0IGZyb20gdGhpcyBsZXZlbC4KLSAgICAgKgotICAgICAqIFdBUk5JTkc6IHRoaXMgY2FuIGNhdXNlIGEgZGlzY29udGludWl0eSBpZiBjYWxsZWQgd2hpbGUgdGhlIHJhbXAgaXMgYmVpbmcgdXNlZC4KLSAgICAgKiBPbmx5IGNhbGwgdGhpcyB3aGVuIHNldHRpbmcgdGhlIGluaXRpYWwgcmFtcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqLwotICAgIHZvaWQgZm9yY2VDdXJyZW50KGZsb2F0IGxldmVsKSB7Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsKLSAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsgLy8gZm9yY2VzIGEgcmFtcCBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0YXJnZXQKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRDdXJyZW50KCkgewotICAgICAgICByZXR1cm4gbUxldmVsRnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGV2ZWxzIGZvciBuZXh0IHJhbXAgc2VnbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgc2VnbWVudAotICAgICAqIEBwYXJhbSBsZXZlbEZyb20gcG9pbnRlciB0byBzdGFydGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcGFyYW0gbGV2ZWxUbyBwb2ludGVyIHRvIGVuZGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmFtcCBpcyBzdGlsbCBtb3ZpbmcgdG93YXJkcyB0aGUgdGFyZ2V0Ci0gICAgICovCi0gICAgYm9vbCBuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pOwotCi1wcml2YXRlOgotCi0gICAgYm9vbCBpc1JhbXBpbmcoKTsKLQotICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgIG1UYXJnZXQ7Ci0KLSAgICBpbnQzMl90IG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMCAvIDEwMDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIegotICAgIGludDMyX3QgbVJlbWFpbmluZyAgICAgICA9IDA7Ci0gICAgZmxvYXQgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKLSAgICBmbG9hdCAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOwotfTsKLQotCi0jZW5kaWYgLy9BQVVESU9fTElORUFSX1JBTVBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggNTgzM2VhYi4uNjNhZGQ0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC00MSwxMCArNDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIKKyAgICAgKiBhZHZhbmNlIHRoZSBjdXJyZW50IHZhbHVlIHRvIG1hdGNoIHRoZSBjb3VudGVyCiAgICAgICovCi0gICAgdm9pZCBzZXQoaW50NjRfdCBjb3VudGVyKSB7Ci0gICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgIHZvaWQgY2F0Y2hVcFRvKGludDY0X3QgY291bnRlcikgeworICAgICAgICBpZiAoKGNvdW50ZXIgLSBtQ291bnRlcjY0KSA+IDApIHsKKyAgICAgICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY4MTk0ZGIuLmNiMjQzYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxOCBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9jbG9ja19tb2RlbCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Nsb2NrX21vZGVsLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLApAQCAtMzQsMTMgKzQ2LDYgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3RfbGluZWFyX3JhbXAiLAotICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9saW5lYXJfcmFtcC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKLX0KLQotY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3Rfb3Blbl9wYXJhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9vcGVuX3BhcmFtcy5jcHAiXSwKQEAgLTE2NywzICsxNzIsMjcgQEAKICAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Zsb3dncmFwaCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Zsb3dncmFwaC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCmluZGV4IDBlZGZlYmUuLjEzMGVmNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKQEAgLTE1OCwxNCArMTU4LDE0IEBACiAgICAgICAgIC8vIERvZXMgdGhlIHN1bSBvZiB0aGUgdHdvIHBhcnRzIG1hdGNoIHRoZSBhdmFpbGFibGUgdmFsdWUgcmV0dXJuZWQ/CiAgICAgICAgIC8vIEZvciBFbXB0eVJvb20KICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3Qgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEVtcHR5Um9vbUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKICAgICAgICAgLy8gRm9yIEZ1bGxEYXRhCiAgICAgICAgIGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRGdWxsRGF0YUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgIC8vIFdyaXRlIGRhdGEgYnV0IGRvIG5vdCBvdmVyZmxvdy4KICAgICB2b2lkIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvV3JpdGUgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Xcml0ZTsgaSsrKSB7CiAgICAgICAgICAgICBtRGF0YVtpXSA9IG1OZXh0V3JpdGVJbmRleCsrOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgLy8gUmVhZCB3aGF0ZXZlciBkYXRhIGlzIGF2YWlsYWJsZSwgRG8gbm90IHVuZGVyZmxvdy4KICAgICB2b2lkIHZlcmlmeU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CiAgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1JlYWQsIGFjdHVhbCk7CkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAvLyBSZWFkIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzCiAgICAgdm9pZCB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgQVNTRVJUX0xFKG51bUZyYW1lcywgZnJhbWVzQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKQEAgLTI4MiwxMiArMjgyLDEyIEBACiAgICAgdm9pZCBjaGVja1JhbmRvbVdyaXRlUmVhZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0VtcHR5ID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNFbXB0eSk7CiAgICAgICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhudW1GcmFtZXMpOwogCiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0Z1bGwgPQotICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRnVsbCk7CiAgICAgICAgICAgICB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAppbmRleCBiMDFhZjI1Li5kYmY4NzEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcApAQCAtMTMwLDYgKzEzMCw3IEBACiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFLAogfTsKIAogc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2FiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IHRlc3RzIGZvciBJc29jaHJvbm91cyBDbG9jayBNb2RlbAorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKKworLy8gV2UgY2FuIHVzZSBhcmJpdHJhcnkgdmFsdWVzIGhlcmUgYmVjYXVzZSB3ZSBhcmUgbm90IG9wZW5pbmcgYSByZWFsIGF1ZGlvIHN0cmVhbS4KKyNkZWZpbmUgU0FNUExFX1JBVEUgICAgICAgICAgICAgNDgwMDAKKyNkZWZpbmUgSFdfRlJBTUVTX1BFUl9CVVJTVCAgICAgNDgKKyNkZWZpbmUgTkFOT1NfUEVSX0JVUlNUICAgICAgICAgKE5BTk9TX1BFUl9TRUNPTkQgKiBIV19GUkFNRVNfUEVSX0JVUlNUIC8gU0FNUExFX1JBVEUpCisKK2NsYXNzIENsb2NrTW9kZWxUZXN0Rml4dHVyZTogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgeworICAgIH0KKworICAgIHZvaWQgU2V0VXAoKSB7CisgICAgICAgIG1vZGVsLnNldFNhbXBsZVJhdGUoU0FNUExFX1JBVEUpOworICAgICAgICBtb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChIV19GUkFNRVNfUEVSX0JVUlNUKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgeworICAgIH0KKworICAgIH5DbG9ja01vZGVsVGVzdEZpeHR1cmUoKSAgeworICAgICAgICAvLyBjbGVhbnVwIGFueSBwZW5kaW5nIHN0dWZmLCBidXQgbm8gZXhjZXB0aW9ucyBhbGxvd2VkCisgICAgfQorCisgICAgLy8gVGVzdCBwcm9jZXNzaW5nIG9mIHRpbWVzdGFtcHMgd2hlbiB0aGUgaGFyZHdhcmUgbWF5IGJlIHNsaWdodGx5IG9mZiBmcm9tCisgICAgLy8gdGhlIGV4cGVjdGVkIHNhbXBsZSByYXRlLgorICAgIHZvaWQgY2hlY2tEcmlmdGluZ0Nsb2NrKGRvdWJsZSBoYXJkd2FyZUZyYW1lc1BlclNlY29uZCwgaW50IG51bUxvb3BzKSB7CisgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lTmFub3MgPSA1MDAwMDAwMDA7IC8vIGFyYml0cmFyeQorICAgICAgICBtb2RlbC5zdGFydChzdGFydFRpbWVOYW5vcyk7CisKKyAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydFBvc2l0aW9uRnJhbWVzID0gSFdfRlJBTUVTX1BFUl9CVVJTVDsgLy8gaGFyZHdhcmUKKyAgICAgICAgLy8gYXJiaXRyYXJ5IHRpbWUgZm9yIGZpcnN0IGJ1cnN0CisgICAgICAgIGNvbnN0IGludDY0X3QgbWFya2VyVGltZSA9IHN0YXJ0VGltZU5hbm9zICsgTkFOT1NfUEVSX01JTExJU0VDT05ECisgICAgICAgICAgICAgICAgKyAoMjAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKworICAgICAgICAvLyBTaG91bGQgc2V0IGluaXRpYWwgbWFya2VyLgorICAgICAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHN0YXJ0UG9zaXRpb25GcmFtZXMsIG1hcmtlclRpbWUpOworICAgICAgICBBU1NFUlRfRVEoc3RhcnRQb3NpdGlvbkZyYW1lcywgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUpKTsKKworICAgICAgICBkb3VibGUgZWxhcHNlZFRpbWVTZWNvbmRzID0gc3RhcnRUaW1lTmFub3MgLyAoZG91YmxlKSBOQU5PU19QRVJfU0VDT05EOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxvb3BzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByYW5kb20gZGVsYXkgb3ZlciBzZXZlcmFsIGJ1cnN0cy4KKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lRGVsYXlTZWNvbmRzID0gMTAuMCAqIGRyYW5kNDgoKSAqIE5BTk9TX1BFUl9CVVJTVCAvIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgICAgICAgICBlbGFwc2VkVGltZVNlY29uZHMgKz0gdGltZURlbGF5U2Vjb25kczsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZWxhcHNlZFRpbWVOYW5vcyA9IChpbnQ2NF90KShlbGFwc2VkVGltZVNlY29uZHMgKiBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IHN0YXJ0VGltZU5hbm9zICsgZWxhcHNlZFRpbWVOYW5vczsKKyAgICAgICAgICAgIC8vIFNpbXVsYXRlIERTUCBydW5uaW5nIGF0IHRoZSBzcGVjaWZpZWQgcmF0ZS4KKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVGcmFtZXMgPSBzdGFydFBvc2l0aW9uRnJhbWVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoaGFyZHdhcmVGcmFtZXNQZXJTZWNvbmQgKiBlbGFwc2VkVGltZVNlY29uZHMpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBudW1CdXJzdHMgPSBjdXJyZW50VGltZUZyYW1lcyAvIEhXX0ZSQU1FU19QRVJfQlVSU1Q7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFsaWduZWRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb25GcmFtZXMgKyAobnVtQnVyc3RzICogSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisKKyAgICAgICAgICAgIC8vIEFwcGx5IGRyaWZ0aW5nIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAoYWxpZ25lZFBvc2l0aW9uLCBjdXJyZW50VGltZU5hbm9zKTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKGFsaWduZWRQb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKGN1cnJlbnRUaW1lTmFub3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElzb2Nocm9ub3VzQ2xvY2tNb2RlbCBtb2RlbDsKK307CisKKy8vIENoZWNrIGRlZmF1bHQgc2V0dXAuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zZXR1cCkgeworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgbW9kZWwuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBBU1NFUlRfRVEoSFdfRlJBTUVTX1BFUl9CVVJTVCwgbW9kZWwuZ2V0RnJhbWVzUGVyQnVyc3QoKSk7Cit9CisKKy8vIFRlc3QgZGVsdGEgY2FsY3VsYXRpb25zLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZGVsdGFzKSB7CisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgcG9zaXRpb24pOworCisgICAgLy8gRGVsdGFzIGFyZSBub3QgcXVhbnRpemVkLgorICAgIC8vIENvbXBhcmUgdGltZSB0byB0aGUgZXF1aXZhbGVudCBwb3NpdGlvbiBpbiBmcmFtZXMuCisgICAgY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyQnVyc3QgPSBIV19GUkFNRVNfUEVSX0JVUlNUICogTkFOT1NfUEVSX1NFQ09ORCAvIFNBTVBMRV9SQVRFOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQsIHRpbWUpOworCisgICAgLy8gQ29tcGFyZSBwb3NpdGlvbiBpbiBmcmFtZXMgdG8gdGhlIGVxdWl2YWxlbnQgdGltZS4KKyAgICB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpLCB0aW1lKTsKK30KKworLy8gc3RhcnQoKSBzaG91bGQgZm9yY2UgdGhlIGludGVybmFsIG1hcmtlcnMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3N0YXJ0KSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oc3RhcnRUaW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uKTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRUaW1lLCB0aW1lKTsKKworICAgIHRpbWUgPSBzdGFydFRpbWUgKyAoNTAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworfQorCisvLyB0aW1lc3RhbXBzIG1vdmVzIHRoZSB3aW5kb3cgaWYgb3V0c2lkZSB0aGUgYm91bmRzCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja190aW1lc3RhbXApIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lICsgTkFOT1NfUEVSX01JTExJU0VDT05EICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAvLyBTaG91bGQgc2V0IG1hcmtlci4KKyAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHBvc2l0aW9uLCBtYXJrZXJUaW1lKTsKKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAvLyBjb252ZXJ0VGltZVRvUG9zaXRpb24gcm91bmRzIGRvd24KKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lICsgKDczICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkpOworCisgICAgLy8gY29udmVydFBvc2l0aW9uVG9UaW1lIHJvdW5kcyB1cAorICAgIEVYUEVDVF9FUShtYXJrZXJUaW1lICsgTkFOT1NfUEVSX0JVUlNULCBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24gKyAxNykpOworfQorCisjZGVmaW5lIE5VTV9MT09QU19EUklGVCAgIDEwMDAwCisKKy8vIHRlc3QgbnVkZ2luZyB0aGUgd2luZG93IGJ5IHVzaW5nIGEgZHJpZnRpbmcgSFcgY2xvY2sKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX25vX2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQorCisvLyBUaGVzZSBzbG93IGRyaWZ0IHJhdGVzIGNhdXNlZCBlcnJvcnMgd2hlbiBJIGRpc2FibGVkIHRoZSBjb2RlIHRoYXQgaGFuZGxlcworLy8gZHJpZnRpbmcgaW4gdGhlIGNsb2NrIG1vZGVsLiBTbyBJIHRoaW5rIHRoZSB0ZXN0IGlzIHZhbGlkLgorLy8gSXQgaXMgdW5saWtlbHkgdGhhdCByZWFsIGhhcmR3YXJlIHdvdWxkIGJlIG9mZiBieSBtb3JlIHRoYW4gdGhpcyBhbW91bnQuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zbG93X2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKDAuOTk4ICogU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9CisKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX2Zhc3RfZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soMS4wMDIgKiBTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYzYTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRlc3QgRmxvd0dyYXBoCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9SYW1wTGluZWFyLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMjQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9zaW5raTE2KSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMC41ZiwgLTAuMjVmLCAtMS4wZiwgMC4wZiwgNTMuOWYsIC04Ny4yZn07CisgICAgc3RhdGljIGNvbnN0IGludDE2X3QgZXhwZWN0ZWRbXSA9IHszMjc2NywgMTYzODQsIC04MTkyLCAtMzI3NjgsIDAsIDMyNzY3LCAtMzI3Njh9OworICAgIGludDE2X3Qgb3V0cHV0WzIwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBTaW5rSTE2IHNpbmtJMTZ7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMTYuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKGludDE2X3QpOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMTYucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfbW9ub190b19zdGVyZW8pIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAyLjBmLCAzLjBmfTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXSA9IHt9OworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIE1vbm9Ub011bHRpQ29udmVydGVyIG1vbm9Ub1N0ZXJlb3syfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezJ9OworCisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgMyk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmbW9ub1RvU3RlcmVvLmlucHV0KTsKKyAgICBtb25vVG9TdGVyZW8ub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIDgpOworICAgIEFTU0VSVF9FUSgzLCBudW1SZWFkKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMF0sIG91dHB1dFswXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMV0pOworICAgIEVYUEVDVF9FUShpbnB1dFsxXSwgb3V0cHV0WzJdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFszXSk7Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9yYW1wX2xpbmVhcikgeworICAgIGNvbnN0ZXhwciBpbnQgcmFtcFNpemUgPSA1OworICAgIGNvbnN0ZXhwciBpbnQgbnVtT3V0cHV0ID0gMTAwOworICAgIGNvbnN0ZXhwciBmbG9hdCB2YWx1ZSA9IDEuMGY7CisgICAgY29uc3RleHByIGZsb2F0IHRhcmdldCA9IDEwMC4wZjsKKyAgICBmbG9hdCBvdXRwdXRbbnVtT3V0cHV0XSA9IHt9OworICAgIFJhbXBMaW5lYXIgcmFtcExpbmVhcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgcmFtcExpbmVhci5pbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgcmFtcExpbmVhci5zZXRMZW5ndGhJbkZyYW1lcyhyYW1wU2l6ZSk7CisgICAgcmFtcExpbmVhci5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICByYW1wTGluZWFyLmZvcmNlQ3VycmVudCgwLjBmKTsKKworICAgIHJhbXBMaW5lYXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dCk7CisgICAgQVNTRVJUX0VRKG51bU91dHB1dCwgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGludCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHJhbXBTaXplOyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpICogdmFsdWUgKiB0YXJnZXQgLyByYW1wU2l6ZTsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBudW1PdXRwdXQ7IGkrKykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogdGFyZ2V0OworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KKworLy8gSXQgaXMgZWFzaWVzdCB0byByZXByZXNlbnQgcGFja2VkIDI0LWJpdCBkYXRhIGFzIGEgYnl0ZSBhcnJheS4KKy8vIFRoaXMgdGVzdCB3aWxsIHJlYWQgZnJvbSBpbnB1dCwgY29udmVydCB0byBmbG9hdCwgdGhlbiB3cml0ZQorLy8gYmFjayB0byBvdXRwdXQgYXMgYnl0ZXMuCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcGFja2VkXzI0KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW5wdXRbXSA9IHsweDAxLCAweDIzLCAweDQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywgMHg4OSwgMHhBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Q0QsIDB4RUYsIDB4NUF9OworICAgIHVpbnQ4X3Qgb3V0cHV0Wzk5XSA9IHt9OworICAgIFNvdXJjZUkyNCBzb3VyY2VJMjR7MX07CisgICAgU2lua0kyNCBzaW5rSTI0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICBzb3VyY2VJMjQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUkyNC5vdXRwdXQuY29ubmVjdCgmc2lua0kyNC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTI0LnJlYWQob3V0cHV0LCBzaXplb2Yob3V0cHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZCk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihpbnB1dCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoaW5wdXRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfY2xpcF90b19yYW5nZSkgeworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1pbiA9IC0yLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1heCA9IDEuNWY7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHstOS43LCAwLjVmLCAtMC4yNSwgMS4wZiwgMTIuM307CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGV4cGVjdGVkW10gPSB7bXlNaW4sIDAuNWYsIC0wLjI1LCAxLjBmLCBteU1heH07CisgICAgZmxvYXQgb3V0cHV0WzEwMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgQ2xpcFRvUmFuZ2UgY2xpcHBlcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworCisgICAgY2xpcHBlci5zZXRNaW5pbXVtKG15TWluKTsKKyAgICBjbGlwcGVyLnNldE1heGltdW0obXlNYXgpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJmNsaXBwZXIuaW5wdXQpOworICAgIGNsaXBwZXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2Yob3V0cHV0WzBdKTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMjZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9zZWdtZW50cykgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDgpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotCi0gICAgRVhQRUNUX0VRKDgsIHJhbXAuZ2V0TGVuZ3RoSW5GcmFtZXMoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSgxLjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDIuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoMy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgxLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLSAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotfTsKLQotCi1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGxpbmVhcl9yYW1wX2ZvcmNlZCkgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDQpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotICAgIHJhbXAuZm9yY2VDdXJyZW50KDQuMGYpOwotICAgIEVYUEVDVF9FUSg0LjBmLCByYW1wLmdldEN1cnJlbnQoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLWNvbnN0ZXhwciBpbnQxNl90IGtNYXhJMTYgPSBJTlQxNl9NQVg7Ci1jb25zdGV4cHIgaW50MTZfdCBrTWluSTE2ID0gSU5UMTZfTUlOOwotY29uc3RleHByIGludDE2X3Qga0hhbGZJMTYgPSAxNjM4NDsKLWNvbnN0ZXhwciBpbnQxNl90IGtUZW50aEkxNiA9IDMyNzc7Ci0KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBmbG9hdF90b19pMTYpIHsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbXSA9IHsxMjM0NS42ZiwgMS4wZiwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZiwgLTEyMzQ1LjZmfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHtrTWF4STE2LCBrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNiwga01pbkkxNn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgaTE2X3RvX2Zsb2F0KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHtrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWtUZW50aEkxNiwgLWtIYWxmSTE2LCBrTWluSTE2fTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgZmxvYXQgZXhwZWN0ZWRbY291bnRdID0geygzMjc2Ny4wZiAvIDMyNzY4LjBmKSwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBkZXN0aW5hdGlvbltpXSwgMC4wMDAxZik7Ci0gICAgfQotCi19Ci0KLS8vdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgcmFtcF9pMTZfdG9faTE2KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICAvLyBSYW1wIHdpbGwgc3dlZXAgZnJvbSAtMSB0byBhbG1vc3QgKzEKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHsKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0xLjAwCi0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMC43NQotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNTUsIHJvdW5kIGF3YXkgZnJvbSB6ZXJvCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAtMC4yNSwgcm91bmQgdXAgdG8gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gIDAuMDAKLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjI1LCByb3VuZCBkb3duIHRvIHplcm8KLSAgICAgICAgICAgIDEsICAvLyBmcm9tICAwLjUwLCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMSAgIC8vIGZyb20gIDAuNzUKLSAgICB9OwotCi0gICAgLy8gc3dlZXAgYWNyb3NzIHplcm8gdG8gdGVzdCBzeW1tZXRyeQotICAgIGNvbnN0ZXhwciBmbG9hdCBhbXBsaXR1ZGUxID0gLTEuMDsKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMiA9IDEuMDsKLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMSwgYW1wbGl0dWRlMSwgYW1wbGl0dWRlMik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZXR1cm5fc3RvcC5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrLgorICogRXhwZWN0IHRoZSBjYWxsYmFjayB0byBjZWFzZS4KKyAqIENoZWNrIHRoZSBsb2djYXQgZm9yIGJhZCBiZWhhdmlvci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoKGludDY0X3QpMTAwMDAwMDAwMCkKKyNkZWZpbmUgU1RPUF9BVF9NU0VDICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTE9PUF9EVVJBVElPTl9NU0VDICAgIDQwMDAKKyNkZWZpbmUgU0xFRVBfRFVSQVRJT05fTVNFQyAgICAyMDAKKworc3RhdGljIHZvaWQgc19teUVycm9yQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcik7CisKK3N0cnVjdCBBdWRpb0VuZ2luZSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAqc3RyZWFtID0gbnVsbHB0cjsKKyAgICBzdGQ6OnRocmVhZCAgICAgICAgICp0aHJlYWQgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgICAgICAgIHN0b3BBdEZyYW1lID0gMDsKKyAgICBib29sICAgICAgICAgICAgICAgICBzdG9wcGVkID0gZmFsc2U7CisgICAgLy8gVGhlc2UgY291bnRlcnMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIGNhbGxiYWNrIGFuZCB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gZnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IHN0YXJ0aW5nRnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc0NhbGxlZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGNhbGxiYWNrQ291bnR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50QWZ0ZXJTdG9we307CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBmcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBzdGFydGluZ0ZyYW1lc1JlYWQuc3RvcmUoMCk7CisgICAgICAgIGZyYW1lc0NhbGxlZC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5zdG9yZSgwKTsKKyAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIH0KK307CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCitzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgc19teURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgZW5naW5lLT5jYWxsYmFja0NvdW50Kys7CisgICAgaWYgKGVuZ2luZS0+c3RvcHBlZCkgeworICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnRBZnRlclN0b3ArKzsKKyAgICB9CisKKyAgICBlbmdpbmUtPmZyYW1lc1JlYWQgPSAoaW50MzJfdClBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0pOworICAgIGlmIChlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZCA9PSAwKSB7CisgICAgICAgIGVuZ2luZS0+c3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKGVuZ2luZS0+ZnJhbWVzUmVhZC5sb2FkKCkpOworICAgIH0KKyAgICBlbmdpbmUtPmZyYW1lc0NhbGxlZCArPSBudW1GcmFtZXM7CisgICAgaWYgKGVuZ2luZS0+ZnJhbWVzQ2FsbGVkID49IGVuZ2luZS0+c3RvcEF0RnJhbWUpIHsKKyAgICAgICAgZW5naW5lLT5zdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3Qgc19PcGVuQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZlbmdpbmUtPmJ1aWxkZXIpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChlbmdpbmUtPmJ1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGVuZ2luZS0+YnVpbGRlciwgc2hhcmluZ01vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGVuZ2luZS0+YnVpbGRlciwgZGlyZWN0aW9uKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlEYXRhQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlFcnJvckNhbGxiYWNrUHJvYywgZW5naW5lKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGVuZ2luZS0+YnVpbGRlciwgJmVuZ2luZS0+c3RyZWFtKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfQ2xvc2VBdWRpb1N0cmVhbShzdHJ1Y3QgQXVkaW9FbmdpbmUgKmVuZ2luZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGVuZ2luZS0+c3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKGVuZ2luZS0+c3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIGVuZ2luZS0+c3RyZWFtID0gbnVsbHB0cjsKKyAgICB9CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoZW5naW5lLT5idWlsZGVyKTsKKyAgICBlbmdpbmUtPmJ1aWxkZXIgPSBudWxscHRyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCisgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBzX3VzYWdlKCkgeworICAgIHByaW50ZigidGVzdF9yZXR1cm5fc3RvcCBbLWldIFsteF0gWy1uXSBbLWNdXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWkgZGlyZWN0aW9uIElOUFVULCBvdGhlcndpc2UgT1VUUFVUXG4iKTsKKyAgICBwcmludGYoIiAgICAgLXggc2hhcmluZyBtb2RlIEVYQ0xVU0lWRSwgb3RoZXJ3aXNlIFNIQVJFRFxuIik7CisgICAgcHJpbnRmKCIgICAgIC1uIHBlcmZvcm1hbmNlIG1vZGUgTk9ORSwgb3RoZXJ3aXNlIExPV19MQVRFTkNZXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWMgYWx3YXlzIHJldHVybiBDT05USU5VRSBmcm9tIGNhbGxiYWNrLCBub3QgU1RPUFxuIik7Cit9CisKKy8qKgorICogQHJldHVybiAwIGlzIE9LLCAtMSBmb3IgZXJyb3IKKyAqLworc3RhdGljIGludCBzX2NoZWNrRW5naW5lUG9zaXRpb25zKEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChlbmdpbmUtPnN0cmVhbSk7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDMyX3QgZGVsdGEgPSAoaW50MzJfdCkoZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQpOworICAgIHByaW50ZigicGxheWluZyBmcmFtZXNSZWFkID0gJTdkLCBmcmFtZXNXcml0dGVuID0gJTdkIgorICAgICAgICAgICAiLCBkZWx0YSA9ICU0ZCwgZnJhbWVzQ2FsbGVkID0gJTZkLCBjYWxsYmFja0NvdW50ID0gJTRkXG4iLAorICAgICAgICAgICAoaW50MzJfdCkgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgIGRlbHRhLAorICAgICAgICAgICBlbmdpbmUtPmZyYW1lc0NhbGxlZC5sb2FkKCksCisgICAgICAgICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudC5sb2FkKCkKKyAgICApOworICAgIGlmIChkZWx0YSA+IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGVuZ2luZS0+c3RyZWFtKSkgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gZGVsdGEgPiBjYXBhY2l0eVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGJvb2wgYWx3YXlzQ29udGludWUgPSBmYWxzZTsKKyAgICBpbnQgZXJyb3JDb3VudCA9IDA7CisgICAgaW50IGNhbGxiYWNrUmVzdWx0ID0gRVhJVF9TVUNDRVNTOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIlRlc3QgUmV0dXJuIFN0b3AgVjEuMFxuIik7CisgICAgcHJpbnRmKCJXYWl0IGZvciBhIGZldyBzZWNvbmRzLlxuIik7CisgICAgcHJpbnRmKCJZb3Ugc2hvdWxkIHNlZSBjYWxsYmFja0NvdW50IGFuZCBmcmFtZXNSZWFkIHN0b3AgYWR2YW5jaW5nXG4iKTsKKyAgICBwcmludGYoIndoZW4gY2FsbGJhY2tDb3VudCByZWFjaGVzICVkIG1zZWNcbiIsIFNUT1BfQVRfTVNFQyk7CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKyAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKKyAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOworICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzQ29udGludWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgICAgIHBlcmZNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNfdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfdXNhZ2UoKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSwgZGlyZWN0aW9uLCBzaGFyaW5nTW9kZSwgcGVyZk1vZGUpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50Zigic19PcGVuQXVkaW9TdHJlYW0gcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZXJyb3JDb3VudCsrOworICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoZW5naW5lLnN0cmVhbSk7CisgICAgLy8gVXNlIGRvdWJsZSBidWZmZXJlZCBzdHJlYW0uCisgICAgY29uc3QgaW50MzJfdCBidWZmZXJTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhlbmdpbmUuc3RyZWFtLCAyICogZnJhbWVzUGVyQnVyc3QpOworICAgIGlmIChidWZmZXJTaXplIDwgMCkgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMgcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChidWZmZXJTaXplKSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgaW50MzJfdCBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChlbmdpbmUuc3RyZWFtKTsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGFjdHVhbFBlcmZNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShlbmdpbmUuc3RyZWFtKTsKKyAgICBwcmludGYoIi0tLS0tLS0tIG9wZW5lZDogZGV2aWNlSWQgPSAlM2QsIGZyYW1lc1BlckJ1cnN0ID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLAorICAgICAgICAgICBkZXZpY2VJZCwgZnJhbWVzUGVyQnVyc3QsIGFjdHVhbFBlcmZNb2RlKTsKKworICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBjYWxsYmFja3MgbmVlZGVkLgorICAgIGlmIChhbHdheXNDb250aW51ZSkgeworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBJTlQzMl9NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoZW5naW5lLnN0cmVhbSk7CisgICAgICAgIGVuZ2luZS5zdG9wQXRGcmFtZSA9IFNUT1BfQVRfTVNFQyAqIHNhbXBsZVJhdGUgLyAxMDAwOworICAgIH0KKworICAgIGZvciAoaW50IGxvb3BzID0gMDsgbG9vcHMgPCAyICYmIHJlc3VsdCA9PSBBQVVESU9fT0s7IGxvb3BzKyspIHsKKyAgICAgICAgZW5naW5lLnJlc2V0KCk7CisKKyAgICAgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGVuZ2luZS5zdHJlYW0pOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKSByZXR1cm5lZCAlZCA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgY29uc3QgaW50IHdhdGNoTG9vcHMgPSBMT09QX0RVUkFUSU9OX01TRUMgLyBTTEVFUF9EVVJBVElPTl9NU0VDOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHdhdGNoTG9vcHM7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9IHNfY2hlY2tFbmdpbmVQb3NpdGlvbnMoJmVuZ2luZSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZ2luZS5zdG9wQXRGcmFtZSAhPSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKGVuZ2luZS5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wID09IDApID8gRVhJVF9TVUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBDYWxsYmFjayBjb3VudCBhZnRlciBTVE9QID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZ2luZS5zdGFydGluZ0ZyYW1lc1JlYWQubG9hZCgpID09IGVuZ2luZS5mcmFtZXNSZWFkLmxvYWQoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGZyYW1lc1JlYWQgZGlkIG5vdCBhZHZhbmNlIGFjcm9zcyBjYWxsYmFja3NcbiIpOworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIHJldHVybmVkICVkIDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOworICAgICAgICBlcnJvckNvdW50ICs9IHNfY2hlY2tFbmdpbmVQb3NpdGlvbnMoJmVuZ2luZSkgPyAxIDogMDsKKyAgICB9CisKKyAgICBzX0Nsb3NlQXVkaW9TdHJlYW0oJmVuZ2luZSk7CisKKyAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisgICAgcmV0dXJuIGVycm9yQ291bnQgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCmluZGV4IGRmYTc4MTUuLjdiMWRmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAKICNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgMQogI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9URVNUUyAgICAgICAgICAgICAgIDIwCiAKIHR5cGVkZWYgc3RydWN0IFRpbWVzdGFtcEluZm8gewogICAgIGludDY0X3QgICAgICAgICBmcmFtZXNUb3RhbDsKQEAgLTUzLDYgKzU0LDQ5IEBACiAgICAgYm9vbCAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKIH0gVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3Q7CiAKK3N0cnVjdCBUaW1lU3RhbXBUZXN0TG9nIHsKKyAgICBhYXVkaW9fcG9saWN5X3QgICAgICAgICAgIGlzTW1hcDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgIHNoYXJpbmdNb2RlOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgZGlyZWN0aW9uOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgcmVzdWx0OworfTsKKworc3RhdGljIGludCBzX251bVRlc3RzID0gMDsKKy8vIFVzZSBhIHBsYWluIG9sZCBhcnJheSBiZWNhdXNlIHdlIHJlZmVyZW5jZSB0aGlzIGZyb20gdGhlIGNhbGxiYWNrIGFuZCBkbyBub3Qgd2FudCBhbnkKKy8vIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KK3N0YXRpYyBUaW1lU3RhbXBUZXN0TG9nIHNfdGVzdExvZ3NbTUFYX1RFU1RTXXt9OworCitzdGF0aWMgdm9pZCBsb2dUZXN0UmVzdWx0KGJvb2wgaXNNbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CisgICAgaWYoc19udW1UZXN0cyA+PSBNQVhfVEVTVFMpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIE1BWF9URVNUUyB0b28gc21hbGwgPSAlZFxuIiwgTUFYX1RFU1RTKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLmlzTW1hcCA9IGlzTW1hcDsKKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLnNoYXJpbmdNb2RlID0gc2hhcmluZ01vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5wZXJmb3JtYW5jZU1vZGUgPSBwZXJmb3JtYW5jZU1vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5yZXN1bHQgPSByZXN1bHQ7CisgICAgc19udW1UZXN0cysrOworfQorCitzdGF0aWMgdm9pZCBwcmludFRlc3RSZXN1bHRzKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc19udW1UZXN0czsgaSsrKSB7CisgICAgICAgIFRpbWVTdGFtcFRlc3RMb2cgKmxvZyA9ICZzX3Rlc3RMb2dzW2ldOworICAgICAgICBwcmludGYoIiUyZDogbW1hcCA9ICUzcywgc2hhcmluZyA9ICU5cywgcGVyZiA9ICUxMXMsIGRpciA9ICU2cyAtLS0tICU0c1xuIiwKKyAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICBsb2ctPmlzTW1hcCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlVGV4dChsb2ctPnNoYXJpbmdNb2RlKSwKKyAgICAgICAgICAgICAgIGdldFBlcmZvcm1hbmNlTW9kZVRleHQobG9nLT5wZXJmb3JtYW5jZU1vZGUpLAorICAgICAgICAgICAgICAgZ2V0RGlyZWN0aW9uVGV4dChsb2ctPmRpcmVjdGlvbiksCisgICAgICAgICAgICAgICBsb2ctPnJlc3VsdCA/ICJGQUlMIiA6ICJwYXNzIik7CisgICAgfQorfQorCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCkBAIC0xMTUsNiArMTU5LDcgQEAKICAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CiAgICAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0gMDsKICAgICBpbnQzMl90IGZpbmFsQnVmZmVyU2l6ZSA9IDA7CisgICAgYm9vbCAgICBpc01tYXAgPSBmYWxzZTsKICAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwpAQCAtMTI0LDcgKzE2OSw4IEBACiAKICAgICBtZW1zZXQoJnNUaW1lc3RhbXBEYXRhLCAwLCBzaXplb2Yoc1RpbWVzdGFtcERhdGEpKTsKIAotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tLS0tXG4iLAorICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tXG4iLAogICAgICAgICAgICBtbWFwUG9saWN5LAogICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQoc2hhcmluZ01vZGUpLAogICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KHBlcmZvcm1hbmNlTW9kZSksCkBAIC0xNzcsOCArMjIzLDggQEAKIAogICAgIHByaW50ZigiICAgIGNoYW5zID0gJTNkLCByYXRlID0gJTZkIGZvcm1hdCA9ICVkXG4iLAogICAgICAgICAgICBhY3R1YWxDaGFubmVsQ291bnQsIGFjdHVhbFNhbXBsZVJhdGUsIGFjdHVhbERhdGFGb3JtYXQpOwotICAgIHByaW50ZigiICAgIElzIE1NQVAgdXNlZD8gJXNcbiIsIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisgICAgaXNNbWFwID0gQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoYWF1ZGlvU3RyZWFtKTsKKyAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBpc01tYXAgPyAieWVzIiA6ICJubyIpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSByZWFkIGluIG9uZSBjaHVuayBieSBhIERNQSBjb250cm9sbGVyCiAgICAgLy8gb3IgYSBEU1Agb3IgYSBtaXhlci4KQEAgLTIxOCw3ICsyNjQsNyBAQAogCiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IE5VTV9TRUNPTkRTOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gR2l2ZSBBQXVkaW8gY2FsbGJhY2sgdGltZSB0byBydW4gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIHVzbGVlcCgyMDAgKiAxMDAwKTsKIAogICAgICAgICAgICAgLy8gUGVyaW9kaWNhbGx5IHByaW50IHRoZSBwcm9ncmVzcyBzbyB3ZSBrbm93IGl0IGhhc24ndCBkaWVkLgogICAgICAgICAgICAgcHJpbnRmKCJmcmFtZXNXcml0dGVuID0gJWQsIFhSdW5zID0gJWRcbiIsCkBAIC0yMzQsMTggKzI4MCwyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpbnRmKCJ0aW1lc3RhbXBDb3VudCA9ICVkXG4iLCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudCk7Ci0gICAgICAgIGludCBwcmludGVkID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBwcmludGVkR29vZCA9IDA7CisgICAgICAgIGludCBwcmludGVkQmFkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmc1RpbWVzdGFtcERhdGEudGltZXN0YW1wc1tpXTsKLSAgICAgICAgICAgIGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOwotICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wTmFub3MpOwotICAgICAgICAgICAgaWYgKChwcmludGVkIDwgMjApICYmICgoaSA8IDEwKSB8fCBwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC0+cmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcmVzdWx0ID0gJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocHJpbnRlZEJhZCA8IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQsIHJlc3VsdCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGltZXN0YW1wLT5yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEJhZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBwb3NDaGFuZ2VkID0gKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zCisgICAgICAgICAgICAgICAgICAgICAgICAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByaW50ZWRHb29kIDwgMjApICYmIChwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewogICAgICAgICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiA8IDA7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0cm8gPSAoaSA+IDAgJiYgKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKSk7CkBAIC0yNTMsMTcgKzMwNiwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIik7CiAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3kgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFNUQU1QOiBwb3MgPSAlOGxsZCwgbmFub3MgPSAlOGxsZCwgbGF0ID0gJTcuMWYgbXNlYyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBOYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEdvb2QrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbnRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByaW50ZWRHb29kID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgbmV2ZXIgZ2F2ZSB1cyBhIHZhbGlkIHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gbm90IGdldCB0aW1lc3RhbXBzIHdoZW4gc3RvcHBlZC4KKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb247CisgICAgICAgICAgICBpbnQ2NF90IHRpbWU7CisgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGVtcFJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24sICZ0aW1lKTsKKyAgICAgICAgICAgIGlmICh0ZW1wUmVzdWx0ICE9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoKSBzaG91bGQgcmV0dXJuIgorICAgICAgICAgICAgICAgICAgICAgICAiIElOVkFMSURfU1RBVEUgd2hlbiBzdG9wcGVkISAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGVtcFJlc3VsdCkpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzMsMTIgKzM0OCwxNCBAQAogICAgIH0KIAogZmluaXNoOgorCisgICAgbG9nVGVzdFJlc3VsdChpc01tYXAsIHNoYXJpbmdNb2RlLCBwZXJmb3JtYW5jZU1vZGUsIGRpcmVjdGlvbiwgcmVzdWx0KTsKKwogICAgIGlmIChhYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKICAgICB9CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CiAgICAgcHJpbnRmKCJyZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjkyLDcgKzM2OSw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuM1xuIik7CisgICAgcHJpbnRmKCJUZXN0IFRpbWVzdGFtcHMgVjAuMS40XG4iKTsKIAogICAgIC8vIExlZ2FjeQogICAgIGFhdWRpb19wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fUE9MSUNZX05FVkVSOwpAQCAtMzMyLDUgKzQwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOwogCisgICAgcHJpbnRUZXN0UmVzdWx0cygpOworCiAgICAgcmV0dXJuIChyZXN1bHQgPT0gQUFVRElPX09LKSA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDAxMTk3OWUuLmU5YjZmYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNSw2ICs1LDI5IEBACiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3kiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvQXR0cmlidXRlcy5jcHAiLAorICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCIsCisgICAgICAgICJBdWRpb1ZvbHVtZUdyb3VwLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnQiLAogCiAgICAgYWlkbDogewpAQCAtMjMsNyArNDYsNiBAQAogICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGwiLAogCiAgICAgICAgICJBdWRpb0VmZmVjdC5jcHAiLAotICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVjb3JkLmNwcCIsCiAgICAgICAgICJBdWRpb1N5c3RlbS5jcHAiLAogICAgICAgICAiQXVkaW9UcmFjay5jcHAiLApAQCAtNDAsMTYgKzYyLDIwIEBACiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCiAgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYmJpbmRlciJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU2OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0F0dHJpYnV0ZXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLT5yZWFkSW50MzIoKSA9PSAxKTsKKyAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3M7CisgICAgICAgIHJldCA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJnRhZ3MpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RybmNweShtQXR0cmlidXRlcy50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CisgICAgfQorICAgIG1TdHJlYW1UeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUdyb3VwSWQgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocGFyY2VsLT5yZWFkVWludDMyKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5jb250ZW50X3R5cGUpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMudXNhZ2UpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuc291cmNlKSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmZsYWdzKSk7CisgICAgaWYgKHN0cmxlbihtQXR0cmlidXRlcy50YWdzKSA9PSAwKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7CisgICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiNDBmMGRiLi5jZjExOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC00MzIsMTQgKzQzMiwxNSBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgZGVzY3JpcHRvcik7CisgICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIHR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCBkZXNjcmlwdG9yKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCkBAIC00NDgsNiArNDQ5LDk1IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAqaWQgPSBhZi0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IGQxZjc1MjUuLjNhYjM4Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKQEAgLTIyLDYgKzIyLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vCisvLyAgQXVkaW9EZXZpY2VUeXBlQWRkciBpbXBsZW1lbnRhdGlvbgorLy8KK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIG1BZGRyZXNzID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVR5cGUpOworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1BZGRyZXNzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLy8KIC8vICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGltcGxlbWVudGF0aW9uCiAvLwogQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbihhdWRpb191c2FnZV90IHVzYWdlLApAQCAtNDAsMTEgKzU2LDIyIEBACiBzdGF0dXNfdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtUnVsZSA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgaWYgKG1SdWxlID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIHx8Ci0gICAgICAgICAgICBtUnVsZSA9PSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFKSB7Ci0gICAgICAgIG1WYWx1ZS5tVXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WYWx1ZS5tU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgc3dpdGNoIChtUnVsZSkgeworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgIG1WYWx1ZS5tVWlkID0gKHVpZF90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGJ1aWxkIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gZnJvbSB1bmtub3duIHJ1bGUgJWQiLCBtUnVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTExNiw0ICsxNDMsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXg6OnNldEV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX0VYQ0xVREVfVUlEOworICAgIGNyaXQubVZhbHVlLm1VaWQgPSB1aWQ7CisgICAgbUNyaXRlcmlhLmFkZChjcml0KTsKK30KKwordm9pZCBBdWRpb01peDo6c2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX01BVENIX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGExMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgcmV0ID0gYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUlkKSk7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUobUF1ZGlvQXR0cmlidXRlc1tpXSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKQoreworICAgIGlmIChyZWZBdHRyaWJ1dGVzID09IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIpIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpcyB0aGUgc3RyYXRlZ3kgdGhhdCBob2xkcyBkZWZhdWx0IGF0dHJpYnV0ZXMgYnkgY29udmVudGlvbi4KKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMgdGhhdCBmYWlsIHRvIG1hdGNoIHdpbGwgZm9sbG93IHRoZSBkZWZhdWx0IHN0cmF0ZWd5IGZvciByb3V0aW5nLgorICAgICAgICAvLyBDaG9vc2luZyB0aGUgZGVmYXVsdCBtdXN0IGJlIGRvbmUgYXMgYSBmYWxsYmFjaywgdGhlIGF0dHJpYnV0ZXMgbWF0Y2ggc2hhbGwgbm90CisgICAgICAgIC8vIHNlbGVjdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChyZWZBdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04pIHx8CisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy51c2FnZSA9PSByZWZBdHRyaWJ1dGVzLnVzYWdlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuY29udGVudF90eXBlID09IHJlZkF0dHJpYnV0ZXMuY29udGVudF90eXBlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5mbGFncyA9PSBBVURJT19GTEFHX05PTkUpIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuZmxhZ3MgIT0gQVVESU9fRkxBR19OT05FICYmCisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5mbGFncyAmIHJlZkF0dHJpYnV0ZXMuZmxhZ3MpID09IGNsaWVudEF0dHJpdHViZXMuZmxhZ3MpKSAmJgorICAgICAgICAgICAgKChzdHJsZW4ocmVmQXR0cmlidXRlcy50YWdzKSA9PSAwKSB8fAorICAgICAgICAgICAgIChzdGQ6OnN0cmNtcChjbGllbnRBdHRyaXR1YmVzLnRhZ3MsIHJlZkF0dHJpYnV0ZXMudGFncykgPT0gMCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggOGUyZGE5ZS4uYmFhMTQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNTAsOCArNTAsOSBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIgorICAgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNTksOCArNjAsOCBAQAogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCiAgICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMjEwLDggKzIxMSw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvUmVjb3JkLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVNlc3Npb25JZCk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEgLypwaWQqLyk7CiAgICAgfQogfQpAQCAtMjM5LDkgKzI0MCwxMSBAQAogICAgIHBpZF90IGNhbGxpbmdQaWQ7CiAgICAgcGlkX3QgbXlQaWQ7CiAKLSAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKICAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwogCkBAIC0yNTcsNyArMjYwLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMjY2LDcgKzI2OSw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yNzQsNyArMjc3LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI4NSw4ICsyODgsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KIAogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTI5OSwxNCArMzAyLDE0IEBACiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMzI3LDcgKzMzMCw3IEBACiAgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAogICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbXlQaWQgPSBnZXRwaWQoKTsKQEAgLTM1Miw3ICszNTUsMTIgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewpAQCAtMzg5LDcgKzM5Nyw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7Ci0gICAgQUxPR1YoInN0YXJ0LCBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CisgICAgQUxPR1YoIiVzKCVkKTogc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUFjdGl2ZSkgewpAQCAtNDMwLDcgKzQzOCw3IEBACiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKQEAgLTQ1NCw2ICs0NjIsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IG1BY3RpdmU6JWRcbiIsIF9fZnVuY19fLCBtUG9ydElkLCBtQWN0aXZlKTsKICAgICBpZiAoIW1BY3RpdmUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYzMiw4ICs2NDEsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY3NSw3ICs2ODQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1czsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC03MDIsNyArNzExLDggQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDM6IG9idGFpbi9yZWxlYXNlIG1vZGUKICAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgaWYgKCF1c2VDYXNlQWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7CkBAIC03MzcsNyArNzQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CkBAIC03NDcsNyArNzU4LDggQEAKIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgIH0KQEAgLTc1NywxMyArNzY5LDEzIEBACiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzc4LDcgKzc5MCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNzkyLDE5ICs4MDQsMjIgQEAKICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBvdXRwdXQuY2JsazsKICAgICBtQnVmZmVyTWVtb3J5ID0gb3V0cHV0LmJ1ZmZlcnM7CisgICAgbVBvcnRJZCA9IG91dHB1dC5wb3J0SWQ7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCiAgICAgbUNibGsgPSBjYmxrOwogICAgIC8vIG5vdGUgdGhhdCBvdXRwdXQuZnJhbWVDb3VudCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIG1SZXFGcmFtZUNvdW50CiAgICAgaWYgKG91dHB1dC5mcmFtZUNvdW50IDwgbVJlcUZyYW1lQ291bnQgfHwgKG1SZXFGcmFtZUNvdW50ID09IDAgJiYgb3V0cHV0LmZyYW1lQ291bnQgPT0gMCkpIHsKLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4uCiAgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gc2VydmVyIHNpZGUuCiAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ICE9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpIHsKLSAgICAgICAgQUxPR1coIlNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC04NzIsNyArODg3LDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHdhaXRDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKQEAgLTk4MSw3ICs5OTYsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMDM4LDcgKzEwNTQsNyBAQAogICAgICAgICAgICAgcG9sbFVzIDw8PSAxOwogICAgICAgICB9IHdoaWxlICh0cnlDb3VudGVyLS0gPiAwKTsKICAgICAgICAgaWYgKHRyeUNvdW50ZXIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTExNjEsNyArMTE3Nyw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0xMTczLDE2ICsxMTkwLDE4IEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTIwNCw4ICsxMjIzLDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiAgRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTI2NSw3ICsxMjg0LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOworICAgIEFMT0dXKCIlcyglZCk6IGRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgX19mdW5jX18sIG1Qb3J0SWQsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CkBAIC0xMjg1LDEwICsxMzA0LDcgQEAKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRocmVhZCBvciBzeW5jIGV2ZW50IGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGZhaWxzIGlmIHdlIGhhdmUgYSBuZXcgQXVkaW9GbGluZ2VyIGluc3RhbmNlCkBAIC0xMjk5LDE1ICsxMzE1LDE3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVJlY29yZF9sKCkgZmFpbGVkIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gaWYgbm8gcmV0cmllcyBsZWZ0LCBzZXQgaW52YWxpZCBiaXQgdG8gZm9yY2UgcmVzdG9yaW5nIGF0IG5leHQgb2NjYXNpb24KKyAgICAgICAgLy8gYW5kIGF2b2lkIGluY29uc2lzdGVudCBhY3RpdmUgc3RhdGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKKyAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEzMTYsMTggKzEzMzQsMTggQEAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CkBAIC0xMzQwLDEyICsxMzU4LDEyIEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CkBAIC0xMzg0LDYgKzE0MDIsMTcgQEAKICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykudHJhbnNhY3Rpb25FcnJvcigpOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpAQCAtMTQ1MCw3ICsxNDc5LDcgQEAKICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoKSByZXR1cm5lZCAlbGxkIiwgX19mdW5jX18sIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGMwNzI5MDEuLjBjZTI1MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNTIxLDEwICs1MjIsMTIgQEAKICAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotCisgICAgVmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBib29sIGRldmljZVZhbGlkT3JDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGJvb2wgc2VuZENhbGxiYWNrcyA9IGZhbHNlOworICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKQEAgLTU0MiwxMSArNTQ1LDE3IEBACiAgICAgICAgICAgICBpZiAoaW9EZXNjLT5nZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfUkVHSVNURVJFRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9SRUdJU1RFUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSAoaW9JbmRleCA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KS5ub3RpZmllZE9uY2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwKQEAgLTU2OCw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogCiAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CkBAIC01ODMsMTEgKzU5MiwxMCBAQAogICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOwogCiAgICAgICAgICAgICBpZiAoZGV2aWNlSWQgIT0gaW9EZXNjLT5nZXREZXZpY2VJZCgpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSBpb0luZGV4ID49IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLApAQCAtNTk4LDI0ICs2MDYsMzQgQEAKIAogICAgICAgICB9IGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotICAgIGJvb2wgY2FsbGJhY2tSZW1vdmVkID0gZmFsc2U7Ci0gICAgLy8gY2FsbGJhY2tzLnNpemUoKSAhPSAwID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyApIHsKLSAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBjYWxsYmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlZCA9IHRydWU7CisKKyAgICAgICAgLy8gc2VuZENhbGxiYWNrcyB0cnVlID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCisgICAgICAgIGlmIChzZW5kQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyAmY2FsbGJhY2tQcm94aWVzID0KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuZWRpdFZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7ICkgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tQcm94aWVzW2ldLT5jYWxsYmFjaygpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGRldmljZSBhY3R1YWxseSBjaGFuZ2VkLCB0aGUgaW5wdXQgb3Igb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBvcGVuZWQgb3IgY2xvc2VkIG9yIHRoZSBjbGllbnQgd2FzIG5ld2x5IHJlZ2lzdGVyZWQgYW5kIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAvLyB3YXMgbmV2ZXIgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGJhY2tQcm94aWVzW2ldLT5ub3RpZmllZE9uY2UoKSB8fCBkZXZpY2VWYWxpZE9yQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzVG9DYWxsLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXNbaV0tPnNldE5vdGlmaWVkT25jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbGJhY2tQcm94aWVzLnNldE5vdGlmaWVkT25jZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIGNsZWFuIHVwIGNhbGxiYWNrIGxpc3Qgd2hpbGUgd2UgYXJlIGhlcmUgaWYgc29tZSBjbGllbnRzIGhhdmUgZGlzYXBwZWFyZWQgd2l0aG91dAotICAgIC8vIHVucmVnaXN0ZXJpbmcgdGhlaXIgY2FsbGJhY2sKLSAgICBpZiAoY2FsbGJhY2tSZW1vdmVkKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGNhbGxiYWNrcyk7CisKKyAgICAvLyBDYWxsYmFja3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBtTG9jayBoZWxkLiBNYXkgbGVhZCB0byBkZWFkIGxvY2sgaWYgY2FsbGluZyBmb3IKKyAgICAvLyBleGFtcGxlIGdldFJvdXRlZERldmljZSB0aGF0IHVwZGF0ZXMgdGhlIGRldmljZSBhbmQgdHJpZXMgdG8gYWNxdWlyZSBtTG9jay4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrc1RvQ2FsbC5zaXplKCk7IGkrKykgeworICAgICAgICBjYWxsYmFja3NUb0NhbGxbaV0tPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CiB9CiAKQEAgLTY3MSwyMCArNjg5LDIxIEBACiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOworICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllczsKKyAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShhdWRpb0lvKTsKICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICBjYWxsYmFja1Byb3hpZXMgPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9Ci0gICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7Ci0KLSAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7CisgICAgY2FsbGJhY2tQcm94aWVzLmFkZChuZXcgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KGNhbGxiYWNrKSk7CisgICAgY2FsbGJhY2tQcm94aWVzLnJlc2V0Tm90aWZpZWRPbmNlKCk7CisgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja1Byb3hpZXMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjkyLDI2ICs3MTEsMjYgQEAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKLQorICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy52YWx1ZUF0KGlvSW5kZXgpOwogICAgIHNpemVfdCBjYkluZGV4OwotICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoY2JJbmRleCA9PSBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgaWYgKGNiSW5kZXggPT0gY2FsbGJhY2tQcm94aWVzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGNhbGxiYWNrcy5yZW1vdmVBdChjYkluZGV4KTsKLSAgICBpZiAoY2FsbGJhY2tzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tzKTsKKyAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoY2JJbmRleCk7CisgICAgaWYgKGNhbGxiYWNrUHJveGllcy5zaXplKCkgIT0gMCkgeworICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrUHJveGllcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlbW92ZUl0ZW0oYXVkaW9Jbyk7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03NzMsNiArNzkyLDcgQEAKICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGFwLT5yZWdpc3RlckNsaWVudChhcGMpOwogICAgICAgICBhcC0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChhcGMtPmlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkpOworICAgICAgICBhcC0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYXBjLT5pc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KIApAQCAtNzg0LDcgKzgwNCw4IEBACiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiIjsKQEAgLTc5OCw3ICs4MTksNyBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTgxMiw3ICs4MzMsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7CkBAIC04MjYsNyArODQ4LDcgQEAKICAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQotICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC04NjksNDAgKzg5MSwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHNlY29uZGFyeU91dHB1dHMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTkyMywxMSArOTQwLDExIEBACiAgICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkLCBzaWxlbmNlZCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQpAQCAtOTcxLDEwICs5ODgsNDIgQEAKICAgICByZXR1cm4gYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCk7Cit9CisKIHVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTExNzQsNiArMTIyMywzOCBAQAogICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGlmIChnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCByZXQgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5hZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY2FsbGJhY2spOworICAgIGlmIChyZXQgPT0gMSkgeworICAgICAgICBhcHMtPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBpZiAoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgcmV0ID0gZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChmYWxzZSk7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewpAQCAtMTI0MiwyMCArMTMyMywzMyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEyNzIsNiArMTM2NiwyMCBAQAogICAgIHJldHVybiBhcHMtPmdldE1hc3Rlck1vbm8obW9ubyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYWYtPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5nZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCiBmbG9hdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lREIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtMTMwNCw2ICsxNDEyLDEwOCBAQAogICAgIHJldHVybiBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+c2V0QXNzaXN0YW50VWlkKHVpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7Cit9CisKK2Jvb2wgQXVkaW9TeXN0ZW06OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSB7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+CisgICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoZm9ybWF0cyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CisgICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihhdHRyVmVjdCksIGVuZChhdHRyVmVjdCksIFsmc3RyZWFtXShjb25zdCBhdXRvICZhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0U3RyZWFtVHlwZSgpID09IHN0cmVhbTsgfSk7CisgICAgICAgIGlmIChpdGVyICE9IGVuZChhdHRyVmVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHBzSWQ7CisgICAgc3RhdHVzX3QgcmV0ID0gQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzKGF0dHIpLCBwc0lkKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJubyBzdHJhdGVneSBmb3VuZCBmb3IgYXR0cmlidXRlcyAlcyIsICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgICAgICBpZiAoc3RyYXRlZ3kuZ2V0SWQoKSA9PSBwc0lkKSB7CisgICAgICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJmF0dHJdKGNvbnN0IGF1dG8gJnJlZkF0dHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkF0dHIuZ2V0QXR0cmlidXRlcygpLCBhdHRyKTsgfSk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXItPmdldFN0cmVhbVR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiaW52YWxpZCBhdHRyaWJ1dGVzICVzIHdoZW4gY29udmVydGluZyB0byBzdHJlYW0iLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhYSxwcm9kdWN0U3RyYXRlZ3kpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgdm9sdW1lR3JvdXApOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApAQCAtMTM1Myw2ICsxNTYzLDQ3IEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suYWRkKGNhbGxiYWNrKTsKKyAgICByZXR1cm4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7Cit9CisKK2ludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpyZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5yZW1vdmVBdChpKTsKKyAgICByZXR1cm4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKQEAgLTEzNjksOSArMTYyMCwxNCBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMTM3OSw3ICsxNjM1LDggQEAKICAgICB9CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTEzOTAsNiArMTY0Nyw5IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc1tpXS0+b25TZXJ2aWNlRGllZCgpOwogICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25TZXJ2aWNlRGllZCgpOworICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggYTM0MTNlMS4uNzg4MWJiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTMxLDkgKzMxLDEwIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKQEAgLTEyMSwyMiArMTIyLDIyIEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgZnJhbWUgY291bnQgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0xNDksMTUgKzE1MCwyNCBAQAogICAgIC8vIEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUlOIDw9IHNhbXBsZVJhdGUgPD0gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NQVguCiAgICAgLy8gUmV0dXJuIGVycm9yIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCi0gICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgQUxPR1YoIiVzKCk6IGdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLy8gc3RhdGljCitib29sIEF1ZGlvVHJhY2s6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX0ZVTkNUSU9OX18pOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlKSB7CkBAIC0yMDIsNyArMjEyLDcgQEAKICAgICAvLyBYWFg6IHNoYWxsIHdlIGdhdGhlciBhbHRlcm5hdGl2ZSBpbmZvIGlmIGZhaWxpbmc/CiAgICAgY29uc3Qgc3RhdHVzX3QgbHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKICAgICBpZiAobHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRCgibm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgKGludCkgbHN0YXR1cyk7CisgICAgICAgIEFMT0dEKCIlcygpOiBubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgKGludCkgbHN0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM1NCw3ICszNjQsOCBAQAogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCksIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KQEAgLTM4Nyw4ICszOTgsMTAgQEAKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAlZCwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIHVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCB1aWQsIHBpZCk7CiAKQEAgLTQwNyw4ICs0MjAsMTAgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlICVzIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQxNiwyMCArNDMxLDIxIEBACiAgICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQzNywxNCArNDUzLDE1IEBACiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogICAgIG1Eb05vdFJlY29ubmVjdCA9IGRvTm90UmVjb25uZWN0OwogCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQ1NSw3ICs0NzIsNyBAQAogICAgIH0KICAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgewogICAgICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIF9fZnVuY19fLCBzdHJlYW1UeXBlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDY0LDE5ICs0ODEsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IgorICAgICAgICAgICAgICAgICIgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayBkZWVwIGJ1ZmZlciBhZnRlciBmbGFncyBoYXZlIGJlZW4gbW9kaWZpZWQgYWJvdmUKLSAgICAgICAgaWYgKGZsYWdzID09IEFVRElPX09VVFBVVF9GTEFHX05PTkUgJiYgKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgfQorICAgICAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MobUF0dHJpYnV0ZXMuZmxhZ3MsICZmbGFncyk7CiAgICAgfQogCiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgpAQCAtNDg4LDE0ICs0OTgsMTQgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC01MDgsOCArNTE4LDkgQEAKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKICAgICAgICAgICAgIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1YoIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAgID8gIk9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICA6ICJOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICAgID8gIiVzKCk6IE9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgorICAgICAgICAgICAgICAgICAgICA6ICIlcygpOiBOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgY2FuJ3Qgd2UgYWxsb3cgZGlyZWN0IEFORCBmYXN0PwogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwpAQCAtNTY1LDE0ICs1NzYsMTQgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNTgyLDcgKzU5Myw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gbWluKG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCiAgICAgICAgICAgICAgICAgbWF4KCh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwogICAgICAgICBBTE9HV19JRihtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAhPSAodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICAiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwpAQCAtNjA5LDggKzYyMSwxMCBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKLSAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7Ci0KKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOworICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1RyYWNrLmgKQEAgLTY1OCw2ICs2NzIsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c3RhcnQoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOwogCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNjk3LDcgKzcxMiw4IEBACiAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2lkZSBoYXMgY29uc3VtZWQgc29tZXRoaW5nLCBidXQgaXMgaXQgZmluaXNoZWQgY29uc3VtaW5nPwogICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgc2luY2UgZmx1c2ggYW5kIHN0b3AgYXJlIGFzeW5jaHJvbm91cyB0aGF0IHRoZSBzZXJ2ZXIKICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHBvaW50LgotICAgICAgICAgICAgQUxPR1YoInN0YXJ0OiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSksCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1GbHVzaGVkLApAQCAtNzU4LDcgKzc3NCw3IEBACiAgICAgICAgIC8vIFN0YXJ0IG91ciBsb2NhbCBWb2x1bWVIYW5kbGVyIGZvciByZXN0b3JhdGlvbiBwdXJwb3Nlcy4KICAgICAgICAgbVZvbHVtZUhhbmRsZXItPnNldFN0YXJ0ZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgbVN0YXRlID0gcHJldmlvdXNTdGF0ZTsKICAgICAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTc3Niw2ICs3OTIsOCBAQAogdm9pZCBBdWRpb1RyYWNrOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc4NSw3ICs4MDMsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiAgICAgICAgIEFMT0dEX0lGKG1TaGFyZWRCdWZmZXIgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAic3RvcCgpIGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBtUmVsZWFzZWQudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtUmVsZWFzZWQudmFsdWUoKSk7CiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCkBAIC04MDYsNiArODI0LDEwIEBACiAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAvLyBFVkVOVF9TVFJFQU1fRU5EIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICB0LT53YWtlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIG1QcmV2aW91c1ByaW9yaXR5KTsKQEAgLTgyMSwxMCArODQzLDEyIEBACiAKIHZvaWQgQXVkaW9UcmFjazo6Zmx1c2goKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODUzLDYgKzg3Nyw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnBhdXNlKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORykgewpAQCAtODc4LDcgKzkwNCw4IEBACiAKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTMyLDEwICs5NTksMTMgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMgcmF0ZToldSIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSksIHJhdGUpOworCiAgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKQorICAgICAgICAgICAgfHwgKG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtOTk3LDggKzEwMjcsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSAoaW5wdXQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIC8vIHBpdGNoIGlzIGVtdWxhdGVkIGJ5IGFkanVzdGluZyBzcGVlZCBhbmQgc2FtcGxlUmF0ZQogICAgIGNvbnN0IHVpbnQzMl90IGVmZmVjdGl2ZVJhdGUgPSBhZGp1c3RTYW1wbGVSYXRlKG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVTcGVlZCA9IGFkanVzdFNwZWVkKHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwpAQCAtMTAwNywzMiArMTAzNywzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjMzLDcgKzEyNjMsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM2MCw3ICsxMzkxLDcgQEAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9UcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcyk7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBtU3RyZWFtVHlwZTsKIH0KQEAgLTEzNzksNyArMTQxMCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzk1LDYgKzE0MjYsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTE0MDcsNyArMTQzOSw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQyNiwxMSArMTQ1OSwxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDM4LDcgKzE0NzQsNyBAQAogCiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOworICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobVN0cmVhbVR5cGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKICAgICB9CkBAIC0xNDc5LDcgKzE1MTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE1MDAsNiArMTUzNyw3IEBACiAgICAgbUFmRnJhbWVDb3VudCA9IG91dHB1dC5hZkZyYW1lQ291bnQ7CiAgICAgbUFmU2FtcGxlUmF0ZSA9IG91dHB1dC5hZlNhbXBsZVJhdGU7CiAgICAgbUFmTGF0ZW5jeSA9IG91dHB1dC5hZkxhdGVuY3lNczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKIAogICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKIApAQCAtMTUwOSwxMyArMTU0NywxMyBAQAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTE1MzQsMTQgKzE1NzIsMTQgQEAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAotICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBtUmVxRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQogICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKQEAgLTE1NjksNyArMTYwNyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0xNjU4LDcgKzE2OTYsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc2OCw3ICsxODA2LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzc4LDcgKzE4MTcsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzk1LDcgKzE4MzQsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODI4LDcgKzE4NjgsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTg1Nyw3ICsxOTA3LDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDgxLDggKzIxMzIsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDk4LDcgKzIxNDksOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjExMCwxOCArMjE2MiwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjE0MSwxNyArMjE5NSwzMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyNDIsOCArMjMxMCw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI4NiwxMCArMjM1NCw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIzMDQsNyArMjM2OSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMzQsMTQgKzIzOTksMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNTksOCArMjQyOCw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM4MCw5ICsyNDQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjQwMCw3ICsyNDcwLDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MjcsNyArMjQ5OCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ2OCw3ICsyNTM5LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI1MTEsNyArMjU4Myw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1NDUsNyArMjYxOCw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTYwLDggKzI2MzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NjksNyArMjY0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgpAQCAtMjU5Myw3ICsyNjY4LDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyByaWdodCBhZnRlciBBdWRpb1RyYWNrIGlzIHN0YXJ0ZWQsIG9uZSBtYXkgbm90IGZpbmQgYSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICBBTE9HVigiZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTI2MDMsNyArMjY3OCw4IEBACiAgICAgICAgICAgICAvLyB0byBiZSB6ZXJvIHdlIGNvbnZlcnQgdGhpcyB0byBXT1VMRF9CTE9DSyAod2l0aCB0aGUgaW1wbGljaXQgbWVhbmluZyBvZgogICAgICAgICAgICAgLy8gInplcm8iIGZvciBOdVBsYXllcikuICBXZSBkb24ndCBjb252ZXJ0IGZvciB0cmFjayByZXN0b3JhdGlvbiBhcyBwb3NpdGlvbgogICAgICAgICAgICAgLy8gZG9lcyBub3QgcmVzZXQuCi0gICAgICAgICAgICBBTE9HVigidGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0LCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKTsKICAgICAgICAgICAgIGlmIChtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCAhPSBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IFdPVUxEX0JMT0NLOwpAQCAtMjYxMSw3ICsyNjg3LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICIlcyglZCk6IGdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CkBAIC0yNjUwLDggKzI3MjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBtYXkgaGF2ZSBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRighbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CkBAIC0yNzE5LDggKzI3OTYsOSBAQAogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKWxpbWl0TnMsIChsb25nIGxvbmcpbVN0YXJ0TnMpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXROcyk7CiAgICAgICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IGxpbWl0TnM7CkBAIC0yNzI4LDcgKzI4MDYsOCBAQAogCiAgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CiAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KQEAgLTI3NDEsNyArMjgyMCw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCiAgICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CkBAIC0yNzYxLDcgKzI4NDEsOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY29tcHV0ZWRTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTI4MDcsMTEgKzI4ODgsMTIgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKG1BdHRyaWJ1dGVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCk7CkBAIC0yODUwLDE4ICsyOTMyLDE4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CkBAIC0yODc0LDcgKzI5NTYsNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yOTg1LDcgKzMwNjcsNyBAQAogICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gd2UncmUgbm90IGFjdGl2ZQogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IEludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0zMDAxLDcgKzMwODMsOCBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgd2FpdCA9ICh0cy5tUG9zaXRpb24gPT0gMCB8fCB0cy5tUG9zaXRpb24gPT0gbVN0YXJ0VHMubVBvc2l0aW9uKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICB0cy5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUcy5tUG9zaXRpb24pOwpAQCAtMzAyMiw3ICszMTA1LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWV0cy5tUG9zaXRpb25bbG9jYXRpb25dLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pOwpAQCAtMzA5Nyw3ICszMTgxLDggQEAKICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoJWQpOiBwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY2VpdmVyLm1Qb3J0SWQsIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAwMWY0MDBkLi5jOTk3Y2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMjYsNiArMjYsMjQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUT0RPOiBjb25zaWRlciBwdWxsaW5nIHRoaXMgaW50byBhIHNoYXJlZCBoZWFkZXIuCisvLyBzYWZlX3N1Yl9vdmVyZmxvdyBpcyB1c2VkIGVuc3VyZSB0aGF0IHN1YnRyYWN0aW9uIG9jY3VycyBpbiB0aGUgc2FtZSBuYXRpdmUgdHlwZQorLy8gd2l0aCBwcm9wZXIgMidzIGNvbXBsZW1lbnQgb3ZlcmZsb3cuICBXaXRob3V0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaXQgaXMgcG9zc2libGUsCisvLyBmb3IgZXhhbXBsZSwgdGhhdCBvcHRpbWl6aW5nIGNvbXBpbGVycyBtYXkgZWxlY3QgdG8gdHJlYXQgMzIgYml0IHN1YnRyYWN0aW9uCisvLyBhcyA2NCBiaXQgc3VidHJhY3Rpb24gd2hlbiBzdG9yaW5nIGludG8gYSA2NCBiaXQgZGVzdGluYXRpb24gYXMgaW50ZWdlciBvdmVyZmxvdyBpcworLy8gdGVjaG5pY2FsbHkgdW5kZWZpbmVkLgordGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgIHR5cGVuYW1lIFUsCisgICAgICAgICB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHN0ZDo6ZGVjYXlfdDxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjYXlfdDxVPj57fT4+CisgICAgICAgICAvLyBlbnN1cmUgYXJndW1lbnRzIGFyZSBzYW1lIHR5cGUgKGlnbm9yaW5nIHZvbGF0aWxlLCB3aGljaCBpcyB1c2VkIGluIGNibGsgdmFyaWFibGVzKS4KK2F1dG8gc2FmZV9zdWJfb3ZlcmZsb3coY29uc3QgVCYgYSwgY29uc3QgVSYgYikgeworICAgIHN0ZDo6ZGVjYXlfdDxUPiByZXN1bHQ7CisgICAgKHZvaWQpX19idWlsdGluX3N1Yl9vdmVyZmxvdyhhLCBiLCAmcmVzdWx0KTsKKyAgICAvLyBub3RlIGlmIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cgcmV0dXJucyB0cnVlLCBhbiBvdmVyZmxvdyBvY2N1cnJlZC4KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvLyB1c2VkIHRvIGNsYW1wIGEgdmFsdWUgdG8gc2l6ZV90LiAgVE9ETzogbW92ZSB0byBhbm90aGVyIGZpbGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHNpemVfdCBjbGFtcFRvU2l6ZShUIHgpIHsKQEAgLTE4Niw3ICsyMDQsNyBAQAogICAgICAgICAgICAgZnJvbnQgPSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgICAgICB9CiAgICAgICAgIC8vIHdyaXRlIHRvIHJlYXIsIHJlYWQgZnJvbSBmcm9udAotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7CkBAIC02ODQsNyArNzAyLDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdGcm9udCA9IChmcm9udCAmIH5tYXNrKSB8IChmbHVzaCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBuZXdGcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBuZXdGcm9udCk7CiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCiAgICAgICAgICAgICAvLyBzbyByZWJhc2luZyBuZXdGcm9udCBvbiB0aGUgZnJvbnQgb2Zmc2V0IGlzIG9mZiBieSB0aGUgb3ZlcmZsb3cgYml0LgpAQCAtNzI2LDcgKzc0NCw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3UmVhciA9IChyZWFyICYgfm1hc2spIHwgKHN0b3AgJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBuZXdSZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cobmV3UmVhciwgZnJvbnQpOwogICAgICAgICAvLyBvdmVyZmxvd0JpdCBpcyB1bnNpZ25lZCwgc28gY2FzdCB0byBzaWduZWQgZm9yIGNvbXBhcmlzb24uCiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCkBAIC03NzgsNyArNzk2LDcgQEAKICAgICAgICAgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgICAgICByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOwogICAgIH0KLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkwNSw3ICs5MjMsNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MzEsNyArOTQ5LDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCiAgICAgfQpAQCAtMTIzMyw2ICsxMjUxLDIxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorc2l6ZV90IEF1ZGlvUmVjb3JkU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1NodXRkb3duKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtQ2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWEzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1ZvbHVtZUdyb3VwIgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgQXVkaW9Wb2x1bWVHcm91cDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgbUdyb3VwSWQgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGU7CisgICAgICAgIGF0dHJpYnV0ZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVzKCkpOworICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgICAgICBtU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1Hcm91cElkKSk7CisgICAgc2l6ZV90IHNpemUgPSBtQXVkaW9BdHRyaWJ1dGVzLnNpemUoKTsKKyAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc2l6ZSk7CisgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogbUF1ZGlvQXR0cmlidXRlcykgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlKGF0dHJpYnV0ZXMpOworICAgICAgICBzdGF0dXNfdCByZXQgPSBhdHRyaWJ1dGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1TdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RyZWFtKSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCA5ZjNiNzQyLi44MjVjZDRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcApAQCAtMjQsMTAgKzI0LDggQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJJQXVkaW9GbGluZ2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTg5LDYgKzg3LDggQEAKICAgICBTWVNURU1fUkVBRFksCiAgICAgRlJBTUVfQ09VTlRfSEFMLAogICAgIEdFVF9NSUNST1BIT05FUywKKyAgICBTRVRfTUFTVEVSX0JBTEFOQ0UsCisgICAgR0VUX01BU1RFUl9CQUxBTkNFLAogfTsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNApAQCAtMjQ0LDYgKzI0NCwzNCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KGJhbGFuY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfQkFMQU5DRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmJhbGFuY2UgPSByZXBseS5yZWFkRmxvYXQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKICAgICB7CkBAIC02MDAsMTQgKzYyOCwxOCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdAogICAgIHsKLSAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZSA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZShwVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZShwVHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihwcmVmZXJyZWRUeXBlRmxhZyk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRUZGRUNUX0RFU0NSSVBUT1IsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC02MzYsMTAgKzY2OCwxMCBAQAogICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3Q7CiAKICAgICAgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgfQogCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtOTEyLDcgKzk0NCw3IEBACiAgICAgICAgIGNhc2UgU0VUX01JQ19NVVRFOgogICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRToKICAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk1MSw5ICs5ODMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9GbGluZ2VyOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENSRUFURV9UUkFDSzogewpAQCAtMTA0OSw2ICsxMDgwLDIxIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggbWFzdGVyTXV0ZSgpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX01BU1RFUl9CQUxBTkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1hc3RlckJhbGFuY2UoZGF0YS5yZWFkRmxvYXQoKSkgKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfTUFTVEVSX0JBTEFOQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBmbG9hdCBmOworICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWFzdGVyQmFsYW5jZSgmZik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICh2b2lkKXJlcGx5LT53cml0ZUZsb2F0KGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CkBAIC0xMjgwLDggKzEzMjYsMTEgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZyA9IGRhdGEucmVhZFVpbnQzMigpOwogICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZ1dWlkLCAmZGVzYyk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZ1dWlkLCAmdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsICZkZXNjKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA4Y2Q0YTg1Li4zYmFjNDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjQsMTEgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1MSwxMCBAQAogICAgIElOSVRfU1RSRUFNX1ZPTFVNRSwKICAgICBTRVRfU1RSRUFNX1ZPTFVNRSwKICAgICBHRVRfU1RSRUFNX1ZPTFVNRSwKKyAgICBTRVRfVk9MVU1FX0FUVFJJQlVURVMsCisgICAgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTLAorICAgIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAorICAgIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAogICAgIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLAogICAgIEdFVF9PVVRQVVRfRk9SX0VGRkVDVCwKICAgICBSRUdJU1RFUl9FRkZFQ1QsCkBAIC02Myw2ICs2Niw3IEBACiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCiAgICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQsCisgICAgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsCiAgICAgTElTVF9BVURJT19QT1JUUywKICAgICBHRVRfQVVESU9fUE9SVCwKICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCkBAIC03OCwxMSArODIsMjYgQEAKICAgICBTVEFSVF9BVURJT19TT1VSQ0UsCiAgICAgU1RPUF9BVURJT19TT1VSQ0UsCiAgICAgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwKKyAgICBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsCiAgICAgU0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9NQVNURVJfTU9OTywKICAgICBHRVRfU1RSRUFNX1ZPTFVNRV9EQiwKICAgICBHRVRfU1VSUk9VTkRfRk9STUFUUywKLSAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQKKyAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsCisgICAgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBTRVRfQVNTSVNUQU5UX1VJRCwKKyAgICBTRVRfQTExWV9TRVJWSUNFU19VSURTLAorICAgIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQsCisgICAgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgR0VUX09GRkxPQURfRk9STUFUU19BMkRQLAorICAgIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTLAorICAgIEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUywKKyAgICBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsCisgICAgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUwogfTsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNApAQCAtOTksNyArMTE4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNyw2ICsxMjcsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0ZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTEyNSwxMyArMTQ2LDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfbmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGVuY29kZWRGb3JtYXQpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CkBAIC0xNzMsMTYgKzE5NiwxNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgb3ZlcnJpZGUKICAgICAgICAgewogICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMDgsNiArMjMyLDEwIEBACiAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIgTlVMTCBwb3J0SWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWNvbmRhcnlPdXRwdXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdHRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjQyLDQ0ICsyNzAsMzQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+cmVzaXplKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS5yZWFkKHNlY29uZGFyeU91dHB1dHMtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnNpemUoKSAqIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwogICAgICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMzM2LDE2ICszNTQsMTMgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAqc2lsZW5jZWQgPSByZXBseS5yZWFkSW50MzIoKSA9PSAxOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNDA3LDEzICs0MjIsNzcgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WT0xVTUVfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZGV2aWNlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVk9MVU1FX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01JTl9WT0xVTUVfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BWF9WT0xVTUVfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0cmVhbSkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRVaW50MzIoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQpAQCAtNTMzLDYgKzYxMiwxNiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1IgPyBzdGF0aWNfY2FzdDxib29sPihyZXBseS5yZWFkSW50MzIoKSkgOiBmYWxzZTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC02NzQsNiArNzYzLDE0IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVELCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZW5hYmxlZCA/IDEgOiAwKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKQEAgLTc1MywxMSArODUwLDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IHBvcnRJZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGUoc291cmNlLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CkBAIC03NzAsMTUgKzg2NywxNSBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX0FVRElPX1NPVVJDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTg3OSw2ICs5NzYsMjc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCisgICAgeworICAgICAgICBpZiAoZm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsaXN0X3NpemUgPSByZXBseS5yZWFkVWludDMyKCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0X3NpemU7IGkrKykgeworICAgICAgICAgICAgZm9ybWF0cy0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihyZXBseS5yZWFkSW50MzIoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKworICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUodHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOworICAgICAgICBkYXRhLndyaXRlKHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNhZ2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUodHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOworICAgICAgICBkYXRhLndyaXRlKHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc291cmNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FTU0lTVEFOVF9VSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChhdXRvIHVpZCA6IHVpZHMpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQTExWV9TRVJWSUNFU19VSURTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdWlkKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBkZXZpY2VzLnNpemUoKTsKKyAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2l6ZSk7CisgICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VzW2ldLndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdWlkKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bVN0cmF0ZWdpZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmF0ZWdpZXM7IGkrKykgeworICAgICAgICAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgICAgICAgICBzdGF0dXMgPSBzdHJhdGVneS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHJlYWQgc3RyYXRlZ2llcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgc3RyYXRlZ2llcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayhzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFhLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBwcm9kdWN0U3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fVk9MVU1FX0dST1VQUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bUdyb3VwcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtR3JvdXBzOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXAgZ3JvdXA7CisgICAgICAgICAgICBzdGF0dXMgPSBncm91cC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHJlYWQgdm9sdW1lIGdyb3VwcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdyb3Vwcy5wdXNoX2JhY2soZ3JvdXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFhLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdm9sdW1lR3JvdXAgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZSwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZSIpOwpAQCAtODk3LDcgKzEyNjcsNiBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOgogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6CiAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDoKLSAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTToKICAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgUkVHSVNURVJfRUZGRUNUOgogICAgICAgICBjYXNlIFVOUkVHSVNURVJfRUZGRUNUOgpAQCAtOTMyLDExICsxMzAxLDE2IEBACiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6CiAgICAgICAgIGNhc2UgUkVHSVNURVJfUE9MSUNZX01JWEVTOgogICAgICAgICBjYXNlIFNFVF9NQVNURVJfTU9OTzoKLSAgICAgICAgY2FzZSBTVEFSVF9BVURJT19TT1VSQ0U6Ci0gICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6CiAgICAgICAgIGNhc2UgR0VUX1NVUlJPVU5EX0ZPUk1BVFM6Ci0gICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOiB7Ci0gICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOgorICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOgorICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6CisgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6CisgICAgICAgIGNhc2UgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFk6CisgICAgICAgIGNhc2UgR0VUX09GRkxPQURfRk9STUFUU19BMkRQOgorICAgICAgICBjYXNlIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUzoKKyAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC05NDgsOSArMTMyMiw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBjaGFyIHRpbWVDaGVja1N0cmluZ1s2NF07Ci0gICAgc25wcmludGYodGltZUNoZWNrU3RyaW5nLCBzaXplb2YodGltZUNoZWNrU3RyaW5nKSwgIklBdWRpb1BvbGljeVNlcnZpY2U6ICVkIiwgY29kZSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRpbWVDaGVja1N0cmluZyk7CisgICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKKyAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOwogCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOiB7CkBAIC05NjEsNiArMTMzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjRm9ybWF0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2Zvcm1hdF90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGlmIChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyIHx8IGRldmljZV9uYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQmFkIEJpbmRlciB0cmFuc2FjdGlvbjogU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFIGZvciBkZXZpY2UgJXUiLCBkZXZpY2UpOwogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+IChCQURfVkFMVUUpKTsKQEAgLTk2OCw3ICsxMzQyLDggQEAKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNGb3JtYXQpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC05OTQsMTMgKzEzNjksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0UgZm9yIGRldmljZSAldSIsIGRldmljZSk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNGb3JtYXQpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xMDYzLDQ4ICsxNDQxLDM5IEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cihoYXNBdHRyaWJ1dGVzID8gJmF0dHIgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0cHV0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0cmVhbSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWNvbmRhcnlPdXRwdXRzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gcmVwbHktPndyaXRlKHNlY29uZGFyeU91dHB1dHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLnNpemUoKSAqIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMTM5LDEwICsxNTA4LDggQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpbGVuY2VkID8gMSA6IDApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMTk4LDcgKzE1NjUsNzQgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1ZPTFVNRV9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGRldmljZSkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9WT0xVTUVfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX01BWF9WT0xVTUVfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTMxMyw2ICsxNzQ3LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgPSAoYXVkaW9fcG9ydF9yb2xlX3QpZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0MzgsNiArMTg4NCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgU0VUX0FVRElPX1ZPTFVNRV9HUk9VUF9DQUxMQkFDS19FTkFCTEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZGF0YS5yZWFkSW50MzIoKSA9PSAxKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKQEAgLTE0OTgsMTcgKzE5NTAsMTcgQEAKICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKCZhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJmhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmcG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMTU4Nyw2ICsyMDM5LDI1MiBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZW5jb2RpbmdGb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgmZW5jb2RpbmdGb3JtYXRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGluZ0Zvcm1hdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuY29kaW5nRm9ybWF0cy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihlbmNvZGluZ0Zvcm1hdHNbaV0pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisKKyAgICAgICAgY2FzZSBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSA9IChhdWRpb191c2FnZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfQVNTSVNUQU5UX1VJRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludDMyX3QgdWlkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnVpZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEFzc2lzdGFudFVpZCh1aWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfQTExWV9TRVJWSUNFU19VSURTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IHVpZHM7CisgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGludDMyX3QgdWlkOworICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpZHMucHVzaF9iYWNrKHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUJvb2woaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOyAgICAKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciBzdHJhdGVnaWVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RyYXRlZ2llcy5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChzdHJhdGVnaWVzW2ldLndyaXRlVG9QYXJjZWwocmVwbHkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0cmlidXRlcy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgc3RyYXRlZ3kpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8aW50PihzdHJhdGVneSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yIGdyb3VwczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGdyb3Vwcy5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChncm91cHNbaV0ud3JpdGVUb1BhcmNlbChyZXBseSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0cmlidXRlcy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGdyb3VwKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oZ3JvdXApKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKaW5kZXggYWQ3ZjFkZS4uNTJkOGNjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTMxLDcgKzMxLDggQEAKICAgICBQT1JUX0xJU1RfVVBEQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBQQVRDSF9MSVNUX1VQREFURSwKICAgICBNSVhfU1RBVEVfVVBEQVRFLAotICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURQorICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURSwKKyAgICBWT0xVTUVfR1JPVVBfQ0hBTkdFRCwKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyLDEyICs1MywzNyBAQAogICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGRhdGEucmVhZCgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBjbGllbnRJbmZvLT5zaWxlbmNlZCA9IGRhdGEucmVhZEJvb2woKTsKIH0KIAotaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CiAgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7CisgICAgZGF0YS53cml0ZSgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBkYXRhLndyaXRlQm9vbChjbGllbnRJbmZvLT5zaWxlbmNlZCk7Cit9CisKK2lubGluZSB2b2lkIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+ICplZmZlY3RzKSB7CisgICAgaW50MzJfdCBudW1FZmZlY3RzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBlZmZlY3Q7CisgICAgICAgIGlmIChkYXRhLnJlYWQoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKCplZmZlY3RzKS5wdXNoX2JhY2soZWZmZWN0KTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGVmZmVjdHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKyAgICAgICAgaWYgKGRhdGEud3JpdGUoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgzLDYgKzEwOSwxNSBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUEFUQ0hfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAorICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihncm91cCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChWT0xVTUVfR1JPVVBfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCiAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtOTIsMTYgKzEyNywyNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CisgICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgY2xpZW50RWZmZWN0cyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBlZmZlY3RzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiB9OwpAQCAtMTI0LDYgKzE2NywxMyBAQAogICAgICAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgVk9MVU1FX0dST1VQX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihkYXRhLnJlYWRVaW50MzIoKSk7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgTUlYX1NUQVRFX1VQREFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIFN0cmluZzggcmVnSWQgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CkBAIC0xMzksMTAgKzE4OSwxNSBAQAogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CiAgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmNsaWVudEVmZmVjdHMpOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmRldmljZUNvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmVmZmVjdHMpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKaW5kZXggYWRmZjA1Ny4uODNhNTY4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApAQCAtMzksNiArMzksNyBAQAogICAgIFBBVVNFLAogICAgIEFUVEFDSF9BVVhfRUZGRUNULAogICAgIFNFVF9QQVJBTUVURVJTLAorICAgIFNFTEVDVF9QUkVTRU5UQVRJT04sCiAgICAgR0VUX1RJTUVTVEFNUCwKICAgICBTSUdOQUwsCiAgICAgQVBQTFlfVk9MVU1FX1NIQVBFUiwKQEAgLTEyNyw2ICsxMjgsMTkgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmVzZW50YXRpb25JZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcm9ncmFtSWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VMRUNUX1BSRVNFTlRBVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMjM5LDYgKzI1MywxMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VMRUNUX1BSRVNFTlRBVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RQcmVzZW50YXRpb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9USU1FU1RBTVA6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA1YzVkYmQ2Li41MzZiMDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSAibWVkaWEvVG9uZUdlbmVyYXRvci5oIgogCiAKQEAgLTEyNDIsNyArMTI0MSw3IEBACiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CiAgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRFRNRjsKICAgICB9Ci0gICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhzdHJlYW1UeXBlLCAmYXR0cik7CisgICAgYXR0ciA9IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKHN0cmVhbVR5cGUpOwogCiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBtUHJvY2Vzc1NpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBBdWRpb1RyYWNrLT5zZXQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKaW5kZXggMDFlMGE3MS4uY2Y5YzdmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbApAQCAtMzYsNCArMzYsMTIgQEAKICAgLyogR2V0IGEgbGlzdCBvZiBjdXJyZW50IGFjdGl2ZSBtaWNyb3Bob25lcy4KICAgICovCiAgIHZvaWQgZ2V0QWN0aXZlTWljcm9waG9uZXMob3V0IE1pY3JvcGhvbmVJbmZvW10gYWN0aXZlTWljcm9waG9uZXMpOworCisgIC8qIFNldCB0aGUgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKS4KKyAgICovCisgIHZvaWQgc2V0TWljcm9waG9uZURpcmVjdGlvbihpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKKworICAvKiBTZXQgdGhlIG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpLgorICAgKi8KKyAgdm9pZCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTM1ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0F0dHJpYnV0ZXMgOiBwdWJsaWMgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIEF1ZGlvQXR0cmlidXRlcygpID0gZGVmYXVsdDsKKyAgICBBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSA6IG1BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHt9CisgICAgQXVkaW9BdHRyaWJ1dGVzKHZvbHVtZV9ncm91cF90IGdyb3VwSWQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIDoKKyAgICAgICAgIG1BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtU3RyZWFtVHlwZShzdHJlYW0pLCBtR3JvdXBJZChncm91cElkKSB7fQorCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cmlidXRlczsgfQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRHcm91cElkKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwSWQ7IH0KKworcHJpdmF0ZToKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIC8qKgorICAgICAqIEBicmllZiBtU3RyZWFtVHlwZTogZm9yIGxlZ2FjeSB2b2x1bWUgbWFuYWdlbWVudCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlCisgICAgICogdG8gYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKi8KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbUdyb3VwSWQ6IGZvciBmdXR1cmUgdm9sdW1lIG1hbmFnZW1lbnQsIGRlZmluZSBncm91cHMgd2l0aGluIGEgc3RyYXRlZ3kgdGhhdCBmb2xsb3dzCisgICAgICogdGhlIHNhbWUgY3VydmVzIG9mIHZvbHVtZSAoZXh0ZW5zaW9uIG9mIHN0cmVhbSB0eXBlcyB0byBtYW5hZ2Ugdm9sdW1lKQorICAgICAqLworICAgIHZvbHVtZV9ncm91cF90IG1Hcm91cElkID0gVk9MVU1FX0dST1VQX05PTkU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDQ2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gcHJvZHVjdF9zdHJhdGVneV90IDogdWludDMyX3Q7Citjb25zdCBwcm9kdWN0X3N0cmF0ZWd5X3QgUFJPRFVDVF9TVFJBVEVHWV9OT05FID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PigtMSk7CisKK3VzaW5nIEF0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19hdHRyaWJ1dGVzX3Q+OwordXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbGhzLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJocykKK3sKKyAgICByZXR1cm4gbGhzLnVzYWdlID09IHJocy51c2FnZSAmJiBsaHMuY29udGVudF90eXBlID09IHJocy5jb250ZW50X3R5cGUgJiYKKyAgICAgICAgICAgIGxocy5mbGFncyA9PSByaHMuZmxhZ3MgJiYgKHN0ZDo6c3RyY21wKGxocy50YWdzLCByaHMudGFncykgPT0gMCk7Cit9Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbGhzLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJocykKK3sKKyAgICByZXR1cm4gIShsaHM9PXJocyk7Cit9CisKK2VudW0gdm9sdW1lX2dyb3VwX3QgOiB1aW50MzJfdDsKK3N0YXRpYyBjb25zdCB2b2x1bWVfZ3JvdXBfdCBWT0xVTUVfR1JPVVBfTk9ORSA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PigtMSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IDMyNGJjYjkuLjZiZDQxMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTkwLDI3ICs5MCwzNCBAQAogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKLQogICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZC4KKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZCBvciB0eXBlLgorICAgICAqCisgICAgICogTG9va3VwIGFuIGVmZmVjdCBieSB1dWlkLCBvciBpZiB0aGF0J3MgdW5zcGVjaWZpZWQgKEVGRkVDVF9VVUlEX05VTEwpLAorICAgICAqIGRvIHNvIGJ5IHR5cGUgYW5kIHByZWZlcnJlZCBmbGFncyBpbnN0ZWFkLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKiAgICAgIHV1aWQ6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHV1aWQuCisgICAgICogICAgICB0eXBlOiAgICAgICBwb2ludGVyIHRvIGVmZmVjdCB0eXBlIHV1aWQuCisgICAgICogICAgICBwcmVmZXJyZWRUeXBlRmxhZ3M6IGlmIG11bHRpcGxlIGVmZmVjdHMgb2YgdGhlIGdpdmVuIHR5cGUgZXhpc3QsCisgICAgICogICAgICAgICAgICAgICAgICBvbmUgd2l0aCBhIG1hdGNoaW5nIHR5cGUgZmxhZyB3aWxsIGJlIGNob3NlbiBvdmVyIG9uZSB3aXRob3V0LgorICAgICAqICAgICAgICAgICAgICAgICAgVXNlIEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB0byBpbmRpY2F0ZSBubyBwcmVmZXJlbmNlLgogICAgICAqICAgICAgZGVzY3JpcHRvcjogYWRkcmVzcyB3aGVyZSB0aGUgZWZmZWN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAqCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKICAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdXVpZCBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKICAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlCiAgICAgICogICAqZGVzY3JpcHRvciB1cGRhdGVkIHdpdGggZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLzsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKICAgICAvKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRlc2NyaXB0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZSBwcm9jZXNzaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKQEAgLTE0NCw2ICsxNTEsMTMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKIAogICAgIC8qCisgICAgICogR2V0cyBhIG5ldyBzeXN0ZW0td2lkZSB1bmlxdWUgZWZmZWN0IGlkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgYWRkcmVzcyB0byByZXR1cm4gdGhlIGdlbmVyYXRlZCBpZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBuZXcgdW5pcXVlIHN5c3RlbS13aWRlIGVmZmVjdCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbmV3RWZmZWN0VW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogU3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZy9yZW1vdmluZyBzeXN0ZW0td2lkZSBlZmZlY3RzLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzb3VyY2Ugb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgc291cmNlOiAgIFRoZSBzb3VyY2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuCisgICAgICogICBpZDogICAgICAgQWRkcmVzcyB3aGVyZSB0aGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBkZWZhdWx0IGVmZmVjdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgc291cmNlLCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogQWRkcyBhbiBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBlZmZlY3QgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGEgc3RyZWFtIG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICogaXMgY3JlYXRlZCwgdGhlIHN5c3RlbSB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgYWRkaW5nIGl0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgIHR5cGVTdHI6ICBUeXBlIHV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdXVpZFN0ciBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyBtYXkgY29ycmVzcG9uZCB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdCwKKyAgICAgKiAgICAgICAgICAgICBvciBjb3VsZCBiZSBzb21lIHZlbmRvci1kZWZpbmVkIHR5cGUuCisgICAgICogICBvcFBhY2thZ2VOYW1lOiBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgICogICB1dWlkU3RyOiAgVXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqICAgICAgICAgICAgIE5vdGUgaWYgYm90aCB1dWlkU3RyIGFuZCB0eXBlU3RyIGFyZSBzcGVjaWZpZWQsIHR5cGVTdHIgaXMgaWdub3JlZC4KKyAgICAgKiAgIHByaW9yaXR5OiBSZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KKyAgICAgKiAgIHVzYWdlOiAgICBUaGUgdXNhZ2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuIFVucmVjb2duaXplZCB2YWx1ZXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgIHRyZWF0ZWQgYXMgQVVESU9fVVNBR0VfVU5LTk9XTi4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzb3VyY2UgdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGVmZmVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgYSBkZWZhdWx0LgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8qCiAgICAgICogRXZlbnRzIHVzZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb24gKGVmZmVjdF9jYWxsYmFja190KS4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAppbmRleCBjZjdkOTBmLi40MWI0MjVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtMTgsMTcgKzE4LDE5IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0gKIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJQcm92aWRlcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTQxLDYgKzQzLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorbmFtZXNwYWNlIE5CTG9nIHsKK2NsYXNzIFdyaXRlcjsKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb01peGVyCkBAIC03Myw2ICs3OSw5IEBACiAgICAgICAgIERPV05NSVhfVFlQRSAgICA9IDBYNDAwNCwKICAgICAgICAgTUlYRVJfRk9STUFUICAgID0gMHg0MDA1LCAvLyBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCiAgICAgICAgIE1JWEVSX0NIQU5ORUxfTUFTSyA9IDB4NDAwNiwgLy8gQ2hhbm5lbCBtYXNrIGZvciBtaXhlciBvdXRwdXQKKyAgICAgICAgLy8gZm9yIGhhcHRpYworICAgICAgICBIQVBUSUNfRU5BQkxFRCAgPSAweDQwMDcsIC8vIFNldCBoYXB0aWMgZGF0YSBmcm9tIHRoaXMgdHJhY2sgc2hvdWxkIGJlIHBsYXllZCBvciBub3QuCisgICAgICAgIEhBUFRJQ19JTlRFTlNJVFkgPSAweDQwMDgsIC8vIFNldCB0aGUgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljIGRhdGEuCiAgICAgICAgIC8vIGZvciB0YXJnZXQgUkVTQU1QTEUKICAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLCAvLyBDb25maWd1cmUgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBvbiB0aGlzIHRyYWNrIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgdGhlIG5ldyBzYW1wbGUgcmF0ZSBpbiBIei4KQEAgLTk1LDYgKzEwNCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIGEgcG9pbnRlciB0byB0aGUgbmV3IHBsYXliYWNrIHJhdGUuCiAgICAgfTsKIAorICAgIHR5cGVkZWYgZW51bSB7IC8vIEhhcHRpYyBpbnRlbnNpdHksIHNob3VsZCBrZWVwIGNvbnNpc3RlbnQgd2l0aCBWaWJyYXRvclNlcnZpY2UKKyAgICAgICAgSEFQVElDX1NDQUxFX01VVEUgPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9NVVRFLAorICAgICAgICBIQVBUSUNfU0NBTEVfVkVSWV9MT1cgPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9WRVJZX0xPVywKKyAgICAgICAgSEFQVElDX1NDQUxFX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX0xPVywKKyAgICAgICAgSEFQVElDX1NDQUxFX05PTkUgPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9OT05FLAorICAgICAgICBIQVBUSUNfU0NBTEVfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX0hJR0gsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0ggPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9WRVJZX0hJR0gsCisgICAgfSBoYXB0aWNfaW50ZW5zaXR5X3Q7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBIQVBUSUNfU0NBTEVfVkVSWV9MT1dfUkFUSU8gPSAyLjBmIC8gMy4wZjsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9MT1dfUkFUSU8gPSAzLjBmIC8gNC4wZjsKKyAgICBzdGF0aWMgY29uc3QgY29uc3RleHByIGZsb2F0IEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUID0gMS4wZjsKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkSGFwdGljSW50ZW5zaXR5KGhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgc3dpdGNoIChoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTVVURToKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTk9ORToKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfSElHSDoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBBdWRpb01peGVyKHNpemVfdCBmcmFtZUNvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQogICAgICAgICA6IG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCiAgICAgICAgICwgbUZyYW1lQ291bnQoZnJhbWVDb3VudCkgewpAQCAtMTMyLDcgKzE2NywxNSBAQAogICAgIHZvaWQgICAgICAgIHNldEJ1ZmZlclByb3ZpZGVyKGludCBuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBidWZmZXJQcm92aWRlcik7CiAKICAgICB2b2lkICAgICAgICBwcm9jZXNzKCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7CisgICAgICAgICAgICAvLyBDbGVhciBjb250cmFjdGVkIGJ1ZmZlciBiZWZvcmUgcHJvY2Vzc2luZyBpZiBjb250cmFjdGVkIGNoYW5uZWxzIGFyZSBzYXZlZAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgaWYgKHQtPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgdC0+Y2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgKHRoaXMtPiptSG9vaykoKTsKKyAgICAgICAgcHJvY2Vzc0hhcHRpY0RhdGEoKTsKICAgICB9CiAKICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdDsKQEAgLTIzMCw2ICsyNzMsOCBAQAogICAgICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQpAQCAtMjQ0LDYgKzI4OSwxMSBAQAogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOwogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcyk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKKyAgICAgICAgdm9pZCAgICAgICAgY2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CiAgICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKICAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIApAQCAtMjk3LDE3ICszNDcsMjIgQEAKICAgICAgICAgICogYWxsIHByZS1taXhlciB0cmFjayBidWZmZXIgY29udmVyc2lvbnMgb3V0c2lkZSB0aGUgQXVkaW9NaXhlciBjbGFzcy4KICAgICAgICAgICoKICAgICAgICAgICogMSkgbUlucHV0QnVmZmVyUHJvdmlkZXI6IFRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgICogMikgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KKyAgICAgICAgICogMikgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6IEV4cGVuZCBvciBjb250cmFjdHMgZGF0YQorICAgICAgICAgKiAzKSBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOiBOb24tZGVzdHJ1Y3RpdmVseSBhZGp1c3Qgc2FtcGxlIGRhdGEKKyAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgLy8gVE9ETzogY29tYmluZSBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGFuZCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKQEAgLTMzNiw2ICszOTEsNTEgQEAKIAogICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOwogCisgICAgICAgIC8vIEhhcHRpYworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICBoYXB0aWNfaW50ZW5zaXR5X3QgICBtSGFwdGljSW50ZW5zaXR5OworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3RJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7CisKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljU2NhbGVHYW1tYSgpIGNvbnN0IHsKKyAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgorICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMi4wZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIDEuNWY7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIDAuMjVmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCkgY29uc3QgeworICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCisgICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfVkVSWV9MT1dfUkFUSU87CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfTE9XX1JBVElPOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMS4wZjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIGhvb2tzCiAgICAgICAgIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CkBAIC0zNzIsNiArNDcyLDggQEAKICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CiAgICAgdm9pZCBwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKTsKIAorICAgIHZvaWQgcHJvY2Vzc0hhcHRpY0RhdGEoKTsKKwogICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmluZGV4IDk2N2Q4OTUuLjI0ODM3ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwogCisgICAgLy8gIGtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQ6IFByZWZlcnJlZCBhdWRpbyBsYW5ndWFnZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDsKKwogICAgIC8vICBrZXlTdHJlYW1Db25uZWN0IC8gRGlzY29ubmVjdDogdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtQ29ubmVjdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbURpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKaW5kZXggOGRhMDA2OS4uYmY4ZDYyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApAQCAtNDksMTMgKzQ5LDMwIEBACiAjZGVmaW5lIE1JWF9TVEFURV9JRExFIDAKICNkZWZpbmUgTUlYX1NUQVRFX01JWElORyAxCiAKKy8qKiBDb250cm9sIHRvIHdoaWNoIGRldmljZSBzb21lIGF1ZGlvIGlzIHJlbmRlcmVkICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX1JFTkRFUiAweDEKKy8qKiBMb29wIGJhY2sgc29tZSBhdWRpbyBpbnN0ZWFkIG9mIHJlbmRlcmluZyBpdCAqLwogI2RlZmluZSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgKDB4MSA8PCAxKQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIHdoaWxlIGl0IGlzIHJlbmRlcmVkICovCisjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0FMTCAoTUlYX1JPVVRFX0ZMQUdfUkVOREVSIHwgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKQogCiAjZGVmaW5lIE1BWF9NSVhFU19QRVJfUE9MSUNZIDEwCiAjZGVmaW5lIE1BWF9DUklURVJJQV9QRVJfTUlYIDIwCiAKK2NsYXNzIEF1ZGlvRGV2aWNlVHlwZUFkZHIgeworcHVibGljOgorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoKSB7fQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykge30KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBtVHlwZTsKKyAgICBTdHJpbmc4IG1BZGRyZXNzOworfTsKKwogY2xhc3MgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiB7CiBwdWJsaWM6CiAgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbigpIHt9CkBAIC04Nyw3ICsxMDQsMTAgQEAKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKLSAgICBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOworICAgIHZvaWQgc2V0RXhjbHVkZVVpZCh1aWRfdCB1aWQpIGNvbnN0OworICAgIHZvaWQgc2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdDsKKworICAgIG11dGFibGUgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG1Dcml0ZXJpYTsKICAgICB1aW50MzJfdCAgICAgICAgbU1peFR5cGU7CiAgICAgYXVkaW9fY29uZmlnX3QgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgIG1Sb3V0ZUZsYWdzOwpAQCAtMTAzLDYgKzEyMywxMSBAQAogI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDEKICNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QICAwCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19taXhfbG9vcGJhY2tfcmVuZGVyKHVpbnQzMl90IHJvdXRlRmxhZ3MpIHsKKyAgICByZXR1cm4gKHJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUikKKyAgICAgICAgICAgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVI7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19QT0xJQ1lfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU5NTQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXwotI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLXN0YXRpYyBpbmxpbmUKLWF1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIG1lbXNldChhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgYXR0ci0+ZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8vIGF0dHJpYnV0ZXMgaW4gY29tbW9uIHdpdGggU1RSRUFNX1NZU1RFTQotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BTEFSTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBhdHRyLT5mbGFncyB8PSBBVURJT19GTEFHX1NDTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVkIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgc3RyZWFtVHlwZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0MTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1Byb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3koKSB7fQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBpZCkgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbUlkKGlkKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvQXR0cmlidXRlczsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGF0dHJpYnV0ZXNNYXRjaGVzOiBjaGVja3MgaWYgY2xpZW50IGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIGEgcmVmZXJlbmNlIGF0dHJpYnV0ZXMKKyAgICAgKiAibWF0Y2hpbmciIG1lYW5zIHRoZSB1c2FnZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIHVzYWdlLCBBTkQKKyAgICAgKiBjb250ZW50IHR5cGUgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCBjb250ZW50IHR5cGUgQU5ECisgICAgICogZmxhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgZmxhZ3MgQU5ECisgICAgICogdGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCB0YWdzLgorICAgICAqIFJlZmVyZW5jZSBhdHRyaWJ1dGVzICJkZWZhdWx0IiBzaGFsbCBub3QgYmUgY29uc2lkZXJlZCBhcyBhICJ0cnVlIiBjYXNlLiBUaGlzIGNvbnZlbnRpb24KKyAgICAgKiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IHN0cmF0ZWd5LgorICAgICAqIEBwYXJhbSByZWZBdHRyaWJ1dGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gY2xpZW50QXR0cml0dWJlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIG1hdGNoaW5nLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBhdHRyaWJ1dGVzTWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgcmVmQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgY2xpZW50QXR0cml0dWJlcyk7Citwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gbUF1ZGlvQXR0cmlidXRlczsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUlkOworfTsKKwordXNpbmcgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1Byb2R1Y3RTdHJhdGVneT47CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDgwNjI4MGEuLjQ3MDdjNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTUzNCw5ICs1MzQsMjMgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAotICAgIC8qCi0gICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAvKiBTZXQgdGhlIE1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCiAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKworICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSB6b29tIGZhY3RvciAoZm9yIHByb2Nlc3NpbmcgcHVycG9zZXMpLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1JlY29yZCBpbnN0YW5jZSBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9SZWNvcmQgaW5zdGFuY2UgaWYgdGhlIGNvbm5lY3Rpb24gdG8gYXVkaW9zZXJ2ZXIgaXMgcmVzdG9yZWQuCisgICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgICAgIC8qCisgICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCisgICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiBwcml2YXRlOgpAQCAtNjU0LDYgKzY2OCw3IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAgICAgbU9yaWdGbGFnczsgICAgICAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIG9yIHNldCgpLCBjb25zdAogCiAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKIAogICAgIC8vIE5leHQgNSBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMApAQCAtNjYyLDcgKzY3Nyw3IEBACiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGZyb20gQXVkaW9TeXN0ZW06OmdldElucHV0Zm9yQXR0cigpCiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgIC8vIGJlZm9yZSBzdGFydCgpCiAgICAgU2NoZWRQb2xpY3kgICAgICAgICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwOwpAQCAtNzA0LDcgKzcxOSw3IEBACiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6Ci0gICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW9yZWNvcmQiKSksCisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvcmVjb3JkIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1DcmVhdGVkTnMoc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydGVkTnMoMCksIG1EdXJhdGlvbk5zKDApLCBtQ291bnQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RFcnJvcihOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDRjMGY3OTYuLmU2NGYyODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgpAQCAtMzUsOSArMzcsMTQgQEAKIAogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7CiB0eXBlZGVmIHZvaWQgKCpkeW5hbWljX3BvbGljeV9jYWxsYmFjaykoaW50IGV2ZW50LCBTdHJpbmc4IHJlZ0lkLCBpbnQgdmFsKTsKLXR5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogY2xhc3MgSUF1ZGlvRmxpbmdlcjsKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC0yMDQsMTIgKzIxMSwxNCBAQAogICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCiAgICAgLy8KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKQEAgLTIyMywxNiArMjMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVSZWNvcmQoKSwKICAgICAvLyBvciByZWxlYXNlIGl0IHdpdGggcmVsZWFzZUlucHV0KCkuCkBAIC0yNDcsOCArMjUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMjYxLDYgKzI2NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CisKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKQEAgLTMyNywxOSArMzQxLDI5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSk7CisKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCkBAIC0zNDksOCArMzczLDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSk7CisKKyAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworCiAgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CkBAIC0zNzgsNiArNDM0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKICAgICB9OwogCisgICAgY2xhc3MgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5IDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrKQorICAgICAgICAgICAgICA6IG1DYWxsYmFjayhjYWxsYmFjaykge30KKyAgICAgICAgICB+QXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KCkgb3ZlcnJpZGUge30KKworICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrLnByb21vdGUoKTsgfTsKKworICAgICAgICAgIGJvb2wgbm90aWZpZWRPbmNlKCkgY29uc3QgeyByZXR1cm4gbU5vdGlmaWVkT25jZTsgfQorICAgICAgICAgIHZvaWQgc2V0Tm90aWZpZWRPbmNlKCkgeyBtTm90aWZpZWRPbmNlID0gdHJ1ZTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgbU5vdGlmaWVkT25jZSBpdCBmb3JjZXMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHdoZW4KKyAgICAgICAgICogcmVnaXN0ZXJlZCB3aXRoIGEgVkFMSUQgQXVkaW9EZXZpY2UsIGFuZCBhbGxvd3Mgbm90IHRvIGZsb29kIG90aGVyIGxpc3RlbmVycworICAgICAgICAgKiBvbiB0aGlzIGlvaGFuZGxlIHRoYXQgYWxyZWFkeSBrbm93IHRoZSB2YWxpZCBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICAgYm9vbCBtTm90aWZpZWRPbmNlID0gZmFsc2U7CisgICAgICAgICB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgfTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCkBAIC00MjEsOCArNDk5LDI3IEBACiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+ID4gICBtSW9EZXNjcmlwdG9yczsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKKworICAgICAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5Pj4KKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBicmllZiBub3RpZmllZE9uY2UgZW5zdXJlcyB0aGF0IGlmIGEgY2xpZW50IGFkZHMgYSBjYWxsYmFjaywgaXQgbXVzdCBhdCBsZWFzdCBiZQorICAgICAgICAgICAgICogY2FsbGVkIG9uY2Ugd2l0aCB0aGUgZGV2aWNlIG9uIHdoaWNoIGl0IHdpbGwgYmUgcm91dGVkIHRvLgorICAgICAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGFscmVhZHkgbm90aWZpZWQgb3Igbm9ib2R5IHdhaXRzIGZvciBhIGNhbGxiYWNrLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvb2wgbm90aWZpZWRPbmNlKCkgY29uc3QgeyByZXR1cm4gKHNpemUoKSA9PSAwKSB8fCBtTm90aWZpZWRPbmNlOyB9CisgICAgICAgICAgICB2b2lkIHNldE5vdGlmaWVkT25jZSgpIHsgbU5vdGlmaWVkT25jZSA9IHRydWU7IH0KKyAgICAgICAgICAgIHZvaWQgcmVzZXROb3RpZmllZE9uY2UoKSB7IG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBAYnJpZWYgbU5vdGlmaWVkT25jZSBpdCBmb3JjZXMgZWFjaCBjYWxsYmFjayB0byBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB3aGVuCisgICAgICAgICAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBWQUxJRCBBdWRpb0RldmljZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sIG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsKKyAgICAgICAgfTsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcz4KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXM7CiAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBnZXRJbnB1dEJ1ZmZlclNpemUoKSBxdWVyaWVzCiAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZTaXplOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JblNhbXBsaW5nUmF0ZTsKQEAgLTQ0MiwyMSArNTM5LDMxIEBACiAgICAgICAgIGludCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgYm9vbCBpc0F1ZGlvUG9ydENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKSAhPSAwKTsgfQogCisgICAgICAgIGludCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBpbnQgcmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCkgIT0gMCk7IH0KKwogICAgICAgICAvLyBEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKIAogICAgICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Qb3J0Q2FsbGJhY2s+ID4gICAgbUF1ZGlvUG9ydENhbGxiYWNrczsKKyAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiA+IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s7CiAgICAgfTsKIAogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IDQ5OGRlOGUuLmU1OTI1ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTEzNSw4ICsxMzUsMjMgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGRvdWJsZSBnZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0TGF0ZW5jeU1zKHNhbXBsZVJhdGUsIExPQ0FUSU9OX1NFUlZFUiwgTE9DQVRJT05fS0VSTkVMKTsKKyAgICB9CisKKyAgICBkb3VibGUgZ2V0TGF0ZW5jeU1zKHVpbnQzMl90IHNhbXBsZVJhdGUsIExvY2F0aW9uIGxvY2F0aW9uMSwgTG9jYXRpb24gbG9jYXRpb24yKSBjb25zdCB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID4gMCAmJiBtVGltZU5zW2xvY2F0aW9uMV0gPiAwICYmIG1UaW1lTnNbbG9jYXRpb24yXSA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmZXJlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uW2xvY2F0aW9uMV0gLSBtUG9zaXRpb25bbG9jYXRpb24yXTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZlcmVuY2VOcyA9CisgICAgICAgICAgICAgICAgICAgIG1UaW1lTnNbbG9jYXRpb24xXSAtIG1UaW1lTnNbbG9jYXRpb24yXTsKKyAgICAgICAgICAgIHJldHVybiAoKGRvdWJsZSlmcmFtZURpZmZlcmVuY2UgKiAxZTkgLyBzYW1wbGVSYXRlIC0gdGltZURpZmZlcmVuY2VOcykgKiAxZS02OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwLjsKKyAgICB9CisKICAgICAvLyBjb252ZXJ0IGZpZWxkcyB0byBhIHByaW50YWJsZSBzdHJpbmcKLSAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIHsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAKICAgICAgICAgc3MgPDwgIkJPT1RUSU1FIG9mZnNldCAiIDw8IG1UaW1lYmFzZU9mZnNldFtUSU1FQkFTRV9CT09UVElNRV0gPDwgIlxuIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggNTljNmY0Yy4uMTJmNWQ3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTc0LDYgKzc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXBwaW5nIGZyb20gZnJhbWUgcG9zaXRpb24gdG8gcHJlc2VudGF0aW9uIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgQXVkaW9UaW1lc3RhbXAgZm9yIHRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlZCB3aXRoIGV2ZW50LgogI2VuZGlmCisgICAgICAgIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEgPSA5LC8vIE5vdGlmaWNhdGlvbiB0aGF0IG1vcmUgZGF0YSBjYW4gYmUgZ2l2ZW4gYnkgd3JpdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBvbmx5IG9jY3VycyBmb3IgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSy4KICAgICB9OwogCiAgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIHRoZSBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCkBAIC0xNDUsNiArMTQ3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpOwogCisgICAgLyogQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciB0aGUgZ2l2ZW4gYXVkaW8gY29uZmlndXJhdGlvbiBhbmQgYXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBvdXRwdXQgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKKwogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIHRvIEF1ZGlvVHJhY2sKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewpAQCAtMTUzLDYgKzE2MSw3IEBACiAgICAgICAgIFRSQU5TRkVSX09CVEFJTiwgICAgLy8gY2FsbCBvYnRhaW5CdWZmZXIoKSBhbmQgcmVsZWFzZUJ1ZmZlcigpCiAgICAgICAgIFRSQU5TRkVSX1NZTkMsICAgICAgLy8gc3luY2hyb25vdXMgd3JpdGUoKQogICAgICAgICBUUkFOU0ZFUl9TSEFSRUQsICAgIC8vIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSywgLy8gc3luY2hyb25vdXMgd3JpdGUoKSwgbm90aWYgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQQogICAgIH07CiAKICAgICAvKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9UcmFjay4gTm8gY29ubmVjdGlvbiB3aXRoCkBAIC0yOTUsNiArMzA0LDggQEAKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvVHJhY2sgY29uc3RydWN0b3JzIGFib3ZlOgogICAgICAqCiAgICAgICogdGhyZWFkQ2FuQ2FsbEphdmE6ICBXaGV0aGVyIGNhbGxiYWNrcyBhcmUgbWFkZSBmcm9tIGFuIGF0dGFjaGVkIHRocmVhZCBhbmQgdGh1cyBjYW4gY2FsbCBKTkkuCisgICAgICogICAgICBPbmx5IHNldCB0byB0cnVlIHdoZW4gQXVkaW9UcmFjayBvYmplY3QgaXMgdXNlZCBmb3IgYSBqYXZhIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjaworICAgICAqICAgICAgaW4gaXRzIEpOSSBjb2RlLgogICAgICAqCiAgICAgICogSW50ZXJuYWwgc3RhdGUgcG9zdCBjb25kaXRpb246CiAgICAgICogICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIGltcGxpZXMgdGhpcyBBdWRpb1RyYWNrIGhhcyB2YWxpZCBhdHRyaWJ1dGVzCkBAIC05MDcsNyArOTE4LDE0IEBACiAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfQUNUSVZFIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgIH0KLXByb3RlY3RlZDoKKworICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1RyYWNrIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAqIFRoZSBJRCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBhdWRpb3NlcnZlciBjbGllbnRzIGFuZCBjYW4gY2hhbmdlIGR1cmluZyB0aGUgbGlmZSBjeWNsZQorICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9UcmFjayBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgKi8KKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0UG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfTsKKworIHByb3RlY3RlZDoKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHRyYWNrcyBpcyBub3QgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CkBAIC0xMDAzLDcgKzEwMjEsNyBAQAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOyAgICAgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBmcm9tIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YTsKQEAgLTEwNTgsNiArMTA3NiwxOSBAQAogICAgICAgICBTVEFURV9TVE9QUElORywKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGU7CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0YXRlVG9TdHJpbmcoU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfQUNUSVZFOiAgICAgICAgICByZXR1cm4gIlNUQVRFX0FDVElWRSI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogICAgICAgICAgcmV0dXJuICJTVEFURV9QQVVTRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9TVE9QUElORzogcmV0dXJuICJTVEFURV9QQVVTRURfU1RPUFBJTkciOworICAgICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9GTFVTSEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUElORzogICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBJTkciOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKQEAgLTExNDgsNiArMTE3OSw3IEBACiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKQEAgLTExOTUsNyArMTIyNyw3IEBACiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6Ci0gICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW90cmFjayIpKSB7CisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdHJhY2siKSkgewogICAgICAgICB9CiAgICAgICAgIH5NZWRpYU1ldHJpY3MoKSB7CiAgICAgICAgICAgICAvLyBtQW5hbHl0aWNzSXRlbSBhbGxvYyBmYWlsdXJlIHdpbGwgYmUgZmxhZ2dlZCBpbiB0aGUgY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ZWEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwIDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1ZvbHVtZUdyb3VwKCkge30KKyAgICBBdWRpb1ZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVzVmVjdG9yICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUdyb3VwSWQoZ3JvdXApLCBtQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtU3RyZWFtcyhzdHJlYW1zKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwSWQ7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXM7IH0KKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbXM7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXBJZCA9IFZPTFVNRV9HUk9VUF9OT05FOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIG1TdHJlYW1zOworfTsKKwordXNpbmcgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvVm9sdW1lR3JvdXA+OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IGU2YmY3MmYuLmVmMGVkMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0xNDYsNiArMTQ2LDcgQEAKICAgICAgICAgICAgIGFmU2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZEludDY0KCk7CiAgICAgICAgICAgICBhZkxhdGVuY3lNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Myw2ICsxNjQsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE3OSw2ICsxODEsNyBAQAogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKQEAgLTI3MSw2ICsyNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTI5Nyw2ICszMDEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMzEzLDYgKzMxOCw3IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0SWQ7CiAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvLyBpbnZhcmlhbnQgb24gZXhpdCBmb3IgYWxsIEFQSXMgdGhhdCByZXR1cm4gYW4gc3A8PjoKQEAgLTM1Myw2ICszNTksOSBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QgPSAwOworCiAgICAgLyogc2V0L2dldCBzdHJlYW0gdHlwZSBzdGF0ZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgYnkKICAgICAgKiB0aGUgcHJlZmVyZW5jZSBwYW5lbCwgbW9zdGx5LgogICAgICAqLwpAQCAtNDI4LDcgKzQzNyw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYzM4NzZhZi4uMzU1NDBmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIwLDE1ICsyMCwxNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLQogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDUsMTIgKzQ0LDE0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKQEAgLTY1LDE2ICs2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODUsOCArODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtOTgsNiArOTMsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkgPSAwOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CkBAIC0xMTUsMTAgKzEyMSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOwogICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCiAgICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nIG9yIG9mZmxvYWQgcHJvcGVydHkgaXMgZW5hYmxlZAogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pID0gMDsKIAorICAgIC8vIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzYW1wbGUgcmF0ZSwgY2hhbm5lbCBtYXNrIGFuZCBmbGFncy4KKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKKwogICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE0Nyw2ICsxNzEsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKQEAgLTE1NywxMCArMTgzLDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgICAgICAgICA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKSA9IDA7CkBAIC0xNzEsNyArMjAyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgPSAwOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZTBkMjQ5NS4uNzkwMDhjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTE3LDEwICsxNywxNCBAQAogI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogCisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDYgKzM0LDggQEAKICAgICB1aWRfdCB1aWQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydF9pZDsKKyAgICBib29sIHNpbGVuY2VkOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OwpAQCAtNDEsNiArNDcsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KTsKIAorICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIHZvbHVtZSBncm91cAorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwYXRjaCBjb25maWd1cmF0aW9uLgpAQCAtNTEsOCArNTksMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDk0YWZlM2MuLjA2ZTc4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTcwLDYgKzcwLDkgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTZmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTlkNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFjYjU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzIwMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1OTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgewotICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDg4NDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YmU3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1N2Q2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZhNTAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMDA4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmIwMzJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZkYWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDBlNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2JkNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7Ci0gICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZDhhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1Jbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXQuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Ci11c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKLXVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Ci11c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsOwotCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKLSAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwotICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCi0gICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKLSAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOwotICAgIHZvaWQgb25FcnJvcigpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwotCi0gICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTA3ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE4ZDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhiMWFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZGVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI3NTA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lTG9jYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLS8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCi1zdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCi0gICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOwotICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOwotICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8Ci0gICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbEFkZHJlc3M7Ci19Ci0KLS8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCi0KLWF1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgewotICAgIHN3aXRjaCAobWFwcGluZykgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjptaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyM2E4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLSAgICBzdGF0aWMgdm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIFY0XzAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2NhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gVE9ETzogY2hhbmdlIHRoZSBBUEkgc28gdGhhdCBjb250ZXh0IGFuZCBrdlBhaXJzIGFyZSBzZXBhcmF0ZWQKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobURldmljZSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKG1EZXZpY2UsCi0gICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBta0VudW1Db252ZXJ0ZXI8QXVkaW9PdXRwdXRGbGFnPihmbGFncyksCi0gICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKLSAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCi0gICAgU2lua01ldGFkYXRhIG1ldGFkYXRhID0ge3t7QXVkaW9Tb3VyY2Uoc291cmNlKSwgMX19fTsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7Ci0gICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwotICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyMTc1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NWRkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzQxYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzE5NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ODg5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYxZWM3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRlZGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxYzUyMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2M4OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU3OGM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWM0YzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRkYWIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWQ3ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJmNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBtU3RyZWFtLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgotc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgewotICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OwotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhMGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTZiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNzUwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNzIwMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NmMyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KLVJldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1SZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNmRlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGI3YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDNhNWRmMjcuLjU4NGMyYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtOCwxNiArOCwyMCBAQAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAogICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCA0YzhlYWY2Li5mODYwMDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwxOSArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNS4wL0lEZXZpY2VzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjVfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gVjVfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKKyAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWNF8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICAgICAgcmV0dXJuIFYyXzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IGVhZDFmYTIuLmJkM2VmNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE2LDIwICsxNiwyMiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC81LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNV8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlY1XzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNF8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjJfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1MzNkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMiBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049MiIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANS4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NSIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGE1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKKyAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKKyAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKKyAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCisgICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgorICAgIFN0cmluZzggdmFsdWU7CisgICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKKyAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOworICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKKyAgICB9CisgICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Cit9CisKK0NvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCisgICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8CisgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbEFkZHJlc3M7Cit9CisKKy8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCisKK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7CisgICAgfQorfQorCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9sb2NhdGlvbl90IGxvY2F0aW9uVG9IYWwoQXVkaW9NaWNyb3Bob25lTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWV9NT1ZBQkxFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFlfTU9WQUJMRTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6UEVSSVBIRVJBTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1BFUklQSEVSQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGxvY2F0aW9uVG9IYWwgY29udmVyc2lvbiAlZCIsIGxvY2F0aW9uKTsKKyAgICB9Cit9CitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOworICAgIH0KK30KKwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KSB7CisgICAgaWYgKHBEc3QgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihwRHN0LT5kZXZpY2VfaWQsIHNpemVvZihwRHN0LT5kZXZpY2VfaWQpLAorICAgICAgICAgICAgICAgICAiJXMiLCBzcmMuZGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIHBEc3QtPmRldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3JjLmRldmljZUFkZHJlc3MuZGV2aWNlKTsKKyAgICAgICAgc25wcmludGYocERzdC0+YWRkcmVzcywgc2l6ZW9mKHBEc3QtPmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAiJXMiLCBkZXZpY2VBZGRyZXNzVG9IYWwoc3JjLmRldmljZUFkZHJlc3MpLmNfc3RyKCkpOworICAgICAgICBpZiAoc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlenUgY2hhbm5lbE1hcHBpbmcgZWxlbWVudHMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpLCBBVURJT19DSEFOTkVMX0NPVU5UX01BWCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNoOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpICYmIGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBjaGFubmVsTWFwcGluZ1RvSGFsKHNyYy5jaGFubmVsTWFwcGluZ1tjaF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmxvY2F0aW9uID0gbG9jYXRpb25Ub0hhbChzcmMubG9jYXRpb24pOworICAgICAgICBwRHN0LT5ncm91cCA9IChhdWRpb19taWNyb3Bob25lX2dyb3VwX3Qpc3JjLmdyb3VwOworICAgICAgICBwRHN0LT5pbmRleF9pbl90aGVfZ3JvdXAgPSAodW5zaWduZWQgaW50KXNyYy5pbmRleEluVGhlR3JvdXA7CisgICAgICAgIHBEc3QtPnNlbnNpdGl2aXR5ID0gc3JjLnNlbnNpdGl2aXR5OworICAgICAgICBwRHN0LT5tYXhfc3BsID0gc3JjLm1heFNwbDsKKyAgICAgICAgcERzdC0+bWluX3NwbCA9IHNyYy5taW5TcGw7CisgICAgICAgIHBEc3QtPmRpcmVjdGlvbmFsaXR5ID0gZGlyZWN0aW9uYWxpdHlUb0hhbChzcmMuZGlyZWN0aW9uYWxpdHkpOworICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9ICh1bnNpZ25lZCBpbnQpc3JjLmZyZXF1ZW5jeVJlc3BvbnNlLnNpemUoKTsKKyAgICAgICAgaWYgKHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID4gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUykgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJWQgZnJlcXVlbmN5IHJlc3BvbnNlcy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzLCBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKTsKKyAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzOyBrKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10uZnJlcXVlbmN5OworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1sxXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueCA9IHNyYy5wb3NpdGlvbi54OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueSA9IHNyYy5wb3NpdGlvbi55OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueiA9IHNyYy5wb3NpdGlvbi56OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi54ID0gc3JjLm9yaWVudGF0aW9uLng7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnkgPSBzcmMub3JpZW50YXRpb24ueTsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueiA9IHNyYy5vcmllbnRhdGlvbi56OworICAgIH0KK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOworICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KKyAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxDb3JlUmVzdWx0PiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIENvcmVSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Cit9OworCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046Ok1pY3JvcGhvbmVJbmZvOwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ZjgyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc2lua01ldGFkYXRhID0gQXVkaW9Tb3VyY2Uoc291cmNlKTsKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKKyAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gQXVkaW9Tb3VyY2Uoc291cmNlKSwgLmdhaW4gPSAxIH19fTsKKyNlbmRpZgorI2lmIE1BSk9SX1ZFUlNJT04gPCA1CisgICAgKHZvaWQpb3V0cHV0RGV2aWNlOworICAgICh2b2lkKW91dHB1dERldmljZUFkZHJlc3M7CisjZWxzZQorICAgIGlmIChvdXRwdXREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgRGV2aWNlQWRkcmVzcyBoaWRsT3V0cHV0RGV2aWNlOworICAgICAgICBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZoaWRsT3V0cHV0RGV2aWNlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrc1swXS5kZXN0aW5hdGlvbi5kZXZpY2Uoc3RkOjptb3ZlKGhpZGxPdXRwdXREZXZpY2UpKTsKKyAgICB9CisjZW5kaWYKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBFbnVtQml0ZmllbGQ8QXVkaW9JbnB1dEZsYWc+KGZsYWdzKSwKKyAgICAgICAgICAgIHNpbmtNZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDQ2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CisgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ODI1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgLypvdXRwdXREZXZpY2UqLywKKyAgICAgICAgY29uc3QgY2hhciAqLypvdXRwdXREZXZpY2VBZGRyZXNzKi8sCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOworICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgorICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOworICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCisgICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7CisgICAgcmV0dXJuIG9wZW5SZXN1bHQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAorICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQorICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgeworICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7CisgICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkYjcyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOworICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOworCisgIHByaXZhdGU6CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKKworICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKKyAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IGRlZmF1bHRGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpfTsKKyAgICBpZiAoIWRlZmF1bHRGYWN0b3J5KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeS9kZWZhdWx0IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG1EZXZpY2VGYWN0b3JpZXMucHVzaF9iYWNrKGRlZmF1bHRGYWN0b3J5KTsKKyAgICBpZiAoTUFKT1JfVkVSU0lPTiA+PSA0KSB7CisgICAgICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbCBhbmQgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgYXQgSEFMIDQuMAorICAgICAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1zZEZhY3Rvcnl7SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKX07CisgICAgICAgIGlmIChtc2RGYWN0b3J5KSB7CisgICAgICAgICAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhtc2RGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UgaW5zdGFuY2UgaXMgb3duZWQKKyAgICAgICAgLy8gYnkgQXVkaW9GbGluZ2VyIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCisgICAgICAgIGZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKKyAgICB9Cit9CisKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdGljIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGlkRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCogc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9IE9LOworICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7CisgICAgfQorICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7CisgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICByZXR1cm4ge307Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXRpYyBjb25zdCBjaGFyKiBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICByZXR1cm4gbmFtZTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1EZXZpY2VGYWN0b3JpZXMuZW1wdHkoKSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGF1dG8gaGlkbElkID0gaWRGcm9tSGFsKG5hbWUsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IG1EZXZpY2VGYWN0b3JpZXMpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICAgICAgaGlkbElkLAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgc3dpdGNoIChyZXR2YWwpIHsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYW5kIHdhcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYnV0IGZhaWxlZCB0byBpbml0YWxpemUuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSBpdGVyYXRpbmcuCisgICAgICAgICAgICBkZWZhdWx0OiA7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIlRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQ6IFwiJXNcIiIsIG5hbWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UwNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlc0ZhY3RvcnkuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gbURldmljZUZhY3RvcmllczsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpID0gZGVmYXVsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzdhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCisgICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzBkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKK307CisKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXR1cm4gT0s7CisKK291dDoKKyAgICAqZGV2ID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKyAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOworICAgIGlmIChyYyA9PSBPSykgeworICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMDhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY3OTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCisvLyBzdGF0aWMKK3VpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07CisgICAgcmV0dXJuIGNvdW50ZXIrKzsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCisgICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKKyAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7CisgICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQorICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAorICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKKyAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKKyAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBpZiAoYXNobWVtID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIG1CdWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgeworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgeworICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7CisgICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOworICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgeworICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOworfQorCit2b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgeworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOworfQorCitib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKKyAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgeworICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7CisgICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7CisgICAgY29tbWl0KG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKKyAgICBtTWVtb3J5LT5jb21taXQoKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI2ODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKworICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7CisgICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQorCisgICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7CisKKyAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOworCisgICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOworCisgICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOworICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7CisgICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmNTc1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6RW51bUJpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKKyAgICBpZiAobUVmZmVjdCAhPSAwKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CisgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKKyAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Cit9CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCisvLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgeworICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBFbnVtQml0ZmllbGQ8QXVkaW9DaGFubmVsTWFzaz4oaGFsQ29uZmlnLmNoYW5uZWxzKTsKKyAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOworICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7CisgICAgY29uZmlnLT5tYXNrID0gRW51bUJpdGZpZWxkPEVmZmVjdENvbmZpZ1BhcmFtZXRlcnM+KGhhbENvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOworICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OworICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKKyAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7CisgICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUluQnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7CisgICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgeworICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOworICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzLgorICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0KKworICAgIC8vIENvbW1vbiBjYXNlLgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOworICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7CisgICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOworICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAorICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBSZXR1cm48dm9pZD4gcmV0OworICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8CisgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7CisgICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOworICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMzhjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdC5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKKworICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCisgICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKKworICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworCisgICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CisKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OworICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7CisgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCisgICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOworICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKKyAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAorICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDZiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKKyAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTc4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0c0ZhY3RvcnkuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OkNQUF9WRVJTSU9OOjpDb252ZXJzaW9uSGVscGVySGlkbDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKyAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcworICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7CisgICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKKworICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKK307CisKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk2Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDg4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBFZmZlY3RIYWxIaWRsID0gOjphbmRyb2lkOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RIYWxIaWRsOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCisgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCisgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKKyAgICBtU3RyZWFtID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7CisgICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7CisgICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtU3RyZWFtLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIG1TdHJlYW0sCisgICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAorICAgICAgICAgICAgaGlkbEtleXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAorICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKGhpZGxJbmZvLmZsYWdzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKK30KKworYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgeworICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAorICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKKyAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgorICAgIHJldHVybiBlcnIgPT0gMDsKK30KKworbmFtZXNwYWNlIHsKKworLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgorCitUaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCitpcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCitXaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgorCitUaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKK3RoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KK0lTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKK2Zyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KKworVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCitieSBBdWRpb0ZsaW5nZXIuCisKKyovCisKK3N0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgeworICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJWYWx1ZT4gcGFyYW1ldGVyczsKKyAgICBTdHJpbmc4IGhhbFBhcmFtZXRlcnM7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCwgc3RkOjp0b19zdHJpbmcocHJlc2VudGF0aW9uSWQpfSk7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQsIHN0ZDo6dG9fc3RyaW5nKHByb2dyYW1JZCl9KTsKKyAgICBwYXJhbWV0ZXJzVG9IYWwoaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+KHBhcmFtZXRlcnMpLCAmaGFsUGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMoaGFsUGFyYW1ldGVycyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2VsZWN0UHJlc2VudGF0aW9uIiwKKyAgICAgICAgICAgIG1TdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKSk7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICp3cml0dGVuID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KKyAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RKSB7CisgICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCisgICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAorICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CisgICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCisgICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgeworICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7CisgICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7CisgICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgeworICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKKyAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCisgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIC8qIHNvdXJjZU1ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzb3VyY2UgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwordGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KK3N0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKyAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAorICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOworICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Cit9CisKKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKnJlYWQgPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CisgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7CisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CisgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKKyAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgeworICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7CisgICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKKyAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdAorICAgICAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKworI2lmIE1BSk9SX1ZFUlNJT04gPCA1CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljcm9waG9uZURpcmVjdGlvbiIsCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxNaWNyb3Bob25lRGlyZWN0aW9uPihkaXJlY3Rpb24pKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24iLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMTA2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0LmgpCisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwordXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIG92ZXJyaWRlOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKKworICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjgwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK1N0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOworICAgIH0KK30KKworU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKKyAgICBtU3RyZWFtID0gMDsKKyAgICBtRGV2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7CisgICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOworICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgeworICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7CisgICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CisgICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5CisgICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgorICAgIHJldHVybiBPSzsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgeworICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKndyaXR0ZW4gPSAwOworICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK2ludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgeworICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQorICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcworICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5CisgICAgLy8gZGVjcmVtZW50ZWQuCisgICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7CisgICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7CisgICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKKyAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitTdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKKyAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKKyAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWFkID0gMDsKKyAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMobVN0cmVhbSwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24obVN0cmVhbSwgZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKG1TdHJlYW0sIHpvb20pOworCit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKK2NsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKKworICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0cyBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkMzkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CitwdWJsaWM6CisgICAgU3RyZWFtUG93ZXJMb2coKSA6CisgICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKKyAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAorICAgICAgICBtRnJhbWVTaXplKDApIHsKKyAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KKyAgICB9CisKKyAgICB+U3RyZWFtUG93ZXJMb2coKSB7CisgICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCisgICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCisgICAgfQorCisgICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgorICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKKyAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAorICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOworICAgIH0KKworICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgorICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCisgICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAorICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAorICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOworICAgIH0KKworICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLworICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOworCisgICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7CisgICAgc2l6ZV90IG1GcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGE0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CituYW1lc3BhY2UgdXRpbHMgeworCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoa2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhrZXlzKTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMTlkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisKKy8qKiBAZmlsZSBMaWJyYXJ5IGVudHJ5IHBvaW50cyB0byBjcmVhdGUgdGhlIEhBTCBmYWN0b3JpZXMuICovCisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIFYyXzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorCituYW1lc3BhY2UgVjJfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFYyXzAKKworbmFtZXNwYWNlIFY0XzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK25hbWVzcGFjZSBWNV8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjVfMAorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggN2RlOGViMy4uZTU2NTIzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC04NCw2ICs4NCw4IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAogICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgPSAwOwogCiAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmluZGV4IDkyNjIyYWEuLjAzMTY1YmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApAQCAtNTUsNiArNTUsOCBAQAogICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxJbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggYzk2OWUyOC4uZWQ4MjgyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpID0gMDsKIAorICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSA9IDA7CiAKQEAgLTE3Niw2ICsxNzksMTIgQEAKICAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCisgICAgLy8gU2V0IGRpcmVjdGlvbiBmb3IgY2FwdHVyZSBwcm9jZXNzaW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QpID0gMDsKKworICAgIC8vIFNldCB6b29tIGZhY3RvciBmb3IgY2FwdHVyZSBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCA4MTdmYjBiLi5jYjc4MDYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTEgQEAKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnNvbmljIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGYzZWE4MjYuLjJjNTdkYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTExMywxMCArMTEzLDEwIEBACiAgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgogICAgICAgICAvLyBDdXJyZW50bHkgaW50ZWdlciB2b2x1bWUgaXMga2VwdCBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgogICAgICAgICAvLyBXaWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyIHBhdGggaXMgcmVtb3ZlZC4KLSAgICAgICAgdC0+dm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQ7Ci0gICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7Ci0gICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKKyAgICAgICAgdC0+dm9sdW1lWzBdID0gMDsKKyAgICAgICAgdC0+dm9sdW1lWzFdID0gMDsKKyAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IDAgPDwgMTY7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSAwIDw8IDE2OwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOwogICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSAwOwogCiAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IHZvbHVtZS4KLSAgICAgICAgdC0+bVZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1Wb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZVswXSA9IDAuZjsKKyAgICAgICAgdC0+bVZvbHVtZVsxXSA9IDAuZjsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gMC5mOwogICAgICAgICB0LT5tVm9sdW1lSW5jWzBdID0gMC47CiAgICAgICAgIHQtPm1Wb2x1bWVJbmNbMV0gPSAwLjsKICAgICAgICAgdC0+bUF1eExldmVsID0gMC47CkBAIC0xMzYsNiArMTM2LDkgQEAKIAogICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKICAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAorICAgICAgICB0LT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tSGFwdGljQ2hhbm5lbE1hc2spOworICAgICAgICBjaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLApAQCAtMTYyLDYgKzE2NSwxNiBAQAogICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CiAgICAgICAgIHQtPm1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgIC8vIGhhcHRpYworICAgICAgICB0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7CisgICAgICAgIHQtPm1IYXB0aWNJbnRlbnNpdHkgPSBIQVBUSUNfU0NBTEVfTk9ORTsKKyAgICAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50OworICAgICAgICB0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTcxLDYgKzE4NCw4IEBACiAgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CiAKICAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTE4NSwxMyArMjAwLDIwIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzawotICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSAodHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaykKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHRyYWNrQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtaXhlckNoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CiAgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCiAgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CiAgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJIYXB0aWNDaGFubmVsTWFzayk7CiAKICAgICBBTE9HX0FTU0VSVCgodHJhY2tDaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKQogICAgICAgICAgICAgJiYgdHJhY2tDaGFubmVsQ291bnQKQEAgLTIwMCw2ICsyMjIsMjQgQEAKICAgICB0cmFjay0+Y2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayA9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID0gaGFwdGljQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IG1peGVySGFwdGljQ2hhbm5lbENvdW50OworCisgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICB9CiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQpAQCAtMjEyLDYgKzI1Miw5IEBACiAgICAgLy8gZG8gaXQgYWZ0ZXIgZG93bm1peCBzaW5jZSB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB0cmFjay0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKwogICAgIGlmICh0cmFjay0+bVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLT5zYW1wbGVSYXRlOwpAQCAtMjYwLDE0ICszMDMsMTkgQEAKICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OCiAgICAgICAgICAgICAmJiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKLSAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgbU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKLSAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGZsb2F0IG9yIGludDE2IGRvd25taXhlciwgaW4gdGhhdCBvcmRlci4KKyAgICAgICAgZm9yIChjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgOiB7IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH0pIHsKKyAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBtTWl4ZXJDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciByZXNldCBiZWxvdy4KICAgICB9CkBAIC0zMzUsOSArMzgzLDgyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzIik7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgb3V0Q2hhbm5lbENvdW50OiAldSIsCisgICAgICAgICAgICB0aGlzLCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQpOworICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgaWYgKG1BZGp1c3RJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUiKTsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcykKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoJXApIHdpdGggaW5DaGFubmVsQ291bnQ6ICV1LCAiCisgICAgICAgICAgIm91dENoYW5uZWxDb3VudDogJXUsIGtlZXBDb250cmFjdGVkQ2hhbm5lbHM6ICVkIiwKKyAgICAgICAgICAgIHRoaXMsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyk7CisgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgIGlmIChtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgdWludDhfdCogYnVmZmVyID0gbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICA/ICh1aW50OF90KiltYWluQnVmZmVyICsgZnJhbWVzICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50LCBtTWl4ZXJGb3JtYXQpCisgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KAorICAgICAgICAgICAgICAgIG5ldyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyA/IG1NaXhlckZvcm1hdCA6IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6Y2xlYXJDb250cmFjdGVkQnVmZmVyKCkKK3sKKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXRpY19jYXN0PEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcio+KAorICAgICAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5jbGVhckNvbnRyYWN0ZWRGcmFtZXMoKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKKyAgICAvLyBjb25maWd1cmUgZnJvbSB1cHN0cmVhbSB0byBkb3duc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCiAgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KICAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpOwpAQCAtNTMyLDcgKzY1Myw4IEBACiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNTQxLDYgKzY2Myw5IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIgIT0gdmFsdWVCdWYpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlciA9IHZhbHVlQnVmOwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTU3MCwxNiArNjk1LDM1IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBtaXhlckNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogeworICAgICAgICAgICAgY29uc3QgaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PGhhcHRpY19pbnRlbnNpdHlfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ICE9IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0cmFjazogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CkBAIC04MTMsMTQgKzk1NywxOSBAQAogICAgIGlmICh0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQotICAgIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAvLyByZXNldCBvcmRlciBmcm9tIGRvd25zdHJlYW0gdG8gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KKyAgICBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAodHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKQEAgLTEyNjQsOCArMTQxMyw4IEBACiAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbZ3JvdXBbMF1dOwogICAgICAgICBtZW1zZXQodC0+bWFpbkJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCArIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KSk7CiAKICAgICAgICAgLy8gbm93IGNvbnN1bWUgZGF0YQogICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKQEAgLTE3MDQsNiArMTg1Myw0MCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzSGFwdGljRGF0YSgpCit7CisgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCBWaWJyYXRpb25FZmZlY3Quc2NhbGUoaW50LCBmbG9hdCwgaW50KQorICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Hcm91cHMpIHsKKyAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBtYWluIGJ1ZmZlci4KKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIGlmICh0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNhbXBsZUNvdW50ID0gbUZyYW1lQ291bnQgKiB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgZ2FtbWEgPSB0LT5nZXRIYXB0aWNTY2FsZUdhbW1hKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgbWF4QW1wbGl0dWRlUmF0aW8gPSB0LT5nZXRIYXB0aWNNYXhBbXBsaXR1ZGVSYXRpbygpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9ICh1aW50OF90KilwYWlyLmZpcnN0ICsgbUZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQsIHQtPm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0LT5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBNaXhlciBmb3JtYXQgc2hvdWxkIGJlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmb3V0ID0gKGZsb2F0KikgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCA9IGZvdXRbaV0gPj0gMCA/IDEuMCA6IC0xLjA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3V0W2ldID0gcG93ZihmYWJzZihmb3V0W2ldIC8gSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQpLCBnYW1tYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXhBbXBsaXR1ZGVSYXRpbyAqIEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUICogbXVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbU1peGVyRm9ybWF0OiAlI3giLCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gZG8gcmVzYW1wbGluZyB0aGVuIG1peGluZywKICAqIHB1bGxpbmcgZnJvbSB0aGUgdHJhY2sncyB1cHN0cmVhbSBBdWRpb0J1ZmZlclByb3ZpZGVyLgogICoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggOTIxNDRkMC4uNDc5MTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAorICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpyZXNldCgpOworICAgICAgICBtSW5CdWZmZXIucmVzZXQoKTsKKyAgICB9CisKICAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCiAgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKaW5kZXggYTc0MTY3Ny4uOWI3MGExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmFjYyhjb2VmLCBkYXRhKTsKICAgICB9CiAgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0LCBUTyBnYWluKSB7Ci0gICAgICAgICpvdXQrKyA9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CisgICAgICAgICpvdXQrKyArPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOwogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OnZvbHVtZShvdXQsIGdhaW4pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCAzMjBiOGNmLi41YTAzYTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKaW5kZXggZDYwNTYwYi4uYjc2NGNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclByb3ZpZGVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8c29uaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KQEAgLTM1LDEzICszOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KIENvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKICAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKICAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKQEAgLTYzLDcgKzU5LDggQEAKIAogQ29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKIHsKLSAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigiJXMoJXApICV6dSAlcCAlcCIsCisgICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBtQnVmZmVyLmZyYW1lQ291bnQsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtTG9jYWxCdWZmZXJEYXRhKTsKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgIH0KQEAgLTk4LDggKzk1LDggQEAKICAgICAgICAgbUNvbnN1bWVkID0gMDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKLSAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKLSAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IHN0ZDo6bWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOwogICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLApAQCAtMTMzLDYgKzEzMCwxNiBAQAogICAgIG1Db25zdW1lZCA9IDA7CiB9CiAKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgQUxPR1YoIiVzKCVwKTogbVRyYWNrQnVmZmVyUHJvdmlkZXI6JXAgIG1CdWZmZXIuZnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHAsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciA9PSBwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihwKTsKK30KKwogRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNDc5LDcgKzQ4Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aW1lLXN0cmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgZHN0QXZhaWxhYmxlID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKKyAgICAgICAgZHN0QXZhaWxhYmxlID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOwogICAgICAgICBzaXplX3Qgc3JjQXZhaWxhYmxlID0gbUJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICBwcm9jZXNzRnJhbWVzKCh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUsICZkc3RBdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5yYXcsICZzcmNBdmFpbGFibGUpOwpAQCAtNTI4LDYgKzUzNSwxNiBAQAogICAgIG1SZW1haW5pbmcgPSAwOwogfQogCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtNTY3LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xpY2FsbHkgcmVwZWF0IHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSAwOyBjb3VudCA8ICpkc3RGcmFtZXM7IGNvdW50ICs9ICpzcmNGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IG1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc3RkOjptaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90Kilkc3RCdWZmZXIgKyBtRnJhbWVTaXplICogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLCBtRnJhbWVTaXplICogcmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02MDksNSArNjI2LDgzIEBACiAgICAgICAgIH0KICAgICB9CiB9CisKK0FkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG91dENoYW5uZWxDb3VudCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtSW5DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAorICAgICAgICBtT3V0Q2hhbm5lbENvdW50KG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcyhhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpCit7CisgICAgQUxPR1YoIkFkanVzdEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlenUpIiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwgbVNhbXBsZVNpemVJbkJ5dGVzLAorICAgICAgICAgICAgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKK30KKworQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LCBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoc3RkOjptYXgoaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCksIGZvcm1hdCksCisgICAgICAgICAgICAgICAgY29udHJhY3RlZEZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50IC0gb3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQoY29udHJhY3RlZEZvcm1hdCksCisgICAgICAgIG1Db250cmFjdGVkRnJhbWVDb3VudChjb250cmFjdGVkRnJhbWVDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkQnVmZmVyKGNvbnRyYWN0ZWRCdWZmZXIpLAorICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMoMCkKK3sKKyAgICBBTE9HVigiQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlI3gsICVwKSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsIGNvbnRyYWN0ZWRGb3JtYXQsIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1Db250cmFjdGVkQ2hhbm5lbENvdW50LCBtQ29udHJhY3RlZEZvcm1hdCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogcEJ1ZmZlcikKK3sKKyAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1Db250cmFjdGVkRnJhbWVDb3VudCAtIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGZyYW1lIGNvdW50IHNvIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG91dEZyYW1lc0xlZnQ7CisgICAgfQorICAgIHJldHVybiBDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIocEJ1ZmZlcik7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKAorICAgICAgICB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsIG1TYW1wbGVTaXplSW5CeXRlcywKKyAgICAgICAgICAgIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1Db250cmFjdGVkQnVmZmVyICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICh1aW50OF90KiltQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1Db250cmFjdGVkRm9ybWF0LCAodWludDhfdCopZHN0ICsgY29udHJhY3RlZElkeCwgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7CisgICAgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpOworfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMDU1ZjcyNC4uNTBjYTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnByMikgewogICAgIHJldHVybiBmYWJzKHByMS5tU3BlZWQgLSBwcjIubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICBmYWJzKHByMS5tUGl0Y2ggLSBwcjIubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAmJgotICAgICAgICAgICBwcjIubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKLSAgICAgICAgICAgcHIyLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CisgICAgICAgICAgIHByMS5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjEubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDgxMWMxNmIuLjBjOGU1YmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggNzZiNGFkYy4uZjM5ZWIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCiAgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFLCAidm9pY2VfcGVyZm9ybWFuY2UifSwKIH07CiAKIC8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IDIyN2YyYTEuLjljODJiMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8iLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlN2RiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIEJ1aWxkIHRlc3RiZW5jaCBmb3IgZG93bm1peCBtb2R1bGUuCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4dGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRvd25taXh0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLXYiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZhZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL2Jhc2gKKyMKKyNSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorI2Vuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2Rvd25taXh0ZXN0IgorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBEb3dubWl4IgorYWRiIHNoZWxsIG1rZGlyICR0ZXN0ZGlyCisKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IFwKKyR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgorCisjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCitmb3IgZnMgaW4gJHtmc19hcnJbKl19CitkbworICAgIGZvciBmX2NoIGluIHsxLi44fQorICAgIGRvCisgICAgICAgIGZvciBjaF9mbXQgaW4gezAuLjR9CisgICAgICAgIGRvCisgICAgICAgICAgICBhZGIgc2hlbGwgIExEX0xJQlJBUllfUEFUSD0vdmVuZG9yL2xpYjY0L3NvdW5kZnggXAorICAgICAgICAgICAgJHRlc3RkaXIvZG93bm1peHRlc3QgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgLWNoX2ZtdDokY2hfZm10IC1mY2g6JGZfY2ggLWZzOiRmcworCisgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCB0ZXN0OgorICAgICAgICAgICAgIyBjaGVjayB0aGF0IGhpZ2hlciBmcmVxdWVuY2llcyBtYXRjaCA4IGtIeiByZXN1bHQuCisgICAgICAgICAgICBpZiBbICRmcyAhPSA4MDAwIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wIFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfODAwMC5yYXcgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmODNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKKyNkZWZpbmUgRlJBTUVfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDgKKworc3RydWN0IGRvd25taXhfY250eHRfcyB7CisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKKyAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKworICBpbnQgbnVtRmlsZUNoYW5uZWxzOworICBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzOworfTsKKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiIpOworICBwcmludGYoIlxuICAgICBkb3dubWl4dGVzdCA8aW5wdXRfZmlsZT4gPG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIik7CisgIHByaW50ZigiXG4gICAgIDxpbnB1dF9maWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dF9maWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgICAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaF9mbXQ6PGZvcm1hdF9vZl9pbnB1dF9hdWRpbz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDA6QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMShkZWZhdWx0KSIpOworICBwcmludGYoIlxuICAgICAgICAgMTpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDI6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgIHByaW50ZigiXG4gICAgICAgICAzOkFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgNDpBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpIik7CisgIHByaW50ZigiXG4iKTsKK30KKworaW50MzJfdCBEb3dubWl4RGVmYXVsdENvbmZpZyhlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpIHsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKworICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgIHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgaW50MzJfdCBlcnIgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CisKKyAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gY29uZmlndXJlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gZW5hYmxlIGVmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4RXhlY3V0ZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKworICBjb25zdCBpbnQgbnVtRmlsZUNoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bUZpbGVDaGFubmVsczsKKyAgY29uc3QgaW50IG51bVByb2Nlc3NDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1Qcm9jZXNzQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmaWxlRnJhbWVTaXplID0gbnVtRmlsZUNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG91dHB1dENoYW5uZWxzID0KKyAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRGbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGluRmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXIsIG91dGJ1ZmZlcjsKKyAgaW5idWZmZXIuZjMyID0gaW5GbG9hdC5kYXRhKCk7CisgIG91dGJ1ZmZlci5mMzIgPSBvdXRGbG9hdC5kYXRhKCk7CisgIGluYnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisgIG91dGJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworCisgIGF1ZGlvX2J1ZmZlcl90ICpwaW5idWYsICpwb3V0YnVmOworICBwaW5idWYgPSAmaW5idWZmZXI7CisgIHBvdXRidWYgPSAmb3V0YnVmZmVyOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW5TMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXRTMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgd2hpbGUgKGZyZWFkKGluUzE2LmRhdGEoKSwgZmlsZUZyYW1lU2l6ZSwgRlJBTUVfTEVOR1RILCBmaW5wKSA9PQorICAgICAgICAgRlJBTUVfTEVOR1RIKSB7CisgICAgaWYgKG51bUZpbGVDaGFubmVscyAhPSBudW1Qcm9jZXNzQ2hhbm5lbHMpIHsKKyAgICAgIGFkanVzdF9jaGFubmVscyhpblMxNi5kYXRhKCksIG51bUZpbGVDaGFubmVscywgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG51bVByb2Nlc3NDaGFubmVscywgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBmaWxlRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoaW5GbG9hdC5kYXRhKCksIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogbnVtUHJvY2Vzc0NoYW5uZWxzKTsKKworICAgIGNvbnN0IGludDMyX3QgZXJyID0gKERvd25taXhfYXBpLT5wcm9jZXNzKSgqZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0UzE2LmRhdGEoKSwgb3V0RmxvYXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyk7CisgICAgZndyaXRlKG91dFMxNi5kYXRhKCksIHNpemVvZihzaG9ydCksIChGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyksCisgICAgICAgICAgIGZvdXQpOworICAgIGZyYW1lQ291bnRlcisrOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dtaXhNYWluUHJvY2Vzcyhkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGludDMyX3Qgc2Vzc2lvbklkID0gMCwgaW9JZCA9IDA7CisgIGNvbnN0IGVmZmVjdF91dWlkX3QgZG93bm1peF91dWlkID0geworICAgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAmZG93bm1peF91dWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICBlZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peExpYl9DcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFBhc3NpbmcgdGhlIGluaXQgY29uZmlnIGZvciB0aW1lIGJlaW5nLgorICBlcnIgPSBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUocERlc2NyaXB0b3IpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peENvbmZpZ3VyZUFuZEVuYWJsZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIGV4ZWN1dGUgY2FsbCBmb3IgZG93bm1peC4KKyAgZXJyID0gRG93bm1peEV4ZWN1dGUocERlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peEV4ZWN1dGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWxlYXNlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdCgqZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhSZWxlYXNlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG51bUZpbGVDaGFubmVscyA9IDEsIG51bVByb2Nlc3NDaGFubmVscyA9IDg7CisgIGRvd25taXhfY250eHRfcyBkZXNjcmlwdG9yID0ge307CisgIERvd25taXhEZWZhdWx0Q29uZmlnKCYoZGVzY3JpcHRvci5jb25maWcpKTsKKworICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgeworICAgICAgaWYgKGluZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgaWYgKG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRmaWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgLy8gQWRkIGEgY2hlY2sgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbXMuCisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoX2ZtdDoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGZvcm1hdCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgdWludDMyX3QgKmF1ZGlvVHlwZSA9ICZkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bVByb2Nlc3NDaGFubmVscyA9CisgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKCphdWRpb1R5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bUZpbGVDaGFubmVscyA9IGZDaGFubmVsczsKKworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1oIiwgMikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICgvKmluZmlsZSA9PSBudWxscHRyIHx8ICovIG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY29uc3QgaW50IGVyciA9IERvd21peE1haW5Qcm9jZXNzKCZkZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgLy8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIHByaW50ZigiRXJyb3I6ICVkXG4iLCBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAppbmRleCA5ZDI5Y2YxLi5kNjFlZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKQEAgLTMwLDYgKzMwLDI2IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbG91ZG5lc3NlbmhhbmNlci5oPgogI2luY2x1ZGUgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uaCIKIAorLy8gQlVJTERfRkxPQVQgdGFyZ2V0cyBidWlsZGluZyBhIGZsb2F0IGVmZmVjdCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgaW50MTZfdCBlZmZlY3QuCisjZGVmaW5lIEJVSUxEX0ZMT0FUCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIGV4dGVybiAiQyIgewogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBMRSBlZmZlY3QKQEAgLTgwLDEzICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTEVfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE1OSw3ICsxNzIsNyBAQAogCiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTE2Nyw3ICsxODAsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTI4NCwxOCArMjk3LDQxIEBACiAKICAgICAvL0FMT0dWKCJMRSBhYm91dCB0byBwcm9jZXNzICVkIHNhbXBsZXMiLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgdWludDE2X3QgaW5JZHg7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OyAvLyBwb3dlciBvZiAyIGlzIGxvc3NsZXNzIGNvbnZlcnNpb24gdG8gaW50MTZfdCByYW5nZQorICAgIGNvbnN0ZXhwciBmbG9hdCBpbnZlcnNlU2NhbGUgPSAxLmYgLyBzY2FsZTsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZikgKiBzY2FsZTsKKyNlbHNlCiAgICAgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpOworI2VuZGlmCiAgICAgZmxvYXQgbGVmdFNhbXBsZSwgcmlnaHRTYW1wbGU7CiAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50IDsgaW5JZHgrKykgewogICAgICAgICAvLyBtYWtldXAgZ2FpbiBpcyBhcHBsaWVkIG9uIHRoZSBpbnB1dCBvZiB0aGUgY29tcHJlc3NvcgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdOworICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXTsKKyAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4XSAgICA9IGxlZnRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeCArMV0gPSByaWdodFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyNlbHNlCiAgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4XTsKICAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdOwogICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHhdICAgID0gKGludDE2X3QpIGxlZnRTYW1wbGU7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeCArMV0gPSAoaW50MTZfdCkgcmlnaHRTYW1wbGU7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTMwMyw2ICszMzksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IExPVURORVNTX0VOSEFOQ0VSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCmluZGV4IDVjNTdjNDMuLjdhMzJkM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCkBAIC0xMjksMTEgKzEyOSwxNCBAQAogICAgICAgICAiQ29tbW9uL2xpYiIsCiAgICAgICAgICJCdW5kbGUvbGliIiwKICAgICBdLAotCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKaW5kZXggNGMyYjk1NC4uY2MwNjZiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTE5OSw4ICsxOTksMTAgQEAKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWREJFX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNSw4ICsyMTcsMTAgQEAKICAgICBMVkRCRV9GU180NDEwMCA9IDcsCiAgICAgTFZEQkVfRlNfNDgwMDAgPSA4LAogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgIExWREJFX0ZTXzk2MDAwID0gOSwKLSAgICBMVkRCRV9GU18xOTIwMDAgPSAxMCwKKyAgICBMVkRCRV9GU184ODIwMCA9IDksCisgICAgTFZEQkVfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkRCRV9GU18xNzY0MDAgPSAxMSwKKyAgICBMVkRCRV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWREJFX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKQEAgLTI1Niw2ICsyNjAsOSBAQAogICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogCiB9IExWREJFX1BhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggNGVjYWYxNC4uOGYwNThlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtNTgwLDEyICs1ODAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE2MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDQ2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NDgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyMDgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ5MTVmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDM2NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3MjMzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTcyMzdmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKQEAgLTY0MiwxMiArNjU0LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzM4MWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTA3N2YpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzODk4ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM4MjBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjY3OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2Njg1ZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MDg2ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCkBAIC03MDMsMTIgKzcyNywyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTM1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyMTUxZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxODJmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk5ODRmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjc4OWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczMjI0ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTYwNzZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjA4M2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgpAQCAtNzY0LDEyICs4MDAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODE2OGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwOTQ0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTA5ODVmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg4OTJmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTY4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTQ4MmYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgpAQCAtODMxLDEyICs4NzksMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwODMxZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4MzFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTgzMjFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MzM4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDQxNmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNDE2ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk5MTY0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTE2OWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAzODFmKQpAQCAtODkyLDEyICs5NTIsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1NjkwZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTE0NmYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTE0NmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3Njg0ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3NzA4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3ODY4ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDU3M2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDU3M2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4ODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4ODUzZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDUyOGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTI4ZikKQEAgLTk1MywxMiArMTAyNSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDE2OTNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjkzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjU4MmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk2NjE1ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTU1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY4NjBmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwODQ3ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgyOThmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTgzMDZmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQpAQCAtMTAxNCwxMiArMTA5OCwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwODNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjA4M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTc5MWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4MzVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA0MmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDQyZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3OTA0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzkxNWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDk1OGYpCkBAIC0xMDQ1LDcgKzExNDEsOSBAQAogI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ1OGYKICNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE5OWYKICNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKICNlbmRpZgogCkBAIC0xMDYyLDcgKzExNjAsOSBAQAogI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM4ZgogI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE4OGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTc1ZgogI2VuZGlmCiAKQEAgLTExMjUsNyArMTIyNSw5IEBACiAjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgogI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIyNjNmCiAjZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTEzMWYKICNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCiAjZW5kaWYKICNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLwpAQCAtMTEzOCw5ICsxMjQwLDEzIEBACiAjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KICNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogI2lmZGVmIEhJR0hFUl9GUworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk3MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0MzAKICNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQ4MzggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI1OTgKICNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLwogI2VuZGlmCiAKICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKaW5kZXggZmQ0MDE2Yi4uMGJhMmM4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKICAgICAgKi8KICAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKICNlbmRpZgogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDNmZmYyYTIuLjI5NDY3MzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtOTUsNyArOTUsNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOwogI2Vsc2UKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOwogI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggNGU1MjA3Zi4uNDIyNWEzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC02NCw3ICs2NCwxMiBAQAogI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGNvZWYgKi8KICNkZWZpbmUgTFZEQkVfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAzKQorI2Vsc2UKICNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKIAogI2RlZmluZSBMVkRCRV9NSVhFUl9UQyAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8qIE1peGVyIHRpbWUgICovCiAjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCmluZGV4IDEwZWE3MDAuLmM0ZDM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwpAQCAtMjEsMTEgKzIxLDEzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODcsNDIgKzE4OSw0OSBAQAogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAogICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKICAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAotICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKKyAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCiB7Ci0KICAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaF9pbiA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbgotICBbTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaCA9IHBTY3JhdGNoX2luICsgMiAqIE51bVNhbXBsZXM7Ci0gIExWTV9GTE9BVCAqcE1vbm87Ci0gIExWTV9JTlQzMiBpaSA9IDA7CiAKLSAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiA0Kk51bVNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0ZMT0FUICopKCZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc10pOwotLy8gIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2xfaW50ID0gKExWTV9JTlQxNiAqKShwU2NyYXRjaFZvbCk7CisgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisjaWZkZWYgU1VQUE9SVF9NQworICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KKyAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKKyAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCisjZW5kaWYKKyAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAotICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKKyAgLyogU3BhY2UgdG8gc3RvcmUgREJFIHBhdGggY29tcHV0YXRpb24gKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPQorICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwogCiAgIC8qCi0gICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mCisgICAqIE5yU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaC4KICAgICovCi0gIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOworCisgIC8qCisgICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KKyAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCisgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgKgorICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgorICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQogICB7Ci0gICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICByZXR1cm4gTFZEQkVfVE9PTUFOWVNBTVBMRVM7CiAgIH0KIAogICAvKgotICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0Ci0gICAqLwotICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLwotICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0KLSAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKLSAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07Ci0gIH0KLSAgLyoKICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCiAgICAqLwogICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjMwLDUwICsyMzksODEgQEAKICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCiAgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQogICB7CisgICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKKyAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCiAgICAgICovCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCiAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEZyb21NY1RvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU291cmNlICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIEZyb20yaVRvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCiAgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCiAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CiAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KKyNlbHNlCiAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwogICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgTnJGcmFtZXMpOworI2VuZGlmCiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKICAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCi0gICAgICBpZihwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CisgICAgICBpZiAocFNjcmF0Y2hbaWldIDwgLTEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKICAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOwogICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2gsIDAsIHNpemVvZigqcFNjcmF0Y2gpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KQEAgLTI4NiwyMSArMzI2LDQwIEBACiAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQogICAgICAqLwotICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgIHBTY3JhdGNoX2luLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCiAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBMZWZ0IGFuZCByaWdodCwgcmVhbGx5ICMgc2FtcGxlcyAqLworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLy8gY2xlYXIgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CiAgIH0KIAogICAvKgogICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKICAgICAgIHBTY3JhdGNoLAogICAgICAgcFNjcmF0Y2hWb2wsCiAgICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0KLSAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgIHJldHVybiBMVkRCRV9TVUNDRVNTOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggYzRhOWIxNC4uYTJjZTQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtODgsMTEgKzg4LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzU1X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsCkBAIC0xNDcsMTEgKzE1NywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzY2X0EwLApAQCAtMjA3LDExICsyMjcsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMCwKQEAgLTI2OSwxMSArMjk5LDIxIEBACiAKICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCkBAIC0zMjAsOSArMzYwLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCkBAIC0zNTcsOSArNDAzLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LApAQCAtMzk0LDkgKzQ0NiwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKQEAgLTQzMiw5ICs0OTAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtCUEZfRnM4ODIwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQpAQCAtNDY2LDcgKzUzMCw5IEBACiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAogICAgIEFHQ19BVFRBQ0tfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfQVRUQUNLX0ZzODgyMDAKICAgICAsQUdDX0FUVEFDS19Gczk2MDAwCisgICAgLEFHQ19BVFRBQ0tfRnMxNzY0MDAKICAgICAsQUdDX0FUVEFDS19GczE5MjAwMAogI2VuZGlmCiAKQEAgLTQ4OCw3ICs1NTQsOSBAQAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAogICAgIEFHQ19ERUNBWV9GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19ERUNBWV9Gczg4MjAwCiAgICAgLEFHQ19ERUNBWV9GUzk2MDAwCisgICAgLEFHQ19ERUNBWV9GczE3NjQwMAogICAgICxBR0NfREVDQVlfRlMxOTIwMDAKICNlbmRpZgogCkBAIC01ODMsNyArNjUxLDkgQEAKICAgICBWT0xfVENfRnM0NDEwMCwKICAgICBWT0xfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxWT0xfVENfRnM4ODIwMAogICAgICxWT0xfVENfRnM5NjAwMAorICAgICxWT0xfVENfRnMxNzY0MDAKICAgICAsVk9MX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIH07CkBAIC02MDIsNyArNjcyLDkgQEAKICAgICBNSVhfVENfRnM0NDEwMCwKICAgICBNSVhfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM4ODIwMAogICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxNzY0MDAKICAgICAsTUlYX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAppbmRleCA5YjZkYTMxLi44M2VjYWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApAQCAtMjk2LDYgKzI5Niw5IEBACiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCiAgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7CiAgICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZNX0NvbnRyb2xQYXJhbXNfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKaW5kZXggMGEzYzMwZS4uMzcyNzJlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDggKzY0LDExIEBACiAgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwogICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC0yMDcsOCArMjEyLDcgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAqcERlc3Q7Ci0gICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9MjsKLQorICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwpAQCAtNDk5LDcgKzUwMyw3IEBACiAgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLwpAQCAtNzUwLDcgKzc1NCwxMSBAQAogICAgIExWTV9JTlQxNiAgICAgICBOdW1TYW1wbGVzOwogICAgIExWTV9GTE9BVCAgICAgICAqcFN0YXJ0OwogICAgIExWTV9GTE9BVCAgICAgICAqcERlc3Q7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIE51bVNhbXBsZXMgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZGVmaW5lIEZyYW1lQ291bnQgU2FtcGxlQ291bnQKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCkBAIC03NTgsNyArNzY2LDYgQEAKICAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwogICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKIAotCiAgICAgLyoKICAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICAqLwpAQCAtNzg2LDE0ICs3OTMsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwpAQCAtODAzLDIzICs4MjEsNDAgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICB9CiAgICAgfQpAQCAtODM2LDEzICs4NzEsMjMgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgIH0KQEAgLTg1MSwxNCArODk2LDI1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBTdGFydCAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KICAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCiAgICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCiAgICAgICAgIH0KQEAgLTg3MCw5ICs5MjYsMTYgQEAKICAgICAgKi8KICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTEwNjMsMTQgKzExMjYsMjQgQEAKIHsKIAogICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjdW5kZWYgTnJGcmFtZXMKKyNkZWZpbmUgTnJGcmFtZXMgKCpwTnVtU2FtcGxlcykgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbHNlCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IDI7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDhjMDQ4NDcuLmJhYjQwNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTQ4Nyw2ICs0ODcsOTcgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KKy8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDAyNjRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ3MTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTkwNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDE5NTNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQ4ODM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Njk3NzdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjkzNTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzE2MjM4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MDY0MTJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNTE3NzE0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMwNTY4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNjQ5ODMwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU3NTkzOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KQEAgLTU4MCw2ICs2NzEsOTggQEAKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTc1NTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzYwNzg0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI5NzM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODcwNDA1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDcxMzEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTkwMjYzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKQEAgLTEyMTYsNCArMTM5OSw0IEBACiAKIAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCmluZGV4IGNmZTUzYjguLjYyYjRjNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSwxOCArNzEsMjkgQEAKICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKICNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8CiAjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKKyNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CisjZW5kaWYKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPSBwUGFyYW1zLT5OckNoYW5uZWxzOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBDaW5lbWEgU291bmQgcGFyYW1ldGVycwogICAgICAqLwpAQCAtNTY5LDYgKzU4MiwxMCBAQAogICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYKICAgICAgICAgICAgICAoQ291bnQgPiAwKSk7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgLyogQ2xlYXIgYWxsIGludGVybmFsIGRhdGEgaWYgZm9ybWF0IGNoYW5nZSovCiAgICAgaWYoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkKICAgICB7CkBAIC03MTksNiArNzM2LDkgQEAKICAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIERCRV9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKQEAgLTc3NSw3ICs3OTUsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpAQCAtODQ5LDcgKzg3MSw5IEBACiAgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CiAgICAgICAgIENTX1BhcmFtcy5SZXZlcmJMZXZlbCA9IExvY2FsUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7CiAgICAgICAgIENTX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkNTX0VmZmVjdExldmVsOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDU19QYXJhbXMuTnJDaGFubmVscyAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmluZGV4IDI2YzFjNGYuLmM1NzQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtNjEsNiArNjEsNzIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiA0IFR5cGVzIG9mIE1lbW9yeSBSZWdpb25zIG9mIExWTQorICogVE9ETzogQWxsb2NhdGUgb24gdGhlIGZseS4KKyAqIGkpICAgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAtIEZvciBJbnN0YW5jZSBIYW5kbGVzCisgKiBpaSkgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgLSBQZXJzaXN0ZW50IEJ1ZmZlcnMKKyAqIGlpaSkgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqIGl2KSAgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpICsgXAorICogICAgIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpIC0gbmVlZGVkIGlmIGJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUgorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEE6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSArIFwKKyAqICAgICAyICogcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19EYXRhX3QpICsgXAorICogICAgIHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSArIFwKKyAqICAgICBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pICsgXAorICogICAgIDIgKiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRjoKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19Db2VmZmljaWVudF90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KQorICoKKyAqIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgKFNjcmF0Y2gpOgorICogICBUb3RhbCBNZW1vcnkgU2l6ZToKKyAqICAgICBCdW5kbGVTY3JhdGNoU2l6ZSArIFwKKyAqICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkgKyBcCisgKiAgICAgTWF4U2NyYXRjaE9mIChDUywgRVFOQiwgREJFLCBQU0EpCisgKgorICogICAgIGEpQnVuZGxlU2NyYXRjaFNpemU6CisgKiAgICAgICAgIDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAqICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBhbGxvY2F0ZWQgb25seSB3aGVuIEJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUi4KKyAqICAgICBiKU1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBzY3JhdGNoIHVzYWdlIGZvciBDUywgRVFOQiwgREJFLCBQU0EuCisgKiAgICAgICBDUyAgID0gKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgICAgICAgICAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSkKKyAqICAgICAgIEVRTkIgPSAoTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBEQkUgID0gKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBQU0EgID0gKDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSkKKyAqICAgICAgICAgICAgICBvbmUgTWF4SW5wdXRCbG9ja1NpemUgZm9yIGlucHV0IGFuZCBhbm90aGVyIGZvciBmaWx0ZXIgb3V0cHV0CisgKiAgICAgYylNQVhfSU5URVJOQUxfQkxPQ0tTSVpFCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBuZWVkZWQgZm9yIFBTQUlucHV0IC0gVGVtcCBtZW1vcnkgdG8gc3RvcmUgb3V0cHV0CisgKiAgICAgICBmcm9tIE1jVG9Nb25vIGJsb2NrIGFuZCBnaXZlbiBhcyBpbnB1dCB0byBQU0EgYmxvY2sKKyAqLworCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQpAQCAtMTY4LDcgKzIzNCwxMyBAQAogICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKTsKKyNlbHNlCiAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisjZW5kaWYKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgICAgICAvKiBTY3JhdGNoIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCkBAIC0yMzMsNyArMzA1LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzM0OCwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTM1Nyw4ICs0NDEsMTMgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKIAogICAgICAgICAgICAgaWYgKFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKQogICAgICAgICAgICAgewpAQCAtNTQ3LDEzICs2MzYsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwogI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCkBAIC01ODQsOCArNjgwLDExIEBACiAgICAgLyoKICAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudApAQCAtNzQ0LDcgKzg0MywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTgwMiw3ICs5MDcsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0xMDM5LDcgKzExNTAsMTEgQEAKICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGI0NTMyMjIuLjE5ZDE1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTQ0LDEyICsxNDQsMTkgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KQEAgLTI4Miw2ICsyODksMTAgQEAKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKKwogfSBMVk1fSW5zdGFuY2VfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCA0YTE5YTEzLi45NGJhMjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTY1LDYgKzY1LDEwIEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgTnJDaGFubmVscyAgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCkBAIC0xMTIsNiArMTE2LDEwIEBACiAgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCiAgICAgewogICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgLyogVXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBOckNoYW5uZWxzIGZyb20gcEluc3RhbmNlLT5OckNoYW5uZWxzIHZhbHVlICovCisgICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCiAgICAgICAgIHsKQEAgLTEzMCw2ICsxMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOwogICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBOckNoYW5uZWxzID0gMjsKKyNlbmRpZgogICAgIH0KIAogCkBAIC0xNTMsNyArMTY0LDYgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgICAgICB7Ci0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwpAQCAtMTcxLDEwICsxODEsMTggQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQogICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIApAQCAtMjIxLDIwICsyMzksMzMgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisjZW5kaWYKIAogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIC8qIFRPRE8gLSBNdWx0aWNoYW5uZWwgc3VwcG9ydCB0byBiZSBhZGRlZCAqLworICAgICAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gMikKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcwpAQCAtMjQyLDI4ICsyNzMsMzkgQEAKICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIEZyb21NY1RvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworI2VuZGlmCiAKLSAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIERDIHJlbW92YWwKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIH0KLQogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKICAgICAgICAgICovCkBAIC00OTcsNCArNTM5LDQgQEAKIAogICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCAxOTlkZGRlLi5hNTM1NmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yNjksNiArMjY5LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCkBAIC0zMTYsNiArMzYzLDUzIEBACiAgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKICAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCiAKKyAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IDlhM2QzNWQuLjA2ZTc0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC03OCw2ICs3OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCAzZWU3ZjYzLi4wMTUzOWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMzAsOCArMzAsMTcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogVGhlIG1lbW9yeSByZWdpb24gY3JlYXRlZCBieSB0aGlzIHN0cnVjdHVyZSBpbnN0YW5jZSBpcyB0eXBlY2FzdAorICAgICAqIGludG8gYW5vdGhlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHBvaW50ZXIgYW5kIGFuIGFycmF5IG9mIGZpbHRlcgorICAgICAqIGNvZWZmaWNpZW50cy4gSW4gb25lIGNhc2UgdGhpcyBtZW1vcnkgcmVnaW9uIGlzIHVzZWQgZm9yIHN0b3JpbmcKKyAgICAgKiBEQyBjb21wb25lbnQgb2YgY2hhbm5lbHMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgKnBTdG9yYWdlOworICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLQorI2VuZGlmCiB9IEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xNzksNyArMTg4LDEyIEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUyBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKSBdOworI2Vsc2UKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xOTcsMTIgKzIxMSwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KIH0gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0zNjYsNiArMzg1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCkBAIC00MzQsNiArNDYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKQEAgLTUyNyw2ICs1NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKQEAgLTU0MCwxMiArNTgwLDIyIEBACiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKKwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAppbmRleCA4MWUyODhjLi5hNzYzNTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaApAQCAtNDQsNyArNDQsMTUgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKyAgICAvKgorICAgICAqIFRoZSBtZW1vcnkgYXJlYSBjcmVhdGVkIHVzaW5nIHRoaXMgc3RydWN0dXJlIGlzIGludGVybmFsbHkKKyAgICAgKiB0eXBlY2FzdCB0byBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IGFuZCB1c2VkLgorICAgICAqIFRoZSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IHN0cnVjdHVyZSBoYXMgMyBwb2ludGVyIHR5cGUgZWxlbWVudHMKKyAgICAgKiAyIGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyIGFuZCBvbmUgZWxlbWVudCBvZiB0eXBlIExWTV9JTlQxNi4KKyAgICAgKiBJbm9yZGVyIHRvIGNhdGVyIGJvdGggMzIgYW5kIDY0IGJpdCBidWlsZHMsIFN0b3JhZ2UgYXJyYXkgc2hvdWxkCisgICAgICogaGF2ZSBhIG1pbmltdW0gb2YgOSBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMi4KKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs5XTsKIAogfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCBlYTE2MDcyLi41OTU4NmUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMTIyLDYgKzEyMiwxMiBAQAogCiAjZW5kaWYgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgogCisjaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDggLy8gRkNDXzgKKyNlbHNlCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgMiAvLyBGQ0NfMgorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0Myw2ICsxNDksOSBAQAogICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAogICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAogICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fTVVMVElDSEFOTkVMICAgID0gMywKKyNlbmRpZgogICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCkBAIC0xNjAsOCArMTY5LDEwIEBACiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GU185NjAwMCA9IDksCi0gICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWTV9GU184ODIwMCA9IDksCisgICAgTFZNX0ZTXzk2MDAwID0gMTAsCisgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAorICAgIExWTV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDBiYTIwYTMuLjc0NjhhOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTQ3LDYgKzQ3LDE2IEBACiB2b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xODEsNiArMTkxLDEyIEBACiB2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggZmE5ZjAxZi4uNWM4NjU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMwNSw0ICszMDUsMTUwIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNY1NyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNY1NyYyAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9TcmMgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRHN0ICAgICAgICAgICAgICAgICAgICBNdWx0aWNoYW5uZWwgZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5yRnJhbWVzICAgICAgICAgICAgICAgIE51bWJlciBvZiBmcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJDaGFubmVscyAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1jU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisKKyAgICAvKgorICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgIGksIGpqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgIFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHZhbHVlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworCisgICAgICAgIEFic1BlYWsgPSAwLjBmOworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KKyAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBpbnB1dCBzaWduYWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgID0gU2FtcGxlVmFsICAqIFZvbF9NdWx0OworCisgICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgPiBBYnNQZWFrID8gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgOiBBYnNQZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBNb25vU3JjKys7CisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qU1VQUE9SVF9NQyovCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCA5NjBkZTc5Li5kNjMzNjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTEyMyw2ICsxMjMsODcgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKKworCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogeW49IChBMiAgKiB4KG4tMikpICovCisgICAgICAgICAgICAgICAgeW4gPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMSAgKiB4KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMCAgKiB4KG4pKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMiAgKiB5KG4tMikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjEgICogeShuLTEpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSAoTFZNX0ZMT0FUKXluOyAvKiBVcGRhdGUgeShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bjsgLyogV3JpdGUgamogQ2hhbm5lbCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KKwogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwppbmRleCBlNDg5MDMxLi4zODU4NDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCkBAIC04NCw1ICs4NCw2NSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8vIEV4dHJhY3Qgb3V0IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyIGZyb20gbXVsdGljaGFubmVsIHNvdXJjZS4KK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICAgICAgZHN0ICs9IDI7CisgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCisgICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOworICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdCAtPSAyOworICAgICAgICAgICAgc3JjIC0tOworICAgICAgICB9CisgICAgfQorfQorCisvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIGRzdCwgdG8gZHN0Lgordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUICpzcmNfc3QgPSBkc3QgKyAyICogKE5yRnJhbWVzIC0gMSk7CisKKyAgICAvLyByZXBhY2sgZHN0IHdoaWNoIGNhcnJpZXMgc3RlcmVvIGluZm9ybWF0aW9uCisgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgorICAgIGRzdCArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBkc3RbMV0gPSBzcmNfc3RbMV07CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsgLy8gY29weSAxIGJlZm9yZSAwIGlzIHJlcXVpcmVkIGZvciBOckNoYW5uZWxzID09IDMuCisgICAgICAgIGZvciAoamogPSAyOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtqal0gPSBzcmNbampdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjX3N0IC09IDI7CisgICAgfQorfQorI2VuZGlmCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggZDI2MWM5ZS4uMTNmYWM1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CiAgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCiAgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CiAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQpAQCAtNjQsNiArNjQsNTggQEAKIAogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBEQyByZW1vdmFsIGZyb20gYWxsIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwSW5zdGFuY2UgICAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgcERhdGFJbiAgICAgICAgSW5wdXQvU291cmNlCisgKiAgcERhdGFPdXQgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBMVk1fSU5UMzIgaTsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworCisgICAgICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgICAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gKihwRGF0YUluKyspIC0gKENoRENbaV0pOworICAgICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSArPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDRmNGZjZDguLjBmOTQxYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTI0LDYgKzI0LDE3IEBACiAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfQ0hBTk5FTFM7IGkrKykKKyAgICB7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+Q2hEQ1tpXSA9IDAuMGY7CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZmE2YjcyOS4uZGIzYTZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMzQsNiArMzQsMTMgQEAKICAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCiB9RmlsdGVyX0ZMT0FUX1N0YXRlOwogdHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKKyNpZmRlZiBTVVBQT1JUX01DCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlX01jXworeworICAgIExWTV9GTE9BVCAgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgICAgIC8qIENoYW5uZWxEQyAgKi8KK30gRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwordHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIDsKKyNlbmRpZgogI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKaW5kZXggMTkyOTI3Yy4uMmE1MGYxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpAQCAtMTE3LDYgKzExNyw5MyBAQAogICAgICAgICB9CiAKICAgICB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBU1NVTVBUSU9OUzoKK0NPRUZTLQorcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTAsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMF0gaXMgeChuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqY2ggKyAxXSBpcyB5KG4tMSkgb2YgdGhlICdjaCcgLSBjaGFubmVsCitUaGUgaW5kZXggJ2NoJyBydW5zIGZyb20gMCB0byAoTnJDaGFubmVscyAtIDEpCisKK1BBUkFNRVRFUlM6CisgcEluc3RhbmNlICAgICAgICBQb2ludGVyIEluc3RhbmNlCisgcERhdGFJbiAgICAgICAgICBJbnB1dC9Tb3VyY2UKKyBwRGF0YU91dCAgICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorIE5yRnJhbWVzICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcworIE5yQ2hhbm5lbHMgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisKK1JFVFVSTlM6Cisgdm9pZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICB5bjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDE2ICAgaWk7CisgICAgICAgIExWTV9JTlQxNiAgIGNoOworICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTFZNX0ZMT0FUICAgKnBEZWxheXMgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXM7CisgICAgICAgIExWTV9GTE9BVCAgICpwQ29lZnMgID0gJnBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEEwID0gcENvZWZzWzFdOworICAgICAgICBMVk1fRkxPQVQgICBBMSA9IHBDb2Vmc1swXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQjEgPSBwQ29lZnNbMl07CisKKworCisKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIENIQU5ORUxTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHluID1BMSAgKiB4KG4tMSkKKyAgICAgICAgICAgICAgICB5biA9IChMVk1fRkxPQVQpQTEgKiBwRGVsYXlzWzBdOworCisgICAgICAgICAgICAgICAgLy8geW4rPUEwICAqIHgobikKKyAgICAgICAgICAgICAgICB5biArPSAoTFZNX0ZMT0FUKUEwICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8vIHluICs9ICAoLUIxICAqIHkobi0xKSkKKyAgICAgICAgICAgICAgICBUZW1wID0gQjEgKiBwRGVsYXlzWzFdOworICAgICAgICAgICAgICAgIHluICs9IFRlbXA7CisKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBEZWxheXNbMV0gPSB5bjsgLy8gVXBkYXRlIHkobi0xKQorICAgICAgICAgICAgICAgIHBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSkKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgICAgIGlmICh5biA+IDEuMGYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5biA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5biA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHluID0gLTEuMGY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluOworICAgICAgICAgICAgICAgIHBEZWxheXMgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEZWxheXMgLT0gTnJDaGFubmVscyAqIDI7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKaW5kZXggYWMxZWVhOC4uZDAyYWY4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKQEAgLTY4LDUgKzY4LDQ3IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBDcmVhdGVzIGEgbW9ubyBzdHJlYW0gZnJvbSBhIG11bHRpY2hhbm5lbCBpbnB1dCB0YWtpbmcgdGhlIGF2ZXJnYWUgb2YKKyAqICBzYW1wbGUgdmFsdWVzIG9mIGFsbCBjaGFubmVscworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgVGVtcDsKKworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAwLjBmOworICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgICAgICpkc3QgPSBUZW1wIC8gTnJDaGFubmVsczsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKICNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCBkMjY5NGNjLi40MTljN2M1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKIAogICAgIExWTV9JTlQxNiAgIE91dExvb3A7CkBAIC0xMTQsNiArMTE0LDEzOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorCisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKaW5kZXggYjVlN2Y1Yy4uNWJmZGFkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMjcsMTAgKzI3LDEwIEBACiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwogICAgIExWTV9JTlQxNiAgIEluTG9vcDsKQEAgLTEwNSw2ICsxMDUsMTE5IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQorCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQQorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQ8VGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAxOTJmMTI2Li42NTk1NmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzQsMTAgKzM0LDEwIEBACiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKIHsKICAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKICAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwpAQCAtMTA2LDYgKzEwNiwxMTAgQEAKICAgICB9CiAKIH0KKworCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+VGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCAxMDE3ZGUzLi4wNjc4YWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTEwMyw2ICsxMDMsMTAxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIEZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCisgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCAzYzkwMDcxLi44YTg5ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI2LDExICsyNiwxMSBAQAogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwpAQCAtNjcsNiArNjcsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgMiBzdHJlYW0gTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYzEgICAgICAgICAgIEZpcnN0IG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBzcmMyICAgICAgICAgICBTZWNvbmQgbXVsdGljaGFubmVsIHNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgIH0KK30KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCBmOTA0OTE1Li43ZjE4NzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMTU3LDEwICsxNTcsMTggQEAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xNjksMTAgKzE3NywxOCBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xODEsMTEgKzE5NywxOSBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLApAQCAtMjAwLDEwICsyMjQsMTAgQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGM2NzQ1NWEuLjUwN2VlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKICAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgCisKICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCBkMGQwZTFmLi5mMTAwOTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTYyLDYgKzYyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApAQCAtNzMsNiArODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNDhmNWQ1NC4uOWQzZWU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCiB7CiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCkBAIC02MCw3ICs2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLC8qODgyMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwogI2Vsc2UKICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDlkYzdkMjEuLjBlMGFjZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKIHsKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwvKjgwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwpAQCAtNjEsNyArNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCiAjZWxzZQogICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IDc4NDZjYTAuLjYzMDdlNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC01Myw3ICs1Myw5IEBACiAjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKICNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKICNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKICNlbmRpZgogY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLApAQCAtNjYsNyArNjgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzg4MjAwX2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE3NjQwMF9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmluZGV4IDljMTdhMDUuLjZjOGIyZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwpAQCAtMTE5LDYgKzExOSw4MCBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLworICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLworICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IDhlMGI3MzguLjM4NWRiY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMjAxLDggKzIwMSwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNyw4ICsyMTksMTAgQEAKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKLSAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzg4MjAwID0gOSwKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CkBAIC0yNjcsNyArMjcxLDkgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA0MmVhNDZmLi43NTUxNDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMTA5LDcgKzEwOSw5IEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNzFmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDM2ZgogI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDU2YjAyZTAuLmE5Y2Q1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDEyIEBACiAjZGVmaW5lIExWRVFOQl9JTlNUQU5DRV9BTElHTiAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGluc3RhbmNlIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0RBVEFfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfQ09FRl9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICovCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKQorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCiAjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDYzMjgxODEuLmQxODhjMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSwxNCArNjIsMTggQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KICAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKICAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KICAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKQEAgLTgyLDE0ICs4NywxNCBAQAogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgICAgICByZXR1cm4gTFZFUU5CX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKQEAgLTk3LDE2ICsxMDIsMTYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgpAQCAtMTE2LDcgKzEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CiAKIAogICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTI2LDEwICsxMzEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgogICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDEsMTkgKzE1NCwyOSBAQAogCiAKICAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgICAgICBlbHNlewogICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNjMsMTIgKzE4NiwxMiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIExWRVFOQl9TVUNDRVNTOwogCiB9CiAjZWxzZQpAQCAtMzEyLDQgKzMzNSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCmluZGV4IDU2MzE4MWMuLjQ1M2M0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCkBAIC04Miw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTI0OSwzMCArMjUzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnRzICgxMDBtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczgwMDAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMjAwMCAgIDMyNjQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczE2MDAwICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyNDAwMCAgIDMyNzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczMyMDAwICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0ODAwMCAgIDMyNzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLQotCi1jb25zdCBMVk1fSU5UMTYgTFZFUU5CX01peGVyVENUYWJsZVtdID0gewotICAgIExWRVFOQl9NSVhfVENfRnM4MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxMTAyNSwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczE2MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMyMjA1MCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczMyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0NDEwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZmNzQ3NWUuLmM5MTVhYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTEyMyw3ICsxMjMsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbHNlCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZW5kaWYKIAogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNTY2ZDg0Zi4uMWQxMjgzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAKKwogICAgIC8qCiAgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCiAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwppbmRleCBhNzE5MDUzLi5kZmVkMjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTY0LDEyICs2NCwyMiBAQAogICAgICAgICAoCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKICNlbmRpZgogICAgICAgICApCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCisjZWxzZQogICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisjZW5kaWYKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCBiM2VkYzYwLi4xMDU4NzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtNTIsNyArNTIsOSBAQAogICAgIDMyMDAwLAogICAgIDQ0MTAwLAogICAgIDQ4MDAwLAorICAgIDg4MjAwLAogICAgIDk2MDAwLAorICAgIDE3NjQwMCwKICAgICAxOTIwMDAKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IGE3NTBiYjAuLmVlMDdlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLwogI2Vsc2UKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDEzICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLwogI2VuZGlmCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAxMjg3NTAzLi5mOGFmNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC01NCw3ICs1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAKQEAgLTc4LDcgKzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyNDM0OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjE3NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTA1LDcgKzEwOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEyOCw3ICsxMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNTMsNyArMTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE2OSw3ICsxNzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzUyLDcgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCkBAIC0zNjgsNyArMzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCkBAIC0zODMsNyArMzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggZTc1Njk1ZS4uZTUwN2E3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTIwNSw2ICsyMDUsOSBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsgICAgICAgICAgICAvKiBFZmZlY3QgbGV2ZWwgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWQ1NfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggMGMyZmU1My4uYmEwNTU3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0xNTIsNiArMTUyLDI0IEBACiAjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzg0NmYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjY1N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTkyNzQ3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMxNTQxZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg5NTg2ZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wNTgwNDVmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS43NjUzMDBmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc2OTgxNmYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKwogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KIC8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCkBAIC0xNjAsMTMgKzE3OCwzMyBAQAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNwotI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjcyNykKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjc5MzM3MikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMjQzMjZmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjk0OTM3ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDcwNjExZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjc5MjE2NmYpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NTgzMGYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzk3M2YKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzMzNzhmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MzY3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5ODM2ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMwNzU0NGYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjEwNzcwOGYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS44NzY1NzJmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC44Nzc3NzFmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQpAQCAtMTc1LDEzICsyMTMsMTUgQEAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwODk5MSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTI1MDkpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5OSw3ICsyMzksMTIgQEAKICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1NTcgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAgICAgICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haICAgICAgICAgICAgICAgICAgIDExMTUgICAgICAgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAgICAgICAgICAgICAgICAgIDIwNDggICAgICAgIC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAgICAgICAgICAgICAgICAgIDIyMjkgICAgICAgIC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMICAgICAgICAgICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjAsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzcsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwNywyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzNywyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCmluZGV4IDY5ODkyYjYuLmY5NGQ0ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAvKiBGaWx0ZXIgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CiAjZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMXTsKICAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CiAgICAgLyogRmlsdGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggZTE1NGUyOS4uYTFmYjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzQsMTAgKzc0LDE4IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84ODIwMF9BMSwKKyAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV85NjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNzY0MDBfQTEsCisgICAgIENTX01JRERMRV8xNzY0MDBfQjEsCisgICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKQEAgLTE0NCwxMiArMTUyLDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAsCisgICAge0NTX1NJREVfODgyMDBfQTAsICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84ODIwMF9BMSwKKyAgICAgQ1NfU0lERV84ODIwMF9BMiwKKyAgICAgQ1NfU0lERV84ODIwMF9CMSwKKyAgICAgQ1NfU0lERV84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX1NJREVfOTYwMDBfQTEsCiAgICAgIENTX1NJREVfOTYwMDBfQTIsCiAgICAgIENTX1NJREVfOTYwMDBfQjEsCiAgICAgIENTX1NJREVfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNzY0MDBfQTAsICAgICAgICAgIC8qMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xNzY0MDBfQTEsCisgICAgIENTX1NJREVfMTc2NDAwX0EyLAorICAgICBDU19TSURFXzE3NjQwMF9CMSwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzE5MjAwMF9BMSwKICAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCkBAIC0yMjMsMTIgKzI0MywyNCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsICAgICAvKiA4OGtTL3MgY29lZmZpZWllbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMjk0LDEyICszMjYsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfODgyMDBfQTAsICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEV9LAogICAgIHtDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCwgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwLCAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMzI2LDcgKzM3MCwxMiBAQAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFp9OworICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTIsMTIgKzQ0MSwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAorICAgICBDU19SRVZFUkJfODgyMDBfQTIsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAogICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCiAgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAogICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAogICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLApAQCAtNTA5LDIyICs1NzAsMjYgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCitjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzldID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKQEAgLTU0NSwxNyArNjEwLDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotCQkJCQkJCQkJCQkgIDEyMDAwLAotCQkJCQkJCQkJCQkgIDE2MDAwLAotCQkJCQkJCQkJCQkgIDIyMDUwLAotCQkJCQkJCQkJCQkgIDI0MDAwLAotCQkJCQkJCQkJCQkgIDMyMDAwLAotCQkJCQkJCQkJCQkgIDQ0MTAwLAotCQkJCQkJCQkJCQkgIDQ4MDAwLAotCQkJCQkJCQkJCQkgIDk2MDAwLAotCQkJCQkJCQkJCQkgIDE5MjAwMAorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTNdID0gezgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzY2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImx2bXRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsibHZtdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzbnIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKworICAgIHNyY3M6IFsic25yLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTg3NGEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9sdm1UZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBsdm0iCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybTY0L2x2bXRlc3QgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworZmxhZ3NfYXJyPSgKKyAgICAiLWNzRSIKKyAgICAiLWVxRSIKKyAgICAiLXRFIgorICAgICItY3NFIC10RSAtZXFFIgorICAgICItYkUgLU0iCisgICAgIi1jc0UgLXRFIgorICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKKyAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCispCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2ZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorZG8KKyAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgZG8KKyAgICAgICAgZm9yIGNoIGluIHsxLi44fQorICAgICAgICBkbworICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoKSlfJCgoZnMpKS5yYXcgLWNoOiRjaCAtZnM6JGZzICRmbGFncworCisgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtYkUgaXMgaW4gZmxhZ3MgKGR1ZSB0byBtb25vIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgaWYgW1sgJGZsYWdzICE9ICoiLWJFIiogXV0gJiYgWyAiJGNoIiAtZ3QgMiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMl8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaCkpXyQoKGZzKSkucmF3CisgICAgICAgICAgICBlbGlmIFtbICRmbGFncyA9PSAqIi1iRSIqIF1dICYmIFsgIiRjaCIgLWd0IDIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9zbnIgJHRlc3RkaXIvc2luZXN3ZWVwXzJfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2gpKV8kKChmcykpLnJhdyAtdGhyOjkwLjMwODk5OAorICAgICAgICAgICAgZmkKKworICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2YmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBcCisgIGRvIHsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgXAorfQorCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdHJ1Y3QgbHZtQ29uZmlnUGFyYW1zX3QgeworICBpbnQgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAgICA9IDQ0MTAwOworICBpbnQgICAgICAgICAgICAgIG5yQ2hhbm5lbHMgICAgICA9IDI7CisgIGludCAgICAgICAgICAgICAgZkNoYW5uZWxzICAgICAgID0gMjsKKyAgYm9vbCAgICAgICAgICAgICBtb25vTW9kZSAgICAgICAgPSBmYWxzZTsKKyAgaW50ICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICBpbnQgICAgICAgICAgICAgIGVxUHJlc2V0TGV2ZWwgICA9IDA7CisgIGludCAgICAgICAgICAgICAgZnJhbWVMZW5ndGggICAgID0gMjU2OworICBMVk1fQkVfTW9kZV9lbiAgIGJhc3NFbmFibGUgICAgICA9IExWTV9CRV9PRkY7CisgIExWTV9URV9Nb2RlX2VuICAgdHJlYmxlRW5hYmxlICAgID0gTFZNX1RFX09GRjsKKyAgTFZNX0VRTkJfTW9kZV9lbiBlcUVuYWJsZSAgICAgICAgPSBMVk1fRVFOQl9PRkY7CisgIExWTV9Nb2RlX2VuICAgICAgY3NFbmFibGUgICAgICAgID0gTFZNX01PREVfT0ZGOworfTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhjZXV0YWJsZT4gLWk6PGlucHV0X2ZpbGU+IC1vOjxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgIHByaW50ZigiXG4gICAgIDxvdXRwdXRmaWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1oZWxwIChvcikgLWgiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY2g6PHByb2Nlc3NfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1NIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIE1vbm8gbW9kZSAoZm9yY2UgYWxsIGlucHV0IGF1ZGlvIGNoYW5uZWxzIHRvIGJlIGlkZW50aWNhbCkiKTsKKyAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQSB2YWx1ZSB0aGF0IHJhbmdlcyBiZXR3ZWVuICVkIC0gJWQgZGVmYXVsdCAwIiwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCwKKyAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZXFQcmVzZXQ6PHByZXNldCBWYWx1ZT4iKTsKKyAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QcmVzZXRMdmxzOyArK2kpIHsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAlenUgLSAlcyIsIGksIGdFcXVhbGl6ZXJQcmVzZXRzW2ldLm5hbWUpOworICB9CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgIHByaW50ZigiXG4gICAgIC1iRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC10RSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIFRyZWJsZSBCb29zdCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jc0UgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBDb25jZXJ0IFN1cnJvdW5kIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVxdWFsaXplciIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICBMVk1fTWVtVGFiX3QgTWVtVGFiOworCisgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKKworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyCisgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICB9Cit9IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUJ1bmRsZV9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNyZWF0ZXMgaW5zdGFuY2UKKy8vIHdpdGggYWxsIGVmZmVjdHMgZGlzYWJsZWQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgeworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworCisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisKKyAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisKKyAgICBBTE9HVigKKyAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICB9CisKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworICBMVk1fTWVtVGFiX3QgTWVtVGFiOyAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICBib29sIGJNYWxsb2NGYWlsdXJlID0gTFZNX0ZBTFNFOworCisgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgPSBNQVhfTlVNX0JBTkRTOworICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9IExWTV9QU0FfT047CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOworCisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMKKyAgICogdGhhdCB3ZXJlCisgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKKyAgICovCisgIGlmIChiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKKyAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgLyogSW5pdGlhbGlzZSAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKworICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisKKyAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKKyAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgfQorCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOworICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICBwYXJhbXMtPkJFX0hQRiA9IExWTV9CRV9IUEZfT047CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOworCisgIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7CisgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07CisgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKKworICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKKyAgcmV0dXJuIDA7Cit9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLworCitpbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgaW50IHJldCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gKEJ1bmRsZWRFZmZlY3RDb250ZXh0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKKyAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgeworICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CisKKyAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCisgICAqIHNldCB0byB0aGUgZ2V0CisgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAorICAgKiBhdm9pZAorICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKKyAgICovCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPSBOVUxMOworI2VuZGlmCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgTHZtQnVuZGxlX2luaXQiKTsKKyAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgbHZtQ29udHJvbChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIGNvbnN0IGludCBuckNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgcGFyYW1zLT5OckNoYW5uZWxzID0gbnJDaGFubmVsczsKKyAgaWYgKG5yQ2hhbm5lbHMgPT0gMSkgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgIH0gZWxzZSBpZiAobnJDaGFubmVscyA9PSAyKSB7CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPiAyICYmIG5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAorICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7CisgIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODgyMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPQorICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKKyAgfQorICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOworIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09OOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5iYXNzRW5hYmxlOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgTHZtU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKKworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICByZXR1cm4gMDsKK30KKworaW50IGx2bUV4ZWN1dGUoZmxvYXQgKmZsb2F0SW4sIGZsb2F0ICpmbG9hdE91dCwgc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMpIHsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIHJldHVybgorICAgICAgTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgIGZsb2F0SW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICBmbG9hdE91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lTGVuZ3RoLCAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworfQorCitpbnQgbHZtTWFpblByb2Nlc3MoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgaW50IGVyckNvZGUgPSBsdm1Db250cm9sKHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCBwUGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICBlcnJDb2RlID0gbHZtRXhlY3V0ZShmbG9hdEluLmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcyk7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgIHByaW50ZigiXG5FcnJvcjogbHZtRXhlY3V0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgIHJldHVybiBlcnJDb2RlOworICAgIH0KKworICAgICh2b2lkKWZyYW1lU2l6ZTsgLy8gZWxpbWluYXRlIHdhcm5pbmcKKyNlbHNlCisgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpIGZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZvdXQpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsdm1Db25maWdQYXJhbXNfdCBsdm1Db25maWdQYXJhbXN7fTsgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgIGNvbnN0IGNoYXIgKmluZmlsZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBudWxscHRyOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICBpbmZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWRcbiIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoOiIsIDQpKSB7CisgICAgICBjb25zdCBpbnQgbnJDaGFubmVscyA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKG5yQ2hhbm5lbHMgPiA4IHx8IG5yQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6ICVkXG4iLCBuckNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBuckNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCItTSIpKSB7CisgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgfHwgYmFzc0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBCYXNzIEVmZmVjdCBMZXZlbCA6ICVkXG4iLAorICAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VmZmVjdExldmVsID0gYmFzc0VmZmVjdExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1lcVByZXNldDoiLCAxMCkpIHsKKyAgICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gYXRvaShhcmd2W2ldICsgMTApOworICAgICAgY29uc3QgaW50IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgICAgaWYgKGVxUHJlc2V0TGV2ZWwgPj0gbnVtUHJlc2V0THZscyB8fCBlcVByZXNldExldmVsIDwgMCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBFcXVhbGl6ZXIgUHJlc2V0IDogJWRcbiIsIGVxUHJlc2V0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcVByZXNldExldmVsID0gZXFQcmVzZXRMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VuYWJsZSA9IExWTV9CRV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1lcUUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxRW5hYmxlID0gTFZNX0VRTkJfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jc0UiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmNzRW5hYmxlID0gTFZNX01PREVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaCIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoaW5maWxlID09IG51bGxwdHIgfHwgb3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICBpZiAoZm91dCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIGZjbG9zZShmaW5wKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgIGlmIChlcnJDb2RlID09IDApIHsKKyAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgIGlmIChlcnJDb2RlICE9IDApIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGx2bU1haW5Qcm9jZXNzIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsZXJyQ29kZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmb3V0KTsKKyAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7CisgICAgfQorICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOworICB9CisKKyAgaWYgKGVyckNvZGUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODExMGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+CitzdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgeworICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKKyAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7CisgIEEgc2lnbmFse307CisgIEEgbm9pc2V7fTsKKworICBmb3IgKDs7KSB7CisgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOworICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgeworICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIH0KKyAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKKyAgICAgICAgcmV0dXJuIHsgc2lnbmFsLCBub2lzZSB9OworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRfc2FtcGxlc19pbjsgKytpKSB7CisgICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOworICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICB9CisgIH0KK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICBzbnIgPHJlZl9maWxlPiA8dGVzdF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICBwcmludGYoIlxuICAgICA8dGVzdF9maWxlPiBpcyB0ZXN0IGZpbGUgZm9yIHNuciBjYWxjdWxhdGlvbiIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLXBjbV9mb3JtYXQ6PHBjbSBmb3JtYXQgb2YgaW5wdXQgZmlsZXM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjIDwgMykgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IHBjbV9mb3JtYXQgPSAwOworICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7CisgICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKKyAgICB9CisgIH0KKyAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgYXV0byBzbiA9IHBjbV9mb3JtYXQgPT0gMAorICAgICAgPyBnZXRTaWduYWxOb2lzZTxzaG9ydD4oZmlucCwgZnJlZikKKyAgICAgIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOworICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7CisgICAgLy8gY29tcGFyZSB0aGUgbWVhc3VyZWQgc25yIHZhbHVlIHdpdGggdGhyZXNob2xkCisgICAgaWYgKHNuciA8IHRocikgeworICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgfQorICB9CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZyZWYpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IDEwZmQ5NzAuLjE2ZmExMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDcgQEAKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDUzZDI2NmEuLjBjNmY4ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQogICAgIHsKLSAgICAgICAgI2lmZGVmIExWTV9QQ00KKyNpZmRlZiBMVk1fUENNCiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCisjZW5kaWYKIAogCiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKQEAgLTc1MSwxOSArNzUxLDIxIEBACiAKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAqcE91dFRtcDsKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fApAQCAtNzg0LDcgKzc4Niw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03OTgsMTMgKzgwMCwxNSBAQAogCiAjaWZkZWYgTFZNX1BDTQogICAgIGZ3cml0ZShwSW4sCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAjZW5kaWYKIAogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBOckNoYW5uZWxzKTsKIAogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwpAQCAtODE0LDcgKzgxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKICAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICNlbHNlCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwpAQCAtODI5LDEyICs4MzMsMTQgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocE91dFRtcCwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogTnJDaGFubmVsczsgaSsrKSB7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CiAjZWxzZQpAQCAtMTIzMiw0NSArMTIzOCw1OCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQ0hFQ0tfQVJHKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisjZWxzZQogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworI2VuZGlmCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKKyAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjA1MDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgZGVmYXVsdDoKQEAgLTEyOTQsNiArMTMxMywxMCBAQAogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOworI2VuZGlmCisKICAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3Rfc2V0Q29uZmlnIikKQEAgLTE0OTgsNiArMTUyMSw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQgOgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjAsMTAgKzE1NDQsOSBAQAogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKChjaGFubmVsQ291bnQgPT0gMCkgfHwgKGNoYW5uZWxDb3VudCA+IDIpKSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQogICAgIHJldHVybiBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZVR5cGUpOwogfQogCkBAIC0zMjE2LDYgKzMyMzksNyBAQAogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CiAgICAgaW50ICAgIHN0YXR1cyA9IDA7CiAgICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCiAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKQEAgLTMyNDYsNyArMzI3MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KQEAgLTMyNjYsNyArMzI5MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KQEAgLTMyODAsNyArMzMwNCw4IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOy8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPQorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOwogICAgICAgICB9CkBAIC0zMzMxLDcgKzMzNTYsNyBAQAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyArK2kpIHsKICNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKICNlbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBkNTU4MTY5Li42MDJmNjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTY3NSw5ICs2NzUsMTUgQEAKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA3MDQwOWRlLi4zNWUyZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKIAogTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9GTE9BVCAtRFNVUFBPUlRfTUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTE5LDcgKzIwLDggQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggODA3ZjI0ZC4uMDBiYzM3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjQsMTEgKzI0LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBtYXgKICNpbmNsdWRlIDxuZXc+CiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIGV4dGVybiAiQyIgewogCkBAIC0xNDMsMTAgKzE1NSwxNSBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfOCkgcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorICAgIGlmIChjaGFubmVsQ291bnQgIT0gRkNDXzIpIHJldHVybiAtRUlOVkFMOworI2VuZGlmCiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE5Miw3ICsyMDksNyBAQAogewogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yMDAsNyArMjE3LDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0zMDEsMTUgKzMxOCw4IEBACiAvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vCiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKQEAgLTMyNCw3MSArMzM0LDExOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlTGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsKKwogICAgIC8vIHBlcmZvcm0gbWVhc3VyZW1lbnRzIGlmIG5lZWRlZAogICAgIGlmIChwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSAmIE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMpIHsKICAgICAgICAgLy8gZmluZCB0aGUgcGVhayBhbmQgUk1TIHNxdWFyZWQgZm9yIHRoZSBuZXcgYnVmZmVyCi0gICAgICAgIHVpbnQzMl90IGluSWR4OwotICAgICAgICBpbnQxNl90IG1heFNhbXBsZSA9IDA7CiAgICAgICAgIGZsb2F0IHJtc1NxQWNjID0gMDsKLSAgICAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQgOyBpbklkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSBpbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoLWluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gLWluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm1zU3FBY2MgKz0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF0pOworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhpbkJ1ZmZlci0+ZjMyW2luSWR4XSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPmYzMltpbklkeF0gKiBpbkJ1ZmZlci0+ZjMyW2luSWR4XTsKICAgICAgICAgfQorICAgICAgICBtYXhTYW1wbGUgKj0gMSA8PCAxNTsgLy8gc2NhbGUgdG8gaW50MTZfdCwgd2l0aCBleGFjdGx5IDEgPDwgMTUgcmVwcmVzZW50aW5nIHBvc2l0aXZlIG51bS4KKyAgICAgICAgcm1zU3FBY2MgKj0gMSA8PCAzMDsgLy8gc2NhbGUgdG8gaW50MTZfdCAqIDIKKyNlbHNlCisgICAgICAgIGludCBtYXhTYW1wbGUgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBzdGQ6Om1heChtYXhTYW1wbGUsIHN0ZDo6YWJzKGludDMyX3QoaW5CdWZmZXItPnMxNltpbklkeF0pKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gc3RvcmUgdGhlIG1lYXN1cmVtZW50CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUGVha1UxNiA9ICh1aW50MTZfdCltYXhTYW1wbGU7CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUm1zU3F1YXJlZCA9Ci0gICAgICAgICAgICAgICAgcm1zU3FBY2MgLyAoaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcm1zU3FBY2MgLyBzYW1wbGVMZW47CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tSXNWYWxpZCA9IHRydWU7CiAgICAgICAgIGlmICgrK3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPj0gcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gYWxsIGNvZGUgYmVsb3cgYXNzdW1lcyBzdGVyZW8gMTYgYml0IFBDTSBvdXRwdXQgYW5kIGlucHV0CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmbG9hdCBmc2NhbGU7IC8vIG11bHRpcGxpY2F0aXZlIHNjYWxlCisjZWxzZQogICAgIGludDMyX3Qgc2hpZnQ7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogICAgIGlmIChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQpIHsKICAgICAgICAgLy8gZGVyaXZlIGNhcHR1cmUgc2NhbGluZyBmYWN0b3IgZnJvbSBwZWFrIHZhbHVlIGluIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KLSAgICAgICAgc2hpZnQgPSAzMjsKLSAgICAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyApIHsKKyAgICAgICAgICAgIC8vIHdlIHJlY29uc3RydWN0IHRoZSBhY3R1YWwgc3VtbWVkIHZhbHVlIHRvIGVuc3VyZSBwcm9wZXIgbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgLy8gZm9yIG11bHRpY2hhbm5lbCBvdXRwdXRzIChjaGFubmVscyA+IDIgbWF5IG9mdGVuIGJlIDApLgorICAgICAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhzbXApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4U2FtcGxlID4gMC5mKSB7CisgICAgICAgICAgICBmc2NhbGUgPSAxMjcuZiAvIG1heFNhbXBsZTsKKyAgICAgICAgICAgIGludCBleHA7IC8vIHVudXNlZAorICAgICAgICAgICAgY29uc3QgZmxvYXQgc2lnbmlmaWNhbmQgPSBmcmV4cChmc2NhbGUsICZleHApOworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5kID09IDAuNWYpIHsKKyAgICAgICAgICAgICAgICBmc2NhbGUgKj0gMjU1LmYgLyAyNTYuZjsgLy8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzY2FsZSBkb2Vzbid0IG1hdHRlciwgdGhlIHZhbHVlcyBhcmUgYWxsIDAuCisgICAgICAgICAgICBmc2NhbGUgPSAxLmY7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGludDMyX3Qgb3JBY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKICAgICAgICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNltpXTsKICAgICAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQotICAgICAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7Ci0gICAgICAgICAgICBpZiAoc2hpZnQgPiBjbHopIHNoaWZ0ID0gY2x6OworICAgICAgICAgICAgb3JBY2N1bSB8PSBzbXA7CiAgICAgICAgIH0KKwogICAgICAgICAvLyBBIG1heGltdW0gYW1wbGl0dWRlIHNpZ25hbCB3aWxsIGhhdmUgMTcgbGVhZGluZyB6ZXJvcywgd2hpY2ggd2Ugd2FudCB0bwogICAgICAgICAvLyB0cmFuc2xhdGUgdG8gYSBzaGlmdCBvZiA4IChmb3IgY29udmVydGluZyAxNiBiaXQgdG8gOCBiaXQpCi0gICAgICAgIHNoaWZ0ID0gMjUgLSBzaGlmdDsKKyAgICAgICAgc2hpZnQgPSAyNSAtIF9fYnVpbHRpbl9jbHoob3JBY2N1bSk7CisKICAgICAgICAgLy8gTmV2ZXIgc2NhbGUgYnkgbGVzcyB0aGFuIDggdG8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsLgogICAgICAgICBpZiAoc2hpZnQgPCAzKSB7CiAgICAgICAgICAgICBzaGlmdCA9IDM7CiAgICAgICAgIH0KICAgICAgICAgLy8gYWRkIG9uZSB0byBjb21iaW5lIHRoZSBkaXZpc2lvbiBieSAyIG5lZWRlZCBhZnRlciBzdW1taW5nIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGJlbG93CiAgICAgICAgIHNoaWZ0Kys7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9IGVsc2UgewogICAgICAgICBhc3NlcnQocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9BU19QTEFZRUQpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8vIE5vdGU6IGlmIGNoYW5uZWxzIGFyZSB1bmNvcnJlbGF0ZWQsIDEvc3FydChOKSBjb3VsZCBiZSB1c2VkIGF0IHRoZSByaXNrIG9mIGNsaXBwaW5nLgorICAgICAgICBmc2NhbGUgPSAxLmYgLyBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgIC8vIGFjY291bnQgZm9yIHN1bW1pbmcgYWxsIHRoZSBjaGFubmVscyB0b2dldGhlci4KKyNlbHNlCiAgICAgICAgIHNoaWZ0ID0gOTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIHVpbnQzMl90IGNhcHRJZHg7CiAgICAgdWludDMyX3QgaW5JZHg7CiAgICAgdWludDhfdCAqYnVmID0gcENvbnRleHQtPm1DYXB0dXJlQnVmOwogICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwotICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgewotICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICAvLyB3cmFwIGFyb3VuZAotICAgICAgICAgICAgY2FwdElkeCA9IDA7CisgICAgICAgICBpbklkeCA8IHNhbXBsZUxlbjsKKyAgICAgICAgIGNhcHRJZHgrKykgeworICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSBjYXB0SWR4ID0gMDsgLy8gd3JhcAorCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeF0gKyBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeCArIDFdOwotICAgICAgICBzbXAgPSBzbXAgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZltjYXB0SWR4XSA9IGNsYW1wOF9mcm9tX2Zsb2F0KHNtcCAqIGZzY2FsZSk7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IHNtcCA9IChpbkJ1ZmZlci0+czE2W2luSWR4XSArIGluQnVmZmVyLT5zMTZbaW5JZHggKyAxXSkgPj4gc2hpZnQ7CisgICAgICAgIGluSWR4ICs9IEZDQ18yOyAgLy8gaW50ZWdlciBzdXBwb3J0cyBzdGVyZW8gb25seS4KICAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIC8vIFhYWCB0aGUgZm9sbG93aW5nIHR3byBzaG91bGQgcmVhbGx5IGJlIGF0b21pYywgdGhvdWdoIGl0IHByb2JhYmx5IGRvZXNuJ3QKQEAgLTQwMCw2ICs0NTcsMTUgQEAKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgc2FtcGxlTGVuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTQwNyw2ICs0NzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCAwMWYwMTRmLi5hOTc3MzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC04Niw3ICs4Niw3IEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVpZlN0cmVhbT4gbVN0cmVhbTsKICAgICBib29sIG1FT1M7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1DYWNoZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtQ2FjaGU7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKICAgICBzaXplX3QgbUNhY2hlQnVmZmVyU2l6ZTsKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAvLyBpdCdzIHJlYWNoaW5nIG1heCBjYWNoZSBidWZmZXIgc2l6ZSwgbmVlZCB0byByb2xsIHdpbmRvdywgYW5kIHBvc3NpYmx5CiAgICAgICAgIC8vIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgogICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG5ld0NhY2hlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdDYWNoZTsKICAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOwogICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggNTE4M2MzOS4uYWExMGYzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCA3ZGVhYjA1Li45Nzk5Y2FkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTIyLDcgKzIyLDcgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCIsICJUaW1lQ2hlY2suY3BwIl0sCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0zNCw2ICszNCw5IEBACiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKICAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCiAgICAgY2xhbmc6IHRydWUsCiB9CiAKQEAgLTEyMyw2ICsxMjYsMTAgQEAKICAgICAgICAgImxpYnNvbml2b3giLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xMzgsMTggKzE0NSwxMCBAQAogICAgIH0sCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKLSAgICBdLAotfQotCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWEiLAogCiAgICAgc3JjczogWwotICAgICAgICAiOm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIuY3BwIiwKQEAgLTE4NCw2ICsxODMsOCBAQAogICAgICAgICAiTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAiLAogICAgICAgICAiVmlzdWFsaXplci5jcHAiLAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKICAgICBdLAogCiAgICAgYWlkbDogewpAQCAtMTkzLDEwICsxOTQsMTIgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yMTEsNyArMjE0LDYgQEAKICAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0yNTMsMTggKzI1NSwxNCBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogCiAgICAgc3JjczogWworICAgICAgICAiQXVkaW9QYXJhbWV0ZXIuY3BwIiwKICAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRGVzYy5jcHAiLAotICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAotICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCiAgICAgICAgICJNZXRhZGF0YS5jcHAiLAogICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAogICAgIF0sCkBAIC0yNzMsMTAgKzI3MSw5IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yOTEsNiArMjg4LDEwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCmluZGV4IDAzNGY3YzIuLjFjOTVlMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0tFWV9BVURJT19MQU5HVUFHRV9QUkVGRVJSRUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQgPSBBVURJT19QQVJBTUVURVJfTU9OT19PVVRQVVQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0ID0gQVVESU9fUEFSQU1FVEVSX0RFVklDRV9DT05ORUNUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCmluZGV4IDI3MWEyMzguLjFjYzMwYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKQEAgLTI3LDI2ICsyNyw2IEBACiAgICAgICAgIDogbUluaXRpYWxNYXJrTXMoa05vTWFyayksCiAgICAgICAgICAgbVJlc3VtZVBsYXliYWNrTWFya01zKGtOb01hcmspIHsgfQogCi1zdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUluaXRpYWxNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZXN1bWVQbGF5YmFja01hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbE1hcmtNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZXN1bWVQbGF5YmFja01hcmtNcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIFN0cmluZzggQnVmZmVyaW5nU2V0dGluZ3M6OnRvU3RyaW5nKCkgY29uc3QgewogICAgIFN0cmluZzggczsKICAgICBzLmFwcGVuZEZvcm1hdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGU5YTYyMzAuLmZiNmQzYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC0yMTksMTAgKzIyMCwxNiBAQAogICAgIFZlY3Rvcjx3cDxJTWVkaWFTb3VyY2U+PiB0cmFja3M7CiAgICAgVmVjdG9yPFN0cmluZzg+IHRyYWNrRGVzY3JpcHRpb25zOwogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB0aW1lX3Qgd2hlbjsKIH0gRXh0cmFjdG9ySW5zdGFuY2U7CiAKIFN0cmluZzggRXh0cmFjdG9ySW5zdGFuY2U6OnRvU3RyaW5nKCkgY29uc3QgewotICAgIFN0cmluZzggc3RyID0gbmFtZTsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBjaGFyIHRpbWVTdHJpbmdbMzJdOworICAgIHN0cmZ0aW1lKHRpbWVTdHJpbmcsIHNpemVvZih0aW1lU3RyaW5nKSwgIiVtLSVkICVUIiwgbG9jYWx0aW1lKCZ3aGVuKSk7CisgICAgc3RyLmFwcGVuZCh0aW1lU3RyaW5nKTsKKyAgICBzdHIuYXBwZW5kKCI6ICIpOworICAgIHN0ci5hcHBlbmQobmFtZSk7CiAgICAgc3RyLmFwcGVuZCgiIGZvciBtaW1lICIpOwogICAgIHN0ci5hcHBlbmQobWltZSk7CiAgICAgc3RyLmFwcGVuZCgiLCBzb3VyY2UgIik7CkBAIC0yODcsNiArMjk0LDcgQEAKICAgICBleC5zb3VyY2VEZXNjcmlwdGlvbiA9IHNvdXJjZS0+dG9TdHJpbmcoKTsKICAgICBleC5vd25lciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBleC5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgZXgud2hlbiA9IHRpbWUoTlVMTCk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNFeHRyYWN0b3JzTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGQ3NTMzY2EuLjI0M2IwOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMywxMyArMjMsMTMgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgTUFLRV9FWFRSQUNUT1IgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIE1BS0VfSURBVEFfU09VUkNFX0ZELAorICAgIEdFVF9TVVBQT1JURURfVFlQRVMsCiB9OwogCiBjbGFzcyBCcE1lZGlhRXh0cmFjdG9yU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpAQCAtNjksNiArNjksMjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXM7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1VQUE9SVEVEX1RZUEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIHJlcGx5CisgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0ID0gcmVwbHkucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXMuaW5zZXJ0KHN0ZDo6c3RyaW5nKGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRUeXBlczsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIik7CkBAIC0xMTQsNiArMTMyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9TVVBQT1JURURfVFlQRVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzID0gZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHN1cHBvcnRlZFR5cGVzLmJlZ2luKCk7IGl0ICE9IHN1cHBvcnRlZFR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQ1N0cmluZygoKml0KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlMmVjY2RkLi5lYTA2NjY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTE3OSw3ICsxNzksOCBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTk0LDcgKzE5NSw4IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgZXJyID0gYnVmZmVyaW5nLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tSW5pdGlhbE1hcmtNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTY5Niw3ICs2OTgsOCBAQAogICAgICAgICBjYXNlIFNFVF9CVUZGRVJJTkdfU0VUVElOR1M6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKLSAgICAgICAgICAgIGJ1ZmZlcmluZy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTcwNiw3ICs3MDksOCBAQAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGJ1ZmZlcmluZy53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhY2E3YWQ5Li5iZDE4YTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggYjJjOTFjNC4uNTZlZTE4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgIEdFVF9ST1VURURfREVWSUNFX0lELAogICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0FDVElWRV9NSUNST1BIT05FUywKLQorICAgIEdFVF9QT1JUX0lELAogfTsKIAogY2xhc3MgQnBNZWRpYVJlY29yZGVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUmVjb3JkZXI+CkBAIC00MDcsNiArNDA3LDIzIEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKyAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BPUlRfSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0sKKyAgICAgICAgICAgICAgICB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFSZWNvcmRlciIpOwpAQCAtNjYxLDYgKzY3OCwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfUE9SVF9JRDogeworICAgICAgICAgICAgQUxPR1YoIkdFVF9QT1JUX0lEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UG9ydElkKCZwb3J0SWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGYxODVmZDQuLjRkZWNlOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VURk9STUFULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgICAgICAgICAgbU1ldGFEYXRhID0gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIG1NZXRhRGF0YTsKICAgICAgICAgfQpAQCAtMTg2LDYgKzE4Nyw5IEBACiAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCiAgICAgICAgICAgICAgICAgcmV0LCBidWZmZXJDb3VudCwgbUJ1ZmZlcnNTaW5jZVN0b3ApOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgJiYgcmV0ID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtMjE5LDYgKzIyMyw4IEBACiAgICAgLy8gTnVQbGF5ZXIgcGFzc2VzIHBvaW50ZXJzLXRvLW1ldGFkYXRhIGFyb3VuZCwgc28gd2UgdXNlIHRoaXMgdG8ga2VlcCB0aGUgbWV0YWRhdGEgYWxpdmUKICAgICAvLyBYWFg6IGNvdWxkIHdlIHVzZSB0aGlzIGZvciBjYWNoaW5nLCBvciBkb2VzIG1ldGFkYXRhIGNoYW5nZSBvbiB0aGUgZmx5PwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YURhdGE7CisgICAgLy8gZW5zdXJlIHN5bmNocm9uaXplIGFjY2VzcyB0byBtTWV0YURhdGEKKyAgICBNdXRleCBtTG9jazsKIAogICAgIC8vIENhY2hlIGFsbCBJTWVtb3J5IG9iamVjdHMgcmVjZWl2ZWQgZnJvbSBNZWRpYUV4dHJhY3Rvci4KICAgICAvLyBXZSBnYyBJTWVtb3J5IG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSAocmVmZXJlbmNlZCBieSBhIE1lZGlhQnVmZmVyKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggYTA3MzA4MS4uNzQ3Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTU1Miw3ICs1NTIsNyBAQAogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE9NWCwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWCIpOwotSU1QTEVNRU5UX0hZQlJJRF9NRVRBX0lOVEVSRkFDRShPTVhOb2RlLCBJT214Tm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKK0lNUExFTUVOVF9IWUJSSURfTUVUQV9JTlRFUkZBQ0UoT01YTm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCmluZGV4IDUzMDhlMWMuLjg2YWQ5OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTI4LDYgKzI4LDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoqIFRoaXMgcmVkdW5kYW50IHJlZGVjbGFyYXRpb24gaXMgbmVlZGVkIGZvciBDKysgcHJlIDE0ICovCitjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0FEQVBUSVZFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0RZTkFNSUNfVElNRVNUQU1QW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0ZSQU1FX1BBUlNJTkdbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSFtdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfU0VDVVJFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX1RVTk5FTEVEX1BMQVlCQUNLW107CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKICAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOwpAQCAtNDAsMTYgKzQ5LDExIEBACiAgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBtRmxhZ3M7Ci19Ci0KIGNvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgewogICAgIHJldHVybiBtRGV0YWlsczsKIH0KIAotTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKLSAgOiBtRmxhZ3MoMCkgeworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkgewogICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOwogfQogCkBAIC03MywxMiArNzcsMTAgQEAKICAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKICAgICAgICAgfQogICAgIH0KLSAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBpZiAoZGV0YWlscyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7Ci0gICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOwogICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CiAgICAgfQogICAgIHJldHVybiBjYXBzOwpAQCAtOTYsNyArOTgsNiBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbG9yRm9ybWF0cy5zaXplKCk7IGkrKykgewogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOwogICAgIH0KLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUZsYWdzKTsKICAgICBtRGV0YWlscy0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTExMSw2ICsxMTIsMTQgQEAKICAgICBtQ2FwLT5tRGV0YWlscy0+c2V0SW50MzIoa2V5LCB2YWx1ZSk7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6cmVtb3ZlRGV0YWlsKGNvbnN0IGNoYXIqIGtleSkgeworICAgIGlmIChtQ2FwLT5tRGV0YWlscy0+cmVtb3ZlRW50cnlBdChtQ2FwLT5tRGV0YWlscy0+ZmluZEVudHJ5QnlOYW1lKGtleSkpID09IE9LKSB7CisgICAgICAgIEFMT0dEKCJzdWNjZXNzZnVsbHkgcmVtb3ZlZCBkZXRhaWwgJXMiLCBrZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJkZXRhaWwgJXMgd2Fzbid0IHByZXNlbnQgdG8gcmVtb3ZlIiwga2V5KTsKKyAgICB9Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkUHJvZmlsZUxldmVsKAogICAgICAgICB1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewogICAgIFByb2ZpbGVMZXZlbCBwcm9maWxlTGV2ZWw7CkBAIC0xMjksMzIgKzEzOCwzMiBAQAogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRGbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIG1DYXAtPm1GbGFncyB8PSBmbGFnczsKLX0KLQogTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzKiBjYXApIDogbUNhcChjYXApIHsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mbzo6aXNFbmNvZGVyKCkgY29uc3QgewotICAgIHJldHVybiBtSXNFbmNvZGVyOworTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMgTWVkaWFDb2RlY0luZm86OmdldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BdHRyaWJ1dGVzOwogfQogCi11aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6cmFuaygpIGNvbnN0IHsKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpnZXRSYW5rKCkgY29uc3QgewogICAgIHJldHVybiBtUmFuazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgewotICAgIG1pbWVzLT5jbGVhcigpOwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0IHsKKyAgICAqYWxpYXNlcyA9IG1BbGlhc2VzOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKFZlY3RvcjxBU3RyaW5nPiAqbWVkaWFUeXBlcykgY29uc3QgeworICAgIG1lZGlhVHlwZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICBtaW1lcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CisgICAgICAgIG1lZGlhVHlwZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOwogICAgIH0KIH0KIAogY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KLU1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgewotICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CitNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gbUNhcHMudmFsdWVBdChpeCk7CiAgICAgfQpAQCAtMTczLDIxICsxODIsMjYgQEAKIHNwPE1lZGlhQ29kZWNJbmZvPiBNZWRpYUNvZGVjSW5mbzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIEFTdHJpbmcgbmFtZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBBU3RyaW5nIG93bmVyID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGVzPihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHVpbnQzMl90IHJhbmsgPSBwYXJjZWwucmVhZFVpbnQzMigpOwogICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvOwogICAgIGluZm8tPm1OYW1lID0gbmFtZTsKICAgICBpbmZvLT5tT3duZXIgPSBvd25lcjsKLSAgICBpbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGluZm8tPm1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICBpbmZvLT5tUmFuayA9IHJhbms7CisgICAgc2l6ZV90IG51bUFsaWFzZXMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1BbGlhc2VzOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBhbGlhcyA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaW5mby0+bUFsaWFzZXMuYWRkKGFsaWFzKTsKKyAgICB9CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGlmIChjYXBzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1lZGlhVHlwZSwgY2Fwcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGluZm87CkBAIC0xOTYsOCArMjEwLDEyIEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewogICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBtT3duZXIud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSXNFbmNvZGVyKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUF0dHJpYnV0ZXMpOwogICAgIHBhcmNlbC0+d3JpdGVVaW50MzIobVJhbmspOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQWxpYXNlcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQVN0cmluZyAmYWxpYXMgOiBtQWxpYXNlcykgeworICAgICAgICBhbGlhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgfQogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ2Fwcy5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhcHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNhcHMua2V5QXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwpAQCAtMjA2LDEwICsyMjQsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXNzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgaWYgKG1pbWUpIHsKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobWVkaWFUeXBlKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgIGlmIChtQ2Fwcy5rZXlBdChpeCkuZXF1YWxzSWdub3JlQ2FzZShtaW1lKSkgeworICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1lZGlhVHlwZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNywxOSArMjM1LDI2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKSA6IG1SYW5rKDB4MTAwKSB7CitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKQorICAgIDogbUF0dHJpYnV0ZXMoKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKTApLAorICAgICAgbVJhbmsoMHgxMDApIHsKIH0KIAogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgbUluZm8tPm1OYW1lID0gbmFtZTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkQWxpYXMoY29uc3QgY2hhciogbmFtZSkgeworICAgIG1JbmZvLT5tQWxpYXNlcy5hZGQobmFtZSk7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKSB7CiAgICAgbUluZm8tPm1Pd25lciA9IG93bmVyOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyKSB7Ci0gICAgbUluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7Cit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRBdHRyaWJ1dGVzKAorICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcykgeworICAgIG1JbmZvLT5tQXR0cmlidXRlcyA9IChNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcylhdHRyaWJ1dGVzOwogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRSYW5rKHVpbnQzMl90IHJhbmspIHsKQEAgLTIzNywyMSArMjYyLDIxIEBACiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPgotICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNZWRpYVR5cGUoY29uc3QgY2hhciAqbWVkaWFUeXBlKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICAgICAgICAgIG1JbmZvLT5tQ2Fwcy52YWx1ZUF0KGl4KS5nZXQoKSkpOwogICAgIH0KICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMoKTsKLSAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWltZSksIGNhcHMpOworICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtZWRpYVR5cGUpLCBjYXBzKTsKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoY2Fwcy5nZXQoKSkpOwogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK2Jvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIG1JbmZvLT5tQ2Fwcy5yZW1vdmVJdGVtc0F0KGl4KTsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGUwZjVhNDAuLjk4YzU0OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC00OCw3ICs0OCw4IEBACiAgICAgeyJhbXJ3YiIsICBBVURJT19FTkNPREVSX0FNUl9XQn0sCiAgICAgeyJhYWMiLCAgICBBVURJT19FTkNPREVSX0FBQ30sCiAgICAgeyJoZWFhYyIsICBBVURJT19FTkNPREVSX0hFX0FBQ30sCi0gICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9CisgICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9LCAKKyAgICB7Im9wdXMiLCAgIEFVRElPX0VOQ09ERVJfT1BVU30KIH07CiAKIGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzRmlsZUZvcm1hdE1hcFtdID0gewpAQCAtOTEsNiArOTIsMTkgQEAKICAgICB7ImhpZ2hzcGVlZDcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFB9LAogICAgIHsiaGlnaHNwZWVkMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQfSwKICAgICB7ImhpZ2hzcGVlZDIxNjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUH0sCisKKyAgICAvLyBWZW5kb3Itc3BlY2lmaWMgcHJvZmlsZXMKKyAgICB7InZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1ZHQX0sCisgICAgeyI0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJfSwKKyAgICB7InRpbWVsYXBzZXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfVkdBfSwKKyAgICB7InRpbWVsYXBzZTRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80S0RDSX0sCisgICAgeyJoaWdoc3BlZWRjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRn0sCisgICAgeyJoaWdoc3BlZWR2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX1ZHQX0sCisgICAgeyJoaWdoc3BlZWQ0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0l9LAorICAgIHsicWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfUUhEfSwKKyAgICB7IjJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfMmt9LAorICAgIHsidGltZWxhcHNlcWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RSER9LAorICAgIHsidGltZWxhcHNlMmsiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrfSwKIH07CiAKICNpZiBMT0dfTkRFQlVHCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDVjYTNiNDguLmQ4ZWY5Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KIAogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogCiBzdGF0aWMgaW50IHJlYWRBdCh2b2lkICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgaW50IHBvcywgaW50IHNpemUpIHsKICAgICByZXR1cm4gKChhbmRyb2lkOjpNaWRpSW9XcmFwcGVyKiloYW5kbGUpLT5yZWFkQXQoYnVmZmVyLCBwb3MsIHNpemUpOwpAQCAtNDksMTAgKzUwLDQ3IEBACiAgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOwogfQogCi1NaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIHsKLSAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihEYXRhU291cmNlKSIpOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VVbndyYXBwZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBPSzsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG1Tb3VyY2UtPmhhbmRsZSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKG1Tb3VyY2UtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1Tb3VyY2U7Cit9OworCitNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UpIik7CiAgICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbUJhc2UgPSAwOworICAgIG1EYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2VVbndyYXBwZXIoY3NvdXJjZSk7CiAgICAgb2ZmNjRfdCBsOwogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmbCkgPT0gT0spIHsKICAgICAgICAgbUxlbmd0aCA9IGw7CkBAIC02Niw2ICsxMDQsNyBAQAogICAgIGlmIChtRmQgPj0gMCkgewogICAgICAgICBjbG9zZShtRmQpOwogICAgIH0KKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIGludCBNaWRpSW9XcmFwcGVyOjpyZWFkQXQodm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2I5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK21lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfSU8pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1VOS05PV04pIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQUxPR0UoIm5kayBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlmYjhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUZvcm1hdCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coc3A8QU1lc3NhZ2U+ICpkYXRhKSB7CisgICAgQUxPR1YoInByaXZhdGUgY3RvciIpOworICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7CisgICAgbURhdGEtPm1Gb3JtYXQgPSAqZGF0YTsKKyAgICBpZiAobURhdGEtPm1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZ290IE5VTEwgZm9ybWF0Iik7CisgICAgICAgIG1EYXRhLT5tRm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpIHsKKyAgICAqZGVzdCA9IG1EYXRhLT5tRm9ybWF0OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAppbmRleCAxMTg0MDdlLi5lYTA1NDdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApAQCAtMjcsMjMgKzI3LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKLS8vIFRlbXBvcmFyaWx5IGtlZXBpbmcgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoKSB3aGVyZSBpdCBpcyB1c2VkLgotLy8gV2lsbCBiZSByZW1vdmVkIHNvb24gaW4gZmF2b3Igb2Ygb2ZmaWNpYWwgcHVibGljIEFQSXMuCi1zdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBQnVmZmVyPiBtUHNzaEJ1ZjsKLX07Ci0KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqIGV4KSB7Ci0gICAgZXgtPm1JbXBsLT5kaXNjb25uZWN0KCk7Ci0gICAgcmV0dXJuIEFNRURJQV9PSzsKLX0KKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjksNiArNTcsMTEgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsCiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMsCiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MsCkBAIC0xMDMsNiArOTYsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQ2NFtdID0gewogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywKIH07CkBAIC0xMTQsNiArMTA4LDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEJ1ZmZlcltdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSSwKICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLApAQCAtMTMyLDYgKzEyOCw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyW10gPSB7CiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLAogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLAogfTsKIApAQCAtMTA4MiwxNCArMTA3OSw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QobUFNZWRpYUV4dHJhY3Rvcik7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOwotfQotCiBBTWVkaWFFeHRyYWN0b3IgKkFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEFNZWRpYUV4dHJhY3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUFNZWRpYUV4dHJhY3RvcjsKIH0KQEAgLTEyNjMsNDAgKzEyNTIsMjggQEAKICAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8obUFNZWRpYUV4dHJhY3RvcikpOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgb2ZmNjRfdCBzaXplID0gLTE7Ci0gICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOwotfQotCi12b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHNvdXJjZS0+Y2xvc2UoKTsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmNyeXB0b0luZm8gPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKTsKKyAgICBpZiAoY3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoY3J5cHRvSW5mbyk7CiB9CiAKIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOworICAgICAgbUFNZWRpYURhdGFTb3VyY2UoY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoZGF0YVNvdXJjZSkpIHsKK30KKworQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UgKmFEYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoTlVMTCksCisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShhRGF0YVNvdXJjZSkgewogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgewogICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKIH0KQEAgLTEzMDUsNCArMTI4Miw4IEBACiAgICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOwogfQogCit2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpjbG9zZSgpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ZDRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIHN0YXRpYyBzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gc1RpbWVDaGVja1RocmVhZCA9IG5ldyBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZCgpOwotICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKLSAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCi17Ci19Ci0KLVRpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKLSAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKLSAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLSAgICByZXR1cm4gZW5kVGltZU5zOwotfQotCi12b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1ib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7Ci0gICAgY29uc3QgY2hhciAqdGFnOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOwotICAgICAgICAvLyBLZXllZFZlY3RvciBtTW9uaXRvclJlcXVlc3RzIGlzIG9yZGVyZWQgc28gdGFrZSBmaXJzdCBlbnRyeSBhcyBuZXh0IHRpbWVvdXQKLSAgICAgICAgaWYgKG1Nb25pdG9yUmVxdWVzdHMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGVuZFRpbWVOcyA9IG1Nb25pdG9yUmVxdWVzdHMua2V5QXQoMCk7Ci0gICAgICAgICAgICB0YWcgPSBtTW9uaXRvclJlcXVlc3RzLnZhbHVlQXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBuc2Vjc190IHdhaXRUaW1lTnMgPSBlbmRUaW1lTnMgLSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIGlmICh3YWl0VGltZU5zID4gMCkgewotICAgICAgICAgICAgc3RhdHVzID0gbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWVOcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAppbmRleCA4NmRlZjAyLi4wMzAxYjIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcApAQCAtNzQsNiArNzQsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUlfQVJDKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKQEAgLTkzLDYgKzk0LDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVUyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9QUk9YWSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpLAogICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NUVUIpLApAQCAtMTMyLDYgKzEzNSw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMDUsNiArMjA5LDE0IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMV8wKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzApLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9MQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9DRUxUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFhfQURBUFRJVkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTEhEQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDX0xMKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMzUsNiArMjQ3LDEyIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0FCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BQiksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjgxLDYgKzI5OSw3IEBACiAKIHRlbXBsYXRlIDw+CiBjb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0RFRkFVTFQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9TWVNURU0pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUklORyksCkBAIC0zNTIsMTEgKzM3MSwzMCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0ZNX1RVTkVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0hPVFdPUkQpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKK3RlbXBsYXRlIDw+Citjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfU0VDVVJFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JFQUNPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfSE9UV09SRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JZUEFTU19NVVRFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19MT1dfTEFURU5DWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX05PX0NBUFRVUkUpLAorICAgIFRFUk1JTkFUT1IKK307CisKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKQEAgLTM3MCwyMCArNDA4LDEzIEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAogYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewogICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8CiAgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKIH0KIAotYm9vbCBkZXZpY2VUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSkgewotICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoZGV2aWNlLCBsaXRlcmFsRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gT3V0cHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0KLX0KLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxYmM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICogU2VydmljZSB0byByZWxvYWQgZXh0cmFjdG9yIHBsdWdpbnMgd2hlbiB1cGRhdGUgcGFja2FnZSBpcyBpbnN0YWxsZWQvdW5pbnN0YWxsZWQuCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSB7Ci0gICAgdm9pZCBsb2FkUGx1Z2lucyhAdXRmOEluQ3BwIFN0cmluZyBhcGtQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCmluZGV4IGQ2YTljZmIuLmVhNDE1MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaApAQCAtNzgsNiArNzgsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cwogICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKQEAgLTE4Niw2ICsxODcsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAKQEAgLTIxNiw2ICsyMTgsNTMgQEAKICAgICBib29sICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZDsgLy8gZmxhZyBmb3IgY3VycmVudCBwYXJhbWV0ZXJzIHZhbGlkaXR5CiB9OwogCisvLyBBZGp1c3RCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIGFkanVzdCBzYW1wbGUgZGF0YS4KKy8vIEV4cGFuZHMgb3IgY29udHJhY3RzIHNhbXBsZSBkYXRhIGZyb20gb25lIGludGVybGVhdmVkIGNoYW5uZWwgZm9ybWF0IHRvIGFub3RoZXIuCisvLyBFeHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kIG9mIGVhY2ggYXVkaW8gZnJhbWUuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGFyZSBvbWl0dGVkIGZyb20gdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorY2xhc3MgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCk7CisgICAgLy9PdmVycmlkZXMKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXM7Cit9OworCisvLyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXh0cmEgZXhwYW5kZWQgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkIGluIGZyb20gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgY29waWVkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gb3V0cHV0IGJ1ZmZlci4KK2NsYXNzIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGNvbnRyYWN0ZWRGb3JtYXQsIHNpemVfdCBjb250cmFjdGVkRnJhbWVDb3VudCwKKyAgICAgICAgICAgIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIC8vT3ZlcnJpZGVzCisgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIHBCdWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworCisgICAgdm9pZCBjbGVhckNvbnRyYWN0ZWRGcmFtZXMoKSB7IG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7IH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Db250cmFjdGVkRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkRnJhbWVDb3VudDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICptQ29udHJhY3RlZEJ1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemU7Cit9OwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKaW5kZXggZDJhM2U0MC4uZDk3Y2MwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaApAQCAtMTcsMTEgKzE3LDExIEBACiAjaWZuZGVmIEFORFJPSURfQlVGRkVSSU5HX1NFVFRJTkdTX0gKICNkZWZpbmUgQU5EUk9JRF9CVUZGRVJJTkdfU0VUVElOR1NfSAogCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzIDogcHVibGljIFBhcmNlbGFibGUgeworc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzIHsKICAgICBzdGF0aWMgY29uc3QgaW50IGtOb01hcmsgPSAtMTsKIAogICAgIGludCBtSW5pdGlhbE1hcmtNczsKQEAgLTMyLDkgKzMyLDYgQEAKIAogICAgIEJ1ZmZlcmluZ1NldHRpbmdzKCk7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAppbmRleCBmZjg3ODlkLi43M2MwMjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CiAKICNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTcyLDYgKzczLDcgQEAKIAogICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4+IG1QbHVnaW5WMV8yOwogCiAgICAgLyoqCiAgICAgICogbUluaXRDaGVjayBpczoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAppbmRleCBjMTkwMjYxLi40MzM2NzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCkBAIC0zMCw2ICszMCwxMSBAQAogLy8gQSBiaW5kZXIgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgYSBzdGFnZWZyaWdodCBEYXRhU291cmNlIHJlbW90ZWx5Lgogc3RydWN0IERhdGFTb3VyY2VEZXNjIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgorICAgIC8vIGludGVudGlvbmFsbHkgbGVzcyB0aGFuIElOVDY0X01BWAorICAgIC8vIGtlZXAgY29uc2lzdGVudCB3aXRoIEpBVkEgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lTXMgPSAweDdmZmZmZmZmZmZmZmZmZmxsIC8gMTAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4VGltZVVzID0ga01heFRpbWVNcyAqIDEwMDA7CisKICAgICBlbnVtIHsKICAgICAgICAgLyogTm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHlldCAqLwogICAgICAgICBUWVBFX05PTkUgICAgID0gMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCmluZGV4IGYyNjdmNzYuLmE2MzBiZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApAQCAtMjAsOSArMjAsMTEgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1NZXRyaWNzLmg+CkBAIC0zNiwxMCArMzgsMTQgQEAKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKK3R5cGVkZWYgZHJtOjpWMV8yOjpJRHJtUGx1Z2luTGlzdGVuZXIgSURybVBsdWdpbkxpc3RlbmVyX1YxXzI7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CkBAIC01MSwxMyArNTcsMTYgQEAKIAogc3RydWN0IERybUhhbCA6IHB1YmxpYyBCbkRybSwKICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgICAgICAgcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lciB7CisgICAgICAgICAgICAgICAgcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yIHsKICAgICBEcm1IYWwoKTsKICAgICB2aXJ0dWFsIH5Ecm1IYWwoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CkBAIC0xMTMsNiArMTIyLDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKQEAgLTE2OCw2ICsxODIsOCBAQAogICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpOwogCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCiAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyk7CiAKIHByaXZhdGU6CkBAIC0xODIsNiArMTk4LDcgQEAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CiAgICAgc3A8ZHJtOjpWMV8xOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMTsKKyAgICBzcDxkcm06OlYxXzI6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8yOwogICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwogCiAgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgpAQCAtMjEwLDYgKzIyNywxMSBAQAogICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWwpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggOGU5ZWIzYS4uZmJlODBjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTM0LDcgKzM0LDEwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXN1bHQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpID0gMDsKQEAgLTc1LDggKzc4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpID0gMDsKQEAgLTkxLDYgKzk0LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0ID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCmluZGV4IDQ1ZTk2MjAuLjVjZTJjZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfSU1FRElBRVhUUkFDVE9SU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfSU1FRElBRVhUUkFDVE9SU0VSVklDRV9ICiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTMzLDYgKzM1LDggQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYUV4dHJhY3Rvcj4gbWFrZUV4dHJhY3Rvcihjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSA9IDA7CiB9OwogCiBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDIxN2RlMTQuLmYyZTIwNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0yNiwxMSArMjYsMTEgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSU1lZGlhUGxheWVyOwogY2xhc3MgSU1lZGlhQ29kZWNMaXN0Owogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggMzc5MDAwZS4uZTdjNDY2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtNzMsNyArNzMsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpID0gMDsKLQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAppbmRleCBmYjExNDM1Li5lYTBhYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaApAQCAtMjYsOCArMjYsNyBAQAogcHVibGljOgogICAgIC8qIENyZWF0ZXMgYSBKYXZhIEF1ZGlvQXR0cmlidXRlcyBvYmplY3QuICovCiAgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKEpOSUVudiAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykgewogCiAgICAgICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyIik7CiAgICAgICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNTgsMTEgKzU3LDYgQEAKICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSB0aGUgJ3RhZ3MnIChjaGFyW10gdG8gSGFzaFNldDxTdHJpbmc+KS4KICAgICAgICAgICAgIC8vIEhvdyB0byBwYXJzZSB0aGUgY2hhcltdPyBJcyB0aGVyZSBhbnkgZXhhbXBsZSBvZiBpdD8KICAgICAgICAgICAgIC8vIEFsc28sIHRoZSBhZGRUYWdzKCkgbWV0aG9kIGlzIGhpZGRlbi4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENhbGwgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIuc2V0TGVnYWN5U3RyZWFtVHlwZSgpLmJ1aWxkKCkKLSAgICAgICAgICAgIGptZXRob2RJRCBqU2V0TGVnYWN5U3RyZWFtVHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRMZWdhY3lTdHJlYW1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOwotICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRMZWdhY3lTdHJlYW1UeXBlLCBzdHJlYW1UeXBlKTsKICAgICAgICAgfQogCiAgICAgICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmluZGV4IGIzNzc3ZDMuLjU0ZjU2NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC01MSwyMSArNTMsNDcgQEAKIAogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXNXcml0ZXI7CiAKKyAgICBlbnVtIEF0dHJpYnV0ZXMgOiBpbnQzMl90IHsKKyAgICAgICAgLy8gYXR0cmlidXRlIGZsYWdzCisgICAgICAgIGtGbGFnSXNFbmNvZGVyID0gMSA8PCAwLAorICAgICAgICBrRmxhZ0lzVmVuZG9yID0gMSA8PCAxLAorICAgICAgICBrRmxhZ0lzU29mdHdhcmVPbmx5ID0gMSA8PCAyLAorICAgICAgICBrRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZCA9IDEgPDwgMywKKyAgICB9OworCiAgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAvLyBkZWNvZGVyIGZsYWdzCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjayA9IDEgPDwgMCwKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNTZWN1cmVQbGF5YmFjayA9IDEgPDwgMSwKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNUdW5uZWxlZFBsYXliYWNrID0gMSA8PCAyLAorICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9BREFQVElWRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtYWRhcHRpdmUtcGxheWJhY2siOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9EWU5BTUlDX1RJTUVTVEFNUFtdID0gImZlYXR1cmUtZHluYW1pYy10aW1lc3RhbXAiOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9GUkFNRV9QQVJTSU5HW10gPSAiZmVhdHVyZS1mcmFtZS1wYXJzaW5nIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfSU5UUkFfUkVGUkVTSFtdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX01VTFRJUExFX0ZSQU1FU1tdID0gImZlYXR1cmUtbXVsdGlwbGUtZnJhbWVzIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfU0VDVVJFX1BMQVlCQUNLW10gPSAiZmVhdHVyZS1zZWN1cmUtcGxheWJhY2siOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9UVU5ORUxFRF9QTEFZQkFDS1tdID0gImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siOwogCi0gICAgICAgICAgICAvLyBlbmNvZGVyIGZsYWdzCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoID0gMSA8PCAwLAotCi0gICAgICAgIH07Ci0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBsZXZlbHMgZm9yIGVhY2ggc3VwcG9ydGVkIHByb2ZpbGUgaW4gYSB0YXJnZXQgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9maWxlTGV2ZWxzIHRhcmdldCBhcnJheSBmb3IgdGhlIHByb2ZpbGUgbGV2ZWxzLgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc3VwcG9ydGVkIGNvbG9yIGZvcm1hdHMgaW4gYSB0YXJnZXQgYXJyYXkuIE9ubHkgdXNlZCBmb3IgdmlkZW8vaW1hZ2UKKyAgICAgICAgICogY29tcG9uZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbG9yRm9ybWF0cyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBjb2xvciBmb3JtYXRzLgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdDsKLSAgICAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlYyBjYXBhYmlsaXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGNvbnRhaW5zOgorICAgICAgICAgKiAtIGZlYXR1cmVzLAorICAgICAgICAgKiAtIHBlcmZvcm1hbmNlIGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IGV4cG9zZSB0aGlzIGFzIHNlcGFyYXRlIEFQSS1zIGFuZCB3cmFwIGhlcmUuCisgICAgICAgICAqLwogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0RGV0YWlscygpIGNvbnN0OwogCiAgICAgcHJvdGVjdGVkOgpAQCAtNzMsNyArMTAxLDYgQEAKICAgICAgICAgU29ydGVkVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHNTb3J0ZWQ7CiAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0czsKICAgICAgICAgU29ydGVkVmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzU29ydGVkOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtRGV0YWlsczsKIAogICAgICAgICBDYXBhYmlsaXRpZXMoKTsKQEAgLTkzLDggKzEyMCw3IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBtb2RpZnlpbmcgaW5mb3JtYXRpb24gaW5zaWRlIGEgYENhcGFiaWxpdGllc2AKICAgICAgKiBvYmplY3QuIEFuIG9iamVjdCBvZiB0eXBlIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCi0gICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKClgIG9yCi0gICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyOjp1cGRhdGVNaW1lKClgLgorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWVkaWFUeXBlKClgLgogICAgICAqLwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXNXcml0ZXIgewogICAgICAgICAvKioKQEAgLTEyMiw2ICsxNDgsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCB2YWx1ZSk7CiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgbGlzdCBvZiBkZXRhaWxzLiBJZiB0aGUga2V5IGlzIG5vdAorICAgICAgICAgKiBwcmVzZW50LCB0aGlzIGNhbGwgZG9lcyBub3RoaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlbW92ZURldGFpbChjb25zdCBjaGFyKiBrZXkpOworICAgICAgICAvKioKICAgICAgICAgICogQWRkIGEgcHJvZmlsZS1sZXZlbCBwYWlyLiBJZiB0aGlzIHByb2ZpbGUtbGV2ZWwgcGFpciBhbHJlYWR5IGV4aXN0cywKICAgICAgICAgICogaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICAgKgpAQCAtMTM2LDEzICsxNjksNyBAQAogICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBjb2xvciBmb3JtYXQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgZmxhZ3MuIFRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiBpcyBiaXR3aXNlLW9yLiBJbiBvdGhlciB3b3JkcywKLSAgICAgICAgICogYml0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmbGFncyBUaGUgYWRkaXRpb25hbCBmbGFncy4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgYWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBhc3NvY2lhdGVkIGBDYXBhYmlsaXRpZXNgIG9iamVjdC4KQEAgLTE1OCwxOSArMTg1LDQyIEBACiAgICAgICAgIGZyaWVuZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKICAgICB9OwogCi0gICAgYm9vbCBpc0VuY29kZXIoKSBjb25zdDsKLSAgICB2b2lkIGdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0OwotICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworICAgIGlubGluZSBib29sIGlzRW5jb2RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKSAmIGtGbGFnSXNFbmNvZGVyOworICAgIH0KKworICAgIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIGNvbnN0OworICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWVkaWFUeXBlcyhWZWN0b3I8QVN0cmluZz4gKm1lZGlhVHlwZXMpIGNvbnN0OworICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKCkgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmVjdG9yIGNvbnRhaW5pbmcgYWx0ZXJuYXRlIG5hbWVzIGZvciB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxpYXNlcyB0aGUgZGVzdGluYXRpb24gYXJyYXkgZm9yIHRoZSBhbGlhc2VzLiBUaGlzIGlzIGNsZWFyZWQuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBjb2RlY3MgbWF5IHNoYXJlIGFsdGVybmF0ZSBuYW1lcyBhcyBsb25nIGFzIHRoZWlyIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmUKKyAgICAgKiBkaXN0aW5jdDsgaG93ZXZlciwgdGhlc2Ugd2lsbCByZXN1bHQgaW4gZGlmZmVyZW50IGFsaWFzZXMgZm9yIHRoZSBNZWRpYUNvZGVjIHVzZXIgYXMKKyAgICAgKiB0aGUgY2Fub25pY2FsIGNvZGVjIGhhcyB0byBiZSByZXNvbHZlZCB3aXRob3V0IGtub3dpbmcgdGhlIG1lZGlhIHR5cGUgaW4KKyAgICAgKiBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUuCisgICAgICovCisgICAgdm9pZCBnZXRBbGlhc2VzKFZlY3RvcjxBU3RyaW5nPiAqYWxpYXNlcykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhhdCBob3N0cyB0aGUgY29kZWMuIFRoaXMgdmFsdWUgaXMgbm90CiAgICAgICogdmlzaWJsZSBhdCB0aGUgSmF2YSBsZXZlbC4KICAgICAgKgogICAgICAqIEN1cnJlbnRseSwgdGhpcyBpcyB0aGUgImluc3RhbmNlIG5hbWUiIG9mIHRoZSBJT214IHNlcnZpY2UuCiAgICAgICovCiAgICAgY29uc3QgY2hhciAqZ2V0T3duZXJOYW1lKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgcmFuaygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmFuayBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGVjaG5pY2FsbHkgdGhpcyBpcyBkZWZpbmVkIHRvIGJlIHBlciBtZWRpYSB0eXBlLCBidXQgdGhhdCBtYWtlcyBvcmRlcmluZyB0aGUgTWVkaWFDb2RlY0xpc3QKKyAgICAgKiBpbXBvc3NpYmxlIGFzIE1lZGlhQ29kZWNMaXN0IGlzIG9yZGVyZWQgYnkgY29kZWMgbmFtZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRSYW5rKCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemF0aW9uIG92ZXIgQmluZGVyCkBAIC0xODEsMTEgKzIzMSwxMiBAQAogcHJpdmF0ZToKICAgICBBU3RyaW5nIG1OYW1lOwogICAgIEFTdHJpbmcgbU93bmVyOwotICAgIGJvb2wgbUlzRW5jb2RlcjsKKyAgICBBdHRyaWJ1dGVzIG1BdHRyaWJ1dGVzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKKyAgICBWZWN0b3I8QVN0cmluZz4gbUFsaWFzZXM7CiAgICAgdWludDMyX3QgbVJhbms7CiAKLSAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LiBBZnRlciB0aGUgY29uc3RydWN0aW9uLCBpdHMKQEAgLTIxOSw2ICsyNzAsMTMgQEAKICAgICAgKi8KICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7CiAgICAgLyoqCisgICAgICogQWRkcyBhbiBhbGlhcyAoYWx0ZXJuYXRlIG5hbWUpIGZvciB0aGUgY29kZWMuIE11bHRpcGxlIGNvZGVjcyBjYW4gc2hhcmUgYW4gYWx0ZXJuYXRlIG5hbWUKKyAgICAgKiBhcyBsb25nIGFzIHRoZWlyIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmUgZGlzdGluY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhbiBhbHRlcm5hdGUgbmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEFsaWFzKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIC8qKgogICAgICAqIFNldCB0aGUgb3duZXIgbmFtZSBvZiB0aGUgY29kZWMuCiAgICAgICoKICAgICAgKiBUaGlzICJvd25lciBuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgYElPbXhgIGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhpcwpAQCAtMjI4LDMyICsyODYsMzIgQEAKICAgICAgKi8KICAgICB2b2lkIHNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKTsKICAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqIFNldHMgY29kZWMgYXR0cmlidXRlcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBpc0VuY29kZXIgV2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIENvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICovCi0gICAgdm9pZCBzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyID0gdHJ1ZSk7CisgICAgdm9pZCBzZXRBdHRyaWJ1dGVzKHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRyaWJ1dGVzKTsKICAgICAvKioKLSAgICAgKiBBZGQgYSBtaW1lIHRvIGFuIGluZGV4ZWQgbGlzdCBhbmQgcmV0dXJuIGEgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0CisgICAgICogQWRkIGEgbWVkaWEgdHlwZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAogICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGlmeWluZyB0aGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYC4KICAgICAgKgotICAgICAqIElmIHRoZSBtaW1lIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQotICAgICAqIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4KKyAgICAgKiBJZiB0aGUgbWVkaWEgdHlwZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG1pbWUgVGhlIG5hbWUgb2YgYSBuZXcgbWltZSB0byBhZGQuCisgICAgICogQHBhcmFtW2luXSBtZWRpYVR5cGUgVGhlIG5hbWUgb2YgYSBuZXcgbWVkaWEgdHlwZSB0byBhZGQuCiAgICAgICogQHJldHVybiB3cml0ZXIgVGhlIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdCBmb3IgbW9kaWZ5aW5nIHRoZQotICAgICAqIGBDYXBhYmlsaXRpZXNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4gYHdyaXRlcmAgd2lsbCBiZSB2YWxpZAotICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgbWltZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgorICAgICAqIGBDYXBhYmlsaXRpZXNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgdHlwZS4gYHdyaXRlcmAgd2lsbCBiZSB2YWxpZAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgbWVkaWFUeXBlYCBhbHJlYWR5IGV4aXN0cyBvciBub3QuCiAgICAgICovCi0gICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1pbWUoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gYWRkTWVkaWFUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciogbWVkaWFUeXBlKTsKICAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBtaW1lLgorICAgICAqIFJlbW92ZSBhIG1lZGlhIHR5cGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbWltZSBUaGUgbmFtZSBvZiB0aGUgbWltZSB0byByZW1vdmUuCi0gICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1pbWVgIGlzIHJlbW92ZWQ7IGBmYWxzZWAgaWYgYG1pbWVgIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIHRoZSBtZWRpYSB0eXBlIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIGB0cnVlYCBpZiBgbWVkaWFUeXBlYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtZWRpYVR5cGVgIGlzIG5vdCBmb3VuZC4KICAgICAgKi8KLSAgICBib29sIHJlbW92ZU1pbWUoY29uc3QgY2hhciogbWltZSk7CisgICAgYm9vbCByZW1vdmVNZWRpYVR5cGUoY29uc3QgY2hhciogbWVkaWFUeXBlKTsKICAgICAvKioKICAgICAgKiBTZXQgcmFuayBvZiB0aGUgY29kZWMuIE1lZGlhQ29kZWNMaXN0IHdpbGwgc3RhYmxlLXNvcnQgdGhlIGxpc3QgYWNjb3JkaW5nCiAgICAgICogdG8gcmFuayBpbiBub24tZGVzY2VuZGluZyBvcmRlci4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggMGZlYjRmMy4uM2U4ZTdjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTM0LDcgKzM0LDExIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFAgPSA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1FWR0EgPSA3LAogICAgIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQID0gOCwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVkdBID0gOSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV80S0RDSSA9IDEwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1FIRCA9IDExLAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzJrID0gMTIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSAxMiwKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9TVEFSVCA9IDEwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cgID0gMTAwMCwKQEAgLTQ2LDcgKzUwLDExIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RVkdBID0gMTAwNywKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQID0gMTAwOCwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1ZHQSA9IDEwMDksCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80S0RDSSA9IDEwMTAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RSEQgPSAxMDExLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMmsgPSAxMDEyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQgPSAxMDEyLAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX1NUQVJUID0gMjAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPVyAgPSAyMDAwLApAQCAtNTUsNyArNjMsMTAgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFAgPSAyMDAzLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFAgPSAyMDA0LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMjE2MFAgPSAyMDA1LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA1LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfQ0lGID0gMjAwNiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX1ZHQSA9IDIwMDcsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80S0RDSSA9IDIwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDgsCiB9OwogCiBlbnVtIHZpZGVvX2RlY29kZXIgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDUzNDBkZGUuLmUxYzVkNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTcyLDYgKzcyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCA9IDA7CiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCmluZGV4IGI1ZTU2NWUuLmIxOWQ0OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCkBAIC0yMywxMSArMjMsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyOworCiBjbGFzcyBNaWRpSW9XcmFwcGVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKTsKLSAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpOwogCiAgICAgfk1pZGlJb1dyYXBwZXIoKTsKIApAQCAtNDAsNyArNDMsNyBAQAogICAgIGludCBtRmQ7CiAgICAgb2ZmNjRfdCBtQmFzZTsKICAgICBpbnQ2NF90ICBtTGVuZ3RoOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyICptRGF0YVNvdXJjZTsKICAgICBFQVNfRklMRSBtRWFzRmlsZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKaW5kZXggYzk3ZDE3MS4uOGE0MTdmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKQEAgLTI3OCw2ICsyNzgsMjUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDb2RlY1dyYXBwZXIpOwogfTsKIAorc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworCisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4mKTsKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlKik7CisKKyAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7CisKKyAgICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOworfTsKKwogc3RydWN0IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAKICAgICBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKTsKQEAgLTI4Nyw4ICszMDYsNiBAQAogCiAgICAgc3RhdHVzX3QgcmVsZWFzZSgpOwogCi0gICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwotCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKQEAgLTMzOSwzMSArMzU2LDYgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKTsKIH07CiAKLXN0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpOwotCi0gICAgc3RhdGljIHZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOwotfTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOREtfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3MjJhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisjZGVmaW5lIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKy8vIFRoaXMgaXMgYSBoZWFkZXItb25seSB1dGlsaXR5LgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhdGNoQnVpbGRlciB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBtaXhfdXNlY2FzZV90ID0gZGVjbHR5cGUoYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dDo6dXNlY2FzZSk7CisKKyAgICBQYXRjaEJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBbGwgZXhpc3RpbmcgbWV0aG9kcyBvcGVyYXRpbmcgb24gYXVkaW8gcGF0Y2hlcyB0YWtlIGEgcG9pbnRlciB0byBjb25zdC4KKyAgICAvLyBJdCdzIE9LIHRvIGNvbnN0cnVjdCBhIHRlbXBvcmFyeSBQYXRjaEJ1aWxkZXIgd2hpbGUgcHJlcGFyaW5nIGEgcGFyYW1ldGVyCisgICAgLy8gdG8gc3VjaCBhIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIEJ1aWxkZXIgd2lsbCBiZSBrZXB0IGFsaXZlIHVudGlsIHRoZSBjb2RlCisgICAgLy8gZXhlY3V0aW9uIHJlYWNoZXMgdGhlIGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50IHNlbWljb2xvbi4KKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoKCkgY29uc3QgeyByZXR1cm4gJm1QYXRjaDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBQb3J0Q2ZncyB7CisgICAgICAgIFBvcnRDZmdzKHVuc2lnbmVkIGludCAqY291bnRQdHIsIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqcG9ydENmZ3MpCisgICAgICAgICAgICAgICAgOiBtQ291bnRQdHIoY291bnRQdHIpLCBtUG9ydENmZ3MocG9ydENmZ3MpIHt9CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3QgYXVkaW9fcG9ydF9jb25maWcmIHBvcnRDZmcpIHsKKyAgICAgICAgICAgIHJldHVybiAqYWR2YW5jZSgpID0gcG9ydENmZzsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHkpIHsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnKiBhZGRlZCA9IGFkdmFuY2UoKTsKKyAgICAgICAgICAgIGVudGl0eS0+dG9BdWRpb1BvcnRDb25maWcoYWRkZWQpOworICAgICAgICAgICAgcmV0dXJuICphZGRlZDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1c2VjYXNlVXBkYXRlKSB7CisgICAgICAgICAgICBhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksCisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxtaXhfdXNlY2FzZV90KGNvbnN0IG1peF91c2VjYXNlX3QmKT4gdXNlY2FzZVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIG1peF91c2VjYXNlX3QqIHVzZWNhc2UgPSAmYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlOworICAgICAgICAgICAgKnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlcigqdXNlY2FzZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBhZHZhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuICZtUG9ydENmZ3NbKCptQ291bnRQdHIpKytdOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGludCAqbUNvdW50UHRyOworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKm1Qb3J0Q2ZnczsKKyAgICB9OworCisgICAgUG9ydENmZ3Mgc2lua3MoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsgfQorICAgIFBvcnRDZmdzIHNvdXJjZXMoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7IH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2ggPSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKaW5kZXggZDQyMzk2Mi4uYzI3NjFjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKQEAgLTk5LDYgKzk5LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHdyaXR0ZW4gKG9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2hhcmVkIGJ1ZmZlciBhZnRlciBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpZiBubyB2YWx1ZSB3YXMgd3JpdHRlbikuCisgICAgICAgIFQgbGFzdCgpIGNvbnN0CisgICAgICAgIHsgICAvLyBhc3N1bWUgbm8gc2VxdWVuY2UgY2hlY2sgcmVxdWlyZWQgLSB3ZSBhcmUgdGhlIHdyaXRlci4KKyAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tVmFsdWU7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKICAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKaW5kZXggODZmMGQ0Yy4uM2FjZmU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMCw3NyArMzEsNTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgU2FtcGxlUmF0ZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBEZXZpY2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2RldmljZXNfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Ci1zdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IE91dHB1dEZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX291dHB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgSW5wdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19pbnB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRm9ybWF0VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19mb3JtYXRfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IENoYW5uZWxUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2NoYW5uZWxfbWFza190IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IEdhaW5Nb2RlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19nYWluX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFN0cmVhbVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc3RyZWFtX3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fbW9kZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQXVkaW9Db250ZW50VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jb250ZW50X3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFVzYWdlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb191c2FnZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgU291cmNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19zb3VyY2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19OwogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgRGVmYXVsdFRyYWl0cwogewogICAgIHR5cGVkZWYgVCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5wdXNoX2JhY2sodmFsdWUpOworICAgIH0KIH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBWZWN0b3JUcmFpdHMKK3sKKyAgICB0eXBlZGVmIFQgVHlwZTsKKyAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTb3J0ZWRWZWN0b3JUcmFpdHMKK3sKKyAgICB0eXBlZGVmIFQgVHlwZTsKKyAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgIH0KK307CisKK3VzaW5nIFNhbXBsZVJhdGVUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8dWludDMyX3Q+OwordXNpbmcgRGV2aWNlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19kZXZpY2VzX3Q+Oworc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307CitzdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9OwordXNpbmcgQ2hhbm5lbFRyYWl0cyA9IFNvcnRlZFZlY3RvclRyYWl0czxhdWRpb19jaGFubmVsX21hc2tfdD47CitzdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9OwordXNpbmcgSW5wdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19pbnB1dF9mbGFnc190PjsKK3VzaW5nIE91dHB1dEZsYWdUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX291dHB1dF9mbGFnc190PjsKK3VzaW5nIEZvcm1hdFRyYWl0cyA9IFZlY3RvclRyYWl0czxhdWRpb19mb3JtYXRfdD47Cit1c2luZyBHYWluTW9kZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZ2Fpbl9tb2RlX3Q+OwordXNpbmcgU3RyZWFtVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19zdHJlYW1fdHlwZV90PjsKK3VzaW5nIEF1ZGlvTW9kZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fbW9kZV90PjsKK3VzaW5nIEF1ZGlvQ29udGVudFRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fY29udGVudF90eXBlX3Q+OwordXNpbmcgVXNhZ2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3VzYWdlX3Q+OwordXNpbmcgU291cmNlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19zb3VyY2VfdD47CitzdHJ1Y3QgQXVkaW9GbGFnVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8YXVkaW9fZmxhZ3NfbWFza190PiB7fTsKIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KIHN0YXRpYyB2b2lkIGNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKQEAgLTExMCw3ICs4OSw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyICpjc3RyID0gc3RydG9rKGxpdGVyYWwsIGRlbCk7IGNzdHIgIT0gTlVMTDsgY3N0ciA9IHN0cnRvayhOVUxMLCBkZWwpKSB7CiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKICAgICAgICAgaWYgKHV0aWxpdGllczo6Y29udmVydFRvPHN0ZDo6c3RyaW5nLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgPihjc3RyLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIFRyYWl0czo6YWRkKGNvbGxlY3Rpb24sIHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KICAgICBmcmVlKGxpdGVyYWwpOwpAQCAtMTgxLDcgKzE2MCw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyICpjc3RyID0gc3RydG9rKGxpdGVyYWwsIGRlbCk7IGNzdHIgIT0gTlVMTDsgY3N0ciA9IHN0cnRvayhOVUxMLCBkZWwpKSB7CiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKICAgICAgICAgaWYgKGZyb21TdHJpbmcoY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTIzNCw2ICsyMTMsNyBAQAogdHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz4gQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz4gVXNhZ2VUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz4gU291cmNlVHlwZUNvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+IEF1ZGlvRmxhZ0NvbnZlcnRlcjsKIAogdGVtcGxhdGU8PiBjb25zdCBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107CkBAIC0yNDksMTEgKzIyOSwxMCBAQAogdGVtcGxhdGU8PiBjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwogCiBib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKTsKIAotYm9vbCBkZXZpY2VUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSk7Ci0KIFNhbXBsZVJhdGVUcmFpdHM6OkNvbGxlY3Rpb24gc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzYW1wbGluZ1JhdGVzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIApAQCAtMjc0LDYgKzI1Myw2NSBAQAogT3V0cHV0Q2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb3V0Q2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCisvLyBjb3VudGluZyBlbnVtZXJhdGlvbnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBhdWRpb19jb250ZW50X3R5cGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fbW9kZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zb3VyY2VfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc3RyZWFtX3R5cGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fdXNhZ2VfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludD4gPSAwPgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgcmV0dXJuIFR5cGVDb252ZXJ0ZXI8RGVmYXVsdFRyYWl0czxUPj46OnRvU3RyaW5nKHZhbHVlLCByZXN1bHQpCisgICAgICAgICAgICA/IHJlc3VsdCA6IHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludD4odmFsdWUpKTsKKworfQorCisvLyBmbGFnIGVudW1lcmF0aW9ucwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGF1ZGlvX2dhaW5fbW9kZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19pbnB1dF9mbGFnc190Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19vdXRwdXRfZmxhZ3NfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludD4gPSAwPgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgVHlwZUNvbnZlcnRlcjxEZWZhdWx0VHJhaXRzPFQ+Pjo6bWFza1RvU3RyaW5nKHZhbHVlLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fZGV2aWNlc190JiBkZXZpY2VzKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7CisgICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUT0RPOiBSZW1vdmUgd2hlbiBGb3JtYXRUcmFpdHMgdXNlcyBEZWZhdWx0VHJhaXRzLgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19mb3JtYXRfdCYgZm9ybWF0KQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXR1cm4gVHlwZUNvbnZlcnRlcjxWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+Pjo6dG9TdHJpbmcoZm9ybWF0LCByZXN1bHQpCisgICAgICAgICAgICA/IHJlc3VsdCA6IHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludD4oZm9ybWF0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKQoreworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgcmVzdWx0IDw8ICJ7IENvbnRlbnQgdHlwZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkKKyAgICAgICAgICAgPDwgIiBVc2FnZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnVzYWdlKQorICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnNvdXJjZSkKKyAgICAgICAgICAgPDwgIiBGbGFnczogIiA8PCBhdHRyaWJ1dGVzLmZsYWdzCisgICAgICAgICAgIDw8ICIgVGFnczogIiA8PCBhdHRyaWJ1dGVzLnRhZ3MKKyAgICAgICAgICAgPDwgIiB9IjsKKworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLypBTkRST0lEX1RZUEVfQ09OVkVSVEVSX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggZDhiMGZlNy4uMzNiZTU1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBPVVRQVVRfRk9STUFUX0FBQ19BRFRTID0gNiwKIAogICAgIE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9FTkQgPSA3LCAvLyBVc2VkIGluIHZhbGlkYXRpbmcgdGhlIG91dHB1dCBmb3JtYXQuICBTaG91bGQgYmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBhdCB0aGUgZW5kIG9mIHRoZSBhdWRpbyBvbmx5IG91dHB1dCBmb3JtYXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBhdWRpbyBvbmx5IG91dHB1dCBmb3JtYXRzLgogCiAgICAgLyogU3RyZWFtIG92ZXIgYSBzb2NrZXQsIGxpbWl0ZWQgdG8gYSBzaW5nbGUgc3RyZWFtICovCiAgICAgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQID0gNywKQEAgLTgxLDYgKzgxLDkgQEAKICAgICAvKiBIRUlDIGRhdGEgaW4gYSBIRUlGIGNvbnRhaW5lciAqLwogICAgIE9VVFBVVF9GT1JNQVRfSEVJRiA9IDEwLAogCisgICAgLyogT3B1cyBkYXRhIGluIGEgT0dHIGNvbnRhaW5lciAqLworICAgIE9VVFBVVF9GT1JNQVRfT0dHID0gMTEsCisKICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKIH07CiAKQEAgLTkyLDYgKzk1LDcgQEAKICAgICBBVURJT19FTkNPREVSX0hFX0FBQyA9IDQsCiAgICAgQVVESU9fRU5DT0RFUl9BQUNfRUxEID0gNSwKICAgICBBVURJT19FTkNPREVSX1ZPUkJJUyA9IDYsCisgICAgQVVESU9fRU5DT0RFUl9PUFVTID0gNywKIAogICAgIEFVRElPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGF1ZGlvIGVuY29kZXIgdHlwZQogfTsKQEAgLTExMSw5ICsxMTUsNiBAQAogICogVGhlIHN0YXRlIG1hY2hpbmUgb2YgdGhlIG1lZGlhX3JlY29yZGVyLgogICovCiBlbnVtIG1lZGlhX3JlY29yZGVyX3N0YXRlcyB7Ci0gICAgLy8gRXJyb3Igc3RhdGUuCi0gICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gICAgICAwLAotCiAgICAgLy8gUmVjb3JkZXIgd2FzIGp1c3QgY3JlYXRlZC4KICAgICBNRURJQV9SRUNPUkRFUl9JRExFICAgICAgICAgICAgICAgICAgPSAxIDw8IDAsCiAKQEAgLTEyOCw2ICsxMjksOSBAQAogCiAgICAgLy8gUmVjb3JkaW5nIGlzIGluIHByb2dyZXNzLgogICAgIE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAgICAgICAgICAgICA9IDEgPDwgNCwKKworICAgIC8vIEVycm9yIHN0YXRlLgorICAgIE1FRElBX1JFQ09SREVSX0VSUk9SICAgICAgICAgICAgICAgICA9IDEgPDwgNSwKIH07CiAKIC8vIFRoZSAibXNnIiBjb2RlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgaW4gbm90aWZ5LgpAQCAtMjYwLDYgKzI2NCw3IEBACiAgICAgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpOwogICAgIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgc3RhdHVzX3QgICAgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZG9DbGVhblVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmluZGV4IGVlYmM4YzYuLjFkYjQyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCkBAIC01OSw3ICs1OSw3IEBACiAgKiAtIFRXID0gVHJlYmxlIFdyYXBwZXIgLS0tIEl0IHdyYXBzIGEgbGVnYWN5IG9iamVjdCBpbnNpZGUgYSBUcmVibGUgb2JqZWN0LgogICovCiAKLXN0cnVjdCBMV09teE5vZGUgOiBwdWJsaWMgSDJCQ29udmVydGVyPElPbXhOb2RlLCBJT01YTm9kZSwgQm5PTVhOb2RlPiB7CitzdHJ1Y3QgTFdPbXhOb2RlIDogcHVibGljIEgyQkNvbnZlcnRlcjxJT214Tm9kZSwgQm5PTVhOb2RlPiB7CiAgICAgTFdPbXhOb2RlKHNwPElPbXhOb2RlPiBjb25zdCYgYmFzZSkgOiBDQmFzZShiYXNlKSB7fQogICAgIHN0YXR1c190IGZyZWVOb2RlKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDkyY2ZiMWMuLmQwN2U3MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC04NDIsNCArODQyLDE1IEBACiAgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0Cit7CisgICAgQUxPR1YoImdldFBvcnRJZCIpOworCisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldFBvcnRJZChwb3J0SWQpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDMxZDFkZjkuLjFlZDFkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAKIEJuU3RhdHVzIExXR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAogICAgICAgICBjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSB7Ci0gICAgc3A8SU9teE5vZGU+IGhPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgc3A8SU9teE5vZGU+IGhPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlPElPbXhOb2RlPigpOwogICAgIHJldHVybiB0b0JpbmRlclN0YXR1cyhtQmFzZS0+Y29uZmlndXJlKAogICAgICAgICAgICAgaE9teE5vZGUgPT0gbnVsbHB0ciA/IG5ldyBUV09teE5vZGUob214Tm9kZSkgOiBoT214Tm9kZSwKICAgICAgICAgICAgIHRvSGFyZHdhcmVEYXRhc3BhY2UoZGF0YVNwYWNlKSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2I4ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJtZWRpYWV4dHJhY3RvciIsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVduby1tdWx0aWNoYXIiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlckJhc2UuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyR3JvdXAuY3BwIiwKLSAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCi0gICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiTWV0YURhdGEuY3BwIiwKLSAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAotICAgICAgICAiVm9yYmlzQ29tbWVudC5jcHAiLAotICAgIF0sCi0KLSAgICBjbGFuZzogdHJ1ZSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5N2IzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBNZWRpYUJ1ZmZlcjo6bVVzZVNoYXJlZE1lbW9yeSgwKTsKLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoZGF0YSksCi0gICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKHRydWUpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLSAgICBpZiAoc2l6ZSA8IGtTaGFyZWRNZW1UaHJlc2hvbGQKLSAgICAgICAgICAgIHx8IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1Vc2VTaGFyZWRNZW1vcnksIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpID09IDApIHsKLSAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lbW9yeURlYWxlcihzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCAiTWVkaWFCdWZmZXIiKTsKLSAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSwgdHJ5aW5nIHJlZ3VsYXIgYWxsb2NhdGlvbiEiKTsKLSAgICAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKW1NZW1vcnktPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKTsKLSAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShidWZmZXItPmRhdGEoKSksCi0gICAgICBtU2l6ZShidWZmZXItPnNpemUoKSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAotICAgICAgbUJ1ZmZlcihidWZmZXIpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7Ci0gICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHByZXZDb3VudCA9IG1SZWZDb3VudC5mZXRjaF9zdWIoMSk7Ci0gICAgaWYgKHByZXZDb3VudCA9PSAxKSB7Ci0gICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtT2JzZXJ2ZXItPnNpZ25hbEJ1ZmZlclJldHVybmVkKHRoaXMpOwotICAgIH0KLSAgICBDSEVDSyhwcmV2Q291bnQgPiAwKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6Y2xhaW0oKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyICE9IE5VTEwpOwotICAgIENIRUNLX0VRKG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLCAxKTsKLQotICAgIG1SZWZDb3VudC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKLSAgICAodm9pZCkgbVJlZkNvdW50LmZldGNoX2FkZCgxKTsKLX0KLQotdm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TaXplOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX29mZnNldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlT2Zmc2V0OwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX2xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlTGVuZ3RoOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgewotICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkgewotICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKLSAgICB9Ci0gICAgQ0hFQ0sob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKTsKLQotICAgIG1SYW5nZU9mZnNldCA9IG9mZnNldDsKLSAgICBtUmFuZ2VMZW5ndGggPSBsZW5ndGg7Ci19Ci0KLU1ldGFEYXRhQmFzZSYgTWVkaWFCdWZmZXI6Om1ldGFfZGF0YSgpIHsKLSAgICByZXR1cm4gKm1NZXRhRGF0YTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6cmVzZXQoKSB7Ci0gICAgbU1ldGFEYXRhLT5jbGVhcigpOwotICAgIHNldF9yYW5nZSgwLCBtU2l6ZSk7Ci19Ci0KLU1lZGlhQnVmZmVyOjp+TWVkaWFCdWZmZXIoKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyID09IE5VTEwpOwotCi0gICAgaWYgKG1Pd25zRGF0YSAmJiBtRGF0YSAhPSBOVUxMICYmIG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1EYXRhKTsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtT3JpZ2luYWwgIT0gTlVMTCkgewotICAgICAgICBtT3JpZ2luYWwtPnJlbGVhc2UoKTsKLSAgICAgICAgbU9yaWdpbmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgIGlmIChtTWVtb3J5LmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPnNldERlYWRPYmplY3QoKTsKLSAgIH0KLSAgIGRlbGV0ZSBtTWV0YURhdGE7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm9ic2VydmVyKSB7Ci0gICAgQ0hFQ0sob2JzZXJ2ZXIgPT0gTlVMTCB8fCBtT2JzZXJ2ZXIgPT0gTlVMTCk7Ci0gICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLU1lZGlhQnVmZmVyQmFzZSAqTWVkaWFCdWZmZXI6OmNsb25lKCkgewotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobURhdGEsIG1TaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aCk7Ci0gICAgYnVmZmVyLT5tTWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCptTWV0YURhdGEpOwotCi0gICAgYWRkX3JlZigpOwotICAgIGJ1ZmZlci0+bU9yaWdpbmFsID0gdGhpczsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYThkZDQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KLQotLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCi0vLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KLXN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKLSAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKLQotc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA6OkludGVybmFsRGF0YSB7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KLSAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1CdWZmZXJzOwotfTsKLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7Ci0gICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7Ci0gICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKLQotICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7Ci0gICAgICAgIEFMT0dXKCJQcmVhbGxvY2F0ZWQgYnVmZmVycyAlenUgPiBncm93dGhMaW1pdCAlenUsIGluY3JlYXNpbmcgZ3Jvd3RoTGltaXQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcnMsIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KTsKLSAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBidWZmZXJzOwotICAgIH0KLQotICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7Ci0gICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCi0gICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCi0KLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKLSAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOwotICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKLSAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKLSAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAotICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7Ci0KLSAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKLSAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0gICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKLSAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgotICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1JbnRlcm5hbDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotCi0gICAgLy8gaWYgd2UncmUgYWJvdmUgb3VyIGdyb3d0aCBsaW1pdCwgcmVsZWFzZSBidWZmZXJzIGlmIHdlIGNhbgotICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMAotICAgICAgICAgICAgJiYgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPj0gbUludGVybmFsLT5tR3Jvd3RoTGltaXQKLSAgICAgICAgICAgICYmIGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7KSB7Ci0gICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVyYXNlKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICsraXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7Ci0gICAgaWYgKG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBhZGQgbW9yZSBidWZmZXJzIGludGVybmFsbHkuCi0gICAgfQotICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCi0gICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCi0gICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQotICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgewotICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSB2cyBhdmFpbGFibGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLCAoKmZyZWUpLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAqZnJlZSA9IGJ1ZmZlcjsgLy8gaW4tcGxhY2UgcmVwbGFjZQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSIsIHJlcXVlc3RlZFNpemUpOwotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOwotICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOwotICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKLSAgICAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgotICAgICAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24ud2FpdChtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICB9Ci0gICAgLy8gTmV2ZXIgZ2V0cyBoZXJlLgotfQotCi1zaXplX3QgTWVkaWFCdWZmZXJHcm91cDo6YnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUludGVybmFsLT5tQnVmZmVycy5zaXplKCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICopIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0gICAgbUludGVybmFsLT5tQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIzZGM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFFeHRyYWN0b3I6Ok1lZGlhRXh0cmFjdG9yKCkgewotICAgIGlmICghTE9HX05ERUJVRykgewotICAgICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKLSAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOwotICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGNyZWF0ZWQgaW4gdWlkOiAlZCAoJXMpIiwgZ2V0dWlkKCksIHB3LT5wd19uYW1lKTsKLSAgICB9Ci19Ci0KLU1lZGlhRXh0cmFjdG9yOjp+TWVkaWFFeHRyYWN0b3IoKSB7fQotCi11aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2M2Y1OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQotCi1NZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpSZWFkT3B0aW9ucygpIHsKLSAgICByZXNldCgpOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpyZXNldCgpIHsKLSAgICBtT3B0aW9ucyA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi1ib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vbkJsb2NraW5nOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7Ci0gICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyU2Vla1RvKCkgewotICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKLSAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKLSAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOwotICAgICptb2RlID0gbVNlZWtNb2RlOwotICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmFmNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzQ29tbWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIm1lZGlhL1ZvcmJpc0NvbW1lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZmxhY0J1ZmZlciA9IGRlY29kZUJhc2U2NChBU3RyaW5nKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSkpOwotICAgIGlmIChmbGFjQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2l6ZV90IGZsYWNTaXplID0gZmxhY0J1ZmZlci0+c2l6ZSgpOwotICAgIHVpbnQ4X3QgKmZsYWMgPSBmbGFjQnVmZmVyLT5kYXRhKCk7Ci0gICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOwotCi0gICAgdWludDMyX3QgcGljVHlwZTsKLSAgICB1aW50MzJfdCB0eXBlTGVuOwotICAgIHVpbnQzMl90IGRlc2NMZW47Ci0gICAgdWludDMyX3QgZGF0YUxlbjsKLSAgICBjaGFyIHR5cGVbMTI4XTsKLQotICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7Ci0KLSAgICBpZiAocGljVHlwZSAhPSAzKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKLSAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKLSAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKLSAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKLQotICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7Ci0KLSAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOwotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCi0gICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXREYXRhKAotICAgICAgICAgICAga0tleUFsYnVtQXJ0LCAwLCAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHR5cGUpOwotfQotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpCi17Ci0gICAgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKLSAgICAgICAgdWludDMyX3QgbUtleTsKLSAgICB9IGtNYXBbXSA9IHsKLSAgICAgICAgeyAiVElUTEUiLCBrS2V5VGl0bGUgfSwKLSAgICAgICAgeyAiQVJUSVNUIiwga0tleUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTUFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQ09NUElMQVRJT04iLCBrS2V5Q29tcGlsYXRpb24gfSwKLSAgICAgICAgeyAiQUxCVU0iLCBrS2V5QWxidW0gfSwKLSAgICAgICAgeyAiQ09NUE9TRVIiLCBrS2V5Q29tcG9zZXIgfSwKLSAgICAgICAgeyAiR0VOUkUiLCBrS2V5R2VucmUgfSwKLSAgICAgICAgeyAiQVVUSE9SIiwga0tleUF1dGhvciB9LAotICAgICAgICB7ICJUUkFDS05VTUJFUiIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCi0gICAgICAgIHsgIkRJU0NOVU1CRVIiLCBrS2V5RGlzY051bWJlciB9LAotICAgICAgICB7ICJEQVRFIiwga0tleURhdGUgfSwKLSAgICAgICAgeyAiWUVBUiIsIGtLZXlZZWFyIH0sCi0gICAgICAgIHsgIkxZUklDSVNUIiwga0tleVdyaXRlciB9LAotICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwga0tleUFsYnVtQXJ0IH0sCi0gICAgICAgIHsgIkFORFJPSURfTE9PUCIsIGtLZXlBdXRvTG9vcCB9LAotICAgIH07Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOwotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgewotICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlBdXRvTG9vcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1OWYzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UsIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotcHVibGljOgotICAgIERhdGFTb3VyY2UoKSB7fQotCi0gICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7Ci0gICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7Ci0gICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTkzZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXwotCi0jZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIERhdGFTb3VyY2VCYXNlIHsKLXB1YmxpYzoKLSAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCi0gICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAotICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKLSAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCi0gICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKLSAgICB9OwotCi0gICAgRGF0YVNvdXJjZUJhc2UoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKLSAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgotICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgotICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50Ci0gICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKLSAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwotCi0gICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgotICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7Ci0gICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE5OGRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2VCYXNlOwotY2xhc3MgTWV0YURhdGFCYXNlOwotc3RydWN0IE1lZGlhVHJhY2s7Ci0KLQotY2xhc3MgRXh0cmFjdG9yQWxsb2NUcmFja2VyIHsKLXB1YmxpYzoKLSAgICBFeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJleHRyYWN0b3IgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5FeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJleHRyYWN0b3IgZnJlZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotfTsKLQotCi1jbGFzcyBNZWRpYUV4dHJhY3RvcgotLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOwotCi0gICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgewotICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQotICAgIH07Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAotICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKLQotICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7Ci0KLSAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCi0gICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgotICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAotICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKLSAgICB9OwotCi0gICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcwotICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQotCi0gICAgdHlwZWRlZiBNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICptZXRhKTsKLSAgICB0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOwotCi0gICAgLy8gVGhlIHNuaWZmZXIgY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiBhbiBvcGFxdWUgb2JqZWN0LCAibWV0YSIsIHRoYXQgaGVscHMKLSAgICAvLyB0aGUgY29ycmVzcG9uZGluZyBleHRyYWN0b3IgaW5pdGlhbGl6ZSBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZwotICAgIC8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKLSAgICAvLyBjYWxsZWQgYWdhaW5zdCB0aGUgb3BhcXVlIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VkLgotICAgIHR5cGVkZWYgQ3JlYXRvckZ1bmMgKCpTbmlmZmVyRnVuYykoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKTsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY29uc3QgdWludDhfdCBiWzE2XTsKLSAgICB9IHV1aWRfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICAgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247Ci0KLSAgICAgICAgLy8gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3IuCi0gICAgICAgIC8vIFNlZSBiZWxvdyBmb3IgYSBjb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgdGhpcyBmcm9tIGEgc3RyaW5nLgotICAgICAgICB1dWlkX3QgZXh0cmFjdG9yX3V1aWQ7Ci0KLSAgICAgICAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBleHRyYWN0b3IuIFdoZW4gdHdvIGV4dHJhY3RvcnMgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyB1dWlkIGFyZSBlbmNvdW50ZXJlZCwgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHZlcnNpb24gbnVtYmVyIHdpbGwKLSAgICAgICAgLy8gYmUgdXNlZC4KLSAgICAgICAgY29uc3QgdWludDMyX3QgZXh0cmFjdG9yX3ZlcnNpb247Ci0KLSAgICAgICAgLy8gYSBodW1hbiByZWFkYWJsZSBuYW1lCi0gICAgICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOwotCi0gICAgICAgIC8vIHRoZSBzbmlmZmVyIGZ1bmN0aW9uCi0gICAgICAgIGNvbnN0IFNuaWZmZXJGdW5jIHNuaWZmOwotICAgIH0gRXh0cmFjdG9yRGVmOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OID0gMTsKLQotICAgIHR5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgTWVkaWFFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLSAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotfTsKLQotLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgotLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCi1pbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgewotICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKLSAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOwotfQotCi1jb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKLSAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Ci19Ci0KLXRlbXBsYXRlIDxzaXplX3QgTj4KLWNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IGNvbnN0VVVJRChjb25zdCBjaGFyICgmcykgW05dKSB7Ci0gICAgc3RhdGljX2Fzc2VydChOID09IDM3LCAidXVpZDogd3JvbmcgbGVuZ3RoIik7Ci0gICAgcmV0dXJuCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzhdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMTNdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMThdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMjNdKSwKLSAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3Qge3sKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAwKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA5KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxMSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjgpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMwKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzQpLAotICAgICAgICAgICAgfX07Ci19Ci0vLyBDb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgYSB1dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBzaG91bGQKLS8vIGJlIGZvcm1hdHRlZCBhcyAiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjIiwgYXMgZ2VuZXJhdGVkIGJ5Ci0vLyBlLmcuIGh0dHBzOi8vd3d3LnV1aWRnZW5lcmF0b3IubmV0LyBvciB0aGUgJ3V1aWRnZW4nIGxpbnV4IGNvbW1hbmQuCi0vLyBIZXggZGlnaXRzIG1heSBiZSB1cHBlciBvciBsb3dlciBjYXNlLgotLy8KLS8vIFRoZSBtYWNybyBjYWxsIGlzIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseQotLy8gKGUuZy4gVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IikgaXMgdGhlIHNhbWUgYXMKLS8vICAgICAgIHt7MHg3ZCwgMHg2MSwgMHgzOCwgMHg1OCwgMHg1OCwgMHgzNywgMHg0YSwgMHgzOCwKLS8vICAgICAgICAgMHg4NCwgMHhjNSwgMHgzMywgMHgyZCwgMHgxYywgMHhkZCwgMHhlZSwgMHgyN319KQotCi0jZGVmaW5lIFVVSUQoc3RyKSBbXXsgY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCi0KLQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlYTYxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jZGVmaW5lIE1FRElBX1NPVVJDRV9CQVNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotCi1jbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKLXB1YmxpYzoKLSAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLXN0cnVjdCBNZWRpYVRyYWNrCi0vLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCi17Ci0gICAgTWVkaWFUcmFjaygpOwotCi0gICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0Ci0gICAgLy8gZ2V0Rm9ybWF0KCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpID0gMDsKLQotICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCi0gICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAotICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgotICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCi0gICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKLSAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKLQotICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KLSAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKLSAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKLSAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgewotICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7Ci0gICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNULAotICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKLSAgICAgICAgfTsKLQotICAgICAgICBSZWFkT3B0aW9ucygpOwotCi0gICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KLSAgICAgICAgdm9pZCByZXNldCgpOwotCi0gICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKLSAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpOwotICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOwotICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKLSAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OwotCi0gICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KLSAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7Ci0gICAgICAgICAgICBjbGVhclNlZWtUbygpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIE9wdGlvbnMgewotICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7Ci0gICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKLSAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgotCi0gICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQotICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotICAgIC8vIGlzIHJlYWNoZWQuCi0gICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KLSAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcwotICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKLSAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOwotCi0gICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOwotCi1wcml2YXRlOgotICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKLSAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTMyOTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIFZPUkJJU19DT01NRU5UX0hfCi0jZGVmaW5lIFZPUkJJU19DT01NRU5UX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0YURhdGFCYXNlOwotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVk9SQklTX0NPTU1FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyNTk2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0hfCi0KLSNkZWZpbmUgTUVESUFfQlVGRkVSX0hfCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1jbGFzcyBNZWRpYUJ1ZmZlcjsKLWNsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXI7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgLy8gYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB3aWxsIHVzZSBzaGFyZWQgbWVtb3J5LgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbVRocmVzaG9sZCA9IDY0ICogMTAyNDsKLQotICAgIC8vIFRoZSB1bmRlcmx5aW5nIGRhdGEgcmVtYWlucyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciEKLSAgICBNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSk7Ci0KLSAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKLQotICAgIE1lZGlhQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pIDoKLSAgICAgICAgTWVkaWFCdWZmZXIoKHVpbnQ4X3QgKiltZW0tPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgbWVtLT5zaXplKCkpIHsKLSAgICAgICAgLy8gZGVsZWdhdGUgYW5kIG92ZXJyaWRlIG1NZW1vcnkKLSAgICAgICAgbU1lbW9yeSA9IG1lbTsKLSAgICB9Ci0KLSAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7Ci0gICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKLSAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgLy8KLSAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KLSAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KLSAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpOwotCi0gICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOwotCi0gICAgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKTsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotCi0gICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKTsKLQotICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKLSAgICAvLyBNZXRhRGF0YS4KLSAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKTsKLQotICAgIC8vIHN1bSBvZiBsb2NhbFJlZmNvdW50KCkgYW5kIHJlbW90ZVJlZmNvdW50KCkKLSAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCi0gICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBsb2NhbFJlZmNvdW50KCkgKyByZW1vdGVSZWZjb3VudCgpOwotICAgIH0KLQotICAgIC8vIFJlc3VsdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHByb3hpbWF0ZSB1bmxlc3MgdGhlIHJlc3VsdCBwcmVjbHVkZXMgY29uY3VycmVudCBhY2Nlc3Nlcy4KLSAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwotICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCi0gICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCi0gICAgfQotCi0gICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKLSAgICAgICAgaWYgKG1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtZW1vcnktPnBvaW50ZXIoKSktPmlzRGVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKLSAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBNZWRpYUJ1ZmZlcnMsIGJ1dCB3ZSBlbmFibGUgdGhpcyBmb3IgdGhvc2UgcHJvY2Vzc2VzCi0gICAgLy8gdGhhdCBleHBvcnQgTWVkaWFCdWZmZXJzLgotICAgIHN0YXRpYyB2b2lkIHVzZVNoYXJlZE1lbW9yeSgpIHsKLSAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgJm1Vc2VTaGFyZWRNZW1vcnksIChpbnRfbGVhc3QzMl90KTEsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIC8vIHRydWUgaWYgTWVkaWFCdWZmZXIgaXMgb2JzZXJ2ZWQgKHBhcnQgb2YgYSBNZWRpYUJ1ZmZlckdyb3VwKS4KLSAgICBpbmxpbmUgYm9vbCBpc09ic2VydmVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU9ic2VydmVyICE9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXIoKTsKLQotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgZnJpZW5kIGNsYXNzIE9NWERlY29kZXI7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7Ci0KLSAgICAvLyBGb3IgdXNlIGJ5IE9NWERlY29kZXIsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIDEsIGRyb3AgcmVmZXJlbmNlCi0gICAgLy8gY291bnQgdG8gMCB3aXRob3V0IHNpZ25hbGxpbmcgdGhlIG9ic2VydmVyLgotICAgIHZvaWQgY2xhaW0oKTsKLQotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm1PYnNlcnZlcjsKLSAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZWZDb3VudDsKLQotICAgIHZvaWQgKm1EYXRhOwotICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLQotICAgIGJvb2wgbU93bnNEYXRhOwotCi0gICAgTWV0YURhdGFCYXNlKiBtTWV0YURhdGE7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbU9yaWdpbmFsOwotCi0gICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKLQotICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOwotICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7Ci0KLSAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgotICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7Ci0gICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCi0gICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOwotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKLSAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQotICAgIH07Ci0KLSAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKLSAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhkOTRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotY2xhc3MgTWV0YURhdGFCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgPSAwOwotCi1wcml2YXRlOgotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLX07Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIE1lZGlhQnVmZmVyQmFzZSAqQ3JlYXRlKHNpemVfdCBzaXplKTsKLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7Ci0KLSAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KLSAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgPSAwOwotCi0gICAgdmlydHVhbCBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpID0gMDsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXJCYXNlIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZQotICAgIC8vIGNvdW50LiBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKLSAgICAvLyBNZXRhRGF0YS4KLSAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7fTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDVkZjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlckdyb3VwIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBtZWRpYSBidWZmZXIgZ3JvdXAgd2l0aCBwcmVhbGxvY2F0ZWQgYnVmZmVycwotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICB+TWVkaWFCdWZmZXJHcm91cCgpOwotCi0gICAgdm9pZCBhZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKLQotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAotICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KLSAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCi0gICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgotICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgotICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgotICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7Ci0KLSAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0OwotCi0gICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOwotICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRlODZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQV9EQVRBX0JBU0VfSF8KLQotI2RlZmluZSBNRVRBX0RBVEFfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi1lbnVtIHsKLSAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAotICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAotICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAotICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKLQotICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQotICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKLQotICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCi0gICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQotICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCi0gICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCi0gICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5Qml0c1BlclNhbXBsZSAgICAgPSAnYml0cycsICAvLyBpbnQzMl90IChiaXRzIHBlciBzYW1wbGUpCi0gICAga0tleVN0cmVhbUhlYWRlciAgICAgID0gJ3N0SGQnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5RVNEUyAgICAgICAgICAgICAgPSAnZXNkcycsICAvLyByYXcgZGF0YQotICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKLSAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQotICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQotICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQotICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKLSAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQotICAgIGtLZXlGbGFjTWV0YWRhdGEgICAgICA9ICdmbE1kJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZwOUNvZGVjUHJpdmF0ZSAgID0gJ3ZwOXAnLCAgLy8gcmF3IGRhdGEgKHZwOSBjc2QgaW5mb3JtYXRpb24pCi0gICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAotICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKLSAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKLSAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKLSAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCi0gICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZwotICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKLSAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCi0gICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAotICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKLSAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCi0gICAga0tleUlzRFJNICAgICAgICAgICAgID0gJ2lkcm0nLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0gICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQotCi0gICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZwotICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCi0gICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQotICAgIGtLZXlBbGJ1bUFydE1JTUUgICAgICA9ICdhbEFNJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZwotICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCi0gICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKLQotICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCi0gICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKLQotICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKLSAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCi0KLSAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKLSAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCi0gICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KLSAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCi0gICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQotICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKLQotICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCi0gICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCi0gICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCi0gICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZwotCi0gICAgLy8gVG8gc3RvcmUgdGhlIHRpbWVkIHRleHQgZm9ybWF0IGRhdGEKLSAgICBrS2V5VGV4dEZvcm1hdERhdGEgICAgPSAndGV4dCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycyA9ICdzZWN1JywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICBrS2V5SXNBRFRTICAgICAgICAgICAgPSAnYWR0cycsICAvLyBib29sIChpbnQzMl90KQotICAgIGtLZXlBQUNBT1QgICAgICAgICAgICA9ICdhYW90JywgIC8vIGludDMyX3QKLQotICAgIC8vIElmIGEgTWVkaWFCdWZmZXIncyBkYXRhIHJlcHJlc2VudHMgKGF0IGxlYXN0IHBhcnRpYWxseSkgZW5jcnlwdGVkCi0gICAgLy8gZGF0YSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYWlkIGluIGRlY3J5cHRpb24uCi0gICAgLy8gVGhlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgcGFpcnMgb2YgcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhCi0gICAgLy8gZnJhZ21lbnRzLCBpLmUuIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YSBhbHRlcm5hdGUuCi0gICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IGlzIGJ5IGNvbnZlbnRpb24gcGxhaW4gZGF0YSAoaWYgdGhhdCdzIG5vdCB0aGUKLSAgICAvLyBjYXNlLCBzaW1wbHkgc3BlY2lmeSBwbGFpbiBmcmFnbWVudCBzaXplIG9mIDApLgotICAgIC8vIGtLZXlFbmNyeXB0ZWRTaXplcyBhbmQga0tleVBsYWluU2l6ZXMgZWFjaCBtYXAgdG8gYW4gYXJyYXkgb2YKLSAgICAvLyBzaXplX3QgdmFsdWVzLiBUaGUgc3VtIHRvdGFsIG9mIGFsbCBzaXplX3QgdmFsdWVzIG9mIGJvdGggYXJyYXlzCi0gICAgLy8gbXVzdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRhdGEgKGkuZS4gTWVkaWFCdWZmZXIncyByYW5nZV9sZW5ndGgoKSkuCi0gICAgLy8gSWYgYm90aCBhcnJheXMgYXJlIHByZXNlbnQsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLgotICAgIC8vIElmIG9ubHkgZW5jcnlwdGVkIHNpemVzIGFyZSBwcmVzZW50IGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwKLSAgICAvLyBwbGFpbiBzaXplcyBhcmUgMCwgaS5lLiBhbGwgZnJhZ21lbnRzIGFyZSBlbmNyeXB0ZWQuCi0gICAgLy8gVG8gcHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlc2UgYXJyYXksIHVzZSB0aGUgTWV0YURhdGFCYXNlOjpzZXREYXRhIEFQSSwgaS5lLgotICAgIC8vIGNvbnN0IHNpemVfdCBlbmNTaXplc1tdOwotICAgIC8vIG1ldGEtPnNldERhdGEoCi0gICAgLy8gIGtLZXlFbmNyeXB0ZWRTaXplcywgMCAvKiB0eXBlICovLCBlbmNTaXplcywgc2l6ZW9mKGVuY1NpemVzKSk7Ci0gICAgLy8gQSBwbGFpbiBzaXplcyBhcnJheSBieSBpdHNlbGYgbWFrZXMgbm8gc2Vuc2UuCi0gICAga0tleUVuY3J5cHRlZFNpemVzICAgID0gJ2VuY3InLCAgLy8gc2l6ZV90W10KLSAgICBrS2V5UGxhaW5TaXplcyAgICAgICAgPSAncGxhaScsICAvLyBzaXplX3RbXQotICAgIGtLZXlDcnlwdG9LZXkgICAgICAgICA9ICdjcnlLJywgIC8vIHVpbnQ4X3RbMTZdCi0gICAga0tleUNyeXB0b0lWICAgICAgICAgID0gJ2NyeUknLCAgLy8gdWludDhfdFsxNl0KLSAgICBrS2V5Q3J5cHRvTW9kZSAgICAgICAgPSAnY3J5TScsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSA9ICdjcnlTJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUNBU3lzdGVtSUQgICAgICAgID0gJ2NhaWQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDQVNlc3Npb25JRCAgICAgICA9ICdzZWlkJywgIC8vIHJhdyBkYXRhCi0KLSAgICBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrID0gJ2NibGsnLCAgLy8gdWludDhfdAotICAgIGtLZXlTa2lwQnl0ZUJsb2NrICAgICA9ICdzYmxrJywgIC8vIHVpbnQ4X3QKLQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QuCi0gICAga0tleVRyYWNrSXNBdXRvc2VsZWN0ID0gJ2F1dG8nLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQuCi0gICAga0tleVRyYWNrSXNEZWZhdWx0ICAgID0gJ2RmbHQnLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFNpbWlsYXIgdG8gTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSBidXQgcGVydGFpbnMgdG8gYXYgdHJhY2tzIGFzIHdlbGwuCi0gICAga0tleVRyYWNrSXNGb3JjZWQgICAgID0gJ2ZyY2QnLCAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gSDI2NCBzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24gb2Zmc2V0cy9zaXplcwotICAgIGtLZXlTRUkgICAgICAgICAgICAgICA9ICdzZWkgJywgLy8gcmF3IGRhdGEKLQotICAgIC8vIE1QRUcgdXNlciBkYXRhIG9mZnNldHMKLSAgICBrS2V5TXBlZ1VzZXJEYXRhICAgICAgPSAnbXB1ZCcsIC8vIHNpemVfdFtdCi0KLSAgICAvLyBTaXplIG9mIE5BTFUgbGVuZ3RoIGluIG1rdi9tcDQKLSAgICBrS2V5TmFsTGVuZ3RoU2l6ZSAgICAgPSAnbmFscycsIC8vIGludDMyX3QKLQotICAgIC8vIEhEUiByZWxhdGVkCi0gICAga0tleUhkclN0YXRpY0luZm8gICAgPSAnaGRyUycsIC8vIEhEUlN0YXRpY0luZm8KLQotICAgIC8vIGNvbG9yIGFzcGVjdHMKLSAgICBrS2V5Q29sb3JSYW5nZSAgICAgICA9ICdjUm5nJywgLy8gaW50MzJfdCwgY29sb3IgcmFuZ2UsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlJhbmdlCi0gICAga0tleUNvbG9yUHJpbWFyaWVzICAgPSAnY1BybScsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIFByaW1hcmllcywgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUHJpbWFyaWVzCi0gICAga0tleVRyYW5zZmVyRnVuY3Rpb24gPSAndEZ1bicsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIEZ1bmN0aW9uLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5UcmFuc2Zlci4KLSAgICBrS2V5Q29sb3JNYXRyaXggICAgICA9ICdjTXR4JywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCi0gICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCi0gICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCi0KLSAgICBrS2V5VGlsZVdpZHRoICAgICAgICA9ICd0aWxXJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIHdpZHRoCi0gICAga0tleVRpbGVIZWlnaHQgICAgICAgPSAndGlsSCcsIC8vIGludDMyX3QsIEhFSUYgdGlsZSBoZWlnaHQKLSAgICBrS2V5R3JpZFJvd3MgICAgICAgICA9ICdncmRSJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHJvd3MKLSAgICBrS2V5R3JpZENvbHMgICAgICAgICA9ICdncmRDJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGNvbHVtbnMKLSAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcm9maWxlIGRhdGEKLSAgICBrS2V5SXNQcmltYXJ5SW1hZ2UgICA9ICdwcmltJywgLy8gYm9vbCAoaW50MzJfdCksIGltYWdlIHRyYWNrIGlzIHRoZSBwcmltYXJ5IGltYWdlCi0gICAga0tleUZyYW1lQ291bnQgICAgICAgPSAnbmZybScsIC8vIGludDMyX3QsIHRvdGFsIG51bWJlciBvZiBmcmFtZSBpbiB2aWRlbyB0cmFjawotICAgIGtLZXlFeGlmT2Zmc2V0ICAgICAgID0gJ2V4b2YnLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgb2Zmc2V0Ci0gICAga0tleUV4aWZTaXplICAgICAgICAgPSAnZXhzeicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBzaXplCi0gICAga0tleUlzRXhpZiAgICAgICAgICAgPSAnZXhpZicsIC8vIGJvb2wgKGludDMyX3QpIGJ1ZmZlciBjb250YWlucyBleGlmIGRhdGEgYmxvY2sKLQotICAgIGtLZXlQY21CaWdFbmRpYW4gICAgID0gJ3BjbWInLCAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gS2V5IGZvciBBTEFDIE1hZ2ljIENvb2tpZQotICAgIGtLZXlBbGFjTWFnaWNDb29raWUgID0gJ2FsbWMnLCAvLyByYXcgZGF0YQotfTsKLQotZW51bSB7Ci0gICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKLSAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAotICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCi0gICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKLX07Ci0KLWVudW0gewotICAgIGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQgPSAwLAotICAgIGtDcnlwdG9Nb2RlQWVzQ3RyICAgICAgPSAxLAotICAgIGtDcnlwdG9Nb2RlQWVzQ2JjICAgICAgPSAyLAotfTsKLQotY2xhc3MgUGFyY2VsOwotCi1jbGFzcyBNZXRhRGF0YUJhc2UgewotcHVibGljOgotICAgIE1ldGFEYXRhQmFzZSgpOwotICAgIE1ldGFEYXRhQmFzZShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOwotICAgIE1ldGFEYXRhQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICYpOwotCi0gICAgdmlydHVhbCB+TWV0YURhdGFCYXNlKCk7Ci0KLSAgICBlbnVtIFR5cGUgewotICAgICAgICBUWVBFX05PTkUgICAgID0gJ25vbmUnLAotICAgICAgICBUWVBFX0NfU1RSSU5HID0gJ2NzdHInLAotICAgICAgICBUWVBFX0lOVDMyICAgID0gJ2luMzInLAotICAgICAgICBUWVBFX0lOVDY0ICAgID0gJ2luNjQnLAotICAgICAgICBUWVBFX0ZMT0FUICAgID0gJ2Zsb2EnLAotICAgICAgICBUWVBFX1BPSU5URVIgID0gJ3B0ciAnLAotICAgICAgICBUWVBFX1JFQ1QgICAgID0gJ3JlY3QnLAotICAgIH07Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgYm9vbCByZW1vdmUodWludDMyX3Qga2V5KTsKLQotICAgIGJvb2wgc2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICBib29sIHNldEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgc2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqdmFsdWUpOwotCi0gICAgYm9vbCBzZXRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKLSAgICAgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKLQotICAgIGJvb2wgZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKLQotICAgIGJvb2wgZmluZFJlY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCi0gICAgICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKLQotICAgIGJvb2wgc2V0RGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgZmluZERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3Q7Ci0KLSAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBkdW1wVG9Mb2coKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYUV4dHJhY3RvcjsKLSAgICBmcmllbmQgY2xhc3MgTWV0YURhdGE7Ci0KLSAgICBzdHJ1Y3QgdHlwZWRfZGF0YTsKLSAgICBzdHJ1Y3QgUmVjdDsKLSAgICBzdHJ1Y3QgTWV0YURhdGFJbnRlcm5hbDsKLSAgICBNZXRhRGF0YUludGVybmFsICptSW50ZXJuYWxEYXRhOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpOwotICAgIHN0YXR1c190IHVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKaW5kZXggMGEzNDJiOC4uMTVlYTU3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKQEAgLTEsMjAgKzEsMTcgQEAKLS8vIFRPRE86IGNoYW5nZSBpdCBiYWNrIHRvIGNjX2xpYnJhcnlfc2hhcmVkIHdoZW4gdGhlcmUgaXMgYSB3YXkgdG8KLS8vIGV4cG9zZSBtZWRpYSBtZXRyaWNzIGFzIHN0YWJsZSBBUEkuCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIklNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lZGlhQW5hbHl0aWNzSXRlbS5jcHAiLAorICAgICAgICAiTWVkaWFNZXRyaWNzLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMzIsNCArMjksMTQgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisKKyAgICAvLyBlbnVtZXJhdGUgc3RhYmxlIGVudHJ5IHBvaW50cywgZm9yIGFwZXggdXNlCisgICAgc3R1YnM6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW1ldHJpY3MubWFwLnR4dCIsCisgICAgICAgIHZlcnNpb25zOiBbCisgICAgICAgICAgICAiMSIgLAorICAgICAgICBdCisgICAgfSwKIH0KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggMjhhNzc0Ni4uOTExNDkyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQW5hbHl0aWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwogCiAgICAgICAgICAgICBib29sIGZvcmNlbmV3OwotICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCk7CiAKICAgICAgICAgICAgIGRhdGEucmVhZEJvb2woJmZvcmNlbmV3KTsKICAgICAgICAgICAgIGl0ZW0tPnJlYWRGcm9tUGFyY2VsKGRhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCAxMzVjOWI2Li4wMmMyM2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNTIsNiArNTIsMTcgQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eVBlcnNpc3QgID0gInBlcnNpc3QubWVkaWEubWV0cmljcy5lbmFibGVkIjsKIGNvbnN0IGludCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eV9kZWZhdWx0ICA9IDE7CiAKKy8vIFNvIGNhbGxlciBkb2Vzbid0IG5lZWQgdG8ga25vdyBzaXplIG9mIGFsbG9jYXRlZCBzcGFjZQorTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlOb25lKTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShNZWRpYUFuYWx5dGljc0l0ZW06OktleSBrZXkpCit7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrZXkpOworICAgIHJldHVybiBpdGVtOworfQogCiAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKIE1lZGlhQW5hbHl0aWNzSXRlbTo6TWVkaWFBbmFseXRpY3NJdGVtKCkKQEAgLTQ3OCw3ICs0ODksNyBAQAogLy8gY2FsbGVyIHJlc3BvbnNpYmxlIGZvciB0aGUgcmV0dXJuZWQgc3RyaW5nCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY2hhciAqKnZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVEb3VibGUpIHsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CkBAIC00ODcsNiArNDk4LDE4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIHN0ZDo6c3RyaW5nICp2YWx1ZSkgeworICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIHN0ZDo6c3RyaW5nIG1ha2VzIGEgY29weSBmb3IgdXMKKyAgICAgICAgKnZhbHVlID0gcHJvcC0+dS5DU3RyaW5nVmFsdWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvLyByZW1vdmUgaW5kaWNhdGVkIGtleXMgYW5kIHRoZWlyIHZhbHVlcwogLy8gcmV0dXJuIHZhbHVlIGlzICMga2V5cyByZW1vdmVkCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6ZmlsdGVyKGludCBuLCBNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgYXR0cnNbXSkgewpAQCAtNjMwLDYgKzY1MywxOSBAQAogLy8KIAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgIGludDMyX3QgdmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsMChkYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgTWVkaWFBbmFseXRpY3NJdGVtIFBhcmNlbCB2ZXJzaW9uOiAlZCIsIHZlcnNpb24pOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpyZWFkRnJvbVBhcmNlbDAoY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgLy8gaW50byAndGhpcycgb2JqZWN0CiAgICAgLy8gLi4gd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyB0byBwdXQgYXdheS4KICAgICBtS2V5ID0gZGF0YS5yZWFkQ1N0cmluZygpOwpAQCAtNjc5LDggKzcxNSwyMyBAQAogfQogCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKmRhdGEpIHsKKwogICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAtMTsKIAorICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgZGF0YS0+d3JpdGVJbnQzMih2ZXJzaW9uKTsKKworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICByZXR1cm4gd3JpdGVUb1BhcmNlbDAoZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIE1lZGlhQW5hbHl0aWNzSXRlbSBQYXJjZWwgdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbDAoUGFyY2VsICpkYXRhKSB7CiAKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobUtleS5jX3N0cigpKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1QaWQpOwpAQCAtNzI1LDYgKzc3NiwxNCBAQAogICAgIHJldHVybiAwOwogfQogCitjb25zdCBjaGFyICpNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZygpIHsKKyAgIHJldHVybiB0b0NTdHJpbmcoUFJPVE9fTEFTVCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZyhpbnQgdmVyc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHRvU3RyaW5nKHZlcnNpb24pOworICAgIHJldHVybiBzdHJkdXAodmFsLmNfc3RyKCkpOworfQogCiBzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRvU3RyaW5nKFBST1RPX0xBU1QpOwpAQCAtODU1LDggKzkxNCw2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CkBAIC0xMDE0LDUgKzEwNzEsMTcwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIGEgYnl0ZSBhcnJheTsgY29udGVudHMgYXJlCisvLyBvdmVyYWxsIGxlbmd0aCAodWludDMyKSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYKKy8vIGVuY29kaW5nIHZlcnNpb24gKHVpbnQzMikKKy8vIGNvdW50IG9mIHByb3BlcnRpZXMgKHVpbnQzMikKKy8vIE4gY29waWVzIG9mOgorLy8gICAgIHByb3BlcnR5IG5hbWUgYXMgbGVuZ3RoKGludDE2KSwgYnl0ZXMKKy8vICAgICAgICAgdGhlIGJ5dGVzIFdJTEwgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yIG9mIHRoZSBuYW1lCisvLyAgICAgdHlwZSAodWludDggLS0gMSBieXRlKQorLy8gICAgIHNpemUgb2YgdmFsdWUgZmllbGQgKGludDE2IC0tIDIgYnl0ZXMpCisvLyAgICAgdmFsdWUgKHNpemUgYmFzZWQgb24gdHlwZSkKKy8vICAgICAgIGludDMyLCBpbnQ2NCwgZG91YmxlIC0tIGxpdHRsZSBlbmRpYW4gNC84LzggYnl0ZXMgcmVzcGVjdGl2ZWx5CisvLyAgICAgICBjc3RyaW5nIC0tIE4gYnl0ZXMgb2YgdmFsdWUgW1dJVEggdGVybWluYXRvcl0KKworZW51bSB7IGtJbnQzMiA9IDAsIGtJbnQ2NCwga0RvdWJsZSwga1JhdGUsIGtDU3RyaW5nfTsKKworYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmR1bXBBdHRyaWJ1dGVzKGNoYXIgKipwYnVmZmVyLCBzaXplX3QgKnBsZW5ndGgpIHsKKworICAgIGNoYXIgKmJ1aWxkID0gTlVMTDsKKworICAgIGlmIChwYnVmZmVyID09IE5VTEwgfHwgcGxlbmd0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBjb25zaXN0ZW5jeSBmb3IgdGhlIGNhbGxlciwgd2hvIG93bnMgd2hhdGV2ZXIgY29tZXMgYmFjayBpbiB0aGlzIHBvaW50ZXIuCisgICAgKnBidWZmZXIgPSBOVUxMOworCisgICAgLy8gZmlyc3QsIGxldCdzIGNhbGN1bGF0ZSBzaXplcworICAgIGludDMyX3QgZ29hbCA9IDA7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gMDsKKworICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyBvdmVyYWxsIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQKKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gZW5jb2RpbmcgdmVyc2lvbgorICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyAjIHByb3BlcnRpZXMKKworICAgIGludDMyX3QgY291bnQgPSBtUHJvcENvdW50OworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50OyBpKysgKSB7CisgICAgICAgIFByb3AgKnByb3AgPSAmbVByb3BzW2ldOworICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgICAgICAvLyBuYW1lIGxlbmd0aAorICAgICAgICBnb2FsICs9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOyAgICAvLyBzdHJpbmcgKyBudWxsCisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQ4X3QpOyAgICAgICAgICAgIC8vIHR5cGUKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAgICAgLy8gc2l6ZSBvZiB2YWx1ZQorICAgICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoICsgYWN0dWFsIHN0cmluZyArIG51bGwKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzdHJsZW4ocHJvcC0+dS5DU3RyaW5nVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZm91bmQgYmFkIFByb3AgdHlwZTogJWQsIGlkeCAlZCwgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPm1UeXBlLCBpLCBwcm9wLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBzaXplLi4uIGxldCdzIGFsbG9jYXRlIGFuZCBmaWxsCisgICAgYnVpbGQgPSAoY2hhciAqKW1hbGxvYyhnb2FsKTsKKyAgICBpZiAoYnVpbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbWVtc2V0KGJ1aWxkLCAwLCBnb2FsKTsKKworICAgIGNoYXIgKmZpbGxpbmcgPSBidWlsZDsKKworI2RlZmluZSBfSU5TRVJUKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICYodmFsKSwgKHNpemUpKTsgZmlsbGluZyArPSAoc2l6ZSk7fQorI2RlZmluZSBfSU5TRVJUU1RSSU5HKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICh2YWwpLCAoc2l6ZSkpOyBmaWxsaW5nICs9IChzaXplKTt9CisKKyAgICBfSU5TRVJUKGdvYWwsIHNpemVvZihpbnQzMl90KSk7CisgICAgX0lOU0VSVCh2ZXJzaW9uLCBzaXplb2YoaW50MzJfdCkpOworICAgIF9JTlNFUlQoY291bnQsIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrICkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgaW50MTZfdCBhdHRyTmFtZUxlbiA9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOworICAgICAgICBfSU5TRVJUKGF0dHJOYW1lTGVuLCBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBfSU5TRVJUU1RSSU5HKHByb3AtPm1OYW1lLCBhdHRyTmFtZUxlbik7ICAgIC8vIHRlcm1pbmF0aW9uIGluY2x1ZGVkCisgICAgICAgIGludDhfdCBlbGVtdHlwZTsKKyAgICAgICAgaW50MTZfdCBlbGVtc2l6ZTsKKyAgICAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQzMjsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQ2NDsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrRG91YmxlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmRvdWJsZVZhbHVlLCBzaXplb2YoZG91YmxlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtSYXRlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LnJhdGUuY291bnQsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUucmF0ZS5kdXJhdGlvbiwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtDU3RyaW5nOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc3RybGVuKHByb3AtPnUuQ1N0cmluZ1ZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVFNUUklORyhwcm9wLT51LkNTdHJpbmdWYWx1ZSwgZWxlbXNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpZiBjYW4ndCBlbmNvZGU7IHdhcm5pbmcgaWYgY2FuJ3QgZGVjb2RlCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmb3VuZCBiYWQgUHJvcCB0eXBlOiAlZCwgaWR4ICVkLCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+bVR5cGUsIGksIHByb3AtPm1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRuZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1aWxkICsgZ29hbCAhPSBmaWxsaW5nKSB7CisgICAgICAgIEFMT0dFKCJwcm9ibGVtcyBwb3B1bGF0aW5nOyB3cm90ZT0lZCBwbGFubmVkPSVkIiwKKyAgICAgICAgICAgICAgKGludCkoZmlsbGluZy1idWlsZCksIGdvYWwpOworICAgICAgICBnb3RvIGJhZG5lc3M7CisgICAgfQorCisgICAgKnBidWZmZXIgPSBidWlsZDsKKyAgICAqcGxlbmd0aCA9IGdvYWw7CisKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiYWRuZXNzOgorICAgIGZyZWUoYnVpbGQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDkxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgorCisvLworLy8gcHJvdmlkZSBhIEMtaXNoIGludGVyZmFjZSB0aGF0IGlzIGVhc2llciB0byBzdGFiaWxpemUgdGhhbiB0aGUgZXhpc3RpbmcgQysrCisvLyBpbnRlcmZhY2UKKy8vCisvLyBBTEwgZnVuY3Rpb25zIHJldHVybmluZyBhIGNoYXIgKiBnaXZlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorLy8gdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBjYWxsIGZyZWUoKSBvbiB0aGF0IHBvaW50ZXIuCisvLworCisvLyBtYW5hZ2UgdGhlIG92ZXJhbGwgcmVjb3JkCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrZXkpOworICAgIHJldHVybiAobWVkaWFtZXRyaWNzX2hhbmRsZV90KSBpdGVtOworfQorCit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKyAgICBkZWxldGUgaXRlbTsKK30KKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmR1cChpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKK30KKworLy8gbnVwbGF5ZXIsIGV0IGFsIHVzZSBpdCB3aGVuIGFjdGluZyBhcyBwcm94aWVzCit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0VWlkKHVpZCk7Cit9CisKKy8vIHNldCBhdHRyaWJ1dGVzCisvLworCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLworCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorLy8KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24sIHJhdGUpOworfQorCisvLyBOQjogY2FsbGVyIG93bnMgdGhlIHN0cmluZyB0aGF0IGNvbWVzIGJhY2ssIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGl0ZW0tPmdldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpIHsKKyAgICBmcmVlKHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKKworY29uc3QgY2hhciAqbWVkaWFtZXRyaWNzX3JlYWRhYmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gIiI7CisgICAgcmV0dXJuIGl0ZW0tPnRvQ1N0cmluZygpOworfQorCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGl0ZW0tPmNvdW50KCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpIHsKKyAgICAvLyBzdGF0aWMsIHNvIGRvZXNuJ3QgbmVlZCBhbiBpbnN0YW5jZQorICAgIHJldHVybiBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmlzRW5hYmxlZCgpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5kdW1wQXR0cmlidXRlcyhidWZmZXIsIGxlbmd0aCk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggMjYzY2RlNy4uNGEzNmY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTE3LDkgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfTUVESUFBTkFMWVRJQ1NJVEVNX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtODEsMTIgKzgyLDE5IEBACiAgICAgICAgICAgICBQUk9UT19MQVNUID0gUFJPVE9fVjEsCiAgICAgICAgIH07CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB1c2UgdGhlIDo6Y3JlYXRlKCkgbWV0aG9kIGluc3RlYWQKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKCk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtJik7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbSYpOwogCiAgICAgcHVibGljOgogCisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNyZWF0ZShLZXkga2V5KTsKKyAgICAgICAgc3RhdGljIE1lZGlhQW5hbHl0aWNzSXRlbSogY3JlYXRlKCk7CisKICAgICAgICAgLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSgpOwotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKICAgICAgICAgfk1lZGlhQW5hbHl0aWNzSXRlbSgpOwogCiAgICAgICAgIC8vIFNlc3Npb25JRCB0aWVzIG11bHRpcGxlIHN1Ym1pc3Npb25zIGZvciBzYW1lIGtleSB0b2dldGhlcgpAQCAtMTM0LDYgKzE0Miw3IEBACiAgICAgICAgIGJvb2wgZ2V0UmF0ZShBdHRyLCBpbnQ2NF90ICpjb3VudCwgaW50NjRfdCAqZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7CiAgICAgICAgIC8vIENhbGxlciBvd25zIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgICAgICAgYm9vbCBnZXRDU3RyaW5nKEF0dHIsIGNoYXIgKip2YWx1ZSk7CisgICAgICAgIGJvb2wgZ2V0U3RyaW5nKEF0dHIsIHN0ZDo6c3RyaW5nICp2YWx1ZSk7CiAKICAgICAgICAgLy8gcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRvIGNsb3NlIGFueSBleGlzdGluZyBvcGVuCiAgICAgICAgIC8vIHJlY29yZCB3aXRoIHNhbWUga2V5IGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgcmVjb3JkCkBAIC0xNzQsMTIgKzE4MywyMiBAQAogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCisgICAgICAgIC8vIHN1cHBvcnRzIHRoZSBzdGFibGUgaW50ZXJmYWNlCisgICAgICAgIGJvb2wgZHVtcEF0dHJpYnV0ZXMoY2hhciAqKnBidWZmZXIsIHNpemVfdCAqcGxlbmd0aCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IHZlcnNpb24pOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoKTsKKyAgICAgICAgY29uc3QgY2hhciAqdG9DU3RyaW5nKGludCB2ZXJzaW9uKTsKIAogICAgICAgICAvLyBhcmUgd2UgY29sbGVjdGluZyBhbmFseXRpY3MgZGF0YQogICAgICAgICBzdGF0aWMgYm9vbCBpc0VuYWJsZWQoKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIGhhbmRsZSBQYXJjZWwgdmVyc2lvbiAwCisgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbDAoUGFyY2VsICopOworICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsMChjb25zdCBQYXJjZWwmKTsKKwogICAgIHByb3RlY3RlZDoKIAogICAgICAgICAvLyBtZXJnZSBmaWVsZHMgZnJvbSBhcmcgaW50byB0aGlzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTFlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKworLy8KKy8vIGRlZmluZSBhIEMgaW50ZXJmYWNlIHRvIHRoZSBtZWRpYSBtZXRyaWNzIGZ1bmN0aW9uYWxpdHkKKy8vCisvLyBBbGwgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2hhciAqIG9yIGNvbnN0IGNoYXIgKiBhbHNvIGdpdmUgcmVzcG9uc2liaWxpdHkKKy8vIGZvciB0aGF0IHN0cmluZyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZyZWUoKQorLy8gb24gdGhhdCBwb2ludGVyIHdoZW4gZG9uZSB1c2luZyB0aGUgdmFsdWUuCisKK19fQkVHSU5fREVDTFMKKworLy8gaW50ZXJuYWxseSByZS1jYXN0IHRvIHRoZSBiZWhpbmQtdGhlLXNjZW5lcyBDKysgY2xhc3MgaW5zdGFuY2UKK3R5cGVkZWYgaW50NjRfdCBtZWRpYW1ldHJpY3NfaGFuZGxlX3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKm1lZGlhbWV0cmljc2tleV90OwordHlwZWRlZiBjb25zdCBjaGFyICphdHRyX3Q7CisKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSk7Cit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKKworLy8gc2V0Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSk7CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLyB0aGVzZSBkbyBub3QgcHJvdmlkZSBhdG9taWNpdHkgb3IgbXV0dWFsIGV4Y2x1c2lvbiwgb25seSBzaW1wbGVyIGNvZGUgc2VxdWVuY2VzLgordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOworCisvLyBmaW5kICYgZXh0cmFjdCB2YWx1ZXMKKy8vIHJldHVybiBpbmRpY2F0ZXMgd2hldGhlciBhdHRyIGV4aXN0cyAoYW5kIHRodXMgd2hldGhlciB2YWx1ZSBmaWxsZWQgaW4pCisvLyBOVUxMIHBhcmFtZXRlciB2YWx1ZSBzdXBwcmVzc2VzIHN0b3JhZ2Ugb2YgdmFsdWUuCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogY291bnQsIGludDY0X3QgKiBkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKTsKKy8vIHRvIHJlbGVhc2Ugc3RyaW5ncyByZXR1cm5lZCB2aWEgZ2V0Q1N0cmluZygpCit2b2lkIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZyhjaGFyICp2YWx1ZSk7CisKKy8vICMgb2YgYXR0cmlidXRlcyBzZXQgd2l0aGluIHRoaXMgcmVjb3JkLgoraW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFVpZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCB1aWRfdCB1aWQpOworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCk7CisKKy8vIHNlcmlhbGl6ZWQgY29weSBvZiB0aGUgYXR0cmlidXRlcy92YWx1ZXMsIG1vc3RseSBmb3IgdXBzdHJlYW0gZ2V0TWV0cmljcygpIGNhbGxzCisvLyBjYWxsZXIgb3ducyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoaXMgY2FsbC4KK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyODFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2xpYm1lZGlhbWV0cmljcy5tYXAudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0xJQk1FRElBTUVUUklDU18xIHsKKyAgZ2xvYmFsOgorICAgIG1lZGlhbWV0cmljc19hZGREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkUmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2NvdW50OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfY3JlYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZGVsZXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRLZXk7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfaXNFbmFibGVkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfcmVhZGFibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkOyAjIGFwZXgKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IGNkMjdiZDEuLjA4NTE5Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCkBAIC00LDExICs0LDEwIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKICAgICAgICAgIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCIsCiAgICAgICAgICJtZWRpYXBsYXllcjIuY3BwIiwKICAgICBdLApAQCAtMTcsMjYgKzE2LDIzIEBACiAgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKQEAgLTQ5LDExICs0NSwyMSBAQAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0MiIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC03NCwzICs4MCw0OSBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhMl9qbmlfY29yZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJKYXZhVk1IZWxwZXIuY3BwIiwKKyAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCisgICAgICAgICJKTWVkaWEySFRUUFNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgICAgICAibGlibmF0aXZlaGVscGVyX2hlYWRlcl9vbmx5IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKaW5kZXggYWMwY2M1Ny4uYTAxYWZhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCkBAIC0yMSwyNyArMjEsMjggQEAKICNpbmNsdWRlICJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCIKIAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfQXVkaW9FcnJvcnMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gVE9ETzogU3RvcmUgSmF2YSBjbGFzcy9tZXRob2RJRCBhcyBhIG1lbWJlciB2YXJpYWJsZSBpbiB0aGUgY2xhc3MuCiAvLyBUT0RPOiBBZGQgTlVMTCAmJiBFeGNlcHRpb24gY2hlY2tzIGFmdGVyIGV2ZXJ5IEpOSSBjYWxsLgogSkF1ZGlvVHJhY2s6OkpBdWRpb1RyYWNrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCBVc2FnZXMgb2YgdGhlIGFyZ3VtZW50cyBhcmUgYmVsb3cgPgotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsICAgICAgICAgICAgICAgLy8gQXVkaW9BdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgdm9pZCogdXNlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzLCAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvQXR0cmlidXRlcwogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKwogICAgIGpjbGFzcyBqQXVkaW9UcmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2siKTsKLSAgICBtQXVkaW9UcmFja0NscyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKKyAgICBtQXVkaW9UcmFja0NscyA9IHJlaW50ZXJwcmV0X2Nhc3Q8amNsYXNzPihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0NscykpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakF1ZGlvVHJhY2tDbHMpOwogCiAgICAgbWF4UmVxdWlyZWRTcGVlZCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG1heFJlcXVpcmVkU3BlZWQsIDEuMGYpLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpOwogCkBAIC02NCwxMCArNjUsMTkgQEAKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKICAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CiAKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAotICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKLSAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEF1ZGlvQXR0cmlidXRlcywKLSAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIHBBdHRyaWJ1dGVzLCBzdHJlYW1UeXBlKSk7CisgICAgeworICAgICAgICBzcDxKT2JqZWN0SG9sZGVyPiBhdWRpb0F0dHJpYnV0ZXNPYmo7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9BdHRyaWJ1dGVzT2JqID0gbmV3IEpPYmplY3RIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIE5VTEwpKTsKKyAgICAgICAgfQorICAgICAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLAorICAgICAgICAgICAgICAgIGpTZXRBdWRpb0F0dHJpYnV0ZXMsIGF1ZGlvQXR0cmlidXRlc09iai0+Z2V0Sk9iamVjdCgpKTsKKyAgICB9CiAKICAgICBqbWV0aG9kSUQgalNldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvRm9ybWF0IiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKQEAgLTkyLDYgKzEwMiw3IEBACiAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0U2Vzc2lvbklkLCBzZXNzaW9uSWQpOwogICAgIH0KIAorICAgIG1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIGptZXRob2RJRCBqU2V0T2ZmbG9hZGVkUGxheWJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0T2ZmbG9hZGVkUGxheWJhY2siLAogICAgICAgICAgICAgICAgICIoWilMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC0xMDAsNyArMTExLDkgQEAKICAgICB9CiAKICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjazsiKTsKLSAgICBtQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBqb2JqZWN0IGpBdWRpb1RyYWNrT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworICAgIG1BdWRpb1RyYWNrT2JqID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja09iaikpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakJ1aWxkZXJPYmopOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFNldCBvZmZsb2FkIG1vZGUgY2FsbGJhY2sKQEAgLTExNiwxOSArMTI5LDIwIEBACiB9CiAKIEpBdWRpb1RyYWNrOjp+SkF1ZGlvVHJhY2soKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1BdWRpb1RyYWNrQ2xzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja09iaik7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6Y2hhbm5lbENvdW50KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldENoYW5uZWxDb3VudCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRDaGFubmVsQ291bnQiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldENoYW5uZWxDb3VudCk7CiB9CkBAIC0xNDMsNyArMTU3LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbiA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrSGVhZFBvc2l0aW9uIiwgIigpSSIpOwogICAgICpwb3NpdGlvbiA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uKTsKQEAgLTE1MSwyMSArMTY1LDIxIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgamNsYXNzIGpBdWRpb1RpbWVTdGFtcENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wIik7CiAgICAgam9iamVjdCBqQXVkaW9UaW1lU3RhbXBPYmogPSBlbnYtPkFsbG9jT2JqZWN0KGpBdWRpb1RpbWVTdGFtcENscyk7CiAKLSAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkwiKTsKLSAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiTCIpOworICAgIGpmaWVsZElEIGpGcmFtZVBvc2l0aW9uID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgImZyYW1lUG9zaXRpb24iLCAiSiIpOworICAgIGpmaWVsZElEIGpOYW5vVGltZSA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJuYW5vVGltZSIsICJKIik7CiAKICAgICBqbWV0aG9kSUQgakdldFRpbWVzdGFtcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCi0gICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcClCIik7CisgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcDspWiIpOwogICAgIGJvb2wgc3VjY2VzcyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRUaW1lc3RhbXAsIGpBdWRpb1RpbWVTdGFtcE9iaik7CiAKICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBsb25nIGxvbmcgZnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0TG9uZ0ZpZWxkKGpBdWRpb1RpbWVTdGFtcE9iaiwgakZyYW1lUG9zaXRpb24pOwpAQCAtMTc4LDcgKzE5Miw3IEBACiAgICAgdGltZXN0YW1wLm1UaW1lID0gdHM7CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9ICh1aW50MzJfdCkgZnJhbWVQb3NpdGlvbjsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wIF9fdW51c2VkKSB7CkBAIC0xODksNyArMjAzLDcgQEAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewogICAgIC8vIFRPRE86IGV4aXN0aW5nIG5hdGl2ZSBBdWRpb1RyYWNrIHJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gb24gb2ZmbG9hZC9kaXJlY3QvZmFzdCB0cmFja3MuCiAgICAgLy8gU2hvdWxkIHdlIGRvIHRoZSBzYW1lIHRoaW5nPwotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqUGxheWJhY2tQYXJhbXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtcyIpOwogICAgIGptZXRob2RJRCBqUGxheWJhY2tQYXJhbXNDdG9yID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICI8aW5pdD4iLCAiKClWIik7CkBAIC0yMjQsNyArMjM4LDcgQEAKIH0KIAogY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgSkF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrUGFyYW1zID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tQYXJhbXMiLCAiKClMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKQEAgLTI2Niw3ICsyODAsNyBAQAogICAgICAgICByZXR1cm4gbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzKEJBRF9WQUxVRSk7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpDcmVhdGVWb2x1bWVTaGFwZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiY3JlYXRlVm9sdW1lU2hhcGVyIiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb247KUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlcjsiKTsKQEAgLTI4Miw3ICsyOTYsNyBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0QXV4RWZmZWN0U2VuZExldmVsID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAic2V0QXV4RWZmZWN0U2VuZExldmVsIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0QXV4RWZmZWN0U2VuZExldmVsLCBsZXZlbCk7CkBAIC0yOTAsMTQgKzMwNCwxNCBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakF0dGFjaEF1eEVmZmVjdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJhdHRhY2hBdXhFZmZlY3QiLCAiKEkpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBdHRhY2hBdXhFZmZlY3QsIGVmZmVjdElkKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgLy8gVE9ETzogSmF2YSBzZXRTdGVyZW9Wb2x1bWUgaXMgZGVwcmVjYXRlZC4gRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2Q/CiAgICAgam1ldGhvZElEIGpTZXRTdGVyZW9Wb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0U3RlcmVvVm9sdW1lIiwgIihGRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFN0ZXJlb1ZvbHVtZSwgbGVmdCwgcmlnaHQpOwpAQCAtMzA1LDE0ICszMTksMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpTZXRWb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0Vm9sdW1lIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0Vm9sdW1lLCB2b2x1bWUpOwogICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnN0YXJ0KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBsYXkgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGxheSIsICIoKVYiKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggdGhlIEphdmEgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gcGxheSgpPwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQbGF5KTsKQEAgLTMyNCw3ICszMzgsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqYnl0ZUFycmF5IGpBdWRpb0RhdGEgPSBlbnYtPk5ld0J5dGVBcnJheShzaXplKTsKICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihqQXVkaW9EYXRhLCAwLCBzaXplLCAoamJ5dGUgKikgYnVmZmVyKTsKIApAQCAtMzUzLDcgKzM2Nyw3IEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnN0b3AoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU3RvcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzdG9wIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTdG9wKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwpAQCAtMzY1LDIwICszNzksMjAgQEAKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6Zmx1c2goKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqRmx1c2ggPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZmx1c2giLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakZsdXNoKTsKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6cGF1c2UoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqUGF1c2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGF1c2UiLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBhdXNlKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwogfQogCiBib29sIEpBdWRpb1RyYWNrOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheVN0YXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFBsYXlTdGF0ZSIsICIoKUkiKTsKICAgICBpbnQgY3VycmVudFBsYXlTdGF0ZSA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXlTdGF0ZSk7CiAKQEAgLTM5Myw3ICs0MDcsNyBAQAogfQogCiB1aW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0U2FtcGxlUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRTYW1wbGVSYXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFNhbXBsZVJhdGUpOwogfQpAQCAtNDAzLDcgKzQxNyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIGludCBidWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNDE3LDEyICs0MzEsMjYgQEAKIH0KIAogYXVkaW9fZm9ybWF0X3QgSkF1ZGlvVHJhY2s6OmZvcm1hdCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKICAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKICAgICByZXR1cm4gYXVkaW9Gb3JtYXRUb05hdGl2ZShqYXZhRm9ybWF0KTsKIH0KIAorc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0Rm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJnZXRGb3JtYXQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDsiKTsKKyAgICBqb2JqZWN0IGpBdWRpb0Zvcm1hdE9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEZvcm1hdCk7CisKKyAgICBqY2xhc3MgakF1ZGlvRm9ybWF0Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQiKTsKKyAgICBqbWV0aG9kSUQgakdldEZyYW1lU2l6ZUluQnl0ZXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakF1ZGlvRm9ybWF0Q2xzLCAiZ2V0RnJhbWVTaXplSW5CeXRlcyIsICIoKUkiKTsKKyAgICBqaW50IGphdmFGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0Zvcm1hdE9iaiwgakdldEZyYW1lU2l6ZUluQnl0ZXMpOworCisgICAgcmV0dXJuIChzaXplX3QpamF2YUZyYW1lU2l6ZUluQnl0ZXM7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKQEAgLTQzMiwxMCArNDYwLDYgQEAKICAgICAvLyBUT0RPOiBSZW1vdmUgbG9ncyB0aGF0IGluY2x1ZGVzIHVuYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gYmVsb3cuCiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAogLy8gICAgICAgICAgICAgICAgICBmb3JtYXQoKSwgbUNoYW5uZWxNYXNrLCBjaGFubmVsQ291bnQoKSk7CiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCkBAIC00NTMsMzggKzQ3Nyw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9fcG9ydF9oYW5kbGVfdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Citqb2JqZWN0IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0Um91dGVkRGV2aWNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFJvdXRlZERldmljZSIsCiAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87Iik7Ci0gICAgam9iamVjdCBqQXVkaW9EZXZpY2VJbmZvT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKLSAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoakF1ZGlvRGV2aWNlSW5mb09iaiwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotCi0gICAgamNsYXNzIGpBdWRpb0RldmljZUluZm9DbHMgPSBlbnYtPkZpbmRDbGFzcygiTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvIik7Ci0gICAgam1ldGhvZElEIGpHZXRJZCA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvRGV2aWNlSW5mb0NscywgImdldElkIiwgIigpSSIpOwotICAgIGppbnQgcm91dGVkRGV2aWNlSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvRGV2aWNlSW5mb09iaiwgakdldElkKTsKLSAgICByZXR1cm4gcm91dGVkRGV2aWNlSWQ7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CitpbnQzMl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb1Nlc3Npb25JZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb1Nlc3Npb25JZCIsICIoKUkiKTsKICAgICBqaW50IHNlc3Npb25JZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvU2Vzc2lvbklkKTsKLSAgICByZXR1cm4gKGF1ZGlvX3Nlc3Npb25fdCkgc2Vzc2lvbklkOworICAgIHJldHVybiBzZXNzaW9uSWQ7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqTVAySW1wbENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwiKTsKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBqTVAySW1wbENscywgInNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjaztJKVoiKTsKLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAotICAgICAgICAgICAgak1QMkltcGxDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIG1BdWRpb1RyYWNrT2JqLCBkZXZpY2VJZCk7CitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU2V0UHJlZmVycmVkRGV2aWNlSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0UHJlZmVycmVkRGV2aWNlIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOylaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFByZWZlcnJlZERldmljZUlkLCBkZXZpY2UpOwogICAgIHJldHVybiByZXN1bHQgPT0gdHJ1ZSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOwogfQogCithdWRpb19zdHJlYW1fdHlwZV90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1N0cmVhbVR5cGUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvQXR0cmlidXRlcyIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7Iik7CisgICAgam9iamVjdCBqQXVkaW9BdHRyaWJ1dGVzID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9BdHRyaWJ1dGVzKTsKKyAgICBqY2xhc3MgakF1ZGlvQXR0cmlidXRlc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyIpOworICAgIGptZXRob2RJRCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvQXR0cmlidXRlc0NscywKKyAgICAgICAgICAgICJnZXRWb2x1bWVDb250cm9sU3RyZWFtIiwgIigpSSIpOworICAgIGludCBqYXZhQXVkaW9TdHJlYW1UeXBlID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0F0dHJpYnV0ZXMsIGpHZXRWb2x1bWVDb250cm9sU3RyZWFtKTsKKyAgICByZXR1cm4gKGF1ZGlvX3N0cmVhbV90eXBlX3QpamF2YUF1ZGlvU3RyZWFtVHlwZTsKK30KKwogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjKSB7CiAgICAgaWYgKG1zZWMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNTI2LDE4ICs1NTIsODUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyLCBqb2JqZWN0IGhhbmRsZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgImFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7TGFuZHJvaWQvb3MvSGFuZGxlcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyLCBoYW5kbGVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqUmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJyZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciwgbGlzdGVuZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBKQXVkaW9UcmFjazo6cmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiByb3V0aW5nRGVsZWdhdGVzKSB7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IHJvdXRpbmdEZWxlZ2F0ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IHJvdXRpbmdEZWxlZ2F0ZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhpdC0+c2Vjb25kLCBnZXRIYW5kbGVyKGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyAgICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kcyBiZWdpbiAgICAgICAgICAgICAgICAgICAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqUm91dGluZ0RlbGVnYXRlQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUm91dGluZ0RlbGVnYXRlIik7CisgICAgam1ldGhvZElEIGpHZXRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgICAgICJnZXRMaXN0ZW5lciIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChyb3V0aW5nRGVsZWdhdGVPYmosIGpHZXRMaXN0ZW5lcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldEhhbmRsZXIgPSBlbnYtPkdldE1ldGhvZElEKGpSb3V0aW5nRGVsZWdhdGVDbHMsCisgICAgICAgICJnZXRIYW5kbGVyIiwgIigpTGFuZHJvaWQvb3MvSGFuZGxlcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldEhhbmRsZXIpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjphZGRHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYob2JqKSk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG9iaik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+Pjo6aXRlcmF0b3IgaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LCBrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QsIGtleSkpIHsKKyAgICAgICAgICAgIG1wLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vICAgICAgICAgICAgICAgIFByaXZhdGUgbWV0aG9kIGJlZ2lucyAgICAgICAgICAgICAgICAgIC8vLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTUwLDcgKzY0Myw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIC8vIFJlZmVyZW5jZWQgImFuZHJvaWRfbWVkaWFfVm9sdW1lU2hhcGVyLmgiLgogICAgIGpmbG9hdEFycmF5IHhhcnJheSA9IG51bGxwdHI7CkBAIC01OTUsNyArNjg4LDcgQEAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXIiKTsKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTY0NywxNSArNzQwLDE1IEBACiB9CiAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCRTdHJlYW1FdmVudENhbGxiYWNrIik7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIkU3RyZWFtRXZlbnRDYWxsYmFjayIpOwogICAgIGptZXRob2RJRCBqQ2FsbGJhY2tDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQ2FsbGJhY2tDbHMsICI8aW5pdD4iLCAiKEpKSilWIik7CiAgICAgam9iamVjdCBqQ2FsbGJhY2tPYmogPSBlbnYtPk5ld09iamVjdChqQ2FsbGJhY2tDbHMsIGpDYWxsYmFja0N0b3IsIHRoaXMsIGNiZiwgdXNlcik7CiAgICAgcmV0dXJuIGpDYWxsYmFja09iajsKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamNsYXNzIGpFeGVjdXRvcnNDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzIik7CiAgICAgam1ldGhvZElEIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvciA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakV4ZWN1dG9yc0NscywKICAgICAgICAgICAgICJuZXdTaW5nbGVUaHJlYWRFeGVjdXRvciIsICIoKUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2U7Iik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL3Njb3BlZF9sb2NhbF9yZWYuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJTaXplID0gMzI3Njg7CisKK0pNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Sk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MoCisgICAgICAgICAgICBlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1Db25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiY29ubmVjdCIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIik7CisgICAgQ0hFQ0sobUNvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtRGlzY29ubmVjdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgIigpViIpOworICAgIENIRUNLKG1EaXNjb25uZWN0TWV0aG9kICE9IE5VTEwpOworCisgICAgbVJlYWRBdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgInJlYWRBdCIsCisgICAgICAgICAgICAiKEpbQkkpSSIpOworICAgIENIRUNLKG1SZWFkQXRNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0U2l6ZU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFNpemUiLAorICAgICAgICAgICAgIigpSiIpOworICAgIENIRUNLKG1HZXRTaXplTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldE1JTUVUeXBlTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0TUlNRVR5cGUiLAorICAgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0sobUdldE1JTUVUeXBlTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldFVyaU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFVyaSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0VXJpTWV0aG9kICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gdG1wKAorICAgICAgICBlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGtCdWZmZXJTaXplKSk7CisgICAgbUJ5dGVBcnJheU9iaiA9IChqYnl0ZUFycmF5KWVudi0+TmV3R2xvYmFsUmVmKHRtcC5nZXQoKSk7CisgICAgQ0hFQ0sobUJ5dGVBcnJheU9iaiAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjp+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1CeXRlQXJyYXlPYmopOworfQorCitib29sIEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIFN0cmluZzggdG1wKCIiKTsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+a2V5QXQoaSkpOworICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmc4KCI6ICIpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+dmFsdWVBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIlxyXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKyAgICBqc3RyaW5nIGpoZWFkZXJzID0gZW52LT5OZXdTdHJpbmdVVEYodG1wLnN0cmluZygpKTsKKworICAgIGpib29sZWFuIHJldCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtQ29ubmVjdE1ldGhvZCwganVyaSwgamhlYWRlcnMpOworCisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpoZWFkZXJzKTsKKworICAgIHJldHVybiAoYm9vbClyZXQ7Cit9CisKK3ZvaWQgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbURpc2Nvbm5lY3RNZXRob2QpOworfQorCitzc2l6ZV90IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKworICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGtCdWZmZXJTaXplOworICAgIH0KKworICAgIGppbnQgbiA9IGVudi0+Q2FsbEludE1ldGhvZCgKKyAgICAgICAgICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbVJlYWRBdE1ldGhvZCwgKGpsb25nKW9mZnNldCwgbUJ5dGVBcnJheU9iaiwgKGppbnQpc2l6ZSk7CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgbUJ5dGVBcnJheU9iaiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgKGpieXRlICopZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK29mZjY0X3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRTaXplKCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gKG9mZjY0X3QpKGVudi0+Q2FsbExvbmdNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0U2l6ZU1ldGhvZCkpOworfQorCitzdGF0dXNfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgam1pbWUgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0TUlNRVR5cGVNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGptaW1lLCAwKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgICptaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqbWltZSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0VXJpTWV0aG9kKTsKKyAgICBqYm9vbGVhbiBmbGFnID0gZW52LT5FeGNlcHRpb25DaGVjaygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqdXJpLCAwKTsKKyAgICAqdXJpID0gU3RyaW5nOChzdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGp1cmksIHN0cik7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUzNTczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUFNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvc2NvcGVkX2xvY2FsX3JlZi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0pNZWRpYTJIVFRQU2VydmljZTo6Sk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUFNlcnZpY2VPYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUFNlcnZpY2VPYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MoZW52LCBlbnYtPkdldE9iamVjdENsYXNzKG1NZWRpYTJIVFRQU2VydmljZU9iaikpOworICAgIENIRUNLKG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAibWFrZUhUVFBDb25uZWN0aW9uIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBDb25uZWN0aW9uOyIpOworICAgIENIRUNLKG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgIT0gTlVMTCk7Cit9CisKK0pNZWRpYTJIVFRQU2VydmljZTo6fkpNZWRpYTJIVFRQU2VydmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKTsKK30KKworc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gSk1lZGlhMkhUVFBTZXJ2aWNlOjptYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpvYmplY3QgbWVkaWEySFRUUENvbm5lY3Rpb25PYmogPQorICAgICAgICBlbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBTZXJ2aWNlT2JqLCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kKTsKKworICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBDb25uZWN0aW9uKGVudiwgbWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAzZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSmF2YVZNSGVscGVyIgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3N0ZDo6YXRvbWljPEphdmFWTSAqPiBKYXZhVk1IZWxwZXI6OnNKYXZhVk0oTlVMTCk7CisKKy8qCisgKiBNYWtlcyB0aGUgY3VycmVudCB0aHJlYWQgdmlzaWJsZSB0byB0aGUgVk0uCisgKgorICogVGhlIEpOSUVudiBwb2ludGVyIHJldHVybmVkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kCisgKiB0aHVzIG11c3QgYmUgdHVja2VkIGludG8gdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCisgKi8KK3N0YXRpYyBpbnQgamF2YUF0dGFjaFRocmVhZChjb25zdCBjaGFyKiB0aHJlYWROYW1lLCBKTklFbnYqKiBwRW52KSB7CisgICAgSmF2YVZNQXR0YWNoQXJncyBhcmdzOworICAgIEphdmFWTSogdm07CisgICAgamludCByZXN1bHQ7CisKKyAgICB2bSA9IEphdmFWTUhlbHBlcjo6Z2V0SmF2YVZNKCk7CisgICAgaWYgKHZtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgfQorCisgICAgYXJncy52ZXJzaW9uID0gSk5JX1ZFUlNJT05fMV80OworICAgIGFyZ3MubmFtZSA9IChjaGFyKikgdGhyZWFkTmFtZTsKKyAgICBhcmdzLmdyb3VwID0gTlVMTDsKKworICAgIHJlc3VsdCA9IHZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKHBFbnYsICh2b2lkKikgJmFyZ3MpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dJKCJOT1RFOiBhdHRhY2ggb2YgdGhyZWFkICclcycgZmFpbGVkXG4iLCB0aHJlYWROYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRGV0YWNoIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzZXQgdmlzaWJsZSB0byB0aGUgVk0uCisgKi8KK3N0YXRpYyBpbnQgamF2YURldGFjaFRocmVhZCh2b2lkKSB7CisgICAgSmF2YVZNKiB2bTsKKyAgICBqaW50IHJlc3VsdDsKKworICAgIHZtID0gSmF2YVZNSGVscGVyOjpnZXRKYXZhVk0oKTsKKyAgICBpZiAodm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICB9CisKKyAgICByZXN1bHQgPSB2bS0+RGV0YWNoQ3VycmVudFRocmVhZCgpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dFKCJFUlJPUjogdGhyZWFkIGRldGFjaCBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogV2hlbiBzdGFydGluZyBhIG5hdGl2ZSB0aHJlYWQgdGhhdCB3aWxsIGJlIHZpc2libGUgZnJvbSB0aGUgVk0sIHdlCisgKiBib3VuY2UgdGhyb3VnaCB0aGlzIHRvIGdldCB0aGUgcmlnaHQgYXR0YWNoL2RldGFjaCBhY3Rpb24uCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBmcmVlKGFyZ3MpCisgKi8KK3N0YXRpYyBpbnQgamF2YVRocmVhZFNoZWxsKHZvaWQqIGFyZ3MpIHsKKyAgICB2b2lkKiBzdGFydCA9ICgodm9pZCoqKWFyZ3MpWzBdOworICAgIHZvaWQqIHVzZXJEYXRhID0gKCh2b2lkICoqKWFyZ3MpWzFdOworICAgIGNoYXIqIG5hbWUgPSAoY2hhciopICgodm9pZCAqKilhcmdzKVsyXTsgICAgICAgIC8vIHdlIG93biB0aGlzIHN0b3JhZ2UKKyAgICBmcmVlKGFyZ3MpOworICAgIEpOSUVudiogZW52OworICAgIGludCByZXN1bHQ7CisKKyAgICAvKiBob29rIHVzIGludG8gdGhlIFZNICovCisgICAgaWYgKGphdmFBdHRhY2hUaHJlYWQobmFtZSwgJmVudikgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzdGFydCB0aGUgdGhyZWFkIHJ1bm5pbmcgKi8KKyAgICByZXN1bHQgPSAoKihhbmRyb2lkX3RocmVhZF9mdW5jX3Qpc3RhcnQpKHVzZXJEYXRhKTsKKworICAgIC8qIHVuaG9vayB1cyAqLworICAgIGphdmFEZXRhY2hUaHJlYWQoKTsKKyAgICBmcmVlKG5hbWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoKSB2aWEgdGhlIGNhbGxiYWNrCisgKiBzZXQgd2l0aCBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygpLgorICoKKyAqIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZXcgdGhyZWFkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBnZXRzIGhvb2tlZAorICogaW50byB0aGUgVk0gYmVmb3JlIGl0IHJlYWxseSBzdGFydHMgZXhlY3V0aW5nLgorICovCitzdGF0aWMgaW50IGphdmFDcmVhdGVUaHJlYWRFdGMoCisgICAgICAgIGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAorICAgICAgICB2b2lkKiB1c2VyRGF0YSwKKyAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKKyAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKKyAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKKyAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCogdGhyZWFkSWQpIHsKKyAgICB2b2lkKiogYXJncyA9ICh2b2lkKiopIG1hbGxvYygzICogc2l6ZW9mKHZvaWQqKSk7ICAgLy8gamF2YVRocmVhZFNoZWxsIG11c3QgZnJlZQorICAgIGludCByZXN1bHQ7CisKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRocmVhZE5hbWUgPT0gbnVsbHB0ciwgInRocmVhZE5hbWUgbm90IHByb3ZpZGVkIHRvIGphdmFDcmVhdGVUaHJlYWRFdGMiKTsKKworICAgIGFyZ3NbMF0gPSAodm9pZCopIGVudHJ5RnVuY3Rpb247CisgICAgYXJnc1sxXSA9IHVzZXJEYXRhOworICAgIGFyZ3NbMl0gPSAodm9pZCopIHN0cmR1cCh0aHJlYWROYW1lKTsgICAvLyBqYXZhVGhyZWFkU2hlbGwgbXVzdCBmcmVlCisKKyAgICByZXN1bHQgPSBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGphdmFUaHJlYWRTaGVsbCwgYXJncywKKyAgICAgICAgdGhyZWFkTmFtZSwgdGhyZWFkUHJpb3JpdHksIHRocmVhZFN0YWNrU2l6ZSwgdGhyZWFkSWQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworSk5JRW52ICpKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpIHsKKyAgICBKTklFbnYgKmVudjsKKyAgICBKYXZhVk0gKnZtID0gc0phdmFWTS5sb2FkKCk7CisgICAgQ0hFQ0sodm0gIT0gTlVMTCk7CisKKyAgICBpZiAodm0tPkdldEVudigodm9pZCAqKikmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZW52OworfQorCisvL3N0YXRpYworSmF2YVZNICpKYXZhVk1IZWxwZXI6OmdldEphdmFWTSgpIHsKKyAgICByZXR1cm4gc0phdmFWTS5sb2FkKCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBKYXZhVk1IZWxwZXI6OnNldEphdmFWTShKYXZhVk0gKnZtKSB7CisgICAgc0phdmFWTS5zdG9yZSh2bSk7CisKKyAgICAvLyBFbnN1cmUgdGhhdCBUaHJlYWQoLypjYW5DYWxsSmF2YSovIHRydWUpIGluIGxpYnV0aWxzIGlzIGF0dGFjaGVkIHRvIHRoZSBWTS4KKyAgICAvLyBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGRvbmUgYnkgcnVudGltZSwgYnV0IHdoZW4gbGlidXRpbHMgaXMgdXNlZCB3aXRoIGxpbmtlcgorICAgIC8vIG5hbWVzcGFjZSwgQ3JlYXRlVGhyZWFkRnVuYyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgc2VwYXJhdGVseSB3aXRoaW4gdGhlIG5hbWVzcGFjZS4KKyAgICBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygoYW5kcm9pZF9jcmVhdGVfdGhyZWFkX2ZuKSBqYXZhQ3JlYXRlVGhyZWFkRXRjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCmluZGV4IGE4ZTFkMWYuLjRkZTkyYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcApAQCAtMjIsOCArMjIsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSB7CkBAIC00NCwzMSArNDIsMjggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICB2b2x1bWUoJWYpXG4iLCBtVm9sdW1lKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpID8gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCkgOiAtMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBhdXggZWZmZWN0IGlkKCVkKSwgc2VuZCBsZXZlbCAoJWYpXG4iLAogICAgICAgICAgICAgbUF1eEVmZmVjdElkLCBtU2VuZExldmVsKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLU1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKLSAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCi0gICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgbUxlZnRWb2x1bWUoMS4wKSwKLSAgICAgIG1SaWdodFZvbHVtZSgxLjApLAorTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykKKyAgICA6IG1DYWxsYmFjayhudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0RhdGEobnVsbHB0ciksCisgICAgICBtVm9sdW1lKDEuMCksCiAgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCiAgICAgICBtU2FtcGxlUmF0ZUh6KDApLAogICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCkBAIC03OCwyOCArNzMsMjIgQEAKICAgICAgIG1QaWQocGlkKSwKICAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKICAgICAgIG1BdXhFZmZlY3RJZCgwKSwKLSAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spIHsKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworCisgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbHB0cikgeworICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbVJvdXRpbmdEZWxlZ2F0ZXMuY2xlYXIoKTsKIH0KIAogTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6On5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpIHsKKyAgICBmb3IgKGF1dG8gcm91dGluZ0RlbGVnYXRlIDogbVJvdXRpbmdEZWxlZ2F0ZXMpIHsKKyAgICAgICAgSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihyb3V0aW5nRGVsZWdhdGUuc2Vjb25kKTsKKyAgICB9CiAgICAgY2xvc2UoKTsKLSAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKICAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKIH0KIApAQCAtMTI2LDMxICsxMTUsMzEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmZyYW1lQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgcmV0dXJuIG1GcmFtZVNpemU7CkBAIC0xNTgsMTAgKzE0NywxMCBAQAogCiB1aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bGF0ZW5jeSAoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+bGF0ZW5jeSgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmxhdGVuY3koKTsKIH0KIAogZmxvYXQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdCB7CkBAIC0xNzEsMTggKzE2MCwxOCBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CiB9CiAKIC8vIFRPRE86IFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxscyB0byBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKCkKQEAgLTE5NSw3ICsxODQsNyBAQAogLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIG9mIHBsYXllZCBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KIGludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDAgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTIwMywyMiArMTkyLDE4IEBACiAgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdFVzOwogICAgIEF1ZGlvVGltZXN0YW1wIHRzOwogCi0gICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIHN0YXR1c190IHJlcyA9IG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKwogICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KICAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7CiAgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeyAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7CiAgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogV09VTERfQkxPQ0sgJWQgJWxsZCIsCiAgICAgICAgIC8vICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KLSAgICAgICAgcmVzID0gbVRyYWNrLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKLSAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgKz0gMTAwMExMICogbVRyYWNrLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KLSAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICV1ICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CiAgICAgfQogCiAgICAgLy8gQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0CkBAIC0yNDQsMTA4ICsyMjksNTUgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBFeHRlbmRlZFRpbWVzdGFtcCBldHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAoJmV0cyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAoJmV0cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBPSyB8fCBzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgKmZyYW1lc3dyaXR0ZW4gPSAodWludDMyX3QpZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgewordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgbUF0dHJpYnV0ZXMgPSAoYXR0cmlidXRlcyA9PSBudWxscHRyKSA/IG51bGxwdHIgOiBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKIH0KIAotU3RyaW5nOCAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgeworYXVkaW9fc3RyZWFtX3R5cGVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFBhcmFtZXRlcnMoa2V5cyk7Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChhdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXR0cmlidXRlcyk7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgLy8gZG8gbm90IGFsbG93IGRpcmVjdCBzdHJlYW0gdHlwZSBtb2RpZmljYXRpb24gaWYgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0Ci0gICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIH0KKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2VfbCgpIHsKLSAgICBtVHJhY2suY2xlYXIoKTsKKyAgICBtSkF1ZGlvVHJhY2suY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQpIHsKLSAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOworICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgbVNlc3Npb25JZCwgZmxhZ3MpOwogCiAgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCiAgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKICAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApICYmCi0gICAgICAgICAgICAoKGNiID09IE5VTEwpIHx8IChvZmZsb2FkSW5mbyA9PSBOVUxMKSkpIHsKKyAgICAgICAgICAgICgoY2IgPT0gbnVsbHB0cikgfHwgKG9mZmxvYWRJbmZvID09IG51bGxwdHIpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIGNvbXB1dGUgZnJhbWUgY291bnQgZm9yIHRoZSBBdWRpb1RyYWNrIGludGVybmFsIGJ1ZmZlcgotICAgIHNpemVfdCBmcmFtZUNvdW50OwotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgIGZyYW1lQ291bnQgPSAwOyAvLyBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdHJ5IHRvIGVzdGltYXRlIHRoZSBidWZmZXIgcHJvY2Vzc2luZyBmZXRjaCBzaXplIGZyb20gQXVkaW9GbGluZ2VyLgotICAgICAgICAvLyBmcmFtZXNQZXJCdWZmZXIgaXMgYXBwcm94aW1hdGUgYW5kIGdlbmVyYWxseSBjb3JyZWN0LCBleGNlcHQgd2hlbiBpdCdzIG5vdCA6LSkuCi0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzUGVyQnVmZmVyID0KLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBhZkZyYW1lQ291bnQgLyBhZlNhbXBsZVJhdGU7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIC8vIHVzZSBzdWdnZXN0ZWRGcmFtZUNvdW50Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IChzdWdnZXN0ZWRGcmFtZUNvdW50ICsgZnJhbWVzUGVyQnVmZmVyIC0gMSkgLyBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgYXJndW1lbnQgYnVmZmVyQ291bnQgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQKLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50ICE9IDAgJiYgYnVmZmVyQ291bnQgPCBtTWluQnVmZmVyQ291bnQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJDb3VudCAoJWQpIGluY3JlYXNlZCB0byAlZCIsIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOwotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBpcyAwLCB0aGVuIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSB0aGUgbWluaW11bSBzaXplIHBlcm1pdHRlZC4KLSAgICAgICAgZnJhbWVDb3VudCA9IGJ1ZmZlckNvdW50ICogZnJhbWVzUGVyQnVmZmVyOwotICAgIH0KKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9CisgICAgICAgICAgICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSA/IDAgOiBzdWdnZXN0ZWRGcmFtZUNvdW50OwogCiAgICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewogICAgICAgICBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwpAQCAtMzU5LDMyICsyOTEsMjMgQEAKICAgICBtQ2FsbGJhY2sgPSBjYjsKICAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CiAKLSAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKyAgICBzcDxKQXVkaW9UcmFjaz4galQ7CisgICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBudWxscHRyOwogCi0gICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7CisgICAgQUxPR1YoImNyZWF0aW5nIG5ldyBKQXVkaW9UcmFjayIpOwogCi0gICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBudWxscHRyKSB7CiAgICAgICAgIG5ld2NiZCA9IG5ldyBDYWxsYmFja0RhdGEodGhpcyk7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKLSAgICAgICAgICAgICAgICBuZXdjYmQsCi0gICAgICAgICAgICAgICAgMCwgIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgICAgIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICAxLjBmLCAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgICAgICAgICAgbmV3Y2JkLAorICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyAhPSBudWxscHRyID8gbUF0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIDEuMGYpOyAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCiAgICAgICAgIC8vIGJhc2VkIG9uIG1QbGF5YmFja1JhdGUgYXQgdGhlIHRpbWUgb2Ygb3BlbiAoaW5zdGVhZCBvZiBrTWF4UmVxdWlyZWRTcGVlZCksCkBAIC0zOTQsNzMgKzMxNyw2MiBAQAogICAgICAgICBBTE9HV19JRih0YXJnZXRTcGVlZCAhPSBtUGxheWJhY2tSYXRlLm1TcGVlZCwKICAgICAgICAgICAgICAgICAidHJhY2sgdGFyZ2V0IHNwZWVkOiVmIGNsYW1wZWQgZnJvbSBwbGF5YmFjayBzcGVlZDolZiIsCiAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyB1c2VyIGRhdGEKLSAgICAgICAgICAgICAgICAwLCAvLyBub3RpZmljYXRpb24gZnJhbWVzCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwotICAgICAgICAgICAgICAgIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgIGpUID0gbmV3IEpBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyAhPSBudWxscHRyID8gbUF0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkKTsKICAgICB9CiAKLSAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgeworICAgIGlmIChqVCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CiAgICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCiAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKLSAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKICAgICB9CiAKLSAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7CisgICAgQ0hFQ0soKGpUICE9IG51bGxwdHIpICYmICgobUNhbGxiYWNrID09IG51bGxwdHIpIHx8IChuZXdjYmQgIT0gbnVsbHB0cikpKTsKIAogICAgIG1DYWxsYmFja0RhdGEgPSBuZXdjYmQ7CiAgICAgQUxPR1YoInNldFZvbHVtZSIpOwotICAgIHQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICBqVC0+c2V0Vm9sdW1lKG1Wb2x1bWUpOwogCiAgICAgbVNhbXBsZVJhdGVIeiA9IHNhbXBsZVJhdGU7CiAgICAgbUZsYWdzID0gZmxhZ3M7CiAgICAgbU1zZWNzUGVyRnJhbWUgPSAxRTNmIC8gKG1QbGF5YmFja1JhdGUubVNwZWVkICogc2FtcGxlUmF0ZSk7Ci0gICAgbUZyYW1lU2l6ZSA9IHQtPmZyYW1lU2l6ZSgpOwotICAgIG1UcmFjayA9IHQ7CisgICAgbUZyYW1lU2l6ZSA9IGpULT5mcmFtZVNpemUoKTsKKyAgICBtSkF1ZGlvVHJhY2sgPSBqVDsKIAogICAgIHJldHVybiB1cGRhdGVUcmFja19sKCk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp1cGRhdGVUcmFja19sKCkgewotICAgIGlmIChtVHJhY2sgPT0gTlVMTCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CiAgICAgLy8gTm90ZSBzb21lIG91dHB1dCBkZXZpY2VzIG1heSBnaXZlIHVzIGEgZGlyZWN0IHRyYWNrIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHNwZWNpZnkgaXQuCiAgICAgLy8gRXhhbXBsZTogTGluZSBhcHBsaWNhdGlvbiBiLzE3NDU5OTgyLgotICAgIGlmICgobVRyYWNrLT5nZXRGbGFncygpCisgICAgaWYgKChtSkF1ZGlvVHJhY2stPmdldEZsYWdzKCkKICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgICAgICByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKICAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgICAgICByZXMgPSBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOworICAgICAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgICAgICByZXMgPSBtSkF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKG1TZWxlY3RlZERldmljZUlkKTsKLSAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCkgewotICAgICAgICBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgaWYgKG1QcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFByZWZlcnJlZERldmljZShtUHJlZmVycmVkRGV2aWNlLT5nZXRKT2JqZWN0KCkpOwogICAgIH0KKworICAgIG1KQXVkaW9UcmFjay0+cmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKG1Sb3V0aW5nRGVsZWdhdGVzKTsKKwogICAgIEFMT0dWKCJ1cGRhdGVUcmFja19sKCkgRE9ORSBzdGF0dXMgJWQiLCByZXMpOwogICAgIHJldHVybiByZXM7CiB9CkBAIC00NjgsMTMgKzM4MCwxMyBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0YXJ0KCkgewogICAgIEFMT0dWKCJzdGFydCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gbnVsbHB0cikgewogICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOwogICAgIH0KLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPnN0YXJ0KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0Vm9sdW1lKG1Wb2x1bWUpOworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUpBdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4MiwxMSArMzk0LDExIEBACiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gbnVsbHB0ciwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTQ5NCw0NSArNDA2LDQ0IEBACiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdG9wKCkgewogICAgIEFMT0dWKCJzdG9wIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnN0b3AoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zdG9wKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKICAgICBBTE9HVigiZmx1c2giKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+Zmx1c2goKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5mbHVzaCgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cGF1c2UoKSB7CiAgICAgQUxPR1YoInBhdXNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnBhdXNlKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+cGF1c2UoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNsb3NlKCkgewogICAgIEFMT0dWKCJjbG9zZSIpOwotICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiB0cmFjazsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgdHJhY2sgPSBtVHJhY2s7Ci0gICAgICAgIGNsb3NlX2woKTsgLy8gY2xlYXJzIG1UcmFjaworICAgICAgICB0cmFjayA9IG1KQXVkaW9UcmFjazsKKyAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbUpBdWRpb1RyYWNrCiAgICAgfQogICAgIC8vIGRlc3RydWN0aW9uIG9mIHRoZSB0cmFjayBvY2N1cnMgb3V0c2lkZSBvZiBtdXRleC4KIH0KIAotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgQUxPR1YoInNldFZvbHVtZSglZiwgJWYpIiwgbGVmdCwgcmlnaHQpOwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYpIiwgdm9sdW1lKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShsZWZ0LCByaWdodCk7CisgICAgbVZvbHVtZSA9IHZvbHVtZTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiB9CiAKQEAgLTU0MCwxMiArNDUxLDEyIEBACiAgICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSglZiAlZiAlZCAlZCkiLAogICAgICAgICAgICAgICAgIHJhdGUubVNwZWVkLCByYXRlLm1QaXRjaCwgcmF0ZS5tRmFsbGJhY2tNb2RlLCByYXRlLm1TdHJldGNoTW9kZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICAvLyByZW1lbWJlciByYXRlIHNvIHRoYXQgd2UgY2FuIHNldCBpdCB3aGVuIHRoZSB0cmFjayBpcyBvcGVuZWQKICAgICAgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTU1OSwxMiArNDcwLDEyIEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIik7CisgICAgQUxPR1YoImdldFBsYXliYWNrUmF0ZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgICpyYXRlID0gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAqcmF0ZSA9IG1KQXVkaW9UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC01NzIsOCArNDgzLDggQEAKICAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbVNlbmRMZXZlbCA9IGxldmVsOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01ODIsNDQgKzQ5Myw1OSBAQAogICAgIEFMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtQXV4RWZmZWN0SWQgPSBlZmZlY3RJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCVkKSIsIGRldmljZUlkKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkRGV2aWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKGRldmljZSk7CisgICAgfQorICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZSA9IG5ldyBKT2JqZWN0SG9sZGVyKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2pvYmplY3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZSgpIHsKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgalJvdXRpbmdEZWxlZ2F0ZSkgeworICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGpvYmplY3QgbGlzdGVuZXIgPSBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyICYmCisgICAgICAgIEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKSA9PSBudWxscHRyKSB7CisgICAgICAgIGpvYmplY3QgaGFuZGxlciA9IEpBdWRpb1RyYWNrOjpnZXRIYW5kbGVyKGpSb3V0aW5nRGVsZWdhdGUpOworICAgICAgICBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSA9IEpBdWRpb1RyYWNrOjphZGRHbG9iYWxSZWYoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIG1Sb3V0aW5nRGVsZWdhdGVzLnB1c2hfYmFjayhzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4obGlzdGVuZXIsIHJvdXRpbmdEZWxlZ2F0ZSkpOworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSwgaGFuZGxlcik7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSB7Ci0gICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7CitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKLSAgICB9Ci0gICAgKmRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7Ci0gICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgPSBlbmFibGVkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgam9iamVjdCByb3V0aW5nRGVsZWdhdGUgPSBudWxscHRyOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0ciAmJgorICAgICAgICAocm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUpOworICAgICAgICBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpOworICAgICAgICBpZiAoSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihyb3V0aW5nRGVsZWdhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTYzMiwyMSArNTU4LDIxIEBACiAgICAgLy8gbG9jayB0byBlbnN1cmUgd2UgYXJlbid0IGNhdWdodCBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhY2sgc3dpdGNoLgogICAgIGRhdGEtPmxvY2soKTsKICAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIGlmIChtZSA9PSBOVUxMKSB7CisgICAgSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEpBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOworICAgIGlmIChtZSA9PSBudWxscHRyKSB7CiAgICAgICAgIC8vIG5vIG91dHB1dCBzZXQsIGxpa2VseSBiZWNhdXNlIHRoZSB0cmFjayB3YXMgc2NoZWR1bGVkIHRvIGJlIHJldXNlZAogICAgICAgICAvLyBieSBhbm90aGVyIHBsYXllciwgYnV0IHRoZSBmb3JtYXQgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUuCiAgICAgICAgIGRhdGEtPnVubG9jaygpOwotICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7CiAgICAgICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKKyAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5tRGF0YSwgYnVmZmVyLT5tU2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKICAgICAgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KQEAgLTY1OCwyNSArNTg0LDI1IEBACiAgICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKICAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KIAotICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CisgICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPm1TaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CiAKLSAgICAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKKyAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IGFjdHVhbFNpemU7CiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKICAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgb2NjdXJzIGZvciBvZmZsb2FkZWQgY2FsbGJhY2tzCiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfU1RSRUFNX0VORCIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBudWxscHRyIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1NUUkVBTV9FTkQpOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1RFQVJfRE9XTiIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfVEVBUl9ET1dOKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgogICAgICAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkKICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gc3VwcGx5IGRhdGEgdG8gdGhlIEF1ZGlvVHJhY2suICBJdCBjYW4gYWxzbwogICAgICAgICAvLyBvY2N1ciBpbiBub24tb2ZmbG9hZGVkIG1vZGUgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGNvbWVzIG91dCBvZiBzdGFuZGJ5LgpAQCAtNjk2LDI5ICs2MjIsMzEgQEAKICAgICBkYXRhLT51bmxvY2soKTsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdAoteworaW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVNlc3Npb25JZDsKIH0KIAotdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAotewordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiB9CiAKLWludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0Ci17Cit1aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7Cit9CisKK2ludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGlmIChtVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiBkdXJhdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKaW5kZXggMzAxODI1Yi4uODdkYzg4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKQEAgLTE3LDE5ICsxNywyMSBAQAogI2lmbmRlZiBBTkRST0lEX0pBVURJT1RSQUNLX0gKICNkZWZpbmUgQU5EUk9JRF9KQVVESU9UUkFDS19ICiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+ICAgLy8gSXQgaGFzIGRlcGVuZGVuY3kgb24gYXVkaW8uaC9FcnJvcnMuaCwgYnV0IGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlbSBpbiBpdC4gVGhlcmVmb3JlIGl0IGlzIGluY2x1ZGVkIGhlcmUgYXQgbGFzdC4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBKQXVkaW9UcmFjayB7CitjbGFzcyBKQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgpAQCAtMzcsNiArMzksOCBAQAogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CiAgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgIEVWRU5UX1VOREVSUlVOID0gMSwgICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuIFRoaXMgd2lsbCBub3Qgb2NjdXIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0aWMgdHJhY2tzLgogICAgICAgICBFVkVOVF9ORVdfSUFVRElPVFJBQ0sgPSA2LCAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbHVudGFyeSBpbnZhbGlkYXRpb24gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgogICAgICAgICBFVkVOVF9TVFJFQU1fRU5EID0gNywgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkCkBAIC0xMDQsMTUgKzEwOCwxNCBAQAogICAgICAqCiAgICAgICogVE9ETzogUmV2aXZlIHJlbW92ZWQgYXJndW1lbnRzIGFmdGVyIG9mZmxvYWQgbW9kZSBpcyBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgSkF1ZGlvVHJhY2soYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgSkF1ZGlvVHJhY2sodWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOwogCiAgICAgLyoKQEAgLTE1OCwxMCArMTYxLDEwIEBACiAgICAgICogQ2F1dGlvbjogY2FsbGluZyB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gbWF5IGJlIGluZWZmaWNpZW50OwogICAgICAqIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIG1hcHBpbmcgYmV0d2VlbiBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUsCiAgICAgICogY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoYXQgYXQgYXBwbGljYXRpb24gbGV2ZWwsIGJhc2VkIG9uIHRoZSBsb3cgcmVzb2x1dGlvbiB0aW1lc3RhbXBzLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCi0gICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogICAgICAgICBOT19JTklUIGlmIGZpbmRzIGVycm9yLCBhbmQgdGltZXN0YW1wIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZCBvbiByZXR1cm4uCiAgICAgICovCi0gICAgYm9vbCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogCiAgICAgLy8gVE9ETzogVGhpcyBkb2MgaXMganVzdCBjb3BpZWQgZnJvbSBBdWRpb1RyYWNrLmguIFJldmlzZSBpdCBhZnRlciBpbXBsZW1lbmF0aW9uLgogICAgIC8qIFJldHVybiB0aGUgZXh0ZW5kZWQgdGltZXN0YW1wLCB3aXRoIGFkZGl0aW9uYWwgdGltZWJhc2UgaW5mbyBhbmQgaW1wcm92ZWQgZHJhaW4gYmVoYXZpb3IuCkBAIC0zMjQsMzcgKzMyNyw0MyBAQAogCiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCk7CiAKKyAgICBzaXplX3QgZnJhbWVTaXplKCk7CisKICAgICAvKgogICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyB0cmFjay4KICAgICAgKiBOb3QgYSBnZW5lcmFsLXB1cnBvc2UgQVBJOyBpbnRlbmRlZCBvbmx5IGZvciB1c2UgYnkgbWVkaWEgcGxheWVyIHNlcnZpY2UgdG8gZHVtcCBpdHMgdHJhY2tzLgogICAgICAqLwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAotICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBkZXZpY2UgYWN0dWFsbHkgdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcwotICAgICAqIGF0dGFjaGVkLiBXaGVuIHRoZSBBdWRpb1RyYWNrIGlzIGluYWN0aXZlLCBpdCB3aWxsIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FLgorICAgIC8qIFJldHVybnMgdGhlIEF1ZGlvRGV2aWNlSW5mbyB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCisgICAgICogYXR0YWNoZWQuCiAgICAgICovCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CiAKICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gc2Vzc2lvbiB0aGlzIEF1ZGlvVHJhY2sgYmVsb25ncyB0by4gKi8KLSAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpbnQzMl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CiAKLSAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCi0gICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCByb3V0aW5nLgorICAgIC8qIFNldHMgdGhlIHByZWZlcnJlZCBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgorICAgICAqIERldmljZTogYW4gQXVkaW9EZXZpY2VJbmZvIG9iamVjdC4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgotICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIGZpbmQgdGhlIHZhbGlkIG91dHB1dCBkZXZpY2Ugd2l0aCBnaXZlbiBkZXZpY2UgSWQuCisgICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gc2V0IHRoZSBkZXZpY2UKICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKIAogICAgIC8vIFRPRE86IEFkZCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Qgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KICAgICAvLyBUT0RPOiBBZGQgQVVESU9fRkxBR19IV19BVl9TWU5DIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLyogUmV0dXJucyB0aGUgZmxhZ3MgKi8KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCisgICAgLyogV2UgZG9uJ3Qga2VlcCBzdHJlYW0gdHlwZSBoZXJlLAorICAgICAqIGluc3RlYWQsIHdlIGtlZXAgYXR0cmlidXRlcyBhbmQgY2FsbCBnZXRWb2x1bWVDb250cm9sU3RyZWFtKCkgdG8gZ2V0IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKTsKKwogICAgIC8qIE9idGFpbiB0aGUgcGVuZGluZyBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHBsYXliYWNrIG9mIHB1cmUgUENNIGRhdGEgcmVtYWluaW5nIGluCiAgICAgICogQXVkaW9UcmFjay4KICAgICAgKgpAQCAtMzY5LDI3ICszNzgsNjggQEAKICAgICAgKiBSZXBsYWNlcyBhbnkgcHJldmlvdXNseSBpbnN0YWxsZWQgY2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCisgICAgICogSGFuZGxlcjogdGhlIGhhbmRsZXIgdG8gaGFuZGxlciB0aGUgcmVyb3V0aW5nIGV2ZW50cy4KICAgICAgKgogICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgotICAgICAqICAgICAgICAgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKiAgICAgICAgIChUT0RPKSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgKiAgICAgICAgIChUT0RPKSBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCByZCk7CiAKICAgICAvKiBSZW1vdmVzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZAotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKiBSZWdpc3RlciBhbGwgYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiByb3V0aW5nRGVsZWdhdGVzOiBiYWNrZWQtdXAgcm91dGluZyBkZWxlZ2F0ZXMKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpOworCisgICAgLyogZ2V0IGxpc3RlbmVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKTsKKworICAgIC8qIGdldCBoYW5kbGVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyogY29udmVydCBsb2NhbCByZWZlcmVuY2UgdG8gZ2xvYmFsIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgam9iamVjdCBhZGRHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopOworCisgICAgLyogZXJhc2UgZ2xvYmFsIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2VlZHMKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiBvYmogaXMgTlVMTAorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICoKKyAgICAgKiBSZXR1cm5zIHZhbHVlIGlmIGtleSBpcyBpbiB0aGUgbWFwCisgICAgICogICAgICAgICBudWxscHRyIGlmIGtleSBpcyBub3QgaW4gdGhlIG1hcAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGZpbmRCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICovCisgICAgc3RhdGljIHZvaWQgZXJhc2VCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpOwogCiBwcml2YXRlOgogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY3ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uIHsKKyAgICBKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmo7CisgICAgam1ldGhvZElEIG1Db25uZWN0TWV0aG9kOworICAgIGptZXRob2RJRCBtRGlzY29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbVJlYWRBdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFNpemVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRNSU1FVHlwZU1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFVyaU1ldGhvZDsKKworICAgIGpieXRlQXJyYXkgbUJ5dGVBcnJheU9iajsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjYxYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhMkhUVFBTZXJ2aWNlIDogcHVibGljIE1lZGlhSFRUUFNlcnZpY2UgeworICAgIEpNZWRpYTJIVFRQU2VydmljZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KTsKKworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5KTWVkaWEySFRUUFNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1NZWRpYTJIVFRQU2VydmljZU9iajsKKworICAgIGptZXRob2RJRCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSk1lZGlhMkhUVFBTZXJ2aWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkOGI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKT0JKRUNUX0hPTERFUl9IXworCisjZGVmaW5lIEpPQkpFQ1RfSE9MREVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZ2xvYmFsIHJlZmVyZW5jZSBvZiBqb2JqZWN0Lgorc3RydWN0IEpPYmplY3RIb2xkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgSk9iamVjdEhvbGRlcihqb2JqZWN0IG9iaikgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIG1KT2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihvYmopKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5KT2JqZWN0SG9sZGVyKCkgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KT2JqZWN0KTsKKyAgICB9CisKKyAgICBqb2JqZWN0IGdldEpPYmplY3QoKSB7IHJldHVybiBtSk9iamVjdDsgfQorCitwcml2YXRlOgorICAgIGpvYmplY3QgbUpPYmplY3Q7Cit9OworCit9ICAvLyIgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpPQkpFQ1RfSE9MREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1NmFjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNkZWZpbmUgSkFWQV9WTV9IRUxQRVJfSF8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSA8YXRvbWljPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKYXZhVk1IZWxwZXIgeworICAgIHN0YXRpYyBKTklFbnYgKmdldEpOSUVudigpOworICAgIHN0YXRpYyBKYXZhVk0gKmdldEphdmFWTSgpOworICAgIHN0YXRpYyB2b2lkIHNldEphdmFWTShKYXZhVk0gKnZtKTsKKworcHJpdmF0ZToKKyAgICAvLyBPbmNlIGEgdmFsaWQgSmF2YVZNIGhhcyBiZWVuIHNldCwgaXQgc2hvdWxkIG5ldmVyIGJlIHJlc2V0IG9yIGNoYW5nZWQuCisgICAgLy8gSG93ZXZlciwgYXMgaXQgbWF5IGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgYWNjZXNzIG5lZWRzIHRvIGJlCisgICAgLy8gc3luY2hyb25pemVkLgorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxKYXZhVk0gKj4gc0phdmFWTTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSkFWQV9WTV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKaW5kZXggNWQ1YjhlNC4uYmRhNGY2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKQEAgLTE5LDEwICsxOSwxNiBAQAogI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEF1ZGlvVHJhY2s7CkBAIC0zMiwxNSArMzgsMTQgQEAKICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKIHB1YmxpYzoKLSAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKICAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpOwogCiAgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRyYWNrICE9IDA7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0OwpAQCAtNTIsMTcgKzU3LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNzEsMTMgKzc2LDEwIEBACiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci0gICAgfQotICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOworICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0OwogCi0gICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwogCkBAIC05MiwxMyArOTQsMTEgQEAKICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgIC8vcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQogICAgIC8vIEF1ZGlvUm91dGluZwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgc2V0TWluQnVmZmVyQ291bnQoKTsKQEAgLTEwNywyOSArMTA3LDI1IEBACiAgICAgdm9pZCBjbG9zZV9sKCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlVHJhY2tfbCgpOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiAgICAgICAgIG1KQXVkaW9UcmFjazsKICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwogICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1BdHRyaWJ1dGVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZUh6OyAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgY29udGVudCwgYXMgc2V0IGluIG9wZW4oKQogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7Ci0gICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVByZWZlcnJlZERldmljZTsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+IG1Sb3V0aW5nRGVsZWdhdGVzOyAvLyA8bGlzdGVuZXIsIHJvdXRpbmdEZWxlZ2F0ZT4KIAogICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleAogICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKaW5kZXggMDJiZjg5MS4uNzgwNGE2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaApAQCAtMjMsMTYgKzIzLDIxIEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIC8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCiAvLyBnbG9iYWwsIGFuZCBub3QgaW4gYW5kcm9pZDo6CiBzdHJ1Y3Qgc29ja2FkZHJfaW47CkBAIC00Myw3ICs0OCw2IEBACiBjbGFzcyBQYXJjZWw7CiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CiAKLSNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQgNAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJTSVpFIDEyMDAKICNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfU0FNUExFUkFURSA0NDEwMAogCkBAIC01Niw3ICs2MCw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcjogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSA9IDA7CiB9OwogCiBjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgOiBwdWJsaWMgQUhhbmRsZXIgewpAQCAtODgsNyArOTMsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCA9IDA7CkBAIC05OCwxMiArMTAzLDEwIEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ9QVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50PURFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAogICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IgPSBOVUxMLAogICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKSA9IDA7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKQEAgLTEzOSw5ICsxNDIsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgIHZpcnR1YWwgam9iamVjdCAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKICAgICB9OwogCiAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlKCkgOiBtTGlzdGVuZXIoTlVMTCkgeyB9CkBAIC0xNzEsNyArMTc1LDYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpIHsKQEAgLTIxMSw2ICsyMTQsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgPSAwOworCiAgICAgLy8gSW52b2tlIGEgZ2VuZXJpYyBtZXRob2Qgb24gdGhlIHBsYXllciBieSB1c2luZyBvcGFxdWUgcGFyY2VscwogICAgIC8vIGZvciB0aGUgcmVxdWVzdCBhbmQgcmVwbHkuCiAgICAgLy8KQEAgLTIxOCwyNiArMjIzLDE0IEBACiAgICAgLy8gICAgICAgICAgICAgICAgZGF0YSBzZW50IGJ5IHRoZSBqYXZhIGxheWVyLgogICAgIC8vIEBwYXJhbVtvdXRdIHJlcGx5IFBhcmNlbCB0byBob2xkIHRoZSByZXBseSBkYXRhLiBDYW5ub3QgYmUgbnVsbC4KICAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgPSAwOwotCi0gICAgLy8gVGhlIENsaWVudCBpbiB0aGUgTWV0YWRhdGFQbGF5ZXJTZXJ2aWNlIGNhbGxzIHRoaXMgbWV0aG9kIG9uCi0gICAgLy8gdGhlIG5hdGl2ZSBwbGF5ZXIgdG8gcmV0cmlldmUgYWxsIG9yIGEgc3Vic2V0IG9mIG1ldGFkYXRhLgotICAgIC8vCi0gICAgLy8gQHBhcmFtIGlkcyBTb3J0ZWRMaXN0IG9mIG1ldGFkYXRhIElEIHRvIGJlIGZldGNoLiBJZiBlbXB0eSwgYWxsCi0gICAgLy8gICAgICAgICAgICB0aGUga25vd24gbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLgotICAgIC8vIEBwYXJhbVtpbm91dF0gcmVjb3JkcyBQYXJjZWwgd2hlcmUgdGhlIHBsYXllciBhcHBlbmRzIGl0cyBtZXRhZGF0YS4KLSAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogLyogcmVjb3JkcyAqLykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXBseSkgPSAwOwogCiAgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gJmxpc3RlbmVyKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTGlzdGVuZXJMb2NrKTsKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgfQogCi0gICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGFyY2VsICpvYmo9TlVMTCkgeworICAgIHZvaWQgc2VuZEV2ZW50KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxPTAsIGludCBleHQyPTAsIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaj1OVUxMKSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwpAQCAtMjU2LDExICsyNDksMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSBvdmVycmlkZSB7IH0KIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGludDY0X3QgLypzcmNJZCovLCBjb25zdCB1aW50OF90IC8qIHV1aWQgKi9bMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIC8qIGRybVNlc3Npb25JZCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCAvKnNyY0lkKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAppbmRleCAzOTA1YjU1Li4yNDMwMjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaApAQCAtMzQsOCArMzQsNyBAQAogICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCiAgICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKICAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAotICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCi0gICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA4LAogICAgIE1FRElBMl9OT1RJRllfVElNRSAgICAgICA9IDk4LAogICAgIE1FRElBMl9USU1FRF9URVhUICAgICAgICA9IDk5LAogICAgIE1FRElBMl9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKQEAgLTQzLDcgKzQyLDYgQEAKICAgICBNRURJQTJfU1VCVElUTEVfREFUQSAgICAgPSAyMDEsCiAgICAgTUVESUEyX01FVEFfREFUQSAgICAgICAgID0gMjAyLAogICAgIE1FRElBMl9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKLSAgICBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCiAvLyBHZW5lcmljIGVycm9yIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIEVycm9ycyBhcmUgZmF0YWwsIHRoZQpAQCAtOTYsMTcgKzk0LDIwIEBACiBlbnVtIG1lZGlhMl9pbmZvX3R5cGUgewogICAgIC8vIDB4eAogICAgIE1FRElBMl9JTkZPX1VOS05PV04gPSAxLAotICAgIC8vIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKLSAgICAvLyBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrCi0gICAgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhUID0gMiwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3Qgc3RhcnRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCA9IDIsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgcmVuZGVyaW5nCiAgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJUID0gMywKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IGF1ZGlvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19BVURJT19SRU5ERVJJTkdfU1RBUlQgPSA0LAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoaXMgZGF0YSBzb3VyY2UKLSAgICBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSA9IDUsCi0gICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhlIGZ1bGwgcGxheSBsaXN0Ci0gICAgTUVESUEyX0lORk9fUExBWUxJU1RfRU5EID0gNiwKKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9FTkQgPSA1LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIGFsbCBkYXRhIHNvdXJjZXMuCisgICAgLy8gQnV0IHRoaXMgaXMgbm90IHZpc2libGUgaW4gbmF0aXZlIGNvZGUuIEp1c3Qga2VlcCB0aGlzIGVudHJ5IGZvciBjb21wbGV0ZW5lc3MuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfTElTVF9FTkQgPSA2LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYW4gaXRlcmF0aW9uIG9mIHBsYXliYWNrIGxvb3AuIFRoaXMgZXZlbnQgaXMgc2VudCBvbmx5IHdoZW4KKyAgICAvLyBsb29waW5nIGlzIGVuYWJsZWQuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUID0gNywKIAogICAgIC8vMXh4CiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHByZXBhcmVkIGEgZGF0YSBzb3VyY2UuCkBAIC0xNTAsMTEgKzE1MSwxMSBAQAogCiAvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNZWRpYVBsYXllcjIuamF2YQogZW51bSBtZWRpYXBsYXllcjJfc3RhdGVzIHsKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMSwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMiwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMywKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gNCwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gNSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMTAwMSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMTAwMiwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gMTAwMywKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMTAwNCwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMTAwNSwKIH07CiAKIGVudW0gbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgewpAQCAtMTY1LDggKzE2Niw3IEBACiAgICAgTUVESUFfUExBWUVSMl9QUkVQQVJFRCAgICAgICAgICAgPSAxIDw8IDMsCiAgICAgTUVESUFfUExBWUVSMl9TVEFSVEVEICAgICAgICAgICAgPSAxIDw8IDQsCiAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgICAgICAgICAgICAgPSAxIDw8IDUsCi0gICAgTUVESUFfUExBWUVSMl9TVE9QUEVEICAgICAgICAgICAgPSAxIDw8IDYsCi0gICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSAgPSAxIDw8IDcKKyAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNgogfTsKIAogLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCmluZGV4IGQ1ODYxOTIuLjI5OTNhYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKQEAgLTIwLDExICsyMCwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKKyNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTMyLDYgKzMzLDggQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogCisjaW5jbHVkZSAiam5pLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwpAQCAtNDIsNyArNDUsOCBAQAogY2xhc3MgTWVkaWFQbGF5ZXIyTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaiA9IE5VTEwpID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMiA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcgpAQCAtNTAsNyArNTQsNyBAQAogcHVibGljOgogICAgIH5NZWRpYVBsYXllcjIoKTsKIAotICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjI+IENyZWF0ZSgpOworICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjI+IENyZWF0ZShpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KTsKICAgICBzdGF0aWMgc3RhdHVzX3QgRHVtcEFsbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwpAQCAtNjUsMTAgKzY5LDkgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwYXVzZSgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzUGxheWluZygpOwotICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRNZWRpYVBsYXllcjJTdGF0ZSgpOworICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRTdGF0ZSgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwpAQCAtODIsNjAgKzg1LDUzIEBACiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldEF1ZGlvQXR0cmlidXRlcygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKTsKIAogICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogICAgICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldFJvdXRlZERldmljZSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6Ci0gICAgTWVkaWFQbGF5ZXIyKCk7CisgICAgTWVkaWFQbGF5ZXIyKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpOwogICAgIGJvb2wgaW5pdCgpOwogCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHRlc3RlZC4KLSAgICAvLyBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGFkYXRhIHNob3VsZCBiZSBkcm9wcGVkIGFjY29yZGluZyB0bwotICAgIC8vICAgICAgICAgICAgICB0aGUgZmlsdGVycy4KLSAgICBib29sIHNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IG9mIG1ldGFkYXRhIHVwZGF0ZWQuIE5vb3AgaWYKLSAgICAvLyB0aGUgZWxlbWVudCBleGlzdHMgYWxyZWFkeS4KLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgcmVjb3JkZWQuCi0gICAgdm9pZCBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSk7Ci0KICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KICAgICB2b2lkIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOwogCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogCiAgICAgdm9pZCBjbGVhcl9sKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKICAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwogICAgIHN0YXR1c190IGdldER1cmF0aW9uX2woaW50NjRfdCAqbXNlYyk7CiAgICAgc3RhdHVzX3QgcmVzZXRfbCgpOwotICAgIHN0YXR1c190IGNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KTsKKyAgICBzdGF0dXNfdCBjaGVja1N0YXRlX2woKTsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwpAQCAtMTUyLDI3ICsxNDgsMTUgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbVNlZWtQb3NpdGlvbjsKICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSAgICAgICAgbVNlZWtNb2RlOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgICAgICBtQ29udGV4dDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKLQogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAgICBtQ29ubmVjdGVkV2luZG93OwotCi0gICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YURyb3A7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLQotICAgIC8vIE1ldGFkYXRhIHVwZGF0ZWQuIEZvciBlYWNoIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCi0gICAgLy8gbm90aWZpY2F0aW9uIHdlIHRyeSB0byB1cGRhdGUgbU1ldGFkYXRhVXBkYXRlZCB3aGljaCBpcyBhCi0gICAgLy8gc2V0OiBubyBkdXBsaWNhdGUuCi0gICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YVVwZGF0ZWQ7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCmluZGV4IGU1NTY3ZGMuLmFlN2FjNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCkBAIC0xOCwxNCArMTgsMTAgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTmF0aXZlIgogCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZURlc2MuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KQEAgLTUzLDE2OSArNDksNiBAQAogY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CiAKLS8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgotY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KLQotLy8gRklYTUU6IE1vdmUgYWxsIHRoZSBtZXRhZGF0YSByZWxhdGVkIGZ1bmN0aW9uIGluIHRoZSBNZXRhZGF0YS5jcHAKLQotLy8gVW5tYXJzaGFsbCBhIGZpbHRlciBmcm9tIGEgUGFyY2VsLgotLy8gRmlsdGVyIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgKG4pICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gIC4uLi4KLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIG4gICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBzaG91bGQgc3RhcnQgd2l0aCBhIGZpbHRlci4KLS8vIEBwYXJhbVtvdXRdIGZpbHRlciBPbiBleGl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHR5cGUgdG8gYmUKLS8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyY2VsIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZmlsdGVyLgotYm9vbCB1bm1hcnNoYWxsRmlsdGVyKGNvbnN0IFBhcmNlbCYgcCwKLSAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocC5yZWFkSW50MzIoJnZhbCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZmlsdGVyIGxlbiAlZCIsIHZhbCk7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgbnVtID0gdmFsOwotCi0gICAgZmlsdGVyLT5jbGVhcigpOwotICAgIGZpbHRlci0+c2V0Q2FwYWNpdHkobnVtKTsKLQotICAgIHNpemVfdCBzaXplID0gbnVtICogc2l6ZW9mKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSk7Ci0KLQotICAgIGlmIChwLmRhdGFBdmFpbCgpIDwgc2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSAqZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSo+KHAucmVhZElucGxhY2Uoc2l6ZSkpOwotCi0gICAgaWYgKE5VTEwgPT0gZGF0YSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIGhhZCBubyBkYXRhIik7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGUgc3RsIGltcGwgb2YgdmVjdG9yIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGhlcmUKLSAgICAvLyBiZWNhdXNlIGl0IGRlZ2VuZXJhdGVzIGludG8gYSBtZW1jcHkgb24gcG9kIHR5cGVzLiBUcnkgdG8KLSAgICAvLyByZXBsYWNlIGxhdGVyIG9yIHVzZSBzdGw6OnNldC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0gICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKLSAgICAgICAgKytkYXRhOwotICAgIH0KLSAgICAqc3RhdHVzID0gT0s7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KLS8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCi1ib29sIGZpbmRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgZmlsdGVyLCBjb25zdCBpbnQzMl90IHZhbCkgewotICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKLSAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmaWx0ZXJbMF0gPT0gbWVkaWE6Ok1ldGFkYXRhOjprQW55KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmaWx0ZXIuaW5kZXhPZih2YWwpID49IDA7Ci19Ci0KLS8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCi0vLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCi1jb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKLQotLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCi0vLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLXZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKSB7Ci0gICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7Ci0gICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgewotICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAotICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOwotICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOwotICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgewotICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKLSAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOwotICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7Ci0gICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgfQotfQotCi1jbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKLXB1YmxpYzoKLSAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+JiBsaXN0ZW5lcikKLSAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHsgfQotCi0gICAgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KDAsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgd3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBtTGlzdGVuZXI7Ci19OwotCiBjbGFzcyBwcm94eUxpc3RlbmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyIHsKIHB1YmxpYzoKICAgICBwcm94eUxpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4gJnBsYXllcikKQEAgLTIyMyw3ICs1Niw4IEBACiAKICAgICB+cHJveHlMaXN0ZW5lcigpIHsgfTsKIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgb3ZlcnJpZGUgeworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSBvdmVycmlkZSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbVBsYXllci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChwbGF5ZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgcGxheWVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKQEAgLTI2NSwxMTQgKzk5LDExMCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogICAgIFNvcnRlZFZlY3Rvcjwgc3A8TWVkaWFQbGF5ZXIyPiA+IHBsYXllcnM7IC8vdG8gc2VyaWFsaXNlIHRoZSBtdXRleCB1bmxvY2sgJiBjbGllbnQgZGVzdHJ1Y3Rpb24uCiAKLSAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgTWVkaWFQbGF5ZXIyXG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOworICAgICAgICBlbnN1cmVJbml0X2woKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBzUGxheWVycy0+c2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHAgPSAoKnNQbGF5ZXJzKVtpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAocCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbGF5ZXJzLmFkZChwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7CisgICAgRklMRSAqZiA9IGZvcGVuKGJ1ZmZlciwgInIiKTsKKyAgICBpZiAoZikgeworICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKKyAgICAgICAgICAgIGZnZXRzKGJ1ZmZlciwgU0laRSwgZik7CisgICAgICAgICAgICBpZiAoc3Ryc3RyKGJ1ZmZlciwgIiAvc3RvcmFnZS8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9zb3VuZHMvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9kYXRhLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL21lZGlhLyIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGYpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKLSAgICAgICAgICAgIGVuc3VyZUluaXRfbCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBzUGxheWVycy0+c2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwID0gKCpzUGxheWVycylbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIGlmIChwICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcC0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CiAKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7Ci0gICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7Ci0gICAgICAgIGlmIChmKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKLSAgICAgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOwotICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9zb3VuZHMvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7Ci0gICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKLSAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGlua3RvWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU0XSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1tsZW5dID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGxpbmt0bywgIi9zdG9yYWdlLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vbWVkaWEvIikgPT0gbGlua3RvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIC0+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0cGlkKCkpOworICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKKyAgICBpZiAoZCkgeworICAgICAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7CisgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOworICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7CisgICAgICAgICAgICAgICAgaWYgKGxzdGF0KGJ1ZmZlciwgJnMpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGlua3RvWzI1Nl07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZGxpbmsoYnVmZmVyLCBsaW5rdG8sIHNpemVvZihsaW5rdG8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1Ml0gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTNdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU0XSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1tsZW5dID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgdW5leHBlY3RlZCB0eXBlIGZvciAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGxpbmt0bywgIi9zdG9yYWdlLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9zb3VuZHMvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvZGF0YS8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vbWVkaWEvIikgPT0gbGlua3RvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIC0+ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmt0byk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlZGlyKGQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIoZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KIAotICAgICAgICBnTG9vcGVyUm9zdGVyLmR1bXAoZmQsIGFyZ3MpOworICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CiAKLSAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgewotICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItLXVucmVhY2hhYmxlIikpIHsKLSAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR1bXBNZW0pIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBkdW1wTWVtb3J5QWRkcmVzc2VzKDEwMCAvKiBsaW1pdCAqLyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bnJlYWNoYWJsZU1lbW9yeSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOwotICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/Ci0gICAgICAgICAgICAvLyBUT0RPOiBlbmFibGUgR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcgaWYgaXQncyBwYXJ0IG9mIHN0YWJsZSBBUEkKLSAgICAgICAgICAgIC8vc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMDAwIC8qIGxpbWl0ICovKTsKLSAgICAgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKKyAgICBib29sIHVucmVhY2hhYmxlTWVtb3J5ID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItbSIpKSB7CisgICAgICAgICAgICBkdW1wTWVtID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItLXVucmVhY2hhYmxlIikpIHsKKyAgICAgICAgICAgIHVucmVhY2hhYmxlTWVtb3J5ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoZHVtcE1lbSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgbWVtb3J5OlxuIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBkdW1wTWVtb3J5QWRkcmVzc2VzKDEwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7CisgICAgfQorICAgIGlmICh1bnJlYWNoYWJsZU1lbW9yeSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgdW5yZWFjaGFibGUgbWVtb3J5OlxuIik7CisgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgbGltaXQgYmUgYW4gYXJndW1lbnQgcGFyYW1ldGVyPworICAgICAgICAvLyBUT0RPOiBlbmFibGUgR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcgaWYgaXQncyBwYXJ0IG9mIHN0YWJsZSBBUEkKKyAgICAgICAgLy9zdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwMDAgLyogbGltaXQgKi8pOworICAgICAgICAvL3Jlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7CisgICAgfQorCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzgwLDggKzIxMCw4IEBACiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIC8vc3RhdGljCi1zcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKCkgewotICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbmV3IE1lZGlhUGxheWVyMigpOworc3A8TWVkaWFQbGF5ZXIyPiBNZWRpYVBsYXllcjI6OkNyZWF0ZShpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KSB7CisgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKHNlc3Npb25JZCwgY29udGV4dCk7CiAKICAgICBpZiAoIXBsYXllci0+aW5pdCgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzk4LDQ0ICsyMjgsMzQgQEAKICAgICByZXR1cm4gZHVtcFBsYXllcnMoZmQsIGFyZ3MpOwogfQogCi1NZWRpYVBsYXllcjI6Ok1lZGlhUGxheWVyMigpIHsKK01lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKICAgICBtU3JjSWQgPSAwOwogICAgIG1Mb2NrVGhyZWFkSWQgPSAwOwogICAgIG1MaXN0ZW5lciA9IE5VTEw7CiAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CisgICAgbUNvbnRleHQgPSBuZXcgSk9iamVjdEhvbGRlcihjb250ZXh0KTsKICAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7CiAgICAgbUN1cnJlbnRTZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CiAgICAgbVNlZWtQb3NpdGlvbiA9IC0xOwogICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CiAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfSURMRTsKICAgICBtTG9vcCA9IGZhbHNlOwotICAgIG1MZWZ0Vm9sdW1lID0gbVJpZ2h0Vm9sdW1lID0gMS4wOworICAgIG1Wb2x1bWUgPSAxLjA7CiAgICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOwotICAgIG1BdWRpb1Nlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VuZExldmVsID0gMDsKIAotICAgIC8vIFRPRE86IGdldCBwaWQgYW5kIHVpZCBmcm9tIEpBVkEKLSAgICBtUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIG1VaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgbVBpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKKyAgICBtVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOwogCi0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CisgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KHNlc3Npb25JZCwgbVVpZCwgbVBpZCwgTlVMTCAvKmF0dHJpYnV0ZXMqLyk7CiB9CiAKIE1lZGlhUGxheWVyMjo6fk1lZGlhUGxheWVyMigpIHsKICAgICBBTE9HVigiZGVzdHJ1Y3RvciIpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOwotICAgIH0KLSAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICByZW1vdmVQbGF5ZXIodGhpcyk7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgIH0KIH0KIAogYm9vbCBNZWRpYVBsYXllcjI6OmluaXQoKSB7CkBAIC00OTMsMTkgKzMxMywyOCBAQAogICAgIGlmIChkc2QgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICAvLyBNaWNyb3NlY29uZCBpcyB1c2VkIGluIE51UGxheWVyMi4KKyAgICBpZiAoZHNkLT5tU3RhcnRQb3NpdGlvbk1zID4gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXMpIHsKKyAgICAgICAgZHNkLT5tU3RhcnRQb3NpdGlvbk1zID0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXM7CisgICAgICAgIEFMT0dXKCJzZXREYXRhU291cmNlLCBzdGFydCBwb2lzdGlvbiBjbGFtcGVkIHRvICVsbGQgbXMiLCAobG9uZyBsb25nKWRzZC0+bVN0YXJ0UG9zaXRpb25Ncyk7CisgICAgfQorICAgIGlmIChkc2QtPm1FbmRQb3NpdGlvbk1zID4gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXMpIHsKKyAgICAgICAgZHNkLT5tRW5kUG9zaXRpb25NcyA9IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zOworICAgICAgICBBTE9HVygic2V0RGF0YVNvdXJjZSwgZW5kIHBvaXN0aW9uIGNsYW1wZWQgdG8gJWxsZCBtcyIsIChsb25nIGxvbmcpZHNkLT5tU3RhcnRQb3NpdGlvbk1zKTsKKyAgICB9CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgdHlwZSglZCksIHNyY0lkKCVsbGQpIiwgZHNkLT5tVHlwZSwgKGxvbmcgbG9uZylkc2QtPm1JZCk7CiAKICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG9sZFBsYXllcjsKIAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBpZiAoISgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkKICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSkgewogICAgICAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCk7CisgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyID0gbmV3IE51UGxheWVyMkRyaXZlcihtUGlkLCBtVWlkLCBtQ29udGV4dCk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHBsYXllci0+aW5pdENoZWNrKCk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXllciBvYmplY3QsIGluaXRDaGVjayBmYWlsZWQoJWQpIiwgZXJyKTsKQEAgLTUxNSw4ICszNDQsNiBAQAogICAgICAgICBjbGVhcl9sKCk7CiAKICAgICAgICAgcGxheWVyLT5zZXRMaXN0ZW5lcihuZXcgcHJveHlMaXN0ZW5lcih0aGlzKSk7Ci0gICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHBsYXllcikpOwogICAgICAgICBwbGF5ZXItPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogCiAgICAgICAgIGVyciA9IHBsYXllci0+c2V0RGF0YVNvdXJjZShkc2QpOwpAQCAtNTY1LDc5ICszOTIsMTggQEAKICAgICByZXR1cm4gbVBsYXllci0+cGxheU5leHREYXRhU291cmNlKHNyY0lkKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXBseSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgY29uc3QgYm9vbCBoYXNCZWVuSW5pdGlhbGl6ZWQgPQogICAgICAgICAgICAgKG1DdXJyZW50U3RhdGUgIT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikgJiYKICAgICAgICAgICAgICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkgIT0gTUVESUFfUExBWUVSMl9JRExFKTsKICAgICBpZiAoKG1QbGF5ZXIgPT0gTlVMTCkgfHwgIWhhc0JlZW5Jbml0aWFsaXplZCkgewotICAgICAgICBBTE9HRSgiaW52b2tlIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIEFMT0dFKCJpbnZva2UoKSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKICAgICByZXR1cm4gbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKIH0KIAotLy8gVGhpcyBjYWxsIGRvZXNuJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBwbGF5ZXIuCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKSB7Ci0gICAgQUxPR0QoInNldE1ldGFkYXRhRmlsdGVyIik7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgYWxsb3csIGRyb3A7Ci0KLSAgICBpZiAodW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZhbGxvdywgJnN0YXR1cykgJiYKLSAgICAgICAgdW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZkcm9wLCAmc3RhdHVzKSkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICAgICAgbU1ldGFkYXRhQWxsb3cgPSBhbGxvdzsKLSAgICAgICAgbU1ldGFkYXRhRHJvcCA9IGRyb3A7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKiBhcHBseV9maWx0ZXIgKi8sIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRCgiZ2V0TWV0YWRhdGEiKTsKLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllcjsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBpZHM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHsKLSAgICAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBQbGFjZWhvbGRlciBmb3IgdGhlIHJldHVybiBjb2RlLCB1cGRhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKC0xKTsKLQotICAgICAgICAvLyBXZSBkb24ndCBibG9jayBub3RpZmljYXRpb25zIHdoaWxlIHdlIGZldGNoIHRoZSBkYXRhLiBXZSBjbGVhcgotICAgICAgICAvLyBtTWV0YWRhdGFVcGRhdGVkIGZpcnN0IHNvIHdlIGRvbid0IGxvc2Ugbm90aWZpY2F0aW9ucyBoYXBwZW5pbmcKLSAgICAgICAgLy8gZHVyaW5nIHRoZSByZXN0IG9mIHRoaXMgY2FsbC4KLSAgICAgICAgaWYgKHVwZGF0ZV9vbmx5KSB7Ci0gICAgICAgICAgICBpZHMgPSBtTWV0YWRhdGFVcGRhdGVkOwotICAgICAgICB9Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtZWRpYTo6TWV0YWRhdGEgbWV0YWRhdGEocmVwbHkpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kSGVhZGVyKCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGxheWVyLT5nZXRNZXRhZGF0YShpZHMsIHJlcGx5KTsKLQotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbWV0YWRhdGEucmVzZXRQYXJjZWwoKTsKLSAgICAgICAgQUxPR0UoImdldE1ldGFkYXRhIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IGVtZW50IGZpbHRlcmluZyBvbiB0aGUgcmVzdWx0LiBOb3QgY3JpdGljYWwgc2luY2UKLSAgICAvLyBmaWx0ZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHVwZGF0ZSBub3RpZmljYXRpb25zIGFscmVhZHkuIFRoaXMKLSAgICAvLyB3b3VsZCBiZSB3aGVuIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGZldGNoIGFuZCBhIGZpbHRlciBpcyBzZXQuCi0KLSAgICAvLyBFdmVyeXRoaW5nIGlzIGZpbmUsIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLgotICAgIG1ldGFkYXRhLnVwZGF0ZUxlbmd0aCgpOwotICAgIHJldHVybiBPSzsKLX0KLQogdm9pZCBNZWRpYVBsYXllcjI6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMICYmIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCkBAIC03MjcsMjIgKzQ5Myw5IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7Ci0KLSAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCi0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOwotCi0gICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTc1MCwxNCArNTAzLDEyIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVBc3luYygpIHsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpKSB7Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKCptQXVkaW9BdHRyaWJ1dGVzUGFyY2VsKTsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEKSkgeworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChtQXVkaW9BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJJTkc7CiAgICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTc4MSw3ICs1MzIsNyBAQAogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKIAogICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobVZvbHVtZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKQEAgLTgwNiwzMCArNTU3LDEyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkgcmV0dXJuIE5PX0VSUk9SOwotICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwKLSAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICkgKSApIHsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RvcCgpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUT1BQRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgQUxPR0UoInN0b3AgY2FsbGVkIGluIHN0YXRlICVkLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEfE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKQogICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSkgeworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1NUQVJURUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKICAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7CkBAIC04NjAsNyArNTkzLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLW1lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRNZWRpYVBsYXllcjJTdGF0ZSgpIHsKK21lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRTdGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX0VSUk9SOwpAQCAtODczLDggKzYwNiw3IEBACiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HOwogICAgIH0KLSAgICBpZiAobUN1cnJlbnRTdGF0ZQotICAgICAgICAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BBVVNFRDsKICAgICB9CiAgICAgLy8gbm93IG9ubHkgbUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgaXMgdHJ1ZQpAQCAtODkwLDcgKzYyMiw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpIHsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTk3OCwxMSArNzEwLDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3Qgc3JjSWQsIGludDY0X3QgKm1zZWMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIFRPRE86IGNhY2hlIGR1cmF0aW9uIGZvciBjdXJyZW50U3JjSWQgYW5kIG5leHRTcmNJZCwgYW5kIHJldHVybiBjb3JyZWN0CisgICAgLy8gdmFsdWUgZm9yIG5leHRTcmNJZC4KKyAgICBpZiAoc3JjSWQgIT0gbVNyY0lkKSB7CisgICAgICAgICptc2VjID0gLTE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwogICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgewogICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKICAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKQEAgLTExMzgsMTggKzg3NywxNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKQEAgLTExNTksMTcgKzg5NywxOCBAQAogICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwgJiYgc2Vzc2lvbklkICE9IG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCkpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKQEAgLTExOTYsNjcgKzkzNSwzNyBAQAogfQogCiAvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkgewotICAgIHN3aXRjaChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgewotICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKLSAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKLSAgICAgICAgYnJlYWs7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVfbCgpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgIGlmIChjaGVja1N0YXRlX2woKSAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBzd2l0Y2ggKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwotICAgIH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CisgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woYXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAoram9iamVjdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcygpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMID8gbUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogTlVMTDsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGtleSA9PSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTKSB7Ci0gICAgICAgIGlmIChyZXBseSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcGx5LT5hcHBlbmRGcm9tKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwsIDAsIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmRhdGFTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI2OSw0NCArOTc4LDI2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotYm9vbCBNZWRpYVBsYXllcjI6OnNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgY29kZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChmaW5kTWV0YWRhdGEobU1ldGFkYXRhRHJvcCwgY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisvLyBmb3IgbWVkaWFtZXRyaWNzCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpIHsKKyAgICBBTE9HRCgiTWVkaWFQbGF5ZXIyOjpnZXRNZXRyaWNzKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImdldE1ldHJpY3M6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmIChtTWV0YWRhdGFBbGxvdy5pc0VtcHR5KCkgfHwgZmluZE1ldGFkYXRhKG1NZXRhZGF0YUFsbG93LCBjb2RlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gIG1QbGF5ZXItPmdldE1ldHJpY3MoYnVmZmVyLCBsZW5ndGgpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoImdldE1ldHJpY3MgcmV0dXJucyAlZCIsIHN0YXR1cyk7CiAgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQotdm9pZCBNZWRpYVBsYXllcjI6OmFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtTWV0YWRhdGFVcGRhdGVkLmluZGV4T2YobWV0YWRhdGFfdHlwZSkgPCAwKSB7Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuYWRkKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Cit2b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSB7CiAgICAgQUxPR1YoIm1lc3NhZ2UgcmVjZWl2ZWQgc3JjSWQ9JWxsZCwgbXNnPSVkLCBleHQxPSVkLCBleHQyPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBtc2csIGV4dDEsIGV4dDIpOwogCi0gICAgaWYgKE1FRElBMl9JTkZPID09IG1zZyAmJiBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUgPT0gZXh0MSkgewotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSA9IGV4dDI7Ci0KLSAgICAgICAgaWYoc2hvdWxkRHJvcE1ldGFkYXRhKG1ldGFkYXRhX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdGhhdCBoYXZlIGNoYW5nZWQuIGdldE1ldGFkYXRhCi0gICAgICAgIC8vIGFsc28gYWNjZXNzIG1NZXRhZGF0YVVwZGF0ZWQgYW5kIGNsZWFycyBpdC4KLSAgICAgICAgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotCiAgICAgYm9vbCBzZW5kID0gdHJ1ZTsKICAgICBib29sIGxvY2tlZCA9IGZhbHNlOwogCkBAIC0xNDE4LDcgKzExMDksOCBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicHJlcGFyZURybTogdXVpZDogJXAgIGRybVNlc3Npb25JZDogJXAoJXp1KSIsIHV1aWQsCiAgICAgICAgICAgICBkcm1TZXNzaW9uSWQuYXJyYXkoKSwgZHJtU2Vzc2lvbklkLnNpemUoKSk7CkBAIC0xNDMyLDggKzExMjQsMTAgQEAKICAgICAvLyBjb21wbGV0ZWQpIHNvIHRoZSBzdGF0ZSBjaGFuZ2UgdG8gInByZXBhcmVkIiBtaWdodCBub3QgaGF2ZSBoYXBwZW5lZCB5ZXQgKGUuZy4sIGJ1ZmZlcmluZykuCiAgICAgLy8gU3RpbGwsIHdlIGNhbiBhbGxvdyBwcmVwYXJlRHJtIGZvciB0aGUgdXNlIGNhc2Ugb2YgYmVpbmcgY2FsbGVkIGluIE9uRHJtSW5mb0xpc3RlbmVyLgogICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJJTkcgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gaXMgY2FsbGVkIGluIHRoZSB3cm9uZyBzdGF0ZSAoJWQpLiIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIEFMT0dXKCJwcmVwYXJlRHJtKCVsbGQpIGNhbGxlZCBpbiBub24tcHJlcGFyZSBzdGF0ZSglZCkiLCAobG9uZyBsb25nKXNyY0lkLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGRybVNlc3Npb25JZC5pc0VtcHR5KCkpIHsKQEAgLTE0NDIsNyArMTEzNiw3IEBACiAgICAgfQogCiAgICAgLy8gUGFzc2luZyBkb3duIHRvIG1lZGlhc2VydmVyIG1haW5seSBmb3IgY3JlYXRpbmcgdGhlIGNyeXB0bwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnByZXBhcmVEcm0odXVpZCwgZHJtU2Vzc2lvbklkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHNyY0lkLCB1dWlkLCBkcm1TZXNzaW9uSWQpOwogICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywgInByZXBhcmVEcm06IEZhaWxlZCBhdCBtZWRpYXNlcnZlciB3aXRoIHJldDogJWQiLCBzdGF0dXMpOwogCiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKQEAgLTE0NTEsNyArMTE0NSw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDY2LDcgKzExNjAsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oc3JjSWQpOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoInJlbGVhc2VEcm06IG1lZGlhc2VydmVyOjpyZWxlYXNlRHJtIHJldDogJWQiLCBzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTE0NzksMzYgKzExNzMsNDAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgQUxPR1YoInNldFByZWZlcnJlZERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKIH0KIAotYXVkaW9fcG9ydF9oYW5kbGVfdCBNZWRpYVBsYXllcjI6OmdldFJvdXRlZERldmljZUlkKCkgeworam9iamVjdCBNZWRpYVBsYXllcjI6OmdldFJvdXRlZERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQ6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VJZDsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2UoKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb091dHB1dC0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhsaXN0ZW5lcik7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAppbmRleCA5YjNhYWQyLi4wZjY5YjJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsNyBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogCiAgICAgc3JjczogWworICAgICAgICAiSk1lZGlhUGxheWVyMlV0aWxzLmNwcCIsCiAgICAgICAgICJKV2FrZUxvY2suY3BwIiwKICAgICAgICAgIkdlbmVyaWNTb3VyY2UyLmNwcCIsCiAgICAgICAgICJIVFRQTGl2ZVNvdXJjZTIuY3BwIiwKQEAgLTI4LDYgKzI5LDggQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC00OCwxMyArNTEsMTYgQEAKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAppbmRleCAxOTZiMTAzLi45NTUyNTgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcApAQCAtMjEsMzAgKzIxLDE5IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyRHJtLmgiCiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw4ICs3OCw2IEBACiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlc2V0RGF0YVNvdXJjZSgpIHsKICAgICBBTE9HVigicmVzZXREYXRhU291cmNlIik7CiAKLSAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKLSAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwogICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKICAgICBtVXJpLmNsZWFyKCk7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKQEAgLTExMCw3ICs5Nyw2IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMTgsNyArMTA0LDYgQEAKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogCi0gICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CiAgICAgbVVyaSA9IHVybDsKIAogICAgIGlmIChoZWFkZXJzKSB7CkBAIC0xNTEsNyArMTM2LDcgQEAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBzb3VyY2UuZ2V0KCkpOwogCiAgICAgcmVzZXREYXRhU291cmNlKCk7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKHNvdXJjZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjIsMjQgKzE0NywyMSBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjppbml0RnJvbURhdGFTb3VyY2UoKSB7CiAgICAgbUV4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCB8fCBtRmQgIT0gLTEpOwotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICBDSEVDSyhtRmQgPj0wIHx8IG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKTsKKyAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gYVNvdXJjZVdyYXBwZXIgPSBtRGF0YVNvdXJjZVdyYXBwZXI7CiAgICAgY29uc3QgaW50IGZkID0gbUZkOwotICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKLSAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoZGF0YVNvdXJjZSk7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgIGlmIChhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoYVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBzZXQgZXh0cmFjdG9yIGRhdGEgc291cmNlISIpOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTE5MSwxMCArMTczLDggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUxvY2subG9jaygpOwotICAgIG1GZCA9IC0xOwotICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICBtRmlsZU1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKSk7CisgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CkBAIC0yMTUsMTAgKzE5NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gdHJhY2tFeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgICAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICAgICAgaWYgKGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0zMzAsMTkgKzMxMCwxOSBAQAogICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtRGF0YVNvdXJjZS0+Y2xvc2UoKTsKKyAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLT5jbG9zZSgpOwogICAgIH0KICAgICByZXNldERhdGFTb3VyY2UoKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7Cit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jOiAobG9vcGVyOiAlZCkiLCAobUxvb3BlciAhPSBOVUxMKSk7CiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLwogICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKQEAgLTM1MSw1OSArMzMxLDQ1IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBzdGFydFRpbWVVcyk7CisKICAgICBtc2ctPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1EYXRhU291cmNlOiAlZCIsIChtRGF0YVNvdXJjZSAhPSBOVUxMKSk7Cit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKKyAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1GZCAlZCBtVXJpICVzIG1EYXRhU291cmNlV3JhcHBlcjogJXAiLAorICAgICAgICAgICAgbUZkLCBtVXJpLmNfc3RyKCksIG1EYXRhU291cmNlV3JhcHBlci5nZXQoKSk7CiAKLSAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCi0gICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGZpcnN0LCBpZiB0aGUgZXh0cmFjdG9yCi0gICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgotICAgICAgICBtSXNTZWN1cmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOwotICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKLSAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgY29ubmVjdGlvbiBoYXMgc29tZSBpc3N1ZS4KLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoIW1VcmkuZW1wdHkoKSkgeworICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7CisgICAgICAgIHNpemVfdCBudW1oZWFkZXJzID0gbVVyaUhlYWRlcnMuc2l6ZSgpOworICAgICAgICBjb25zdCBjaGFyICoqa2V5X3ZhbHVlcyA9IG51bWhlYWRlcnMgPyBuZXcgY29uc3QgY2hhciAqW251bWhlYWRlcnMgKiAyXSA6IE5VTEw7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgICAgICBrZXlfdmFsdWVzW2kgKiAyXSA9IG1VcmlIZWFkZXJzLmtleUF0KGkpLmNfc3RyKCk7CisgICAgICAgICAgICBrZXlfdmFsdWVzW2kgKiAyICsgMV0gPSAgbVVyaUhlYWRlcnMudmFsdWVBdChpKS5jX3N0cigpOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GZCA9PSAtMSAmJiBtRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKLSAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSAqYVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKHVyaSwgbnVtaGVhZGVycywga2V5X3ZhbHVlcyk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gYVNvdXJjZSA/IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihhU291cmNlKSA6IE5VTEw7CisgICAgICAgIGRlbGV0ZVtdIGtleV92YWx1ZXM7CisgICAgICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAorICAgICAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KKyAgICAgICAgbUlzU3RyZWFtaW5nID0gIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KTsKICAgICB9CiAKLSAgICBpZiAobURhdGFTb3VyY2UgIT0gbnVsbHB0ciAmJiBtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgIGlmIChtRGlzY29ubmVjdGVkIHx8IChtRmQgPCAwICYmIG1EYXRhU291cmNlV3JhcHBlciA9PSBOVUxMKSkgeworICAgICAgICBBTE9HRSgibURpc2Nvbm5lY3RlZCglZCkgb3IgRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiLCBtRGlzY29ubmVjdGVkKTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gRm9yIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgZW5vdWdoCi0gICAgLy8gYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCi0gICAgbUlzU3RyZWFtaW5nID0gKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCk7Ci0KICAgICAvLyBpbml0IGV4dHJhY3RvciBmcm9tIGRhdGEgc291cmNlCiAgICAgc3RhdHVzX3QgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CkBAIC00MzAsNiArMzk2LDcgQEAKICAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKIAorICAgIGRvU2VlayhzdGFydFRpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVCk7CiAgICAgZmluaXNoUHJlcGFyZUFzeW5jKCk7CiAKICAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IERvbmUiKTsKQEAgLTQzOSw4ICs0MDYsOCBAQAogICAgIEFMT0dWKCJmaW5pc2hQcmVwYXJlQXN5bmMiKTsKIAogICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKLSAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwogICAgICAgICBtUHJlcGFyaW5nID0gdHJ1ZTsKKyAgICAgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CiAgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CkBAIC00NTcsOSArNDI0LDcgQEAKIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKSB7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOwotICAgICAgICBtQ2FjaGVkU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci5jbGVhcigpOwogCiAgICAgICAgIG1CaXRyYXRlID0gLTE7CiAgICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwpAQCAtNDk5LDUzICs0NjQsMjcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkaXNjb25uZWN0KCkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UsIGh0dHBTb3VyY2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7Ci0gICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKICAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7CiAgICAgfQotCi0gICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCi0gICAgICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihkYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChodHRwU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oaHR0cFNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLT5jbG9zZSgpOwogICAgIH0KLQotICAgIG1EYXRhU291cmNlV3JhcHBlciA9IE5VTEw7Ci0KIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbmRDYWNoZVN0YXRzKCkgewotICAgIGludDMyX3Qga2JwcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgogICAgICAgewotICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmc3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICBvblByZXBhcmVBc3luYyhzdGFydFRpbWVVcyk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CkBAIC04MzUsOCArNzc0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyCiAgICAgICAgICAgICAgICAgJiYgIW1TZW50UGF1c2VPbkJ1ZmZlcmluZyAmJiAhbVByZXBhcmluZykgewotICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CkBAIC0xMzQ5LDYgKzEyODYsMTEgQEAKICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKICAgICAgICAgfQogCisgICAgICAgIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IGNyeXB0SW5mbyA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlQ3J5cHRvSW5mbygpOworICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldE9iamVjdCgiY3J5cHRJbmZvIiwgY3J5cHRJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIHF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKHNlZWtpbmcsIGZvcm1hdENoYW5nZSwgdHJhY2tUeXBlLCB0cmFjayk7CiAKICAgICAgICAgaWYgKG51bUJ1ZmZlcnMgPT0gMCAmJiBhY3R1YWxUaW1lVXMgIT0gbnVsbHB0cikgewpAQCAtMTM5Miw3ICsxMzM0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlcGFyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CkBAIC0xNDQ0LDQ3ICsxMzg1LDMxIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKLSAgICAvLyBFbnF1aXJlcyBidWZmZXJpbmcgc3RhdHVzIGV2ZXJ5IHNlY29uZC4KLSAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKKyAgICBpZiAobUlzU3RyZWFtaW5nKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CisgICAgICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgorICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25Qb2xsQnVmZmVyaW5nKCkgewotICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSAtMWxsOwotICAgIHNzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOwogCi0gICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlID0gMGxsOwotICAgICAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIC8vIHxiaXRyYXRlfCB1c2VzIGJpdHMvc2Vjb25kIHVuaXQsIHdoaWxlIHNpemUgaXMgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMGxsIC8gbUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvcjsKKyAgICBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGV4dHJhY3RvciA9IG1WaWRlb1RyYWNrLm1FeHRyYWN0b3I7CisgICAgfSBlbHNlIGlmIChtQXVkaW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZXh0cmFjdG9yID0gbUF1ZGlvVHJhY2subUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogRU9TIChmaW5hbFN0YXR1cyA9ICVkKSIsIGZpbmFsU3RhdHVzKTsKLQotICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47CisgICAgaWYgKGV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENhY2hlZER1cmF0aW9uKCk7CiAgICAgfQogCiAgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPj0gMGxsKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDBsbCkgeworICAgICAgICBzc2l6ZV90IHNhbXBsZVNpemUgPSBleHRyYWN0b3ItPmdldFNhbXBsZVNpemUoKTsKKyAgICAgICAgaWYgKHNhbXBsZVNpemUgPj0gMGxsKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZFBvc1VzID0gZ2V0TGFzdFJlYWRQb3NpdGlvbigpICsgY2FjaGVkRHVyYXRpb25VczsKICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWRQb3NVcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKQEAgLTE0OTIsOSArMTQxNywxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUocGVyY2VudGFnZSk7CisgICAgICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CisgICAgICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MiKTsKICAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZER1cmF0aW9uVXMgJS4xZiBzZWMiLCBjYWNoZWREdXJhdGlvblVzIC8gMTAwMDAwMC4wZik7CiAgICAgfQogCiAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CkBAIC0xNTkxLDE1ICsxNTE4LDIwIEBACiAgICAgICAgIHJldHVybiBPSzsgLy8gc291cmNlIHdpdGhvdXQgRFJNIGluZm8KICAgICB9CiAKLSAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmZmVyID0gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8ocHNzaEluZm8pOwotICAgIEFMT0dWKCJjaGVja0RybUluZm86IE1FRElBX0RSTV9JTkZPIFBTU0ggZHJtIGluZm8gc2l6ZTogJWQiLCAoaW50KWRybUluZm9CdWZmZXItPnNpemUoKSk7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CisgICAgc3RhdHVzX3QgcmV0ID0gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8ocHNzaEluZm8sICZwbGF5ZXJNc2cpOworICAgIEFMT0dWKCJjaGVja0RybUluZm86IE1FRElBX0RSTV9JTkZPIFBTU0ggZHJtIGluZm8gc2l6ZTogJWQiLCAoaW50KXBsYXllck1zZy5CeXRlU2l6ZSgpKTsKIAotICAgIGlmIChkcm1JbmZvQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiY2hlY2tEcm1JbmZvOiBVbmV4cGVjdGVkIHBhcmNlbCBzaXplOiAwIik7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiY2hlY2tEcm1JbmZvOiBmYWlsZWQgdG8gcmV0cml2ZSBEcm1JbmZvICVkIiwgcmV0KTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbm90aWZ5RHJtSW5mbyhkcm1JbmZvQnVmZmVyKTsKKyAgICBpbnQgc2l6ZSA9IHBsYXllck1zZy5CeXRlU2l6ZSgpOworICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBwbGF5ZXJNc2cuU2VyaWFsaXplVG9BcnJheShkcm1JbmZvQnVmLT5kYXRhKCksIHNpemUpOworICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIHNpemUpOworICAgIG5vdGlmeURybUluZm8oZHJtSW5mb0J1Zik7CiAKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKaW5kZXggOWJjNTE4Mi4uYWRlMWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaApAQCAtMzcsMTEgKzM3LDkgQEAKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBJRGF0YVNvdXJjZTsKIGNsYXNzIElNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IE1lZGlhU291cmNlOwogY2xhc3MgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKLXN0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CiAKIHN0cnVjdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyIDogcHVibGljIE51UGxheWVyMjo6U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciAvLyBNb2R1bGFyIERSTQpAQCAtNTAsNyArNDgsNiBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTYyLDcgKzU5LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKQEAgLTE1MSw3ICsxNDgsNiBAQAogICAgIGJvb2wgbUlzU3RyZWFtaW5nOwogICAgIHVpZF90IG1VSUQ7CiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7Ci0gICAgc3A8TWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIEFTdHJpbmcgbVVyaTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKICAgICBpbnQgbUZkOwpAQCAtMTU5LDkgKzE1NSw2IEBACiAgICAgaW50NjRfdCBtTGVuZ3RoOwogCiAgICAgYm9vbCBtRGlzY29ubmVjdGVkOwotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKLSAgICBzcDxEYXRhU291cmNlPiBtSHR0cFNvdXJjZTsKICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOwogICAgIHNwPEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyPiBtRGF0YVNvdXJjZVdyYXBwZXI7CiAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gbUV4dHJhY3RvcjsKQEAgLTE5NCw3ICsxODcsNyBAQAogICAgIHZvaWQgb25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKICAgICBzdGF0dXNfdCBkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKIAotICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoKTsKKyAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogCiAgICAgdm9pZCBmZXRjaFRleHREYXRhKAogICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLApAQCAtMjMyLDggKzIyNSw2IEBACiAgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKICAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpOwogCi0gICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOwotCiAgICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdF9sKGJvb2wgYXVkaW8pOwogICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbyk7CiAgICAgaW50MzJfdCBnZXREYXRhR2VuZXJhdGlvbihtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCmluZGV4IDhlZGJjYmYuLmU1MzkwMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKQEAgLTk5LDEwICs5OSwxMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgeworLy8gVE9ETzogZmV0Y2ggZGF0YSBzdGFydGluZyBmcm9tIHxzdGFydFRpbWVVc3wKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IC8qIHN0YXJ0VGltZVVzICovKSB7CiAgICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlMiIpOwogICAgICAgICBtTGl2ZUxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjYW5DYWxsSmF2YSAqLyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCmluZGV4IDk3ZDM2NTMuLjhmYzcxZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTcwM2RlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSk1lZGlhUGxheWVyMlV0aWxzIgorCisjaW5jbHVkZSAiSk1lZGlhUGxheWVyMlV0aWxzLmgiCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZE1pbkR1cmF0aW9uU2VjID0gNjA7CisKKy8vIHN0YXRpYworYm9vbCBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLCBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgaWYgKGhhc1ZpZGVvIHx8IHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGluZm8uZHVyYXRpb25fdXMgPCBrT2ZmbG9hZE1pbkR1cmF0aW9uU2VjICogMTAwMDAwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBhdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0RnJvbU5hdGl2ZShpbmZvLmZvcm1hdCk7CisgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IG91dENoYW5uZWxNYXNrRnJvbU5hdGl2ZShpbmZvLmNoYW5uZWxfbWFzayk7CisgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEVOQ09ESU5HX0lOVkFMSUQgfHwgY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpNUDJVdGlsc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMlV0aWxzIik7CisgICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCAiaXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkIiwgIihJSUkpWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCisgICAgICAgICAgICBqTVAyVXRpbHNDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIGF1ZGlvRm9ybWF0LCBpbmZvLnNhbXBsZV9yYXRlLCBjaGFubmVsTWFzayk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmQ0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworI2RlZmluZSBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9tZWRpYV9BdWRpb0Zvcm1hdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWFQbGF5ZXIyVXRpbHMgeworICAgIHN0YXRpYyBib29sIGlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcAppbmRleCBjOWExMDcxLi45ODNkNzdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCkBAIC0yMCw1NSArMjAsNTAgQEAKIAogI2luY2x1ZGUgIkpXYWtlTG9jay5oIgogCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy9UT0RPOiB1c2UgSkFWQSBQb3dlck1hbmFnZXIsIGluc3RlYWQgb2YgYmluZGVyCi1KV2FrZUxvY2s6OkpXYWtlTG9jaygpIDoKLSAgICBtUG93ZXJNYW5hZ2VyKE5VTEwpLAotICAgIG1XYWtlTG9ja1Rva2VuKE5VTEwpLAorSldha2VMb2NrOjpKV2FrZUxvY2soY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpIDoKICAgICBtV2FrZUxvY2tDb3VudCgwKSwKLSAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9CisgICAgbVdha2VMb2NrKE5VTEwpLAorICAgIG1Db250ZXh0KGNvbnRleHQpIHt9CiAKIEpXYWtlTG9jazo6fkpXYWtlTG9jaygpIHsKLSAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwotICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICB9Ci0gICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKKyAgICBjbGVhckphdmFXYWtlTG9jaygpOwogfQogCiBib29sIEpXYWtlTG9jazo6YWNxdWlyZSgpIHsKICAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKLSAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7Ci0gICAgICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVdha2VMb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyBqQ29udGV4dENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2NvbnRlbnQvQ29udGV4dCIpOworICAgICAgICAgICAgamNsYXNzIGpQb3dlck1hbmFnZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIiKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpHZXRTeXN0ZW1TZXJ2aWNlID0gZW52LT5HZXRNZXRob2RJRChqQ29udGV4dENscywKKyAgICAgICAgICAgICAgICAgICAgImdldFN5c3RlbVNlcnZpY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgICAgIGpvYmplY3QgamF2YVBvd2VyTWFuYWdlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQ29udGV4dC0+Z2V0Sk9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBqR2V0U3lzdGVtU2VydmljZSwgZW52LT5OZXdTdHJpbmdVVEYoInBvd2VyIikpOworCisgICAgICAgICAgICBqZmllbGRJRCBqUEFSVElBTF9XQUtFX0xPQ0sgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQoalBvd2VyTWFuYWdlckNscywKKyAgICAgICAgICAgICAgICAgICAgIlBBUlRJQUxfV0FLRV9MT0NLIiwgIkkiKTsKKyAgICAgICAgICAgIGppbnQgUEFSVElBTF9XQUtFX0xPQ0sgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpQb3dlck1hbmFnZXJDbHMsIGpQQVJUSUFMX1dBS0VfTE9DSyk7CisKKyAgICAgICAgICAgIGptZXRob2RJRCBqTmV3V2FrZUxvY2sgPSBlbnYtPkdldE1ldGhvZElEKGpQb3dlck1hbmFnZXJDbHMsCisgICAgICAgICAgICAgICAgICAgICJuZXdXYWtlTG9jayIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2s7Iik7CisgICAgICAgICAgICBqb2JqZWN0IGphdmFXYWtlTG9jayA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqYXZhUG93ZXJNYW5hZ2VyT2JqLAorICAgICAgICAgICAgICAgICAgICBqTmV3V2FrZUxvY2ssIFBBUlRJQUxfV0FLRV9MT0NLLCBlbnYtPk5ld1N0cmluZ1VURigiSldha2VMb2NrIikpOworICAgICAgICAgICAgbVdha2VMb2NrID0gbmV3IEpPYmplY3RIb2xkZXIoamF2YVdha2VMb2NrKTsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamF2YVBvd2VyTWFuYWdlck9iaik7CisgICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGphdmFXYWtlTG9jayk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKAotICAgICAgICAgICAgICAgICAgICBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgIGJpbmRlciwgU3RyaW5nMTYoIkpXYWtlTG9jayIpLCBTdHJpbmcxNigibWVkaWEiKSk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyB3YWtlTG9ja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jayIpOworICAgICAgICAgICAgam1ldGhvZElEIGpBY3F1aXJlID0gZW52LT5HZXRNZXRob2RJRCh3YWtlTG9ja0NscywgImFjcXVpcmUiLCAiKClWIik7CisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1XYWtlTG9jay0+Z2V0Sk9iamVjdCgpLCBqQWNxdWlyZSk7CisgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwpAQCAtODYsMjUgKzgxLDE3IEBACiAgICAgICAgIG1XYWtlTG9ja0NvdW50ID0gMTsKICAgICB9CiAgICAgaWYgKC0tbVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAgLyogZmxhZ3MgKi8pOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIHdha2VMb2NrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrIik7CisgICAgICAgICAgICBqbWV0aG9kSUQgalJlbGVhc2UgPSBlbnYtPkdldE1ldGhvZElEKHdha2VMb2NrQ2xzLCAicmVsZWFzZSIsICIoKVYiKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobVdha2VMb2NrLT5nZXRKT2JqZWN0KCksIGpSZWxlYXNlKTsKICAgICAgICAgfQotICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwogICAgIH0KIH0KIAotdm9pZCBKV2FrZUxvY2s6OmNsZWFyUG93ZXJNYW5hZ2VyKCkgewordm9pZCBKV2FrZUxvY2s6OmNsZWFySmF2YVdha2VMb2NrKCkgewogICAgIHJlbGVhc2UodHJ1ZSk7Ci0gICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwotfQotCi12b2lkIEpXYWtlTG9jazo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7Ci0gICAgICAgIG1XYWtlTG9jay0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKLSAgICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaAppbmRleCBlYWNlODdlLi4zNmM1NDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgSl9XQUtFTE9DS19IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI2LDcgKzI2LDcgQEAKIGNsYXNzIEpXYWtlTG9jayA6IHB1YmxpYyBSZWZCYXNlIHsKIAogcHVibGljOgotICAgIEpXYWtlTG9jaygpOworICAgIEpXYWtlTG9jayhjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICAvLyBOT1RFOiBhY3F1aXJlIGFuZCByZWxlYXNlIGFyZSBub3QgdGhyZWFkIHNhZmUKIApAQCAtMzcsMjggKzM3LDExIEBACiAgICAgdmlydHVhbCB+Sldha2VMb2NrKCk7CiAKIHByaXZhdGU6Ci0gICAgc3A8SVBvd2VyTWFuYWdlcj4gbVBvd2VyTWFuYWdlcjsKLSAgICBzcDxJQmluZGVyPiAgICAgICBtV2FrZUxvY2tUb2tlbjsKLSAgICB1aW50MzJfdCAgICAgICAgICBtV2FrZUxvY2tDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudDsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtV2FrZUxvY2s7CisgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gbUNvbnRleHQ7CiAKLSAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFBNRGVhdGhSZWNpcGllbnQoSldha2VMb2NrICp3YWtlTG9jaykgOiBtV2FrZUxvY2sod2FrZUxvY2spIHt9Ci0gICAgICAgIHZpcnR1YWwgflBNRGVhdGhSZWNpcGllbnQoKSB7fQotCi0gICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7Ci0gICAgICAgIFBNRGVhdGhSZWNpcGllbnQmIG9wZXJhdG9yPSAoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOwotCi0gICAgICAgIEpXYWtlTG9jayAqbVdha2VMb2NrOwotICAgIH07Ci0KLSAgICBjb25zdCBzcDxQTURlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7Ci0KLSAgICB2b2lkIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgdm9pZCBjbGVhckphdmFXYWtlTG9jaygpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSldha2VMb2NrKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKaW5kZXggODM3YmJjOC4uZDYwOGQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisjaW5jbHVkZSAiSk1lZGlhUGxheWVyMlV0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zMi5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKQEAgLTIwOCwxNSArMjA5LDE2IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU51UGxheWVyMjo6TnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKK051UGxheWVyMjo6TnVQbGF5ZXIyKAorICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVBJRChwaWQpLAogICAgICAgbVVJRCh1aWQpLAogICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCi0gICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKICAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAogICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAorICAgICAgbUVPU01vbml0b3JHZW5lcmF0aW9uKDApLAogICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcygwKSwKICAgICAgIG1QcmV2aW91c1NlZWtUaW1lVXMoMCksCiAgICAgICBtQXVkaW9FT1MoZmFsc2UpLApAQCAtMjQwLDggKzI0Miw3IEBACiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1QYXVzZWRCeUNsaWVudCh0cnVlKSwKICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKLSAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICAgIG1Db250ZXh0KGNvbnRleHQpIHsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQpAQCAtMzA5LDcgKzMxMCw3IEBACiAgICAgICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwogCi0gICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOwpAQCAtMzkzLDExICszOTQsMTMgQEAKICAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgogICAgICovCiAKLSAgICBtRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKyAgICBtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBkc2QtPm1TdGFydFBvc2l0aW9uTXMgKiAxMDAwKTsKKyAgICBtc2ctPnNldEludDY0KCJlbmRUaW1lVXMiLCBkc2QtPm1FbmRQb3NpdGlvbk1zICogMTAwMCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQxNSwxMSArNDE4LDEzIEBACiAgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KICAgICAqLwogCi0gICAgbU5leHREYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworICAgIG1OZXh0U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgZHNkLT5tU3RhcnRQb3NpdGlvbk1zICogMTAwMCk7CisgICAgbXNnLT5zZXRJbnQ2NCgiZW5kVGltZVVzIiwgZHNkLT5tRW5kUG9zaXRpb25NcyAqIDEwMDApOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00ODcsNyArNDkyLDcgQEAKIHN0YXR1c190IE51UGxheWVyMjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgewogICAgIC8vIGRvIHNvbWUgY3Vyc29yeSB2YWxpZGF0aW9uIG9mIHRoZSBzZXR0aW5ncyBoZXJlLiBhdWRpbyBtb2RlcyBhcmUKICAgICAvLyBvbmx5IHZhbGlkYXRlZCB3aGVuIHNldCBvbiB0aGUgYXVkaW9zaW5rLgotICAgICBpZiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTikKKyAgICAgaWYgKHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCiAgICAgICAgICAgICB8fCByYXRlLm1TcGVlZCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAogICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CkBAIC01NTQsNyArNTU5LDcgQEAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIHNvdXJjZSA9IG1Tb3VyY2U7CisgICAgICAgIHNvdXJjZSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlOwogICAgIH0KIAogICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewpAQCAtNTg0LDkgKzU4OSwxMyBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyMjo6cmV3aW5kKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXdpbmQsIHRoaXMpOworICAgIG1zZy0+cG9zdCgpOworfQogCiB2b2lkIE51UGxheWVyMjo6d3JpdGVUcmFja0luZm8oCi0gICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CisgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3QgewogICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTlVMTCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjE5LDEwICs2MjgsOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybwotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZShtaW1lLmNfc3RyKCkpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9zdHJpbmdfdmFsdWUobGFuZy5jX3N0cigpKTsKIAogICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewogICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKQEAgLTYzMCwyNyArNjM4LDMwIEBACiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CiAKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzRGVmYXVsdCk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0ZvcmNlZCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFNldERhdGFTb3VyY2U6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldERhdGFTb3VyY2UiKTsKIAotICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbVNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZW5kVGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRTZXREYXRhU291cmNlLCBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBOVUxMIik7CkBAIC02NTksNyArNjcwLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1Ecml2ZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKG1TcmNJZCwgZXJyKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NzMsOSArNjg0LDExIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImVuZFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubUVuZFRpbWVVcykpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KQEAgLTY4OCw3ICs3MDEsNyBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0UGxheU5leHREYXRhU291cmNlIik7CiAgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7Ci0gICAgICAgICAgICBpZiAoc3JjSWQgIT0gbU5leHRTcmNJZCkgeworICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U291cmNlSW5mby5tU3JjSWQpIHsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtNzA5LDYgKzcyMiwyMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RU9TTW9uaXRvcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtRU9TTW9uaXRvckdlbmVyYXRpb24gfHwgcmVhc29uICE9IE1lZGlhQ2xvY2s6OlRJTUVSX1JFQVNPTl9SRUFDSEVEKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZSBvciByZXNldAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigia1doYXRFT1NNb25pdG9yIik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3M6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwpAQCAtNzE3LDggKzc0Niw4IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CkBAIC03NDAsOCArNzY5LDggQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKICAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTc1NSw3ICs3ODQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigib25NZXNzYWdlUmVjZWl2ZWQga1doYXRQcmVwYXJlIik7CiAKLSAgICAgICAgICAgIG1Tb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTc2NCwxMiArNzkzLDE2IEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAoaW50NjRfdCopJnNyY0lkKSk7CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKQEAgLTc3OCwxMSArODExLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRvdGFsIHRyYWNrIGNvdW50Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CisgICAgICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOwogCiAgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8oaSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjawpAQCAtNzk3LDIwICs4MzAsMzUgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgeworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKKworICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgorICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKQEAgLTgyNSwxOCArODczLDIxIEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwogICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CiAgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CkBAIC04NDQsMTEgKzg5NSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGluYmFuZFRyYWNrcykgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZm8tPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKQEAgLTg4MSwxMCArOTMyLDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKICAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZHVyYXRpb25Vcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC05MDEsMTMgKzk1MiwxNSBAQAogCiAgICAgICAgICAgICBBTE9HRCgib25TZXRWaWRlb1N1cmZhY2UoJXAsICVzIHZpZGVvIGRlY29kZXIpIiwKICAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKLSAgICAgICAgICAgICAgICAgICAgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSA/ICJoYXZlIiA6ICJubyIpOwogCi0gICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1Tb3VyY2UtPmdldEZvcm1hdCBiZWNhdXNlIE51UGxheWVyMiBtaWdodAotICAgICAgICAgICAgLy8gYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KLSAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCi0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdAorICAgICAgICAgICAgLy8gYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQgYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KKyAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbVZpZGVvRGVjb2RlcidzIG1OYXRpdmVXaW5kb3cgaXMgYWx3YXlzIG5vbi1udWxsCiAgICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbVZpZGVvRGVjb2Rlci0+c2V0VmlkZW9TdXJmYWNlKG53dykgPT0gT0spKSB7CiAgICAgICAgICAgICAgICAgcGVyZm9ybVNldFN1cmZhY2Uobnd3KTsKQEAgLTk3MSwxMCArMTAyNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgICAgIG9uU3RhcnQodHJ1ZSAvKiBwbGF5ICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC05ODgsOCArMTA0MSw3IEBACiAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyBBdWRpb1NpbmsgYWxsb3dzIG9ubHkgMS5mIGFuZCAwLmYgZm9yIG9mZmxvYWQgbW9kZS4KICAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgc3BlZWQsIHN3aXRjaCB0byBub24tb2ZmbG9hZCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkICE9IDEuZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAocmF0ZS5tU3BlZWQgIT0gMS5mIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CkBAIC0xMDEyLDM2ICsxMDY0LDE1IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGFsbCBvdGhlciBzZXR0aW5ncyAodXNpbmcgbm9uLXBhdXNlZCBzcGVlZCkKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlbSBvbiBzdGFydAotICAgICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiByYXRlLm1TcGVlZCAhPSAwLmYgKi8KLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWRGb3JCdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmVwYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwogCi0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwotICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKQEAgLTEwNjEsOSArMTA5Miw2IEBACiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtMTE1NywyMSArMTE4NSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgogCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgewogICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMICYmIG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgY3VycmVudGx5IGRlY29kaW5nIGFueXRoaW5nIChubyBhdWRpbyBvcgogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyB0cmFja3MgZm91bmQpIGFuZCB3ZSBqdXN0IHJhbiBvdXQgb2YgaW5wdXQgZGF0YS4KIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyNTMsMTMgKzEyODIsMTQgQEAKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCiAgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTEyNjcsNiArMTI5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xMzIzLDI4ICsxMzU0LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93ID09IE5VTEwgfHwgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93ID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSBhdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhdWRpbyB0cmFjayBoYXMgZXJyb3IuIFZpZGVvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IHZpZGVvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHZpZGVvIHRyYWNrIGhhcyBlcnJvci4gQXVkaW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMzk0LDEyICsxNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZmluYWxSZXN1bHQpOwogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICgobUF1ZGlvRU9TIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtVmlkZW9FT1MgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEZsdXNoQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOwpAQCAtMTQyMCwxMCArMTQ2MywxMSBAQAogICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIGZhbHNlIC8qIGlzRGVjb2RlciAqLyk7CiAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCkgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCwgMCk7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEF1ZGlvVGVhckRvd24pIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOwpAQCAtMTQ3Niw3ICsxNTIwLDcgQEAKICAgICAgICAgICAgIGludDY0X3QgdGltZXJVczsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lclVzIiwgJnRpbWVyVXMpKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTk9USUZZX1RJTUUsIHRpbWVyVXMsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0OTUsMjAgKzE1MzksMjAgQEAKICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCkBAIC0xNTI3LDEwICsxNTcxLDQ5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRSZXdpbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJld2luZCIpOworCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVDsKKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSkpOworCisgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAorICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KGZhbHNlIC8qIHBsYXkgKi8pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwogICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNTYxLDcgKzE2NDQsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlRHJtOgogICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUmVsZWFzZURybShtc2cpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7CkBAIC0xNTgzLDggKzE2NjYsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5yZXN1bWUoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKICAgICB9CkBAIC0xNjAyLDEyICsxNjg1LDEyIEBACiAgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnJlc3VtZSIpOwogfQogCi12b2lkIE51UGxheWVyMjo6b25TdGFydCgpIHsKLSAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKK3ZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KGJvb2wgcGxheSkgeworICAgIEFMT0dWKCJvblN0YXJ0OiBtQ3J5cHRvOiAlcCIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvLmdldCgpKTsKIAogICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKICAgICB9CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CkBAIC0xNjE4LDIyICsxNzAxLDIzIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAKLSAgICBpZiAobVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1JlYWxUaW1lKCkpIHsKICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfUkVBTF9USU1FOwogICAgIH0KIAotICAgIGJvb2wgaGFzQXVkaW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOwotICAgIGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc0F1ZGlvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKICAgICBpZiAoIWhhc0F1ZGlvICYmICFoYXNWaWRlbykgewogICAgICAgICBBTE9HRSgibm8gbWV0YWRhdGEgZm9yIGVpdGhlciBhdWRpbyBvciB2aWRlbyBzb3VyY2UiKTsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIEVSUk9SX01BTEZPUk1FRCk7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIEVSUk9SX01BTEZPUk1FRCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1ZfSUYoIWhhc0F1ZGlvLCAibm8gbWV0YWRhdGEgZm9yIGF1ZGlvIHNvdXJjZSIpOyAgLy8gdmlkZW8gb25seSBzdHJlYW0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKIAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CkBAIC0xNjQxLDExICsxNzI1LDEyIEBACiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9Ci0gICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICAgICAgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCiAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKICAgICAgICAgQUxPR1YoIm9uU3RhcnQ6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIG5vdyB0aGF0IHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE2NTcsMTcgKzE3NDIsMTcgQEAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIHRoaXMpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7Ci0gICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG1NZWRpYUNsb2NrLCBub3RpZnksIGZsYWdzKTsKKyAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgbUNvbnRleHQsIGZsYWdzKTsKICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyUmVuZGVyZXIiKTsKLSAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllcjJSZW5kZXJlciIpOworICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIHRydWUsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MobVBsYXliYWNrU2V0dGluZ3MpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE2NzYsNiArMTc2MSwxMiBAQAogICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOwogICAgIH0KIAorICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CisgICAgLy8gUmVuZGVyZXIgaXMgY3JlYXRlZCBpbiBwYXVzZWQgc3RhdGUuCisgICAgaWYgKHBsYXkpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICB9CisKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CiAgICAgfQpAQCAtMTY4NCwxMCArMTc3NSwyMyBAQAogICAgIH0KIAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCwgMCk7CiAKICAgICBwb3N0U2NhblNvdXJjZXMoKTsKIH0KIAordm9pZCBOdVBsYXllcjI6OmFkZEVuZFRpbWVNb25pdG9yKCkgeworICAgICsrbUVPU01vbml0b3JHZW5lcmF0aW9uOworCisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzID09IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RU9TTW9uaXRvciwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1FT1NNb25pdG9yR2VuZXJhdGlvbik7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZywgbUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpOworfQorCiB2b2lkIE51UGxheWVyMjo6c3RhcnRQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwogICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID09IDApIHsKQEAgLTE3MDksNyArMTgxMyw3IEBACiAgICAgICAgICAgICBBTE9HVigic3RvcFBsYXliYWNrVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcGxheWVkKTsKIAogICAgICAgICAgICAgaWYgKHBsYXllZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOwpAQCAtMTcyNyw3ICsxODMxLDggQEAKIHZvaWQgTnVQbGF5ZXIyOjpzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjaykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKIAotICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CisgICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLAorICAgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOwogCiAgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zICE9IDApIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKQEAgLTE3MzcsOSArMTg0MiwxMCBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BSZWJ1ZmZlcmluZ1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHJlYnVmZmVyZWQpOwogCiAgICAgICAgICAgICBpZiAocmVidWZmZXJlZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhtU3JjSWQsIChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOwogICAgICAgICAgICAgICAgIGlmIChleGl0aW5nUGxheWJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1TcmNJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE3NTUsOCArMTg2MSw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5wYXVzZSgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wYXVzZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTg0Niw3ICsxOTUyLDcgQEAKIAogICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKICAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCi0gICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgLy8gQW55IGZhaWx1cmUgd2UgdHVybiBvZmYgbU9mZmxvYWRBdWRpby4KICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTg2Myw2ICsxOTY5LDcgQEAKICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcywgYm9vbCBmb3JjZU5vbk9mZmxvYWQsIGJvb2wgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlcikgewogICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci0+cGF1c2UoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CiAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xOTA5LDcgKzIwMTYsNyBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6ZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmYXVkaW9Gb3JtYXQpIHsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xOTE5LDE2ICsyMDI2LDE2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKHZpZGVvRm9ybWF0ICE9IE5VTEwpOwotICAgIGJvb2wgY2FuT2ZmbG9hZCA9IGNhbk9mZmxvYWRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgIGJvb2wgY2FuT2ZmbG9hZCA9IEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwogCiAgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKGNhbk9mZmxvYWQgJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgaWYgKGNhbk9mZmxvYWQgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBjYW5PZmZsb2FkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2U6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIGIvYyB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKICAgICB9CkBAIC0xOTU1LDcgKzIwNjIsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOwogCiAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtMTk3NywxMSArMjA4NCwxMSBAQAogICAgICAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CisgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1BST1RFQ1RFRCkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvdGVjdGVkIiwgdHJ1ZSk7CiAgICAgICAgIH0KIApAQCAtMTk5MSw2ICsyMDk4LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOworCiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgdGhpcyk7CiAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CkBAIC0yMDAwLDE2ICsyMTA5LDE2IEBACiAgICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyUGFzc1Rocm91Z2ggIGhhc1ZpZGVvOiAlZCIsIGhhc1ZpZGVvKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CkBAIC0yMDE5LDcgKzIxMjgsOCBAQAogICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCiAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCi0gICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICAgICAgICAgIG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgICAgICBtQ0NEZWNvZGVyKTsKICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAKICAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90CkBAIC0yMDM0LDEwICsyMTQ0LDExIEBACiAgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKLSAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKLSAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvKTsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSwKKyAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOwogICAgIH0KIAogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwpAQCAtMjE1Niw3ICsyMjY3LDggQEAKICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOwogfQogCi12b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Cit2b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjQwLDggKzIzNTIsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0VHJhY2tJbmZvLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjI0OSw5ICsyMzYyLDEwIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDY0X3Qgc3JjSWQsIGludDMyX3QgdHlwZSwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjYyLDggKzIzNzYsOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CkBAIC0yMjk1LDYgKzI0MTAsOCBAQAogICAgIENIRUNLKG1UcmFja1N0YXRzICE9IE5VTEwpOwogCiAgICAgbVRyYWNrU3RhdHMtPmNsZWFyKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CiAgICAgfQpAQCAtMjMwNCwxMSArMjQyMSwxMSBAQAogfQogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpnZXRGaWxlTWV0YSgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKKyAgICByZXR1cm4gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7CiB9CiAKIGZsb2F0IE51UGxheWVyMjo6Z2V0RnJhbWVSYXRlKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yMzY2LDE2ICsyNDgzLDE2IEBACiAgICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSwgbW9kZT0lZCIsCiAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2LCBtb2RlKTsKIAotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKLSAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICAibUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgaXMgTlVMTCBhbmQgZGVjb2RlcnMgbm90IE5VTEwgYXVkaW8oJXApIHZpZGVvKCVwKSIsCiAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5nZXQoKSwgbVZpZGVvRGVjb2Rlci5nZXQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVByZXZpb3VzU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgbVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOworICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CiAgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIC8vIGV2ZXJ5dGhpbmcncyBmbHVzaGVkLCBjb250aW51ZSBwbGF5YmFjay4KQEAgLTI0MjIsMTcgKzI1MzksMTMgQEAKICAgICBtUmVuZGVyZXIuY2xlYXIoKTsKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgfQorICAgIHJlc2V0U291cmNlSW5mbyhtQ3VycmVudFNvdXJjZUluZm8pOworICAgIHJlc2V0U291cmNlSW5mbyhtTmV4dFNvdXJjZUluZm8pOwogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVzZXRDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDQxLDE0ICsyNTU0LDYgQEAKICAgICBtUmVzZXR0aW5nID0gZmFsc2U7CiAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgotICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtUGxheU5leHREYXRhU291cmNlKCkgewpAQCAtMjQ2NywyNSArMjU3MiwzMSBAQAogCiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICB9CiAKICAgICBsb25nIHByZXZpb3VzU3JjSWQ7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlID0gbU5leHRTb3VyY2U7Ci0gICAgICAgIG1OZXh0U291cmNlID0gTlVMTDsKLSAgICAgICAgcHJldmlvdXNTcmNJZCA9IG1TcmNJZDsKLSAgICAgICAgbVNyY0lkID0gbU5leHRTcmNJZDsKLSAgICAgICAgKyttTmV4dFNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgorICAgICAgICBwcmV2aW91c1NyY0lkID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZDsKKworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8gPSBtTmV4dFNvdXJjZUluZm87CisgICAgICAgIG1OZXh0U291cmNlSW5mbyA9IFNvdXJjZUluZm8oKTsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9IH5tQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgogICAgIH0KIAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihwcmV2aW91c1NyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUsIDApOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhULCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9FTkQsIDApOworCisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJULCAwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ5NCwyMiArMjYwNSwxNSBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CiAgICAgfQogCi0gICAgb25TdGFydCgpOworICAgIG9uU3RhcnQodHJ1ZSAvKiBwbGF5ICovKTsKICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKLSAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMoKSB7CkBAIC0yNTM1LDcgKzI2MzksNyBAQAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNTY3LDcgKzI2NzEsNyBAQAogdm9pZCBOdVBsYXllcjI6OmZpbmlzaFJlc3VtZSgpIHsKICAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKICAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICB9CiB9CiAKQEAgLTI1ODksMzYgKzI2OTMsNTAgQEAKICAgICBzd2l0Y2ggKHdoYXQpIHsKICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6ICVwIiwgbVNvdXJjZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCi0gICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KLSAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKLSAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oc3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTolcCwgSWQoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UuZ2V0KCksIChsb25nIGxvbmcpc3JjSWQpOworICAgICAgICAgICAgaWYgKHNyY0lkID09IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGFuZGxlZCB0aGUgcmVzZXQsIHRoZSBzb3VyY2UgaXMgZ29uZS4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChzcmNJZCwgZXJyKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAorICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgcmVjZWl2ZWQgdGhlICJwcmVwYXJlIGNvbXBsZXRlIiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQgPT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtTmV4dFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjI3LDE1ICsyNzQ1LDE1IEBACiAgICAgICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdERybUluZm86CiAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcmNlbCBwYXJjZWw7CisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRybUluZm87CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRybUluZm8iLCAmZHJtSW5mbykpOwotICAgICAgICAgICAgcGFyY2VsLnNldERhdGEoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOworICAgICAgICAgICAgcGxheWVyTXNnLlBhcnNlRnJvbUFycmF5KGRybUluZm8tPmRhdGEoKSwgZHJtSW5mby0+c2l6ZSgpKTsKIAotICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGFyY2VsIHNpemU6ICV6dSIsCi0gICAgICAgICAgICAgICAgICAgIGRybUluZm8uZ2V0KCksIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RHJtSW5mbyBNRURJQTJfRFJNX0lORk8gZHJtSW5mbzogJXAgIHBsYXllck1zZyBzaXplOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGRybUluZm8uZ2V0KCksIHBsYXllck1zZy5CeXRlU2l6ZSgpKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9EUk1fSU5GTywgMCAvKiBleHQxICovLCAwIC8qIGV4dDIgKi8sICZwYXJjZWwpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9EUk1fSU5GTywgMCAvKiBleHQxICovLCAwIC8qIGV4dDIgKi8sICZwbGF5ZXJNc2cpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjY2NCwxOSArMjc4MiwyNiBAQAogICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTk9UX1NFRUtBQkxFLCAwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGbGFnc0NoYW5nZWQoc3JjSWQsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7Ci0gICAgICAgICAgICAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY0lkID09IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pKSkgeworICAgICAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQgPT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBkdXJhdGlvbiBwb2xsaW5nIGZvciBuZXh0IHNvdXJjZS4KKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yODI3LDggKzI5NTIsOCBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7CkBAIC0yODM3LDcgKzI5NjIsNyBAQAogCiAgICAgICAgIGNhc2UgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKICAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg1NiwzNSArMjk4MSwzMSBAQAogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKIAotICAgIFBhcmNlbCBpbjsKLSAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZShkdXJhdGlvblVzKTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAotICAgIFBhcmNlbCBpbjsKLSAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50NjRfdmFsdWUodGltZVVzKTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX01FVEFfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmcGxheWVyTXNnKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplID0gMDsKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zMjo6SU5fQkFORF9URVhUXzNHUFA7CiAKICAgICBBU3RyaW5nIG1pbWU7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwpAQCAtMjg5MywyOCArMzAxNCwyOCBAQAogICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CiAKLSAgICBQYXJjZWwgcGFyY2VsOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgIGlmIChzaXplID4gMCkgewogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgICAgIGludDMyX3QgZ2xvYmFsID0gMDsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImdsb2JhbCIsICZnbG9iYWwpICYmIGdsb2JhbCkgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zMjo6R0xPQkFMX0RFU0NSSVBUSU9OUzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zMjo6TE9DQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9Ci0gICAgICAgIFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKAotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJnBhcmNlbCk7CisgICAgICAgIFRleHREZXNjcmlwdGlvbnMyOjpnZXRQbGF5ZXJNZXNzYWdlT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGxheWVyTXNnKTsKICAgICB9CiAKLSAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgaWYgKHBsYXllck1zZy52YWx1ZXNfc2l6ZSgpID4gMCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBsYXllck1zZyk7CiAgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOwogICAgIH0KIH0KIAogY29uc3QgY2hhciAqTnVQbGF5ZXIyOjpnZXREYXRhU291cmNlVHlwZSgpIHsKLSAgICBzd2l0Y2ggKG1EYXRhU291cmNlVHlwZSkgeworICAgIHN3aXRjaCAobUN1cnJlbnRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSkgewogICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOgogICAgICAgICAgICAgcmV0dXJuICJIVFRQTGl2ZSI7CiAKQEAgLTI5MzYsOCArMzA1NywzNCBAQAogICAgIH0KICB9CiAKK051UGxheWVyMjo6U291cmNlSW5mbyogTnVQbGF5ZXIyOjpnZXRTb3VyY2VJbmZvQnlJZEluTXNnKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50NjRfdCBzcmNJZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1DdXJyZW50U291cmNlSW5mbzsKKyAgICB9IGVsc2UgaWYgKG1OZXh0U291cmNlSW5mby5tU3JjSWQgPT0gc3JjSWQpIHsKKyAgICAgICAgcmV0dXJuICZtTmV4dFNvdXJjZUluZm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cmVzZXRTb3VyY2VJbmZvKE51UGxheWVyMjo6U291cmNlSW5mbyAmc3JjSW5mbykgeworICAgIGlmIChzcmNJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzcmNJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICBzcmNJbmZvLm1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgc3JjSW5mby5tQ3J5cHRvLmdldCgpKTsKKyAgICBzcmNJbmZvLm1DcnlwdG8uY2xlYXIoKTsKKyAgICBzcmNJbmZvLm1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworfQorCiAvLyBNb2R1bGFyIERSTSBiZWdpbgotc3RhdHVzX3QgTnVQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKIHsKICAgICBBTE9HVigicHJlcGFyZURybSAiKTsKIApAQCAtMjk0Nyw2ICszMDk0LDcgQEAKICAgICB1aW50OF90IFVVSURbMTZdOwogICAgIG1lbWNweShVVUlELCB1dWlkLCBzaXplb2YoVVVJRCkpOwogICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBkcm1TZXNzaW9uSWQ7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKVVVSUQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKSZzZXNzaW9uSWQpOwogCkBAIC0yOTYzLDExICszMTExLDEyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKQogewogICAgIEFMT0dWKCJyZWxlYXNlRHJtICIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VEcm0sIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKQEAgLTI5ODgsOCArMzEzNywxNSBAQAogICAgIEFMT0dEKCJvblByZXBhcmVEcm0gIik7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTsKKyAgICBpZiAoc3JjSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoc3JjSW5mby0+bVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkgTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMzAwMSw0MiArMzE1Nyw1MCBAQAogICAgIHN0YXR1cyA9IE9LOwogICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9IE5VTEw7CiAKLSAgICBzdGF0dXMgPSBtU291cmNlLT5wcmVwYXJlRHJtKHV1aWQsICpkcm1TZXNzaW9uSWQsICZjcnlwdG8pOworICAgIHN0YXR1cyA9IHNyY0luZm8tPm1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CiAgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKS5tU291cmNlLT5wcmVwYXJlRHJtIGZhaWxlZC4gc3RhdHVzOiAlZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiKTsKKyAgICBBTE9HVigib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gc3VjY2VlZGVkIiwgKGxvbmcgbG9uZylzcmNJZCk7CiAKLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIEFscmVhZHkgaGF2aW5nIG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKKyAgICBpZiAoc3JjSW5mby0+bUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkgVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbUNyeXB0byA9IGNyeXB0bzsKLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOworICAgIHNyY0luZm8tPm1DcnlwdG8gPSBjcnlwdG87CisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisgICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBzcmNJbmZvLT5tQ3J5cHRvLmdldCgpKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6b25SZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMjo6b25SZWxlYXNlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKQogewogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoIm9uUmVsZWFzZURybSAiKTsKLQotICAgIGlmICghbUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dXKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIpOworICAgIFNvdXJjZUluZm8gKnNyY0luZm8gPSBnZXRTb3VyY2VJbmZvQnlJZEluTXNnKG1zZyk7OworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGludDY0X3Qgc3JjSWQgPSBzcmNJbmZvLT5tU3JjSWQ7CisgICAgaWYgKCFzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQpOworICAgIH0KKworICAgIHNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICBpZiAoc3JjSW5mby0+bUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgc291cmNlIGZpcnN0IGJlZm9yZSByZW1vdmluZyBjcnlwdG8gZnJvbSBjb2RlYwotICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5yZWxlYXNlRHJtKCk7CisgICAgICAgIGlmIChzcmNJbmZvLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNyY0luZm8tPm1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1cz1PSzsKQEAgLTMwNTcsOSArMzIyMSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsgICAvLyBtQ3J5cHRvID09IE5VTEwKKyAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBzcmNJbmZvLT5tQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgc3JjSW5mby0+bUNyeXB0by5jbGVhcigpOworICAgIH0gZWxzZSB7ICAgLy8gc3JjSW5mby0+bUNyeXB0byA9PSBOVUxMCiAgICAgICAgIEFMT0dFKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIFRoZXJlIGlzIG5vIGNyeXB0by4iKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzEyMSw0ICszMjg1LDI0IEBACiAgICAgVFJFU1BBU1MoKTsKIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvOjpTb3VyY2VJbmZvKCkKKyAgICA6IG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpLAorICAgICAgbVNyY0lkKDApLAorICAgICAgbVNvdXJjZUZsYWdzKDApLAorICAgICAgbVN0YXJ0VGltZVVzKDApLAorICAgICAgbUVuZFRpbWVVcyhEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworfQorCitOdVBsYXllcjI6OlNvdXJjZUluZm8gJiBOdVBsYXllcjI6OlNvdXJjZUluZm86Om9wZXJhdG9yPShjb25zdCBOdVBsYXllcjI6OlNvdXJjZUluZm8gJm90aGVyKSB7CisgICAgbVNvdXJjZSA9IG90aGVyLm1Tb3VyY2U7CisgICAgbUNyeXB0byA9IG90aGVyLm1DcnlwdG87CisgICAgbURhdGFTb3VyY2VUeXBlID0gKERBVEFfU09VUkNFX1RZUEUpb3RoZXIubURhdGFTb3VyY2VUeXBlOworICAgIG1TcmNJZCA9IG90aGVyLm1TcmNJZDsKKyAgICBtU291cmNlRmxhZ3MgPSBvdGhlci5tU291cmNlRmxhZ3M7CisgICAgbVN0YXJ0VGltZVVzID0gb3RoZXIubVN0YXJ0VGltZVVzOworICAgIG1FbmRUaW1lVXMgPSBvdGhlci5tRW5kVGltZVVzOworICAgIG1Jc0RybVByb3RlY3RlZCA9IG90aGVyLm1Jc0RybVByb3RlY3RlZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaAppbmRleCA5NmY4NWY5Li5iOGZiOTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKQEAgLTIyLDYgKzIyLDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDcgKzQzLDggQEAKIHN0cnVjdCBOdVBsYXllcjJEcml2ZXI7CiAKIHN0cnVjdCBOdVBsYXllcjIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGV4cGxpY2l0IE51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOworICAgIGV4cGxpY2l0IE51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICB2b2lkIHNldERyaXZlcihjb25zdCB3cDxOdVBsYXllcjJEcml2ZXI+ICZkcml2ZXIpOwogCkBAIC03NSwxMSArODEsMTIgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAogICAgICAgICAgICAgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOworICAgIHZvaWQgcmV3aW5kKCk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50NjRfdCBzcmNJZCwgaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50NjRfdCBzcmNJZCwgc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwogICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICptVHJhY2tTdGF0cyk7CiAKQEAgLTg3LDggKzk0LDggQEAKICAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7Ci0gICAgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKICAgICBjb25zdCBjaGFyICpnZXREYXRhU291cmNlVHlwZSgpOwogCkBAIC0xNTAsNiArMTU3LDMyIEBACiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0UmV3aW5kICAgICAgICAgICAgICAgICAgICAgPSAncmVXZCcsCisgICAgICAgIGtXaGF0RU9TTW9uaXRvciAgICAgICAgICAgICAgICAgPSAnZW9zTScsCisgICAgfTsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAorICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKKworICAgIHN0cnVjdCBTb3VyY2VJbmZvIHsKKyAgICAgICAgU291cmNlSW5mbygpOworICAgICAgICBTb3VyY2VJbmZvICZvcGVyYXRvcj0oY29uc3QgU291cmNlSW5mbyAmKTsKKworICAgICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKKyAgICAgICAgaW50NjRfdCBtU3JjSWQ7CisgICAgICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKKyAgICAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUVuZFRpbWVVczsKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKKyAgICAgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICB9OwogCiAgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOwpAQCAtMTU3LDIzICsxOTAsMjEgQEAKICAgICB1aWRfdCBtVUlEOwogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwogICAgIE11dGV4IG1Tb3VyY2VMb2NrOyAgLy8gZ3VhcmQgfG1Tb3VyY2V8LgotICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQ2NF90IG1TcmNJZDsKLSAgICB1aW50MzJfdCBtU291cmNlRmxhZ3M7Ci0gICAgc3A8U291cmNlPiBtTmV4dFNvdXJjZTsKLSAgICBpbnQ2NF90IG1OZXh0U3JjSWQ7Ci0gICAgdWludDMyX3QgbU5leHRTb3VyY2VGbGFnczsKKyAgICBTb3VyY2VJbmZvIG1DdXJyZW50U291cmNlSW5mbzsKKyAgICBTb3VyY2VJbmZvIG1OZXh0U291cmNlSW5mbzsKICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICBzcDxEZWNvZGVyQmFzZT4gbVZpZGVvRGVjb2RlcjsKICAgICBib29sIG1PZmZsb2FkQXVkaW87CiAgICAgc3A8RGVjb2RlckJhc2U+IG1BdWRpb0RlY29kZXI7CisgICAgTXV0ZXggbURlY29kZXJMb2NrOyAgLy8gZ3VhcmQgfG1BdWRpb0RlY29kZXJ8IGFuZCB8bVZpZGVvRGVjb2RlcnwuCiAgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwogICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CiAgICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOwogICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRU9TTW9uaXRvckdlbmVyYXRpb247CiAKICAgICBNdXRleCBtUGxheWluZ1RpbWVMb2NrOwogICAgIGludDY0X3QgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKQEAgLTI0NCwyMSArMjc1LDggQEAKICAgICAvLyBQYXVzZSBzdGF0ZSBhcyByZXF1ZXN0ZWQgYnkgc291cmNlIChpbnRlcm5hbGx5KSBkdWUgdG8gYnVmZmVyaW5nCiAgICAgYm9vbCBtUGF1c2VkRm9yQnVmZmVyaW5nOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOwotICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCi0gICAgfSBEQVRBX1NPVVJDRV9UWVBFOwotCi0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOwotICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1OZXh0RGF0YVNvdXJjZVR5cGU7CisgICAgLy8gUGFzc2VkIGZyb20gSkFWQQorICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+IG1Db250ZXh0OwogCiAgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CiAgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOwpAQCAtMjkyLDEyICszMTAsMTQgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCA9IE5VTEwpOwogCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKKworICAgIHZvaWQgYWRkRW5kVGltZU1vbml0b3IoKTsKIAogICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CiAgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKIAotICAgIHZvaWQgb25TdGFydCgpOworICAgIHZvaWQgb25TdGFydChib29sIHBsYXkpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKIApAQCAtMzMzLDEwICszNTMsMTMgQEAKICAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKLSAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHN0YXR1c190IG9uUmVsZWFzZURybSgpOworICAgIHN0YXR1c190IG9uUmVsZWFzZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBTb3VyY2VJbmZvKiBnZXRTb3VyY2VJbmZvQnlJZEluTXNnKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHJlc2V0U291cmNlSW5mbyhTb3VyY2VJbmZvICZzcmNJbmZvKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCmluZGV4IGEyMzU0NmEuLjk4YzM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKQEAgLTE5OSw2ICsxOTksMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXTsKKyAgICAgICAgaWYgKHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOCB8fCB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE3MDgpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKwogYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCmluZGV4IDU3ZDVlYTIuLjk3ODM0ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CiAgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwogICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OwogICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKICAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKaW5kZXggZjU3MThlMS4uNjZiZmFlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCkBAIC0xMDcsNyArMTA3LDEyIEBACiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgbU51bUZyYW1lc1RvdGFsKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1pbnB1dCIsIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKTsKLSAgICByZXR1cm4gbVN0YXRzOworICAgIG1TdGF0cy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCBtRnJhbWVSYXRlVG90YWwpOworCisgICAgLy8gaSdtIG11dGV4ZWQgcmlnaHQgbm93LgorICAgIC8vIG1ha2Ugb3VyIG93biBjb3B5LCBzbyB3ZSBhcmVuJ3QgdmljdGltIHRvIGFueSBsYXRlciBjaGFuZ2VzLgorICAgIHNwPEFNZXNzYWdlPiBjb3BpZWRTdGF0cyA9IG1TdGF0cy0+ZHVwKCk7CisgICAgcmV0dXJuIGNvcGllZFN0YXRzOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgewpAQCAtMTA4OCw2ICsxMDkzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKQEAgLTExMDIsNiArMTExMywxMSBAQAogICAgICAgICAgICAgfSAvLyBidWZmZXItPmRhdGEoKQogICAgICAgICB9IC8vIG5lZWRzQ29weQogCisgICAgICAgIHNwPFJlZkJhc2U+IGNyeXB0SW5mb09iajsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJjcnlwdEluZm8iLCAmY3J5cHRJbmZvT2JqKSkgeworICAgICAgICAgICAgY3J5cHRJbmZvID0gc3RhdGljX2Nhc3Q8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlciAqPihjcnlwdEluZm9PYmouZ2V0KCkpOworICAgICAgICB9CisKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKaW5kZXggODc5MzBjNy4uOTE0ZjI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucwogICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyMiBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KICAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlAyRGVjb2RlciIpOwogICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAppbmRleCAzOThjMjQ2Li4xODc2NDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCkBAIC0zNyw0OSArMzcsNTEgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6VmFsdWU7CisKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFBhcmNlbFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcmNlbFdyYXBwZXI+IENyZWF0ZShjb25zdCBQYXJjZWwgKnApIHsKK3N0cnVjdCBQbGF5ZXJNZXNzYWdlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdGF0aWMgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IENyZWF0ZShjb25zdCBQbGF5ZXJNZXNzYWdlICpwKSB7CiAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IHB3ID0gbmV3IFBhcmNlbFdyYXBwZXIoKTsKLSAgICAgICAgICAgIGlmIChwdy0+YXBwZW5kRnJvbShwKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBwdzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBwdyA9IG5ldyBQbGF5ZXJNZXNzYWdlV3JhcHBlcigpOworICAgICAgICAgICAgcHctPmNvcHlGcm9tKHApOworICAgICAgICAgICAgcmV0dXJuIHB3OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGNvbnN0IFBhcmNlbCAqZ2V0UGFyY2VsKCkgewotICAgICAgICByZXR1cm4gbVBhcmNlbDsKKyAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpnZXRQbGF5ZXJNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbVBsYXllck1lc3NhZ2U7CiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyY2VsV3JhcHBlcigpIHsKLSAgICAgICAgaWYgKG1QYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIG1QYXJjZWw7CisgICAgdmlydHVhbCB+UGxheWVyTWVzc2FnZVdyYXBwZXIoKSB7CisgICAgICAgIGlmIChtUGxheWVyTWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbVBsYXllck1lc3NhZ2U7CiAgICAgICAgIH0KICAgICB9CiAKIHByaXZhdGU6Ci0gICAgUGFyY2VsV3JhcHBlcigpCi0gICAgICAgIDogbVBhcmNlbChOVUxMKSB7IH0KKyAgICBQbGF5ZXJNZXNzYWdlV3JhcHBlcigpCisgICAgICAgIDogbVBsYXllck1lc3NhZ2UoTlVMTCkgeyB9CiAKLSAgICBzdGF0dXNfdCBhcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcCkgewotICAgICAgICBpZiAobVBhcmNlbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtUGFyY2VsID0gbmV3IFBhcmNlbDsKKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1QbGF5ZXJNZXNzYWdlID0gbmV3IFBsYXllck1lc3NhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1QYXJjZWwtPmFwcGVuZEZyb20ocCwgMCAvKiBzdGFydCAqLywgcC0+ZGF0YVNpemUoKSk7CisgICAgICAgIG1QbGF5ZXJNZXNzYWdlLT5Db3B5RnJvbSgqcCk7CiAgICAgfQogCi0gICAgUGFyY2VsICptUGFyY2VsOworICAgIFBsYXllck1lc3NhZ2UgKm1QbGF5ZXJNZXNzYWdlOwogfTsKIAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCi1zdGF0aWMgY29uc3QgY2hhciAqa0tleVBsYXllciA9ICJudXBsYXllciI7CitzdGF0aWMgY29uc3QgY2hhciAqa0tleVBsYXllciA9ICJudXBsYXllcjIiOwogLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKICAgICAvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKICAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMi5qYXZhCkBAIC05MCw2ICs5Miw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmhlaWdodCI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lc0Ryb3BwZWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnBzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQU1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5taW1lIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQUNvZGVjID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8uY29kZWMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJEdXJhdGlvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiOwpAQCAtMTA1LDggKzEwOCwxMCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdBdEV4aXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiOwogCitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclZlcnNpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52ZXJzaW9uIjsKIAotTnVQbGF5ZXIyRHJpdmVyOjpOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpCisKK051UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCkKICAgICA6IG1TdGF0ZShTVEFURV9JRExFKSwKICAgICAgIG1Bc3luY1Jlc3VsdChVTktOT1dOX0VSUk9SKSwKICAgICAgIG1TcmNJZCgwKSwKQEAgLTEyMSw5ICsxMjYsMTAgQEAKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbU51UGxheWVyMkxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTWVkaWFDbG9jayhuZXcgTWVkaWFDbG9jayksCi0gICAgICBtUGxheWVyKG5ldyBOdVBsYXllcjIocGlkLCB1aWQsIG1NZWRpYUNsb2NrKSksCisgICAgICBtUGxheWVyKG5ldyBOdVBsYXllcjIocGlkLCB1aWQsIG1NZWRpYUNsb2NrLCBjb250ZXh0KSksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCi0gICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKKyAgICAgIG1NZXRyaWNzSGFuZGxlKDApLAorICAgICAgbVBsYXllclZlcnNpb24oMCksCiAgICAgICBtQ2xpZW50VWlkKHVpZCksCiAgICAgICBtQXRFT1MoZmFsc2UpLAogICAgICAgbUxvb3BpbmcoZmFsc2UpLApAQCAtMTM0LDkgKzE0MCwxMyBAQAogCiAgICAgbU1lZGlhQ2xvY2stPmluaXQoKTsKIAotICAgIC8vIHNldCB1cCBhbiBhbmFseXRpY3MgcmVjb3JkCi0gICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgLy8gWFhYOiB3aGF0IHZlcnNpb24gYXJlIHdlPworICAgIC8vIElkZWFsbHksIHRoaXMgdGlja3Mgd2l0aCB0aGUgYXBrIHZlcnNpb24gaW5mbyBmb3IgdGhlIEFQRVggcGFja2FnaW5nCisKKyAgICAvLyBzZXQgdXAgbWVkaWEgbWV0cmljcyByZWNvcmQKKyAgICBtTWV0cmljc0hhbmRsZSA9IG1lZGlhbWV0cmljc19jcmVhdGUoa0tleVBsYXllcik7CisgICAgbWVkaWFtZXRyaWNzX3NldFVpZChtTWV0cmljc0hhbmRsZSwgbUNsaWVudFVpZCk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVmVyc2lvbiwgbVBsYXllclZlcnNpb24pOwogCiAgICAgbU51UGxheWVyMkxvb3Blci0+c3RhcnQoCiAgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCkBAIC0xNTcsMTAgKzE2Nyw3IEBACiAgICAgdXBkYXRlTWV0cmljcygiZGVzdHJ1Y3RvciIpOwogICAgIGxvZ01ldHJpY3MoImRlc3RydWN0b3IiKTsKIAotICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOwotICAgIH0KKyAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKG1NZXRyaWNzSGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbml0Q2hlY2soKSB7CkBAIC0yNzMsMTMgKzI4MCw2IEBACiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CiAgICAgICAgICAgICBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgotICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0Ci0gICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKLSAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwpAQCAtMjk0LDcgKzI5NCw2IEBACiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0X2woKSB7CiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CkBAIC0zMDQsNyArMzAzLDcgQEAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKICAgICAgICAgICAgIH0KQEAgLTMyMCwzNCArMzE5LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RvcCgpIHsKLSAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgotICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIC8vbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnBhdXNlKCkgewogICAgIEFMT0dEKCJwYXVzZSglcCkiLCB0aGlzKTsKICAgICAvLyBUaGUgTnVQbGF5ZXJSZW5kZXJlciBtYXkgZ2V0IGZsdXNoZWQgaWYgcGF1c2UgZm9yIGxvbmcgZW5vdWdoLCBlLmcuIHRoZSBwYXVzZSB0aW1lb3V0IHRlYXIKQEAgLTM2MSw5ICszMzIsOSBAQAogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKQEAgLTM4NiwxNSArMzU3LDYgQEAKICAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBwb3NpdGlvbgogICAgICAgICBpbnQ2NF90IHVudXNlZDsKICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mCi0gICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkpIHsKLSAgICAgICAgICAgIGVyciA9IHN0YXJ0X2woKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtNDE5LDcgKzM4MSw2IEBACiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CkBAIC00OTcsMTUgKzQ1OCwxNSBAQAogCiAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyVk1pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWTWltZSwgbWltZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyVkNvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllclZDb2RlYywgbmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllcldpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVySGVpZ2h0LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJXaWR0aCwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbCA9IDA7CkBAIC01MTMsMTQgKzQ3NCwxOCBAQAogICAgICAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7CiAgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgJm51bUZyYW1lc0Ryb3BwZWQpOwogCi0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS1vdXRwdXQiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQU1pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckFDb2RlYywgbmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzMSwxNyArNDk2LDE3IEBACiAgICAgLy8gZ2V0RHVyYXRpb24oKSB1c2VzIG1Mb2NrIGZvciBtdXRleCAtLSBjYXJlZnVsIHdoZXJlIHdlIHVzZSBpdC4KICAgICBpbnQ2NF90IGR1cmF0aW9uX21zID0gLTE7CiAgICAgZ2V0RHVyYXRpb24oJmR1cmF0aW9uX21zKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckR1cmF0aW9uLCBkdXJhdGlvbl9tcyk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKIAotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOworICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllclBsYXlpbmcsIChtUGxheWluZ1RpbWVVcys1MDApLzEwMDAgKTsKIAogICAgIGlmIChtUmVidWZmZXJpbmdFdmVudHMgIT0gMCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCBtUmVidWZmZXJpbmdFdmVudHMpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKICAgICB9CiAKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOworICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwogfQogCiAKQEAgLTU1MSw3ICs1MTYsNyBAQAogICAgIH0KICAgICBBTE9HVigibG9nTWV0cmljcyglcCkgZnJvbSAlcyBhdCBzdGF0ZSAlZCIsIHRoaXMsIHdoZXJlLCBtU3RhdGUpOwogCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwgfHwgbUFuYWx5dGljc0l0ZW0tPmlzRW5hYmxlZCgpID09IGZhbHNlKSB7CisgICAgaWYgKG1NZXRyaWNzSGFuZGxlID09IDAgfHwgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpID09IGZhbHNlKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU2MCwxNiArNTI1LDEzIEBACiAgICAgLy8gYW5kIHRoYXQgYWx3YXlzIGluamVjdHMgMyBmaWVsZHMgKGR1cmF0aW9uLCBwbGF5aW5nIHRpbWUsIGFuZAogICAgIC8vIGRhdGFzb3VyY2UpIGludG8gdGhlIHJlY29yZC4KICAgICAvLyBTbyB0aGUgY2Fub25pY2FsICJlbXB0eSIgcmVjb3JkIGhhcyAzIGVsZW1lbnRzIGluIGl0LgotICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDMpIHsKLQotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwotCisgICAgaWYgKG1lZGlhbWV0cmljc19jb3VudChtTWV0cmljc0hhbmRsZSkgPiAzKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkKG1NZXRyaWNzSGFuZGxlKTsKICAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOwotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7Ci0gICAgICAgIH0KKyAgICAgICAgbWVkaWFtZXRyaWNzX2RlbGV0ZShtTWV0cmljc0hhbmRsZSk7CisgICAgICAgIG1NZXRyaWNzSGFuZGxlID0gbWVkaWFtZXRyaWNzX2NyZWF0ZShrS2V5UGxheWVyKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldFVpZChtTWV0cmljc0hhbmRsZSwgbUNsaWVudFVpZCk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllclZlcnNpb24sIG1QbGF5ZXJWZXJzaW9uKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOwogICAgIH0KQEAgLTYwMSwxMCArNTYzLDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICB9Ci0KICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CiAKQEAgLTYzMyw1MCArNTkxLDUxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBpZiAocmVwbHkgPT0gTlVMTCkgeworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVzcG9uc2UpIHsKKyAgICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmVwbHkgaXMgYSBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpbnQzMl90IG1ldGhvZElkOwotICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHRvIGludm9rZSwgZXJyKCVkKSIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIFJlcGVhdGVkUHRyRmllbGQ8Y29uc3QgVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlcXVlc3QudmFsdWVzKCkuY2JlZ2luKCk7CisgICAgaW50MzJfdCBtZXRob2RJZCA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKIAogICAgIHN3aXRjaCAobWV0aG9kSWQpIHsKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9TRVRfVklERU9fU0NBTElOR19NT0RFOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbW9kZSA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgbW9kZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKICAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1NjYWxpbmdNb2RlKG1vZGUpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTzoKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhzcmNJZCwgcmVzcG9uc2UpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKICAgICAgICAgICAgIGludDY0X3QgbXNlYyA9IDA7CiAgICAgICAgICAgICAvLyBnZXRDdXJyZW50UG9zaXRpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gT0sKICAgICAgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmbXNlYyk7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgdHJ1ZSAvKiBzZWxlY3QgKi8sIG1zZWMgKiAxMDAwTEwpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHNyY0lkLCB0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjaygKKyAgICAgICAgICAgICAgICAgICAgc3JjSWQsIHRyYWNrSW5kZXgsIGZhbHNlIC8qIHNlbGVjdCAqLywgMHhkZWFkYmVlZiAvKiBub3QgdXNlZCAqLyk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUsIHJlcGx5KTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUgPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0U2VsZWN0ZWRUcmFjayhzcmNJZCwgdHlwZSwgcmVzcG9uc2UpOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTY5Niw0NCArNjU1LDE2IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0KLSAgICBpZiAoa2V5ID09IEZPVVJDQygnbScsJ3QnLCdyJywnWCcpKSB7Ci0gICAgICAgIC8vIG10clggLS0gYSBwbGF5IG9uICdtZXRyaWNzJyAobm90IG1hdHJpeCkKLSAgICAgICAgLy8gZ2F0aGVyIGN1cnJlbnQgaW5mbyBhbGwgdG9nZXRoZXIsIHBhcmNlbCBpdCwgYW5kIHNlbmQgaXQgYmFjawotICAgICAgICB1cGRhdGVNZXRyaWNzKCJhcGkiKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5IF9fdW51c2VkLCBQYXJjZWwgKnJlcGx5IF9fdW51c2VkKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwotCi0gICAgTWV0YWRhdGEgbWV0YShyZWNvcmRzKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprUGF1c2VBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fUEFVU0UpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfRk9SV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSyk7Ci0KLSAgICByZXR1cm4gT0s7CitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpIHsKKyAgICB1cGRhdGVNZXRyaWNzKCJhcGkiKTsKKyAgICBpZiAobWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobU1ldHJpY3NIYW5kbGUsIGJ1ZmZlciwgbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoaW50NjRfdCAvKiBzcmNJZCAqLykgewpAQCAtNzgwLDIwICs3MTEsNyBAQAogICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtU2Vla0luUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBub3RpZnlTZWVrQ29tcGxldGVfbChzcmNJZCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKSB7Ci0gICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgewotICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgLy8gbm8gbmVlZCB0byBub3RpZnkgbGlzdGVuZXIKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCB3YXNTZWVraW5nID8gTUVESUEyX1NFRUtfQ09NUExFVEUgOiBNRURJQTJfUFJFUEFSRUQpOworICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9TRUVLX0NPTVBMRVRFKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKApAQCAtODg0LDEyICs4MDIsMTIgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtZXNzYWdlSWQiLCAmbXNnSWQpKTsKICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDIiLCAmZXh0Mik7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBpbjsKKyAgICAgICAgICAgIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBpbjsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoInBhcmNlbCIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQYXJjZWxXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJvYmoiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGxheWVyTWVzc2FnZVdyYXBwZXIgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFdmVudChzcmNJZCwgbXNnSWQsIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gTlVMTCA6IGluLT5nZXRQYXJjZWwoKSkpOworICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBsYXllck1lc3NhZ2UoKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTg5OCwxNiArODE2LDE2IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwgaW4pOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglbGxkLCAlZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKICAgICAgICAgICAgIHRoaXMsIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwKLSAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CisgICAgICAgICAgICAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+Qnl0ZVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIGlmIChzcmNJZCA9PSBtU3JjSWQpIHsKICAgICAgICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAgICAgIGNhc2UgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFOgpAQCAtOTI0LDEzICs4NDIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgbUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgbGl0dGxlIGJpdCBvZiBhdWRpby4gSW4gbG9vcGluZyBtb2RlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNlbmQgY29tcGxldGlvbiBldmVudCB3aGVuIGxvb3BpbmcKKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgTUVESUEyX0lORk8pOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1JFUEVBVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKQEAgLTk0OSwxMSArODcyLDExIEBACiAgICAgICAgICAgICAgICAgLy8gZXh0MSBpcyBvdXIgcHJpbWFyeSAnZXJyb3IgdHlwZScgdmFsdWUuIE9ubHkgYWRkIGV4dDIgd2hlbiBub24temVyby4KICAgICAgICAgICAgICAgICAvLyBbdGVzdCBhZ2FpbnN0IG1zZyBpcyBkdWUgdG8gZmFsbCB0aHJvdWdoIGZyb20gcHJldmlvdXMgc3dpdGNoIHZhbHVlXQogICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gTUVESUEyX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3IsIGV4dDEpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJFcnJvciwgZXh0MSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHQyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckVycm9yQ29kZSwgZXh0Mik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk2OSw3ICs4OTIsNyBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoIm1lc3NhZ2VJZCIsIG1zZyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIGV4dDEpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDIiLCBleHQyKTsKLSAgICBub3RpZnktPnNldE9iamVjdCgicGFyY2VsIiwgUGFyY2VsV3JhcHBlcjo6Q3JlYXRlKGluKSk7CisgICAgbm90aWZ5LT5zZXRPYmplY3QoIm9iaiIsIFBsYXllck1lc3NhZ2VXcmFwcGVyOjpDcmVhdGUoKFBsYXllck1lc3NhZ2UqKWluKSk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTEwMzYsMjQgKzk1OSwyNSBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKIHsKICAgICBBTE9HVigicHJlcGFyZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAKICAgICBBTE9HVigicHJlcGFyZURybSByZXQ6ICVkIiwgcmV0KTsKIAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybSgpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkKIHsKICAgICBBTE9HVigicmVsZWFzZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oc3JjSWQpOwogCiAgICAgQUxPR1YoInJlbGVhc2VEcm0gcmV0OiAlZCIsIHJldCk7CiAKQEAgLTEwNzMsOSArOTk3LDYgQEAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOiBydmFsID0gIlJVTk5JTkciOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6IHJ2YWwgPSAiUEFVU0VEIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6IHJ2YWwgPSAiUkVTRVRfSU5fUFJPR1JFU1MiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiBydmFsID0gIlNUT1BQRUQiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSSU5HIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSRUQiOyBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIHllcywgdGhpcyBidWZmZXIgaXMgc2hhcmVkIGFuZCB2dWxuZXJhYmxlIHRvIHJhY2VzCiAgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAppbmRleCA0ZGEyNTY2Li5jOTdlMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKQEAgLTE2LDggKzE2LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI2LDcgKzI3LDcgQEAKIHN0cnVjdCBOdVBsYXllcjI7CiAKIHN0cnVjdCBOdVBsYXllcjJEcml2ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIHsKLSAgICBleHBsaWNpdCBOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKIApAQCAtNDAsMzEgKzQxLDI5IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0gICAgdmlydHVhbCBib29sIGlzUGxheWluZygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKLSAgICAgICAgICAgIGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOworICAgICAgICAgICAgaW50NjRfdCBtc2VjLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVzcG9uc2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhjaGFyICoqYnVmLCBzaXplX3QgKmxlbmd0aCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKIApAQCAtNzcsMTQgKzc2LDE0IEBACiAgICAgdm9pZCBub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoaW50NjRfdCBzcmNJZCwgaW50NjRfdCB0aW1lVXMpOwogICAgIHZvaWQgbm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChpbnQ2NF90IHNyY0lkLCBib29sIHN0YXR1cyk7CiAgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGUoaW50NjRfdCBzcmNJZCk7Ci0gICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKICAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZChpbnQ2NF90IHNyY0lkLCB1aW50MzJfdCBmbGFncyk7CiAKICAgICAvLyBNb2R1bGFyIERSTQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAorICAgICAgICAgICAgaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IHNyY0lkKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyMkRyaXZlcigpOwpAQCAtOTksOSArOTgsNiBAQAogICAgICAgICBTVEFURV9SVU5OSU5HLAogICAgICAgICBTVEFURV9QQVVTRUQsCiAgICAgICAgIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTLAotICAgICAgICBTVEFURV9TVE9QUEVELCAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VECi0gICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORywgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVraW5nCi0gICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVELCAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVrIGNvbXBsZXRlCiAgICAgfTsKIAogICAgIHN0ZDo6c3RyaW5nIHN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKTsKQEAgLTEzNyw3ICsxMzMsOCBAQAogICAgIHNwPEF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICB1aW50MzJfdCBtUGxheWVyRmxhZ3M7CiAKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm1BbmFseXRpY3NJdGVtOworICAgIG1lZGlhbWV0cmljc19oYW5kbGVfdCBtTWV0cmljc0hhbmRsZTsKKyAgICBpbnQ2NF90IG1QbGF5ZXJWZXJzaW9uOwogICAgIHVpZF90IG1DbGllbnRVaWQ7CiAKICAgICBib29sIG1BdEVPUzsKQEAgLTE0OSw3ICsxNDYsNyBAQAogCiAgICAgc3RhdHVzX3Qgc3RhcnRfbCgpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyRHJpdmVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKaW5kZXggMGUwOTZiMC4uZjQxYTQzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcApAQCAtMTMzLDkgKzEzMyw4IEBACiAgICAgcmV0dXJuIGRybUluZm9CdWZmZXI7CiB9CiAKLXNwPEFCdWZmZXI+IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICpwc3NoSW5mbykKK3N0YXR1c190IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICpwc3NoSW5mbywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKQogewotCiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHBzc2gsIGRybUluZm87CiAKICAgICAvLyAwKSBHZW5lcmF0ZSBQU1NIIGJ5dGVzCkBAIC0xNTQsMjIgKzE1MywyMCBAQAogICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleChwc3NoUHRyLCBwc3NoU2l6ZSkuc3RyaW5nKCkpOwogCiAgICAgLy8gMSkgV3JpdGUgUFNTSCBieXRlcwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZwc3NoU2l6ZSksIHNpemVvZihwc3NoU2l6ZSkpOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKIAogICAgIC8vIDIpIFdyaXRlIHN1cHBvcnRlZERSTXMKICAgICB1aW50MzJfdCBudW1lbnRyaWVzID0gcHNzaEluZm8tPm51bWVudHJpZXM7Ci0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJm51bWVudHJpZXMpLCBzaXplb2YobnVtZW50cmllcykpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUobnVtZW50cmllcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1lbnRyaWVzOyBpKyspIHsKICAgICAgICAgUHNzaEVudHJ5ICplbnRyeSA9ICZwc3NoSW5mby0+ZW50cmllc1tpXTsKLSAgICAgICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7CisgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOwogICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyAgc3VwcG9ydGVkU2NoZW1lWyV6dV0gJXMiLCBpLAogICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoKGNvbnN0IHVpbnQ4X3QqKSZlbnRyeS0+dXVpZCwgc2l6ZW9mKEFNZWRpYVVVSUQpKS5zdHJpbmcoKSk7CiAgICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkcm1JbmZvLnN0cigpLmNfc3RyKCksIGRybUluZm8udGVsbHAoKSk7Ci0gICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgZHJtSW5mby50ZWxscCgpKTsKLSAgICByZXR1cm4gZHJtSW5mb0J1ZjsKKyAgICByZXR1cm4gT0s7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKaW5kZXggOTlkMjQxNS4uOTY4ZDFiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCkBAIC0yMyw2ICsyMywxMCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogICAgIHN0cnVjdCBEcm1VVUlEIHsKQEAgLTgwLDcgKzg0LDcgQEAKIAogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIHNwPEFCdWZmZXI+IHJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCB1aW50MzJfdCBwc3Noc2l6ZSk7Ci0gICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKik7CisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCByZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKiwgUGxheWVyTWVzc2FnZSAqKTsKIAogICAgIH07ICAvLyBOdVBsYXllcjJEcm0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcAppbmRleCAzZDY5MTg4Li5hOGM5OTMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMTA2LDYgKzEwNiw3IEBACiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpCiAgICAgOiBtQXVkaW9TaW5rKHNpbmspLAogICAgICAgbVVzZVZpcnR1YWxBdWRpb1NpbmsoZmFsc2UpLApAQCAtMTMxLDcgKzEzMiw3IEBACiAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyhmYWxzZSksCiAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyhmYWxzZSksCiAgICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCi0gICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzKDApLAogICAgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZChmYWxzZSksCkBAIC0xNDcsMTAgKzE0OCw5IEBACiAgICAgICBtVG90YWxCdWZmZXJzUXVldWVkKDApLAogICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCksCiAgICAgICBtVXNlQXVkaW9DYWxsYmFjayhmYWxzZSksCi0gICAgICBtV2FrZUxvY2sobmV3IEpXYWtlTG9jaygpKSB7CisgICAgICBtV2FrZUxvY2sobmV3IEpXYWtlTG9jayhjb250ZXh0KSkgewogICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKIH0KIAogTnVQbGF5ZXIyOjpSZW5kZXJlcjo6flJlbmRlcmVyKCkgewpAQCAtMjA2LDI2ICsyMDYsMjAgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdQbGF5YmFjayhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pIHsKLSAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBhdWRpb3NpbmsncyBzZXRQbGF5YmFja1JhdGUgaWYgcGF1c2luZywgYXMgcGl0Y2ggZG9lcyBub3QKLSAgICAgICAgLy8gaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBhbnkgbm9uLTAgc3BlZWQgKGUuZyBvbGQgc3BlZWQpLiBLZWVwCi0gICAgICAgIC8vIHNldHRpbmdzIG5vbmV0aGVsZXNzLCB1c2luZyB0aGUgb2xkIHNwZWVkLCBpbiBjYXNlIGF1ZGlvc2luayBjaGFuZ2VzLgotICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIGlmIChyYXRlLm1TcGVlZCA8PSAwLmYpIHsKKyAgICAgICAgQUxPR1coInBsYXliYWNrIHJhdGUgY2Fubm90IGJlICVmIiwgcmF0ZS5tU3BlZWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZ2V0IHBsYXliYWNrIHJhdGUgZnJvbSBhdWRpbyBzaW5rLCBlcnIoJWQpIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgIG1QbGF5YmFja1JhdGUgPSByYXRlLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI0NywxNCArMjQxLDEyIEBACiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPmdldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwoKnJhdGUsIG1QbGF5YmFja1NldHRpbmdzKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlLCAlZiB2cyAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgYXVkaW9zaW5rLCBhcyBpdCBtYXkgYmUKICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7Ci0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IDAuZjsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTU3Niw4ICs1NjgsOCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1GcmFtZXNQZW5kaW5nUGxheW91dCAqIDEwMDBsbDsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tSYXRlOworICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgaXQgbW9yZSBkYXRhIGFmdGVyIGFib3V0IGhhbGYgdGhhdCB0aW1lCkBAIC0xNDY2LDcgKzE0NTgsNyBAQAogCiAgICAgaWYgKG1IYXNWaWRlbykgewogICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKICAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU5NCw2ICsxNTg2LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlVmlkZW87CiAgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyA9IGZhbHNlOworICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN5bmNpbmcgdGhlIHF1ZXVlcywgaS5lLiBkcm9wcGluZyBhdWRpbyB3aGlsZQpAQCAtMTc5NCw3ICsxNzg3LDcgQEAKICAgICAgICAgICAgIG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgIH0KIAotICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAKICAgICAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKQEAgLTE4MDgsNyArMTgwMSw3IEBACiAKIHZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CiAgICAgfQogICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdChmcHMpOwogfQpAQCAtMTg3OCw2ICsxODcxLDcgQEAKICAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgewogICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCiAgICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworCiAgICAgYm9vbCBhdWRpb1NpbmtDaGFuZ2VkID0gZmFsc2U7CiAKICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwpAQCAtMTk1NCw3ICsxOTQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KW9mZmxvYWRGbGFncywKQEAgLTIwMjUsMTMgKzIwMTgsNiBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZUNvdW50ID0KICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSAvIDEwMDA7CiAKLSAgICAgICAgLy8gVGhlIGRvTm90UmVjb25uZWN0IG1lYW5zIEF1ZGlvU2luayB3aWxsIHNpZ25hbCBiYWNrIGFuZCBsZXQgTnVQbGF5ZXIyIHRvIHJlLWNvbnN0cnVjdAotICAgICAgICAvLyBBdWRpb1NpbmsuIFdlIGRvbid0IHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3MgdmlkZW8gYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGEgdmlkZW8gc2VlayB0bwotICAgICAgICAvLyB0aGUgcHJldmlvdXMgSSBmcmFtZS4gQnV0IHdlIGRvIHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3Mgb25seSBhdWRpbyBiZWNhdXNlIGl0IHdpbGwgZ2l2ZQotICAgICAgICAvLyBOdVBsYXllcjIgYSBjaGFuY2UgdG8gc3dpdGNoIGZyb20gbm9uLW9mZmxvYWQgbW9kZSB0byBvZmZsb2FkIG1vZGUuCi0gICAgICAgIC8vIFNvIHdlIG9ubHkgc2V0IGRvTm90UmVjb25uZWN0IHdoZW4gdGhlcmUncyBubyB2aWRlby4KLSAgICAgICAgY29uc3QgYm9vbCBkb05vdFJlY29ubmVjdCA9ICFoYXNWaWRlbzsKLQogICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gc2V0IG91ciBwbGF5YmFjayBzZXR0aW5ncyBpZiB0aGUgc2luayBpcyBjbG9zZWQuCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKSAhPSBPSywKICAgICAgICAgICAgICAgICAib25PcGVuQXVkaW9TaW5rOiBjYW4ndCBzZXQgcGxheWJhY2sgcmF0ZSBvbiBjbG9zZWQgc2luayIpOwpAQCAtMjA0MCwxMiArMjAyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coIm9wZW5BdWRpb1Npbms6IG5vbiBvZmZsb2FkZWQgb3BlbiBmYWlsZWQgc3RhdHVzOiAlZCIsIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKaW5kZXggNjJjZjBkOC4uZDA2NWRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKICNpbmNsdWRlICJOdVBsYXllcjIuaCIKIApAQCAtMjgsNyArMjksNyBAQAogY2xhc3MgIEpXYWtlTG9jazsKIHN0cnVjdCBNZWRpYUNsb2NrOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0zOCw2ICszOSw3IEBACiAgICAgUmVuZGVyZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAogICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0LAogICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CiAKICAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKApAQCAtMTU2LDcgKzE1OCw3IEBACiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZT4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwpAQCAtMTY3LDcgKzE2OSw2IEBACiAgICAgaW50MzJfdCBtQXVkaW9FT1NHZW5lcmF0aW9uOwogCiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7Ci0gICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsgLy8gYXVkaW8gdHJhY2sgcmF0ZQogCiAgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CiAgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCmluZGV4IDY2MjIzNWYuLjkyOThhOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaApAQCAtNjksNyArNjksNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcykgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAKaW5kZXggNzBiYzBhOS4uYTcwMjY5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAKQEAgLTk2LDcgKzk2LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgeworLy8gVE9ETzogZmV0Y2ggZGF0YSBzdGFydGluZyBmcm9tIHxzdGFydFRpbWVVc3wKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3QgLyogc3RhcnRUaW1lVXMgKi8pIHsKICAgICBpZiAobUlzU0RQICYmIG1IVFRQU2VydmljZSA9PSBOVUxMKSB7CiAgICAgICAgIG5vdGlmeVByZXBhcmVkKEJBRF9WQUxVRSk7CiAgICAgICAgIHJldHVybjsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AiKTsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcDIiKTsKICAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKIAogICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKaW5kZXggNzEyYzNlNS4uZTVmMTcxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCA3NDIzNmNiLi40NmExYzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKQEAgLTI0LDExICsyNSwxMSBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCkBAIC02Myw4ICs2NCw2IEBACiAKICAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggOTZmNzllMC4uZGE5NTgxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC0xNjI3LDcgKzE2MjYsNyBAQAogICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CkBAIC0xODE2LDcgKzE4MTUsNyBAQAogICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cmlidXRlcyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggNDIwNjY0Ny4uM2ZhOGUzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNTM3LDQgKzUzNywxMyBAQAogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgeworICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCBkMmU2ODFmLi4zMDNjZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTEwOSw2ICsxMDksNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGUzYWUwMmUuLmQxMTEzMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgpAQCAtMjAxLDcgKzIwMyw3IEBACiAgICAgfQogICAgIG1BbmFseXRpY3NEaXJ0eSA9IGZhbHNlOwogICAgIGlmIChyZWluaXRpYWxpemUpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlSZWNvcmRlcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVJlY29yZGVyKTsKICAgICB9CiB9CiAKQEAgLTk0OCw2ICs5NTAsMTAgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwT2dnUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7CkBAIC0xMDEzLDYgKzEwMTksNyBAQAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKICAgICAgICAgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKQEAgLTExMTMsNiArMTEyMCw5IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwpAQCAtMTE2OSw2ICsxMTc5LDEzIEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBPZ2dSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9PR0cpOworCisgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIobU91dHB1dEZkKTsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CkBAIC0xNzQ1LDEzICsxNzYyLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBFbmFibGUgdGVtcG9yYWwgbGF5ZXJpbmcgaWYgdGhlIGV4cGVjdGVkIChtYXgpIHBsYXliYWNrIGZyYW1lIHJhdGUgaXMgZ3JlYXRlciB0aGFuIH4xMSUgb2YKKyAgICAvLyB0aGUgbWluaW11bSBkaXNwbGF5IHJlZnJlc2ggcmF0ZSBvbiBhIHR5cGljYWwgZGV2aWNlLiBBZGQgbGF5ZXJzIHVudGlsIHRoZSBiYXNlIGxheWVyIGZhbGxzCisgICAgLy8gdW5kZXIgdGhpcyBsaW1pdC4gQWxsb3cgZGV2aWNlIG1hbnVmYWN0dXJlcnMgdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdC4KKworICAgIC8vIFRPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGUgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgc3RkOjpzdHJpbmcgbWF4QmFzZUxheWVyRnBzUHJvcGVydHkgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5tZWRpYS5yZWNvcmRlci1tYXgtYmFzZS1sYXllci1mcHMiLCAiIik7CisgICAgZmxvYXQgbWF4QmFzZUxheWVyRnBzID0gKGZsb2F0KTo6YXRvZihtYXhCYXNlTGF5ZXJGcHNQcm9wZXJ0eS5jX3N0cigpKTsKKyAgICAvLyBUUklDS1k6IHVzZSAhPiB0byBmaXggdXAgYW55IE5hTiB2YWx1ZXMKKyAgICBpZiAoIShtYXhCYXNlTGF5ZXJGcHMgPj0ga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjkpKSB7CisgICAgICAgIG1heEJhc2VMYXllckZwcyA9IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45OworICAgIH0KKwogICAgIGZvciAodWludDMyX3QgdHJ5TGF5ZXJzID0gMTsgdHJ5TGF5ZXJzIDw9IGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzOyArK3RyeUxheWVycykgewogICAgICAgICBpZiAodHJ5TGF5ZXJzID4gdHNMYXllcnMpIHsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gdHJ5TGF5ZXJzOwogICAgICAgICB9CiAgICAgICAgIC8vIGtlZXAgZ29pbmcgdW50aWwgdGhlIGJhc2UgbGF5ZXIgZnBzIGZhbGxzIGJlbG93IHRoZSB0eXBpY2FsIGRpc3BsYXkgcmVmcmVzaCByYXRlCiAgICAgICAgIGZsb2F0IGJhc2VMYXllckZwcyA9IG1heFBsYXliYWNrRnBzIC8gKDEgPDwgKHRyeUxheWVycyAtIDEpKTsKLSAgICAgICAgaWYgKGJhc2VMYXllckZwcyA8IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45KSB7CisgICAgICAgIGlmIChiYXNlTGF5ZXJGcHMgPCBtYXhCYXNlTGF5ZXJGcHMpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgxMyw2ICsxODQzLDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE4OTQsMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CkBAIC0yMjM5LDYgKzIyNjksMTIgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li5hMjkyZTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKLQorICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTE2Niw2ICsxNjYsNyBAQAogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwT2dnUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAzMTE5OTUwLi4wYWQ0ZDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTE1MSwxMyArMTUxLDEzIEBACiAKICAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7Ci0gICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCA2OTQyMzVhLi41YTU4YWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0xNTUwLDYgKzE1NTAsMTYgQEAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1QcmVwYXJpbmcpIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChmaW5hbFN0YXR1cyk7CisgICAgICAgICAgICBtUHJlcGFyaW5nID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CisgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCBjZjc1YWVjLi4zMzg4MDk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTY1OSwyMCArNjU5LDMxIEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gLTE7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7Ci0gICAgICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOwotICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrID09IC0xICYmIG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ0NEZWNvZGVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgKz0gaW5iYW5kVHJhY2tzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCmluZGV4IDdmNDc3M2IuLjAxNTZhZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcApAQCAtMjAwLDYgKzIwMCwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1ttU2VsZWN0ZWRUcmFja107CisgICAgICAgIGlmICh0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDggfHwgdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4KSB7CisgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKIGJvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKaW5kZXggZjMxMGYzNy4uMzdiODIzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwogICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKICAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKICAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggNGFkNmVhYi4uMmYwZGEyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTEwNywxMCArMTA3LDE2IEBACiB9CiAKIHNwPEFNZXNzYWdlPiBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0U3RhdHMoKSBjb25zdCB7CisKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKQEAgLTY3Nyw3ICs2ODMsNyBAQAogICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKLSAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwogICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOwogICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKQEAgLTc0OCw3ICs3NTQsNyBAQAogICAgIHJlcGx5LT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CiAKICAgICBpZiAoZW9zKSB7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIEFMT0dWKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKQEAgLTEwMjgsNyArMTAzNCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bWUtYXQtbWVkaWFUaW1lVXMiLCAmcmVzdW1lQXRNZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylyZXN1bWVBdE1lZGlhVGltZVVzKTsKICAgICAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgfQpAQCAtMTA2OSw2ICsxMDc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGI4M2U3NjYuLjJiODEzZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNTMsNiArNTMsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZwcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKQEAgLTk2LDcgKzk3LDcgQEAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCiAgICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7CisgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UGxheWVyKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwpAQCAtMzI4LDcgKzMyOSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdGFydCgpIHsKLSAgICBBTE9HRCgic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOworICAgIEFMT0dWKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gc3RhcnRfbCgpOwogfQpAQCAtNDcwLDcgKzQ3MSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSkgewotICAgIEFMT0dEKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKKyAgICBBTE9HVigic2Vla1RvKCVwKSAoJWQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIG1zZWMsIG1vZGUsIG1TdGF0ZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwTEw7CkBAIC01NzcsNiArNTc4LDEwIEBACiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1BsYXllckZyYW1lUmF0ZSwgKGRvdWJsZSkgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKQEAgLTYwMiw2ICs2MDcsNyBAQAogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisKICAgICB9CiAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwpAQCAtNjI5LDcgKzYzNSw3IEBACiAKICAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KICAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJudXBsYXllciIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJudXBsYXllciIpOwogICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KQEAgLTk1OSw3ICs5NjUsNyBAQAogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAogICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKKyAgICBBTE9HVigibm90aWZ5TGlzdGVuZXJfbCglcCksICglZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKICAgICAgICAgICAgIHRoaXMsIG1zZywgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYmRlMDg2Mi4uMmQwYzllMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0xNTksOCArMTU5LDEyIEBACiAgICAgaWYgKGRybSAhPSBOVUxMKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHNzaERSTXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIERybVVVSUQgdXVpZCA9IHBzc2hEUk1zW2ldOwotICAgICAgICAgICAgaWYgKGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5wdHIoKSwgU3RyaW5nOCgpKSkKKyAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5wdHIoKSwgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93biwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREUk1zLmFkZCh1dWlkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGRybS5jbGVhcigpOwpAQCAtMjM5LDggKzI0MywxNCBAQAogICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKQogewogICAgIC8vIHNpemUgbmVlZGVkIHRvIHN0b3JlIGFsbCB0aGUgY3J5cHRvIGRhdGEKLSAgICBzaXplX3QgY3J5cHRvc2l6ZSA9IHNpemVvZihDcnlwdG9JbmZvKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlczsKKyAgICBzaXplX3QgY3J5cHRvc2l6ZTsKKyAgICAvLyBzaXplb2YoQ3J5cHRvSW5mbykgKyBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlczsKKyAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpLCBudW1TdWJTYW1wbGVzLCAmY3J5cHRvc2l6ZSkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coY3J5cHRvc2l6ZSwgc2l6ZW9mKENyeXB0b0luZm8pLCAmY3J5cHRvc2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoImNyeXB0byBzaXplIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIENyeXB0b0luZm8gKnJldCA9IChDcnlwdG9JbmZvKikgbWFsbG9jKGNyeXB0b3NpemUpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiY291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIiwgY3J5cHRvc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNDk5MjEzNy4uNjVkNmQ2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC04Nyw2ICs4OSwyMCBAQAogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6a01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcyA9IDEwMDAwMGxsOwogCitzdGF0aWMgYXVkaW9fZm9ybWF0X3QgY29uc3RleHByIGF1ZGlvRm9ybWF0RnJvbUVuY29kaW5nKGludDMyX3QgcGNtRW5jb2RpbmcpIHsKKyAgICBzd2l0Y2ggKHBjbUVuY29kaW5nKSB7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtOGJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7IC8vIFRPRE86IGRvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzPworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBlbmNvZGluZzogJWQiLCBfX2Z1bmNfXywgcGNtRW5jb2RpbmcpOworICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgfQorfQorCiBOdVBsYXllcjo6UmVuZGVyZXI6OlJlbmRlcmVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLApAQCAtMTg4Myw4ICsxODk5LDEzIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CiAKKyAgICAvLyByZWFkIHBjbSBlbmNvZGluZyBmcm9tIE1lZGlhQ29kZWMgb3V0cHV0IGZvcm1hdCwgaWYgYXZhaWxhYmxlCisgICAgaW50MzJfdCBwY21FbmNvZGluZzsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpID8KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcocGNtRW5jb2RpbmcpIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwgbWltZS5jX3N0cigpKTsKQEAgLTE5ODYsNyArMjAwNyw3IEBACiAgICAgICAgIGNvbnN0IFBjbUluZm8gaW5mbyA9IHsKICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCAvLyBUT0RPOiBjaGFuZ2UgdG8gYXVkaW9Gb3JtYXQKKyAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlCiAgICAgICAgIH07CkBAIC0yMDI1LDcgKzIwNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLApAQCAtMjA4Myw0ICsyMTA0LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggYTA0Nzk3NS4uYTUyMWY2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yOCw3ICsyOCw3IEBACiBjbGFzcyAgQVdha2VMb2NrOwogc3RydWN0IE1lZGlhQ2xvY2s7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U7CiAKIHN0cnVjdCBOdVBsYXllcjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZT4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlODZiNjhhLi5mOGM4OWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMTEsMTAgKzExLDkgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICBdLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAppbmRleCA3NGFhZjc3Li4xMTg4MzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTMsOSArMywxMyBAQAogICAgIG5hbWU6ICJsaWJuYmxvZyIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiRW50cnkuY3BwIiwKKyAgICAgICAgIk1lcmdlci5jcHAiLAogICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAorICAgICAgICAiUmVhZGVyLmNwcCIsCiAgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAorICAgICAgICAiVGltZWxpbmUuY3BwIiwKKyAgICAgICAgIldyaXRlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTMsOSArMTcsMTQgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcCBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitpbnQgRW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKKyAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1FdmVudDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gKGludCkgKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOyAgIC8vIEZJWE1FIGlzIHRoaXMgYW4gZXJyb3I/CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkgICAvLyBEdW1teSBpbml0aWFsaXphdGlvbi4KKyAgICA6IG1QdHIobnVsbHB0cikKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKKyAgICA6IG1QdHIoZW50cnkpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpCisgICAgOiBtUHRyKG90aGVyLm1QdHIpCit7Cit9CisKK2NvbnN0IGVudHJ5JiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreworICAgIHJldHVybiAqKGVudHJ5KikgbVB0cjsKK30KKworY29uc3QgZW50cnkqIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdAoreworICAgIHJldHVybiAoZW50cnkqKSBtUHRyOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkKK3sKKyAgICBtUHRyICs9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKQoreworICAgIG1QdHIgLT0gbVB0cltFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gKythdXg7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiAtLWF1eDsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyICE9IG90aGVyLm1QdHI7Cit9CisKK2ludCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgLSBvdGhlci5tUHRyOworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBtUHRyW21QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKKyAgICAgICAgRW50cnk6OmtPdmVyaGVhZCArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICBkc3QtPndyaXRlKG1QdHIsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdAoreworICAgIG1lbWNweSgodm9pZCopIGRzdCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKQoreworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7CisgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKKyAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Cit9CisKK2NvbnN0IGNoYXIgKkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdAoreworICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKK30KKworc2l6ZV90IEZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAorICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SKSB7CisgICAgICAgICsraXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Cit9CisKK2xvZ19oYXNoX3QgRm9ybWF0RW50cnk6Omhhc2goKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAorICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOworICAgIHJldHVybiBoYXNoOworfQorCitpbnQgRm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCisgICAgcmV0dXJuIGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IgPyBpdC5wYXlsb2FkPGludD4oKSA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIGl0LmNvcHlUbyhkc3QpOyAgICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgdGltZXN0YW1wCisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IGhhc2gKKyAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5CisgICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IEVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKKyAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0ZNVF9BVVRIT1I7CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KKyAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQorICAgICAgICBzaXplb2YoYXV0aG9yKTsKKyAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7CisgICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKKyAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcworICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRk1UX0VORCkgeworICAgICAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICB9CisgICAgaXQuY29weVRvKGRzdCk7CisgICAgKytpdDsKKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgSGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOworfQorCitsb2dfaGFzaF90IEhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKK30KKworaW50IEhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKKyAgICByZXR1cm4gaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKQorICAgICAgICAgICAgPyBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3IgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgorICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KKyAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOworICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgorICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOworICAgIC8vIENvcHkgdGhlIGF1dGhvcgorICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKKyAgICAvLyBVcGRhdGUgbGVuZ3RocworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCisgICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KKyAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDZkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8anNvbi9qc29uLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworTWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK3ZvaWQgTWVyZ2VyOjphZGRSZWFkZXIoY29uc3Qgc3A8UmVhZGVyPiAmcmVhZGVyKQoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgorICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCisgICAgbVJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Cit9CisKKy8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKKy8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCitzdHJ1Y3QgTWVyZ2VJdGVtCit7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgaW5kZXg7CisgICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Cit9OworCitib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpCit7CisgICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOworfQorCisvLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Cit2b2lkIE1lcmdlcjo6bWVyZ2UoKQoreworICAgIGlmICh0cnVlKSByZXR1cm47IC8vIE1lcmdpbmcgaXMgbm90IG5lY2Vzc2FyeSBhdCB0aGUgbW9tZW50LCBzbyB0aGlzIGlzIHRvIGRpc2FibGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYnlwYXNzIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IG1lbWJlciB2YXJpYWJsZXMgbm90IGJlaW5nIHVzZWQuCisgICAgY29uc3QgaW50IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgc3RkOjp2ZWN0b3I8RW50cnlJdGVyYXRvcj4gb2Zmc2V0czsKKyAgICBvZmZzZXRzLnJlc2VydmUobkxvZ3MpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICAgICAgb2Zmc2V0cy5wdXNoX2JhY2soc25hcHNob3RzW2ldLT5iZWdpbigpKTsKKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCisgICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKKyAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGFic3RyYWN0RW50cnkgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pOworICAgICAgICAgICAgaWYgKGFic3RyYWN0RW50cnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKGFic3RyYWN0RW50cnktPnRpbWVzdGFtcCgpLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7ICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKKyAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+CisgICAgICAgICAgICBjb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwgaW5kZXgpOworICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIHRpbWVzdGFtcHMucG9wKCk7CisgICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgeworICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgTWVyZ2VyOjpnZXRSZWFkZXJzKCkgY29uc3QKK3sKKyAgICAvL0F1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1SZWFkZXJzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQorICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgIk1lcmdlUmVhZGVyIiksIG1SZWFkZXJzKG1lcmdlci5nZXRSZWFkZXJzKCkpCit7Cit9CisKKy8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKKy8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCit2b2lkIE1lcmdlUmVhZGVyOjpwcm9jZXNzU25hcHNob3QoU25hcHNob3QgJnNuYXBzaG90LCBpbnQgYXV0aG9yKQoreworICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhW2F1dGhvcl07CisgICAgLy8gV2UgZG9uJ3QgZG8gImF1dG8gaXQiIGJlY2F1c2UgaXQgcmVkdWNlcyByZWFkYWJpbGl0eSBpbiB0aGlzIGNhc2UuCisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QuYmVnaW4oKTsgaXQgIT0gc25hcHNob3QuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogeworICAgICAgICAgICAgY29uc3QgSGlzdFRzRW50cnkgcGF5bG9hZCA9IGl0LnBheWxvYWQ8SGlzdFRzRW50cnk+KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKKyAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeShwYXlsb2FkLnRzKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZEluZm8gPSBpbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkUGFyYW1zID0gcGFyYW1zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEubGF0ZW5jeUhpc3QuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1vbm90b25pY01zID0gbW9ub3RvbmljTnMgKiAxZS02OworICAgICAgICAgICAgZGF0YS53b3JrSGlzdC5hZGQobW9ub3RvbmljTXMpOworICAgICAgICAgICAgZGF0YS5hY3RpdmUgKz0gbW9ub3RvbmljTnM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEud2FybXVwSGlzdC5hZGQodGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudW5kZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS5vdmVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBBTE9HVygid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCit7CisgICAgLy8gZ2V0IGEgc25hcHNob3Qgb2YgZWFjaCByZWFkZXIgYW5kIHByb2Nlc3MgdGhlbQorICAgIC8vIFRPRE8gaW5zZXJ0IGxvY2sgaGVyZQorICAgIGNvbnN0IHNpemVfdCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICB9CisgICAgLy8gVE9ETyB1bmxvY2sgbG9jayBoZXJlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIGlmIChzbmFwc2hvdHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJvY2Vzc1NuYXBzaG90KCooc25hcHNob3RzW2ldKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKTsKK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Y2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKQoreworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoYXV0byYgaXRlbSA6IG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAobm93IC0gZGF0YS5zdGFydCA+PSBrUGVyaW9kaWNNZWRpYU1ldHJpY3NQdXNoKSB7CisgICAgICAgICAgICAodm9pZClSZXBvcnRQZXJmb3JtYW5jZTo6c2VuZFRvTWVkaWFNZXRyaWNzKGRhdGEpOworICAgICAgICAgICAgZGF0YS5yZXNldCgpOyAgIC8vIGRhdGEgaXMgcGVyc2lzdGVudCBwZXIgdGhyZWFkCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAorICAgIC8vIE9wdGlvbnMgZm9yIGR1bXBzeXMKKyAgICBib29sIHBhID0gZmFsc2UsIGpzb24gPSBmYWxzZSwgcGxvdHMgPSBmYWxzZSwgcmV0cm8gPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFyZyA6IGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wYSIpKSB7CisgICAgICAgICAgICBwYSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLWpzb24iKSkgeworICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXBsb3RzIikpIHsKKyAgICAgICAgICAgIHBsb3RzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcmV0cm8iKSkgeworICAgICAgICAgICAgcmV0cm8gPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwYSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgMCAvKmluZGVudCovLCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CisgICAgfQorICAgIGlmIChqc29uKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSnNvbihmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChwbG90cykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFBsb3RzKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHJldHJvKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUmV0cm8oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KQoreworICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKKyAgICBpZiAoYXV0aG9yID09IC0xKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCisgICAgY29uc3QgY2hhciogbmFtZSA9IG1SZWFkZXJzW2F1dGhvcl0tPm5hbWUoKS5jX3N0cigpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCisgICAgOiBtTWVyZ2VyKG1lcmdlciksCisgICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAorICAgICAgbVRpbWVvdXRVcygwKQoreworfQorCitNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkKK3sKKyAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBzZXRUaW1lb3V0VXMoMCk7CisgICAgam9pbigpOworfQorCitib29sIE1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBib29sIGRvTWVyZ2U7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCisgICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIG1lcmdlLiBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiB3YWtpbmcgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgICAgICAvLyBpcyBoYW5kbGVkIGluIEF1ZGlvRmxpbmdlcjo6TWVkaWFMb2dOb3RpZmllcjo6dGhyZWFkTG9vcCgpLgorICAgICAgICBtQ29uZC53YWl0KG1NdXRleCk7CisgICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKKyAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKKyAgICB9CisgICAgaWYgKGRvTWVyZ2UpIHsKKyAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycworICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKKyAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKKyAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQorICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjp3YWtldXAoKQoreworICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgbVRpbWVvdXRVcyA9IHRpbWU7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZhM2UzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBOQkxvZzo6RW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAotewotICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKLSAgICBpZiAob2Zmc2V0ID09IDApCi0gICAgICAgIHJldHVybiBtRXZlbnQ7Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IDEpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLypzdGF0aWMqLwotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpBYnN0cmFjdEVudHJ5PiBOQkxvZzo6QWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKLSAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1OQkxvZzo6QWJzdHJhY3RFbnRyeTo6QWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKLX0KLQotY29uc3QgY2hhciAqTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOwotfQotCi1zaXplX3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgKytpdDsKLSAgICB9Ci0gICAgcmV0dXJuIGl0OwotfQotCi1pbnQ2NF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6Rm9ybWF0RW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOwotICAgIHJldHVybiBoYXNoOwotfQotCi1pbnQgTkJMb2c6OkZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCi0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ+KCk7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICAvLyBjb3B5IHRpbWVzdGFtcAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgICAgLy8gY29weSBoYXNoCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOwotICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKLSAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKLSAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0FVVEhPUjsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQotICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQotICAgICAgICBzaXplb2YoYXV0aG9yKTsKLSAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7Ci0gICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKLSAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcwotICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICB9Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQ7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0IHsKLSAgICBzaXplX3QgbGVuZ3RoID0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIGRzdC0+d3JpdGUocHRyLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0IHsKLSAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkKLSAgICA6IHB0cihudWxscHRyKSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKLSAgICA6IHB0cihlbnRyeSkge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKQotICAgIDogcHRyKG90aGVyLnB0cikge30KLQotY29uc3QgTkJMb2c6OmVudHJ5JiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqKGVudHJ5KikgcHRyOwotfQotCi1jb25zdCBOQkxvZzo6ZW50cnkqIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QgewotICAgIHJldHVybiAoZW50cnkqKSBwdHI7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgICBwdHIgKz0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgewotICAgIHB0ciAtPSBwdHJbTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuICsrYXV4OwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuIC0tYXV4OwotfQotCi1pbnQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyIC0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAhPSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gcHRyW3B0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDY0X3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Ci19Ci0KLWludCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7Ci0gICAgaWYgKGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgotICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KLSAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOwotICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgotICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOwotICAgIC8vIENvcHkgdGhlIGF1dGhvcgotICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKLSAgICAvLyBVcGRhdGUgbGVuZ3RocwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCi0gICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KLSAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBOQkxvZy5oCi1OQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCi0gICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCi0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCi17Ci0gICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Ci19Ci0KLU5CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKLXsKLSAgICBtU2hhcmVkLT5+U2hhcmVkKCk7Ci0gICAgaWYgKG1Pd24pIHsKLSAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLypzdGF0aWMqLwotc2l6ZV90IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCi0gICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcigpCi0gICAgOiBtU2hhcmVkKE5VTEwpLCBtRmlmbyhOVUxMKSwgbUZpZm9Xcml0ZXIoTlVMTCksIG1FbmFibGVkKGZhbHNlKSwgbVBpZFRhZyhOVUxMKSwgbVBpZFRhZ1NpemUoMCkKLXsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKLXsKLSAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOwotICAgIGNoYXIgcHJvY05hbWVbMTZdOwotICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOwotICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCi0gICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7Ci0gICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOwotICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07Ci0gICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7Ci0gICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6V3JpdGVyOjp+V3JpdGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9Xcml0ZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotICAgIGRlbGV0ZVtdIG1QaWRUYWc7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOwotICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7Ci0gICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7Ci0gICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKLSAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwotICAgIH0KLSAgICBpZiAobGVuZ3RoID49IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQ2NF90IHRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmICh0cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0lOVEVHRVIsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9GTE9BVCwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUQVJUX0ZNVCwgZm10LCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGVudHJ5ID0gRW50cnkoRVZFTlRfRU5EX0ZNVCwgTlVMTCwgMCk7Ci0gICAgbG9nKCZlbnRyeSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIaXN0VHNFbnRyeSBkYXRhOwotICAgIGRhdGEuaGFzaCA9IGhhc2g7Ci0gICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgaGFzaCk7Ci0gICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGY7Ci0gICAgY2hhciogczsKLSAgICBpbnQ2NF90IHQ7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci0gICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBpZiAoKnAgIT0gJyUnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goKisrcCkgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZyhzKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ0ludGVnZXIoaSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIGYgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ0Zsb2F0KChmbG9hdClmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nUElEKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCi0gICAgICAgIGNhc2UgJ1wwJzoKLSAgICAgICAgICAgIC0tcDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCi0gICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQotICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKLSAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7Ci0gICAgbG9nKCZldHIsIHRydWUgLyp0cnVzdGVkKi8pOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBOQkxvZzo6RW50cnkgKmV0ciwgYm9vbCB0cnVzdGVkKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXRydXN0ZWQpIHsKLSAgICAgICAgbG9nKGV0ci0+bUV2ZW50LCBldHItPm1EYXRhLCBldHItPm1MZW5ndGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBuZWVkID0gZXRyLT5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTwotCi0gICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgotICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCi0gICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCi0gICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07Ci0gICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgewotICAgICAgICB0ZW1wW2ldID0gZXRyLT5jb3B5RW50cnlEYXRhQXQoaSk7Ci0gICAgfQotICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgotICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtRW5hYmxlZDsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBib29sIG9sZCA9IG1FbmFibGVkOwotICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7Ci0gICAgcmV0dXJuIG9sZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcigpCi0gICAgOiBXcml0ZXIoKQotewotfQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCi17Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nKHN0cmluZyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciB0aGUgY2xvY2tfZ2V0dGltZSgpIHN5c2NhbGwKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0cyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSW50ZWdlcih4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dGbG9hdCh4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dQSUQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dQSUQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci19Ci0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dFbmQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjpzdGFydGluZ1R5cGVzIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX1NUQVJUX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjplbmRpbmdUeXBlcyAgIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX0VORF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtRmQoLTEpLCBtSW5kZW50KDApLCBtTG9zdCgwKSwKLSAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQotewotfQotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpSZWFkZXI6On5SZWFkZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci19Ci0KLWNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7Ci0gICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgICAgIGlmIChwcmV2IDwgZnJvbnQgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2spIHsKLQotICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlcy5maW5kKChjb25zdCBFdmVudCkgcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldKSAhPSB0eXBlcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgYmFjayA9IHByZXY7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAotfQotCi0vLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90Ci0vLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCi0vLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4gTkJMb2c6OlJlYWRlcjo6Z2V0U25hcHNob3QoKQotewotICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0gICAgLy8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCB3cml0ZXIKLSAgICBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKLQotICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQotICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCi0gICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgotICAgIHNpemVfdCBsb3N0OwotICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOwotICAgIHNzaXplX3QgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3QpOwotICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOwotICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOwotICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgewotICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKLSAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKLSAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKLSAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBFTkRfRk1UKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCi0gICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQotCi0gICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOwotICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOwotCi0gICAgLy8gRmluZCBsYXN0IEVORF9GTVQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KLSAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9FTkRfRk1ULgotICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgYmFjaywgZW5kaW5nVHlwZXMpOwotICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEVORF9GTVQgZW50cnkKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKLSAgICAgICAgLy8gZmluZCBmaXJzdCBTVEFSVF9GTVQKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIHN0YXJ0aW5nVHlwZXMpKQotICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBTVEFSVF9GTVQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCi0gICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCi0gICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7Ci0KLSAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OwotICAgIHJldHVybiBzbmFwc2hvdDsKLQotfQotCi0vLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCi0vLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdChOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCi17Ci0gICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7Ci0KLSAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKLSAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAotICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHRzKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHMgaWYgdW51c2VkCi0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0VORF9GTVQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogZ290IHRvIGVuZCBmb3JtYXQgZXZlbnQiKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZW50cnktPnR5cGUpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBwcmludCB0aGUgd2FybmluZ3MgaGVyZSBvciBlbHNld2hlcmUKLSAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKLXsKLSAgICAvLyBnZXQgYSBzbmFwc2hvdCwgcHJvY2VzcyBpdAotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcCA9IGdldFNuYXBzaG90KCk7Ci0gICAgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCpzbmFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBpbnQgaW5kZW50KSB7Ci0gICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCi0gICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIGluZGVudCwgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOwotfQotCi0vLyBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcExpbmUoY29uc3QgU3RyaW5nOCAmdGltZXN0YW1wLCBTdHJpbmc4ICZib2R5KQotewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBkcHJpbnRmKG1GZCwgIiUuKnMlcyAlc1xuIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIiUuKnMlcyAlcyIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0KLSAgICBib2R5LmNsZWFyKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OlJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAotewotICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50NjRfdCB0czsKLSAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludCB4ID0gKigoaW50KikgZGF0YSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBmbG9hdCBmOwotICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOwotICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjsKLSAgICBzdHIuYXBwZW5kKCJbICIpOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOwotICAgIH0KLSAgICBzdHIuYXBwZW5kKCJdIik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKLXsKLSAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6UmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSkgewotICAgIC8vIGxvZyB0aW1lc3RhbXAKLSAgICBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7Ci0gICAgdGltZXN0YW1wLT5jbGVhcigpOwotICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLQotICAgIC8vIGxvZyB1bmlxdWUgaGFzaAotICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKLSAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKLQotICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCi0gICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKLQotICAgIC8vIGxvZyBzdHJpbmcKLSAgICBOQkxvZzo6RW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7Ci0KLSAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKLSAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOwotCi0gICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKLSAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiUlIiIKLSAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlXDAiCi0gICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTkJMb2c6OkV2ZW50IGV2ZW50ID0gKE5CTG9nOjpFdmVudCkgYXJnLT50eXBlOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7Ci0KLSAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAotCi0gICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncwotICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1NUUklORywKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1RJTUVTVEFNUCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZMT0FULAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfUElELAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKLSAgICAgICAgfQotICAgICAgICArK2FyZzsKLSAgICB9Ci0gICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0VORF9GTVQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOwotICAgICsrYXJnOwotICAgIHJldHVybiBhcmc7Ci19Ci0KLU5CTG9nOjpNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKLSAgICAgIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IE5CTG9nOjpOYW1lZFJlYWRlciAmcmVhZGVyKSB7Ci0KLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgbU5hbWVkUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKLX0KLQotLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQotLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KLXN0cnVjdCBNZXJnZUl0ZW0KLXsKLSAgICBpbnQ2NF90IHRzOwotICAgIGludCBpbmRleDsKLSAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KLX07Ci0KLS8vIG9wZXJhdG9ycyBuZWVkZWQgZm9yIHByaW9yaXR5IHF1ZXVlIGluIG1lcmdlCi0vLyBib29sIG9wZXJhdG9yPihjb25zdCBpbnQ2NF90ICZ0MSwgY29uc3QgaW50NjRfdCAmdDIpIHsKLS8vICAgICByZXR1cm4gdDEudHZfc2VjID4gdDIudHZfc2VjIHx8ICh0MS50dl9zZWMgPT0gdDIudHZfc2VjICYmIHQxLnR2X25zZWMgPiB0Mi50dl9uc2VjKTsKLS8vIH0KLQotYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKSB7Ci0gICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOwotfQotCi0vLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Ci12b2lkIE5CTG9nOjpNZXJnZXI6Om1lcmdlKCkgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IG1lcmdlIHRocmVhZAotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBpbnQgbkxvZ3MgPSBtTmFtZWRSZWFkZXJzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOwotICAgIHN0ZDo6dmVjdG9yPE5CTG9nOjpFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzKG5Mb2dzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKLSAgICAgICAgc25hcHNob3RzW2ldID0gbU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+Z2V0U25hcHNob3QoKTsKLSAgICAgICAgb2Zmc2V0c1tpXSA9IHNuYXBzaG90c1tpXS0+YmVnaW4oKTsKLSAgICB9Ci0gICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCi0gICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKLSAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKLSAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKLSAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsKLSAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAotICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT5jb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICAgICAgIHRpbWVzdGFtcHMucG9wKCk7Ci0gICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBzdGQ6OnZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+JiBOQkxvZzo6TWVyZ2VyOjpnZXROYW1lZFJlYWRlcnMoKSBjb25zdCB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICByZXR1cm4gbU5hbWVkUmVhZGVyczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCi0gICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplKSwgbU5hbWVkUmVhZGVycyhtZXJnZXIuZ2V0TmFtZWRSZWFkZXJzKCkpIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgTkJMb2c6OkFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KSB7Ci0gICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOwotICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jawotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtTmFtZWRSZWFkZXJzW2F1dGhvcl0ubmFtZSgpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChOQkxvZzo6TWVyZ2VyICZtZXJnZXIsIE5CTG9nOjpNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCi0gICAgOiBtTWVyZ2VyKG1lcmdlciksCi0gICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAotICAgICAgbVRpbWVvdXRVcygwKSB7fQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpIHsKLSAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCi0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBzZXRUaW1lb3V0VXMoMCk7Ci0gICAgam9pbigpOwotfQotCi1ib29sIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBib29sIGRvTWVyZ2U7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCi0gICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIHdhaXQga1RocmVhZFNsZWVwUGVyaW9kVXMgYW5kIHRoZW4gbWVyZ2UKLSAgICAgICAgbnNlY3NfdCB3YWl0VGltZSA9IG1UaW1lb3V0VXMgPiAwID8ga1RocmVhZFNsZWVwUGVyaW9kVXMgKiAxMDAwIDogTExPTkdfTUFYOwotICAgICAgICBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZSk7Ci0gICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKLSAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKLSAgICB9Ci0gICAgaWYgKGRvTWVyZ2UpIHsKLSAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycwotICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7Ci0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKLSAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKLSAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQotICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6d2FrZXVwKCkgewotICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKSB7Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgbVRpbWVvdXRVcyA9IHRpbWU7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAppbmRleCBmMDllOTNkLi5lOTFhNTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApAQCAtMTcsMTMgKzE3LDE2IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiUGVyZm9ybWFuY2VBbmFseXNpcyIKIC8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyAjZGVmaW5lIFdSSVRFX1RPX0ZJTEUKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjbGltaXRzPgogI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMzIsMjAgKzM1LDEyNiBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvTG9nUGxvdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAordm9pZCBIaXN0b2dyYW06OmFkZChkb3VibGUgdmFsdWUpCit7CisgICAgaWYgKG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRPRE8gSGFuZGxlIGRvbWFpbiBhbmQgcmFuZ2UgZXJyb3IgZXhjZXB0aW9ucz8KKyAgICBjb25zdCBpbnQgdW5ib3VuZGVkSW5kZXggPSBscm91bmQoKHZhbHVlIC0gbUxvdykgLyBtQmluU2l6ZSkgKyAxOworICAgIC8vIHN0ZDo6Y2xhbXAgaXMgaW50cm9kdWNlZCBpbiBDKysxNworICAgIC8vY29uc3QgaW50IGluZGV4ID0gc3RkOjpjbGFtcCh1bmJvdW5kZWRJbmRleCwgMCwgKGludCkobUJpbnMuc2l6ZSgpIC0gMSkpOworICAgIGNvbnN0IGludCBpbmRleCA9IHN0ZDo6bWF4KDAsIHN0ZDo6bWluKChpbnQpKG1CaW5zLnNpemUoKSAtIDEpLCB1bmJvdW5kZWRJbmRleCkpOworICAgIG1CaW5zW2luZGV4XSsrOworICAgIG1Ub3RhbENvdW50Kys7Cit9CisKK3ZvaWQgSGlzdG9ncmFtOjpjbGVhcigpCit7CisgICAgc3RkOjpmaWxsKG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpLCAwKTsKKyAgICBtVG90YWxDb3VudCA9IDA7Cit9CisKK3VpbnQ2NF90IEhpc3RvZ3JhbTo6dG90YWxDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Ub3RhbENvdW50OworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrRGl2aWRlciA9ICd8JzsKKyAgICBzcyA8PCBrVmVyc2lvbiA8PCAiLCIgPDwgbUJpblNpemUgPDwgIiwiIDw8IG1OdW1CaW5zIDw8ICIsIiA8PCBtTG93IDw8ICIseyI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQmlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUJpbnNbaV0gIT0gMCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIHNzIDw8ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8IHN0YXRpY19jYXN0PGludD4oaSkgLSAxIDw8IGtEaXZpZGVyIDw8IG1CaW5zW2ldOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcyA8PCAifSI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6YXNjaWlBcnRTdHJpbmcoc2l6ZV90IGluZGVudCkgY29uc3QgeworICAgIGlmICh0b3RhbENvdW50KCkgPT0gMCB8fCBtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrTWFya2VyID0gJy0nOworICAgIC8vIE9uZSBpbmNyZW1lbnQgaXMgY29uc2lkZXJlZCBvbmUgc3RlcCBvZiBhIGJpbidzIGhlaWdodC4KKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2Vyc1BlckluY3JlbWVudCA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heEluY3JlbWVudHMgPSA2NCArIDE7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heE51bWJlcldpZHRoID0gNzsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01hcmtlcnMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywga01hcmtlcik7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTcGFjZXMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywgJyAnKTsKKyAgICAvLyBnZXQgdGhlIGxhc3QgbiBjaGFyYWN0ZXJzIG9mIHMsIG9yIHRoZSB3aG9sZSBzdHJpbmcgaWYgaXQgaXMgc2hvcnRlcgorICAgIGF1dG8gZ2V0VGFpbCA9IFtdKGNvbnN0IHNpemVfdCBuLCBjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgICAgICByZXR1cm4gcy5jX3N0cigpICsgcy5zaXplKCkgLSBzdGQ6Om1pbihuLCBzLnNpemUoKSk7CisgICAgfTsKKworICAgIC8vIFNpbmNlIHRvdGFsQ291bnQoKSA+IDAsIG1CaW5zIGlzIG5vdCBlbXB0eSBhbmQgbWF4Q291bnQgPiAwLgorICAgIGNvbnN0IHVuc2lnbmVkIG1heENvdW50ID0gKnN0ZDo6bWF4X2VsZW1lbnQobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCkpOworICAgIGNvbnN0IHNpemVfdCBtYXhJbmNyZW1lbnRzID0gbG9nMihtYXhDb3VudCkgKyAxOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICAvLyBOb24temVybyBiaW5zIG11c3QgZXhpc3QgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHRvdGFsQ291bnQoKSA+IDAuCisgICAgc2l6ZV90IGZpcnN0Tm9uWmVyb0JpbiA9IDA7CisgICAgLy8gSWYgZmlyc3ROb25aZXJvQmluIHJlYWNoZXMgbUJpbnMuc2l6ZSgpIC0gMSwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGZpcnN0Tm9uWmVyb0JpbiA8IG1CaW5zLnNpemUoKSAtIDEgJiYgbUJpbnNbZmlyc3ROb25aZXJvQmluXSA9PSAwOyBmaXJzdE5vblplcm9CaW4rKykge30KKyAgICBjb25zdCBzaXplX3QgZmlyc3RCaW5Ub1ByaW50ID0gZmlyc3ROb25aZXJvQmluID09IDAgPyAwIDogZmlyc3ROb25aZXJvQmluIC0gMTsKKworICAgIHNpemVfdCBsYXN0Tm9uWmVyb0JpbiA9IG1CaW5zLnNpemUoKSAtIDE7CisgICAgLy8gSWYgbGFzdE5vblplcm9CaW4gcmVhY2hlcyAwLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgbGFzdE5vblplcm9CaW4gPiAwICYmIG1CaW5zW2xhc3ROb25aZXJvQmluXSA9PSAwOyBsYXN0Tm9uWmVyb0Jpbi0tKSB7fQorICAgIGNvbnN0IHNpemVfdCBsYXN0QmluVG9QcmludCA9IGxhc3ROb25aZXJvQmluID09IG1CaW5zLnNpemUoKSAtIDEgPyBsYXN0Tm9uWmVyb0JpbgorICAgICAgICAgICAgOiBsYXN0Tm9uWmVyb0JpbiArIDE7CisKKyAgICBmb3IgKHNpemVfdCBiaW4gPSBmaXJzdEJpblRvUHJpbnQ7IGJpbiA8PSBsYXN0QmluVG9QcmludDsgYmluKyspIHsKKyAgICAgICAgc3MgPDwgc3RkOjpzZXR3KGluZGVudCArIGtNYXhOdW1iZXJXaWR0aCk7CisgICAgICAgIGlmIChiaW4gPT0gMCkgeworICAgICAgICAgICAgc3MgPDwgIjwiOworICAgICAgICB9IGVsc2UgaWYgKGJpbiA9PSBtQmlucy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICBzcyA8PCAiPiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcyA8PCBtTG93ICsgKGJpbiAtIDEpICogbUJpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgIiB8IjsKKyAgICAgICAgc2l6ZV90IGluY3JlbWVudHMgPSAwOworICAgICAgICBjb25zdCB1aW50NjRfdCBiaW5Db3VudCA9IG1CaW5zW2Jpbl07CisgICAgICAgIGlmIChiaW5Db3VudCA+IDApIHsKKyAgICAgICAgICAgIGluY3JlbWVudHMgPSBsb2cyKGJpbkNvdW50KSArIDE7CisgICAgICAgICAgICBzcyA8PCBnZXRUYWlsKGluY3JlbWVudHMgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga01hcmtlcnMpOworICAgICAgICB9CisgICAgICAgIHNzIDw8IGdldFRhaWwoKG1heEluY3JlbWVudHMgLSBpbmNyZW1lbnRzICsgMSkgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga1NwYWNlcykKKyAgICAgICAgICAgICAgICA8PCBiaW5Db3VudCA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAvLyBHaXZlbiBhbiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXAsIGJ1Y2tldHMgdGhlIHRpbWUgaW50ZXJ2YWwKIC8vIHNpbmNlIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgaW50byBhIGhpc3RvZ3JhbSwgc2VhcmNoZXMgZm9yCiAvLyBvdXRsaWVycywgYW5hbHl6ZXMgdGhlIG91dGxpZXIgc2VyaWVzIGZvciB1bmV4cGVjdGVkbHkKQEAgLTIwOCwyNyArMzE3LDYgQEAKICAgICByZXR1cm4gaXNPdXRsaWVyOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGlmICh4IDwgMCkgewotICAgICAgICB3aWR0aCsrOwotICAgICAgICB4ID0geCA9PSBJTlRfTUlOID8gSU5UX01BWCA6IC14OwotICAgIH0KLSAgICAvLyBhc3NlcnQgKHggPj0gMCkKLSAgICBkbyB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIHggLz0gMTA7Ci0gICAgfSB3aGlsZSAoeCA+IDApOwotICAgIHJldHVybiB3aWR0aDsKLX0KLQotLy8gY29tcHV0ZXMgdGhlIGNvbHVtbiB3aWR0aCByZXF1aXJlZCBmb3IgYSBzcGVjaWZpYyBoaXN0b2dyYW0gdmFsdWUKLWlubGluZSBpbnQgbnVtYmVyV2lkdGgoZG91YmxlIG51bWJlciwgaW50IGxlZnRQYWRkaW5nKSB7Ci0gICAgLy8gQWRkZWQgdmFsdWVzIGFjY291bnQgZm9yIHdoaXRlc3BhY2VzIG5lZWRlZCBhcm91bmQgbnVtYmVycywgYW5kIGZvciB0aGUKLSAgICAvLyBkb3QgYW5kIGRlY2ltYWwgZGlnaXQgbm90IGFjY291bnRlZCBmb3IgYnkgd2lkdGhPZgotICAgIHJldHVybiBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKHN0YXRpY19jYXN0PGludD4obnVtYmVyKSkgKyAzLCAyKSwgbGVmdFBhZGRpbmcgKyAxKTsKLX0KLQogLy8gcm91bmRzIHZhbHVlIHRvIHByZWNpc2lvbiBiYXNlZCBvbiBsb2ctZGlzdGFuY2UgZnJvbSBtZWFuCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiBpbmxpbmUgZG91YmxlIGxvZ1JvdW5kKGRvdWJsZSB4LCBkb3VibGUgbWVhbikgewpAQCAtMjU0LDcgKzM0Miw3IEBACiAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzCiB2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCkgewotICAgIGlmIChtSGlzdHMuZW1wdHkoKSkgeworICAgIGlmIChtSGlzdHMuZW1wdHkoKSB8fCBib2R5ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjczLDY5ICszNjEsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHVuZGVyc2NvcmVzIGFuZCBzcGFjZXMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIG1heGltdW0gd2lkdGggb2YgaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrTGVuID0gMjAwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGRvdWJsZSBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKLSAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgYnVja2V0V2lkdGggPSBudW1iZXJXaWR0aChtYXhEZWx0YSwgbGVmdFBhZGRpbmcpOwotICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKLSAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKLSAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7Ci0gICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKLSAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMgJTMuMmYgJXMiLCBsZWZ0UGFkZGluZyArIDExLAotICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMlZCwgJWxsZCwgJWxsZFxuIiwgbGVmdFBhZGRpbmcgKyAxMSwKKyAgICBzdGF0aWMgY29uc3QgaW50IFNJWkUgPSAxMjg7CisgICAgY2hhciB0aXRsZVtTSVpFXTsKKyAgICBzbnByaW50Zih0aXRsZSwgc2l6ZW9mKHRpdGxlKSwgIlxuJXMgJTMuMmYgJXNcbiVzJWQsICVsbGQsICVsbGRcbiIsCisgICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86IiwKICAgICAgICAgICAgICJUaHJlYWQsIGhhc2gsIHN0YXJ0aW5nIHRpbWVzdGFtcDogIiwgYXV0aG9yLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KHN0YXJ0aW5nVHMpKTsKLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDEgPDwgcm93OwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCBsZWZ0UGFkZGluZywgc3BhY2VzLmNfc3RyKCkpOwotICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBidWNrZXRXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oc3RhcnRpbmdUcykpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0xhYmVsID0gIm1zIjsKIAotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqLipmIiwgY29sV2lkdGgsIDEsIHguZmlyc3QpOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGJ1Y2tldFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzIiwKKyAgICAgICAgICAgIGF1ZGlvX3V0aWxzX3Bsb3RfaGlzdG9ncmFtKGJ1Y2tldHMsIHRpdGxlLCBrTGFiZWwsIG1heEhlaWdodCkuY19zdHIoKSk7CiAKICAgICAvLyBOb3cgcmVwb3J0IGdsaXRjaGVzCiAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbnRpbWUgZWxhcHNlZCBiZXR3ZWVuIGdsaXRjaGVzIGFuZCBnbGl0Y2ggdGltZXN0YW1wczpcbiIpOwpAQCAtMzUwLDcgKzM4NSw5IEBACiAvLyB3cml0ZXMgc3VtbWFyeSBvZiBwZXJmb3JtYW5jZSBpbnRvIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IKIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQsIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICBTdHJpbmc4IGJvZHk7CisjaWZkZWYgV1JJVEVfVE9fRklMRQogICAgIGNvbnN0IGNoYXIqIGNvbnN0IGtEaXJlY3RvcnkgPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci8iOworI2VuZGlmCiAgICAgZm9yIChhdXRvICYgdGhyZWFkIDogdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgICAgICBmb3IgKGF1dG8gJiBoYXNoOiB0aHJlYWQuc2Vjb25kKSB7CiAgICAgICAgICAgICBQZXJmb3JtYW5jZUFuYWx5c2lzJiBjdXJyID0gaGFzaC5zZWNvbmQ7CkBAIC0zNjAsOSArMzk3LDExIEBACiAgICAgICAgICAgICAgICAgZHVtcExpbmUoZmQsIGluZGVudCwgYm9keSk7CiAgICAgICAgICAgICAgICAgYm9keS5jbGVhcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZQorI2lmZGVmIFdSSVRFX1RPX0ZJTEUKKyAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUuIEVuYWJsZSBieSB1bmNvbW1lbnRpbmcgbWFjcm8gYXQgdG9wIG9mIGZpbGUuCiAgICAgICAgICAgICB3cml0ZVRvRmlsZShjdXJyLm1IaXN0cywgY3Vyci5tT3V0bGllckRhdGEsIGN1cnIubVBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAga0RpcmVjdG9yeSwgZmFsc2UsIHRocmVhZC5maXJzdCwgaGFzaC5maXJzdCk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM3NCw1ICs0MTMsNCBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogbU5hbWUobmFtZSksCisgICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLworICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUsIG5hbWUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitSZWFkZXI6On5SZWFkZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKKyAgICBkZWxldGUgbUZpZm87Cit9CisKKy8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKKy8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKKy8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgorc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpCit7CisgICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQorICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCisgICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgorICAgIHNpemVfdCBsb3N0ID0gMDsKKyAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKKyAgICBjb25zdCBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKKyAgICBzc2l6ZV90IGF2YWlsVG9SZWFkOworICAgIC8vIEEgY2FsbCB0byBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluKCkgcGxhY2VzIHRoZSByZWFkIHBvaW50ZXIgb25lIGJ1ZmZlciBsZW5ndGgKKyAgICAvLyBiZWZvcmUgdGhlIHdyaXRlcidzIHBvaW50ZXIgKHNpbmNlIG1GaWZvUmVhZGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGZsdXNoPWZhbHNlKS4gVGhlCisgICAgLy8gZG8gd2hpbGUgbG9vcCBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYWxsIG9mIHRoZSBGSUZPJ3MgY29udGVudHMgcmVnYXJkbGVzcyBvZiBob3cgYmVoaW5kCisgICAgLy8gdGhlIHJlYWRlciBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRlci4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBzY2hlZHVsaW5nIHNlcXVlbmNlIGlzCisgICAgLy8gcG9zc2libGUgYW5kIGNhbiBsZWFkIHRvIGEgc3RhcnZhdGlvbiBzaXR1YXRpb246CisgICAgLy8gLSBXcml0ZXIgVDEgd3JpdGVzLCBvdmVycnVuIHdpdGggcmVzcGVjdCB0byBSZWFkZXIgVDIKKyAgICAvLyAtIFQyIGNhbGxzIG9idGFpbigpIGFuZCBnZXRzIEVPVkVSRkxPVywgVDIgcHRyIHBsYWNlZCBvbmUgYnVmZmVyIHNpemUgYmVoaW5kIFQxIHB0cgorICAgIC8vIC0gVDEgd3JpdGUsIG92ZXJydW4KKyAgICAvLyAtIFQyIG9idGFpbigpLCBFT1ZFUkZMT1cgKGFuZCBzbyBvbi4uLikKKyAgICAvLyBUbyBhZGRyZXNzIHRoaXMgaXNzdWUsIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgdHJpZXMgZm9yIHRoZSByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aAorICAgIC8vIHRoZSB3cml0ZXIuCisgICAgaW50IHRyaWVzID0gMDsKKyAgICBzaXplX3QgbG9zdFRlbXA7CisgICAgZG8geworICAgICAgICBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdFRlbXApOworICAgICAgICBsb3N0ICs9IGxvc3RUZW1wOworICAgIH0gd2hpbGUgKGF2YWlsVG9SZWFkIDwgMCB8fCArK3RyaWVzIDw9IGtNYXhPYnRhaW5Ucmllcyk7CisKKyAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgeworICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCA8IDAsICJOQkxvZyBSZWFkZXIgJXMgZmFpbGVkIHRvIGNhdGNoIHVwIHdpdGggV3JpdGVyIiwgbU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGFuZ2UgdG8gI2lmIDEgZm9yIGRlYnVnZ2luZy4gVGhpcyBzdGF0ZW1lbnQgaXMgdXNlZnVsIGZvciBjaGVja2luZyBidWZmZXIgZnVsbG5lc3MgbGV2ZWxzCisgICAgLy8gKGFzIHNlZW4gYnkgcmVhZGVyKSBhbmQgaG93IG11Y2ggZGF0YSB3YXMgbG9zdC4gSWYgeW91IGZpbmQgdGhhdCB0aGUgZnVsbG5lc3MgbGV2ZWwgaXMKKyAgICAvLyBnZXR0aW5nIGNsb3NlIHRvIGZ1bGwsIG9yIHRoYXQgZGF0YSBsb3NzIGlzIGhhcHBlbmluZyB0byBvZnRlbiwgdGhlbiB5b3Ugc2hvdWxkCisgICAgLy8gcHJvYmFibHkgdHJ5IHNvbWUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIGxvZyBsZXNzIGRhdGEKKyAgICAvLyAtIGxvZyBsZXNzIG9mdGVuCisgICAgLy8gLSBpbmNyZWFzZSB0aGUgaW5pdGlhbCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBidWZmZXIKKyNpZiAwCisgICAgQUxPR0QoImdldFNuYXBzaG90IG5hbWU9JXMsIGF2YWlsVG9SZWFkPSV6ZCwgY2FwYWNpdHk9JXp1LCBmdWxsbmVzcz0lLjNmLCBsb3N0PSV6dSIsCisgICAgICAgICAgICBuYW1lKCkuY19zdHIoKSwgYXZhaWxUb1JlYWQsIGNhcGFjaXR5LCAoZG91YmxlKWF2YWlsVG9SZWFkIC8gKGRvdWJsZSljYXBhY2l0eSwgbG9zdCk7CisjZW5kaWYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOworICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOworICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOworICAgIH0KKworICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCisgICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCisgICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCisgICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRk1UX0VORCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgorICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKKyAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKKworICAgIC8vIEZpbmQgbGFzdCBGTVRfRU5ELiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCisgICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRk1UX0VORC4KKyAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBiYWNrLCBpbnZhbGlkRW5kVHlwZXMpOworICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEZNVF9FTkQgZW50cnkKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKKyAgICAgICAgLy8gZmluZCBmaXJzdCBGTVRfU1RBUlQKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBmaXJzdFN0YXJ0VG1wLCBpbnZhbGlkQmVnaW5UeXBlcykpCisgICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIEZNVF9TVEFSVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKKyAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7CisgICAgfQorCisgICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKKyAgICByZXR1cm4gc25hcHNob3Q7Cit9CisKK2Jvb2wgUmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOworfQorCisvLyBXZSBtYWtlIGEgc2V0IG9mIHRoZSBpbnZhbGlkIHR5cGVzIHJhdGhlciB0aGFuIHRoZSB2YWxpZCB0eXBlcyB3aGVuIGFsaWduaW5nCisvLyBTbmFwc2hvdCBFbnRyeUl0ZXJhdG9ycyB0byB2YWxpZCBlbnRyaWVzIGR1cmluZyBsb2cgY29ycnVwdGlvbiBjaGVja2luZy4KKy8vIFRoaXMgaXMgZG9uZSBpbiBvcmRlciB0byBhdm9pZCB0aGUgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQgb2YgYWRkaW5nIGEgbmV3IEV2ZW50CisvLyB0eXBlIHRvIHRoZSB0d28gc2V0cyBiZWxvdyB3aGVuZXZlciBhIG5ldyBFdmVudCB0eXBlIGlzIGNyZWF0ZWQsIGFzIGl0IGlzCisvLyB2ZXJ5IGxpa2VseSB0aGF0IG5ldyB0eXBlcyBhZGRlZCB3aWxsIGJlIHZhbGlkIHR5cGVzLgorLy8gQ3VycmVudGx5LCBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgc3BlY2lhbAorLy8gY2FzZSBvZiBhIEZvcm1hdCBFbnRyeSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLgorLy8gSWYgYSBuZXcgRXZlbnQgaXMgYWRkZWQgdGhhdCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMsCisvLyB0aGVuIHRoZXNlIHNldHMgbmVlZCB0byBiZSB1cGRhdGVkLgorCisvLyBXZSB3YW50IHRoZSBiZWdpbm5pbmcgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGFuIEZNVF9FTkQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEJlZ2luVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0VORCwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCisvLyBXZSB3YW50IHRoZSBlbmQgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGEgRk1UX1NUQVJULgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRFbmRUeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RBUlQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworY29uc3QgdWludDhfdCAqUmVhZGVyOjpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+ICZpbnZhbGlkVHlwZXMpIHsKKyAgICBpZiAoZnJvbnQgPT0gbnVsbHB0ciB8fCBiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOworICAgICAgICBjb25zdCBFdmVudCB0eXBlID0gKGNvbnN0IEV2ZW50KXByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXTsKKyAgICAgICAgaWYgKHByZXYgPCBmcm9udAorICAgICAgICAgICAgICAgIHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaworICAgICAgICAgICAgICAgIHx8IHR5cGUgPD0gRVZFTlRfUkVTRVJWRUQgfHwgdHlwZSA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIGludmFsaWRUeXBlcyBkb2VzIG5vdCBjb250YWluIHRoZSB0eXBlLCB0aGVuIHRoZSB0eXBlIGlzIHZhbGlkLgorICAgICAgICBpZiAoaW52YWxpZFR5cGVzLmZpbmQodHlwZSkgPT0gaW52YWxpZFR5cGVzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorICAgICAgICBiYWNrID0gcHJldjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCit9CisKKy8vIFRPRE8gZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5LCB3b3VsZCBwcmVmZXIgdG8gaGF2ZSBhIGR1bXAoKSBnbyB0byBzdHJpbmcsIGFuZCB0aGVuIGdvCisvLyB0byBmZCBvbmx5IHdoZW4gaW52b2tlZCB0aHJvdWdoIGJpbmRlci4KK3ZvaWQgRHVtcFJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQpCit7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QgPSBnZXRTbmFwc2hvdChmYWxzZSAvKmZsdXNoKi8pOworICAgIGlmIChzbmFwc2hvdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisKKyAgICAvLyBUT0RPIGFsbCBsb2dnZWQgdHlwZXMgc2hvdWxkIGhhdmUgYSBwcmludGFibGUgZm9ybWF0LgorICAgIC8vIFRPRE8gY2FuIHdlIG1ha2UgdGhlIHByaW50aW5nIGdlbmVyaWM/CisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QtPmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LT5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICAgICAgaXQgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoaXQpLCAmdGltZXN0YW1wLCAmYm9keSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfTEFURU5DWSwlLjNmIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX09WRVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9JTkZPLCVkLCVzIiwgc3RhdGljX2Nhc3Q8aW50PihpbmZvLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVHlwZVRvU3RyaW5nKGluZm8udHlwZSkpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1VOREVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XQVJNVVBfVElNRSwlLjNmIiwgdGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV09SS19USU1FLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1vbm90b25pY05zKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9QQVJBTVMsJXp1LCV1IiwgcGFyYW1zLmZyYW1lQ291bnQsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfRU5EOgorICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlLipzJXMgJXNcbiIsIChpbnQpaW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXAuY2xlYXIoKTsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRHVtcFJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKKyAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KQoreworICAgIFN0cmluZzggdGltZXN0YW1wTG9jYWw7CisgICAgU3RyaW5nOCBib2R5TG9jYWw7CisgICAgaWYgKHRpbWVzdGFtcCA9PSBudWxscHRyKSB7CisgICAgICAgIHRpbWVzdGFtcCA9ICZ0aW1lc3RhbXBMb2NhbDsKKyAgICB9CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0cikgeworICAgICAgICBib2R5ID0gJmJvZHlMb2NhbDsKKyAgICB9CisKKyAgICAvLyBsb2cgdGltZXN0YW1wCisgICAgY29uc3QgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOworICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKKyAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7CisKKyAgICAvLyBsb2cgdW5pcXVlIGhhc2gKKyAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7CisgICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7CisKKyAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQorICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7CisKKyAgICAvLyBsb2cgc3RyaW5nCisgICAgRW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7CisKKyAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKKyAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOworCisgICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKKyAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiUlIiIKKyAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlXDAiCisgICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgRXZlbnQgZXZlbnQgPSAoRXZlbnQpIGFyZy0+dHlwZTsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOworCisgICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKKworICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRk1UX0VORCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKKyAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKKyAgICAgICAgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfU1RSSU5HLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBzdHJpbmcgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgoY29uc3QgY2hhciopIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1RJTUVTVEFNUCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfRkxPQVQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGZsb2F0IHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRGbG9hdChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gcGlkCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfUElELAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKKyAgICAgICAgfQorICAgICAgICArK2FyZzsKKyAgICB9CisgICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0ZNVF9FTkQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOworICAgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvL2ludCB4ID0gKigoaW50KikgZGF0YSk7CisgICAgaW50IHg7CisgICAgbWVtY3B5KCZ4LCBkYXRhLCBzaXplb2YoeCkpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmbG9hdCBmOworICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGYpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZj4iLCBmKTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKKyAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50NjRfdCB0czsKKyAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOworfQorCitTdHJpbmc4IER1bXBSZWFkZXI6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiWyAiKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiVkICIsIGJ1ZmZlcltpXSk7CisgICAgfQorICAgIHN0ci5hcHBlbmQoIl0iKTsKKyAgICByZXR1cm4gc3RyOworfQorCitTdHJpbmc4IER1bXBSZWFkZXI6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCit7CisgICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKaW5kZXggODI3ZTczMS4uYjA1MGI4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMTUsOSArMTUsMTEgQEAKICAqLwogCiAjZGVmaW5lIExPR19UQUcgIlJlcG9ydFBlcmZvcm1hbmNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0yNywyMyArMjksMTk1IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CisjaW5jbHVkZSA8anNvbi9qc29uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6VmFsdWU+IGR1bXBUb0pzb24oY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gcm9vdFB0ciA9IHN0ZDo6bWFrZV91bmlxdWU8SnNvbjo6VmFsdWU+KEpzb246Om9iamVjdFZhbHVlKTsKKyAgICBKc29uOjpWYWx1ZSYgcm9vdCA9ICpyb290UHRyOworICAgIHJvb3RbImlvSGFuZGxlIl0gPSBkYXRhLnRocmVhZEluZm8uaWQ7CisgICAgcm9vdFsidHlwZSJdID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgcm9vdFsiZnJhbWVDb3VudCJdID0gKEpzb246OlZhbHVlOjpJbnQpZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudDsKKyAgICByb290WyJzYW1wbGVSYXRlIl0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlOworICAgIHJvb3RbIndvcmtNc0hpc3QiXSA9IGRhdGEud29ya0hpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJsYXRlbmN5TXNIaXN0Il0gPSBkYXRhLmxhdGVuY3lIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsid2FybXVwTXNIaXN0Il0gPSBkYXRhLndhcm11cEhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ1bmRlcnJ1bnMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpZGF0YS51bmRlcnJ1bnM7CisgICAgcm9vdFsib3ZlcnJ1bnMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpZGF0YS5vdmVycnVuczsKKyAgICByb290WyJhY3RpdmVNcyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NCluczJtcyhkYXRhLmFjdGl2ZSk7CisgICAgcm9vdFsiZHVyYXRpb25NcyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NCluczJtcyhzeXN0ZW1UaW1lKCkgLSBkYXRhLnN0YXJ0KTsKKyAgICByZXR1cm4gcm9vdFB0cjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBIaXN0b2dyYW1zVG9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgICAgc3MgPDwgIlRocmVhZCB0eXBlPSIgPDwgTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSkKKyAgICAgICAgICAgIDw8ICIgaGFuZGxlPSIgPDwgZGF0YS50aHJlYWRJbmZvLmlkCisgICAgICAgICAgICA8PCAiIHNhbXBsZVJhdGU9IiA8PCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlCisgICAgICAgICAgICA8PCAiIGZyYW1lQ291bnQ9IiA8PCBkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50IDw8ICJcbiI7CisgICAgc3MgPDwgIiAgVGhyZWFkIHdvcmsgdGltZXMgaW4gbXM6XG4iIDw8IGRhdGEud29ya0hpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgbGF0ZW5jaWVzIGluIG1zOlxuIiA8PCBkYXRhLmxhdGVuY3lIaXN0LmFzY2lpQXJ0U3RyaW5nKDQgLyppbmRlbnQqLyk7CisgICAgc3MgPDwgIiAgVGhyZWFkIHdhcm11cCB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53YXJtdXBIaXN0LmFzY2lpQXJ0U3RyaW5nKDQgLyppbmRlbnQqLyk7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEpzb246OlZhbHVlIHJvb3QoSnNvbjo6YXJyYXlWYWx1ZSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogdGhyZWFkRGF0YU1hcCkgeworICAgICAgICBjb25zdCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIC8vIFNraXAgdGhyZWFkcyB0aGF0IGRvIG5vdCBoYXZlIHBlcmZvcm1hbmNlIGRhdGEgcmVjb3JkZWQgeWV0LgorICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6VmFsdWU+IGRhdGFKc29uID0gUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBUb0pzb24oZGF0YSk7CisgICAgICAgIGlmIChkYXRhSnNvbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAoKmRhdGFKc29uKVsidGhyZWFkTnVtIl0gPSBpdGVtLmZpcnN0OworICAgICAgICByb290LmFwcGVuZCgqZGF0YUpzb24pOworICAgIH0KKyAgICBKc29uOjpTdHlsZWRXcml0ZXIgd3JpdGVyOworICAgIHN0ZDo6c3RyaW5nIHJvb3RTdHIgPSB3cml0ZXIud3JpdGUocm9vdCk7CisgICAgd3JpdGUoZmQsIHJvb3RTdHIuY19zdHIoKSwgcm9vdFN0ci5zaXplKCkpOworfQorCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgaGlzdHMgPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhkYXRhKTsKKyAgICAgICAgd3JpdGUoZmQsIGhpc3RzLmNfc3RyKCksIGhpc3RzLnNpemUoKSk7CisgICAgfQorfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcFJldHJvU3RyaW5nKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSwgaW50NjRfdCBub3cpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSkgPDwgIiwiIDw8IGRhdGEudGhyZWFkSW5mby5pZCA8PCAiXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IGRhdGEuc25hcHNob3RzKSB7CisgICAgICAgIC8vIFRPRE8gdXNlIGFuIGVudW0gdG8gc3RyaW5nIGNvbnZlcnNpb24gbWV0aG9kLiBPbmUgZ29vZCBpZGVhOgorICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjM4MTU3CisgICAgICAgIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9VTkRFUlJVTikgeworICAgICAgICAgICAgc3MgPDwgIkVWRU5UX1VOREVSUlVOLCI7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maXJzdCA9PSBOQkxvZzo6RVZFTlRfT1ZFUlJVTikgeworICAgICAgICAgICAgc3MgPDwgIkVWRU5UX09WRVJSVU4sIjsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBub3cgLSBpdGVtLnNlY29uZCA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogdGhyZWFkRGF0YU1hcCkgeworICAgICAgICBjb25zdCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyByZXRyb1N0ciA9IGR1bXBSZXRyb1N0cmluZyhkYXRhLCBub3cpOworICAgICAgICB3cml0ZShmZCwgcmV0cm9TdHIuY19zdHIoKSwgcmV0cm9TdHIuc2l6ZSgpKTsKKyAgICB9Cit9CisKK2Jvb2wgc2VuZFRvTWVkaWFNZXRyaWNzKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICAvLyBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlc2UgbWV0cmljcyBoZXJlOgorICAgIC8vIGRvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzExLS02ZHlPWFZPcGFjWVFMWmlhT1k1UVZ0UWpVeXFOeDJ6VDljQ3pMS1lFL2VkaXQ/dXNwPXNoYXJpbmcKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnR5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkRnJhbWVDb3VudFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuZnJhbWVjb3VudCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5zYW1wbGVyYXRlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFdvcmtIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53b3JrTXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRMYXRlbmN5SGlzdFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQubGF0ZW5jeU1zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV2FybXVwSGlzdFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQud2FybXVwTXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRVbmRlcnJ1bnNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnVuZGVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRPdmVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQub3ZlcnJ1bnMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkQWN0aXZlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5hY3RpdmVNcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWREdXJhdGlvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuZHVyYXRpb25NcyI7CisKKyAgICAvLyBDdXJyZW50bHksIHdlIG9ubHkgYWxsb3cgRmFzdE1peGVyIHRocmVhZCBkYXRhIHRvIGJlIHNlbnQgdG8gTWVkaWEgTWV0cmljcy4KKyAgICBpZiAoZGF0YS50aHJlYWRJbmZvLnR5cGUgIT0gTkJMb2c6OkZBU1RNSVhFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW90aHJlYWQiKSk7CisKKyAgICBjb25zdCBIaXN0b2dyYW0gJndvcmtIaXN0ID0gZGF0YS53b3JrSGlzdDsKKyAgICBpZiAod29ya0hpc3QudG90YWxDb3VudCgpID4gMCkgeworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRXb3JrSGlzdCwgd29ya0hpc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBjb25zdCBIaXN0b2dyYW0gJmxhdGVuY3lIaXN0ID0gZGF0YS5sYXRlbmN5SGlzdDsKKyAgICBpZiAobGF0ZW5jeUhpc3QudG90YWxDb3VudCgpID4gMCkgeworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRMYXRlbmN5SGlzdCwgbGF0ZW5jeUhpc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBjb25zdCBIaXN0b2dyYW0gJndhcm11cEhpc3QgPSBkYXRhLndhcm11cEhpc3Q7CisgICAgaWYgKHdhcm11cEhpc3QudG90YWxDb3VudCgpID4gMCkgeworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRXYXJtdXBIaXN0LCB3YXJtdXBIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKGRhdGEudW5kZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkVW5kZXJydW5zLCBkYXRhLnVuZGVycnVucyk7CisgICAgfQorCisgICAgaWYgKGRhdGEub3ZlcnJ1bnMgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRPdmVycnVucywgZGF0YS5vdmVycnVucyk7CisgICAgfQorCisgICAgLy8gU2VuZCB0byBNZWRpYSBNZXRyaWNzIGlmIHRoZSByZWNvcmQgaXMgbm90IGVtcHR5LgorICAgIC8vIFRoZSB0aHJlYWQgYW5kIHRpbWUgaW5mbyBhcmUgYWRkZWQgaW5zaWRlIHRoZSBpZiBzdGF0ZW1lbnQgYmVjYXVzZQorICAgIC8vIHdlIHdhbnQgdG8gc2VuZCB0aGVtIG9ubHkgaWYgdGhlcmUgYXJlIHBlcmZvcm1hbmNlIG1ldHJpY3MgdG8gc2VuZC4KKyAgICBpZiAoaXRlbS0+Y291bnQoKSA+IDApIHsKKyAgICAgICAgLy8gQWRkIHRocmVhZCBpbmZvIGZpZWxkcy4KKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVTdHJpbmcgPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkVHlwZSwgdHlwZVN0cmluZyk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRGcmFtZUNvdW50LCBkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50KTsKKyAgICAgICAgaXRlbS0+c2V0SW50MzIoa1RocmVhZFNhbXBsZVJhdGUsIGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICAvLyBBZGQgdGltZSBpbmZvIGZpZWxkcy4KKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZEFjdGl2ZSwgZGF0YS5hY3RpdmUgLyAxMDAwMDAwKTsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZER1cmF0aW9uLCAoc3lzdGVtVGltZSgpIC0gZGF0YS5zdGFydCkgLyAxMDAwMDAwKTsKKyAgICAgICAgcmV0dXJuIGl0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUT0RPOiB1c2UgYSBmdW5jdGlvbiBsaWtlIHRoaXMgdG8gZXh0cmFjdCBsb2dpYyBmcm9tIHdyaXRlVG9GaWxlCiAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTI3OTYyMAogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHNwYW5uaW5nIGxvbmcgdGltZSBpbnRlcnZhbHMgdG8gZmlsZS4KIC8vIFRPRE86IHdyaXRlIGRhdGEgaW4gYmluYXJ5IGZvcm1hdAotdm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKK3ZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0Pj4gJmhpc3RzLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxtc0ludGVydmFsLCB0aW1lc3RhbXA+PiAmb3V0bGllckRhdGEsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiAmcGVha1RpbWVzdGFtcHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBkaXJlY3RvcnksIGJvb2wgYXBwZW5kLCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gpIHsKQEAgLTEyOCw2ICszMDIsNSBAQAogICAgIHBmcy5jbG9zZSgpOwogfQogCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCit9ICAgLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcCBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDliMDNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBUaW1lbGluZS5oCitOQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCisgICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCit7CisgICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Cit9CisKK05CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKK3sKKyAgICBtU2hhcmVkLT5+U2hhcmVkKCk7CisgICAgaWYgKG1Pd24pIHsKKyAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKKyAgICB9Cit9CisjZW5kaWYKKworLypzdGF0aWMqLworc2l6ZV90IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemVfdCBzaXplKQoreworICAgIC8vIFRPRE8gZmlmbyBub3cgc3VwcG9ydHMgbm9uLXBvd2VyLW9mLTIgYnVmZmVyIHNpemVzLCBzbyBjb3VsZCByZW1vdmUgdGhlIHJvdW5kdXAKKyAgICByZXR1cm4gc2l6ZW9mKFNoYXJlZCkgKyByb3VuZHVwKHNpemUpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhM2JkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1dyaXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK1dyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCisgICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAorICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKK3sKKyAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCisgICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOworICAgIGNoYXIgcHJvY05hbWVbMTZdOworICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOworICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCisgICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7CisgICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOworICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07CisgICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7CisgICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKK30KKworV3JpdGVyOjpXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKK3sKKyAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Cit9CisKK1dyaXRlcjo6fldyaXRlcigpCit7CisgICAgZGVsZXRlIG1GaWZvV3JpdGVyOworICAgIGRlbGV0ZSBtRmlmbzsKKyAgICBkZWxldGVbXSBtUGlkVGFnOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7ICAgICAvLyB0aGUgV3JpdGVyOjogaXMgbmVlZGVkIHRvIGF2b2lkIHZpcnR1YWwgZGlzcGF0Y2ggZm9yIExvY2tlZFdyaXRlcgorICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaWYgKCFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSkgeworICAgICAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBoYXNoKTsKKyAgICBXcml0ZXI6OmxvZ1ZGb3JtYXQoZm10LCBoYXNoLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEhpc3RUc0VudHJ5IGRhdGE7CisgICAgZGF0YS5oYXNoID0gaGFzaDsKKyAgICBkYXRhLnRzID0gc3lzdGVtVGltZSgpOworICAgIGlmIChkYXRhLnRzID4gMCkgeworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOworICAgIH0KK30KKworYm9vbCBXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1FbmFibGVkOworfQorCitib29sIFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKKyAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOworICAgIHJldHVybiBvbGQ7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coY29uc3QgRW50cnkgJmV0ciwgYm9vbCB0cnVzdGVkKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXRydXN0ZWQpIHsKKyAgICAgICAgbG9nKGV0ci5tRXZlbnQsIGV0ci5tRGF0YSwgZXRyLm1MZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IHNpemVfdCBuZWVkID0gZXRyLm1MZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkOyAvLyBtRXZlbnQsIG1MZW5ndGgsIGRhdGFbbUxlbmd0aF0sIG1MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KKworICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KKyAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgorICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZworICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOworICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKKyAgICAgICAgdGVtcFtpXSA9IGV0ci5jb3B5RW50cnlEYXRhQXQoaSk7CisgICAgfQorICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgorICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCisgICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQorICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKKyAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7CisgICAgbG9nKGV0ciwgdHJ1ZSAvKnRydXN0ZWQqLyk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKKyAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOworICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOworICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCisgICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKyAgICB9CisgICAgaWYgKGxlbmd0aCA+PSAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKKyAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgfQorICAgIGxvZyhFVkVOVF9GTVRfU1RBUlQsIGZtdCwgbGVuZ3RoKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ1RpbWVzdGFtcEZvcm1hdCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IG5zZWNzX3QgdHMgPSBzeXN0ZW1UaW1lKCk7CisgICAgaWYgKHRzID4gMCkgeworICAgICAgICBsb2coRVZFTlRfRk1UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFyZ3ApCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgZDsKKyAgICBmbG9hdCBmOworICAgIGNoYXIqIHM7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBpbnQ2NF90IHQ7CisgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICBsb2coRVZFTlRfRk1UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgaWYgKCpwICE9ICclJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKCorK3ApIHsKKyAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOworICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX1NUUklORywgcywgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX1RJTUVTVEFNUCwgJnQsIHNpemVvZih0KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9JTlRFR0VSLCAmaSwgc2l6ZW9mKGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAorICAgICAgICAgICAgZCA9IHZhX2FyZyhhcmdwLCBkb3VibGUpOyAvLyBmbG9hdCBhcmd1bWVudHMgYXJlIHByb21vdGVkIHRvIGRvdWJsZSBpbiB2YXJhcmcgbGlzdHMKKyAgICAgICAgICAgIGYgPSAoZmxvYXQpZDsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfRkxPQVQsICZmLCBzaXplb2YoZikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncCc6IC8vIHBpZAorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIHRoZSAiJVwwIiBjYXNlIGZpbmlzaGVzIHBhcnNpbmcKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgLS1wOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIk5CTG9nIFdyaXRlciBwYXJzZWQgaW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyOiAlYyIsICpwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVudHJ5IGV0cihFVkVOVF9GTVRfRU5ELCBudWxscHRyLCAwKTsKKyAgICBsb2coZXRyLCB0cnVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQoreworfQorCitib29sIExvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOworfQorCitib29sIExvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOworfQorCit2b2lkIExvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZyhlbnRyeSwgdHJ1c3RlZCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjAwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfRU5UUllfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gZW50cnkgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5CitzdHJ1Y3QgZW50cnkgeworICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKKyAgICBjb25zdCB1aW50OF90IGxlbmd0aDsKKyAgICBjb25zdCB1aW50OF90IGRhdGFbMF07Cit9OworCisvLyBlbnRyeSB0YWlsIHJlcHJlc2VudGF0aW9uIChhZnRlciBkYXRhKQorc3RydWN0IGVuZGluZyB7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgdWludDhfdCBuZXh0WzBdOworfTsKKworLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHNoYXJlZCBtZW1vcnkKKy8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAorLy8gIGJ5dGVbMV0gICAgICAgICAgICAgbUxlbmd0aAorLy8gIGJ5dGVbMl0gICAgICAgICAgICAgbURhdGFbMF0KKy8vICAuLi4KKy8vICBieXRlWzIraV0gICAgICAgICAgIG1EYXRhW2ldCisvLyAgLi4uCisvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCisvLyAgYnl0ZVsyK21MZW5ndGhdICAgICBkdXBsaWNhdGUgY29weSBvZiBtTGVuZ3RoIHRvIHBlcm1pdCByZXZlcnNlIHNjYW4KKy8vICBieXRlWzMrbUxlbmd0aF0gICAgIHN0YXJ0IG9mIG5leHQgbG9nIGVudHJ5CitjbGFzcyBFbnRyeSB7CitwdWJsaWM6CisgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCisgICAgICAgIDogbUV2ZW50KGV2ZW50KSwgbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQorICAgIH5FbnRyeSgpIHt9CisKKyAgICAvLyB1c2VkIGR1cmluZyB3cml0aW5nIHRvIGZvcm1hdCBFbnRyeSBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgorICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQorICAgIGludCAgICAgY29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7CisgICAgRXZlbnQgICAgICAgbUV2ZW50OyAgICAgLy8gZXZlbnQgdHlwZQorICAgIHVpbnQ4X3QgICAgIG1MZW5ndGg7ICAgIC8vIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEsIDAgPD0gbUxlbmd0aCA8PSBrTWF4TGVuZ3RoCisgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TGVuZ3RoID0gMjU1OworcHVibGljOgorICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtPdmVyaGVhZCA9IHNpemVvZihlbnRyeSkgKyBzaXplb2YoZW5kaW5nKTsKKyAgICAvLyBlbmRpbmQgbGVuZ3RoIG9mIHByZXZpb3VzIGVudHJ5CisgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCisgICAgICAgIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKTsKK307CisKKy8vIGVudHJ5IGl0ZXJhdG9yCitjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2VkIGZvciBkdW1teSBpbml0aWFsaXphdGlvbi4gUGVyZm9ybWluZyBvcGVyYXRpb25zIG9uIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZAorICAgIC8vIEVudHJ5SXRlcmF0b3Igb3RoZXIgdGhhbiBhc3NpZ25pbmcgaXQgdG8gYW5vdGhlciB2YWxpZCBFbnRyeUl0ZXJhdG9yCisgICAgLy8gaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIEVudHJ5SXRlcmF0b3IoKTsKKyAgICAvLyBDYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgZW50cnkgaXMgbm90IG51bGxwdHIuCisgICAgLy8gUGFzc2luZyBpbiBudWxscHRyIGNhbiByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGV4cGxpY2l0IEVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpOworICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOworCisgICAgLy8gZGVyZWZlcmVuY2UgdW5kZXJseWluZyBlbnRyeQorICAgIGNvbnN0IGVudHJ5JiAgICBvcGVyYXRvciooKSBjb25zdDsKKyAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OworICAgIC8vIGFkdmFuY2UgdG8gbmV4dCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3ImICBvcGVyYXRvcisrKCk7IC8vICsraQorICAgIC8vIGJhY2sgdG8gcHJldmlvdXMgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3ItLSgpOyAvLyAtLWkKKyAgICAvLyByZXR1cm5zIGFuIEVudHJ5SXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbmV4dCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBuZXh0KCkgY29uc3Q7CisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciAgIHByZXYoKSBjb25zdDsKKyAgICBib29sICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgIG9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7CisKKyAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICBjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weURhdGEodWludDhfdCAqZHN0KSBjb25zdDsKKworICAgIC8vIG1lbWNweSBwcmVmZXJyZWQgdG8gcmVpbnRlcnByZXRfY2FzdCB0byBhdm9pZCBwb3RlbnRpYWxseSB1bnN1cHBvcnRlZAorICAgIC8vIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzLgorI2lmIDAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgeworICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKKyAgICB9CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIFQgcGF5bG9hZCgpIGNvbnN0IHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAmJiAhc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiTkJMb2c6OkVudHJ5SXRlcmF0b3IgcGF5bG9hZCBtdXN0IGJlIHRyaXZpYWxseSBjb3B5YWJsZSwgbm9uLXBvaW50ZXIgdHlwZS4iKTsKKyAgICAgICAgVCBwYXlsb2FkOworICAgICAgICBtZW1jcHkoJnBheWxvYWQsIG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIHNpemVvZihwYXlsb2FkKSk7CisgICAgICAgIHJldHVybiBwYXlsb2FkOworICAgIH0KKyNlbmRpZgorCisgICAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IHVpbnQ4X3QqKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVB0cjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgdWludDhfdCAgKm1QdHI7ICAgLy8gU2hvdWxkIG5vdCBiZSBudWxscHRyIGV4Y2VwdCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSB1c2VkIGZvciBtZXJnaW5nIGludG8gdGhlIE1lcmdlcidzIGJ1ZmZlci4KKworY2xhc3MgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9CisKKyAgICAvLyBidWlsZCBjb25jcmV0ZSBlbnRyeSBvZiBhcHByb3ByaWF0ZSBjbGFzcyBmcm9tIHB0ci4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgdmlydHVhbCBpbnQ2NF90ICAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0ID0gMDsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIC8vIFRPRE8gY29uc2lkZXIgY2hhbmdpbmcgdG8gdWludDMyX3QKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3QgPSAwOworCisgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQorICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIC8vIEVudHJ5IHN0YXJ0aW5nIGluIHRoZSBnaXZlbiBwb2ludGVyLCB3aGljaCBzaGFsbCBub3QgYmUgbnVsbHB0ci4KKyAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KSA6IG1FbnRyeShlbnRyeSkge30KKyAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKKyAgICAvLyBzaXplX3QgICAgICBjb3B5RW50cnkoYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKmRzdCwgY29uc3QgaXRlcmF0b3IgJml0KTsKKyAgICBjb25zdCB1aW50OF90ICogY29uc3QgbUVudHJ5OworfTsKKworLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucworCisvLyBhIGZvcm1hdHRlZCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisvLyAgICAqIEZNVF9TVEFSVCBlbnRyeSwgY29udGFpbmluZyB0aGUgZm9ybWF0IHN0cmluZworLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKKy8vICAgICogSEFTSCBlbnRyeQorLy8gICAgKiBhdXRob3IgZW50cnkgb2YgdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZCBpdCAob3B0aW9uYWwsIHByZXNlbnQgaW4gbWVyZ2VkIGxvZykKKy8vICAgICogZm9ybWF0IGFyZzEKKy8vICAgICogZm9ybWF0IGFyZzIKKy8vICAgICogLi4uCisvLyAgICAqIEZNVF9FTkQgZW50cnkKK2NsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIC8vIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKKyAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkZvcm1hdEVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0OworCisgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCisgICAgY29uc3QgY2hhciogICBmb3JtYXRTdHJpbmcoKSBjb25zdDsKKworICAgIC8vIEVucnR5J3MgZm9ybWF0IHN0cmluZyBsZW5ndGgKKyAgICBzaXplX3QgICAgICAgIGZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0OworCisgICAgLy8gRm9ybWF0IGFyZ3VtZW50cyAoZXhjbHVkaW5nIGZvcm1hdCBzdHJpbmcsIHRpbWVzdGFtcCBhbmQgYXV0aG9yKQorICAgIEVudHJ5SXRlcmF0b3IgYXJncygpIGNvbnN0OworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICBpbnQ2NF90ICAgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAorICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKKyAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5CisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NsYXNzIEhpc3RvZ3JhbUVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KKyAgICB+SGlzdG9ncmFtRW50cnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBpbnQ2NF90ICAgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgRW50cnlJdGVyYXRvciBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfRU5UUllfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNGZlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIFRPRE8gaGF2ZSBhIGNvbW1lbnQgc29tZXdoZXJlIGV4cGxhaW5pbmcgdGhlIHdob2xlIHByb2Nlc3MgZm9yIGFkZGluZyBhIG5ldyBFVkVOVF8KKworLy8gTkJMb2cgRXZlbnQgdHlwZXMuIFRoZSBFdmVudHMgYXJlIG5hbWVkIHRvIHByb3ZpZGUgY29udGV4dHVhbCBtZWFuaW5nIGZvciB3aGF0IGlzIGxvZ2dlZC4KKy8vIElmIGFkZGluZyBhIG5ldyBzdGFuZGFsb25lIEV2ZW50IGhlcmUsIHVwZGF0ZSB0aGUgZXZlbnQtdG8tdHlwZSBtYXBwaW5nIGJ5IGFkZGluZyBhCisvLyBNQVBfRVZFTlRfVE9fVFlQRSBzdGF0ZW1lbnQgYmVsb3cuCisvLyBYWFggTm90ZSB0aGF0IGFzIG9mIHRoZSBjdXJyZW50IGRlc2lnbiwgRXZlbnRzIHNob3VsZCBub3QgYmUgcmVudW1iZXJlZCAoaS5lLiByZW9yZGVyZWQpCisvLyBpZiB0aGV5IGV2ZXIgbGVhdmUgbWVtb3J5IChmb3IgZXhhbXBsZSwgd3JpdHRlbiB0byBmaWxlLCB1cGxvYWRlZCB0byBjbG91ZCwgZXRjLikuCisvLyBUT0RPIG1ha2Ugc29tZSBzb3J0IG9mIGludGVyZmFjZSB0byBrZWVwIHRoZXNlICJjb250cmFjdCIgY29uc3RhbnRzLgorZW51bSBFdmVudCA6IHVpbnQ4X3QgeworICAgIEVWRU5UX1JFU0VSVkVELAorICAgIEVWRU5UX1NUUklORywgICAgICAgICAgICAgICAvLyBBU0NJSSBzdHJpbmcsIG5vdCBOVUwtdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAorICAgIEVWRU5UX1RJTUVTVEFNUCwgICAgICAgICAgICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKKworICAgIC8vIFR5cGVzIGZvciBGb3JtYXQgRW50cnksIGkuZS4gZm9ybWF0dGVkIGVudHJ5CisgICAgRVZFTlRfRk1UX1NUQVJULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGVudHJpZXMgY29udGFpbiBmb3JtYXQgYXJndW1lbnRzCisgICAgLy8gZm9ybWF0IGFyZ3VtZW50cworICAgIEVWRU5UX0ZNVF9BVVRIT1IsICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGxvZworICAgIEVWRU5UX0ZNVF9GTE9BVCwgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQorICAgIEVWRU5UX0ZNVF9IQVNILCAgICAgICAgICAgICAvLyB1bmlxdWUgSEFTSCBvZiBsb2cgb3JpZ2luLCBvcmlnaW5hdGVzIGZyb20gaGFzaCBvZiBmaWxlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfUElELCAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCisgICAgRVZFTlRfRk1UX1NUUklORywgICAgICAgICAgIC8vIHN0cmluZyB2YWx1ZSBlbnRyeQorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsICAgICAgICAvLyB0aW1lc3RhbXAgdmFsdWUgZW50cnkKKyAgICAvLyBlbmQgb2YgZm9ybWF0IGFyZ3VtZW50cworICAgIEVWRU5UX0ZNVF9FTkQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKKworICAgIC8vIFR5cGVzIGZvciB3YWtldXAgdGltZXN0YW1wIGhpc3RvZ3JhbXMKKyAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKKyAgICBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsICAgLy8gc2luZ2xlIGRhdHVtIGZvciB0aW1lc3RhbXAgaGlzdG9ncmFtCisKKyAgICAvLyBUeXBlcyByZXByZXNlbnRpbmcgYXVkaW8gcGVyZm9ybWFuY2UgbWV0cmljcworICAgIEVWRU5UX0xBVEVOQ1ksICAgICAgICAgICAgICAvLyBkaWZmZXJlbmNlIGJldHdlZW4gZnJhbWVzIHByZXNlbnRlZCBieSBIQUwgYW5kIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0dGVuIHRvIEhBTCBvdXRwdXQgc2luaywgZGl2aWRlZCBieSBzYW1wbGUgcmF0ZS4KKyAgICBFVkVOVF9PVkVSUlVOLCAgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCBvdmVycnVuIGV2ZW50IHRpbWVzdGFtcAorICAgIEVWRU5UX1RIUkVBRF9JTkZPLCAgICAgICAgICAvLyBzZWUgdGhyZWFkX2luZm9fdCBiZWxvdworICAgIEVWRU5UX1VOREVSUlVOLCAgICAgICAgICAgICAvLyBwcmVkaWN0ZWQgdGhyZWFkIHVuZGVycnVuIGV2ZW50IHRpbWVzdGFtcAorICAgIEVWRU5UX1dBUk1VUF9USU1FLCAgICAgICAgICAvLyB0aHJlYWQgd2FybXVwIHRpbWUKKyAgICBFVkVOVF9XT1JLX1RJTUUsICAgICAgICAgICAgLy8gdGhlIHRpbWUgYSB0aHJlYWQgdGFrZXMgdG8gZG8gd29yaywgZS5nLiByZWFkLCB3cml0ZSwgZXRjLgorICAgIEVWRU5UX1RIUkVBRF9QQVJBTVMsICAgICAgICAvLyBzZWUgdGhyZWFkX3BhcmFtc190IGJlbG93CisKKyAgICBFVkVOVF9VUFBFUl9CT1VORCwgICAgICAgICAgLy8gdG8gY2hlY2sgZm9yIGludmFsaWQgZXZlbnRzCit9OworCisvLyBOQkxvZyBjdXN0b20tZGVmaW5lZCBzdHJ1Y3RzLiBTb21lIE5CTG9nIEV2ZW50IHR5cGVzIG1hcCB0byB0aGVzZSBzdHJ1Y3RzLgorCit1c2luZyBsb2dfaGFzaF90ID0gdWludDY0X3Q7CisKKy8vIHVzZWQgZm9yIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUyAobm90IG1hcHBlZCkKK3N0cnVjdCBIaXN0VHNFbnRyeSB7CisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIGludDY0X3QgdHM7Cit9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8vIHVzZWQgZm9yIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUyAobm90IG1hcHBlZCkKK3N0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBhdXRob3I7Cit9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0gVGhyZWFkVHlwZSB7CisgICAgVU5LTk9XTiwKKyAgICBNSVhFUiwKKyAgICBDQVBUVVJFLAorICAgIEZBU1RNSVhFUiwKKyAgICBGQVNUQ0FQVFVSRSwKK307CisKK2lubGluZSBjb25zdCBjaGFyICp0aHJlYWRUeXBlVG9TdHJpbmcoVGhyZWFkVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNSVhFUjoKKyAgICAgICAgcmV0dXJuICJNSVhFUiI7CisgICAgY2FzZSBDQVBUVVJFOgorICAgICAgICByZXR1cm4gIkNBUFRVUkUiOworICAgIGNhc2UgRkFTVE1JWEVSOgorICAgICAgICByZXR1cm4gIkZBU1RNSVhFUiI7CisgICAgY2FzZSBGQVNUQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJGQVNUQ0FQVFVSRSI7CisgICAgY2FzZSBVTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorfQorCisvLyBtYXBwZWQgZnJvbSBFVkVOVF9USFJFQURfSU5GTworLy8gVGhlc2UgZmllbGRzIGFsd2F5cyBzdGF5IHRoZSBzYW1lIHRocm91Z2hvdXQgYSB0aHJlYWQncyBsaWZldGltZSBhbmQKKy8vIHNob3VsZCBvbmx5IG5lZWQgdG8gYmUgbG9nZ2VkIG9uY2UgdXBvbiB0aHJlYWQgaW5pdGlhbGl6YXRpb24uCisvLyBUaGVyZSBpcyBjdXJyZW50bHkgbm8gcmVjb3ZlcnkgbWVjaGFuaXNtIGlmIHRoZSBsb2cgZXZlbnQgY29ycmVzcG9uZGluZworLy8gdG8gdGhpcyB0eXBlIGlzIGxvc3QuCisvLyBUT0RPIGFkZCB0aGlzIGluZm9ybWF0aW9uIHdoZW4gYWRkaW5nIGEgcmVhZGVyIHRvIE1lZGlhTG9nU2VydmljZT8KK3N0cnVjdCB0aHJlYWRfaW5mb190IHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IC0xOyAgICAgIC8vIFRocmVhZCBJL08gaGFuZGxlCisgICAgVGhyZWFkVHlwZSB0eXBlID0gVU5LTk9XTjsgICAgICAvLyBTZWUgZW51bSBUaHJlYWRUeXBlIGFib3ZlCit9OworCisvLyBtYXBwZWQgZnJvbSBFVkVOVF9USFJFQURfUEFSQU1TCisvLyBUaGVzZSBmaWVsZHMgYXJlIG5vdCBuZWNlc3NhcmlseSBjb25zdGFudCB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBjYW4gYmUgbG9nZ2VkIHdoZW5ldmVyIGEgdGhyZWFkIHJlY2VpdmVzIG5ldyBjb25maWd1cmF0aW9ucyBvciBwYXJhbWV0ZXJzLgorc3RydWN0IHRocmVhZF9wYXJhbXNfdCB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOyAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciByZWFkIG9yIHdyaXRlIGJ1ZmZlcgorICAgIHVuc2lnbmVkIHNhbXBsZVJhdGUgPSAwOyAgICAgICAgLy8gaW4gZnJhbWVzIHBlciBzZWNvbmQKK307CisKK3RlbXBsYXRlIDxFdmVudCBFPiBzdHJ1Y3QgZ2V0X21hcHBlZDsKKyNkZWZpbmUgTUFQX0VWRU5UX1RPX1RZUEUoRSwgVCkgXAordGVtcGxhdGU8PiBzdHJ1Y3QgZ2V0X21hcHBlZDxFPiB7IFwKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZSBcCisgICAgICAgICAgICAmJiAhc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSwgXAorICAgICAgICAgICAgIk5CTG9nOjpFdmVudCBtdXN0IG1hcCB0byB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7IFwKKyAgICB0eXBlZGVmIFQgdHlwZTsgXAorfQorCisvLyBNYXBzIGFuIE5CTG9nIEV2ZW50IHR5cGUgdG8gYSBDKysgUE9EIHR5cGUuCitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9MQVRFTkNZLCBkb3VibGUpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfT1ZFUlJVTiwgaW50NjRfdCk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9USFJFQURfSU5GTywgdGhyZWFkX2luZm9fdCk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9VTkRFUlJVTiwgaW50NjRfdCk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XQVJNVVBfVElNRSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1dPUktfVElNRSwgaW50NjRfdCk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9USFJFQURfUEFSQU1TLCB0aHJlYWRfcGFyYW1zX3QpOworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE4NTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmcxNjsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIFRPRE8gdXBkYXRlIGNvbW1lbnRzIHRvIHJlZmxlY3QgY3VycmVudCBmdW5jdGlvbmFsaXRpZXMKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgaW5kaXZpZHVhbCBGSUZPIGluIHNoYXJlZCBtZW1vcnkKKy8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KK2NsYXNzIE1lcmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+TWVyZ2VyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4gJnJlYWRlcik7CisgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCisgICAgdm9pZCBtZXJnZSgpOworCisgICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgZ2V0UmVhZGVycygpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHZlY3RvciBvZiB0aGUgcmVhZGVycyB0aGUgbWVyZ2VyIGlzIHN1cHBvc2VkIHRvIG1lcmdlIGZyb20uCisgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrCisgICAgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4gbVJlYWRlcnM7CisKKyAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm8+IG1GaWZvOyAvLyBGSUZPIGl0c2VsZgorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gbUZpZm9Xcml0ZXI7IC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTworfTsKKworLy8gVGhpcyBjbGFzcyBoYXMgYSBwb2ludGVyIHRvIHRoZSBGSUZPIGluIGxvY2FsIG1lbW9yeSB3aGljaCBzdG9yZXMgdGhlIG1lcmdlZAorLy8gZGF0YSBjb2xsZWN0ZWQgYnkgTkJMb2c6Ok1lcmdlciBmcm9tIGFsbCBSZWFkZXJzLiBJdCBpcyB1c2VkIHRvIHByb2Nlc3MKKy8vIHRoaXMgZGF0YSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLgorY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKK3B1YmxpYzoKKyAgICBNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcik7CisKKyAgICAvLyBwcm9jZXNzIGEgcGFydGljdWxhciBzbmFwc2hvdCBvZiB0aGUgcmVhZGVyCisgICAgdm9pZCBwcm9jZXNzU25hcHNob3QoU25hcHNob3QgJnNuYXAsIGludCBhdXRob3IpOworCisgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCisgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKKworICAgIC8vIGNoZWNrIGZvciBwZXJpb2RpYyBwdXNoIG9mIHBlcmZvcm1hbmNlIGRhdGEgdG8gbWVkaWEgbWV0cmljcywgYW5kIHBlcmZvcm0KKyAgICAvLyB0aGUgc2VuZCBpZiBpdCBpcyB0aW1lIHRvIGRvIHNvLgorICAgIHZvaWQgY2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCitwcml2YXRlOgorICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2ssCisgICAgLy8gICAgICAgYmVjYXVzZSBldmVuIHRob3VnaCBvdXIgdXNlIG9mIGl0IGlzIHJlYWQtb25seSB0aGVyZSBtYXkgYmUgYXN5bmNocm9ub3VzIHVwZGF0ZXMKKyAgICAvLyBUaGUgb2JqZWN0IGlzIG93bmVkIGJ5IHRoZSBNZXJnZXIgY2xhc3MuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIG1SZWFkZXJzOworCisgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKKyAgICAvLyBjb250YWlucyBhIHNlcGFyYXRlIGluc3RhbmNlIGZvciBldmVyeSBhdXRob3IgKHRocmVhZCksIGFuZCBmb3IgZXZlcnkgc291cmNlIGZpbGUKKyAgICAvLyBsb2NhdGlvbiB3aXRoaW4gZWFjaCBhdXRob3IKKyAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKKworICAgIC8vIGNvbXByZXNzZXMgYW5kIHN0b3JlcyBhdWRpbyBwZXJmb3JtYW5jZSBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBidWZmZXJzLgorICAgIC8vIGZpcnN0IHBhcmFtZXRlciBpcyBhdXRob3IsIGkuZS4gdGhyZWFkIGluZGV4LgorICAgIHN0ZDo6bWFwPGludCwgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YT4gbVRocmVhZFBlcmZvcm1hbmNlRGF0YTsKKworICAgIC8vIGhvdyBvZnRlbiB0byBwdXNoIGRhdGEgdG8gTWVkaWEgTWV0cmljcworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrUGVyaW9kaWNNZWRpYU1ldHJpY3NQdXNoID0gczJucygobnNlY3NfdCkyICogNjAgKiA2MCk7IC8vIDIgaG91cnMKKworICAgIC8vIGhhbmRsZSBhdXRob3IgZW50cnkgYnkgbG9va2luZyB1cCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYXBwZW5kaW5nIGl0IHRvIHRoZSBib2R5CisgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGZtdEVudHJ5CisgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOworfTsKKworLy8gTWVyZ2VUaHJlYWQgaXMgYSB0aHJlYWQgdGhhdCBjb250YWlucyBhIE1lcmdlci4gSXQgd29ya3MgYXMgYSByZXRyaWdnZXJhYmxlIG9uZS1zaG90OgorLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKKy8vIHJldHJpZ2dlcmVkLCB0aGUgdGltZW91dCBpcyByZXNldC4KKy8vIFRoZSB0aHJlYWQgaXMgdHJpZ2dlcmVkIG9uIEF1ZGlvRmxpbmdlciBiaW5kZXIgYWN0aXZpdHkuCitjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIE1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpOworICAgIH5NZXJnZVRocmVhZCgpIG92ZXJyaWRlOworCisgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKKyAgICB2b2lkIHdha2V1cCgpOworCisgICAgLy8gU2V0IHRpbWVvdXQgcGVyaW9kIHVudGlsIHRoZSBtZXJnaW5nIHRocmVhZCBnb2VzIGlkbGUgYWdhaW4KKyAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7CisKK3ByaXZhdGU6CisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICAvLyB0aGUgbWVyZ2VyIHdobyBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mIG1lcmdpbmcgdGhlIGxvZ3MKKyAgICBNZXJnZXImICAgICAgbU1lcmdlcjsKKworICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgorICAgIE1lcmdlUmVhZGVyJiBtTWVyZ2VSZWFkZXI7CisKKyAgICAvLyBtdXRleCBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgIE11dGV4ICAgICAgICBtTXV0ZXg7CisKKyAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKKyAgICBDb25kaXRpb24gICAgbUNvbmQ7CisKKyAgICAvLyB0aW1lIGxlZnQgdW50aWwgdGhlIHRocmVhZCBibG9ja3MgYWdhaW4gKGluIG1pY3Jvc2Vjb25kcykKKyAgICBpbnQgICAgICAgICAgbVRpbWVvdXRVczsKKworICAgIC8vIG1lcmdpbmcgcGVyaW9kIHdoZW4gdGhlIHRocmVhZCBpcyBhd2FrZQorICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87CisKKyAgICAvLyBpbml0aWFsIHRpbWVvdXQgdmFsdWUgd2hlbiB0cmlnZ2VyZWQKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkV2FrZXVwUGVyaW9kVXMgPSAzMDAwMDAwIC8qM3MqLzsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaAppbmRleCBmYjZmMTc5Li5mZDczNTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCkBAIC0xOSw1OTUgKzE5LDEwIEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfSAogI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0gKIAotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgTkJMb2cgewotCi1wdWJsaWM6Ci0KLSAgICB1c2luZyBsb2dfaGFzaF90ID0gUmVwb3J0UGVyZm9ybWFuY2U6OmxvZ19oYXNoX3Q7Ci0KLSAgICAvLyBGSVhNRSBFdmVyeXRoaW5nIG5lZWRlZCBmb3IgY2xpZW50ICh3cml0ZXIgQVBJIGFuZCByZWdpc3RyYXRpb24pIHNob3VsZCBiZSBpc29sYXRlZAotICAgIC8vICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uLgotICAgIGNsYXNzIFdyaXRlcjsKLSAgICBjbGFzcyBSZWFkZXI7Ci0KLSAgICBlbnVtIEV2ZW50IDogdWludDhfdCB7Ci0gICAgICAgIEVWRU5UX1JFU0VSVkVELAotICAgICAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCi0gICAgICAgIEVWRU5UX1RJTUVTVEFNUCwgICAgICAgICAgICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKLSAgICAgICAgRVZFTlRfSU5URUdFUiwgICAgICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUgZW50cnkKLSAgICAgICAgRVZFTlRfRkxPQVQsICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX1BJRCwgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIElEIGFuZCBwcm9jZXNzIG5hbWUKLSAgICAgICAgRVZFTlRfQVVUSE9SLCAgICAgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGxvZwotICAgICAgICBFVkVOVF9TVEFSVF9GTVQsICAgICAgICAgICAgLy8gbG9nRm9ybWF0IHN0YXJ0IGV2ZW50OiBlbnRyeSBpbmNsdWRlcyBmb3JtYXQgc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGVudHJpZXMgY29udGFpbiBmb3JtYXQgYXJndW1lbnRzCi0gICAgICAgIEVWRU5UX0hBU0gsICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgSEFTSCBvZiBsb2cgb3JpZ2luLCBvcmlnaW5hdGVzIGZyb20gaGFzaCBvZiBmaWxlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgotICAgICAgICBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsICAgLy8gc2luZ2xlIGRhdHVtIGZvciB0aW1lc3RhbXAgaGlzdG9ncmFtCi0gICAgICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UgY2FsbAotICAgICAgICBFVkVOVF9FTkRfRk1ULCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0Ci0KLSAgICAgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cwotICAgIH07Ci0KLXByaXZhdGU6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCi0KLSAgICAvLyBhIGZvcm1hdHRlZCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gICAgLy8gICAgKiBTVEFSVF9GTVQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKLSAgICAvLyAgICAqIFRJTUVTVEFNUCBlbnRyeQotICAgIC8vICAgICogSEFTSCBlbnRyeQotICAgIC8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCi0gICAgLy8gICAgKiBmb3JtYXQgYXJnMQotICAgIC8vICAgICogZm9ybWF0IGFyZzIKLSAgICAvLyAgICAqIC4uLgotICAgIC8vICAgICogRU5EX0ZNVCBlbnRyeQotCi0gICAgLy8gZW50cnkgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5Ci0gICAgc3RydWN0IGVudHJ5IHsKLSAgICAgICAgY29uc3QgdWludDhfdCB0eXBlOwotICAgICAgICBjb25zdCB1aW50OF90IGxlbmd0aDsKLSAgICAgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOwotICAgIH07Ci0KLSAgICAvLyBlbnRyeSB0YWlsIHJlcHJlc2VudGF0aW9uIChhZnRlciBkYXRhKQotICAgIHN0cnVjdCBlbmRpbmcgewotICAgICAgICB1aW50OF90IGxlbmd0aDsKLSAgICAgICAgdWludDhfdCBuZXh0WzBdOwotICAgIH07Ci0KLSAgICAvLyBlbnRyeSBpdGVyYXRvcgotICAgIGNsYXNzIEVudHJ5SXRlcmF0b3IgewotICAgIHB1YmxpYzoKLSAgICAgICAgRW50cnlJdGVyYXRvcigpOwotICAgICAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7Ci0KLSAgICAgICAgLy8gZGVyZWZlcmVuY2UgdW5kZXJseWluZyBlbnRyeQotICAgICAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7Ci0gICAgICAgIC8vIGFkdmFuY2UgdG8gbmV4dCBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvcisrKCk7IC8vICsraQotICAgICAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5Ci0gICAgICAgIEVudHJ5SXRlcmF0b3ImICAgICAgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIG5leHQoKSBjb25zdDsKLSAgICAgICAgRW50cnlJdGVyYXRvciAgICAgICAgcHJldigpIGNvbnN0OwotICAgICAgICBib29sICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7Ci0gICAgICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgaW5saW5lIGNvbnN0IFQmIHBheWxvYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IHVpbnQ4X3QqKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgdWludDhfdCAgKnB0cjsKLSAgICB9OwotCi0gICAgY2xhc3MgQWJzdHJhY3RFbnRyeSB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIC8vIEVudHJ5IHN0YXJ0aW5nIGluIHRoZSBnaXZlbiBwb2ludGVyCi0gICAgICAgIGV4cGxpY2l0IEFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpOwotICAgICAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KLQotICAgICAgICAvLyBidWlsZCBjb25jcmV0ZSBlbnRyeSBvZiBhcHByb3ByaWF0ZSBjbGFzcyBmcm9tIHBvaW50ZXIKLSAgICAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKLSAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgaGFzaCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90Ci0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgaXRlcmF0b3IgdG8gZW5kIG9mIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIC8vIGNvcGllcyBvcmRpbmFyeSBlbnRyeSBmcm9tIHNyYyB0byBkc3QsIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBlbnRyeQotICAgICAgICAvLyBzaXplX3QgICAgICBjb3B5RW50cnkoYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKmRzdCwgY29uc3QgaXRlcmF0b3IgJml0KTsKLSAgICAgICAgY29uc3QgdWludDhfdCAgKm1FbnRyeTsKLSAgICB9OwotCi0gICAgY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KLSAgICAgICAgdmlydHVhbCB+Rm9ybWF0RW50cnkoKSB7fQotCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKLQotICAgICAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKLSAgICAgICAgY29uc3QgICBjaGFyKiBmb3JtYXRTdHJpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCi0gICAgICAgIHNpemVfdCAgICAgIGZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0OwotCi0gICAgICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKLSAgICAgICAgRW50cnlJdGVyYXRvciAgICBhcmdzKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKLSAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCi0gICAgICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIGNsYXNzIEhpc3RvZ3JhbUVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB+SGlzdG9ncmFtRW50cnkoKSB7fQotCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gcHJpdmF0ZSBtZW1vcnkKLSAgICBzdHJ1Y3QgRW50cnkgewotICAgICAgICBFbnRyeShFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKLSAgICAgICAgICAgIDogbUV2ZW50KGV2ZW50KSwgbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7IH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gfkVudHJ5KCkgeyB9Ci0KLSAgICAgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKLSAgICAgICAgLy8gW3R5cGVdW2xlbmd0aF1bZGF0YSAuLi4gXVtsZW5ndGhdCi0gICAgICAgIGludCAgICAgY29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIFdyaXRlcjsKLSAgICAgICAgRXZlbnQgICAgICAgbUV2ZW50OyAgICAgLy8gZXZlbnQgdHlwZQotICAgICAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAotICAgICAgICBjb25zdCB2b2lkICptRGF0YTsgICAgICAvLyBldmVudCB0eXBlLXNwZWNpZmljIGRhdGEKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TGVuZ3RoID0gMjU1OwotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBtRGF0YVsuLi5dLCBkdXBsaWNhdGUgbUxlbmd0aAotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtPdmVyaGVhZCA9IHNpemVvZihlbnRyeSkgKyBzaXplb2YoZW5kaW5nKTsKLSAgICAgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQotICAgICAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKLSAgICAgICAgICAgIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IEhpc3RUc0VudHJ5IHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgIGludCBhdXRob3I7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgc3RydWN0IEhpc3RJbnRFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50IHZhbHVlOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5Ci0gICAgLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50Ci0gICAgLy8gIGJ5dGVbMV0gICAgICAgICAgICAgbUxlbmd0aAotICAgIC8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCi0gICAgLy8gIC4uLgotICAgIC8vICBieXRlWzIraV0gICAgICAgICAgIG1EYXRhW2ldCi0gICAgLy8gIC4uLgotICAgIC8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGhdICAgICBkdXBsaWNhdGUgY29weSBvZiBtTGVuZ3RoIHRvIHBlcm1pdCByZXZlcnNlIHNjYW4KLSAgICAvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQotCi0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCAgZm10RW50cnlMZW5ndGgoY29uc3QgdWludDhfdCAqZGF0YSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLXB1YmxpYzoKLQotICAgIC8vIExvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSwgbXVzdCBiZSBQT0QuCi0gICAgLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCi0gICAgLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KLSAgICBzdHJ1Y3QgU2hhcmVkIHsKLSAgICAgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8geyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5TaGFyZWQoKSB7IH0KLQotICAgICAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQotICAgICAgICBjaGFyICAgIG1CdWZmZXJbMF07ICAgICAgICAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBmb3IgZW50cmllcwotICAgIH07Ci0KLXB1YmxpYzoKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gRklYTUUgVGltZWxpbmUgd2FzIGludGVuZGVkIHRvIHdyYXAgV3JpdGVyIGFuZCBSZWFkZXIsIGJ1dCBpc24ndCBhY3R1YWxseSB1c2VkIHlldC4KLSAgICAvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KLSAgICBjbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0jaWYgMAotICAgICAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7Ci0jZW5kaWYKLQotICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCi0gICAgICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7Ci0KLSNpZiAwCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKLSAgICAgICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKLQotICAgICAgICBjb25zdCBzaXplX3QgICAgbVNpemU7ICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIG11c3QgYmUgYSBwb3dlciBvZiAyCi0gICAgICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0jZW5kaWYKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBXcml0ZXIgaXMgdGhyZWFkLXNhZmUgd2l0aCByZXNwZWN0IHRvIFJlYWRlciwgYnV0IG5vdCB3aXRoIHJlc3BlY3QgdG8gbXVsdGlwbGUgdGhyZWFkcwotICAgIC8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgotICAgIGNsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFdyaXRlcigpOyAgICAgICAgICAgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgfldyaXRlcigpOwotCi0gICAgICAgIC8vIEZJWE1FIG5lZWRzIGNvbW1lbnRzLCBhbmQgc29tZSBzaG91bGQgYmUgcHJpdmF0ZQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKLQotICAgICAgICAvLyByZXR1cm4gdmFsdWUgZm9yIGFsbCBvZiB0aGVzZSBpcyB0aGUgcHJldmlvdXMgaXNFbmFibGVkKCkKLSAgICAgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgYm9vbCAgICBlbmFibGUoKSAgICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9Ci0gICAgICAgIGJvb2wgICAgZGlzYWJsZSgpICAgeyByZXR1cm4gc2V0RW5hYmxlZChmYWxzZSk7IH0KLQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0ICB7IHJldHVybiBtSU1lbW9yeTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gMCA8PSBsZW5ndGggPD0ga01heExlbmd0aAotICAgICAgICAvLyB3cml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8KLSAgICAgICAgdm9pZCAgICBsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwotICAgICAgICAvLyBjaGVja3MgdmFsaWRpdHkgb2YgYW4gZXZlbnQgYmVmb3JlIGNhbGxpbmcgbG9nIGFib3ZlIHRoaXMgb25lCi0gICAgICAgIHZvaWQgICAgbG9nKGNvbnN0IEVudHJ5ICplbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOwotCi0gICAgICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeTsgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsIG5vbi1OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotICAgICAgICBhdWRpb191dGlsc19maWZvX3dyaXRlciAqIGNvbnN0IG1GaWZvV3JpdGVyOyAgICAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8sIG5vbi1OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCi0gICAgICAgIGJvb2wgICAgICAgICAgICBtRW5hYmxlZDsgICAvLyB3aGV0aGVyIHRvIGFjdHVhbGx5IGxvZwotCi0gICAgICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgotICAgICAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAotICAgICAgICBjaGFyICAgKm1QaWRUYWc7Ci0gICAgICAgIHNpemVfdCAgbVBpZFRhZ1NpemU7Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5Ci0gICAgY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBMb2NrZWRXcml0ZXIoKTsKLSAgICAgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRmxvYXQoY29uc3QgZmxvYXQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgY2xhc3MgUmVhZGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gQSBzbmFwc2hvdCBvZiBhIHJlYWRlcnMgYnVmZmVyCi0gICAgICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKLSAgICAgICAgY2xhc3MgU25hcHNob3QgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9Ci0KLSAgICAgICAgICAgIFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQotCi0gICAgICAgICAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9Ci0KLSAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9Ci0KLSAgICAgICAgICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQotICAgICAgICAgICAgc2l6ZV90ICAgbG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1Mb3N0OyB9Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90Ci0gICAgICAgICAgICAvLyBkYXRhIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBoYXMgdmFsaWQgZW50cmllcwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1CZWdpbjsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBlbmQoKSB7IHJldHVybiBtRW5kOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBNZXJnZVJlYWRlcjsKLSAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBSZWFkZXI7Ci0gICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAqbURhdGE7Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgbUxvc3Q7Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1CZWdpbjsKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgbUVuZDsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgICAgIFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLSAgICAgICAgUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+UmVhZGVyKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gZ2V0U25hcHNob3QoKTsKLQotICAgICAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBwcmludCBhIHN1bW1hcnkgb2YgdGhlIHBlcmZvcm1hbmNlIHRvIHRoZSBjb25zb2xlCi0gICAgICAgIHZvaWQgICAgZHVtcExpbmUoY29uc3QgU3RyaW5nOCYgdGltZXN0YW1wLCBTdHJpbmc4JiBib2R5KTsKLSAgICAgICAgRW50cnlJdGVyYXRvciAgIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpOwotICAgICAgICBpbnQgbUZkOyAgICAgICAgICAgICAgICAvLyBmaWxlIGRlc2NyaXB0b3IKLSAgICAgICAgaW50IG1JbmRlbnQ7ICAgICAgICAgICAgLy8gaW5kZW50YXRpb24gbGV2ZWwKLSAgICAgICAgaW50IG1Mb3N0OyAgICAgICAgICAgICAgLy8gYnl0ZXMgb2YgZGF0YSBsb3N0IGJlZm9yZSBidWZmZXIgd2FzIHJlYWQKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gc3RhcnRpbmdUeXBlczsKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKLQotICAgICAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgotICAgICAgICBzcDxJTWVtb3J5PiBtSU1lbW9yeTsgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgYXNzaWduZWQgb25seSBpbiBjb25zdHJ1Y3RvcgotCi0gICAgICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsCi0gICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotICAgICAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLQotICAgICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKLSAgICAgICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKLQotICAgICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKLSAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiAvKmZtdEVudHJ5Ki8sIFN0cmluZzgqIC8qYm9keSovKSB7fQotICAgIH07Ci0KLSAgICAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQotICAgIGNsYXNzIE5hbWVkUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE5hbWVkUmVhZGVyKCkgeyBtTmFtZVswXSA9ICdcMCc7IH0gLy8gZm9yIFZlY3RvcgotICAgICAgICBOYW1lZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgcmVhZGVyLCBjb25zdCBjaGFyICpuYW1lKSA6Ci0gICAgICAgICAgICBtUmVhZGVyKHJlYWRlcikKLSAgICAgICAgICAgIHsgc3RybGNweShtTmFtZSwgbmFtZSwgc2l6ZW9mKG1OYW1lKSk7IH0KLSAgICAgICAgfk5hbWVkUmVhZGVyKCkgeyB9Ci0gICAgICAgIGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiAgcmVhZGVyKCkgY29uc3QgeyByZXR1cm4gbVJlYWRlcjsgfQotICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8TkJMb2c6OlJlYWRlcj4gICBtUmVhZGVyOwotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOYW1lID0gMzI7Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAgICAgbU5hbWVba01heE5hbWVdOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5Ci0gICAgLy8gYW5kIHdyaXRlIGl0IHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5LgotICAgIGNsYXNzIE1lcmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5NZXJnZXIoKSB7fQotCi0gICAgICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IE5hbWVkUmVhZGVyICZyZWFkZXIpOwotICAgICAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKLSAgICAgICAgdm9pZCBtZXJnZSgpOwotCi0gICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiYgZ2V0TmFtZWRSZWFkZXJzKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgotICAgICAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrCi0gICAgICAgIHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOwotCi0gICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7IC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm8+IG1GaWZvOyAvLyBGSUZPIGl0c2VsZgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KLSAgICB9OwotCi0gICAgLy8gVGhpcyBjbGFzcyBoYXMgYSBwb2ludGVyIHRvIHRoZSBGSUZPIGluIGxvY2FsIG1lbW9yeSB3aGljaCBzdG9yZXMgdGhlIG1lcmdlZAotICAgIC8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgTmFtZWRSZWFkZXJzLiBJdCBpcyB1c2VkIHRvIHByb2Nlc3MKLSAgICAvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KLSAgICBjbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOwotCi0gICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQgPSAwKTsKLSAgICAgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgotICAgICAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmIHNuYXApOwotICAgICAgICAvLyBjYWxsIGdldFNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgYW5kIHByb2Nlc3MgdGhlIGRhdGEKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2ssCi0gICAgICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiYgbU5hbWVkUmVhZGVyczsKLQotICAgICAgICAvLyBhbmFseXplcywgY29tcHJlc3NlcyBhbmQgc3RvcmVzIHRoZSBtZXJnZWQgZGF0YQotICAgICAgICAvLyBjb250YWlucyBhIHNlcGFyYXRlIGluc3RhbmNlIGZvciBldmVyeSBhdXRob3IgKHRocmVhZCksIGFuZCBmb3IgZXZlcnkgc291cmNlIGZpbGUKLSAgICAgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCi0gICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzTWFwIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzOwotCi0gICAgICAgIC8vIGhhbmRsZSBhdXRob3IgZW50cnkgYnkgbG9va2luZyB1cCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYXBwZW5kaW5nIGl0IHRvIHRoZSBib2R5Ci0gICAgICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQotICAgICAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7Ci0gICAgfTsKLQotICAgIC8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKLSAgICAvLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgotICAgIC8vIHJldHJpZ2dlcmVkLCB0aGUgdGltZW91dCBpcyByZXNldC4KLSAgICAvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgotICAgIGNsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKLSAgICAgICAgdmlydHVhbCB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKLQotICAgICAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQotICAgICAgICB2b2lkIHdha2V1cCgpOwotCi0gICAgICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCi0gICAgICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCi0gICAgICAgIE1lcmdlciYgICAgIG1NZXJnZXI7Ci0KLSAgICAgICAgLy8gdGhlIG1lcmdlcmVhZGVyIHVzZWQgdG8gcHJvY2VzcyBkYXRhIG1lcmdlZCBieSBtTWVyZ2VyCi0gICAgICAgIE1lcmdlUmVhZGVyJiBtTWVyZ2VSZWFkZXI7Ci0KLSAgICAgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKLSAgICAgICAgTXV0ZXggICAgICAgbU11dGV4OwotCi0gICAgICAgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBhY3RpdmF0ZSBtZXJnaW5nIG9uIHRpbWVvdXQgPj0gMAotICAgICAgICBDb25kaXRpb24gICBtQ29uZDsKLQotICAgICAgICAvLyB0aW1lIGxlZnQgdW50aWwgdGhlIHRocmVhZCBibG9ja3MgYWdhaW4gKGluIG1pY3Jvc2Vjb25kcykKLSAgICAgICAgaW50ICAgICAgICAgbVRpbWVvdXRVczsKLQotICAgICAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKLQotICAgICAgICAvLyBpbml0aWFsIHRpbWVvdXQgdmFsdWUgd2hlbiB0cmlnZ2VyZWQKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Ci0gICAgfTsKLQotfTsgIC8vIGNsYXNzIE5CTG9nCi0KLS8vIFRPRE8gcHV0IHNvbWV3aGVyZSBlbHNlCi1zdGF0aWMgaW5saW5lIGludDY0X3QgZ2V0X21vbm90b25pY19ucygpIHsKLSAgICB0aW1lc3BlYyB0czsKLSAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSB0cy50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDAgKyB0cy50dl9uc2VjOwotICAgIH0KLSAgICByZXR1cm4gMDsgLy8gc2hvdWxkIG5vdCBoYXBwZW4uCi19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KIAogI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKaW5kZXggZGRmZTlkNi4uZDdjMTZiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTE5LDE0ICsxOSwxNzYgQEAKIAogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIFN0cmluZzg7CisKIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKKy8vIFRPRE8gbWFrZSB0aGlzIGEgdGVtcGxhdGVkIGNsYXNzIGFuZCBwdXQgaXQgaW4gYSBzZXBhcmF0ZSBmaWxlLgorLy8gVGhlIHRlbXBsYXRlZCBwYXJhbWV0ZXJzIHdvdWxkIGJlIGJpbiBzaXplIGFuZCBsb3cgbGltaXQuCisvKgorICogSGlzdG9ncmFtIHByb3ZpZGVzIGEgd2F5IHRvIHN0b3JlIG51bWVyaWMgZGF0YSBpbiBoaXN0b2dyYW0gZm9ybWF0IGFuZCByZWFkIGl0IGFzIGEgc2VyaWFsaXplZAorICogc3RyaW5nLiBUaGUgdGVybXMgImJpbiIgYW5kICJidWNrZXQiIGFyZSB1c2VkIGludGVyY2hhbmdlYWJseS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS4KKyAqLworY2xhc3MgSGlzdG9ncmFtIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgQ29uZmlnIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGJpblNpemU7ICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgICAgIGNvbnN0IHNpemVfdCBudW1CaW5zOworICAgICAgICBjb25zdCBkb3VibGUgbG93OyAgICAgICAvLyBUT0RPIHRlbXBsYXRlIHR5cGUKKyAgICB9OworCisgICAgLy8gSGlzdG9ncmFtcyBhcmUgY29uc3RydWN0ZWQgd2l0aCBmaXhlZCBjb25maWd1cmF0aW9uIG51bWJlcnMuIER5bmFtaWMgY29uZmlndXJhdGlvbiBiYXNlZAorICAgIC8vIHRoZSBkYXRhIGlzIHBvc3NpYmxlIGJ1dCBjb21wbGV4IGJlY2F1c2UKKyAgICAvLyAtIGRhdGEgcG9pbnRzIGFyZSBhZGRlZCBvbmUgYnkgb25lLCBub3QgcHJvY2Vzc2VkIGFzIGEgYmF0Y2guCisgICAgLy8gLSBIaXN0b2dyYW1zIHdpdGggZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgdHJpY2t5IHRvIGFnZ3JlZ2F0ZSwgYW5kIHRoZXkKKyAgICAvLyAgIHdpbGwgbmVlZCB0byBiZSBhZ2dyZWdhdGVkIGF0IHRoZSBNZWRpYSBNZXRyaWNzIGNsb3VkIHNpZGUuCisgICAgLy8gLSBub3QgcHJvdmlkaW5nIGxpbWl0cyB0aGVvcmV0aWNhbGx5IGFsbG93cyBmb3IgaW5maW5pdGUgbnVtYmVyIG9mIGJ1Y2tldHMuCisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ3JlYXRlcyBhIEhpc3RvZ3JhbSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gYmluU2l6ZSB0aGUgd2lkdGggb2YgZWFjaCBiaW4gb2YgdGhlIGhpc3RvZ3JhbSwgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogXHBhcmFtIG51bUJpbnMgdGhlIG51bWJlciBvZiBiaW5zIGRlc2lyZWQgaW4gdGhlIGhpc3RvZ3JhbSByYW5nZSwgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKyAgICAgKiBccGFyYW0gbG93ICAgICB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGhpc3RvZ3JhbSBidWNrZXQgdmFsdWVzLgorICAgICAqICAgICAgICAgICAgICAgIFVuaXRzIGFyZSB3aGF0ZXZlciBkYXRhIHRoZSBjYWxsZXIgZGVjaWRlcyB0byBzdG9yZS4KKyAgICAgKiAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHVwcGVyIGJvdW5kIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBmb2xsb3dpbmc6CisgICAgICogICAgICAgICAgICAgICAgICB1cHBlciA9IGxvd2VyICsgYmluU2l6ZSAqIG51bUJpbnMuCisgICAgICovCisgICAgSGlzdG9ncmFtKGRvdWJsZSBiaW5TaXplLCBzaXplX3QgbnVtQmlucywgZG91YmxlIGxvdyA9IDAuKQorICAgICAgICA6IG1CaW5TaXplKGJpblNpemUpLCBtTnVtQmlucyhudW1CaW5zKSwgbUxvdyhsb3cpLCBtQmlucyhtTnVtQmlucyArIDIpIHt9CisKKyAgICBIaXN0b2dyYW0oY29uc3QgQ29uZmlnICZjKQorICAgICAgICA6IEhpc3RvZ3JhbShjLmJpblNpemUsIGMubnVtQmlucywgYy5sb3cpIHt9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQWRkIGEgZGF0YSBwb2ludCB0byB0aGUgaGlzdG9ncmFtLiBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQKKyAgICAgKiAgICAgICAgaXMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiB0aGUgYmluIHNpemUgKGJlZm9yZSBhY2NvdW50aW5nCisgICAgICogICAgICAgIGZvciB0aGUgbG93ZXIgYm91bmQgb2Zmc2V0LCB3aGljaCBtYXkgbm90IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQgdG8gYWRkLgorICAgICAqLworICAgIHZvaWQgYWRkKGRvdWJsZSB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmVtb3ZlcyBhbGwgZGF0YSBwb2ludHMgZnJvbSB0aGUgaGlzdG9ncmFtLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgYWRkZWQgdG8gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBpbiB0aGUgaGlzdG9ncmFtLgorICAgICAqLworICAgIHVpbnQ2NF90IHRvdGFsQ291bnQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxicmllZiBTZXJpYWxpemVzIHRoZSBoaXN0b2dyYW0gaW50byBhIHN0cmluZy4gVGhlIGZvcm1hdCBpcyBjaG9zZW4gdG8gYmUgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgIHRoZSBoaXN0b2dyYW0gcmVwcmVzZW50YXRpb24gdG8gc2VuZCB0byB0aGUgTWVkaWEgTWV0cmljcyBzZXJ2aWNlLgorICAgICAqCisgICAgICogICAgICAgIFRoZSBzdHJpbmcgaXMgYXMgZm9sbG93czoKKyAgICAgKiAgICAgICAgICBiaW5TaXplLG51bUJpbnMsbG93LHstMXxsb3dDb3VudCwuLi4sYmluSW5kZXh8Y291bnQsLi4uLG51bUJpbnN8aGlnaENvdW50fQorICAgICAqCisgICAgICogICAgICAgIC0gYmluSW5kZXggaXMgYW4gaW50ZWdlciB3aXRoIDAgPD0gYmluSW5kZXggPCBudW1CaW5zLgorICAgICAqICAgICAgICAtIGNvdW50IGlzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIChyb3VuZGVkKSB2YWx1ZQorICAgICAqICAgICAgICAgIGxvdyArIGJpblNpemUgKiBidWNrZXRJbmRleC4KKyAgICAgKiAgICAgICAgLSBsb3dDb3VudCBpcyB0aGUgbnVtYmVyIG9mIChyb3VuZGVkKSB2YWx1ZXMgbGVzcyB0aGFuIGxvdy4KKyAgICAgKiAgICAgICAgLSBoaWdoQ291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqICAgICAgICAgIGxvdyArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqICAgICAgICAtIGEgYmluSW5kZXggbWF5IGJlIHNraXBwZWQgaWYgaXRzIGNvdW50IGlzIDAuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBoaXN0b2dyYW0gc2VyaWFsaXplZCBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCisgICAgLy8gRHJhdyBsb2cgc2NhbGUgc2lkZXdheXMgaGlzdG9ncmFtIGFzIEFTQ0lJIGFydCBhbmQgc3RvcmUgYXMgYSBzdGQ6OnN0cmluZy4KKyAgICAvLyBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgdG90YWxDb3VudCgpID09IDAuCisgICAgc3RkOjpzdHJpbmcgYXNjaWlBcnRTdHJpbmcoc2l6ZV90IGluZGVudCA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIEhpc3RvZ3JhbSB2ZXJzaW9uIG51bWJlci4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrVmVyc2lvbiA9IDE7CisKKyAgICBjb25zdCBkb3VibGUgbUJpblNpemU7ICAgICAgICAgIC8vIFNpemUgb2YgZWFjaCBidWNrZXQKKyAgICBjb25zdCBzaXplX3QgbU51bUJpbnM7ICAgICAgICAgIC8vIE51bWJlciBvZiBidWNrZXRzIGluIHJhbmdlIChleGNsdWRlcyBsb3cgYW5kIGhpZ2gpCisgICAgY29uc3QgZG91YmxlIG1Mb3c7ICAgICAgICAgICAgICAvLyBMb3dlciBib3VuZCBvZiB2YWx1ZXMKKworICAgIC8vIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBhY3R1YWwgaGlzdG9ncmFtLiBDb3VudHMgb2YgYmluIHZhbHVlcyBsZXNzIHRoYW4gbUxvdworICAgIC8vIGFyZSBzdG9yZWQgaW4gbUJpbnNbMF0uIEJpbiBpbmRleCBpIGNvcnJlc3BvbmRzIHRvIG1CaW5zW2krMV0uIENvdW50cyBvZiBiaW4gdmFsdWVzCisgICAgLy8gPj0gaGlnaCBhcmUgc3RvcmVkIGluIG1CaW5zW21OdW1CaW5zICsgMV0uCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IG1CaW5zOworCisgICAgdWludDY0X3QgbVRvdGFsQ291bnQgPSAwOyAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgdmFsdWVzIHJlY29yZGVkCit9OworCisvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJ1dCBQZXJmb3JtYW5jZUFuYWx5c2lzCisvLyBhbHNvIGRvZXMgc29tZSBhZGRpdGlvbmFsIGFuYWx5emluZyBvZiBkYXRhLCB3aGlsZSB0aGUgcHVycG9zZSBvZiB0aGlzIHN0cnVjdCBpcworLy8gdG8gaG9sZCBkYXRhLgorc3RydWN0IFBlcmZvcm1hbmNlRGF0YSB7CisgICAgLy8gVE9ETyB0aGUgSGlzdG9ncmFtOjpDb25maWcgbnVtYmVycyBiZWxvdyBhcmUgZm9yIEZhc3RNaXhlci4KKyAgICAvLyBTcGVjaWZ5IGRpZmZlcmVudCBudW1iZXJzIGZvciBvdGhlciB0aHJlYWQgdHlwZXMuCisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gbVVuZGVycnVuTnMgYW5kIG1PdmVycnVuTnMgaW4gRmFzdE1peGVyLmNwcCBmb3IgZnJhbWVDb3VudCA9IDE5MgorICAgIC8vIGFuZCBtU2FtcGxlUmF0ZSA9IDQ4MDAwLCB3aGljaCBjb3JyZXNwb25kIHRvIDIgYW5kIDcgc2Vjb25kcy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtXb3JrQ29uZmlnID0geyAwLjI1LCAyMCwgMi59OworCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIHRyaWFsIGFuZCBlcnJvciBsb2dnaW5nLiBOZWVkIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUKKyAgICAvLyBiaW4gc2l6ZSBhbmQgbG93ZXIvdXBwZXIgbGltaXRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga0xhdGVuY3lDb25maWcgPSB7IDIuLCAxMCwgMTAufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtXYXJtdXBDb25maWcgPSB7IDUuLCAxMCwgMTAufTsKKworICAgIE5CTG9nOjp0aHJlYWRfaW5mb190IHRocmVhZEluZm97fTsKKyAgICBOQkxvZzo6dGhyZWFkX3BhcmFtc190IHRocmVhZFBhcmFtc3t9OworCisgICAgLy8gUGVyZm9ybWFuY2UgRGF0YQorICAgIEhpc3RvZ3JhbSB3b3JrSGlzdHtrV29ya0NvbmZpZ307CisgICAgSGlzdG9ncmFtIGxhdGVuY3lIaXN0e2tMYXRlbmN5Q29uZmlnfTsKKyAgICBIaXN0b2dyYW0gd2FybXVwSGlzdHtrV2FybXVwQ29uZmlnfTsKKyAgICBpbnQ2NF90IHVuZGVycnVucyA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heFNuYXBzaG90c1RvU3RvcmUgPSAyNTY7CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8TkJMb2c6OkV2ZW50LCBpbnQ2NF90IC8qdGltZXN0YW1wKi8+PiBzbmFwc2hvdHM7CisgICAgaW50NjRfdCBvdmVycnVucyA9IDA7CisgICAgbnNlY3NfdCBhY3RpdmUgPSAwOworICAgIG5zZWNzX3Qgc3RhcnR7c3lzdGVtVGltZSgpfTsKKworICAgIC8vIFJlc2V0IHRoZSBwZXJmb3JtYW5jZSBkYXRhLiBUaGlzIGRvZXMgbm90IHJlcHJlc2VudCBhIHRocmVhZCBzdGF0ZSBjaGFuZ2UuCisgICAgLy8gVGhyZWFkIGluZm8gaXMgbm90IHJlc2V0IGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBtZWFudCB0byBiZSBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgdGhyZWFkCisgICAgLy8gdGhhdCBzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICB3b3JrSGlzdC5jbGVhcigpOworICAgICAgICBsYXRlbmN5SGlzdC5jbGVhcigpOworICAgICAgICB3YXJtdXBIaXN0LmNsZWFyKCk7CisgICAgICAgIHVuZGVycnVucyA9IDA7CisgICAgICAgIG92ZXJydW5zID0gMDsKKyAgICAgICAgYWN0aXZlID0gMDsKKyAgICAgICAgc3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgcGVyZm9ybWFuY2UgZGF0YSBoYXMgbm90IGJlZW4gcmVjb3JkZWQgeWV0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdvcmtIaXN0LnRvdGFsQ291bnQoKSA9PSAwICYmIGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA9PSAwCisgICAgICAgICAgICAgICAgJiYgd2FybXVwSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiB1bmRlcnJ1bnMgPT0gMCAmJiBvdmVycnVucyA9PSAwCisgICAgICAgICAgICAgICAgJiYgYWN0aXZlID09IDA7CisgICAgfQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpczsKIAogLy8gYSBtYXAgb2YgUGVyZm9ybWFuY2VBbmFseXNpcyBpbnN0YW5jZXMKQEAgLTgwLDcgKzI0Miw3IEBACiAgICAgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+IG1QZWFrVGltZXN0YW1wczsKIAogICAgIC8vIHN0b3JlcyBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCi0gICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtSGlzdHM7CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0Pj4gbUhpc3RzOwogCiAgICAgLy8gUGFyYW1ldGVycyB1c2VkIHdoZW4gZGV0ZWN0aW5nIG91dGxpZXJzCiAgICAgc3RydWN0IEJ1ZmZlclBlcmlvZCB7CkBAIC0xMTksOCArMjgxLDcgQEAKIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQsIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOwogdm9pZCBkdW1wTGluZShpbnQgZmQsIGludCBpbmRlbnQsIGNvbnN0IFN0cmluZzggJmJvZHkpOwogCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCit9ICAgLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NWU4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3JlYWRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworY2xhc3MgU3RyaW5nODsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworc3RydWN0IFNoYXJlZDsKKworLy8gTkJMb2cgUmVhZGVyIEFQSQorCitjbGFzcyBTbmFwc2hvdDsgICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gbmVlZGVkIGZvciBSZWFkZXI6OmdldFNuYXBzaG90KCkKKworY2xhc3MgUmVhZGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgorICAgIFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIH5SZWFkZXIoKSBvdmVycmlkZTsKKworICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gZ2V0U25hcHNob3QoYm9vbCBmbHVzaCA9IHRydWUpOworICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCitwcml2YXRlOgorICAgIC8vIEFtb3VudCBvZiB0cmllcyBmb3IgcmVhZGVyIHRvIGNhdGNoIHVwIHdpdGggd3JpdGVyIGluIGdldFNuYXBzaG90KCkuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heE9idGFpblRyaWVzID0gMzsKKworICAgIC8vIGludmFsaWRCZWdpblR5cGVzIGFuZCBpbnZhbGlkRW5kVHlwZXMgYXJlIHVzZWQgdG8gYWxpZ24gdGhlIFNuYXBzaG90OjpiZWdpbigpIGFuZAorICAgIC8vIFNuYXBzaG90OjplbmQoKSBFbnRyeUl0ZXJhdG9ycyB0byB2YWxpZCBlbnRyaWVzLgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IGludmFsaWRCZWdpblR5cGVzOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IGludmFsaWRFbmRUeXBlczsKKworICAgIC8vIGRlY2xhcmVkIGFzIGNvbnN0IGJlY2F1c2UgYXVkaW9fdXRpbHNfZmlmbygpIGNvbnN0cnVjdG9yCisgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgICAgICAgICAgIC8vIG5hbWUgb2YgcmVhZGVyIChhY3R1YWxseSBuYW1lIG9mIHdyaXRlcikKKyAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CisgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKworICAgIC8vIFNlYXJjaGVzIGZvciB0aGUgbGFzdCB2YWxpZCBlbnRyeSBpbiB0aGUgcmFuZ2UgW2Zyb250LCBiYWNrKQorICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZExhc3RWYWxpZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+ICZpbnZhbGlkVHlwZXMpOworfTsKKworLy8gQSBzbmFwc2hvdCBvZiBhIHJlYWRlcnMgYnVmZmVyCisvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0CitjbGFzcyBTbmFwc2hvdCB7CitwdWJsaWM6CisgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQorCisgICAgLy8gYW1vdW50IG9mIGRhdGEgbG9zdCAoZ2l2ZW4gYnkgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIpCisgICAgc2l6ZV90IGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQorCisgICAgLy8gaXRlcmF0b3IgdG8gYmVnaW5uaW5nIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKKyAgICAvLyBkYXRhIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBoYXMgdmFsaWQgZW50cmllcworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtQmVnaW47IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGVuZCBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgRW50cnlJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtRW5kOyB9CisKK3ByaXZhdGU6CisgICAgU25hcHNob3QoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgU25hcHNob3Qoc2l6ZV90IGJ1ZmZlclNpemUpIDogbURhdGEobmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV0pIHt9CisgICAgZnJpZW5kIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gUmVhZGVyOjpnZXRTbmFwc2hvdChib29sIGZsdXNoKTsKKworICAgIHVpbnQ4X3QgKiBjb25zdCAgICAgICBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0ID0gMDsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUJlZ2luOworICAgIEVudHJ5SXRlcmF0b3IgICAgICAgICBtRW5kOworfTsKKworLy8gVE9ETyBtb3ZlIHRoaXMgdG8gTWVkaWFMb2dTZXJ2aWNlPworY2xhc3MgRHVtcFJlYWRlciA6IHB1YmxpYyBOQkxvZzo6UmVhZGVyIHsKK3B1YmxpYzoKKyAgICBEdW1wUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpIHt9CisgICAgRHVtcFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IFJlYWRlcihpTWVtb3J5LCBzaXplLCBuYW1lKSB7fQorICAgIHZvaWQgZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQgPSAwKTsKK3ByaXZhdGU6CisgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgZm10RW50cnkgX191bnVzZWQsIFN0cmluZzgqIGJvZHkgX191bnVzZWQpIHt9CisgICAgRW50cnlJdGVyYXRvciBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICp0aW1lc3RhbXAsIFN0cmluZzggKmJvZHkpOworCisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisKKyAgICAvLyBUaGUgYnVmZmVyRHVtcCBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5LgorICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKaW5kZXggZWMwODQyZi4uNjRhNTcwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaApAQCAtMjIsMTkgKzIyLDMzIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRoZSBTdHJpbmc4IGNsYXNzIGlzIHVzZWQgYnkgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24KLWNsYXNzIFN0cmluZzg7Ci0KIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKK3N0cnVjdCBQZXJmb3JtYW5jZURhdGE7CisKKy8vIER1bXBzIHBlcmZvcm1hbmNlIGRhdGEgaW4gYSBKU09OIGZvcm1hdC4KK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvL0R1bXBzIHBlcmZvcm1hbmNlIGRhdGEgYXMgdmlzdWFsaXplZCBwbG90cy4KK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy8gRHVtcHMgc25hcHNob3RzIGF0IGltcG9ydGFudCBldmVudHMgaW4gdGhlIHBhc3QuCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIFNlbmQgb25lIHRocmVhZCdzIGRhdGEgdG8gbWVkaWEgbWV0cmljcywgaWYgdGhlIHBlcmZvcm1hbmNlIGRhdGEgaXMgbm9udHJpdmlhbCAoaS5lLiBub3QKKy8vIGFsbCB6ZXJvIHZhbHVlcykuIFJldHVybiB0cnVlIGlmIGRhdGEgd2FzIHNlbnQsIGZhbHNlIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gd3JpdGUKKy8vIG9yIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcuCitib29sIHNlbmRUb01lZGlhTWV0cmljcyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjb25zdGV4cHIgaW50IGtNc1BlclNlYyA9IDEwMDA7CiBjb25zdGV4cHIgaW50IGtTZWNQZXJNaW4gPSA2MDsKIAogY29uc3RleHByIGludCBrSmlmZnlQZXJNcyA9IDEwOyAvLyB0aW1lIHVuaXQgZm9yIGhpc3RvZ3JhbSBhcyBhIG11bHRpcGxlIG9mIG1pbGxpc2Vjb25kcwogCiAvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZCAobXVsdGlwbGUgb2YgamlmZnkpLiB2YWx1ZTogY291bnQKLXVzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKK3VzaW5nIEhpc3QgPSBzdGQ6Om1hcDxpbnQsIGludD47CiAKIHVzaW5nIG1zSW50ZXJ2YWwgPSBkb3VibGU7CiB1c2luZyBqaWZmeUludGVydmFsID0gZG91YmxlOwpAQCAtNTcsMTMgKzcxLDEyIEBACiB9CiAKIC8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgcGVha3MgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgdG8gYSBmaWxlLgotdm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKK3ZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0Pj4gJmhpc3RzLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxtc0ludGVydmFsLCB0aW1lc3RhbXA+PiAmb3V0bGllckRhdGEsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiAmcGVha1RpbWVzdGFtcHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrRGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9SRVBPUlRQRVJGT1JNQU5DRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmMGNmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1RJTUVMSU5FX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm9faW5kZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIExvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSwgbXVzdCBiZSBQT0QuCisvLyBFeGFjdGx5IG9uZSBwcm9jZXNzIG11c3QgZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvciB1c2UgcGxhY2VtZW50IG5ldy4KKy8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCitzdHJ1Y3QgU2hhcmVkIHsKKyAgICBTaGFyZWQoKSAvKiBtUmVhciBpbml0aWFsaXplZCB2aWEgZGVmYXVsdCBjb25zdHJ1Y3RvciAqLyB7fQorICAgIH5TaGFyZWQoKSB7fQorCisgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKKyAgICBjaGFyICAgIG1CdWZmZXJbMF07ICAgICAgICAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBmb3IgZW50cmllcworfTsKKworLy8gRklYTUUgVGltZWxpbmUgd2FzIGludGVuZGVkIHRvIHdyYXAgV3JpdGVyIGFuZCBSZWFkZXIsIGJ1dCBpc24ndCBhY3R1YWxseSB1c2VkIHlldC4KKy8vIEZvciBub3cgaXQgaXMganVzdCBhIG5hbWVzcGFjZSBmb3Igc2hhcmVkU2l6ZSgpLgorY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisjaWYgMAorICAgIFRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOworI2VuZGlmCisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gUmV0dXJucyB0aGUgc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMiwgcGx1cyB0aGUgY29uc3RhbnQgc2l6ZSBvdmVyaGVhZCBmb3IgaW5kaWNlcy4KKyAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOworCisjaWYgMAorcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgICAgV3JpdGVyOworICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7CisKKyAgICBjb25zdCBzaXplX3QgICAgbVNpemU7ICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIG11c3QgYmUgYSBwb3dlciBvZiAyCisgICAgYm9vbCAgICAgICAgICAgIG1Pd247ICAgICAgIC8vIHdoZXRoZXIgSSBvd24gdGhlIG1lbW9yeSBhdCBtU2hhcmVkCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorI2VuZGlmCit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1RJTUVMSU5FX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2QzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfV1JJVEVSX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmbzsKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK2NsYXNzIEVudHJ5Oworc3RydWN0IFNoYXJlZDsKKworLy8gTkJMb2cgV3JpdGVyIEludGVyZmFjZQorCisvLyBXcml0ZXIgaXMgdGhyZWFkLXNhZmUgd2l0aCByZXNwZWN0IHRvIFJlYWRlciwgYnV0IG5vdCB3aXRoIHJlc3BlY3QgdG8gbXVsdGlwbGUgdGhyZWFkcworLy8gY2FsbGluZyBXcml0ZXIgbWV0aG9kcy4gIElmIHlvdSBuZWVkIG11bHRpLXRocmVhZCBzYWZldHkgZm9yIHdyaXRpbmcsIHVzZSBMb2NrZWRXcml0ZXIuCitjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgV3JpdGVyKCkgPSBkZWZhdWx0OyAgICAgICAgIC8vIGR1bW15IG5vcCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHNoYXJlZCBtZW1vcnkKKworICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgorICAgIFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKyAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKKworICAgIH5Xcml0ZXIoKSBvdmVycmlkZTsKKworICAgIC8vIEZJWE1FIG5lZWRzIGNvbW1lbnRzLCBhbmQgc29tZSBzaG91bGQgYmUgcHJpdmF0ZQorICAgIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7CisgICAgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKKyAgICB2b2lkICAgIGxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKTsKKyAgICB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOworCisgICAgLy8gTG9nIGRhdGEgcmVsYXRlZCB0byBFdmVudCBFLiBTZWUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBmb3IgdGhlIHR5cGUgb2YgZGF0YQorICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV2ZW50LiBGb3IgZXhhbXBsZSwgaWYgeW91IHNlZSBhIG1hcHBpbmcgc3RhdGVtZW50OgorICAgIC8vICAgICBNQVBfVFlQRV9UT19FVkVOVChFLCBUKTsKKyAgICAvLyB0aGVuIHRoZSB1c2FnZSBvZiB0aGlzIG1ldGhvZCB3b3VsZCBiZToKKyAgICAvLyAgICAgVCBkYXRhID0gZG9Db21wdXRhdGlvbigpOworICAgIC8vICAgICB0bE5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkU+KGRhdGEpOworICAgIHRlbXBsYXRlPEV2ZW50IEU+CisgICAgdm9pZCAgICBsb2codHlwZW5hbWUgZ2V0X21hcHBlZDxFPjo6dHlwZSBkYXRhKSB7CisgICAgICAgIGxvZyhFLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm4gdmFsdWUgZm9yIGFsbCBvZiB0aGVzZSBpcyB0aGUgcHJldmlvdXMgaXNFbmFibGVkKCkKKyAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOyAgIC8vIGJ1dCB3b24ndCBlbmFibGUgaWYgbm8gc2hhcmVkIG1lbW9yeQorICAgIGJvb2wgICAgICAgICAgICBlbmFibGUoKSAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQorICAgIGJvb2wgICAgICAgICAgICBkaXNhYmxlKCkgeyByZXR1cm4gc2V0RW5hYmxlZChmYWxzZSk7IH0KKworICAgIHNwPElNZW1vcnk+ICAgICBnZXRJTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gbUlNZW1vcnk7IH0KKworICAgIC8vIFB1YmxpYyBsb2dnaW5nIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWx3YXlzIHVzZSBvbmUgb2YgdGhlCisgICAgLy8gdHdvIGxvZygpIGZ1bmN0aW9uIGNhbGxzIGJlbG93IHRvIHdyaXRlIHRvIHNoYXJlZCBtZW1vcnkuCitwcm90ZWN0ZWQ6CisgICAgLy8gV3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPIGlmIHRoZSB3cml0ZXIgaXMgZW5hYmxlZC4KKyAgICAvLyBUaGlzIGlzIHByb3RlY3RlZCBhbmQgdmlydHVhbCBiZWNhdXNlIExvY2tlZFdyaXRlciB1c2VzIGEgbG9jayB0byBwcm90ZWN0CisgICAgLy8gd3JpdGluZyB0byB0aGUgRklGTyBiZWZvcmUgd3JpdGluZyB0byB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gMCA8PSBsZW5ndGggPD0ga01heExlbmd0aAorICAgIC8vIExvZyBhIHNpbmdsZSBFbnRyeSB3aXRoIGNvcnJlc3BvbmRpbmcgZXZlbnQsIGRhdGEsIGFuZCBsZW5ndGguCisgICAgdm9pZCAgICBsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworCisgICAgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOworCisgICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9nZ2luZyBwYXJ0cyBvZiBhIGZvcm1hdHRlZCBlbnRyeQorICAgIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKKyAgICB2b2lkICAgIGxvZ1RpbWVzdGFtcEZvcm1hdCgpOworICAgIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7CisKKyAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZHt9OyAgICAgICAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisgICAgc3A8SU1lbW9yeT4gICAgIG1JTWVtb3J5e307ICAgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjb25zdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmb3t9OyAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKKyAgICBhdWRpb191dGlsc19maWZvX3dyaXRlciAqIGNvbnN0IG1GaWZvV3JpdGVye307ICAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8sIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKKyAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsgICAvLyB3aGV0aGVyIHRvIGFjdHVhbGx5IGxvZworCisgICAgLy8gY2FjaGVkIHBpZCBhbmQgcHJvY2VzcyBuYW1lIHRvIHVzZSBpbiAlcCBmb3JtYXQgc3BlY2lmaWVyCisgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKKyAgICBjaGFyICAgKm1QaWRUYWd7fTsKKyAgICBzaXplX3QgIG1QaWRUYWdTaXplID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTaW1pbGFyIHRvIFdyaXRlciwgYnV0IHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCBjb25jdXJyZW50bHkKK2NsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgeworcHVibGljOgorICAgIExvY2tlZFdyaXRlcigpID0gZGVmYXVsdDsKKyAgICBMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8vIExvY2sgbmVlZHMgdG8gYmUgb2J0YWluZWQgYmVmb3JlIHdyaXRpbmcgdG8gRklGTy4KKyAgICB2b2lkIGxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfV1JJVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDgxYTQ2NDAuLjFkZWU0ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgpAQCAtMTcxLDExICsxNzIsNyBAQAogfQogCiBzdHJ1Y3QgQ29kZWNPYnNlcnZlciA6IHB1YmxpYyBCbk9NWE9ic2VydmVyIHsKLSAgICBDb2RlY09ic2VydmVyKCkge30KLQotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgICAgICBtTm90aWZ5ID0gbXNnOwotICAgIH0KKyAgICBleHBsaWNpdCBDb2RlY09ic2VydmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA6IG1Ob3RpZnkobXNnKSB7fQogCiAgICAgLy8gZnJvbSBJT01YT2JzZXJ2ZXIKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlcyhjb25zdCBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgewpAQCAtMjUxLDcgKzI0OCw3IEBACiAgICAgdmlydHVhbCB+Q29kZWNPYnNlcnZlcigpIHt9CiAKIHByaXZhdGU6Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlY09ic2VydmVyKTsKIH07CkBAIC01NzYsNiArNTczLDcgQEAKICAgICAgIG1UdW5uZWxlZChmYWxzZSksCiAgICAgICBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCgoT01YX0lOREVYVFlQRSkwKSwKICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCgoT01YX0lOREVYVFlQRSkwKSwKKyAgICAgIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCgoT01YX0lOREVYVFlQRSkwKSwKICAgICAgIG1TdGF0ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmVuZG9yRXh0ZW5zaW9uc1N0YXR1cyhrRXh0ZW5zaW9uc1VuY2hlY2tlZCkgewogICAgIG1lbXNldCgmbUxhc3RIRFJTdGF0aWNJbmZvLCAwLCBzaXplb2YobUxhc3RIRFJTdGF0aWNJbmZvKSk7CkBAIC0xNzQ5LDI5ICsxNzQ3LDMyIEBACiAgICAgfQogCiAgICAgaW50MzJfdCBzdG9yZU1ldGE7Ci0gICAgaWYgKGVuY29kZXIKLSAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCi0gICAgICAgICAgICAmJiBzdG9yZU1ldGEgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpIHsKLSAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZTsKLSAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY05hdGl2ZUhhbmRsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlciB8fAotICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIElPTVg6OlBvcnRNb2RlIG1vZGUgPSBJT01YOjprUG9ydE1vZGVQcmVzZXRCeXRlQnVmZmVyOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKKyAgICAgICAgICAgICAgICAmJiBzdG9yZU1ldGEgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlciB8fAorICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlcnIgPSBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIG1vZGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOwotICAgICAgICBpZiAobU9NWE5vZGUtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAotICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgewotICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICBpZiAobW9kZSAhPSBJT01YOjprUG9ydE1vZGVQcmVzZXRCeXRlQnVmZmVyKSB7CisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7CisgICAgICAgICAgICBpZiAobU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKKyAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7CisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTgxNywyMCArMTgxOCwxOSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciIsCi0gICAgICAgICAgICAgICAgICAgICZtUmVwZWF0RnJhbWVEZWxheVVzKSkgeworICAgICAgICAgICAgICAgIEtFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIsICZtUmVwZWF0RnJhbWVEZWxheVVzKSkgewogICAgICAgICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xTEw7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBvbmx5IGFsbG93IDMyLWJpdCB2YWx1ZSwgc2luY2Ugd2UgcGFzcyBpdCBhcyBVMzIgdG8gT01YLgotICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJm1NYXhQdHNHYXBVcykpIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwgJm1NYXhQdHNHYXBVcykpIHsKICAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IDBMTDsKICAgICAgICAgfSBlbHNlIGlmIChtTWF4UHRzR2FwVXMgPiBJTlQzMl9NQVggfHwgbU1heFB0c0dhcFVzIDwgSU5UMzJfTUlOKSB7CiAgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIG1heCBwdHMgZ2FwICVsbGQiLCAobG9uZyBsb25nKSBtTWF4UHRzR2FwVXMpOwogICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMExMOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgibWF4LWZwcy10by1lbmNvZGVyIiwgJm1NYXhGcHMpKSB7CisgICAgICAgIGlmICghbXNnLT5maW5kRmxvYXQoS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwgJm1NYXhGcHMpKSB7CiAgICAgICAgICAgICBtTWF4RnBzID0gLTE7CiAgICAgICAgIH0KIApAQCAtMTg0NCw4ICsxODQ0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpKSB7CisgICAgICAgICAgICAgICAgS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCopJm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpKSB7CiAgICAgICAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDg5LDcgKzIwODksOCBAQAogICAgICAgICBpZiAodXNpbmdTd1JlbmRlcmVyKSB7CiAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZW5kZXJlciIsIDEpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykgfHwKKyAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CkBAIC0yMTgwLDcgKzIxODEsOCBAQAogICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewotICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMCwgc2FtcGxlUmF0ZSA9IDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKKyAgICAgICAgLy8gbnVtQ2hhbm5lbHMgbmVlZHMgdG8gYmUgc2V0IHRvIHByb3Blcmx5IGNvbW11bmljYXRlIFBDTSB2YWx1ZXMuCisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAyLCBzYW1wbGVSYXRlID0gNDQxMDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKICAgICAgICAgaWYgKGVuY29kZXIgJiYKICAgICAgICAgICAgICAgICAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkpIHsKQEAgLTIyMDYsNyArMjIwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwsIHBjbUVuY29kaW5nKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtMjIzNSw2ICsyMjM3LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEVBQzNDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpKSB7CisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKKyAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQUM0Q29kZWMoZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjMwOCwxMiArMjMxOSwxNiBAQAogICAgICAgICAgICAgKHZvaWQpbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZW5jb2RlciAlcyBpbnB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBwY21FbmNvZGluZywgY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKHZvaWQpbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgbUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUoY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZGVjb2RlciAlcyBvdXRwdXQgZm9ybWF0IHBjbSBlbmNvZGluZyBjb252ZXJ0ZXIgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzNDYsNiArMjM2MSwxNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpIHsKKyAgICBPTVhfQVVESU9fQ09ORklHX0FORFJPSURfQVVESU9QUkVTRU5UQVRJT04gY29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJmNvbmZpZyk7CisgICAgY29uZmlnLm5QcmVzZW50YXRpb25JZCA9IChPTVhfUzMyKXByZXNlbnRhdGlvbklkOworICAgIGNvbmZpZy5uUHJvZ3JhbUlkID0gKE9NWF9TMzIpcHJvZ3JhbUlkOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBdWRpb1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpIHsKICAgICBpZiAocHJpb3JpdHkgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yODkxLDYgKzI5MTcsMzggQEAKICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkRWFjMywgJmRlZiwgc2l6ZW9mKGRlZikpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldHVwQUM0Q29kZWMoCisgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBSYXdBdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgIGVuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgQUxPR1coIkFDNCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUM0VFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKKworICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwgJmRlZiwgc2l6ZW9mKGRlZikpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGRlZi5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICBkZWYublNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgICAgcmV0dXJuIG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwgJmRlZiwgc2l6ZW9mKGRlZikpOworfQorCiBzdGF0aWMgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBwaWNrTW9kZUZyb21CaXRSYXRlKAogICAgICAgICBib29sIGlzQU1SV0IsIGludDMyX3QgYnBzKSB7CiAgICAgaWYgKGlzQU1SV0IpIHsKQEAgLTI5NzQsOCArMzAzMiw4IEBACiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCi0gICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpIHsKLQorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAorICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKSB7CiAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFIGRlZjsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKQEAgLTI5OTgsNyArMzA1Niw4IEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwKICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBudW1DaGFubmVscyk7CisgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgIGVuY29kaW5nKTsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFJhd0F1ZGlvRm9ybWF0KApAQCAtMzA1Niw2ICszMTE1LDcgQEAKICAgICBwY21QYXJhbXMuZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKIAogICAgIGlmIChnZXRPTVhDaGFubmVsTWFwcGluZyhudW1DaGFubmVscywgcGNtUGFyYW1zLmVDaGFubmVsTWFwcGluZykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbmNvcnJlY3QgbnVtQ2hhbm5lbHM6ICVkIiwgX19mdW5jX18sIG51bUNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCkBAIC0zNzExLDggKzM3NzEsMTcgQEAKICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIiwgJm1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIiwgJm1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKSB7CkBAIC00MjI2LDI0ICs0Mjk1LDI3IEBACiAgICAgaW50IG1heERpbWVuc2lvbiA9IG1heCh3aWR0aCwgaGVpZ2h0KTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQgbGltaXRzW11bNV0gPSB7Ci0gICAgICAgIC8qICAgTUJwcyAgICAgTUIgICBkaW0gIGJpdHJhdGUgICAgICAgIGxldmVsICovCi0gICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgIDY0LCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAotICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgIDEyOCwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICAgICAgeyAgICAzMDAwLCAgIDM5NiwgIDU2LCAgICAxOTIsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCi0gICAgICAgIHsgICAgNjAwMCwgICAzOTYsICA1NiwgICAgMzg0LCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAotICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgIDc2OCwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgIDIwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCi0gICAgICAgIHsgICAxOTgwMCwgICA3OTIsICA3OSwgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAotICAgICAgICB7ICAgMjAyNTAsICAxNjIwLCAxMTMsICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICAgICAgeyAgIDQwNTAwLCAgMTYyMCwgMTEzLCAgMTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCi0gICAgICAgIHsgIDEwODAwMCwgIDM2MDAsIDE2OSwgIDE0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAotICAgICAgICB7ICAyMTYwMDAsICA1MTIwLCAyMDIsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCi0gICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAotICAgICAgICB7ICA1MjIyNDAsICA4NzA0LCAyNjMsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKLSAgICAgICAgeyAgNTg5ODI0LCAyMjA4MCwgNDIwLCAxMzUwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCi0gICAgICAgIHsgIDk4MzA0MCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAotICAgICAgICB7IDIwNzM2MDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgLyogICAgTUJwcyAgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLworICAgICAgICB7ICAgICAxNDg1LCAgICAgOTksICAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICAgICAgeyAgICAgMTQ4NSwgICAgIDk5LCAgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgICAgIHsgICAgIDMwMDAsICAgIDM5NiwgICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgICAgICB7ICAgICA2MDAwLCAgICAzOTYsICAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAgICAxMTg4MCwgICAgMzk2LCAgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgICAgIHsgICAgMTE4ODAsICAgIDM5NiwgICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgICAgICB7ICAgIDE5ODAwLCAgICA3OTIsICAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAgICAyMDI1MCwgICAxNjIwLCAgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgICAgIHsgICAgNDA1MDAsICAgMTYyMCwgIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgICAgICB7ICAgMTA4MDAwLCAgIDM2MDAsICAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAgIDIxNjAwMCwgICA1MTIwLCAgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgICAgIHsgICAyNDU3NjAsICAgODE5MiwgIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgICAgICB7ICAgMjQ1NzYwLCAgIDgxOTIsICAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICAgICAgeyAgIDUyMjI0MCwgICA4NzA0LCAgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgICAgIHsgICA1ODk4MjQsICAyMjA4MCwgIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgICAgICB7ICAgOTgzMDQwLCAgMzY4NjQsICA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICAgICAgeyAgMjA3MzYwMCwgIDM2ODY0LCAgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgIDQxNzc5MjAsIDEzOTI2NCwgMTA1NSwgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2ICB9LAorICAgICAgICB7ICA4MzU1ODQwLCAxMzkyNjQsIDEwNTUsIDQ4MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNjEgfSwKKyAgICAgICAgeyAxNjcxMTY4MCwgMTM5MjY0LCAxMDU1LCA4MDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW1pdHMpOyBpKyspIHsKQEAgLTQzNTYsNyArNDQyOCw3IEBACiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAyOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7CiAKLSAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcworICAgICAgICAvLyBkaXNhYmxlIEItZnJhbWVzIHVudGlsIHdlIGhhdmUgZXhwbGljaXQgc2V0dGluZ3MgZm9yIGVuYWJsaW5nIHRoZSBmZWF0dXJlLgogICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKICAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOwogCkBAIC01MjQ0LDYgKzUzMTYsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDNDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgcGFyYW1zOwpAQCAtNTMyNCw2ICs1NDE1LDcwIEBACiAgICAgcmV0dXJuIGdldFZlbmRvclBhcmFtZXRlcnMocG9ydEluZGV4LCBub3RpZnkpOwogfQogCitEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIEFDb2RlYzo6Z2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0SERSMTBQbHVzSW5mbzogZG9lcyBub3Qgc3VwcG9ydCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSAtIDEgKworICAgICAgICAgICAgKChwYXJhbVNpemVVc2VkID4gMCkgPyBwYXJhbVNpemVVc2VkIDogNTEyKTsKKyAgICBpZiAobUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgbmV3U2l6ZSA+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdTaXplKTsKKyAgICB9CisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPQorICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKW1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5kYXRhKCk7CisgICAgSW5pdE9NWFBhcmFtcyhjb25maWcpOworICAgIGNvbmZpZy0+blNpemUgPSBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpOworICAgIGNvbmZpZy0+blBvcnRJbmRleCA9IDE7CisgICAgc2l6ZV90IHBhcmFtU2l6ZSA9IGNvbmZpZy0+blNpemUgLSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSArIDE7CisgICAgY29uZmlnLT5uUGFyYW1TaXplID0gcGFyYW1TaXplOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPSAwOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSltRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgICBjb25maWcsIGNvbmZpZy0+blNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIChlcnIgJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemUgIT0gcGFyYW1TaXplKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgYWx0ZXJzIG5QYXJhbVNpemU6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplLCBwYXJhbVNpemUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKHBhcmFtU2l6ZVVzZWQgPiAwICYmIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgIT0gcGFyYW1TaXplVXNlZCkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIHJldHVybnMgd3JvbmcgblBhcmFtU2l6ZVVzZWQ6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCwgcGFyYW1TaXplVXNlZCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29uZmlnOworfQorCit2b2lkIEFDb2RlYzo6b25Db25maWdVcGRhdGUoT01YX0lOREVYVFlQRSBjb25maWdJbmRleCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMAorICAgICAgICAgICAgfHwgY29uZmlnSW5kZXggIT0gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KSB7CisgICAgICAgIC8vIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCBpcyB0aGUgb25seSB1cGRhdGUgd2UgcmVjb2duaXplIG5vdworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKCk7CisgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPiBjb25maWctPm5QYXJhbVNpemUpIHsKKyAgICAgICAgLy8gdHJ5IGFnYWluIHdpdGggdGhlIHNpemUgc3BlY2lmaWVkCisgICAgICAgIGNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oY29uZmlnLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGFuIG91dHB1dCBmb3JtYXQgY2hhbmdlZCBldmVudAorICAgIG1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwKKyAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25maWctPm5WYWx1ZSwgY29uZmlnLT5uUGFyYW1TaXplVXNlZCkpOworfQorCiB2b2lkIEFDb2RlYzo6b25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKSB7CiAgICAgLy8gYXNwZWN0cyBhcmUgbm9ybWFsbHkgY29tbXVuaWNhdGVkIGluIENvbG9yQXNwZWN0cwogICAgIGludDMyX3QgcmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlcjsKQEAgLTU1NTksNiArNTcxNCwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOiB7CisgICAgICAgICAgICBBTE9HVigiTm8tb3AgYnkgZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTYyNTksNiArNjQxOSwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgaWYgKGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyKSB7CisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyID0gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHNhdmUgYnVmZmVycyBzZW50IHRvIHRoZSBzdXJmYWNlIHNvIHdlIGNhbiBnZXQgcmVuZGVyIHRpbWUgd2hlbiB0aGV5IHJldHVybgogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CkBAIC02MzY3LDggKzY1MzYsMTAgQEAKIAogICAgIGlmIChtRGVhdGhOb3RpZmllciAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChtQ29kZWMtPm1PTVhOb2RlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CisgICAgICAgICAgICBpZiAodE9teE5vZGUpIHsKKyAgICAgICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CkBAIC02NDU1LDcgKzY2MjYsOCBAQAogCiAgICAgQ0hFQ0sobUNvZGVjLT5tT01YTm9kZSA9PSBOVUxMKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKKyAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24gKyAxKTsKIAogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKQEAgLTY0NzAsNyArNjY0Miw3IEBACiAgICAgQVN0cmluZyBjb21wb25lbnROYW1lOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZjb21wb25lbnROYW1lKSk7CiAKLSAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXIobm90aWZ5KTsKICAgICBzcDxJT01YPiBvbXg7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKQEAgLTY0OTYsMTQgKzY2NjgsMTIgQEAKICAgICB9CiAKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5vdGlmeSk7Ci0gICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgIGlmICghdE9teE5vZGUtPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKSkgeworICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CisgICAgaWYgKHRPbXhOb2RlICYmICF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24pOwotICAgIG9ic2VydmVyLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeSk7CisgICAgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbjsKIAogICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwogICAgIG1Db2RlYy0+bVJlbmRlclRyYWNrZXIuc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsKQEAgLTcyNjEsNyArNzQzMSw3IEBACiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lT2Zmc2V0VXM7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJ0aW1lLW9mZnNldC11cyIsICZ0aW1lT2Zmc2V0VXMpKSB7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZ0aW1lT2Zmc2V0VXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBpbnB1dCBidWZmZXIgdGltZSBvZmZzZXQgd2l0aG91dCBzdXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC03Mjk3LDcgKzc0NjcsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgZHJvcElucHV0RnJhbWVzOwotICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmZHJvcElucHV0RnJhbWVzKSkgeworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBzdXNwZW5kIHdpdGhvdXQgc3VyZmFjZSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtNzMwNSw3ICs3NDc1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3Qgc3VzcGVuZFN0YXJ0VGltZVVzID0gLTE7Ci0gICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CisgICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJTb3VyY2UtPnNldFN1c3BlbmQoZHJvcElucHV0RnJhbWVzICE9IDAsIHN1c3BlbmRTdGFydFRpbWVVcykpOwogCkBAIC03Mzg1LDEyICs3NTU1LDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIiwgJnByZXNlbnRhdGlvbklkKSkgeworICAgICAgICBpbnQzMl90IHByb2dyYW1JZCA9IC0xOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiLCAmcHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9QcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZhaWxlZCBzZXRBdWRpb1ByZXNlbnRhdGlvbi4gRmFpbHVyZSBpcyBmaW5lIHNpbmNlIHRoaXMga2V5IGlzIG9wdGlvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAodm9pZClzZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKwogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZHIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyBoZHIxMFBsdXNJbmZvLT5zaXplKCkgLSAxOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMDsKKyAgICBjb25maWctPm5TaXplID0gbmV3U2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBtZW1jcHkoY29uZmlnLT5uVmFsdWUsIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLy8gUmVtb3ZlcyB0cmFpbGluZyB0YWdzIG1hdGNoaW5nIHx0YWd8IGZyb20gfGtleXwgKGUuZy4gYSBzZXR0aW5ncyBuYW1lKS4gfG1pbkxlbmd0aHwgc3BlY2lmaWVzCiAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwIGluIHxrZXl8IChldmVuIGlmIGl0IGhhcyB0cmFpbGluZyB0YWdzKS4KIC8vIChVc2VkIHRvIHJlbW92ZSB0cmFpbGluZyAndmFsdWUnIHRhZ3MgaW4gc2V0dGluZ3MgbmFtZXMsIGUuZy4gdG8gbm9ybWFsaXplCkBAIC03ODEyLDYgKzgwMjcsMTUgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfRXZlbnRCdWZmZXJGbGFnOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTc4NzYsNiArODEwMCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg4Nyw2ICs4MTIzLDExIEBACiB2b2lkIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IGhhbmRsaW5nIG91dHB1dCBwb3J0IHNldHRpbmdzIGNoYW5nZSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCkBAIC04MTUzLDYgKzgzOTQsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2Nyw2ICs4NDEzLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODcsNiArODQzNCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODMxMyw3ICs4NTcyLDcgQEAKICAgICB9CiAKICAgICBzcDxJT01YPiBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7Ci0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5ldyBBTWVzc2FnZSk7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm9teE5vZGUpOwpAQCAtODQyOSwxNCArODY4OCwxNyBAQAogICAgICAgICBpZiAob214Tm9kZS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCAwLCAmc2lkZWJhbmRIYW5kbGUpID09IE9LKSB7CiAgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpbmNsdWRlcyBhZGFwdGl2ZSBwbGF5YmFjawotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCi0gICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKLSAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKLSAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0spOworICAgICAgICAgICAgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAorICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBhZGFwdGl2ZSBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04NDQ0LDExICs4NzA2LDIwIEBACiAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIHBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgdmVyaWZ5IGlmIGZhbGxiYWNrIGlzIHN1cHBvcnRlZD8KKworICAgICAgICBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSBmYWxsYmFja1BhcmFtczsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmZmFsbGJhY2tQYXJhbXMpOworICAgICAgICBmYWxsYmFja1BhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgZmFsbGJhY2tQYXJhbXMuZVJlZnJlc2hNb2RlID0gT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYzsKKwogICAgICAgICBpZiAob214Tm9kZS0+Z2V0Q29uZmlnKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2gsCi0gICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoKTsKKyAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgIT0gT0sgJiYKKyAgICAgICAgICAgICAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gsICZmYWxsYmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZhbGxiYWNrUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIGludHJhIHJlZnJlc2ggaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNzEwYWU2OC4uMjY2YTI0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOwogICAgICAgICBpZiAoc2VjdXJlKSB7CkBAIC0xODAsOSArMTgxLDE2IEBACiAKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CiAgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQogCiAgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgc2N0cmwsCiAgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAogICAgICAgICAgICAgICAgIDAsCkBAIC0yMDIsNiArMjEwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOwogCiAgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CkBAIC0yMTAsNyArMjIzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CisgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODliOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKKyAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgeworfQorCitBU3RhdGU6On5BU3RhdGUoKSB7Cit9CisKK3NwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbVBhcmVudFN0YXRlOworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgeworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CisKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgeworICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0CisgICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCisgICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKKworICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgaWYgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCisgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7CisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBBLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOworICAgIGN1ciA9IHN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQi5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCisgICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7CisgICAgICAgIEEucG9wKCk7CisgICAgICAgIEIucG9wKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gc3RhdGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBiYzc1NjlmLi4yYmQ3Mjg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIiwgImxpYm1lZGlhbmRrIl0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTc3LDE2ICs3Nyw1MSBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorCisgICAgc3JjczogWworICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQUNXcml0ZXIuY3BwIiwKICAgICAgICAgIkFDb2RlYy5jcHAiLAogICAgICAgICAiQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAotICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCisgICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCi0gICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCiAgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKQEAgLTk0LDggKzEyOSwxMCBAQAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKICAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRmFjdG9yeS5jcHAiLAogICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAorICAgICAgICAiQ2xlYXJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJGcmFtZURlY29kZXIuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCkBAIC0xMTAsMTIgKzE0NywxNyBAQAogICAgICAgICAiTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFTeW5jLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAogICAgICAgICAiTWVkaWFNdXhlci5jcHAiLAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJPZ2dXcml0ZXIuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKICAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCkBAIC0xMjgsMzMgKzE3MCwzMSBAQAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAogICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAogICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC0xNjMsOCArMjAzLDYgQEAKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtMTc0LDEyICsyMTIsMTkgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKICAgICAgICAgImxpYnZweCIsCisgICAgICAgICJsaWJvZ2ciLAogICAgICAgICAibGlid2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgICAgICJsaWJGTEFDIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibGlibmF0aXZlbG9hZGVyLWR1bW15LWhlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCkBAIC0yMTQsNTggKzI1OSwzNiBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAotICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAotICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAorICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKLSAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJOZGtVdGlscy5jcHAiLAotICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIlV0aWxzLmNwcCIsCi0gICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCi0gICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKKyAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmRybWZyYW1ld29yayIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCi0gICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCi0gICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYmFuZHJvaWQiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCi0gICAgXSwKLQotICAgIGhlYWRlcl9saWJzOlsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBhNmYwYTBiLi4xOTliNTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xMTgsNiArMTE4LDEzIEBACiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJObyBtZXRhZGF0YSBiLzExODYyMDg3MSIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExODYyMDg3MSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUxODU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjpBdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7Ci19Ci0KLUF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6fkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLSAgICBtUHJlc2VudGF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pIHsKLSAgICBtUHJlc2VudGF0aW9ucy5wdXNoKHByZXNlbnRhdGlvbik7Ci19Ci0KLXNpemVfdCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnMuc2l6ZSgpOwotfQotCi0vLyBSZXR1cm5zIGFuIEF1ZGlvUHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKLS8vIGluZGV4IG11c3QgYmUgPj0wIGFuZCA8IGNvdW50UHJlc2VudGF0aW9ucygpCi1jb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25JbmZvOjpnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmVzZW50YXRpb25zW2luZGV4XTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBlZTZmZTE3Li41MDI3MzAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01MDYsNCArNTA2LDExIEBACiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvU291cmNlOjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICAqcG9ydElkID0gbVJlY29yZC0+Z2V0UG9ydElkKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhMmNiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyRmlsZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtRmQoLTEpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1MZW5ndGgoLTEpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7CisgICAgfQorICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKKworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKKyAgICA6IG1GZChmZCksCisgICAgICBtT2Zmc2V0KG9mZnNldCksCisgICAgICBtTGVuZ3RoKGxlbmd0aCksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAorICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOworCisgICAgaWYgKG1PZmZzZXQgPCAwKSB7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA8IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgeworICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgczsKKyAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7CisgICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOworICAgICAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKyAgICB9CisKKyAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAorICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOworCit9CisKK0NsZWFyRmlsZVNvdXJjZTo6fkNsZWFyRmlsZVNvdXJjZSgpIHsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgOjpjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtTGVuZ3RoID49IDApIHsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIEVPRi4KKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgICBpZiAoKHVpbnQ2NF90KXNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOworfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1MZW5ndGg7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmluZGV4IGVlZjUzMTQuLmFlZTdmZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCkBAIC0yMiw5MCArMjIsMjggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICA6IG1GZCgtMSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUxlbmd0aCgtMSksCi0gICAgICBtTmFtZSgiPG51bGw+IiksCisgICAgOiBDbGVhckZpbGVTb3VyY2UoZmlsZW5hbWUpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCl7Ci0KLSAgICBpZiAoZmlsZW5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkZpbGVTb3VyY2UoJXMpIiwgZmlsZW5hbWUpOwotICAgIH0KLSAgICBBTE9HVigiJXMiLCBmaWxlbmFtZSk7Ci0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19MQVJHRUZJTEUgfCBPX1JET05MWSk7Ci0KLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX0VORCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4gKCVzKSIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KIH0KIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLSAgICA6IG1GZChmZCksCi0gICAgICBtT2Zmc2V0KG9mZnNldCksCi0gICAgICBtTGVuZ3RoKGxlbmd0aCksCi0gICAgICBtTmFtZSgiPG51bGw+IiksCisgICAgOiBDbGVhckZpbGVTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCiAgICAgICBtRHJtQnVmT2Zmc2V0KDApLAogICAgICAgbURybUJ1ZlNpemUoMCksCiAgICAgICBtRHJtQnVmKE5VTEwpIHsKLSAgICBBTE9HVigiZmQ9JWQgKCVzKSwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwKLSAgICAgICAgICAgIGZkLCBuYW1lRm9yRmQoZmQpLmNfc3RyKCksIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoKTsKLQotICAgIGlmIChtT2Zmc2V0IDwgMCkgewotICAgICAgICBtT2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgaWYgKG1MZW5ndGggPCAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA+IElOVDY0X01BWCAtIG1PZmZzZXQpIHsKLSAgICAgICAgbUxlbmd0aCA9IElOVDY0X01BWCAtIG1PZmZzZXQ7Ci0gICAgfQotICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgaWYgKGZzdGF0KGZkLCAmcykgPT0gMCkgewotICAgICAgICBpZiAobU9mZnNldCA+IHMuc3Rfc2l6ZSkgewotICAgICAgICAgICAgbU9mZnNldCA9IHMuc3Rfc2l6ZTsKLSAgICAgICAgICAgIG1MZW5ndGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtT2Zmc2V0ICsgbUxlbmd0aCA+IHMuc3Rfc2l6ZSkgewotICAgICAgICAgICAgbUxlbmd0aCA9IHMuc3Rfc2l6ZSAtIG1PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1PZmZzZXQgIT0gb2Zmc2V0IHx8IG1MZW5ndGggIT0gbGVuZ3RoKSB7Ci0gICAgICAgIEFMT0dXKCJvZmZzZXQvbGVuZ3RoIGFkanVzdGVkIGZyb20gJWxsZC8lbGxkIHRvICVsbGQvJWxsZCIsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwgKGxvbmcgbG9uZykgbUxlbmd0aCk7Ci0gICAgfQotCi0gICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAiRmlsZVNvdXJjZShmZCglcyksICVsbGQsICVsbGQpIiwKLSAgICAgICAgICAgIG5hbWVGb3JGZChmZCkuY19zdHIoKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsCi0gICAgICAgICAgICAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLQogfQogCiBGaWxlU291cmNlOjp+RmlsZVNvdXJjZSgpIHsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgOjpjbG9zZShtRmQpOwotICAgICAgICBtRmQgPSAtMTsKLSAgICB9Ci0KICAgICBpZiAobURybUJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgIGRlbGV0ZVtdIG1Ecm1CdWY7CiAgICAgICAgIG1Ecm1CdWYgPSBOVUxMOwpAQCAtMTI0LDEwICs2Miw2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOwotfQotCiBzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAobUZkIDwgMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE0NywzMCArODEsMTIgQEAKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMICYmIERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQKICAgICAgICAgICAgID09IG1EZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSkgewotICAgICAgICByZXR1cm4gcmVhZEF0RFJNKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXREUk1fbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgfSBlbHNlIHsKLSAgICAgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUZkIDwgMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1MZW5ndGg7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHNwPERlY3J5cHRIYW5kbGU+IEZpbGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSByZXR1cm4gbnVsbHB0cjsgLy8gbm8gRFJNIGluIG1lZGlhIGV4dHJhY3RvcgogICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CkBAIC0xOTQsNyArMTEwLDcgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLXNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk1fbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBzaXplX3QgRFJNX0NBQ0hFX1NJWkUgPSAxMDI0OwogICAgIGlmIChtRHJtQnVmID09IE5VTEwpIHsKICAgICAgICAgbURybUJ1ZiA9IG5ldyB1bnNpZ25lZCBjaGFyW0RSTV9DQUNIRV9TSVpFXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IDYyMzE0NTQuLjE4YTZiZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtNTAxLDkgKzUwMSwxNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzcmNGb3JtYXQ7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJmb3JtYXQgbWlzc2luZyBkaW1lbnNpb24gb3IgY29sb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CkBAIC01MjIsMTkgKzUyOCwyNyBAQAogICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKICAgICBWaWRlb0ZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbS0+cG9pbnRlcigpKTsKIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCwgZnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC02ODEsOSArNjk1LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpKTsKIAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKQEAgLTY5OCw2ICs3MTMsMTggQEAKIAogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207CiAgICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiB3aWR0aDsKICAgICBkc3RUb3AgPSBtVGlsZXNEZWNvZGVkIC8gbUdyaWRDb2xzICogaGVpZ2h0OwpAQCAtNzI3LDExICs3NTQsMTAgQEAKICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewogICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBtRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsIG1GcmFtZS0+bUhlaWdodCwgbUZyYW1lLT5tUm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAppbmRleCAwZjI0MzI5Li5kMTE4ZThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogCi0jaW5jbHVkZSA8TmV0ZENsaWVudC5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEhUVFBCYXNlOjpIVFRQQmFzZSgpCkBAIC0xMTQsMzAgKzExMiw0IEBACiAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcyA9IG51bUhpc3RvcnlJdGVtczsKIH0KIAotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7Ci0gICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0YWdnaW5nIHNvY2tldCAlZCBmb3IgdWlkICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCB1aWQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKSB7Ci0gICAgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhzb2NrZmQsIGdldGV1aWQoKSk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggZDljNGUwNS4uNjI1OWIxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtODUsNyArODUsNyBAQAogc3RhdGljIGNvbnN0IGludCBrVGltZXN0YW1wRGVidWdDb3VudCA9IDEwOwogc3RhdGljIGNvbnN0IGludCBrSXRlbUlkQmFzZSA9IDEwMDAwOwogc3RhdGljIGNvbnN0IGNoYXIga0V4aWZIZWFkZXJbXSA9IHsnRScsICd4JywgJ2knLCAnZicsICdcMCcsICdcMCd9Owotc3RhdGljIGNvbnN0IGludDMyX3Qga1RpZmZIZWFkZXJPZmZzZXQgPSBodG9ubChzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtFeGlmQXBwMU1hcmtlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgMHhmZiwgMHhlMX07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYW5kYXRvcnlIZXZjTmFsVW5pdFR5cGVzWzNdID0gewogICAgIGtIZXZjTmFsVW5pdFR5cGVWcHMsCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBib29sIGlzQXVkaW8oKSBjb25zdCB7IHJldHVybiBtSXNBdWRpbzsgfQogICAgIGJvb2wgaXNNUEVHNCgpIGNvbnN0IHsgcmV0dXJuIG1Jc01QRUc0OyB9CiAgICAgYm9vbCB1c2VQcmVmaXgoKSBjb25zdCB7IHJldHVybiBtSXNBdmMgfHwgbUlzSGV2YyB8fCBtSXNIZWljOyB9Ci0gICAgYm9vbCBpc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKyAgICBib29sIGlzRXhpZkRhdGEoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdDsKICAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKICAgICB2b2lkIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBpc0V4aWYpOwogICAgIHZvaWQgZmx1c2hJdGVtUmVmcygpOwpAQCAtMTM3LDYgKzEzNyw4IEBACiAKIHByaXZhdGU6CiAgICAgZW51bSB7CisgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gaW5jcmVhc2UgdGhpcyBjb25zaWRlcmluZyB0aGUgYnVnCisgICAgICAgIC8vIGFib3V0IGNhbWVyYSBhcHAgbm90IHNlbmRpbmcgdmlkZW8gZnJhbWVzIGNvbnRpbnVvdXNseT8KICAgICAgICAga01heEN0dHNPZmZzZXRUaW1lVXMgPSAxMDAwMDAwTEwsICAvLyAxIHNlY29uZAogICAgICAgICBrU2FtcGxlQXJyYXlTaXplID0gMTAwMCwKICAgICB9OwpAQCAtMzE3LDYgKzMxOSw3IEBACiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4gKm1TdHNzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptU3R0c1RhYmxlRW50cmllczsKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPiAqbUN0dHNUYWJsZUVudHJpZXM7CisgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4gKm1FbHN0VGFibGVFbnRyaWVzOyAvLyAzY29sdW1uczogc2VnRHVyYXRpb24sIG1lZGlhVGltZSwgbWVkaWFSYXRlCiAKICAgICBpbnQ2NF90IG1NaW5DdHRzT2Zmc2V0VGltZVVzOwogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaWNrczsKQEAgLTM2MSw3ICszNjQsNyBAQAogCiAgICAgVmVjdG9yPHVpbnQxNl90PiBtUHJvcGVydGllczsKICAgICBJdGVtUmVmcyBtRGltZ1JlZnM7Ci0gICAgSXRlbVJlZnMgbUNkc2NSZWZzOworICAgIFZlY3Rvcjx1aW50MTZfdD4gbUV4aWZMaXN0OwogICAgIHVpbnQxNl90IG1JbWFnZUl0ZW1JZDsKICAgICBpbnQzMl90IG1Jc1ByaW1hcnk7CiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CkBAIC00MTYsNiArNDE5LDggQEAKICAgICAvLyBEdXJhdGlvbiBpcyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgdm9pZCBhZGRPbmVTdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CiAgICAgdm9pZCBhZGRPbmVDdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CisgICAgdm9pZCBhZGRPbmVFbHN0VGFibGVFbnRyeSh1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLAorICAgICAgICBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbik7CiAKICAgICBib29sIGlzVHJhY2tNYWxGb3JtZWQoKSBjb25zdDsKICAgICB2b2lkIHNlbmRUcmFja1N1bW1hcnkoYm9vbCBoYXNNdWx0aXBsZVRyYWNrcyk7CkBAIC00NDgsNiArNDUzLDcgQEAKICAgICB2b2lkIHdyaXRlVmlkZW9Gb3VyQ0NCb3goKTsKICAgICB2b2lkIHdyaXRlTWV0YWRhdGFGb3VyQ0NCb3goKTsKICAgICB2b2lkIHdyaXRlU3RibEJveChib29sIHVzZTMyQml0T2Zmc2V0KTsKKyAgICB2b2lkIHdyaXRlRWR0c0JveCgpOwogCiAgICAgVHJhY2soY29uc3QgVHJhY2sgJik7CiAgICAgVHJhY2sgJm9wZXJhdG9yPShjb25zdCBUcmFjayAmKTsKQEAgLTQ4Myw2ICs0ODksNyBAQAogCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSAtMUxMOwogICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IC0xOworICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSAwOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1Xcml0ZXJUaHJlYWRTdGFydGVkID0gZmFsc2U7CkBAIC0xMjcyLDYgKzEyNzksMTAgQEAKICAgICAvLyBBZGp1c3QgdGhlIGdsb2JhbCBzdGFydCB0aW1lLgogICAgIG1TdGFydFRpbWVzdGFtcFVzICs9IG1pbkN0dHNPZmZzZXRUaW1lVXMgLSBrTWF4Q3R0c09mZnNldFRpbWVVczsKIAorICAgIC8vIEFkZCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKC12ZSBvciB6ZXJvKSB0byB0aGUgZHVyYXRpb24gb2YgZmlyc3QgZW50cnkgaW4gU1RUUy4KKyAgICBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzID0gbWluQ3R0c09mZnNldFRpbWVVcyAtIGtNYXhDdHRzT2Zmc2V0VGltZVVzOworICAgIEFMT0dWKCJtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzIDolIiBQUklkMzIsIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMpOworCiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoISgqaXQpLT5pc0hlaWMoKSkgewpAQCAtMTM1NywxNCArMTM2OCwxNiBAQAogfQogCiBvZmY2NF90IE1QRUc0V3JpdGVyOjphZGRTYW1wbGVfbCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VQcmVmaXgsIGJvb2wgaXNFeGlmLCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pIHsKICAgICBvZmY2NF90IG9sZF9vZmZzZXQgPSBtT2Zmc2V0OwogCiAgICAgaWYgKHVzZVByZWZpeCkgewogICAgICAgICBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGlzRXhpZikgewotICAgICAgICAgICAgOjp3cml0ZShtRmQsICZrVGlmZkhlYWRlck9mZnNldCwgNCk7IC8vIGV4aWZfdGlmZl9oZWFkZXJfb2Zmc2V0IGZpZWxkCisgICAgICAgIGlmICh0aWZmSGRyT2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgdGlmZkhkck9mZnNldCA9IGh0b25sKHRpZmZIZHJPZmZzZXQpOworICAgICAgICAgICAgOjp3cml0ZShtRmQsICZ0aWZmSGRyT2Zmc2V0LCA0KTsgLy8gZXhpZl90aWZmX2hlYWRlcl9vZmZzZXQgZmllbGQKICAgICAgICAgICAgIG1PZmZzZXQgKz0gNDsKICAgICAgICAgfQogCkBAIC0xNzQ3LDYgKzE3NjAsMTEgQEAKICAgICByZXR1cm4gbVN0YXJ0VGltZXN0YW1wVXM7CiB9CiAKK2ludDMyX3QgTVBFRzRXcml0ZXI6OmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOworfQorCiBzaXplX3QgTVBFRzRXcml0ZXI6Om51bVRyYWNrcygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTE3NzYsNiArMTc5NCw3IEBACiAgICAgICBtU3Rzc1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCkpLAogICAgICAgbVN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKICAgICAgIG1DdHRzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKSksCisgICAgICBtRWxzdFRhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMykpLCAvLyBSZXNlcnZlIDMgcm93cywgYSByb3cgaGFzIDMgaXRlbXMKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGltZVVzKDApLAogICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcygwKSwKICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MoMCksCkBAIC0xNzg2LDcgKzE4MDUsNiBAQAogICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoLTEpLAogICAgICAgbVJvdGF0aW9uKDApLAogICAgICAgbURpbWdSZWZzKCJkaW1nIiksCi0gICAgICBtQ2RzY1JlZnMoImNkc2MiKSwKICAgICAgIG1JbWFnZUl0ZW1JZCgwKSwKICAgICAgIG1Jc1ByaW1hcnkoMCksCiAgICAgICBtV2lkdGgoMCksCkBAIC0xODQyLDQ2ICsxODYwLDQ4IEBACiAKIC8vIENsZWFyIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGVzIGV4Y2VwdCB0aGUgQ1NEIGRhdGEuCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6cmVzZXRJbnRlcm5hbCgpIHsKLSAgICAgIG1Eb25lID0gZmFsc2U7Ci0gICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICBtUmVzdW1lZCA9IGZhbHNlOwotICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7Ci0gICAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKLSAgICAgIG1UcmFja0R1cmF0aW9uVXMgPSAwOwotICAgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKLSAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKLSAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rjb1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ282NFRhYmxlRW50cmllczsKLSAgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzY1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7CisgICAgbUlzTWFsZm9ybWVkID0gZmFsc2U7CisgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKKyAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IDA7CisgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHN6VGFibGVFbnRyaWVzOworICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOworICAgICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOworICAgICAgICBtQ282NFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPG9mZjY0X3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c2NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c3NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CisgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDMpOworICAgIH0KKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7CkBAIC0xOTAwLDYgKzE5MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA0ICsgICAvLyBzdHNzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDggKyAgIC8vIHN0dHMgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gY3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgKiAxMiArICAgLy8gZWxzdCBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjb0JveFNpemVCeXRlcyArICAgICAgICAgICAvLyBzdGNvIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHN6Qm94U2l6ZUJ5dGVzOyAgICAgICAgICAgIC8vIHN0c3ogYm94IHNpemUKICAgICB9CkBAIC0xOTM2LDYgKzE5NTcsMTYgQEAKICAgICBtQ3R0c1RhYmxlRW50cmllcy0+YWRkKGh0b25sKGR1cmF0aW9uKSk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVFbHN0VGFibGVFbnRyeSgKKyAgICB1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLCBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbikgeworICAgIEFMT0dWKCJzZWdtZW50RHVyYXRpb246JXUsIG1lZGlhVGltZTolZCIsIHNlZ21lbnREdXJhdGlvbiwgbWVkaWFUaW1lKTsKKyAgICBBTE9HVigibWVkaWFSYXRlIDolIiBQUklkMTYgIiwgbWVkaWFSYXRlRnJhY3Rpb24gOiUiIFBSSWQxNiAiLCBPcmVkICV1IiwgbWVkaWFSYXRlLAorICAgICAgICBtZWRpYVJhdGVGcmFjdGlvbiwgKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKCh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNlZ21lbnREdXJhdGlvbikpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwobWVkaWFUaW1lKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubCgoKCh1aW50MzJfdCltZWRpYVJhdGUpIDw8IDE2KSB8ICh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0TmV4dEZkKGludCBmZCkgewogICAgIEFMT0dWKCJhZGROZXh0RmQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xOTU0LDExICsxOTg1LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3QgewotICAgIHJldHVybiBtSXNIZWljCi0gICAgICAgICAgICAmJiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IHNpemVvZihrRXhpZkhlYWRlcikpCi0gICAgICAgICAgICAmJiAhbWVtY21wKCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSk7Citib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YSgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdCB7CisgICAgaWYgKCFtSXNIZWljKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBFeGlmIGJsb2NrIHN0YXJ0aW5nIHdpdGggJ0V4aWZcMFwwJworICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICYmICFtZW1jbXAoZGF0YSwga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpKSB7CisgICAgICAgICp0aWZmSGRyT2Zmc2V0ID0gc2l6ZW9mKGtFeGlmSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRXhpZiBibG9jayBzdGFydGluZyB3aXRoIGZvdXJjYyAnRXhpZicgZm9sbG93ZWQgYnkgQVBQMSBtYXJrZXIKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgMiArIHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEsIGtFeGlmQXBwMU1hcmtlciwgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIDIsIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKSkgeworICAgICAgICAvLyBza2lwICdFeGlmJyBmb3VyY2MKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoNCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOworCisgICAgICAgIC8vIDItYnl0ZSBBUFAxICsgMi1ieXRlIHNpemUgZm9sbG93ZWQgYnkga0V4aWZIZWFkZXIKKyAgICAgICAgKnRpZmZIZHJPZmZzZXQgPSAyICsgMiArIHNpemVvZihrRXhpZkhlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CkBAIC0xOTg0LDcgKzIwMzgsNyBAQAogICAgIH0KIAogICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgIG1DZHNjUmVmcy52YWx1ZS5wdXNoX2JhY2sobU93bmVyLT5hZGRJdGVtX2woeworICAgICAgICAgbUV4aWZMaXN0LnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CiAgICAgICAgICAgICAuaXRlbVR5cGUgPSAiRXhpZiIsCiAgICAgICAgICAgICAuaXNQcmltYXJ5ID0gZmFsc2UsCiAgICAgICAgICAgICAuaXNIaWRkZW4gPSBmYWxzZSwKQEAgLTIwODcsNyArMjE0MSwxNiBAQAogCiAgICAgaWYgKG1JbWFnZUl0ZW1JZCA+IDApIHsKICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtRGltZ1JlZnMpOwotICAgICAgICBtT3duZXItPmFkZFJlZnNfbChtSW1hZ2VJdGVtSWQsIG1DZHNjUmVmcyk7CisKKyAgICAgICAgaWYgKCFtRXhpZkxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlICJjZHNjIiByZWYgaXMgZnJvbSB0aGUgbWV0YWRhdGEvZXhpZiBpdGVtIHRvIHRoZSBpbWFnZSBpdGVtLgorICAgICAgICAgICAgLy8gU28gdGhlIHJlZnMgYWxsIGNvbnRhaW4gdGhlIGltYWdlIGl0ZW0uCisgICAgICAgICAgICBJdGVtUmVmcyBjZHNjUmVmcygiY2RzYyIpOworICAgICAgICAgICAgY2RzY1JlZnMudmFsdWUucHVzaF9iYWNrKG1JbWFnZUl0ZW1JZCk7CisgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGV4aWZJdGVtIDogbUV4aWZMaXN0KSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2woZXhpZkl0ZW0sIGNkc2NSZWZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjE3Myw2ICsyMjM2LDcgQEAKICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOwogICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CiAKICAgICBtU3RzelRhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBOVUxMOwpAQCAtMjE4MSw2ICsyMjQ1LDcgQEAKICAgICBtU3R0c1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1DdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKKyAgICBtRWxzdFRhYmxlRW50cmllcyA9IE5VTEw7CiAKICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhICE9IE5VTEwpIHsKICAgICAgICAgZnJlZShtQ29kZWNTcGVjaWZpY0RhdGEpOwpAQCAtMjIzNywxNCArMjMwMiwxNiBAQAogICAgIHdoaWxlICghY2h1bmstPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPjo6aXRlcmF0b3IgaXQgPSBjaHVuay0+bVNhbXBsZXMuYmVnaW4oKTsKIAotICAgICAgICBpbnQzMl90IGlzRXhpZjsKLSAgICAgICAgaWYgKCEoKml0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0V4aWYsICZpc0V4aWYpKSB7Ci0gICAgICAgICAgICBpc0V4aWYgPSAwOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0OworICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoCisgICAgICAgICAgICAgICAga0tleUV4aWZUaWZmT2Zmc2V0LCAoaW50MzJfdCopJnRpZmZIZHJPZmZzZXQpKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgfQorICAgICAgICBib29sIGlzRXhpZiA9ICh0aWZmSGRyT2Zmc2V0ID4gMCk7CiAgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gY2h1bmstPm1UcmFjay0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKIAogICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOwotICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCB0aWZmSGRyT2Zmc2V0LCAmYnl0ZXNXcml0dGVuKTsKIAogICAgICAgICBpZiAoY2h1bmstPm1UcmFjay0+aXNIZWljKCkpIHsKICAgICAgICAgICAgIGNodW5rLT5tVHJhY2stPmFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuLCBpc0V4aWYpOwpAQCAtMjk3MCwxMCArMzAzNywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBpc0V4aWYgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCA9IDA7CiAgICAgICAgIGludDMyX3QgaXNNdXhlckRhdGE7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNNdXhlckRhdGEsICZpc011eGVyRGF0YSkgJiYgaXNNdXhlckRhdGEpIHsKICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBvbmUgdHlwZSBvZiBtdXhlciBkYXRhLCB3aGljaCBpcyBFeGlmIGRhdGEgYmxvY2suCi0gICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlciwgJnRpZmZIZHJPZmZzZXQpOwogICAgICAgICAgICAgaWYgKCFpc0V4aWYpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgYmFkIEV4aWYgZGF0YSBibG9jayIpOwogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjk5NSw3ICszMDYzLDcgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICBjb3B5LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNFeGlmLCAxKTsKKyAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlFeGlmVGlmZk9mZnNldCwgdGlmZkhkck9mZnNldCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSB0aGlzLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCkBAIC0zMjY4LDcgKzMzMzYsOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghaGFzTXVsdGlwbGVUcmFja3MpIHsKICAgICAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtT3duZXItPmFkZFNhbXBsZV9sKAorICAgICAgICAgICAgICAgICAgICBjb3B5LCB1c2VQcmVmaXgsIHRpZmZIZHJPZmZzZXQsICZieXRlc1dyaXR0ZW4pOwogCiAgICAgICAgICAgICBpZiAobUlzSGVpYykgewogICAgICAgICAgICAgICAgIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuLCBpc0V4aWYpOwpAQCAtMzUyNiw3ICszNTk1LDcgQEAKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldER1cmF0aW9uVXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UcmFja0R1cmF0aW9uVXMgKyBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKTsKKyAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsgbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldEVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzKCkgY29uc3QgewpAQCAtMzYxMiw2ICszNjgxLDcgQEAKICAgICB1aW50MzJfdCBub3cgPSBnZXRNcGVnNFRpbWUoKTsKICAgICBtT3duZXItPmJlZ2luQm94KCJ0cmFrIik7CiAgICAgICAgIHdyaXRlVGtoZEJveChub3cpOworICAgICAgICB3cml0ZUVkdHNCb3goKTsKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWRpYSIpOwogICAgICAgICAgICAgd3JpdGVNZGhkQm94KG5vdyk7CiAgICAgICAgICAgICB3cml0ZUhkbHJCb3goKTsKQEAgLTM2NzQsNiArMzc0NCwyOSBAQAogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KICAgICBtT3duZXItPmJlZ2luQm94KGZvdXJjYyk7ICAgIC8vIFRleHRNZXRhRGF0YVNhbXBsZUVudHJ5CisKKyAgICAvLyAgSEFDSyB0byBtYWtlIHRoZSBtZXRhZGF0YSB0cmFjayBjb21wbGlhbnQgd2l0aCB0aGUgSVNPIHN0YW5kYXJkLgorICAgIC8vCisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGlzIGFkZGVkIGZyb20gQVBJIDI2IGFuZCB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZG9lcyBub3QKKyAgICAvLyAgZnVsbHkgZm9sbG93ZWQgdGhlIFRleHRNZXRhRGF0YVNhbXBsZUVudHJ5IHNwZWNpZmllZCBpbiBJU08vSUVDIDE0NDk2LTEyLTIwMTUKKyAgICAvLyAgaW4gdGhhdCBvbmx5IHRoZSBtaW1lX2Zvcm1hdCBpcyB3cml0dGVuIG91dC4gY29udGVudF9lbmNvZGluZyBhbmQKKyAgICAvLyAgZGF0YV9yZWZlcmVuY2VfaW5kZXggaGF2ZSBub3QgYmVlbiB3cml0dGVuIG91dC4gVGhpcyBsZWFkcyB0byB0aGUgZmFpbHVyZQorICAgIC8vICB3aGVuIHNvbWUgTVA0IHBhcnNlciB0cmllcyB0byBwYXJzZSB0aGUgbWV0YWRhdGEgdHJhY2sgYWNjb3JkaW5nIHRvIHRoZQorICAgIC8vICBzdGFuZGFyZC4gVGhlIGhhY2sgaGVyZSB3aWxsIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZQorICAgIC8vICBzdGFuZGFyZCB3aGlsZSBzdGlsbCBtYWludGFpbmluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyB3b3VsZCBlbmFibGUKKyAgICAvLyAgQW5kcm9pZCB2ZXJzaW9ucyBiZWZvcmUgQVBJIDI5IHRvIGJlIGFibGUgdG8gcmVhZCBvdXQgdGhlIHN0YW5kYXJkIGNvbXBsaWFudAorICAgIC8vICBNZXRhZGF0YSB0cmFjayBnZW5lcmF0ZWQgd2l0aCBBbmRyb2lkIEFQSSAyOSBhbmQgdXB3YXJkLiBUaGUgdHJpY2sgaXMgYmFzZWQKKyAgICAvLyAgb24gdGhlIGZhY3QgdGhhdCB0aGUgTWV0YWRhdGEgdHJhY2sgbXVzdCBzdGFydCB3aXRoIHByZWZpeCDigJxhcHBsaWNhdGlvbi/igJ0gYW5kCisgICAgLy8gIHRob3NlIG1pc3NpbmcgZmllbGRzIGFyZSBub3QgdXNlZCBpbiBBbmRyb2lkJ3MgTWV0YWRhdGEgdHJhY2suIEJ5IHdyaXR0aW5nCisgICAgLy8gIG91dCB0aGUgbWltZV9mb3JtYXQgdHdpY2UsIHRoZSBmaXJzdCBtaW1lX2Zvcm1hdCB3aWxsIGJlIHVzZWQgdG8gZmlsbCBvdXQgdGhlCisgICAgLy8gIG1pc3NpbmcgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGZpZWxkcy4gT24gdGhlCisgICAgLy8gIHBhcnNlciBzaWRlLCB0aGUgZXh0cmFjdGVyIGJlZm9yZSBBUEkgMjkgIHdpbGwgcmVhZCBvdXQgdGhlIGZpcnN0IG1pbWVfZm9ybWF0CisgICAgLy8gIGNvcnJlY3RseSBhbmQgZHJvcCB0aGUgc2Vjb25kIG1pbWVfZm9ybWF0LiBUaGUgZXh0cmFjdG9yIGZyb20gQVBJIDI5IHdpbGwKKyAgICAvLyAgY2hlY2sgaWYgdGhlIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCBhbmQgY29udGVudCBlbmNvZGluZyBhcmUgZmlsbGVkCisgICAgLy8gIHdpdGgg4oCcYXBwbGljYXRpb27igJ0gdG8gZGV0ZWN0IGlmIHRoaXMgaXMgYSBzdGFuZGFyZCBjb21wbGlhbnQgbWV0YWRhdGEgdHJhY2sKKyAgICAvLyAgYW5kIHJlYWQgb3V0IHRoZSBkYXRhIGFjY29yZGluZ2x5LgorICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKG1pbWUpOworCiAgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7ICAvLyBtZXRhZGF0YSBtaW1lX2Zvcm1hdAogICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIG1ldHQKIH0KQEAgLTM5NTksNiArNDA1MiwzMyBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUVkdHNCb3goKXsKKyAgICBBTE9HVigiJXMgOiBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMgb2YgdHJhY2s6JSIgUFJJZDY0ICIgdXMiLCBnZXRUcmFja1R5cGUoKSwKKyAgICAgICAgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkpOworCisgICAgLy8gUHJlcG9uZSB2aWRlbyBwbGF5YmFjay4KKyAgICBpZiAobU1pbkN0dHNPZmZzZXRUaWNrcyAhPSBtTWF4Q3R0c09mZnNldFRpY2tzKSB7CisgICAgICAgIGludDMyX3QgbXZoZFRpbWVTY2FsZSA9IG1Pd25lci0+Z2V0VGltZVNjYWxlKCk7CisgICAgICAgIHVpbnQzMl90IHRraGREdXJhdGlvbiA9IChnZXREdXJhdGlvblVzKCkgKiBtdmhkVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWUgPSAoKGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZ2V0TWluQ3R0c09mZnNldFRpbWVVcygpKQorICAgICAgICAgICAgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgaWYgKHRraGREdXJhdGlvbiA+IDAgJiYgbWVkaWFUaW1lID4gMCkgeworICAgICAgICAgICAgYWRkT25lRWxzdFRhYmxlRW50cnkodGtoZER1cmF0aW9uLCBtZWRpYVRpbWUsIDEsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1FbHN0VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Pd25lci0+YmVnaW5Cb3goImVkdHMiKTsKKyAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZWxzdCIpOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICAgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzLT53cml0ZShtT3duZXIpOworICAgICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBlbHN0OworICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVkdHMKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTWRoZEJveCh1aW50MzJfdCBub3cpIHsKICAgICBpbnQ2NF90IHRyYWtEdXJhdGlvblVzID0gZ2V0RHVyYXRpb25VcygpOwogICAgIGludDY0X3QgbWRoZER1cmF0aW9uID0gKHRyYWtEdXJhdGlvblVzICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CkBAIC00MDk1LDcgKzQyMTUsOSBAQAogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKICAgICAgICAgQ0hFQ0sobVN0dHNUYWJsZUVudHJpZXMtPmdldChkdXJhdGlvbiwgMSkpOwogICAgICAgICBkdXJhdGlvbiA9IGh0b25sKGR1cmF0aW9uKTsgIC8vIEJhY2sgdG8gaG9zdCBieXRlIG9yZGVyCi0gICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoZHVyYXRpb24gKyBnZXRTdGFydFRpbWVPZmZzZXRTY2FsZWRUaW1lKCkpLCAxKTsKKyAgICAgICAgaW50MzJfdCBzdGFydFRpbWVPZmZzZXRTY2FsZWQgPSAoKChnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSArCisgICAgICAgICAgICBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpKSAqIG1UaW1lU2NhbGUpICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+c2V0KGh0b25sKChpbnQzMl90KWR1cmF0aW9uICsgc3RhcnRUaW1lT2Zmc2V0U2NhbGVkKSwgMSk7CiAgICAgfQogICAgIG1TdHRzVGFibGVFbnRyaWVzLT53cml0ZShtT3duZXIpOwogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCmluZGV4IDhiZmY5ZjcuLjRmOWJjNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBpZiAobUFuY2hvclRpbWVSZWFsVXMgIT0gLTEpIHsKICAgICAgICAgaW50NjRfdCBvbGROb3dNZWRpYVVzID0KICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyArIChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKLSAgICAgICAgaWYgKG5vd01lZGlhVXMgPCBvbGROb3dNZWRpYVVzCisgICAgICAgIGlmIChub3dNZWRpYVVzIDwgb2xkTm93TWVkaWFVcyArIGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcwogICAgICAgICAgICAgICAgICYmIG5vd01lZGlhVXMgPiBvbGROb3dNZWRpYVVzIC0ga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggZmE1OWNkYi4uOWM1OGUwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTU1MCw3ICs1NTAsNyBAQAogCiB2b2lkIE1lZGlhQ29kZWM6OmluaXRBbmFseXRpY3NJdGVtKCkgewogICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQ29kZWNLZXlOYW1lKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrQ29kZWNLZXlOYW1lKTsKICAgICB9CiAKICAgICBtTGF0ZW5jeUhpc3Quc2V0dXAoa0xhdGVuY3lIaXN0QnVja2V0cywga0xhdGVuY3lIaXN0V2lkdGgsIGtMYXRlbmN5SGlzdEZsb29yKTsKQEAgLTg2Miw5ICs4NjIsOSBAQAogLy9zdGF0aWMKIHNwPENvZGVjQmFzZT4gTWVkaWFDb2RlYzo6R2V0Q29kZWNCYXNlKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKSB7CiAgICAgaWYgKG93bmVyKSB7Ci0gICAgICAgIGlmIChzdHJuY21wKG93bmVyLCAiZGVmYXVsdCIsIDgpID09IDApIHsKKyAgICAgICAgaWYgKHN0cmNtcChvd25lciwgImRlZmF1bHQiKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFDb2RlYzsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG93bmVyLCAiY29kZWMyIiwgNykgPT0gMCkgeworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3duZXIsICJjb2RlYzIiLCA2KSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ0NvZGVjKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC05MTEsMTAgKzkxMSwxMCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgbUNvZGVjSW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKLSAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1pbWVzOwotICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNaW1lcygmbWltZXMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWltZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1lZGlhVHlwZXM7CisgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjE5Nyw2ICsyMTk3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtU3VyZmFjZSwgbVJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjY3NCw3ICsyNjgxLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBlYWZmMjgzLi4zZDU4ZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgcmV0dXJuIHByb2ZpbGluZ05lZWRlZDsKIH0KIAotT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVyOworT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVye3RydWUgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OworT214SW5mb0J1aWxkZXIgc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcntmYWxzZSAvKiBhbGxvd1N1cmZhY2VFbmNvZGVycyAqL307CiAKIE11dGV4IHNDb2RlYzJJbmZvQnVpbGRlck11dGV4Owogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U+IHNDb2RlYzJJbmZvQnVpbGRlcjsKQEAgLTk4LDcgKzk5LDExIEBACiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2VUZXN0ID0KICAgICAgICAgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOwogICAgIGlmIChzdXJmYWNlVGVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBhbGwgT01YIGNvZGVjcyIpOwogICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhJbmZvQnVpbGRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkFsbG93aW5nIG9ubHkgbm9uLXN1cmZhY2UtZW5jb2RlciBPTVggY29kZWNzIik7CisgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcik7CiAgICAgfQogICAgIGJ1aWxkZXJzLnB1c2hfYmFjayhHZXRDb2RlYzJJbmZvQnVpbGRlcigpKTsKICAgICByZXR1cm4gYnVpbGRlcnM7CkBAIC0yMTUsMTQgKzIyMCwyNSBAQAogICAgICAgICAgICAgbUNvZGVjSW5mb3MuYmVnaW4oKSwKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmVuZCgpLAogICAgICAgICAgICAgW10oY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMSwgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMikgewotICAgICAgICAgICAgICAgIGlmIChpbmZvMiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8xID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8xLT5yYW5rKCkgPCBpbmZvMi0+cmFuaygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBudWxsIGlzIGxvd2VzdAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5mbzIgIT0gbnVsbHB0ciAmJiBpbmZvMS0+Z2V0UmFuaygpIDwgaW5mbzItPmdldFJhbmsoKSk7CiAgICAgICAgICAgICB9KTsKKworICAgIC8vIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcworICAgIGJvb2wgZGVkdXBlID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmRlZHVwZS1jb2RlY3MiLCB0cnVlKTsKKyAgICBpZiAoZGVkdXBlKSB7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb2RlY3NTZWVuOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ29kZWNJbmZvcy5iZWdpbigpOyBpdCAhPSBtQ29kZWNJbmZvcy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb2RlY05hbWUgPSAoKml0KS0+Z2V0Q29kZWNOYW1lKCk7CisgICAgICAgICAgICBpZiAoY29kZWNzU2Vlbi5jb3VudChjb2RlY05hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY3NTZWVuLmVtcGxhY2UoY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1Db2RlY0luZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTI3MiwxMCArMjg4LDE3IEBACiB9CiAKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgVmVjdG9yPEFTdHJpbmc+IGFsaWFzZXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAoc3RyY21wKG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KKyAgICAgICAgbUNvZGVjSW5mb3NbaV0tPmdldEFsaWFzZXMoJmFsaWFzZXMpOworICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGFsaWFzID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAtRU5PRU5UOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IGNhYzUzZjQuLmRkN2MzZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTIyOCwxOCArMjI4LDE4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKCFmb3JjZVRvTWVhc3VyZSAmJgogICAgICAgICAgICAgICAgIChjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpIHx8CiAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1jb25jdXJyZW50LWluc3RhbmNlcyIpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtaW1lc1tpXSwgY2Fwcyk7CisgICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtZWRpYVR5cGVzW2ldLCBjYXBzKTsKICAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CiAgICAgICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKICAgICAgICAgICAgICAgICBjaGFyIG1heFN0clszMl07CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKICAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAga2V5LmFwcGVuZChtaW1lc1tpXSk7CisgICAgICAgICAgICAgICAga2V5LmFwcGVuZChtZWRpYVR5cGVzW2ldKTsKIAogICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcAppbmRleCBiMzJlNDcwLi5jNGZiMTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0zNyw2ICszNywxNiBAQAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPgorICAgICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6ZmluZE1lZGlhQ29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IG1Db2RlY0luZm9zKSB7CisgICAgICAgIGlmICghc3RyY21wKGluZm8tPmdldENvZGVjTmFtZSgpLCBuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4obmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6d3JpdGVHbG9iYWxTZXR0aW5ncygKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZnbG9iYWxTZXR0aW5ncykgY29uc3QgewogICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmt2IDogbUdsb2JhbFNldHRpbmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IGUyMmFkMGQuLmMzZDg1ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtMzYyLDcgKzM2Myw3IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnNldElucHV0QnVmZmVyVGltZU9mZnNldChpbnQ2NF90IHRpbWVPZmZzZXRVcykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQsIG1SZWZsZWN0b3IpOwotICAgIG1zZy0+c2V0SW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgdGltZU9mZnNldFVzKTsKKyAgICBtc2ctPnNldEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsIHRpbWVPZmZzZXRVcyk7CiAgICAgcmV0dXJuIHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKIH0KIApAQCAtNDkwLDcgKzQ5MSw3IEBACiAgICAgbUNvZGVjTG9vcGVyLT5zdGFydCgpOwogCiAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsIDEpOworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELCAxKTsKICAgICB9CiAKICAgICBBU3RyaW5nIG91dHB1dE1JTUU7CkBAIC02NDMsNiArNjQ0LDEwIEBACiAgICAgICAgICAgICBvdXRwdXQtPm1CdWZmZXJRdWV1ZS5jbGVhcigpOwogICAgICAgICAgICAgb3V0cHV0LT5tRW5jb2RlclJlYWNoZWRFT1MgPSB0cnVlOwogICAgICAgICAgICAgb3V0cHV0LT5tRXJyb3JDb2RlID0gZXJyOworICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgICAgICAgICBtU3RvcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1QdWxsZXItPnN0b3AoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG91dHB1dC0+bUNvbmQuc2lnbmFsKCk7CiAKICAgICAgICAgICAgIHJlYWNoZWRFT1MgPSB0cnVlOwpAQCAtNjczLDkgKzY3OCw5IEBACiAgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CiAgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCBmYWxzZSk7CiAgICAgICAgIGlmIChyZXN1bWVTdGFydFRpbWVVcyA+IDApIHsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsIHJlc3VtZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsIHJlc3VtZVN0YXJ0VGltZVVzKTsKICAgICAgICAgfQogICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgIH0KQEAgLTc5NSw3ICs4MDAsNyBAQAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCBzdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9CkBAIC04MjgsOCArODMzLDggQEAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6b25QYXVzZShpbnQ2NF90IHBhdXNlU3RhcnRUaW1lVXMpIHsKICAgICBpZiAoKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpICYmIChtRW5jb2RlciAhPSBOVUxMKSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsIHRydWUpOwotICAgICAgICBwYXJhbXMtPnNldEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCBwYXVzZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIHRydWUpOworICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCBwYXVzZVN0YXJ0VGltZVVzKTsKICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOwpAQCAtMTA5MiwxMiArMTA5NywxMiBAQAogICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJm1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcykpOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKSk7CiAKICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSB0aW1lc3RhbXAgb2Zmc2V0IHRvIEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOwogICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShwbHVnaW4tPmdldFRyYWNrKHBsdWdpbi0+ZGF0YSwgaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0TWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+c2V0TWVkaWFDYXMocGx1Z2luLT5kYXRhLCBjYXNUb2tlbiwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCBiMGJmMjY5Li5hMzA5ZWU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTE4LDIwICsxOCwyMCBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvckZhY3RvcnkiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxuYXRpdmVsb2FkZXIvZGxleHRfbmFtZXNwYWNlcy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KIAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CkBAIC03MCw0OSArNzAsNDggQEAKIAogICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlICVzIiwgbWltZSk7CiAKLSAgICBVcGRhdGVFeHRyYWN0b3JzKG51bGxwdHIpOworICAgIFVwZGF0ZUV4dHJhY3RvcnMoKTsKIAogICAgIC8vIGluaXRpYWxpemUgc291cmNlIGRlY3J5cHRpb24gaWYgbmVlZGVkCiAgICAgc291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihudWxscHRyIC8qIG1pbWUgKi8pOwogCiAgICAgdm9pZCAqbWV0YSA9IG51bGxwdHI7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGNyZWF0b3IgPSBOVUxMOwotICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOworICAgIHZvaWQgKmNyZWF0b3IgPSBOVUxMOworICAgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgY29uZmlkZW5jZTsKICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+IHBsdWdpbjsKLSAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLmdldCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luKTsKKyAgICB1aW50MzJfdCBjcmVhdG9yVmVyc2lvbiA9IDA7CisgICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbiwgJmNyZWF0b3JWZXJzaW9uKTsKICAgICBpZiAoIWNyZWF0b3IpIHsKICAgICAgICAgQUxPR1YoIkZBSUxFRCB0byBhdXRvZGV0ZWN0IG1lZGlhIGNvbnRlbnQuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpyZXQgPSBjcmVhdG9yKHNvdXJjZS5nZXQoKSwgbWV0YSk7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgIE1lZGlhRXh0cmFjdG9yICpleCA9IG51bGxwdHI7CisgICAgaWYgKGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSB8fAorICAgICAgICAgICAgY3JlYXRvclZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgIENNZWRpYUV4dHJhY3RvciAqcmV0ID0gKChDcmVhdG9yRnVuYyljcmVhdG9yKShzb3VyY2UtPndyYXAoKSwgbWV0YSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXggPSByZXQgIT0gbnVsbHB0ciA/IG5ldyBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIocmV0KSA6IG51bGxwdHI7CiAgICAgfQogCiAgICAgQUxPR1YoIkNyZWF0ZWQgYW4gZXh0cmFjdG9yICclcycgd2l0aCBjb25maWRlbmNlICUuMmYiLAotICAgICAgICAgcmV0ICE9IG51bGxwdHIgPyByZXQtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKKyAgICAgICAgIGV4ICE9IG51bGxwdHIgPyBleC0+bmFtZSgpIDogIjxudWxsPiIsIGNvbmZpZGVuY2UpOwogCi0gICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihyZXQsIHNvdXJjZSwgcGx1Z2luKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgLy8gVE9ETzogVmVyaWZ5IGFwayBwYXRoIHdpdGggcGFja2FnZSBtYW5hZ2VyIGluIGV4dHJhY3RvciBwcm9jZXNzLgotICAgIEFMT0dWKCJMb2FkIHBsdWdpbnMgZnJvbTogJXMiLCBhcGtQYXRoLmNfc3RyKCkpOwotICAgIFVwZGF0ZUV4dHJhY3RvcnMoYXBrUGF0aC5lbXB0eSgpID8gbnVsbHB0ciA6IGFwa1BhdGguY19zdHIoKSk7CisgICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihleCwgc291cmNlLCBwbHVnaW4pOwogfQogCiBzdHJ1Y3QgRXh0cmFjdG9yUGx1Z2luIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmOworICAgIEV4dHJhY3RvckRlZiBkZWY7CiAgICAgdm9pZCAqbGliSGFuZGxlOwogICAgIFN0cmluZzggbGliUGF0aDsKICAgICBTdHJpbmc4IHV1aWRTdHJpbmc7CiAKLSAgICBFeHRyYWN0b3JQbHVnaW4oTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCisgICAgRXh0cmFjdG9yUGx1Z2luKEV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCiAgICAgICAgIDogZGVmKGRlZmluaXRpb24pLCBsaWJIYW5kbGUoaGFuZGxlKSwgbGliUGF0aChwYXRoKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWY6OmV4dHJhY3Rvcl91dWlkOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgRXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CiAgICAgICAgICAgICB1dWlkU3RyaW5nLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGRlZi5leHRyYWN0b3JfdXVpZC5iW2ldKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyNSwxNyArMTI0LDE4IEBACiB9OwogCiBNdXRleCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5NdXRleDsKLXN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOworc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKIGJvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luc1JlZ2lzdGVyZWQgPSBmYWxzZTsKK2Jvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnSWdub3JlVmVyc2lvbiA9IGZhbHNlOwogCiAvLyBzdGF0aWMKLU1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pIHsKK3ZvaWQgKk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pIHsKICAgICAqY29uZmlkZW5jZSA9IDAuMGY7CiAgICAgKm1ldGEgPSBudWxscHRyOwogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gcGx1Z2luczsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgICAgICBpZiAoIWdQbHVnaW5zUmVnaXN0ZXJlZCkgewpAQCAtMTQ0LDEzICsxNDQsMjMgQEAKICAgICAgICAgcGx1Z2lucyA9IGdQbHVnaW5zOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjdXJDcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgYmVzdENyZWF0b3IgPSBOVUxMOworICAgIHZvaWQgKmJlc3RDcmVhdG9yID0gTlVMTDsKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBBTE9HVigic25pZmZpbmcgJXMiLCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lKTsKICAgICAgICAgZmxvYXQgbmV3Q29uZmlkZW5jZTsKICAgICAgICAgdm9pZCAqbmV3TWV0YSA9IG51bGxwdHI7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOwotICAgICAgICBpZiAoKGN1ckNyZWF0b3IgPSAoKml0KS0+ZGVmLnNuaWZmKHNvdXJjZSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpKSkgeworICAgICAgICBGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOworCisgICAgICAgIHZvaWQgKmN1ckNyZWF0b3IgPSBOVUxMOworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52Mi5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgY3VyQ3JlYXRvciA9ICh2b2lkKikgKCppdCktPmRlZi51LnYzLnNuaWZmKAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPndyYXAoKSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckNyZWF0b3IpIHsKICAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKICAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgICAgICAgICAgaWYgKCptZXRhICE9IG51bGxwdHIgJiYgKmZyZWVNZXRhICE9IG51bGxwdHIpIHsKQEAgLTE2MCw2ICsxNzAsNyBAQAogICAgICAgICAgICAgICAgICpmcmVlTWV0YSA9IG5ld0ZyZWVNZXRhOwogICAgICAgICAgICAgICAgIHBsdWdpbiA9ICppdDsKICAgICAgICAgICAgICAgICBiZXN0Q3JlYXRvciA9IGN1ckNyZWF0b3I7CisgICAgICAgICAgICAgICAgKmNyZWF0b3JWZXJzaW9uID0gKCppdCktPmRlZi5kZWZfdmVyc2lvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGEgIT0gbnVsbHB0ciAmJiBuZXdGcmVlTWV0YSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVNZXRhKG5ld01ldGEpOwpAQCAtMTczLDEwICsxODQsMTAgQEAKIAogLy8gc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3IoY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLAotICAgICAgICBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewogICAgIC8vIHNhbml0eSBjaGVjayBjaGVjayBzdHJ1Y3QgdmVyc2lvbiwgdXVpZCwgbmFtZQotICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA9PSAwCi0gICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTikgeworICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgJiYKKyAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uICE9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgewogICAgICAgICBBTE9HRSgiZG9uJ3QgdW5kZXJzdGFuZCBleHRyYWN0b3IgZm9ybWF0ICV1LCBpZ25vcmluZy4iLCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xOTIsNyArMjAzLDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5MaXN0LmJlZ2luKCk7IGl0ICE9IHBsdWdpbkxpc3QuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKG1lbWNtcCgmKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3V1aWQpLCAmcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3V1aWQsIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAvLyB0aGVyZSdzIGFscmVhZHkgYW4gZXh0cmFjdG9yIHdpdGggdGhlIHNhbWUgdXVpZAotICAgICAgICAgICAgaWYgKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgeworICAgICAgICAgICAgaWYgKGdJZ25vcmVWZXJzaW9uIHx8ICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgewogICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lIGlzIG5ld2VyLCByZXBsYWNlIHRoZSBvbGQgb25lCiAgICAgICAgICAgICAgICAgQUxPR1coInJlcGxhY2luZyBleHRyYWN0b3IgJyVzJyB2ZXJzaW9uICV1IHdpdGggdmVyc2lvbiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSwKQEAgLTIxNCw2NiArMjI1LDI4IEBACiB9CiAKIC8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKLSAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7Ci0gICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7Ci0gICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKLSAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKLSAgICAgICAgWmlwU3RyaW5nIHByZWZpeChwcmVmaXg4LmNfc3RyKCkpOwotICAgICAgICBaaXBTdHJpbmcgc3VmZml4KCJleHRyYWN0b3Iuc28iKTsKLSAgICAgICAgdm9pZCogY29va2llOwotICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsICZwcmVmaXgsICZzdWZmaXgpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgotICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgICAgICB9Ci0gICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyogZGxleHRpbmZvLAorICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CisKICAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CiAgICAgaWYgKGxpYkRpcikgewogICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKICAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKKyAgICAgICAgICAgIGlmIChsaWJFbnRyeS0+ZF9uYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7Ci0gICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgICAgIGlmICghbGliUGF0aC5jb250YWlucygiZXh0cmFjdG9yLnNvIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCBkbGV4dGluZm8pOwogICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI4NiwzOSArMjU5LDg1IEBACiAgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IGRsb3BlbiglcykgJXMiLCBsaWJQYXRoLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgY2xvc2VkaXIobGliRGlyKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbmRpciglcykiLCBsaWJEaXJQYXRoKTsKICAgICB9CiB9CiAKK3N0YXRpYyBib29sIGNvbXBhcmVGdW5jKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIGZpcnN0LCBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBzZWNvbmQpIHsKKyAgICByZXR1cm4gc3RyY21wKGZpcnN0LT5kZWYuZXh0cmFjdG9yX25hbWUsIHNlY29uZC0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOworCiAvLyBzdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpIHsKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgfQorCiAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IG5ld0xpc3QobmV3IExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisgICAgZ0lnbm9yZVZlcnNpb24gPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuZXh0cmFjdG9yLmlnbm9yZV92ZXJzaW9uIiwgZmFsc2UpOwogCi0gICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oIi9zeXN0ZW0vbGliIgorICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IG5ld0xpc3QobmV3IHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKworICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKm1lZGlhTnMgPSBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UoIm1lZGlhIik7CisgICAgaWYgKG1lZGlhTnMgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyBkbGV4dGluZm8gPSB7CisgICAgICAgICAgICAuZmxhZ3MgPSBBTkRST0lEX0RMRVhUX1VTRV9OQU1FU1BBQ0UsCisgICAgICAgICAgICAubGlicmFyeV9uYW1lc3BhY2UgPSBtZWRpYU5zLAorICAgICAgICB9OworICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnMoIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICZkbGV4dGluZm8sICpuZXdMaXN0KTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIG1lZGlhIG5hbWVzcGFjZS4iKTsKKyAgICB9CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnMoIi9zeXN0ZW0vbGliIgogI2lmZGVmIF9fTFA2NF9fCiAgICAgICAgICAgICAiNjQiCiAjZW5kaWYKLSAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICpuZXdMaXN0KTsKKyAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsIE5VTEwsICpuZXdMaXN0KTsKIAotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsobmV3VXBkYXRlQXBrUGF0aCwgKm5ld0xpc3QpOworICAgIG5ld0xpc3QtPnNvcnQoY29tcGFyZUZ1bmMpOworICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKKworICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKLSAgICBnUGx1Z2lucyA9IG5ld0xpc3Q7CiAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gdHJ1ZTsKIH0KIAorLy8gc3RhdGljCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgeworICAgICAgICByZXR1cm4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CisgICAgfQorICAgIEFMT0dWKCJnZXQgc2VydmljZSBtYW5hZ2VyIik7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKKworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPiBtZWRpYUV4U2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgcmV0dXJuIG1lZGlhRXhTZXJ2aWNlLT5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPigpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgIFN0cmluZzggb3V0OwpAQCAtMzM1LDEyICszNTQsMjUgQEAKICAgICAgICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKICAgICAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIgICUyNXM6IHBsdWdpbl92ZXJzaW9uKCVkKSwgdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+bGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCBzdXBwb3J0czogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiVzICIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAobm8gcGx1Z2lucyByZWdpc3RlcmVkKVxuIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggOThmNTliNS4uOWJhMmFkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1Myw4IEBACiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKGZkKTsKICAgICB9CiAKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CkBAIC01OSw2ICs2Miw4IEBACiAgICAgICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGtleSB1c2VzIHJlY29yZGVyIGZpbGUgdHlwZXMuCiAgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9IRUlGKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX09HRyk7CiAgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM5YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9CisKK01lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgeworICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCisgICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKKyAgICAqbW9kZSA9IG1TZWVrTW9kZTsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tIHVud3JhcHBlciAtLS0tLS0tLS0tLS0tLS0gKi8KKworTWVkaWFUcmFja0NVbndyYXBwZXI6Ok1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIHdyYXBwZXIgPSBjbWVkaWF0cmFjazsKKyAgICBidWZmZXJHcm91cCA9IG51bGxwdHI7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyICpNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Y3JlYXRlKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIGlmIChjbWVkaWF0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyKGNtZWRpYXRyYWNrKTsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpIHsKKyAgICB3cmFwcGVyLT5mcmVlKHdyYXBwZXItPmRhdGEpOworICAgIGZyZWUod3JhcHBlcik7CisgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKGJ1ZmZlckdyb3VwID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RhcnQod3JhcHBlci0+ZGF0YSwgYnVmZmVyR3JvdXAtPndyYXAoKSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RvcCh3cmFwcGVyLT5kYXRhKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICp0bXBGb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+Z2V0Rm9ybWF0KHdyYXBwZXItPmRhdGEsIHRtcEZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgdG1wRm9ybWF0OworICAgIGZvcm1hdCA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICB1aW50MzJfdCBvcHRzID0gMDsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkpIHsKKyAgICAgICAgb3B0cyB8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtQb3NpdGlvbiA9IDA7CisgICAgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1Bvc2l0aW9uLCAmc2Vla01vZGUpKSB7CisgICAgICAgIG9wdHMgfD0gU0VFSzsKKyAgICAgICAgb3B0cyB8PSAodWludDMyX3QpIHNlZWtNb2RlOworICAgIH0KKyAgICBDTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+cmVhZCh3cmFwcGVyLT5kYXRhLCAmYnVmLCBvcHRzLCBzZWVrUG9zaXRpb24pOworICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSAoTWVkaWFCdWZmZXJCYXNlKilidWYtPmhhbmRsZTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gKCpidWZmZXIpLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBidWYtPm1ldGFfZGF0YShidWYtPmhhbmRsZSk7CisgICAgICAgIC8vIG9ubHkgY29udmVydCB0aGUga2V5cyB3ZSdyZSBhY3R1YWxseSBleHBlY3RpbmcsIGFzIGRvaW5nCisgICAgICAgIC8vIHRoZSBmdWxsIGNvbnZlcnRNZXNzYWdlVG9NZXRhZGF0YSgpIGZvciBldmVyeSBidWZmZXIgaXMKKyAgICAgICAgLy8gdG9vIGV4cGVuc2l2ZQorICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRpbWVVcyIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRpbWUsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGFyZ2V0LXRpbWUiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUYXJnZXRUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJpcy1zeW5jLWZyYW1lIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1tb2RlIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidmFsaWQtc2FtcGxlcyIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbGJ1ZjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLXBsYWluLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8ta2V5IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8taXYiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigic2VpIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5U0VJLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworYm9vbCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICByZXR1cm4gd3JhcHBlci0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQod3JhcHBlci0+ZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCmluZGV4IDA0ZjZhZGUuLmRiYzI4N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCkBAIC0xNiwxNSArMTYsMjUgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YVV0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIGludDMyX3Qgd2lkdGg7CiAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgaW50MzJfdCBzYXJXaWR0aDsKQEAgLTQ2LDIxICs1Niw4NiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1ldGEgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FyV2lkdGg7CisgICAgaW50MzJfdCBzYXJIZWlnaHQ7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKCh2b2lkKilkYXRhLCAgc2l6ZSk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKKyAgICBpZiAoY3NkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBoZWlnaHQpOworICAgIGlmIChzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIHNhcldpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgc2FySGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPCA3KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJpdHMoZGF0YSwgc2l6ZSk7CisKKyAgICAvLyBhZHRzX2ZpeGVkX2hlYWRlcgorCisgICAgaWYgKGJpdHMuZ2V0Qml0cygxMikgIT0gMHhmZmZ1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBhdGRzX2ZpeGVkX2hlYWRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cyg0KTsgIC8vIElELCBsYXllciwgcHJvdGVjdGlvbl9hYnNlbnQKKworICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKKyAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKKyAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAorICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7CisgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgbWV0YSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKLSAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKLSAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ4X3QgKmNzZCwgLyogb3V0ICovCisgICAgICAgIHNpemVfdCAqZXNkc19zaXplLCAvKiBpbi9vdXQgKi8KKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAvKiBpbiAqLworICAgICAgICBpbnQzMl90ICpzYW1wbGluZ19yYXRlIC8qIG91dCAqLworKSB7CiAgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAogICAgIH07Ci0gICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07Ci0gICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbF9jb25maWd1cmF0aW9uOworICAgICpzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CiAgICAgICAgIDB4MDMsIDIyLApAQCAtODMsNyArMTU4LDkgQEAKICAgICB9OwogCiAgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2Yoa1N0YXRpY0VTRFMpICsgMjsKLSAgICB1aW50OF90ICpjc2QgPSBuZXcgdWludDhfdFtjc2RTaXplXTsKKyAgICBpZiAoY3NkU2l6ZSA+ICplc2RzX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBtZW1jcHkoY3NkLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CiAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPQpAQCAtOTIsMTQgKzE2OSwxOTggQEAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0KICAgICAgICAgKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOwogCisgICAgKmVzZHNfc2l6ZSA9IGNzZFNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGNzZFsyXTsKKyAgICBjc2RbMF0gPSAoKHByb2ZpbGUgKyAxKSA8PCAzKSB8IChzYW1wbGluZ19mcmVxX2luZGV4ID4+IDEpOworICAgIGNzZFsxXSA9ICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKKyAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCisgICAgfTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjc2QsIHNpemVvZihjc2QpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIHVpbnQ4X3QgY3NkWzI0XTsKKyAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihjc2QpOworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZCwgJmNzZFNpemUsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgICAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb24sICZzYW1wbGVSYXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKIAogICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLQorICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKICAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGNzZCwgY3NkU2l6ZSk7Ci0gICAgZGVsZXRlIFtdIGNzZDsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorCitzdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOworCisgICAgc2l6ZV90IGluTGVuID0gc3RybmxlbigoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOworICAgIHNpemVfdCBmbGFjU2l6ZSA9IGluTGVuIC8gNCAqIDM7CisgICAgdWludDhfdCAqZmxhYyA9IG5ldyB1aW50OF90W2ZsYWNTaXplXTsKKyAgICBpZiAoIWRlY29kZUJhc2U2NChmbGFjLCAmZmxhY1NpemUsIChjb25zdCBjaGFyKilkYXRhKSkgeworICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7CisKKyAgICB1aW50MzJfdCBwaWNUeXBlOworICAgIHVpbnQzMl90IHR5cGVMZW47CisgICAgdWludDMyX3QgZGVzY0xlbjsKKyAgICB1aW50MzJfdCBkYXRhTGVuOworICAgIGNoYXIgdHlwZVsxMjhdOworCisgICAgaWYgKGZsYWNTaXplIDwgOCkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKKworICAgIGlmIChwaWNUeXBlICE9IDMpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOworICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAorICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOworICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOworCisgICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKKworICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOworICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKKyAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOworCisgICAgZGVsZXRlW10gZmxhYzsKK30KKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKSB7CisgICAgLy8gSGFwdGljIHRhZyBpcyBvbmx5IGtlcHQgaGVyZSBhcyBpdCB3aWxsIG9ubHkgYmUgdXNlZCBpbiBleHRyYWN0b3IgdG8gZ2VuZXJhdGUgY2hhbm5lbCBtYXNrLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IGhhcHRpYyA9ICJoYXB0aWMiOworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwgQU1FRElBRk9STUFUX0tFWV9USVRMRSB9LAorICAgICAgICB7ICJBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCB9LAorICAgICAgICB7ICJBTEJVTUFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJDT01QSUxBVElPTiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gfSwKKyAgICAgICAgeyAiQUxCVU0iLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIH0sCisgICAgICAgIHsgIkNPTVBPU0VSIiwgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiB9LAorICAgICAgICB7ICJHRU5SRSIsIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgfSwKKyAgICAgICAgeyAiQVVUSE9SIiwgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgfSwKKyAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiB9LAorICAgICAgICB7ICJEQVRFIiwgQU1FRElBRk9STUFUX0tFWV9EQVRFIH0sCisgICAgICAgIHsgIllFQVIiLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIH0sCisgICAgICAgIHsgIkFORFJPSURfTE9PUCIsIEFNRURJQUZPUk1BVF9LRVlfTE9PUCB9LAorICAgICAgICB7ICJBTkRST0lEX0hBUFRJQyIsIGhhcHRpYyB9LAorICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfTE9PUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9MT09QLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGhhcHRpYykgeworICAgICAgICAgICAgICAgICAgICBjaGFyICplbmQ7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhcHRpY0NoYW5uZWxDb3VudCA9IHN0cnRvbCgmY29tbWVudFt0YWdMZW4gKyAxXSwgJmVuZCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBoYXB0aWMsIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IoJWQpIHdoZW4gcGFyc2luZyBoYXB0aWMgY2hhbm5lbCBjb3VudCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCBhMWQzNGZjLi41MjJjODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI1Niw2ICsyNTYsMTAgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpkaXNjb25uZWN0KCkgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEFMT0dWKCJkaXNjb25uZWN0aW5nIEhUVFBCYXNlZFNvdXJjZSIpOwpAQCAtNTY3LDEyICs1NzEsMTkgQEAKICAgICByZXR1cm4gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChmaW5hbFN0YXR1cyk7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICpzaXplID0gYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZnNldCwgJmZpbmFsU3RhdHVzKTsKKyAgICByZXR1cm4gZmluYWxTdGF0dXM7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKG1MYXN0QWNjZXNzUG9zLCBmaW5hbFN0YXR1cyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CiAgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwogCiAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CkBAIC01ODAsOSArNTkxLDEwIEBACiAgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOwogICAgIH0KIAorICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogbUxhc3RBY2Nlc3NQb3M7CiAgICAgb2ZmNjRfdCBsYXN0Qnl0ZVBvc0NhY2hlZCA9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Ci0gICAgaWYgKG1MYXN0QWNjZXNzUG9zIDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gbUxhc3RBY2Nlc3NQb3M7CisgICAgaWYgKG9mZnNldCA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDQ5ZWI1ZTkuLjgzYjg3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjA1LDE1ICsyMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTc5MCwxNiArNzgwLDEyIEBACiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBvZmY2NF90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKC0xLCAmY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgaWYgKChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQorICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKICAgICAgICAgICAgICYmIGdldFRvdGFsQml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQotICAgICAgICAgICAgY2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KICAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKICAgICAgICAgKmVvcyA9IChmaW5hbFN0YXR1cyAhPSBPSyk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODA4LDQgKzc5NCwzNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gUmV0dXJuIE9LIGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gYXVkaW8gcHJlc2VudGF0aW9uIGluZm8uCisvLyBSZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTSBpZiBubyB0cmFja3MgYXJlIGF2YWlsYWJsZS4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CisgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tVHJhY2tJbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YShpbmZvLT5tU2FtcGxlcy5iZWdpbigpLT5tQnVmZmVyLT5tZXRhX2RhdGEoKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucygmaW5TdHJlYW0sIHByZXNlbnRhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlRyYWNrICV6dSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiU291cmNlIGRvZXMgbm90IGNvbnRhaW4gYW55IGF1ZGlvIHByZXNlbnRhdGlvbiIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPZ2dXcml0ZXIiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK30KKworLy8gc3RvcmUgdGhlIGludDMyIHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVpbnQoY2hhciAqYnVmLCBpbnQgYmFzZSwgaW50MzJfdCB2YWwpIHsKKyAgICBidWZbYmFzZSArIDNdID0gKCh2YWwpID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAyXSA9ICgodmFsKSA+PiAxNikgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMV0gPSAoKHZhbCkgPj4gOCkgJiAweGZmOworICAgIGJ1ZltiYXNlXSA9ICh2YWwpJjB4ZmY7Cit9CisKKy8vIGxpbmthZ2UgYmV0d2VlbiBvdXIgaGVhZGVyIE9nZ1N0cmVhbVN0YXRlIGFuZCB0aGUgdW5kZXJseWluZyBvZ2dfc3RyZWFtX3N0YXRlCisvLyBzbyB0aGF0IGNvbnN1bWVycyBvZiBvdXIgaW50ZXJmYWNlIGRvIG5vdCByZXF1aXJlIHRoZSBvZ2cgaGVhZGVycyB0aGVtc2VsdmVzLgorc3RydWN0IE9nZ1N0cmVhbVN0YXRlIDogcHVibGljIG9nZ19zdHJlYW1fc3RhdGUge307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworT2dnV3JpdGVyOjpPZ2dXcml0ZXIoaW50IGZkKQorICAgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMCA/IE5PX0lOSVQgOiBPSykgeworICAgIC8vIGVtcHR5Cit9CisKK09nZ1dyaXRlcjo6fk9nZ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAobUZkICE9IC0xKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KKworICAgIGZyZWUobU9zKTsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0IGlzIGxpbWl0ZWQgdG8gc2luZ2xlIHRyYWNrIG9mIE9wdXMgYXVkaW8uCisgICAgY29uc3QgY2hhciogbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKKyAgICBpZiAoc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCBvcHVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1PcyA9IChPZ2dTdHJlYW1TdGF0ZSopIG1hbGxvYyhzaXplb2Yob2dnX3N0cmVhbV9zdGF0ZSkpOworICAgIGlmIChvZ2dfc3RyZWFtX2luaXQoKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgcmFuZCgpKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgib2dnIHN0cmVhbSBpbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBPZ2cgaGVhZGVycy4KKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5IGZvciBzYW1wbGUgcmF0ZSIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyX2RhdGE7CisgICAgc2l6ZV90IHBhY2tldF9zaXplOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmaGVhZGVyX2RhdGEsICZwYWNrZXRfc2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm9wdXMgaGVhZGVyIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopaGVhZGVyX2RhdGE7CisgICAgb3AuYnl0ZXMgPSBwYWNrZXRfc2l6ZTsKKyAgICBvcC5iX29fcyA9IDE7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMDsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICBpbnQgcmV0OworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisKKyAgICBjb25zdCBjaGFyKiB2ZW5kb3Jfc3RyaW5nID0gImxpYm9wdXMiOworICAgIGNvbnN0IGludCB2ZW5kb3JfbGVuZ3RoID0gc3RybGVuKHZlbmRvcl9zdHJpbmcpOworICAgIGludCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGggPSAwOworCisgICAgY29uc3QgaW50IGNvbW1lbnRzX2xlbmd0aCA9IDggKyA0ICsgdmVuZG9yX2xlbmd0aCArIDQgKyB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGg7CisgICAgY2hhciogY29tbWVudHMgPSAoY2hhciopbWFsbG9jKGNvbW1lbnRzX2xlbmd0aCk7CisgICAgaWYgKGNvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBvZ2cgY29tbWVudCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1lbWNweShjb21tZW50cywgIk9wdXNUYWdzIiwgOCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDgsIHZlbmRvcl9sZW5ndGgpOworICAgIG1lbWNweShjb21tZW50cyArIDEyLCB2ZW5kb3Jfc3RyaW5nLCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICB3cml0ZWludChjb21tZW50cywgMTIgKyB2ZW5kb3JfbGVuZ3RoLCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGgpOworCisgICAgb3AucGFja2V0ID0gKHVuc2lnbmVkIGNoYXIqKWNvbW1lbnRzOworICAgIG9wLmJ5dGVzID0gY29tbWVudHNfbGVuZ3RoOworICAgIG9wLmJfb19zID0gMDsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAxOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtYXhUaW1lc3RhbXBVcyAtIDIwMDAwKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIGR1cmF0aW9uKCUiIFBSSWQ2NCAiIHVzKSBleGNlZWRzIGxpbWl0KCUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZ2dfcGFja2V0IG9wOworICAgICAgICBvZ2dfcGFnZSBvZzsKKyAgICAgICAgb3AucGFja2V0ID0gKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgb3AuYnl0ZXMgPSAobG9uZylidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBvcC5iX29fcyA9IDA7CisgICAgICAgIG9wLmVfb19zID0gbVJlYWNoZWRFT1MgPyAxIDogMDsKKyAgICAgICAgLy8gZ3JhbnVsZXBvcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBDTSBhdWRpbyBzYW1wbGVzIEAgNDgga0h6LCB1cCB0byBhbmQKKyAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgICAgb2dnX2ludDY0X3QgZ3JhbnVsZXBvcyA9ICg0ODAwMCAqIG1Fc3RpbWF0ZWREdXJhdGlvblVzKSAvIDEwMDAwMDA7CisgICAgICAgIG9wLmdyYW51bGVwb3MgPSBncmFudWxlcG9zOworCisgICAgICAgIC8vIEhlYWRlcnMgYXJlIGF0IHBhY2tldHMgMCBhbmQgMS4KKyAgICAgICAgb3AucGFja2V0bm8gPSAyICsgKG9nZ19pbnQzMl90KW1DdXJyZW50UGFja2V0SWQrKzsKKyAgICAgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworICAgICAgICBzaXplX3QgbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgICAgICAgICAgbiA9IG4gKyBvZy5oZWFkZXJfbGVuICsgb2cuYm9keV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BwZWRQcmVtYXR1cmVseSA9IGZhbHNlOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIGVuZCBvZiBzdHJlYW0gaXMgYW4gb2sgdGhpbmcKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSyAmJiBzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuIG1SZWFjaGVkRU9TOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCmluZGV4IDk2Yjg5NmIuLjg5MTA0NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKICNlbmRpZgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgpAQCAtNTMsMTggKzUzLDEzIEBACiBuYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CiAKIGJvb2wgaGFzUHJlZml4KGNvbnN0IGhpZGxfc3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKLSAgICByZXR1cm4gc3RybmNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CisgICAgcmV0dXJuIHN0cm5jYXNlY21wKHMuY19zdHIoKSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSkgPT0gMDsKIH0KIAogc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgIGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUsIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAorICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtZWRpYVR5cGUsIGJvb2wgaXNFbmNvZGVyLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKSB7CiAgICAgc3A8QUNvZGVjPiBjb2RlYyA9IG5ldyBBQ29kZWMoKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBub2RlLm93bmVyLmNfc3RyKCksIG5vZGUubmFtZS5jX3N0cigpLCBtaW1lLCBpc0VuY29kZXIsIGNhcHMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiBub2RlLmF0dHJpYnV0ZXMpIHsKICAgICAgICAgLy8gQWxsIGZlYXR1cmVzIGhhdmUgYW4gaW50MzIgdmFsdWUgZXhjZXB0CiAgICAgICAgIC8vICJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCB3aGljaCBoYXMgYSBzdHJpbmcgdmFsdWUuCkBAIC04MSwxMiArNzYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLCBhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gcXVlcnkgY2FwYWJpbGl0aWVzIG1heSByZW1vdmUgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjCisgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWVkaWFUeXBlLCBpc0VuY29kZXIsIGNhcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiB9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCi1PbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoKSB7CitPbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycykKKyAgICA6IG1BbGxvd1N1cmZhY2VFbmNvZGVycyhhbGxvd1N1cmZhY2VFbmNvZGVycykgewogfQogCiBzdGF0dXNfdCBPbXhJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CkBAIC0xMzQsMTA3ICsxMzYsODcgQEAKICAgICAvLyBDb252ZXJ0IHJvbGVzIHRvIGxpc3RzIG9mIGNvZGVjcwogCiAgICAgLy8gY29kZWMgbmFtZSAtPiBpbmRleCBpbnRvIHN3Q29kZWNzL2h3Q29kZWNzCi0gICAgc3RkOjptYXA8aGlkbF9zdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4+Ci0gICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvLCBod0NvZGVjTmFtZTJJbmZvOworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PiBjb2RlY05hbWUySW5mbzsKIAotICAgIGNoYXIgcmFua1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0gMHgxMDA7Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIHJhbmssIG51bGxwdHIpKSB7Ci0gICAgICAgIGRlZmF1bHRSYW5rID0gc3RkOjpzdHJ0b3VsKHJhbmssIG51bGxwdHIsIDEwKTsKLSAgICB9CisgICAgdWludDMyX3QgZGVmYXVsdFJhbmsgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIDB4MTAwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3QXVkaW9SYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctYXVkaW8iLCAweDEwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3T3RoZXJSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctb3RoZXIiLCAweDIxMHUpOworCiAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OlJvbGVJbmZvJiByb2xlIDogcm9sZXMpIHsKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHR5cGVOYW1lID0gcm9sZS50eXBlOwogICAgICAgICBib29sIGlzRW5jb2RlciA9IHJvbGUuaXNFbmNvZGVyOwotICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7Ci0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgbXVzdCBiZSBhZGRlZCBhZnRlcgotICAgICAgICAvLyBwbGF0Zm9ybSAoc29mdHdhcmUpIG5vZGVzLiBod0NvZGVjcyBpcyB1c2VkIHRvIGhvbGQgaGFyZHdhcmUgbm9kZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGFmdGVyIHNvZnR3YXJlIG5vZGVzIGZvciB0aGUgc2FtZSByb2xlLgotICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7Ci0gICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSA6IHJvbGUubm9kZXMpIHsKKyAgICAgICAgYm9vbCBpc0F1ZGlvID0gaGFzUHJlZml4KHJvbGUudHlwZSwgImF1ZGlvLyIpOworICAgICAgICBib29sIGlzVmlkZW9PckltYWdlID0gaGFzUHJlZml4KHJvbGUudHlwZSwgInZpZGVvLyIpIHx8IGhhc1ByZWZpeChyb2xlLnR5cGUsICJpbWFnZS8iKTsKKworICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8gJm5vZGUgOiByb2xlLm5vZGVzKSB7CiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSBpbWFnZSBhbmQgdmlkZW8gZW5jb2RlcnMgdXNlIHN1cmZhY2UgaW5wdXQKKyAgICAgICAgICAgIGlmICghbUFsbG93U3VyZmFjZUVuY29kZXJzICYmIGlzVmlkZW9PckltYWdlICYmIGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJkaXNhYmxpbmcgJXMgZm9yIG1lZGlhIHR5cGUgJXMgYmVjYXVzZSB3ZSBhcmUgbm90IHVzaW5nIE9NWCBpbnB1dCBzdXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLmNfc3RyKCksIHJvbGUudHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYm9vbCBpc1NvZnR3YXJlID0gaGFzUHJlZml4KG5vZGVOYW1lLCAiT01YLmdvb2dsZSIpOwotICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87Ci0gICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gc3dDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IHN3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYzJpID0gaHdDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIHRoaXMgbm9kZSBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBhZnRlciBhbGwgc29mdHdhcmUgbm9kZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBod0NvZGVjcy5wdXNoX2JhY2soJm5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB1aW50MzJfdCByYW5rID0gaXNTb2Z0d2FyZQorICAgICAgICAgICAgICAgICAgICA/IChpc0F1ZGlvID8gZGVmYXVsdFN3QXVkaW9SYW5rIDogZGVmYXVsdFN3T3RoZXJSYW5rKQorICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRSYW5rOworICAgICAgICAgICAgLy8gZ2V0IHJhbmsgZnJvbSBJT214U3RvcmUgdmlhIGF0dHJpYnV0ZQorICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5rZXkgPT0gInJhbmsiKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZFJhbmsgPSByYW5rOworICAgICAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKGF0dHJpYnV0ZS52YWx1ZS5jX3N0cigpLCAiJXUlYyIsICZyYW5rLCAmZHVtbXkpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSBvbGRSYW5rOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgIGF1dG8gYzJpID0gY29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CisgICAgICAgICAgICBpZiAoYzJpID09IGNvZGVjTmFtZTJJbmZvLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsocmFuayk7CisKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cnMgPSAwOworICAgICAgICAgICAgICAgIC8vIGFsbCBPTVggY29kZWNzIGFyZSB2ZW5kb3IgY29kZWNzIChpbiB0aGUgdmVuZG9yIHBhcnRpdGlvbiksIGJ1dAorICAgICAgICAgICAgICAgIC8vIHRyZWF0IE9NWC5nb29nbGUgY29kZWNzIGFzIG5vbi1oYXJkd2FyZS1hY2NlbGVyYXRlZCBhbmQgbm9uLXZlbmRvcgorICAgICAgICAgICAgICAgIGlmICghaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLmJlZ2luKCksIG5vZGUuYXR0cmlidXRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSAmaSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmtleSA9PSAiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+c2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNZWRpYVR5cGUodHlwZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyIsCisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1lZGlhIHR5cGUgJXMgdG8gY29kZWMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0gICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQotICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgotICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICpub2RlIDogaHdDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS0+b3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAqbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBzb2Z0d2FyZSBjb2RlY3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5jX3N0cigpLCBub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjQyLDQgKzIyNCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA5ZDJjNDJiLi5iMGNlNjg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAKICAgICBtQW5hbHl0aWNzSXRlbSA9IG51bGxwdHI7CiAgICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleUV4dHJhY3Rvcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleUV4dHJhY3Rvcik7CiAKICAgICAgICAgLy8gdHJhY2sgdGhlIGNvbnRhaW5lciBmb3JtYXQgKG1wZWcsIGFhYywgd3ZtLCBldGMpCiAgICAgICAgIHNpemVfdCBudHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM2MjYwM2MuLmNmNGVkYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM0LDI1ICszNSwxNiBAQAogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6flN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCkge30KIAotc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKLSAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAotICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIsICIubXhtZiIsCi0gICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKLSAgICAgICAgIi5tNHYiLCAiLm9nYSIsICIubTRyIgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KLSAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1WYWxpZEV4dGVuc2lvbnM7ICsraSkgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCBrVmFsaWRFeHRlbnNpb25zW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KK3N0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgeworCisgICAgaWYgKGdTdXBwb3J0ZWRFeHRlbnNpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMuY291bnQoc3RkOjpzdHJpbmcoZXh0ZW5zaW9uICsgMSkpICE9IDA7CiB9CiAKIE1lZGlhU2NhblJlc3VsdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGUoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDIxYWNjYWQuLmZhM2QzNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjgxLDEyICsyODIsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLQogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CkBAIC0zNTQsMTUgKzM0OSwxNSBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICBzcDxWaWRlb0ZyYW1lRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgewogICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKaW5kZXggNTE5ZTg3MC4uYjkwNjQ5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCkBAIC0yNyw5ICsyOCwxNyBAQAogLyogc3RhdGljICovIE11dGV4IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzTXV0ZXg7CiAvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOwogCi1TdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKLSAgICA6IG1DcmVhdGVDb2RlYyhudWxscHRyKSwKLSAgICAgIG1DcmVhdGVCdWlsZGVyKG51bGxwdHIpIHsKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga0NDb2RlY1BsdWdpblBhdGhbXSA9ICJsaWJzZnBsdWdpbl9jY29kZWMuc28iOworCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcubWVkaWEuY29kZWMyIiwgMCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiQ0NvZGVjIGlzIGRpc2FibGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKICAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKQEAgLTQ2LDcgKzU1LDcgQEAKICAgICB9CiAgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCiAgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7Ci0gICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNyZWF0ZUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUlucHV0U3VyZmFjZSAoJXMpIiwgZGxlcnJvcigpKTsKICAgICB9CiB9CkBAIC04Nyw3ICs5Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CiAgICAgaWYgKCFzSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOwotICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKCJsaWJzdGFnZWZyaWdodF9jY29kZWMuc28iKSk7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoa0NDb2RlY1BsdWdpblBhdGgpKTsKICAgICB9CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCmluZGV4IDk5OWQzMGMuLjc4ZWZmYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAgICAgc3RhdGljIE11dGV4IHNNdXRleDsKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CiAKLSAgICB2b2lkICptTGliSGFuZGxlOwotICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKLSAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZTsKKyAgICB2b2lkICptTGliSGFuZGxle251bGxwdHJ9OworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlY3tudWxscHRyfTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcntudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZXtudWxscHRyfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAzMzYxNGQ2Li4xNmIzMzE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgpAQCAtNzQsNyArNzUsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIDAgdmFsdWVzIGFyZSB1bnNwZWNpZmllZAogICAgIGludDMyX3QgcmFuZ2UgPSAwOwogICAgIGludDMyX3QgcHJpbWFyaWVzID0gMDsKQEAgLTExOSw3ICsxMjAsOCBAQAogICAgIH0KIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKLSAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKKyAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQorICAgICAgICAgICAgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIG90aGVyd2lzZSwgdmVyaWZ5IHRoYXQgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldApAQCAtMTkwLDYgKzE5Miw5IEBACiAgICAgICAgIHsgNTAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCiAgICAgICAgIHsgNTEsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCiAgICAgICAgIHsgNTIsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgNjAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgNjIsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKICAgICAgICAgeyA2NiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSB9LApAQCAtNTY4LDggKzU3MywxNjMgQEAKICAgICB9CiB9CiAKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJtYW51ZmFjdHVyZXIiLCBrS2V5TWFudWZhY3R1cmVyIH0sCisgICAgICAgIHsgInRpdGxlIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgInllYXIiLCBrS2V5WWVhciB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGZsb2F0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY2FwdHVyZS1yYXRlIiwga0tleUNhcHR1cmVGcmFtZXJhdGUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWUgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXRpbWUiLCBrS2V5VGh1bWJuYWlsVGltZSB9LAorICAgICAgICB7ICJ0aW1lVXMiLCBrS2V5VGltZSB9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9uIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImZyYW1lLWNvdW50Iiwga0tleUZyYW1lQ291bnQgfSwKKyAgICAgICAgeyAibWF4LWJpdHJhdGUiLCBrS2V5TWF4Qml0UmF0ZSB9LAorICAgICAgICB7ICJwY20tYmlnLWVuZGlhbiIsIGtLZXlQY21CaWdFbmRpYW4gfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItY291bnQiLCBrS2V5VGVtcG9yYWxMYXllckNvdW50IH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWlkIiwga0tleVRlbXBvcmFsTGF5ZXJJZCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAidmFsaWQtc2FtcGxlcyIsIGtLZXlWYWxpZFNhbXBsZXMgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBidWZmZXJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bWFydCIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gfSwKKyAgICAgICAgeyAicHNzaCIsIGtLZXlQc3NoIH0sCisgICAgICAgIHsgImNyeXB0by1pdiIsIGtLZXlDcnlwdG9JViB9LAorICAgICAgICB7ICJjcnlwdG8ta2V5Iiwga0tleUNyeXB0b0tleSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIiwga0tleUVuY3J5cHRlZFNpemVzIH0sCisgICAgICAgIHsgImNyeXB0by1wbGFpbi1zaXplcyIsIGtLZXlQbGFpblNpemVzIH0sCisgICAgICAgIHsgImljYy1wcm9maWxlIiwga0tleUljY1Byb2ZpbGUgfSwKKyAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAorICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCisgICAgfQorfTsKKwordm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGVsZW0uc2Vjb25kLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogZmxvYXRNYXBwaW5ncykgeworICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEZsb2F0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDY0TWFwcGluZ3MpIHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDMyTWFwcGluZ3MpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGJ1ZmZlck1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZyhlbGVtLmZpcnN0LCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRmxvYXQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLmdldCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKIAogICAgIGZvcm1hdC0+Y2xlYXIoKTsKIApAQCAtNTg2LDYgKzc0Niw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICBtc2ctPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKG1ldGEsIG1zZyk7CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC01OTksNiArNzYxLDE2IEBACiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgYnVmZmVyKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKICAgICBpbnQzMl90IHN5c3RlbUlkOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNBU3lzdGVtSUQsICZzeXN0ZW1JZCkpIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2Etc3lzdGVtLWlkIiwgc3lzdGVtSWQpOwpAQCAtNzEyLDYgKzg4NCwxNiBAQAogICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoKihIRFJTdGF0aWNJbmZvKilkYXRhLCBtc2cpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhtZXRhLCBtc2cpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtNzIzLDYgKzkwNSwxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwogCisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBjaGFubmVsTWFzayk7CkBAIC0xMDAxLDYgKzExODgsMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBhcnNlSGV2Y1Byb2ZpbGVMZXZlbEZyb21IdmNjKChjb25zdCB1aW50OF90ICopZGF0YSwgZGF0YVNpemUsIG1zZyk7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVYxQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgaWYgKGVzZHMuSW5pdENoZWNrKCkgIT0gKHN0YXR1c190KU9LKSB7CkBAIC0xMDQ4LDcgKzEyNDUsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1iaXRyYXRlIiwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtUeXBlRDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIHBhcnNlSDI2M1Byb2ZpbGVMZXZlbEZyb21EMjYzKHB0ciwgc2l6ZSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewpAQCAtMTE0OCwxMyArMTM0NSw2IEBACiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCi0gICAgLy8gVE9ETyBleHBvc2UgImNyeXB0by1rZXkiL2tLZXlDcnlwdG9LZXkgdGhyb3VnaCBwdWJsaWMgYXBpCi0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3J5cHRvLWtleSIsIGJ1ZmZlcik7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgKmZvcm1hdCA9IG1zZzsKIAogICAgIHJldHVybiBPSzsKQEAgLTEzNTMsNiArMTU0MywyMSBAQAogICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwogICAgIH0KIAorICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhtc2csIG1ldGEpOworCisgICAgaW50MzJfdCBzeXN0ZW1JZDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNhLXN5c3RlbS1pZCIsICZzeXN0ZW1JZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIHN5c3RlbUlkKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjYVNlc3Npb25JZCwgY2FQdnREYXRhOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1zZXNzaW9uLWlkIiwgJmNhU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsIGNhU2Vzc2lvbklkLT5kYXRhKCksIGNhU2Vzc2lvbklkLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsICZjYVB2dERhdGEpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLCBjYVB2dERhdGEtPmRhdGEoKSwgY2FQdnREYXRhLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwpAQCAtMTM4NCw3ICsxNTg5LDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOworICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xNDQ3LDYgKzE2NTIsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyMTBQbHVzSW5mbywgMCwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhQ29sb3JBc3BlY3RzKG1zZywgbWV0YSk7CiAKICAgICAgICAgQVN0cmluZyB0c1NjaGVtYTsKQEAgLTE0NzEsNiArMTY4MiwxMCBAQAogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBjaGFubmVsTWFzayk7CkBAIC0xNDg5LDYgKzE3MDQsMTEgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlJc0FEVFMsIGlzQURUUyk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUFBQ0FPVCwgYWFjUHJvZmlsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IHBjbUVuY29kaW5nOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsICZwY21FbmNvZGluZykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwpAQCAtMTUyOSwyOCArMTc0OSw1MiBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlc2RzKGNzZDBzaXplICsgMzEpOwogICAgICAgICAgICAgLy8gVGhlIHdyaXR0ZW4gRVNEUyBpcyBhY3R1YWxseSBmb3IgYW4gYXVkaW8gc3RyZWFtLCBidXQgaXQncyBlbm91Z2gKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGNzZDAtPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gY3NkMC0+ZGF0YSgpOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZlNpemUgPSBjc2QxLT5zaXplKCk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZiA9IGNzZDEtPmRhdGEoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2Vla1ByZVJvbGxCdWZTaXplID0gY3NkMi0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmID0gY3NkMi0+ZGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXh0cmFjdCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCBmcm9tIGNzZC0wLAorICAgICAgICAgICAgICogaWYgY3NkLTEgYW5kIGNzZC0yIGFyZSBub3QgcHJlc2VudCAqLworICAgICAgICAgICAgaWYgKCFjb2RlY0RlbGF5QnVmICYmICFzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpLCAmb3B1c0hlYWRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplKTsKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0NvZGVjRGVsYXksIDAsIGNvZGVjRGVsYXlCdWYsIGNvZGVjRGVsYXlCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgc2Vla1ByZVJvbGxCdWYsIHNlZWtQcmVSb2xsQnVmU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKQEAgLTE1NjAsMTEgKzE4MDQsMTcgQEAKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYWNNYWdpY0Nvb2tpZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWF2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1oZXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJlc2RzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJtcGVnMi1zdHJlYW0taGVhZGVyIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImQyNjMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCkBAIC0xNjQwLDYgKzE4OTAsOSBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICBBVURJT19GT1JNQVRfT1BVU30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsICAgICAgICAgQVVESU9fRk9STUFUX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLCAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwgICAgICAgICBBVURJT19GT1JNQVRfQUM0fSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICAgICAgICBBVURJT19GT1JNQVRfRkxBQ30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0FMQUMgfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KQEAgLTE2OTMsNDMgKzE5NDYsNDMgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pCiB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgKCppbmZvKSA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CiAKLSAgICBpbmZvLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwgbWltZSkgIT0gT0spIHsKKyAgICBpbmZvLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LCBtaW1lKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiIENvdWxkbid0IG1hcCBtaW1lIHR5cGUgXCIlc1wiIHRvIGEgdmFsaWQgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAhIiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby5mb3JtYXQpOworICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby0+Zm9ybWF0KTsKICAgICB9CiAKLSAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby5mb3JtYXQpIHsKKyAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby0+Zm9ybWF0KSB7CiAgICAgICAgIC8vIGNhbid0IG9mZmxvYWQgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBzb3VyY2UgZm9ybWF0IGlzCiAgICAgICAgIEFMT0dFKCJtaW1lIHR5cGUgXCIlc1wiIG5vdCBhIGtub3duIGF1ZGlvIGZvcm1hdCIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gUmVkZWZpbmUgYWFjIGZvcm1hdCBhY2NvcmRpbmcgdG8gaXRzIHByb2ZpbGUKICAgICAvLyBPZmZsb2FkaW5nIGRlcGVuZHMgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4KICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc3JhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBzYW1wbGUgcmF0ZSIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLnNhbXBsZV9yYXRlID0gc3JhdGU7CisgICAgaW5mby0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKIAogICAgIGludDMyX3QgY21hc2sgPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNtYXNrKSB8fCBjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKQEAgLTE3NDMsMjUgKzE5OTYsMzQgQEAKICAgICAgICAgICAgIGNtYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaW5mby5jaGFubmVsX21hc2sgPSBjbWFzazsKKyAgICBpbmZvLT5jaGFubmVsX21hc2sgPSBjbWFzazsKIAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggZHVyYXRpb24iLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOworICAgIGluZm8tPmR1cmF0aW9uX3VzID0gZHVyYXRpb247CiAKICAgICBpbnQzMl90IGJyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZicmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5iaXRfcmF0ZSA9IGJyYXRlOworICAgIGluZm8tPmJpdF9yYXRlID0gYnJhdGU7CiAKIAotICAgIGluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwotICAgIGluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87Ci0gICAgaW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICBpbmZvLT5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CisgICAgaW5mby0+aGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgaW5mby0+aXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgcmV0dXJuIE9LOworfQogCitib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwpAQCAtMTkzMSw0ICsyMTkzLDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA5MDIwZmMxLi40ZTViNWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE5LDggKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgpAQCAtMzIsMzIxICszMSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7Ci0gICAgaWYgKCpsaHMgPCAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYwotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCi0gICAgOiBtUGVyaW9kKC0xKSwKLSAgICAgIG1QaGFzZSgwKSwKLSAgICAgIG1QcmltZWQoZmFsc2UpLAotICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKLSAgICAgIG1MYXN0VGltZSgtMSksCi0gICAgICBtTnVtU2FtcGxlcygwKSB7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKLSAgICAvL3Rlc3QoKTsKLQotICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgIG1MYXN0VGltZSA9IC0xOwotCi0gICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAotICAgIGlmIChmcHMgPD0gMC5mKSB7Ci0gICAgICAgIG1QZXJpb2QgPSAtMTsKLSAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7Ci0gICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKLSAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmVzdGFydCgpOwotfQotCi0vLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKLSAgICBtTnVtU2FtcGxlcyA9IDA7Ci0gICAgbVBoYXNlID0gLTE7Ci19Ci0KLSNpZiAwCi0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgewotICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOwotICAgIG1UaW1lc1swXSA9IDA7Ci0gICAgbVRpbWVzWzFdID0gcGVyaW9kOwotICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7Ci0gICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKLSAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OwotICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7Ci0gICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7Ci0gICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7Ci0gICAgbU51bVNhbXBsZXMgPSA4OwotICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7Ci0gICAgLy8gYSA9IDAuOCg1KSsKLSAgICAvLyBiID0gLTAuMTQwOTcoMikrCi0gICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCi0gICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCi0gICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKLSAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7Ci0gICAgfQotCi0gICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKLSAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3Qgc3VtWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZID0gMDsKLQotICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQotICAgIG5zZWNzX3QgbGFzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgewotICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKLSAgICAgICAgfQotICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KLSAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZwotICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAotICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgotICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKLSAgICAgICAgc3VtWCArPSB4OwotICAgICAgICBzdW1ZICs9IHk7Ci0gICAgICAgIHN1bVhYICs9IHggKiB4OwotICAgICAgICBzdW1YWSArPSB4ICogeTsKLSAgICAgICAgc3VtWVkgKz0geSAqIHk7Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKLSAgICBpZiAoZGl2ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOwotICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKLSAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOwotICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7Ci0gICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50Ci0gICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKLSAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCi0gICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLSAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCi0KLSAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKLSAgICAvLyAybmQgb3JkZXIgZGVsdGFzCi0gICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKLSAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgewotICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFRpbWUgPSB0aW1lOwotICAgIH0KLSAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKLSAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKLSAgICBpZiAobnVtRGVsdGFzID4gMSkgewotICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgewotICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7Ci0gICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKLSAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKLSAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAotICAgIGludDY0X3QgYmVzdFNjb3JlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07Ci0gICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOwotI2lmIDEKLSAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKLSAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOwotICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgewotICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzY29yZSA9IG1hdGNoZXM7Ci0jaWYgMAotICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCi0gICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7Ci0gICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKLSAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOwotICAgICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKLSAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKLSAgICBpZiAobUxhc3RUaW1lID49IDAKLSAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKLSAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKLSAgICAgICAgcmVzdGFydCgpOwotICAgIH0KLQotICAgIG1MYXN0VGltZSA9IHRpbWU7Ci0gICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7Ci0gICAgKyttTnVtU2FtcGxlczsKLQotICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7Ci0gICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7Ci0gICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOwotICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0gICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICBpZiAobVBoYXNlIDwgMCkgewotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQotICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKLSAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKLSAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb0ZpdCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgewotICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KLSAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKLQotICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKLSAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLQotICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1QZXJpb2Q7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCi0KLVZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQotICAgIDogbVZzeW5jVGltZSgwKSwKLSAgICAgIG1Wc3luY1BlcmlvZCgwKSwKLSAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKLSAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKLSAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7CitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKIH0KIAogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjp1cGRhdGVWc3luYygpIHsKICAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOwotICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKIAotICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKLSAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKICAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKICAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpAQCAtMzY4LDEzNiArNjAsNiBAQAogICAgIH0KIH0KIAotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7Ci0gICAgdXBkYXRlVnN5bmMoKTsKLQotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlc3RhcnQoKSB7Ci0gICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKLSAgICBtVGltZUNvcnJlY3Rpb24gPSAwOwotCi0gICAgbVBsbC5yZXN0YXJ0KCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7Ci0gICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Ci19Ci0KLWZsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIDAuZjsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKLSAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKLQotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7Ci0gICAgICAgIHVwZGF0ZVZzeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0gICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKLSAgICB9Ci0KLSAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQotICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKLSAgICAgICAgbVZzeW5jVGltZSAtPQotICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0KLSAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCi0gICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKLSAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0KLSAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOwotICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKLSAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKLSAgICAgICAgc2l6ZV90IE4gPSAxMjsKLSAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQotICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7Ci0gICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCi0gICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCi0gICAgICAgICAgICBOID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7Ci0gICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgewotICAgICAgICAgICAgb2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOwotICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKLSAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKLSAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOwotICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7Ci0gICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKLSAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KLSAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7Ci0KLSAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQwotICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQotICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKLSAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKLSAgICAgICAgICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcwotICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7Ci0gICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKLSAgICByZXR1cm4gcmVuZGVyVGltZTsKLX0KLQogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgewogICAgIG1Db21wb3Nlci5jbGVhcigpOwogfQpAQCAtNTA3LDQgKzY5LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NjkwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlcjIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Nob3Jlb2dyYXBoZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZzeW5jVHJhY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBWc3luY1RyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZXsKK3B1YmxpYzoKKyAgICBWc3luY1RyYWNrZXIoKTsKKyAgICB+VnN5bmNUcmFja2VyKCkge30KKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisgICAgbnNlY3NfdCBnZXRWc3luY1RpbWUobnNlY3NfdCBwZXJpb2RPZmZzZXQpOworICAgIHZvaWQgYWRkU2FtcGxlKG5zZWNzX3QgdGltZXN0YW1wKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhTYW1wbGVzID0gMzI7CisgICAgc3RhdGljIGNvbnN0IGludCBrTWluU2FtcGxlc0ZvclVwZGF0ZSA9IDY7CisgICAgaW50IG1OdW1TYW1wbGVzOworICAgIGludCBtRmlyc3RTYW1wbGU7CisgICAgbnNlY3NfdCBtUmVmZXJlbmNlVGltZTsKKyAgICBuc2Vjc190IG1QaGFzZTsKKyAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgbnNlY3NfdCBtVGltZXN0YW1wU2FtcGxlc1trTWF4U2FtcGxlc107CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICB2b2lkIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9OworCitWc3luY1RyYWNrZXI6OlZzeW5jVHJhY2tlcigpCisgICAgOiBtTnVtU2FtcGxlcygwKSwKKyAgICAgIG1GaXJzdFNhbXBsZSgwKSwKKyAgICAgIG1SZWZlcmVuY2VUaW1lKDApLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVBlcmlvZCgwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U2FtcGxlczsgaSsrKSB7CisgICAgICAgIG1UaW1lc3RhbXBTYW1wbGVzW2ldID0gMDsKKyAgICB9Cit9CisKK25zZWNzX3QgVnN5bmNUcmFja2VyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNUaW1lKG5zZWNzX3QgcGVyaW9kT2Zmc2V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IHBoYXNlID0gbVJlZmVyZW5jZVRpbWUgKyBtUGhhc2U7CisKKyAgICAvLyByZXN1bHQgPSAoKChub3cgLSBwaGFzZSkgLyBtUGVyaW9kKSArIHBlcmlvZE9mZnNldCArIDEpICogbVBlcmlvZCArIHBoYXNlCisgICAgLy8gcHJldmVudCBvdmVyZmxvdworICAgIG5zZWNzX3QgcmVzdWx0ID0gKG5vdyAtIHBoYXNlKSAvIG1QZXJpb2Q7CisgICAgaWYgKHJlc3VsdCA+IExPTkdfTE9OR19NQVggLSBwZXJpb2RPZmZzZXQgLSAxKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBwZXJpb2RPZmZzZXQgKyAxOworICAgIH0KKyAgICBpZiAocmVzdWx0ID4gTE9OR19MT05HX01BWCAvIG1QZXJpb2QpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICo9IG1QZXJpb2Q7CisgICAgfQorICAgIGlmIChyZXN1bHQgPiBMT05HX0xPTkdfTUFYIC0gcGhhc2UpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9IHBoYXNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIG1QaGFzZSA9IDA7CisgICAgICAgIG1SZWZlcmVuY2VUaW1lID0gdGltZXN0YW1wOworICAgIH0KKyAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIG1OdW1TYW1wbGVzKSAlIGtNYXhTYW1wbGVzOworICAgIG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gPSB0aW1lc3RhbXA7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwga01heFNhbXBsZXMpIHsKKyAgICAgICAgbU51bVNhbXBsZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmlyc3RTYW1wbGUgPSAobUZpcnN0U2FtcGxlICsgMSkgJSBrTWF4U2FtcGxlczsKKyAgICB9CisgICAgdXBkYXRlTW9kZWxMb2NrZWQoKTsKK30KKwordm9pZCBWc3luY1RyYWNrZXI6OnVwZGF0ZU1vZGVsTG9ja2VkKCkgeworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNaW5TYW1wbGVzRm9yVXBkYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbnNlY3NfdCBkdXJhdGlvblN1bSA9IDA7CisgICAgbnNlY3NfdCBtaW5EdXJhdGlvbiA9IExPTkdfTUFYOworICAgIG5zZWNzX3QgbWF4RHVyYXRpb24gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgaW50IHByZXYgPSAoaWR4ICsga01heFNhbXBsZXMgLSAxKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIGR1cmF0aW9uID0gbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSAtIG1UaW1lc3RhbXBTYW1wbGVzW3ByZXZdOworICAgICAgICBkdXJhdGlvblN1bSArPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1pbkR1cmF0aW9uID4gZHVyYXRpb24pIHsgbWluRHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgICAgICBpZiAobWF4RHVyYXRpb24gPCBkdXJhdGlvbikgeyBtYXhEdXJhdGlvbiA9IGR1cmF0aW9uOyB9CisgICAgfQorCisgICAgZHVyYXRpb25TdW0gLT0gKG1pbkR1cmF0aW9uICsgbWF4RHVyYXRpb24pOworICAgIG1QZXJpb2QgPSBkdXJhdGlvblN1bSAvIChtTnVtU2FtcGxlcyAtIDMpOworCisgICAgZG91YmxlIHNhbXBsZUF2Z1ggPSAwLjA7CisgICAgZG91YmxlIHNhbXBsZUF2Z1kgPSAwLjA7CisgICAgZG91YmxlIHNjYWxlID0gMi4wICogTV9QSSAvIChkb3VibGUpIG1QZXJpb2Q7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG1OdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBpKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIHNhbXBsZSA9IG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gLSBtUmVmZXJlbmNlVGltZTsKKyAgICAgICAgZG91YmxlIHNhbXBsZVBoYXNlID0gKGRvdWJsZSkgKHNhbXBsZSAlIG1QZXJpb2QpICogc2NhbGU7CisgICAgICAgIHNhbXBsZUF2Z1ggKz0gY29zKHNhbXBsZVBoYXNlKTsKKyAgICAgICAgc2FtcGxlQXZnWSArPSBzaW4oc2FtcGxlUGhhc2UpOworICAgIH0KKworICAgIHNhbXBsZUF2Z1ggLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgc2FtcGxlQXZnWSAvPSAoZG91YmxlKSBtTnVtU2FtcGxlcyAtIDEuMDsKKyAgICBtUGhhc2UgPSAobG9uZykgKGF0YW4yKHNhbXBsZUF2Z1ksIHNhbXBsZUF2Z1gpIC8gc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCBmcmFtZUNhbGxiYWNrKGxvbmcgZnJhbWVUaW1lTmFub3MsIHZvaWQqIGRhdGEpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8VnN5bmNUcmFja2VyPiB2c3luY1RyYWNrZXIoc3RhdGljX2Nhc3Q8VnN5bmNUcmFja2VyKj4oZGF0YSkpOworICAgIHZzeW5jVHJhY2tlci0+YWRkU2FtcGxlKGZyYW1lVGltZU5hbm9zKTsKKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjayhBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgZnJhbWVDYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHZzeW5jVHJhY2tlci5nZXQoKSkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKSB7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga09uZU1pbGxpc2VjSW5OYW5vc2VjID0gMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT25lU2VjSW5OYW5vc2VjID0ga09uZU1pbGxpc2VjSW5OYW5vc2VjICogMTAwMDsKKworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzID0gZW52LT5GaW5kQ2xhc3MoCisgICAgICAgICAgICAiYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsIik7CisgICAgamNsYXNzIGpEaXNwbGF5Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9EaXNwbGF5Iik7CisKKyAgICBqbWV0aG9kSUQgakdldEluc3RhbmNlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsCisgICAgICAgICAgICAiZ2V0SW5zdGFuY2UiLCAiKClMYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsOyIpOworICAgIGpvYmplY3QgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLCBqR2V0SW5zdGFuY2UpOworCisgICAgamZpZWxkSUQgakRFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqRGlzcGxheUNscywgIkRFRkFVTFRfRElTUExBWSIsICJJIik7CisgICAgamludCBERUZBVUxUX0RJU1BMQVkgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpEaXNwbGF5Q2xzLCBqREVGQVVMVF9ESVNQTEFZKTsKKworICAgIGptZXRob2RJRCBqZ2V0UmVhbERpc3BsYXkgPSBlbnYtPkdldE1ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRSZWFsRGlzcGxheSIsICIoSSlMYW5kcm9pZC92aWV3L0Rpc3BsYXk7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5TWFuYWdlckdsb2JhbE9iaiwgamdldFJlYWxEaXNwbGF5LCBERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpHZXRSZWZyZXNoUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlDbHMsICJnZXRSZWZyZXNoUmF0ZSIsICIoKUYiKTsKKyAgICBqZmxvYXQgamF2YVJlZnJlc2hSYXRlID0gZW52LT5DYWxsRmxvYXRNZXRob2QoamF2YURpc3BsYXlPYmosIGpHZXRSZWZyZXNoUmF0ZSk7CisgICAgbnNlY3NfdCB2c3luY1BlcmlvZCA9IChuc2Vjc190KSAoa09uZVNlY0luTmFub3NlYyAvIChmbG9hdCkgamF2YVJlZnJlc2hSYXRlKTsKKworICAgIGptZXRob2RJRCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldEFwcFZzeW5jT2Zmc2V0TmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YUFwcFZzeW5jT2Zmc2V0ID0gZW52LT5DYWxsTG9uZ01ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldEFwcFZzeW5jT2Zmc2V0TmFub3MpOworICAgICphcHBWc3luY09mZnNldFB0ciA9IChuc2Vjc190KSBqYXZhQXBwVnN5bmNPZmZzZXQ7CisKKyAgICBqbWV0aG9kSUQgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakRpc3BsYXlDbHMsICJnZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zIiwgIigpSiIpOworICAgIGpsb25nIGphdmFQcmVzZW50YXRpb25EZWFkbGluZSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCisgICAgICAgICAgICBqYXZhRGlzcGxheU9iaiwgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MpOworCisgICAgKnNmVnN5bmNPZmZzZXRQdHIgPSB2c3luY1BlcmlvZCAtICgobnNlY3NfdCkgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lIC0ga09uZU1pbGxpc2VjSW5OYW5vc2VjKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9yZW9ncmFwaGVyIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIENob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSk7CisgICAgc3RhdHVzX3QgaW5pdCh2b2lkKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWR5VG9SdW4oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2hvcmVvZ3JhcGhlclRocmVhZCgpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hvcmVvZ3JhcGhlclRocmVhZCk7CisgICAgdm9pZCogbURhdGE7Cit9OworCitDaG9yZW9ncmFwaGVyVGhyZWFkOjpDaG9yZW9ncmFwaGVyVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpIDogVGhyZWFkKGNhbkNhbGxKYXZhKSB7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OmluaXQodm9pZCogZGF0YSkgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1EYXRhID0gZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7CisgICAgQUxvb3Blcl9wcmVwYXJlKEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTKTsKKyAgICBpZiAoQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjayhBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLCBmcmFtZUNhbGxiYWNrLCBtRGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENob3Jlb2dyYXBoZXJUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgQUxvb3Blcl9wb2xsT25jZSgtMSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6OlZpZGVvRnJhbWVTY2hlZHVsZXIyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKKworICAgIGdldFZzeW5jT2Zmc2V0KCZtQXBwVnN5bmNPZmZzZXQsICZtU2ZWc3luY09mZnNldCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgdGhyZWFkTG9jayhtTG9jayk7CisgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQgPSBuZXcgQ2hvcmVvZ3JhcGhlclRocmVhZCh0cnVlKTsKKworICAgIG1Wc3luY1RyYWNrZXIgPSBuZXcgVnN5bmNUcmFja2VyKCk7CisgICAgaWYgKG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5pbml0KHN0YXRpY19jYXN0PHZvaWQqPihtVnN5bmNUcmFja2VyLmdldCgpKSkgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1DaG9yZW9ncmFwaGVyVGhyZWFkICE9IE5VTEwgJiYgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJ1bigiQ2hvcmVvZ3JhcGhlciIpICE9IE9LKSB7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjp1cGRhdGVWc3luYygpIHsKKyAgICBtVnN5bmNUaW1lID0gMDsKKyAgICBtVnN5bmNQZXJpb2QgPSAwOworCisgICAgaWYgKG1Wc3luY1RyYWNrZXIgIT0gTlVMTCkgeworICAgICAgICBtVnN5bmNQZXJpb2QgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1BlcmlvZCgpOworICAgICAgICBtVnN5bmNUaW1lID0gbVZzeW5jVHJhY2tlci0+Z2V0VnN5bmNUaW1lKG1TZlZzeW5jT2Zmc2V0IC0gbUFwcFZzeW5jT2Zmc2V0KTsKKyAgICB9CisgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6cmVsZWFzZSgpIHsKKyAgICAvLyBEbyBub3QgY2hhbmdlIG9yZGVyCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgdGhyZWFkTG9jayhtTG9jayk7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtVnN5bmNUcmFja2VyLmNsZWFyKCk7Cit9CisKK1ZpZGVvRnJhbWVTY2hlZHVsZXIyOjp+VmlkZW9GcmFtZVNjaGVkdWxlcjIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMDdmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7CisgICAgaWYgKCpsaHMgPCAqcmhzKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprSGlzdG9yeVNpemU7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprSGlzdG9yeVNpemU7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOworc3RhdGljIGNvbnN0IGludDY0X3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyNSUKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxJQorc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xczsgICAgIC8vIDEgc2VjCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAvLyAxMCBzZWMKKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6UExMKCkKKyAgICA6IG1QZXJpb2QoLTEpLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVByaW1lZChmYWxzZSksCisgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nKDApLAorICAgICAgbUxhc3RUaW1lKC0xKSwKKyAgICAgIG1OdW1TYW1wbGVzKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKKyAgICAvL3Rlc3QoKTsKKworICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgIG1MYXN0VGltZSA9IC0xOworCisgICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAorICAgIGlmIChmcHMgPD0gMC5mKSB7CisgICAgICAgIG1QZXJpb2QgPSAtMTsKKyAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7CisgICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKKyAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgfQorCisgICAgcmVzdGFydCgpOworfQorCisvLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc3RhcnQoKSB7CisgICAgbU51bVNhbXBsZXMgPSAwOworICAgIG1QaGFzZSA9IC0xOworfQorCisjaWYgMAorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnRlc3QoKSB7CisgICAgbnNlY3NfdCBwZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDYwOworICAgIG1UaW1lc1swXSA9IDA7CisgICAgbVRpbWVzWzFdID0gcGVyaW9kOworICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7CisgICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKKyAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OworICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7CisgICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7CisgICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7CisgICAgbU51bVNhbXBsZXMgPSA4OworICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7CisgICAgLy8gYSA9IDAuOCg1KSsKKyAgICAvLyBiID0gLTAuMTQwOTcoMikrCisgICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCisgICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKK30KKworI2VuZGlmCisKK2Jvb2wgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6Zml0KAorICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKworICAgIGlmICgocGVyaW9kID4+IGtQcmVjaXNpb24pID09IDAgKSB7CisgICAgICAgIEFMT0dXKCJQZXJpb2QgaXMgMCwgb3IgYWZ0ZXIgaW5jbHVkaW5nIHByZWNpc2lvbiBpcyAwIC0gd291bGQgY2F1c2UgZGl2MCwgcmV0dXJuaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1bVggPSAwOworICAgIGludDY0X3Qgc3VtWFggPSAwOworICAgIGludDY0X3Qgc3VtWFkgPSAwOworICAgIGludDY0X3Qgc3VtWVkgPSAwOworICAgIGludDY0X3Qgc3VtWSA9IDA7CisKKyAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKKyAgICBuc2Vjc190IGxhc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCisgICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKKyAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKKyAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KKyAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7CisgICAgICAgIHN1bVggKz0geDsKKyAgICAgICAgc3VtWSArPSB5OworICAgICAgICBzdW1YWCArPSB4ICogeDsKKyAgICAgICAgc3VtWFkgKz0geCAqIHk7CisgICAgICAgIHN1bVlZICs9IHkgKiB5OworICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorCisgICAgaW50NjRfdCBkaXYgICA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7CisgICAgaWYgKGRpdiA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGFfbm9tID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKKyAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7CisgICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKKyAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOworICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAorICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7CisgICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnByaW1lKHNpemVfdCBudW1TYW1wbGVzVG9Vc2UpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorICAgIENIRUNLKG51bVNhbXBsZXNUb1VzZSA+PSAzKTsgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHNhbXBsZXMKKworICAgIC8vIGVzdGltYXRlIHZpZGVvIGZyYW1lcmF0ZSBmcm9tIGRlbHRhcyBiZXR3ZWVuIHRpbWVzdGFtcHMsIGFuZAorICAgIC8vIDJuZCBvcmRlciBkZWx0YXMKKyAgICBWZWN0b3I8bnNlY3NfdD4gZGVsdGFzOworICAgIG5zZWNzX3QgbGFzdFRpbWUsIGZpcnN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaW5kZXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFRpbWUgPiBrTWluUGVyaW9kKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGE6ICVsbGQiLCAobG9uZyBsb25nKSh0aW1lIC0gbGFzdFRpbWUpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaCh0aW1lIC0gbGFzdFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlyc3RUaW1lID0gdGltZTsKKyAgICAgICAgfQorICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorICAgIGRlbHRhcy5zb3J0KGNvbXBhcmU8bnNlY3NfdD4pOworICAgIHNpemVfdCBudW1EZWx0YXMgPSBkZWx0YXMuc2l6ZSgpOworICAgIGlmIChudW1EZWx0YXMgPiAxKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNaW5MaW1pdCA9IG1heChkZWx0YXNbMF0gLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2LCBrTWluUGVyaW9kKTsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1heExpbWl0ID0gZGVsdGFzW251bURlbHRhcyAvIDJdICoga011bHRpcGxlc1RocmVzaG9sZERpdjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG51bURlbHRhcyAvIDIgKyAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZWx0YXNbaV0gPiBkZWx0YU1heExpbWl0KSB7CisgICAgICAgICAgICAgICAgZGVsdGFzLnJlc2l6ZShpKTsKKyAgICAgICAgICAgICAgICBudW1EZWx0YXMgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEybmQgPSBkZWx0YXNbaV0gLSBkZWx0YXNbaSAtIDFdOworICAgICAgICAgICAgaWYgKGRlbHRhMm5kID49IGRlbHRhTWluTGltaXQpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTI6ICVsbGQiLCAobG9uZyBsb25nKShkZWx0YTJuZCkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKGRlbHRhMm5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZSB0aGUgb25lIHRoYXQgeWllbGRzIHRoZSBiZXN0IG1hdGNoCisgICAgaW50NjRfdCBiZXN0U2NvcmU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YSA9IGRlbHRhc1tpXTsKKyAgICAgICAgaW50NjRfdCBzY29yZSA9IDA7CisjaWYgMQorICAgICAgICAvLyBzaW1wbGVzdCBzY29yZTogbnVtYmVyIG9mIGRlbHRhcyB0aGF0IGFyZSBuZWFyIG11bHRpcGxlcworICAgICAgICBzaXplX3QgbWF0Y2hlcyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGVsdGFzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBuc2Vjc190IGVyciA9IHBlcmlvZGljRXJyb3IoZGVsdGFzW2pdLCBkZWx0YSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgZGVsdGEgLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2KSB7CisgICAgICAgICAgICAgICAgKyttYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjb3JlID0gbWF0Y2hlczsKKyNpZiAwCisgICAgICAgIC8vIGNvdWxkIGJlIHdlaWdoZWQgYnkgdGhlICgxIC0gbm9ybWFsaXplZCBlcnJvcikKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIGVyciA9ICgxIDw8ICgyICoga1ByZWNpc2lvbikpIC0gZXJyOworICAgICAgICAgICAgc2NvcmUgKj0gbWF4KDAsIGVycik7CisgICAgICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgLy8gb3IgdXNlIHRoZSBlcnJvciBhcyBhIG5lZ2F0aXZlIHNjb3JlCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBzY29yZSA9IC1kZWx0YSAqIGVycjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChpID09IDAgfHwgc2NvcmUgPiBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOworICAgICAgICAgICAgbVBlcmlvZCA9IGRlbHRhOworICAgICAgICAgICAgbVBoYXNlID0gZmlyc3RUaW1lOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKKyAgICBpZiAobUxhc3RUaW1lID49IDAKKyAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKKyAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKKyAgICAgICAgcmVzdGFydCgpOworICAgIH0KKworICAgIG1MYXN0VGltZSA9IHRpbWU7CisgICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7CisgICAgKyttTnVtU2FtcGxlczsKKworICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7CisgICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7CisgICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOworICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7CisgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICBpZiAobVBoYXNlIDwgMCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQorICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKKyAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKKyAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KKyAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKKworICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKworICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1QZXJpb2Q7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgeworICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkKKyAgICA6IG1Wc3luY1RpbWUoMCksCisgICAgICBtVnN5bmNQZXJpb2QoMCksCisgICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCisgICAgICBtTGFzdFZzeW5jVGltZSgtMSksCisgICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7CisgICAgdXBkYXRlVnN5bmMoKTsKKworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpyZXN0YXJ0KCkgeworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzdGFydCgpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBpZiAobVZzeW5jUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gbVZzeW5jUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKK30KKworZmxvYXQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldEZyYW1lUmF0ZSgpIHsKKyAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKKyAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIDAuZjsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7CisgICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7CisKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgeworICAgICAgICB1cGRhdGVWc3luYygpOworICAgIH0KKworICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgeworICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7CisgICAgfQorCisgICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKKyAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7CisgICAgICAgIG1Wc3luY1RpbWUgLT0KKyAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7CisgICAgfQorCisgICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQorICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCisgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworCisgICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKKyAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7CisgICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCisgICAgICAgIHNpemVfdCBOID0gMTI7CisgICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KKyAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQorICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOworICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQorICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLworICAgICAgICAgICAgTiA9IDIwOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOworICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKKyAgICAgICAgICAgIG9mZnNldCArPQorICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOworICAgICAgICB9CisgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gKG5zZWNzX3QpTjsKKyAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247CisgICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7CisgICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIChuc2Vjc190KU4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKKyAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgeworICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5CisgICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9CisgICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOworICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOworICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KKyAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOworCisgICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPiAwKQorICAgICAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA8IFVMT05HX01BWCkKKyAgICAgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgKiAyCisgICAgICAgICAgICAgICAgICAgIHx8IG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAqIDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGlvbiBiZXlvbmQgbGltaXQ6ICVsbGQgdnMgJWxsZCAodnN5bmNzIGZvciBsYXN0IGZyYW1lOiAlenUsIG1pbjogJXp1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcmVzdGFydGluZy4gcmVuZGVyPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVGltZUNvcnJlY3Rpb24sIChsb25nIGxvbmcpY29ycmVjdGlvbkxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNzRm9yTGFzdEZyYW1lLCBtaW5Wc3luY3NQZXJGcmFtZSwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSk7CisgICAgICAgICAgICAgICAgcmVzdGFydCgpOworICAgICAgICAgICAgICAgIHJldHVybiBvcmlnUmVuZGVyVGltZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7CisgICAgfQorCisgICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKKyAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7CisgICAgcmV0dXJuIHJlbmRlclRpbWU7Cit9CisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjp+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7fQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAppbmRleCBkYjg2MjE4Li4yMThmZTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKQEAgLTQsNyArNCw3IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0KKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiQ29udmVyc2lvbi5jcHAiLAogICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCkBAIC0yNSw3ICsyNSw2IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKQEAgLTM4LDggKzM3LDYgQEAKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAotCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcAppbmRleCBmZmVkMDA1Li45MWQ3Yzc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcApAQCAtOTgsNiArOTgsMTcgQEAKICAqLwogCiAvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAorc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogKHQuaXNEZWFkT2JqZWN0KCkgPyBERUFEX09CSkVDVCA6IFVOS05PV05fRVJST1IpOworfQorCisvKioKICAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBiaW5kZXI6OlN0YXR1c2AuCiAgKgogICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCkBAIC0xMDcsMjIgKzExOCwxMSBAQAogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cygKICAgICAgICAgUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKAotICAgICAgICAgICAgdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1IsCisgICAgICAgICAgICB0b1N0YXR1c1QodCksCiAgICAgICAgICAgICB0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiB9CiAKIC8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190Ci1zdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKICAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgogICoKICAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDcxY2VlZDguLmE0Mzc0YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC03NjcsNyArNzY3LDcgQEAKICAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKICAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKQEAgLTExMDYsNiArMTEwNiwxNCBAQAogICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKICAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKIAorICAgICAgICAvLyBTZXQgaW1wbC4gZGVmaW5lZCBmb3JtYXQgYXMgZGVmYXVsdC4gRGVwZW5kaW5nIG9uIHRoZSB1c2FnZSBmbGFncworICAgICAgICAvLyB0aGUgZGV2aWNlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgZGVyaXZlIHRoZSBleGFjdCBmb3JtYXQuCisgICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBzdXJmYWNlIGRlZmF1bHQgZm9ybWF0IHJldDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IDM3OWQ0MWUuLmUwZjI2ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtMTA1OCw4ICsxMDU4LDggQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaDoKICAgICAgICAgewpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCBhNDNjZGYxLi44MjUzYjdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMjE5LDggKzIxOSw4IEBACiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0cmF0ZSk7CiAKLSAgICBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAxNjc0Y2IyLi4zZDRhNDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMjksNyArMjksNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IDRkYjAwNjAuLjg0MmE3Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC04OSwxMiArODksMTIgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDQwOTYgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CiAgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKLSAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSBzaXplb2YoZmxvYXQpOwogCiAgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOwogICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KIApAQCAtMTk1LDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gbU51bWVyaWNhbERhdGE7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAyOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0yODEsNiArMjgxLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdCAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDE2KSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0zMDEsMTEgKzMxNCwxMyBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCisgICAgY29uc3QgYm9vbCBvdXRwdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisKICAgICBBTE9HVigib25RdWV1ZUZpbGxlZCAlZC8lZDoiLCBpblF1ZXVlLmVtcHR5KCksIG91dFF1ZXVlLmVtcHR5KCkpOwogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtRmluaXNoZWREZWNvZGVyKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIGludDE2X3QgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICB2b2lkICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKICAgICAgICAgc2l6ZV90IG91dEJ1ZmZlclNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOwogCkBAIC0zNzQsNyArMzg5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwgb3V0cHV0RmxvYXQpOwogICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0zOTMsNyArNDA4LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtU2F3SW5wdXRFT1MpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKE5VTEwsIDAsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogaW5CdWZmZXIgKi8sIDAgLyogaW5CdWZmZXJMZW4gKi8sCisgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUsIG91dHB1dEZsb2F0KTsKICAgICAgICAgICAgIG1GaW5pc2hlZERlY29kZXIgPSB0cnVlOwogICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZmluaXNoIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKQEAgLTQ1Niw3ICs0NzMsOCBAQAogICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CiAgICAgICAgICAgICBQb3J0SW5mbyAqaW5mbyA9IGVkaXRQb3J0SW5mbygxIC8qIHBvcnRJbmRleCAqLyk7CiAgICAgICAgICAgICBpZiAoIWluZm8tPm1EZWYuYkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpbmZvLT5tRGVmLm5CdWZmZXJTaXplID0gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogMjsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRGVmLm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCmluZGV4IGI2M2Y3YWQuLmJhMDIwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKQEAgLTQ1LDEwICs0NSwxNCBAQAogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga051bVNhbXBsZXNQZXJGcmFtZSA9IDIwNDg7IC8vIGFkanVzdGVkIGJhc2VkIG9uIHN0cmVhbS4KKwogICAgIGVudW0gewogICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICAgPSA0LAogICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyAgPSA0LAogICAgIH07CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAppbmRleCA5YjY5NmRhLi5iMzJhYjA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icApAQCAtMjgsNyArMjgsMTAgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYmFzZV9oZWFkZXJzIl0sCi0gICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCA5NTVmMjExLi4zYWRkMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEZsYWNFbmNvZGVyLmgiCi0KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIApAQCAtNzUsNyArNzUsOSBAQAogICAgIH0KIAogICAgIGlmICghbVNpZ25hbGxlZEVycm9yKSB7IC8vIG5vIHVzZSBhbGxvY2F0aW5nIGlucHV0IGJ1ZmZlciBpZiB3ZSBoYWQgYW4gZXJyb3IgYWJvdmUKLSAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2Moc2l6ZW9mKEZMQUNfX2ludDMyKSAqIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgLy8gMnggdGhlIHBjbTE2IHNhbXBsZXMgY2FuIGV4aXN0IHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBwY21GbG9hdCBzYW1wbGVzLgorICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgICAgICBzaXplb2YoRkxBQ19faW50MzIpICoga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOwogICAgICAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlNvZnRGbGFjRW5jb2Rlcjo6U29mdEZsYWNFbmNvZGVyKG5hbWU9JXMpIGVycm9yIGFsbG9jYXRpbmcgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIiwgbmFtZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTE1LDE0ICsxMTcsMTQgQEAKICAgICAvLyBjb25maWd1cmUgaW5wdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4SW5wdXRCdWZmZXJTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTEzNCw3ICsxMzYsNyBAQAogICAgIC8vIGNvbmZpZ3VyZSBvdXRwdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOy8vIFRPRE8gdmVyaWZ5IHRoYXQgMSBpcyBlbm91Z2gKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CiAgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE91dHB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CkBAIC0xOTMsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTI3MCwxMiArMjcyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVkIGNoYW5uZWxzIGF0ICVkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUVuY29kZXIoKTsKQEAgLTM1Niw2ICszNzIsMTAgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gc2FtcGxlU2l6ZSAqIG1OdW1DaGFubmVsczsKKwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogCiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1TZW50T3V0cHV0RU9TKSB7CkBAIC0zODEsMTMgKzQwMSwyMSBAQAogICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOwogICAgICAgICAgICAgbUN1cnJlbnRJbnB1dFRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1MxNiAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBmcmFtZVNpemU7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gc2FtcGxlU2l6ZTsKIAotICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgaWYgKGlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlIG5iSW5wdXRTYW1wbGVzIG1heSBiZSAyeCBhcyBsYXJnZSBmb3IgcGNtMTYgZGF0YS4KKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKICAgICAgICAgICAgIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKQEAgLTUyNiwxMCArNTU0LDEyIEBACiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CiAgICAgfQogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBpbnQgY29kZWNCaXRzUGVyU2FtcGxlID0gaW5wdXRGbG9hdCA/IDI0IDogMTY7CiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtTnVtQ2hhbm5lbHMpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbVNhbXBsZVJhdGUpOwotICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIDE2KTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBjb2RlY0JpdHNQZXJTYW1wbGUpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwKICAgICAgICAgICAgICh1bnNpZ25lZCltQ29tcHJlc3Npb25MZXZlbCk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDY0YTZiMWUuLjcyMmZjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTQ1LDggKzQ1LDEwIEBACiAKIHByaXZhdGU6CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtOdW1CdWZmZXJzID0gMjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpICogMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4Q2hhbm5lbHMgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPQorICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gNjU1MzY7ICAgIC8vVE9ETyBjaGVjayBpZiB0aGlzIGNhbiBiZSByZWR1Y2VkCiAKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKQEAgLTU0LDYgKzU2LDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggYzE0OTgzYS4uODc3Y2I1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIAorI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDYgIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0ZW1wbGF0ZTxjbGFzcyBUPgpAQCAtMTg0LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggYTc1NDgzYS4uM2QxMDA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTYxNyw2ICs2MTcsNyBAQAogICAgIHJldHVybjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93X2ludHJhKAogICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDc1Y2E4NDYuLjljMGZjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMTg2LDggKzE4Niw4IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwogICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKICNlbHNlCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CkBAIC0yMTMsNiArMjEzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwpAQCAtMzM5LDI3ICszNDAsMzMgQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAKICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2Vsc2UKICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwogICAgIH0KICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbmRpZgogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwogI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKQEAgLTM4Myw4ICszOTAsMTAgQEAKIAogICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTQzMSwxMCArNDQwLDEyIEBACiAjZWxzZQogICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewpAQCAtNDQyLDYgKzQ1Myw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogCiAgICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKQEAgLTQ1MCw2ICs0NjIsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogCiAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KQEAgLTQ1OSw5ICs0NzIsMTEgQEAKICAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCiAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewpAQCAtNDY5LDYgKzQ4NCw3IEBACiAgICAgfQogICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKIAogICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwpAQCAtNDg5LDggKzUwNSwxMCBAQAogICAgIH0KICAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAwMGYyZGQzLi43MWUxMTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2lmbmRlZiBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KICNkZWZpbmUgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCmluZGV4IDUzMTQ5YzEuLmVjYzMyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMzc3LDE1ICszNzcsMTUgQEAKIC8qICBJbi9vdXQgICA6IE5yLCBCLCBSciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJ2aWRlbyIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLQogUFZfU1RBVFVTIFJDX1VwZGF0ZUJ1ZmZlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyLCBJbnQgbnVtX3NraXApCiB7CiAgICAgcmF0ZUNvbnRyb2wgKnJjICA9IHZpZGVvLT5yY1tjdXJyTGF5ZXJdOwogICAgIE11bHRpUGFzcyAgICpwTVAgPSB2aWRlby0+cE1QW2N1cnJMYXllcl07CiAKLSAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCByYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQorICAgIGlmIChyYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gUFZfRkFJTDsKIAogICAgIHJjLT5WQlZfZnVsbG5lc3MgICAtPSAoSW50KShyYy0+Yml0cmF0ZSAvIHJjLT5mcmFtZXJhdGUgKiBudW1fc2tpcCk7IC8vcmNbY3VyckxheWVyXS0+UnA7CkBAIC01MjQsNiArNTI0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiB2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKHZvaWQgKmlucHV0KQpAQCAtNTM3LDcgKzUzOCw3IEBACiAgICAgSW50IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0LCBwcmV2X2NvdW50ZXJfZGlmZiwgY3Vycl9jb3VudGVyX2RpZmYsIGJvdW5kOwogICAgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBmb3IgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogc29tZSBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyByZW1haW5lZCBoZXJlIHRvIGJlIGRvbmUgYmVjYXVzZSBwTVAgY2Fubm90IGJlIGluc2VydGVkIGludG8gdXBkYXRlUmF0ZUNvbnRyb2woKSovCkBAIC02OTMsNiArNjk0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UIGFuZCByYy0+UWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbnB1dCBhcmd1bWVudCAiaW5wdXQiIGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgYnkgY2FsbGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKyBRUCBjYWxjdWxhdGlvbiB3aXRoIGEgbmV3IHF1YWRyYXRpYyBtZXRob2QgKi8KQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgIGZsb2F0IGN1cnJfbWFkLCBwcmV2X21hZCwgY3Vycl9SRCwgcHJldl9SRCwgYXZlcmFnZV9tYWQsIGF2ZXJfUVA7CiAKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCBlN2QzMDVkLi44MDA4M2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKIAogICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIG1EZWNvZGVyQnVmID0gY2FsbG9jKDEsIG1lbVJlcXVpcmVtZW50cyk7CiAKICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgbUlzRmlyc3QgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCAzZGY0ZDRjLi5jNjU1NTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSw5ICsxLDYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0TVBFRzIuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDhkNWYzZTcuLjBmMmZmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIxMFBsdXMsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKIH07CiAKIFNvZnRWUFg6OlNvZnRWUFgoCkBAIC04NCw2ICs4NSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTY3LDcgKzE3MiwxMiBAQAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7Ci0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBQcml2SW5mbyAqcHJpdkluZm8gPSAoUHJpdkluZm8gKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHByaXZJbmZvLT5tVGltZVN0YW1wOworICAgICAgICBpZiAocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CkBAIC0yNzUsNyArMjg1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubVRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbkluZm8tPm1GcmFtZUNvbmZpZykgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvID0gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tSGRyMTBQbHVzSW5mby5jbGVhcigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKQEAgLTI4NSw3ICszMDEsNyBAQAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CiAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgJm1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XSwgMCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IFZQWF9DT0RFQ19PSykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBiNjJiNTI2Li4wYWE4ZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFCdWZmZXI7CisKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFgoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUsCkBAIC00MSw2ICs0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTYwLDcgKzYzLDExIEBACiAKICAgICB2b2lkICptQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCi0gICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICBzdHJ1Y3QgUHJpdkluZm8geworICAgICAgICBPTVhfVElDS1MgbVRpbWVTdGFtcDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c0luZm87CisgICAgfTsKKyAgICBQcml2SW5mbyBtUHJpdkluZm9ba051bUJ1ZmZlcnNdOwogICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IDJkZmJhMTMuLmQwY2IwNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTQwMSw4ICs0MDEsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC00NDIsNyArNDQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKaW5kZXggZGQ4NmQzNi4uMjYzZDEzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCkBAIC04NCw4ICs4NCw4IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbSk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICAvLyBPTVggY2FsbGJhY2sgd2hlbiBidWZmZXJzIGF2YWlsYWJsZQogICAgIC8vIE5vdGUgdGhhdCBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCBkNDBmNTI1Li40ZjYxYWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTQzMCw4ICs0MzAsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIDJuZCBhbmQgM3JkIGlucHV0IGJ1ZmZlciBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbgorICAgICAgICAgICAgICAgIC8vICBhbiBpbnQ2NF90IChzZWUgYmVsb3cpLCBzbyBtYWtlIHN1cmUgd2UgZ2V0IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gIHRoYXQgbXVjaC4gVGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gMTkgYnl0ZXMsCisgICAgICAgICAgICAgICAgLy8gIGJ1dCB0aGF0IGlzIGNoZWNrZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1IZWFkZXI7CiAgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOwogICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CkBAIC00NTIsNiArNDYxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKaW5kZXggYjk5YmNkOC4uZGE4Njc1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgY29uc3QgT01YX1UzMiBrU3VwcG9ydGVkUHJvZmlsZXNbXSA9IHsKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsIE9NWF9BVURJT19BQUNPYmplY3RIRSwgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywKLSAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsCisgICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFCiB9OwogCiBTb2Z0WEFBQzo6U29mdFhBQUMoY29uc3QgY2hhciogbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCkBAIC0xMTAsMTUgKzExMCwyMiBAQAogCiB7CiAgICAgaW5pdFBvcnRzKCk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgSUFfTk9fRVJST1IpOwogfQogCiBTb2Z0WEFBQzo6flNvZnRYQUFDKCkgewotICAgIGludCBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpZiAoMCAhPSBlcnJDb2RlKSB7Ci0gICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVycl9jb2RlKTsKICAgICB9CiAKKyAgICBlcnJfY29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOworICAgIH0KICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CiB9CkBAIC0xNjQsMzYgKzE3MSwxNiBAQAogICAgIGFkZFBvcnQoZGVmKTsKIH0KIAotc3RhdHVzX3QgU29mdFhBQUM6OmluaXREZWNvZGVyKCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7CiAgICAgaW50IHVpX2RyY192YWw7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGxvb3AgPSAwOwogCiAgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gbVhoZWFhY0NvZGVjSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBtTXBlZ0REcmNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNUEVHLUQgRFJDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGxvb3AgPSAxOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgJWRcbiIsIGxvb3ApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdKSBmcmVlKG1NZW1vcnlBcnJheVtsb29wXSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU1hbGxvY0NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgIH0KIAogICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CkBAIC0yNzQsNyArMjYxLDcgQEAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKIAogI2VuZGlmCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFhBQUM6OmludGVybmFsR2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CkBAIC01NDcsOSArNTM0LDYgQEAKICAgICAvKiBzYW1wbGUgY3VycmVudGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CiAgICAgICAgIG51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWEFBQyBhc3N1bWVzIDIgYnl0ZXMgcGVyIHNhbXBsZSEgbVBjbVdkU3ogJWQiLCBtUGNtV2RTeik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjksOCArNTUzLDggQEAKICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCiAgICAgICAgICAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLwotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTY4Miw4ICs2NjYsOCBAQAogICAgICAgICAgICAgLyogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUgICovCiAgICAgICAgICAgICAvKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICgwICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CkBAIC04NDUsNyArODI5LDcgQEAKICAgICB9CiB9CiAKLWludCBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CkBAIC04NzEsMTYgKzg1NSwxMyBAQAogICAgICAgICAgICAgIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogIgogICAgICAgICAgICAgIiVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAogICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7Ci0gICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7Ci0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRyYWluRGVjb2RlcigpIHsKLSAgICByZXR1cm4gMDsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogdm9pZCBTb2Z0WEFBQzo6b25SZXNldCgpIHsKQEAgLTkyMSw3ICs5MDIsNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjppbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKICAgICBMT09QSURYIGk7CiAKICAgICAvKiBFcnJvciBjb2RlICovCkBAIC05MzksMTEgKzkyMCwxMSBAQAogICAgIFVXT1JEMzIgdWlfcHJvY19tZW1fdGFic19zaXplOwogICAgIC8qIEFQSSBzaXplICovCiAgICAgVVdPUkQzMiBwdWlfYXBpX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOwogCiAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CiAgICAgbUlucHV0QnVmZmVyID0gMDsKICAgICBtT3V0cHV0QnVmZmVyID0gMDsKLSAgICBtTWFsbG9jQ291bnQgPSAwOwogCiAgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NTQsMjAgKzkzNSwxMyBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShOVUxMLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CiAKICAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC05NzksMjMgKzk1MywxNiBAQAogCiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwogCi0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBpZiAobU1wZWdERHJjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgZHJjIGFwaSBzdHJ1Y3R1cmUgRmFpbGVkIik7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbWVtc2V0KG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdLCAwLCBwdWlfYXBpX3NpemUpOworICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOwogCi0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1NcGVnRERyY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbWVtc2V0KG1NcGVnRERyY0hhbmRsZSwgMCwgcHVpX2FwaV9zaXplKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC0xMDIxLDIzICs5ODgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwKICAgICAgICAgICAgICAgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLwotICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudCAtIDFdKSk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAorICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOwogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwNjYsMTcgKzEwMjcsMTIgQEAKICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CiAKLSAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOwotICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgIG1NYWxsb2NDb3VudCsrOworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAogICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CkBAIC0xMDk1LDcgKzEwNTEsNyBAQAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CiAgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOwogCkBAIC0xMTU0LDE0ICsxMTEwLDc2IEBACiAKICAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmNvbmZpZ01QRUdERHJjKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGlfZWZmZWN0X3R5cGU7CiAgICAgaW50IGlfbG91ZF9ub3JtOwogICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKICAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKLSAgICBpbnQgbl9tZW1zOwogICAgIGludCBpOworICAgIGludCB1aV9wcm9jX21lbV90YWJzX3NpemUgPSAwOworICAgIHBWT0lEIHB2X2FsbG9jX3B0ciA9IE5VTEw7CiAKICNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQwogICAgIHsKQEAgLTEyMTIsODMgKzEyMzAsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSwgJmlfc2JyX21vZGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKIAorICAgICAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHB2X2FsbG9jX3B0ciwgMCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsIE5VTEwpOwogCiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgewotICAgICAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKLSAgICAgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKIAotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfYWxpZ25tZW50KTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLQotICAgICAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImluaXRNUEVHREREcmMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJfY29kZTsKICAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZTsKLSAgICAgICAgICAgIHVpX3NpemUgPSA4MTkyICogMjsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyY0luQnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjSW5CdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotCi0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjT3V0QnVmKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKLSAgICAgICAgfQogICAgICAgICAvKiBEUkMgYnVmZmVycwogICAgICAgICAgICAgYnVmWzBdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQgbG91ZG5lc3MgcmVsYXRlZAogICAgICAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLwpAQCAtMTQyMywxMCArMTQwMiwxMCBAQAogICAgIH0KICNlbmRpZgogCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwgaW50MzJfdCogb3V0Qnl0ZXMpIHsKICAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKQEAgLTE1MTYsMjQgKzE0OTUsMzMgQEAKICAgICAgICAgbWVtY3B5KG1PdXRwdXRCdWZmZXIsIG1EcmNPdXRCdWYsICpvdXRCeXRlcyk7CiAgICAgfQogI2VuZGlmCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CiAgICAgQUxPR0koImRlSW5pdFhBQUNEZWNvZGVyIik7CiAKICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCAwLCBOVUxMKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0lOUFVUX09WRVIiKTsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1hbGxvY0NvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtpXSkgZnJlZShtTWVtb3J5QXJyYXlbaV0pOworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CiAgICAgfQotICAgIG1NYWxsb2NDb3VudCA9IDA7Ci0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CiAgICAgcmV0dXJuIGVycl9jb2RlOwogfQogCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HSSgiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCiBJQV9FUlJPUkNPREUgU29mdFhBQUM6OmdldFhBQUNTdHJlYW1JbmZvKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOwogCkBAIC0xNTQ2LDExICsxNTM0LDE5IEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTLCAmbU51bUNoYW5uZWxzKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogUENNIHdvcmQgc2l6ZSAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLCAmbVBjbVdkU3opOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlOiAlZCwgRXhwZWN0ZWQgaXMgMiIsIG1QY21XZFN6KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KIAogICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKaW5kZXggNjE3NjA4Mi4uYTYyYTc5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSAiaW1wZF9hcGljbWRfc3RhbmRhcmRzLmgiCiAjaW5jbHVkZSAiaW1wZF9kcmNfY29uZmlnX3BhcmFtcy5oIgogCi0jZGVmaW5lIE1BWF9NRU1fQUxMT0NTIDEwMAotCiBleHRlcm4gIkMiIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWT0lEIHB2X3ZhbHVlKTsKIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCkBAIC04MCwxOCArNzgsMTkgQEAKICAgICBlbnVtIHsgTk9ORSwgQVdBSVRJTkdfRElTQUJMRUQsIEFXQUlUSU5HX0VOQUJMRUQgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOwogCiAgICAgdm9pZCBpbml0UG9ydHMoKTsKLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgaW50IGRyYWluRGVjb2RlcigpOwotICAgIGludCBpbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpbnQgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdNUEVHRERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcyk7CiAKLSAgICBpbnQgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKLSAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKLSAgICBpbnQgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpOwotCi0gICAgaW50IGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CiAgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CiAgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LCBpbnQzMl90IGRyY1JlZkxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24KQEAgLTEyMCw5ICsxMTksOCBAQAogICAgIGludDhfdCogbURyY091dEJ1ZjsKICAgICBpbnQzMl90IG1NcGVnRERSQ1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtRFJDRmxhZzsKLQotICAgIHZvaWQqIG1NZW1vcnlBcnJheVtNQVhfTUVNX0FMTE9DU107Ci0gICAgaW50MzJfdCBtTWFsbG9jQ291bnQ7CisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRYQUFDKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCA3MGY1MmMzLi5kMTM2ZDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIxLDEwICsyMSwxMyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCisjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfYXJnYi5oIgorI2luY2x1ZGUgImxpYnl1di9wbGFuYXJfZnVuY3Rpb25zLmgiCiAjaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTQ1LDEwICs0OCwyOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBib29sIGlzUkdCKE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworfQorCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0J0NzA5KCkgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDkpOworfQorCisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzSnBlZygpIHsKKyAgICByZXR1cm4gKChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUpCisgICAgICAgICAgICB8fCAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1KSkKKyAgICAgICAgICAgICYmIChtUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsKTsKK30KKwogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCiAgICAgICBtRHN0Rm9ybWF0KHRvKSwKKyAgICAgIG1TcmNDb2xvclNwYWNlKHswLCAwLCAwfSksCiAgICAgICBtQ2xpcChOVUxMKSB7CiB9CiAKQEAgLTcxLDI0ICs5Miw0NiBAQAogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisjZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OworI2VuZGlmCisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzRHN0UkdCKCkgY29uc3QgewotICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICByZXR1cm4gaXNSR0IobURzdEZvcm1hdCk7CiB9CiAKK3ZvaWQgQ29sb3JDb252ZXJ0ZXI6OnNldFNyY0NvbG9yU3BhY2UoCisgICAgICAgIHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpIHsKKyAgICBpZiAoaXNSR0IobVNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR1coIkNhbid0IHNldCBjb2xvciBzcGFjZSBvbiBSR0Igc291cmNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNyY0NvbG9yU3BhY2UubVN0YW5kYXJkID0gc3RhbmRhcmQ7CisgICAgbVNyY0NvbG9yU3BhY2UubVJhbmdlID0gcmFuZ2U7CisgICAgbVNyY0NvbG9yU3BhY2UubVRyYW5zZmVyID0gdHJhbnNmZXI7Cit9CisKKy8qCisgKiBJZiBzdHJpZGUgaXMgbm9uLXplcm8sIGNsaWVudCdzIHN0cmlkZSB3aWxsIGJlIHVzZWQuIEZvciBwbGFuYXIKKyAqIG9yIHNlbWktcGxhbmFyIFlVViBmb3JtYXRzLCBzdHJpZGUgbXVzdCBiZSBldmVuIG51bWJlcnMuCisgKiBJZiBzdHJpZGUgaXMgemVybywgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoIGFuZCBicHAKKyAqIG9mIHRoZSBmb3JtYXQsIGFzc3VtaW5nIG5vIHBhZGRpbmcgb24gdGhlIHJpZ2h0IGVkZ2UuCisgKi8KIENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OkJpdG1hcFBhcmFtcygKICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCkKQEAgLTEwMiw2ICsxNDUsOCBAQAogICAgICAgbUNyb3BCb3R0b20oY3JvcEJvdHRvbSkgewogICAgIHN3aXRjaChtQ29sb3JGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIG1CcHAgPSAyOwogICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CkBAIC0xMTMsMTMgKzE1OCw3IEBACiAgICAgICAgIG1TdHJpZGUgPSA0ICogbVdpZHRoOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgotICAgICAgICBtQnBwID0gMjsKLSAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgpAQCAtMTMzLDYgKzE3MiwxMCBAQAogICAgICAgICBtU3RyaWRlID0gbVdpZHRoOwogICAgICAgICBicmVhazsKICAgICB9CisgICAgLy8gdXNlIGNsaWVudCdzIHN0cmlkZSBpZiBpdCdzIHNwZWNpZmllZC4KKyAgICBpZiAoc3RyaWRlICE9IDApIHsKKyAgICAgICAgbVN0cmlkZSA9IHN0cmlkZTsKKyAgICB9CiB9CiAKIHNpemVfdCBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpjcm9wV2lkdGgoKSBjb25zdCB7CkBAIC0xNDUsMjEgKzE4OCwyMSBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydCgKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LAorICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wUmlnaHQsIHNpemVfdCBzcmNDcm9wQm90dG9tLAogICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwgc2l6ZV90IGRzdFN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pIHsKICAgICBCaXRtYXBQYXJhbXMgc3JjKAogICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KHNyY0JpdHMpLAotICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20sIG1TcmNGb3JtYXQpOwogCiAgICAgQml0bWFwUGFyYW1zIGRzdCgKICAgICAgICAgICAgIGRzdEJpdHMsCi0gICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LAorICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwgZHN0U3RyaWRlLAogICAgICAgICAgICAgZHN0Q3JvcExlZnQsIGRzdENyb3BUb3AsIGRzdENyb3BSaWdodCwgZHN0Q3JvcEJvdHRvbSwgbURzdEZvcm1hdCk7CiAKICAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKQEAgLTIwMSw3ICsyNDQsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoc3JjLCBkc3QpOworI2Vsc2UKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKHNyYywgZHN0KTsKKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTI3Niw2ICszMjMsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKyNkZWZpbmUgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCByZ2IpIGludCAoKmZ1bmMpKCAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgY29uc3QgdWludDgqLCBpbnQsICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCB1aW50OCosIGludCwgaW50LCBpbnQpICAgICAgIFwKKyAgICAgICAgPSBtU3JjQ29sb3JTcGFjZS5pc0J0NzA5KCkgPyBsaWJ5dXY6Okg0MjBUbyMjcmdiIFwKKyAgICAgICAgOiBtU3JjQ29sb3JTcGFjZS5pc0pwZWcoKSA/IGxpYnl1djo6SjQyMFRvIyNyZ2IgIFwKKyAgICAgICAgOiBsaWJ5dXY6Okk0MjBUbyMjcmdiCisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyVXNlTGliWVVWKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKQEAgLTI5MywxOSArMzQ3LDI4IEBACiAKICAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKLSAgICAgICAgbGlieXV2OjpJNDIwVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBSR0I1NjUpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FCR1IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBQkdSKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQVJHQik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0zMTQsNiArMzc3LDM2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cworICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworCisgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIGxpYnl1djo6TlYxMlRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgIGxpYnl1djo6TlYxMlRvQVJHQihzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICB9CisKKyAgIHJldHVybiBPSzsKK30KKwogc3RkOjpmdW5jdGlvbjx2b2lkICh2b2lkICosIHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsCiAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqKT4KIGdldFJlYWRGcm9tU3JjKE9NWF9DT0xPUl9GT1JNQVRUWVBFIHNyY0Zvcm1hdCkgewpAQCAtNzkzLDE1ICs4ODYsMTUgQEAKIAogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKKyAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKQorICAgICAgICAgICAgZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHApOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiBzcmMubUhlaWdodAotICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tSGVpZ2h0ICogc3JjLm1TdHJpZGUgKworICAgICAgICAoc3JjLm1Dcm9wVG9wIC8gMikgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC04NDMsMTMgKzkzNiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3JjX3kgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgc3JjX3kgKz0gc3JjLm1TdHJpZGU7CiAKICAgICAgICAgaWYgKHkgJiAxKSB7Ci0gICAgICAgICAgICBzcmNfdSArPSBzcmMubVdpZHRoOworICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1TdHJpZGU7CiAgICAgICAgIH0KIAotICAgICAgICBkc3RfcHRyICs9IGRzdC5tV2lkdGg7CisgICAgICAgIGRzdF9wdHIgPSAodWludDE2X3QqKSgodWludDhfdCopZHN0X3B0ciArIGRzdC5tU3RyaWRlKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggNjU3YTA1Yi4uMzU5ZGYzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtNDQsNiArNDQsNyBAQAogICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpLAogICAgICAgbVdpZHRoKDApLAogICAgICAgbUhlaWdodCgwKSwKKyAgICAgIG1TdHJpZGUoMCksCiAgICAgICBtQ3JvcExlZnQoMCksCiAgICAgICBtQ3JvcFRvcCgwKSwKICAgICAgIG1Dcm9wUmlnaHQoMCksCkBAIC02Nyw5ICs2OCwxMCBAQAogICAgIGludDMyX3QgY29sb3JGb3JtYXROZXc7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdE5ldykpOwogCi0gICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3OwotICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmd2lkdGhOZXcpKTsKKyAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXcsIHN0cmlkZU5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGhOZXcpKTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJmhlaWdodE5ldykpOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlTmV3KSk7CiAKICAgICBpbnQzMl90IGNyb3BMZWZ0TmV3LCBjcm9wVG9wTmV3LCBjcm9wUmlnaHROZXcsIGNyb3BCb3R0b21OZXc7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRSZWN0KApAQCAtMTA2LDYgKzEwOCw3IEBACiAgICAgbUNvbG9yRm9ybWF0ID0gc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KGNvbG9yRm9ybWF0TmV3KTsKICAgICBtV2lkdGggPSB3aWR0aE5ldzsKICAgICBtSGVpZ2h0ID0gaGVpZ2h0TmV3OworICAgIG1TdHJpZGUgPSBzdHJpZGVOZXc7CiAgICAgbUNyb3BMZWZ0ID0gY3JvcExlZnROZXc7CiAgICAgbUNyb3BUb3AgPSBjcm9wVG9wTmV3OwogICAgIG1Dcm9wUmlnaHQgPSBjcm9wUmlnaHROZXc7CkBAIC0yNzYsMjAgKzI3OSwxNSBAQAogICAgIGlmIChtQ29udmVydGVyKSB7CiAgICAgICAgIG1Db252ZXJ0ZXItPmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlLAogICAgICAgICAgICAgICAgIG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tLAogICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LCAwLAogICAgICAgICAgICAgICAgIDAsIDAsIG1Dcm9wV2lkdGggLSAxLCBtQ3JvcEhlaWdodCAtIDEpOwogICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz1tQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0obUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKS8yOwotICAgICAgICBzcmNfdiArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1TdHJpZGUgKiBtSGVpZ2h0ICsgbUNyb3BUb3AgKiBtU3RyaWRlIC8gNDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSAoY29uc3QgdWludDhfdCAqKXNyY191ICsgbVN0cmlkZSAqIG1IZWlnaHQgLyA0OwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CiAgICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKQEAgLTMwNSw3ICszMDMsNyBAQAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIG1lbWNweShkc3RfeSwgc3JjX3ksIG1Dcm9wV2lkdGgpOwogCi0gICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOwogICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CiAgICAgICAgIH0KIApAQCAtMzEzLDE5ICszMTEsMTUgQEAKICAgICAgICAgICAgIG1lbWNweShkc3RfdSwgc3JjX3UsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKICAgICAgICAgICAgIG1lbWNweShkc3Rfdiwgc3JjX3YsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKIAotICAgICAgICAgICAgc3JjX3UgKz0gbVdpZHRoIC8gMjsKLSAgICAgICAgICAgIHNyY192ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdSArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IG1TdHJpZGUgLyAyOwogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfeSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGE7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwotCi0gICAgICAgIHNyY195ICs9IG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7Ci0gICAgICAgIHNyY192ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQgKiAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1TdHJpZGUgKiBtSGVpZ2h0ICsgbUNyb3BUb3AgKiBtU3RyaWRlIC8gNDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSAoY29uc3QgdWludDhfdCAqKXNyY191ICsgbVN0cmlkZSAqIG1IZWlnaHQgLyA0OwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CiAgICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKQEAgLTM0MCwyMSArMzM0LDIxIEBACiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG1Dcm9wV2lkdGg7ICsreCkgewotICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKHNyY195W3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfeSlbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgKG1Dcm9wSGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgKG1Dcm9wV2lkdGggKyAxKSAvIDI7ICsreCkgewotICAgICAgICAgICAgICAgIGRzdF91W3hdID0gKHVpbnQ4X3QpKHNyY191W3hdID4+IDIpOwotICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKHNyY192W3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF91W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdSlbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY192KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3UgKz0gbVdpZHRoIC8gMjsKLSAgICAgICAgICAgIHNyY192ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdSArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IG1TdHJpZGUgLyAyOwogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbAppbmRleCAwYjU1NGEyLi40N2E5NzE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKQEAgLTE3LDUxICsxNyw2MSBAQAogPEluY2x1ZGVkPgogICAgIDxEZWNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcDMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXBlZyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC0zMjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI3MzUwLDgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtYWxhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC00ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjMyMDAwLTUwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5vcHVzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2MDAwLTUxMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9yYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KQEAgLTY5LDI5ICs3OSw0MCBAQAogICAgIDwvRGVjb2RlcnM+CiAgICAgPEVuY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CiAgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC04IiAgZGVmYXVsdD0iNSIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDUSIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTIwMDAsMTYwMDAsMjQwMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjUwMC01MTIwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9FbmNvZGVycz4KIDwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMGRjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKaW5kZXggYWRiNDViMy4uZTIwMTc0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0xNyw2ICsxNyw3IEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC0yNiw2ICsyNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CiAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KQEAgLTM0LDYgKzM2LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTQ0LDYgKzQ3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC01NCw2ICs1OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNjMsNiArNjgsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTcxLDE2ICs3NywyNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdjEuZGVjb2RlciIgdHlwZT0idmlkZW8vYXYwMSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI5Nng5NiIgbWF4PSIxOTIweDEwODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIyNCIgbWF4PSIyMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS02MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9EZWNvZGVycz4KIAogICAgIDxFbmNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtOTAsNyArMTA3LDE3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMzIweDEyOCIgbWF4PSI1MTJ4NTEyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS00MDk2IiAvPiA8IS0tIG1heCA1MTJ4NTEyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMjI4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC05OSw2ICsxMjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTEwOSw2ICsxMzcsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNmJmYWIxNi4uMzA3YzliMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yNywxNyArMjcsMjEgQEAKICAgICB9LAogCiAgICAgc3RhdGljOiB7Ci0gICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkOiB7Ci0gICAgICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYm1lZGlhX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAppbmRleCBkZmRjNDFjLi5jZWYwYmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPiAvLyBmbG9hdF9mcm9tX2kzMgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMTcsMTA0ICsxMTgsNDMgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuICBTZWUgc2ltaWxhciBjb2RlIGF0IEZMQUNFeHRyYWN0b3IuY3BwCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIG5DaGFubmVscykgeworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRPRE86IDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjM4LDggKzE3OCw3IEBACiAgICAgICBtU3RyZWFtSW5mb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1Xcml0ZVJlcXVlc3RlZChmYWxzZSksCiAgICAgICBtV3JpdGVDb21wbGV0ZWQoZmFsc2UpLAotICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSwKLSAgICAgIG1Db3B5KG51bGxwdHIpIHsKKyAgICAgIG1FcnJvclN0YXR1cygoRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzKSAtMSkgewogICAgIEFMT0dWKCJjdG9yOiIpOwogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwogICAgIG1lbXNldCgmbVdyaXRlSGVhZGVyLCAwLCBzaXplb2YobVdyaXRlSGVhZGVyKSk7CkBAIC0zNzksNiArMzE4LDcgQEAKICAgICAgICAgY2FzZSA4OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDMyOiAvLyBnZW5lcmFsbHkgcmFyZSwgYnV0IGlzIHN1cHBvcnRlZCBpbiB0aGUgZnJhbWV3b3JrCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzg3LDMxICszMjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgICB9LAotICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgIH0sCi0gICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgICB9LAotICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgIH0sCi0gICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgICB9LAotICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgIH0sCi0gICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOiB0YWJsZSkgewotICAgICAgICBpZiAoZW50cnkubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIG1Db3B5ID0gZW50cnkubUNvcHk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBtZXRhZGF0YSBibG9ja3MuCiAgICAgbUJ1ZmZlclBvcyA9IDA7CiAgICAgbUJ1ZmZlckRhdGFTaXplID0gMDsKQEAgLTQyMCw3ICszMzUsNyBAQAogfQogCiBzdGF0dXNfdCBGTEFDRGVjb2Rlcjo6ZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbikgeworICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0KSB7CiAgICAgQUxPR1YoImRlY29kZU9uZUZyYW1lOiBpbnB1dCBzaXplKCV6dSkiLCBpbkJ1ZmZlckxlbik7CiAKICAgICBpZiAoIW1TdHJlYW1JbmZvVmFsaWQpIHsKQEAgLTQ2OSwyMSArMzg0LDMzIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoKTsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbHMgKiBzYW1wbGVTaXplOworICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIGlmIChidWZmZXJTaXplID4gKm91dEJ1ZmZlckxlbikgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG91dHB1dCBidWZmZXIgaG9sZHMgb25seSBwYXJ0aWFsIGZyYW1lICV6dTolenUiLAogICAgICAgICAgICAgICAgICpvdXRCdWZmZXJMZW4sIGJ1ZmZlclNpemUpOwotICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gKGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgYmxvY2tzaXplID0gKm91dEJ1ZmZlckxlbiAvIGZyYW1lU2l6ZTsKKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGZyYW1lU2l6ZTsKICAgICB9CiAKLSAgICBpZiAobUNvcHkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZGVjb2RlT25lRnJhbWU6IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkOiBjaGFubmVscyglZCksIEJpdHNQZXJTYW1wbGUoJWQpIiwKLSAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3V0cHV0IGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShvdXRCdWZmZXIsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPSBnZXRCaXRzUGVyU2FtcGxlKCk7CisgICAgaWYgKG91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0KICAgICAqb3V0QnVmZmVyTGVuID0gYnVmZmVyU2l6ZTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAppbmRleCBhZjQxOWEyLi42OTRmY2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWV0YWRhdGEoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbik7CiAgICAgc3RhdHVzX3QgZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgICAgIGludDE2X3QgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4pOworICAgICAgICAgICAgdm9pZCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbiwgYm9vbCBvdXRwdXRGbG9hdCA9IGZhbHNlKTsKICAgICB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB+RkxBQ0RlY29kZXIoKTsKIApAQCAtODksOCArODksNiBAQAogICAgIC8vIG1vc3QgcmVjZW50IGVycm9yIHJlcG9ydGVkIGJ5IGxpYkZMQUMgZGVjb2RlcgogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKLSAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICpzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0KICAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICAvLyBGTEFDIHN0cmVhbSBkZWNvZGVyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzdmNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKLSAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgewotfQotCi1BU3RhdGU6On5BU3RhdGUoKSB7Ci19Ci0KLXNwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVBhcmVudFN0YXRlOwotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7Ci0KLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgewotICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCi0gICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKLQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgaWYgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCi0gICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKLSAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7Ci0gICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7Ci0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBBLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOwotICAgIGN1ciA9IHN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQi5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCi0gICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7Ci0gICAgICAgIEEucG9wKCk7Ci0gICAgICAgIEIucG9wKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gc3RhdGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA1ZTc2YzY3Li5hMjc2NzIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE3MCw3ICsxNzAsOSBAQAogCiAgICAgaW50NjRfdCB3aGVuVXM7CiAgICAgaWYgKGRlbGF5VXMgPiAwKSB7Ci0gICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCkgKyBkZWxheVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gR2V0Tm93VXMoKTsKKyAgICAgICAgd2hlblVzID0gKGRlbGF5VXMgPiBJTlQ2NF9NQVggLSBub3dVcyA/IElOVDY0X01BWCA6IG5vd1VzICsgZGVsYXlVcyk7CisKICAgICB9IGVsc2UgewogICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpOwogICAgIH0KQEAgLTIwOCw2ICsyMTAsOSBAQAogCiAgICAgICAgIGlmICh3aGVuVXMgPiBub3dVcykgewogICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IElOVDY0X01BWCAvIDEwMDApIHsKKyAgICAgICAgICAgICAgICBkZWxheVVzID0gSU5UNjRfTUFYIC8gMTAwMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCBkZWxheVVzICogMTAwMGxsKTsKIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmRjMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk5ldHdvcmtTZXNzaW9uIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQU5ldHdvcmtTZXNzaW9uLmgiCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOwotc3RhdGljIGNvbnN0IGludDMyX3Qga01heFVEUFJldHJpZXMgPSAyMDA7Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBleHBsaWNpdCBOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5OZXR3b3JrVGhyZWFkKCk7Ci0KLXByaXZhdGU6Ci0gICAgQU5ldHdvcmtTZXNzaW9uICptU2Vzc2lvbjsKLQotICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOZXR3b3JrVGhyZWFkKTsKLX07Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgZW51bSBNb2RlIHsKLSAgICAgICAgTU9ERV9SVFNQLAotICAgICAgICBNT0RFX0RBVEFHUkFNLAotICAgICAgICBNT0RFX1dFQlNPQ0tFVCwKLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgTElTVEVOSU5HX1JUU1AsCi0gICAgICAgIExJU1RFTklOR19UQ1BfREdSQU1TLAotICAgICAgICBEQVRBR1JBTSwKLSAgICB9OwotCi0gICAgU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICAgICAgaW50IHMsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICBpbnQzMl90IHNlc3Npb25JRCgpIGNvbnN0OwotICAgIGludCBzb2NrZXQoKSBjb25zdDsKLSAgICBzcDxBTWVzc2FnZT4gZ2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc1JUU1BTZXJ2ZXIoKSBjb25zdDsKLSAgICBib29sIGlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdDsKLQotICAgIGJvb2wgd2FudHNUb1JlYWQoKTsKLSAgICBib29sIHdhbnRzVG9Xcml0ZSgpOwotCi0gICAgc3RhdHVzX3QgcmVhZE1vcmUoKTsKLSAgICBzdGF0dXNfdCB3cml0ZU1vcmUoKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgdm9pZCBzZXRNb2RlKE1vZGUgbW9kZSk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflNlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEID0gMSwKLSAgICB9OwotICAgIHN0cnVjdCBGcmFnbWVudCB7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgaW50NjRfdCBtVGltZVVzOwotICAgICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIH07Ci0KLSAgICBpbnQzMl90IG1TZXNzaW9uSUQ7Ci0gICAgU3RhdGUgbVN0YXRlOwotICAgIE1vZGUgbU1vZGU7Ci0gICAgaW50IG1Tb2NrZXQ7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgYm9vbCBtU2F3UmVjZWl2ZUZhaWx1cmUsIG1TYXdTZW5kRmFpbHVyZTsKLSAgICBpbnQzMl90IG1VRFBSZXRyaWVzOwotCi0gICAgTGlzdDxGcmFnbWVudD4gbU91dEZyYWdtZW50czsKLQotICAgIEFTdHJpbmcgbUluQnVmZmVyOwotCi0gICAgaW50NjRfdCBtTGFzdFN0YWxsUmVwb3J0VXM7Ci0KLSAgICB2b2lkIG5vdGlmeUVycm9yKGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpOwotICAgIHZvaWQgbm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pOwotCi0gICAgdm9pZCBkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmZnJhZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uKTsKLX07Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6Ok5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKQotICAgIDogbVNlc3Npb24oc2Vzc2lvbikgewotfQotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6On5OZXR3b3JrVGhyZWFkKCkgewotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBtU2Vzc2lvbi0+dGhyZWFkTG9vcCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6U2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICBpbnQgcywKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU2Vzc2lvbklEKHNlc3Npb25JRCksCi0gICAgICBtU3RhdGUoc3RhdGUpLAotICAgICAgbU1vZGUoTU9ERV9EQVRBR1JBTSksCi0gICAgICBtU29ja2V0KHMpLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1TYXdTZW5kRmFpbHVyZShmYWxzZSksCi0gICAgICBtVURQUmV0cmllcyhrTWF4VURQUmV0cmllcyksCi0gICAgICBtTGFzdFN0YWxsUmVwb3J0VXMoLTFsbCkgewotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbEFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCBsb2NhbEFkZHJMZW4gPSBzaXplb2YobG9jYWxBZGRyKTsKLQotICAgICAgICBpbnQgcmVzID0gZ2V0c29ja25hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsb2NhbEFkZHIsICZsb2NhbEFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICByZXMgPSBnZXRwZWVybmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKGxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIGxvY2FsQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgcmVtb3RlQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0Q2xpZW50Q29ubmVjdGVkKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoInNlcnZlci1pcCIsIGxvY2FsQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2VydmVyLXBvcnQiLCBudG9ocyhsb2NhbEFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoImNsaWVudC1pcCIsIHJlbW90ZUFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImNsaWVudC1wb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6flNlc3Npb24oKSB7Ci0gICAgQUxPR1YoIlNlc3Npb24gJWQgZ29uZSIsIG1TZXNzaW9uSUQpOwotCi0gICAgY2xvc2UobVNvY2tldCk7Ci0gICAgbVNvY2tldCA9IC0xOwotfQotCi1pbnQzMl90IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2Vzc2lvbklEKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbklEOwotfQotCi1pbnQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzb2NrZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb2NrZXQ7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXRNb2RlKE1vZGUgbW9kZSkgewotICAgIG1Nb2RlID0gbW9kZTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQgfHwgbU1vZGUgIT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfV0VCU09DS0VUOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxBTWVzc2FnZT4gQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtTm90aWZ5OwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNSVFNQU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1JUU1A7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1RDUF9ER1JBTVM7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvUmVhZCgpIHsKLSAgICByZXR1cm4gIW1TYXdSZWNlaXZlRmFpbHVyZSAmJiBtU3RhdGUgIT0gQ09OTkVDVElORzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9Xcml0ZSgpIHsKLSAgICByZXR1cm4gIW1TYXdTZW5kRmFpbHVyZQotICAgICAgICAmJiAobVN0YXRlID09IENPTk5FQ1RJTkcKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gQ09OTkVDVEVEICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IERBVEFHUkFNICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpyZWFkTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKLQotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSByZWN2ZnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIGJ1Zi0+ZGF0YSgpLCBidWYtPmNhcGFjaXR5KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWYtPnNldFJhbmdlKDAsIG4pOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgaXAgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnJvbUFkZHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUuJXUuJXUuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwID4+IDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgJiAweGZmKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZyb21Qb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBidWYpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0spOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdmZyb20gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY3Zmcm9tIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjaGFyIHRtcFs1MTJdOwotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSByZWN2KG1Tb2NrZXQsIHRtcCwgc2l6ZW9mKHRtcCksIDApOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG1JbkJ1ZmZlci5hcHBlbmQodG1wLCBuKTsKLQotI2lmIDAKLSAgICAgICAgQUxPR0koImluOiIpOwotICAgICAgICBoZXhkdW1wKHRtcCwgbik7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICAvLyBUQ1Agc3RyZWFtIGNhcnJ5aW5nIDE2LWJpdCBsZW5ndGgtcHJlZml4ZWQgZGF0YWdyYW1zLgotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBwYWNrZXRTaXplID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IHBhY2tldFNpemUgKyAyKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBhY2tldFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDIsIHBhY2tldFNpemUpOwotCi0gICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIHBhY2tldC0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgcGFja2V0U2l6ZSArIDIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX1JUU1ApIHsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPiAwICYmIG1JbkJ1ZmZlci5jX3N0cigpWzBdID09ICckJykgewotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZW5ndGggPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSArIDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0ICsgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEJpbmFyeURhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwiLCBtSW5CdWZmZXIuY19zdHIoKVsxXSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhID0gbmV3IEFCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YS0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDQsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBkYXRhLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCA0ICsgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0KLSAgICAgICAgICAgICAgICBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5jX3N0cigpLCBtSW5CdWZmZXIuc2l6ZSgpLCBlcnIgIT0gT0ssICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAobXNnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGEpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImRhdGEiLCBtc2cpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSNpZiAxCi0gICAgICAgICAgICAvLyBYWFggVGhlIChvbGQpIGRvbmdsZSBzZW5kcyB0aGUgd3JvbmcgY29udGVudCBsZW5ndGggaGVhZGVyIG9uIGEKLSAgICAgICAgICAgIC8vIFNFVF9QQVJBTUVURVIgcmVxdWVzdCB0aGF0IHNpZ25hbHMgYSAid2ZkX2lkcl9yZXF1ZXN0Ii4KLSAgICAgICAgICAgIC8vICgxNyBpbnN0ZWFkIG9mIDE5KS4KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQgPSBtc2ctPmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICYmICFtZW1jbXAoY29udGVudCwgIndmZF9pZHJfcmVxdWVzdFxyXG4iLCAxNykKLSAgICAgICAgICAgICAgICAgICAgJiYgbGVuZ3RoID49IDE5Ci0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aF0gPT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGggKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX1dFQlNPQ0tFVCk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCk7Ci0gICAgICAgIC8vIGhleGR1bXAoZGF0YSwgbUluQnVmZmVyLnNpemUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IHBheWxvYWRMZW4gPSBkYXRhWzFdICYgMHg3ZjsKLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID09IDEyNikgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTE2X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuID09IDEyNykgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA4ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTY0X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gMDsKLSAgICAgICAgICAgIGlmIChkYXRhWzFdICYgMHg4MCkgewotICAgICAgICAgICAgICAgIC8vIE1BU0s9PTEKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWFzayA9IFUzMl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPiBtSW5CdWZmZXIuc2l6ZSgpIHx8IG9mZnNldCA+IG1JbkJ1ZmZlci5zaXplKCkgLSBwYXlsb2FkTGVuKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIGZ1bGwgbWVzc2FnZS4KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGF5bG9hZExlbik7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksICZkYXRhW29mZnNldF0sIHBheWxvYWRMZW4pOwotCi0gICAgICAgICAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXlsb2FkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhKClbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0V2ViU29ja2V0TWVzc2FnZSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJoZWFkZXJCeXRlIiwgZGF0YVswXSk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIG9mZnNldCArIHBheWxvYWRMZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2IGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7Ci0jaWYgMAotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRGVsYXlNcyA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heERlbGF5TXMgPSAzMDA7Ci0KLSAgICBjb25zdCBjaGFyICprUGF0dGVybiA9ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIjsKLSAgICBzaXplX3Qga1BhdHRlcm5TaXplID0gc3RybGVuKGtQYXR0ZXJuKTsKLQotICAgIGludCBuID0gKGtQYXR0ZXJuU2l6ZSAqIChkZWxheU1zIC0ga01pbkRlbGF5TXMpKQotICAgICAgICAgICAgICAgIC8gKGtNYXhEZWxheU1zIC0ga01pbkRlbGF5TXMpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIG4gPSAwOwotICAgIH0gZWxzZSBpZiAoKHNpemVfdCluID4ga1BhdHRlcm5TaXplKSB7Ci0gICAgICAgIG4gPSBrUGF0dGVyblNpemU7Ci0gICAgfQotCi0gICAgQUxPR0koIlslbGxkXTogKCU0bGxkIG1zKSAlc1xuIiwKLSAgICAgICAgICBmcmFnLm1UaW1lVXMgLyAxMDAwLAotICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAga1BhdHRlcm4gKyBrUGF0dGVyblNpemUgLSBuKTsKLSNlbmRpZgotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndyaXRlTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGFncmFtID0gZnJhZy5tQnVmZmVyOwotCi0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBkYXRhZ3JhbS0+ZGF0YSgpLCBkYXRhZ3JhbS0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgaWYgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBkYXRhZ3JhbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU2VuZCBkYXRhZ3JhbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIHNvY2tsZW5fdCBvcHRpb25MZW4gPSBzaXplb2YoZXJyKTsKLSAgICAgICAgQ0hFQ0tfRVEoZ2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJm9wdGlvbkxlbiksIDApOwotICAgICAgICBDSEVDS19FUShvcHRpb25MZW4sIChzb2NrbGVuX3Qpc2l6ZW9mKGVycikpOwotCi0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgbm90aWZ5RXJyb3Ioa1doYXRFcnJvciwgLWVyciwgIkNvbm5lY3Rpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotCi0gICAgICAgICAgICByZXR1cm4gLWVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgbm90aWZ5KGtXaGF0Q29ubmVjdGVkKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05ORUNURUQpOwotICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgc3NpemVfdCBuID0gLTE7Ci0gICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGZyYWcubUJ1ZmZlci0+ZGF0YSgpLCBmcmFnLm1CdWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYWcubUJ1ZmZlci0+c2V0UmFuZ2UoCi0gICAgICAgICAgICAgICAgZnJhZy5tQnVmZmVyLT5vZmZzZXQoKSArIG4sIGZyYWcubUJ1ZmZlci0+c2l6ZSgpIC0gbik7Ci0KLSAgICAgICAgaWYgKGZyYWcubUJ1ZmZlci0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0jaWYgMAotICAgIGludCBudW1CeXRlc1F1ZXVlZDsKLSAgICBpbnQgcmVzID0gaW9jdGwobVNvY2tldCwgU0lPQ09VVFEsICZudW1CeXRlc1F1ZXVlZCk7Ci0gICAgaWYgKHJlcyA9PSAwICYmIG51bUJ5dGVzUXVldWVkID4gNTAgKiAxMDI0KSB7Ci0gICAgICAgIGlmIChudW1CeXRlc1F1ZXVlZCA+IDQwOTYwMCkgewotICAgICAgICAgICAgQUxPR1coIiEhISBudW1CeXRlc1F1ZXVlZCA9ICVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgaWYgKG1MYXN0U3RhbGxSZXBvcnRVcyA8IDBsbAotICAgICAgICAgICAgICAgIHx8IG5vd1VzID4gbUxhc3RTdGFsbFJlcG9ydFVzICsgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXROZXR3b3JrU3RhbGwpOwotICAgICAgICAgICAgbXNnLT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotCi0gICAgICAgICAgICBtTGFzdFN0YWxsUmVwb3J0VXMgPSBub3dVczsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBDSEVDSyhtU3RhdGUgPT0gQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBEQVRBR1JBTSk7Ci0KLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKWRhdGEpOwotICAgIH0KLQotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfTEUoc2l6ZSwgNjU1MzUpOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgKyAyKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSBzaXplID4+IDg7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIDIsIGRhdGEsIHNpemUpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX1dFQlNPQ0tFVCkgewotICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBrVXNlTWFzayA9IGZhbHNlOyAgLy8gQ2hyb21pdW0gZG9lc24ndCBsaWtlIGl0LgotCi0gICAgICAgIHNpemVfdCBudW1IZWFkZXJCeXRlcyA9IDIgKyAoa1VzZU1hc2sgPyA0IDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG51bUhlYWRlckJ5dGVzICsgc2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHg4MTsgIC8vIEZJTj09MSB8IG9wY29kZT0xICh0ZXh0KQotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IGtVc2VNYXNrID8gMHg4MCA6IDB4MDA7Ci0KLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI3OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNF0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNV0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNl0gPSAoc2l6ZSA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbN10gPSAoc2l6ZSA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs5XSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa1VzZU1hc2spIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSByYW5kKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gNF0gPSAobWFzayA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAzXSA9IChtYXNrID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDJdID0gKG1hc2sgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAxXSA9IG1hc2sgJiAweGZmOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplX3Qpc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgoY29uc3QgdWludDhfdCAqKWRhdGEpW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgbnVtSGVhZGVyQnl0ZXMsIGRhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgRnJhZ21lbnQgZnJhZzsKLQotICAgIGZyYWcubUZsYWdzID0gMDsKLSAgICBpZiAodGltZVZhbGlkKSB7Ci0gICAgICAgIGZyYWcubUZsYWdzID0gRlJBR01FTlRfRkxBR19USU1FX1ZBTElEOwotICAgICAgICBmcmFnLm1UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotCi0gICAgZnJhZy5tQnVmZmVyID0gYnVmZmVyOwotCi0gICAgbU91dEZyYWdtZW50cy5wdXNoX2JhY2soZnJhZyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnlFcnJvcigKLSAgICAgICAgYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEVycm9yKTsKLSAgICBtc2ctPnNldEludDMyKCJzZW5kIiwgc2VuZCk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6QU5ldHdvcmtTZXNzaW9uKCkKLSAgICA6IG1OZXh0U2Vzc2lvbklEKDEpIHsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotfQotCi1BTmV0d29ya1Nlc3Npb246On5BTmV0d29ya1Nlc3Npb24oKSB7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0YXJ0KCkgewotICAgIGlmIChtVGhyZWFkICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludCByZXMgPSBwaXBlKG1QaXBlRmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIG1UaHJlYWQgPSBuZXcgTmV0d29ya1RocmVhZCh0aGlzKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1UaHJlYWQtPnJ1bigiQU5ldHdvcmtTZXNzaW9uIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgICAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICAgICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RvcCgpIHsKLSAgICBpZiAobVRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOwotICAgIGludGVycnVwdCgpOwotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotCi0gICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgMCAvKiBwb3J0ICovLAotICAgICAgICAgICAgaG9zdCwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlVURQU2Vzc2lvbihsb2NhbFBvcnQsIE5VTEwsIDAsIG5vdGlmeSwgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpIHsKLSAgICBpbnQgZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKTsKLSAgICBpZiAoZmxhZ3MgPCAwKSB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbG9jYWxBZGRyLAotICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpzZXNzaW9uSUQgPSAwOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGludCBzLCByZXM7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKLQotICAgIHMgPSBzb2NrZXQoCi0gICAgICAgICAgICBBRl9JTkVULAotICAgICAgICAgICAgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTSwKLSAgICAgICAgICAgIDApOwotCi0gICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgY29uc3QgaW50IHllcyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pIHsKLSAgICAgICAgaW50IHNpemUgPSAyNTYgKiAxMDI0OwotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbnQgZmxhZyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmZmxhZywgc2l6ZW9mKGZsYWcpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB0b3MgPSAyMjQ7ICAvLyBWT0lDRQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLSAgICB9IGVsc2UgaWYgKGxvY2FsQWRkciAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIgPSAqbG9jYWxBZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbl9hZGRyX3QgeCA9IG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQUxPR0koImNvbm5lY3Rpbmcgc29ja2V0ICVkIHRvICVkLiVkLiVkLiVkOiVkIiwKLSAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgKHggPj4gMjQpLAotICAgICAgICAgICAgICAoeCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAoeCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgIHggJiAweGZmLAotICAgICAgICAgICAgICBudG9ocyhhZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgcmVzID0gY29ubmVjdChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgQ0hFQ0tfTFQocmVzLCAwKTsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlBST0dSRVNTKSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gYmluZChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBsaXN0ZW4ocywgNCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgU2Vzc2lvbjo6U3RhdGUgc3RhdGU7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQQ2xpZW50OgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfVENQX0RHUkFNUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQU2VydmVyOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfUlRTUDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpEQVRBR1JBTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgIHMsCi0gICAgICAgICAgICBub3RpZnkpOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50KSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9SVFNQKTsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgKnNlc3Npb25JRCA9IHNlc3Npb24tPnNlc3Npb25JRCgpOwotCi0gICAgZ290byBiYWlsOwotCi1iYWlsMjoKLSAgICBjbG9zZShzKTsKLSAgICBzID0gLTE7Ci0KLWJhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICBpbnQgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLAotICAgICAgICBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5zZW5kUmVxdWVzdChkYXRhLCBzaXplLCB0aW1lVmFsaWQsIHRpbWVVcyk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBzZXNzaW9uLT5zd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OmludGVycnVwdCgpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBkdW1teSA9IDA7Ci0KLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gd3JpdGUobVBpcGVGZFsxXSwgJmR1bW15LCAxKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgQUxPR1coIkVycm9yIHdyaXRpbmcgdG8gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjp0aHJlYWRMb29wKCkgewotICAgIGZkX3NldCBycywgd3M7Ci0gICAgRkRfWkVSTygmcnMpOwotICAgIEZEX1pFUk8oJndzKTsKLQotICAgIEZEX1NFVChtUGlwZUZkWzBdLCAmcnMpOwotICAgIGludCBtYXhGZCA9IG1QaXBlRmRbMF07Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1JlYWQoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmcnMpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZ3cyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHNlbGVjdChtYXhGZCArIDEsICZycywgJndzLCBOVUxMLCBOVUxMIC8qIHR2ICovKTsKLQotICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HRSgic2VsZWN0IGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoRkRfSVNTRVQobVBpcGVGZFswXSwgJnJzKSkgewotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHJlYWQobVBpcGVGZFswXSwgJmMsIDEpOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiRXJyb3IgcmVhZGluZyBmcm9tIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAtLXJlczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgTGlzdDxzcDxTZXNzaW9uPiA+IHNlc3Npb25zVG9BZGQ7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1TZXNzaW9ucy5zaXplKCk7IHJlcyA+IDAgJiYgaSA+IDA7KSB7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykgfHwgRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIC0tcmVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKSB8fCBzZXNzaW9uLT5pc1RDUERhdGFncmFtU2VydmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRTb2NrZXQgPSBhY2NlcHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbWFrZSBjbGllbnQgc29ja2V0IG5vbiBibG9ja2luZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJWQuJWQuJWQuJWQ6JWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc29ja2V0ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBjbGllbnRTZXNzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uOjpDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTZXNzaW9uLT5zZXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNlc3Npb246Ok1PREVfUlRTUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1RvQWRkLnB1c2hfYmFjayhjbGllbnRTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJhY2NlcHQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnJlYWRNb3JlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZWFkTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+d3JpdGVNb3JlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGVNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghc2Vzc2lvbnNUb0FkZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gKnNlc3Npb25zVG9BZGQuYmVnaW4oKTsKLSAgICAgICAgICAgIHNlc3Npb25zVG9BZGQuZXJhc2Uoc2Vzc2lvbnNUb0FkZC5iZWdpbigpKTsKLQotICAgICAgICAgICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJhZGRlZCBjbGllbnRTZXNzaW9uICVkIiwgc2Vzc2lvbi0+c2Vzc2lvbklEKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDI5Y2YxZWQuLjUzM2NkNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTQsOCArNCw4IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTU2LDE4ICs1NywyMiBAQAogICAgICAgICAiQUJ1ZmZlci5jcHAiLAogICAgICAgICAiQURlYnVnLmNwcCIsCiAgICAgICAgICJBSGFuZGxlci5jcHAiLAotICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQUxvb3Blci5jcHAiLAogICAgICAgICAiQUxvb3BlclJvc3Rlci5jcHAiLAogICAgICAgICAiQU1lc3NhZ2UuY3BwIiwKLSAgICAgICAgIkFOZXR3b3JrU2Vzc2lvbi5jcHAiLAogICAgICAgICAiQVN0cmluZy5jcHAiLAogICAgICAgICAiQVN0cmluZ1V0aWxzLmNwcCIsCisgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkJ5dGVVdGlscy5jcHAiLAogICAgICAgICAiQ29sb3JVdGlscy5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCiAgICAgICAgICJNZWRpYUtleXMuY3BwIiwKLSAgICAgICAgIlBhcnNlZE1lc3NhZ2UuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhLmNwcCIsCisgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKKyAgICAgICAgIk9wdXNIZWFkZXIuY3BwIiwKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgICAgICAiYmFzZTY0LmNwcCIsCiAgICAgICAgICJoZXhkdW1wLmNwcCIsCkBAIC04MywzICs4OCwyMCBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1ETk9fSU1FTU9SWSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24mIHByZXNlbnRhdGlvbnMsCisgICAgICAgIHN0ZDo6b3N0cmVhbSogc2VyaWFsaXplZE91dHB1dCkgeworICAgIHVpbnQzMl90IG51bVByZXNlbnRhdGlvbnMgPSBwcmVzZW50YXRpb25zLnNpemUoKTsKKyAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBhcCA6IHByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFwLm1WZXJzaW9uID09IFBSRVNFTlRBVElPTl9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVZlcnNpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1WZXJzaW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByZXNlbnRhdGlvbklkKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1Qcm9ncmFtSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzID0gYXAubUxhYmVscy5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJm51bUxhYmVscykpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxhYmVsIDogYXAubUxhYmVscykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsS2V5U2l6ZSA9IGxhYmVsLmZpcnN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbEtleVNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbEtleVNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5maXJzdC5jX3N0cigpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplID0gbGFiZWwuc2Vjb25kLnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbFZhbFNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5zZWNvbmQuY19zdHIoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgbGFuZ1NpemUgPSBhcC5tTGFuZ3VhZ2Uuc2l6ZSgpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYW5nU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFuZ1NpemUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGFwLm1MYW5ndWFnZS5jX3N0cigpLCBsYW5nU2l6ZSk7CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhzdGQ6OmlzdHJlYW0qIHNlcmlhbGl6ZWRJbnB1dCwKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9uczsKKyAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bVByZXNlbnRhdGlvbnMpLCBzaXplb2YobnVtUHJlc2VudGF0aW9ucykpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1QcmVzZW50YXRpb25zOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2ZXJzaW9uKSwgc2l6ZW9mKHZlcnNpb24pKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZCgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByb2dyYW1JZCksIHNpemVvZihhcC5tUHJvZ3JhbUlkKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUxhYmVsczsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtTGFiZWxzKSwgc2l6ZW9mKG51bUxhYmVscykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG51bUxhYmVsczsgKytqKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxLZXlTaXplKSwgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsS2V5KGxhYmVsS2V5U2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsS2V5LmRhdGEoKSwgbGFiZWxLZXlTaXplKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsVmFsU2l6ZTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhYmVsVmFsU2l6ZSksIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYWJlbFZhbChsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYWJlbFZhbC5kYXRhKCksIGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxLZXkuZGF0YSgpKSwgbGFiZWxLZXlTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhYmVsVmFsLmRhdGEoKSksIGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbGFuZ3VhZ2VTaXplOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYW5ndWFnZVNpemUpLCBzaXplb2YobGFuZ3VhZ2VTaXplKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYW5ndWFnZShsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhbmd1YWdlLmRhdGEoKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhbmd1YWdlLmRhdGEoKSksIGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBwcmVzZW50YXRpb24gaW5mbyB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAppbmRleCBjNGVhYTI3Li4wNzBlMzI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM0Miw2ICszNDMsMTQgQEAKICAgICBhc3BlY3RzLm1SYW5nZSA9IGZ1bGxSYW5nZSA/IENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsIDogQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQ7CiB9CiAKK3ZvaWQgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCBpbnRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqb3V0dHJhbnNmZXIpIHsKKyAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocHJpbWFyaWVzLCBpbnRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisgICAgY29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoYXNwZWN0cywgcmFuZ2UsIHN0YW5kYXJkLCBvdXR0cmFuc2Zlcik7Cit9CisKIC8vIHN0YXRpYwogQ29sb3JBc3BlY3RzIENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCkgewogICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwpAQCAtNjg0LDYgKzY5MywxMyBAQAogICAgICAgICAgICAgdHJhbnNmZXIsIGFzU3RyaW5nKChDb2xvclRyYW5zZmVyKXRyYW5zZmVyKSk7CiB9CiAKKworLy8gc3RhdGljCit2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KAorICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm8sIGZvcm1hdC0+bUZvcm1hdCk7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdCgKICAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlYWMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogc3RhdGljICovCitzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IE1lZGlhQnVmZmVyOjptVXNlU2hhcmVkTWVtb3J5KDApOworCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShkYXRhKSwKKyAgICAgIG1TaXplKHNpemUpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7Cit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEodHJ1ZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCisgICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7CisjZW5kaWYKKyAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7CisgICAgICAgIHNpemVfdCBuZXdTaXplID0gMDsKKyAgICAgICAgaWYgKCFfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNpemUsIHNpemVvZihTaGFyZWRDb250cm9sKSwgJm5ld1NpemUpKSB7CisgICAgICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIobmV3U2l6ZSwgIk1lZGlhQnVmZmVyIik7CisgICAgICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShuZXdTaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnksIHRyeWluZyByZWd1bGFyIGFsbG9jYXRpb24hIik7CisgICAgICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltTWVtb3J5LT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCk7CisgICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShidWZmZXItPmRhdGEoKSksCisgICAgICBtU2l6ZShidWZmZXItPnNpemUoKSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAorICAgICAgbUJ1ZmZlcihidWZmZXIpLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHByZXZDb3VudCA9IG1SZWZDb3VudC5mZXRjaF9zdWIoMSk7CisgICAgaWYgKHByZXZDb3VudCA9PSAxKSB7CisgICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtT2JzZXJ2ZXItPnNpZ25hbEJ1ZmZlclJldHVybmVkKHRoaXMpOworICAgIH0KKyAgICBDSEVDSyhwcmV2Q291bnQgPiAwKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6Y2xhaW0oKSB7CisgICAgQ0hFQ0sobU9ic2VydmVyICE9IE5VTEwpOworICAgIENIRUNLX0VRKG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLCAxKTsKKworICAgIG1SZWZDb3VudC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKKyAgICAodm9pZCkgbVJlZkNvdW50LmZldGNoX2FkZCgxKTsKK30KKwordm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaXplOworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX29mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJhbmdlT2Zmc2V0OworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX2xlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJhbmdlTGVuZ3RoOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgeworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkgeworICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKKyAgICB9CisgICAgQ0hFQ0sob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKTsKKworICAgIG1SYW5nZU9mZnNldCA9IG9mZnNldDsKKyAgICBtUmFuZ2VMZW5ndGggPSBsZW5ndGg7Cit9CisKK01ldGFEYXRhQmFzZSYgTWVkaWFCdWZmZXI6Om1ldGFfZGF0YSgpIHsKKyAgICByZXR1cm4gKm1NZXRhRGF0YTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6cmVzZXQoKSB7CisgICAgbU1ldGFEYXRhLT5jbGVhcigpOworICAgIHNldF9yYW5nZSgwLCBtU2l6ZSk7Cit9CisKK01lZGlhQnVmZmVyOjp+TWVkaWFCdWZmZXIoKSB7CisgICAgQ0hFQ0sobU9ic2VydmVyID09IE5VTEwpOworCisgICAgaWYgKG1Pd25zRGF0YSAmJiBtRGF0YSAhPSBOVUxMICYmIG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgbURhdGEgPSBOVUxMOworICAgIH0KKworICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOworICAgfQorICAgZGVsZXRlIG1NZXRhRGF0YTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKKyAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKKyAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjlhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KKworLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCisvLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KK3N0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKKyAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA6OkludGVybmFsRGF0YSB7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisgICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KKyAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1CdWZmZXJzOworfTsKKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtV3JhcHBlcihudWxscHRyKSwgbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Cit9CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbVdyYXBwZXIobnVsbHB0ciksIG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICBpbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6aW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIHsKKyAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OworCisgICAgaWYgKG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMCAmJiBidWZmZXJzID4gbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKKyAgICAgICAgQUxPR1coIlByZWFsbG9jYXRlZCBidWZmZXJzICV6dSA+IGdyb3d0aExpbWl0ICV6dSwgaW5jcmVhc2luZyBncm93dGhMaW1pdCIsCisgICAgICAgICAgICAgICAgYnVmZmVycywgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpOworICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7CisgICAgfQorCisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgeworICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7CisgICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgorICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKKyAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOworICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7CisgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7CisgICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7CisgICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICAodm9pZClrU2hhcmVkTWVtb3J5VGhyZXNob2xkOworI2VuZGlmCisKKyAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOworICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKKyAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7CisgICAgfQorfQorCitNZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7CisgICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7CisKKyAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7CisKKyAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKKyAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKKyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKKyAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgorICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgZGVsZXRlIG1JbnRlcm5hbDsKKyAgICBkZWxldGUgbVdyYXBwZXI7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKworICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KKyAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAKKyAgICAgICAgICAgICYmIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpID49IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0CisgICAgICAgICAgICAmJiBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworfQorCitib29sIE1lZGlhQnVmZmVyR3JvdXA6Omhhc19idWZmZXJzKCkgeworICAgIGlmIChtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgorICAgIH0KKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBzaXplX3QgYmlnZ2VzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IGJpZ2dlc3QpIHsKKyAgICAgICAgICAgICAgICBiaWdnZXN0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgorICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplID09IDAgPyBiaWdnZXN0IDoKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSA8IFNJWkVfTUFYIC8gMyAqIDIgLyogTkI6IG9yZGVyaW5nICovID8KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSAqIDMgLyAyIDogcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihhbGxvY2F0ZVNpemUpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBzaXplICV6dSIsIGFsbG9jYXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gSW52YWxpZCBhbGxvYywgcHJlZmVyIG5vdCB0byBjYWxsIHJlbGVhc2UuCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IHZzIGF2YWlsYWJsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUsICgqZnJlZSktPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICpmcmVlID0gYnVmZmVyOyAvLyBpbi1wbGFjZSByZXBsYWNlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IiwgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYnVmZmVyLT5hZGRfcmVmKCk7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGlmIChub25CbG9ja2luZykgeworICAgICAgICAgICAgKm91dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZSwgYmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCisgICAgICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi53YWl0KG1JbnRlcm5hbC0+bUxvY2spOworICAgIH0KKyAgICAvLyBOZXZlciBnZXRzIGhlcmUuCit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlckdyb3VwOjpidWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggZTVhODVlOS4uOWQxZWMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVjEgPSAidmlkZW8vYXYwMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKQEAgLTUwLDEyICs1MSwxNCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00gPSAiYXVkaW8vZ3NtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMyA9ICJhdWRpby9hYzMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDID0gImF1ZGlvL2FsYWMiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZWRlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPcHVzIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworaW50IFdyaXRlT3B1c0hlYWRlcnMoY29uc3QgT3B1c0hlYWRlciAmaGVhZGVyLCBpbnQgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0U2l6ZSwgdWludDY0X3QgY29kZWNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZWtQcmVSb2xsKSB7CisgICAgaWYgKG91dHB1dFNpemUgPCBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHVuaWZpZWQgT1BVUyBDU0QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBoZWFkZXJMZW4gPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBpbnB1dFNhbXBsZVJhdGUsIG91dHB1dCwKKyAgICAgICAgb3V0cHV0U2l6ZSk7CisgICAgaWYgKGhlYWRlckxlbiA8IDApIHsKKyAgICAgICAgQUxPR0QoIldyaXRlT3B1c0hlYWRlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaGVhZGVyTGVuID49IChvdXRwdXRTaXplIC0gMiAqIEFPUFVTX1RPVEFMX0NTRF9TSVpFKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdWludDY0X3QgbGVuZ3RoID0gQU9QVVNfTEVOR1RIOworCisgICAgLyoKKyAgICAgIEZvbGxvd2luZyBpcyB0aGUgQ1NEIHN5bnRheCBmb3Igc2lnbmFsbGluZyBjb2RlYyBkZWxheSBhbmQKKyAgICAgIHNlZWsgcHJlLXJvbGwgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgYWZ0ZXIgT3B1c0hlYWRlcgorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IFNhbXBsZXMgKDggYnl0ZXMpCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNETFkgLSBTaWduYWxzIENvZGVjIERlbGF5CisgICAgICBBT1BVU1BSTCAtIFNpZ25hbHMgc2VlayBwcmUgcm9sbAorCisgICAgICBMZW5ndGggc2hvdWxkIGJlIDguCisgICAgKi8KKworICAgIC8vIEFkZCBjb2RlYyBkZWxheQorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmY29kZWNEZWxheSwgQU9QVVNfQ1NEX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19DU0RfU0laRTsKKworICAgIC8vIEFkZCBza2lwIHByZSByb2xsCisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmc2Vla1ByZVJvbGwsIEFPUFVTX0NTRF9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfQ1NEX1NJWkU7CisKKyAgICByZXR1cm4gaGVhZGVyTGVuOworfQorCit2b2lkIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKSB7CisgICAgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICpjb2RlY0RlbGF5U2l6ZSA9IDA7CisgICAgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKyAgICAqc2Vla1ByZVJvbGxTaXplID0gMDsKKyAgICAqb3B1c0hlYWRCdWYgPSAodm9pZCAqKWRhdGE7CisgICAgKm9wdXNIZWFkU2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICBpZiAoZGF0YV9zaXplID49IEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUpIHsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGRhdGFfc2l6ZSAtIEFPUFVTX1RPVEFMX0NTRF9TSVpFKSB7CisgICAgICAgICAgICB1aW50OF90ICpjc2RCdWYgPSAodWludDhfdCAqKWRhdGEgKyBpOworICAgICAgICAgICAgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRTaXplID0gc3RkOjptaW4oKm9wdXNIZWFkU2l6ZSwgaSk7CisgICAgICAgICAgICAgICAgKmNvZGVjRGVsYXlCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpjb2RlY0RlbGF5U2l6ZSA9IEFPUFVTX0NTRF9TSVpFOworICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfVE9UQUxfQ1NEX1NJWkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgKm9wdXNIZWFkU2l6ZSA9IHN0ZDo6bWluKCpvcHVzSGVhZFNpemUsIGkpOworICAgICAgICAgICAgICAgICpzZWVrUHJlUm9sbEJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsU2l6ZSA9IEFPUFVTX0NTRF9TSVpFOworICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfVE9UQUxfQ1NEX1NJWkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCkgewotICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9IG5ldyBQYXJzZWRNZXNzYWdlOwotICAgIHNzaXplX3QgcmVzID0gbXNnLT5wYXJzZShkYXRhLCBzaXplLCBub01vcmVEYXRhKTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICpsZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbGVuZ3RoID0gcmVzOwotICAgIHJldHVybiBtc2c7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6OlBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6On5QYXJzZWRNZXNzYWdlKCkgewotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGtleSA9IG5hbWU7Ci0gICAga2V5LnRvbG93ZXIoKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtRGljdC5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBtRGljdC52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotCi0gICAgaWYgKCFmaW5kU3RyaW5nKG5hbWUsICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIgKlBhcnNlZE1lc3NhZ2U6OmdldENvbnRlbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db250ZW50LmNfc3RyKCk7Ci19Ci0KLXNzaXplX3QgUGFyc2VkTWVzc2FnZTo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSkgewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNzaXplX3QgbGFzdERpY3RJbmRleCA9IC0xOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgYm9vbCBoZWFkZXJzQ29tcGxldGUgPSBmYWxzZTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgbGluZUVuZE9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgd2hpbGUgKGxpbmVFbmRPZmZzZXQgKyAxIDwgc2l6ZQotICAgICAgICAgICAgICAgICYmIChkYXRhW2xpbmVFbmRPZmZzZXRdICE9ICdccicKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbbGluZUVuZE9mZnNldCArIDFdICE9ICdcbicpKSB7Ci0gICAgICAgICAgICArK2xpbmVFbmRPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCArIDEgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lKCZkYXRhW29mZnNldF0sIGxpbmVFbmRPZmZzZXQgLSBvZmZzZXQpOwotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIHJlcXVlc3Qvc3RhdHVzIGxpbmUuCi0KLSAgICAgICAgICAgIG1EaWN0LmFkZChBU3RyaW5nKCJfIiksIGxpbmUpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgPT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBBbiBlbXB0eSBsaW5lIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keS4KLSAgICAgICAgICAgIGhlYWRlcnNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmUuY19zdHIoKVswXSA9PSAnICcgfHwgbGluZS5jX3N0cigpWzBdID09ICdcdCcpIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGZvbGRlZCBoZWFkZXIgdmFsdWVzLgotCi0gICAgICAgICAgICBpZiAobGFzdERpY3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgbWFsZm9ybWVkIHNpbmNlIHRoZSBmaXJzdCBoZWFkZXIgbGluZQotICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjb250aW51ZSBhbnl0aGluZy4uLgotCi0gICAgICAgICAgICAgICAgQVN0cmluZyAmdmFsdWUgPSBtRGljdC5lZGl0VmFsdWVBdChsYXN0RGljdEluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7Ci0gICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIGtleShsaW5lLCAwLCBjb2xvblBvcyk7Ci0gICAgICAgICAgICBrZXkudHJpbSgpOwotICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKLQotICAgICAgICAgICAgbGluZS5lcmFzZSgwLCBjb2xvblBvcyArIDEpOwotCi0gICAgICAgICAgICBsYXN0RGljdEluZGV4ID0gbURpY3QuYWRkKGtleSwgbGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICB9Ci0KLSAgICBpZiAoIWhlYWRlcnNDb21wbGV0ZSAmJiAoIW5vTW9yZURhdGEgfHwgb2Zmc2V0ID09IDApKSB7Ci0gICAgICAgIC8vIFdlIGVpdGhlciBzYXcgdGhlIGVtcHR5IGxpbmUgc2VwYXJhdGluZyBoZWFkZXJzIGZyb20gYm9keQotICAgICAgICAvLyBvciB3ZSBzYXcgYXQgbGVhc3QgdGhlIHN0YXR1cyBsaW5lIGFuZCBrbm93IHRoYXQgbm8gbW9yZSBkYXRhCi0gICAgICAgIC8vIGlzIGdvaW5nIHRvIGZvbGxvdy4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbURpY3QuZWRpdFZhbHVlQXQoaSkudHJpbSgpOwotICAgIH0KLQotICAgIGludDMyX3QgY29udGVudExlbmd0aDsKLSAgICBpZiAoIWZpbmRJbnQzMigiY29udGVudC1sZW5ndGgiLCAmY29udGVudExlbmd0aCkgfHwgY29udGVudExlbmd0aCA8IDApIHsKLSAgICAgICAgY29udGVudExlbmd0aCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsTGVuZ3RoID0gb2Zmc2V0ICsgY29udGVudExlbmd0aDsKLQotICAgIGlmIChzaXplIDwgdG90YWxMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1Db250ZW50LnNldFRvKCZkYXRhW29mZnNldF0sIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgc2l6ZV90IHByZXZPZmZzZXQgPSAwOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBsaW5lLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBzcGFjZVBvcyA9IGxpbmUuZmluZCgiICIsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgewotICAgICAgICAgICAgc3BhY2VQb3MgPSBsaW5lLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG9mZnNldCA9IHNwYWNlUG9zICsgMTsKLSAgICB9Ci0KLSAgICBmaWVsZC0+c2V0VG8obGluZSwgcHJldk9mZnNldCwgb2Zmc2V0IC0gcHJldk9mZnNldCAtIDEpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdGF0dXNDb2RlU3RyaW5nOwotICAgIGlmICghZ2V0UmVxdWVzdEZpZWxkKDEsICZzdGF0dXNDb2RlU3RyaW5nKSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnN0YXR1c0NvZGUgPSBzdHJ0b2woc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCkKLSAgICAgICAgICAgIHx8ICgqc3RhdHVzQ29kZSkgPCAxMDAgfHwgKCpzdGF0dXNDb2RlKSA+IDk5OSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQVN0cmluZyBQYXJzZWRNZXNzYWdlOjpkZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQVN0cmluZyAma2V5ID0gbURpY3Qua2V5QXQoaSk7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlID0gbURpY3QudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoa2V5ID09IEFTdHJpbmcoIl8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBsaW5lLmFwcGVuZChrZXkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQodmFsdWUpOwotICAgICAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICBsaW5lLmFwcGVuZChtQ29udGVudCk7Ci0KLSAgICByZXR1cm4gbGluZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgewotICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7Ci0KLSAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7Ci0gICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSkgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0gICAgaWYgKCFHZXRBdHRyaWJ1dGUocywga2V5LCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKaW5kZXggOGYzMjU4Mi4uODM0Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApAQCAtMjgsMTQgKzI4LDMxIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIHNpemVfdCBidWZTaXplID0gbiAvIDQgKiAzOworICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGJ1ZlNpemUpOworCisgICAgaWYgKGRlY29kZUJhc2U2NChidWYtPmRhdGEoKSwgJmJ1ZlNpemUsIHMuY19zdHIoKSkpIHsKKyAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBidWZTaXplKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpIHsKKyAgICBzaXplX3QgbiA9IHN0cmxlbihzKTsKKworICAgIGlmICgobiAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHNpemVfdCBwYWRkaW5nID0gMDsKLSAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgaWYgKG4gPj0gMSAmJiBzW24gLSAxXSA9PSAnPScpIHsKICAgICAgICAgcGFkZGluZyA9IDE7CiAKLSAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgeworICAgICAgICBpZiAobiA+PSAyICYmIHNbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CiAKLSAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgc1tuIC0gM10gPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ1LDE1ICs2MiwxMyBAQAogICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KICAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOwogCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuKTsKLSAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKLSAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG91dCA9PSBOVUxMIHx8ICppbk91dEJ1ZlNpemUgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgaiA9IDA7CiAgICAgdWludDMyX3QgYWNjdW0gPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgY2hhciBjID0gc1tpXTsKICAgICAgICAgdW5zaWduZWQgdmFsdWU7CiAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewogICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnOwpAQCAtNjYsMTAgKzgxLDEwIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgfHwgYyA9PSAnXycpIHsKICAgICAgICAgICAgIHZhbHVlID0gNjM7CiAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGkgPCBuIC0gcGFkZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFsdWUgPSAwOwpAQCAtODYsNyArMTAxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBidWZmZXI7CisgICAgKmluT3V0QnVmU2l6ZSA9IGo7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBjaGFyIGVuY29kZTZCaXQodW5zaWduZWQgeCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZWJhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNkZWZpbmUgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYSBudW1iZXIgb2YgbGl2ZSBzb2NrZXRzIChkYXRhZ3JhbSBhbmQgc3RyZWFtLWJhc2VkKQotLy8gb24gYSBzaW5nbGUgdGhyZWFkLiBDbGllbnRzIGFyZSBub3RpZmllZCBhYm91dCBhY3Rpdml0eSB0aHJvdWdoIEFNZXNzYWdlcy4KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQU5ldHdvcmtTZXNzaW9uKCk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvLyBwYXNzaXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIC8vIGFjdGl2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplID0gLTEsCi0gICAgICAgICAgICBib29sIHRpbWVWYWxpZCA9IGZhbHNlLCBpbnQ2NF90IHRpbWVVcyA9IC0xbGwpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gTm90aWZpY2F0aW9uUmVhc29uIHsKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0Q2xpZW50Q29ubmVjdGVkLAotICAgICAgICBrV2hhdERhdGEsCi0gICAgICAgIGtXaGF0RGF0YWdyYW0sCi0gICAgICAgIGtXaGF0QmluYXJ5RGF0YSwKLSAgICAgICAga1doYXRXZWJTb2NrZXRNZXNzYWdlLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU5ldHdvcmtTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IE5ldHdvcmtUaHJlYWQ7Ci0gICAgc3RydWN0IFNlc3Npb247Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBzcDxUaHJlYWQ+IG1UaHJlYWQ7Ci0KLSAgICBpbnQzMl90IG1OZXh0U2Vzc2lvbklEOwotCi0gICAgaW50IG1QaXBlRmRbMl07Ci0KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKLQotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgfTsKLSAgICBzdGF0dXNfdCBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgdm9pZCB0aHJlYWRMb29wKCk7Ci0gICAgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5ldHdvcmtTZXNzaW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQV9ORVRXT1JLX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisjZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIEF1ZGlvUHJlc2VudGF0aW9uVmVyc2lvbiB7CisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEID0gMCwKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl8xLAorfTsKKworZW51bSBNYXN0ZXJpbmdJbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgdWludDMyX3QgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQ7CisgICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQgPSAtMTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1MYWJlbHM7CisgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgIE1hc3RlcmluZ0luZGljYXRpb24gbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKKyAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uVjEgOiBwdWJsaWMgQXVkaW9QcmVzZW50YXRpb24geworICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEoKSB7CisgICAgICAgIG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb247CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBkNmM3NjhkLi5jZDBhZjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29sb3JVdGlscyB7CkBAIC0xMzUsNiArMTM3LDkgQEAKICAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCiAgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCB0cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAogICAgICAgICAgICAgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGlzb3RyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpOwogCiAgICAgLy8gdW5wYWNrIGEgdWludDMyX3QgdG8gYSBmdWxsIENvbG9yQXNwZWN0cyBzdHJ1Y3QKICAgICBzdGF0aWMgQ29sb3JBc3BlY3RzIHVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCk7CkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCisgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggNTg3NThiYy4uZTY4ODUyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwpAQCAtNTIsNiArNTMsOCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmZjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIE9QVVNfSEVBREVSX0hfCisjZGVmaW5lIE9QVVNfSEVBREVSX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQ29uc3RhbnRzIHVzZWQgZm9yIGRlbGltaXRpbmcgT3B1cyBDU0QgKi8KKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiAiQU9QVVNETFkiCisjZGVmaW5lIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSICJBT1BVU1BSTCIKKyNkZWZpbmUgQU9QVVNfQ1NEX1NJWkUgOAorI2RlZmluZSBBT1BVU19MRU5HVEggOAorI2RlZmluZSBBT1BVU19NQVJLRVJfU0laRSA4CisjZGVmaW5lIEFPUFVTX0xFTkdUSF9TSVpFIDgKKyNkZWZpbmUgQU9QVVNfVE9UQUxfQ1NEX1NJWkUgXAorICAgICgoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIChBT1BVU19DU0RfU0laRSkpCisjZGVmaW5lIEFPUFVTX0NTRDBfTUlOU0laRSAxOQorI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFIFwKKyAgICAoKEFPUFVTX0NTRDBfTUlOU0laRSkgKyAyICogKEFPUFVTX1RPVEFMX0NTRF9TSVpFKSkKKworLyogQ1NEMCBhdCBtYXggY2FuIGJlIDIyIGJ5dGVzICsgbWF4IG51bWJlciBvZiBjaGFubmVscyAoMjU1KSAqLworI2RlZmluZSBBT1BVU19DU0QwX01BWFNJWkUgMjc3CisjZGVmaW5lIEFPUFVTX1VOSUZJRURfQ1NEX01BWFNJWkUgXAorICAgICgoQU9QVVNfQ1NEMF9NQVhTSVpFKSArIDIgKiAoQU9QVVNfVE9UQUxfQ1NEX1NJWkUpKQorCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBjaGFubmVsX21hcHBpbmc7CisgICAgaW50IG51bV9zdHJlYW1zOworICAgIGludCBudW1fY291cGxlZDsKKyAgICBpbnQxNl90IGdhaW5fZGI7CisgICAgaW50IHNraXBfc2FtcGxlczsKKyAgICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpOworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpOwordm9pZCBHZXRPcHVzSGVhZGVyQnVmZmVycyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb3B1c0hlYWRCdWYsIHNpemVfdCAqb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqY29kZWNEZWxheUJ1Ziwgc2l6ZV90ICpjb2RlY0RlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlZWtQcmVSb2xsQnVmLCBzaXplX3QgKnNlZWtQcmVSb2xsU2l6ZSk7CitpbnQgV3JpdGVPcHVzSGVhZGVycyhjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRTaXplLCB1aW50NjRfdCBjb2RlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2Vla1ByZVJvbGwpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPUFVTX0hFQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQzYTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5jYXBzdWxhdGVzIGFuICJIVFRQL1JUU1Agc3R5bGUiIHJlc3BvbnNlLCBpLmUuIGEgc3RhdHVzIGxpbmUsCi0vLyBrZXkvdmFsdWUgcGFpcnMgbWFraW5nIHVwIHRoZSBoZWFkZXJzIGFuZCBhbiBvcHRpb25hbCBib2R5L2NvbnRlbnQuCi1zdHJ1Y3QgUGFyc2VkTWVzc2FnZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCk7Ci0KLSAgICBib29sIGZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKLQotICAgIGNvbnN0IGNoYXIgKmdldENvbnRlbnQoKSBjb25zdDsKLQotICAgIGJvb2wgZ2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0OwotICAgIGJvb2wgZ2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdDsKLQotICAgIEFTdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKLQotICAgIHN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKTsKLQotICAgIHN0YXRpYyBib29sIEdldEludDMyQXR0cmlidXRlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSk7Ci0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcnNlZE1lc3NhZ2UoKTsKLQotcHJpdmF0ZToKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBBU3RyaW5nPiBtRGljdDsKLSAgICBBU3RyaW5nIG1Db250ZW50OwotCi0gICAgUGFyc2VkTWVzc2FnZSgpOwotCi0gICAgc3NpemVfdCBwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlZE1lc3NhZ2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKaW5kZXggYWJjOTVlMC4uNjBmYjlmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKQEAgLTI2LDYgKzI2LDkgQEAKIHN0cnVjdCBBU3RyaW5nOwogCiBzcDxBQnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3QgQVN0cmluZyAmcyk7CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpOworCiB2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKIAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTdjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJNZWRpYUhUVFAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyTWVkaWFIVFRQOjpDbGVhck1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKKyAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAorICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAorICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCisgICAgICBtQ2FjaGVkU2l6ZSgwbGwpIHsKK30KKworQ2xlYXJNZWRpYUhUVFA6On5DbGVhck1lZGlhSFRUUCgpIHsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7CisgICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworICAgIH0KKworICAgIG1MYXN0VVJJID0gdXJpOworICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAorICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KKyAgICB1cmkgPSBOVUxMOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKKworICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7CisKKyAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkNsZWFyTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgeworICAgIG1OYW1lID0gU3RyaW5nOCgiQ2xlYXJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IENsZWFyTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgeworICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KKyAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKKworICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCisgICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgorCisgICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7CisgICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7CisgICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgICpzaXplID0gbUNhY2hlZFNpemU7CisKKyAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOworfQorCit1aW50MzJfdCBDbGVhck1lZGlhSFRUUDo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOworfQorCisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIHJldHVybiBtaW1lVHlwZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA3YzkyNDdlLi4wZmJhM2RjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0zMCwxMCArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAotICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAotICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCi0gICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgIDogQ2xlYXJNZWRpYUhUVFAoY29ubiksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CiAKQEAgLTQxLDExNyArMzgsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9Ci0KLSAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOwotICAgIH0KLQotICAgIG1MYXN0VVJJID0gdXJpOwotICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAotICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KLSAgICB1cmkgPSBOVUxMOwotCi0gICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKLQotICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7Ci0KLSAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7Ci0KLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgewotICAgIG1OYW1lID0gU3RyaW5nOCgiTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXNzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKLSAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KLSAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKLQotICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQotICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KLQotICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgewotICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOwotICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOwotCi0gICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKLX0KLQotdWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOwotfQotCiAvLyBEUk0uLi4KIAogc3A8RGVjcnlwdEhhbmRsZT4gTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7CkBAIC0xNzYsMzMgKzYyLDYgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLVN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCB1cmk7Ci0gICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVUeXBlOwotfQotCiB2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgewogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDkwNTNkNjIuLmMwZWUxNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMjksMTggKzI5LDE4IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCmluZGV4IDcyNjA0ZTMuLjU5MjY1ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTM4LDcgKzM4LDcgQEAKIEhUVFBEb3dubG9hZGVyOjpIVFRQRG93bmxvYWRlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgotICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgQ2xlYXJNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCiAgICAgbUV4dHJhSGVhZGVycyhoZWFkZXJzKSwKICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSkgewogfQpAQCAtOTEsNyArOTEsNyBAQAogCiAgICAgaWYgKHJlY29ubmVjdCkgewogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgewotICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IENsZWFyRmlsZVNvdXJjZSh1cmwgKyA3KTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKICAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggMmVjZmE0My4uNWU3ZjkwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMTIzNCw3ICsxMjM0LDcgQEAKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBpbnQ2NF90IHRpbWVVcywgYm9vbCBuZXdVcmkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmkuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAKICAgICAgICAgICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdXJpRGVidWdTdHJpbmcobVN0cmVhbXNbaWR4XS5tVXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKICAgICAgICAgQ0hFQ0soaWR4ID49IDApOwogICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB1cmlEZWJ1Z1N0cmluZyhtU3RyZWFtc1tpZHhdLm1VcmkpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BwaW5nIG5ld1VyaSA9ICVzIiwgbmV3VXJpLmNfc3RyKCkpOwogICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShuZXdVcmkpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgbmV3VXJpOiAlcyIsIG5ld1VyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCB1cmlEZWJ1Z1N0cmluZyhuZXdVcmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDk3NWUyYjUuLmIyMzYxYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtNzA2LDYgKzcwNiwxMiBAQAogICAgICAgICArK2xpbmVObzsKICAgICB9CiAKKyAgICAvLyBwbGF5bGlzdCBoYXMgbm8gaXRlbSwgd291bGQgY2F1c2UgZXhjZXB0aW9uCisgICAgaWYgKG1JdGVtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgicGxheWxpc3QgaGFzIG5vIGl0ZW0iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKICAgICAvLyBlcnJvciBjaGVja2luZyBvZiBhbGwgZmllbGRzIHRoYXQncyByZXF1aXJlZCB0byBhcHBlYXIgb25jZQogICAgIC8vIChjdXJyZW50bHkgb25seSBjaGVja2luZyAidGFyZ2V0LWR1cmF0aW9uIiksIGFuZAogICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIHBsYXlsaXN0IHByb3BlcnRpZXMgKGVnLiBtVGFyZ2V0RHVyYXRpb25VcykKQEAgLTExOTksOCArMTIwNSw3IEBACiAgICAgICAgICAgICBpZiAodmFsLnNpemUoKSA8IDIKICAgICAgICAgICAgICAgICAgICAgfHwgdmFsLmNfc3RyKClbMF0gIT0gJyInCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpW3ZhbC5zaXplKCkgLSAxXSAhPSAnIicpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLCBnb3QgJyVzJyBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIGZvciBVUkkuIik7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTM5MSw2ICsxMzk2LDcgQEAKICAgICAgICAgY2FzZSAnUURNQyc6CiAgICAgICAgIGNhc2UgJ3VsYXcnOgogICAgICAgICBjYXNlICd2ZHZhJzoKKyAgICAgICAgY2FzZSAnYWMtNCc6CiAgICAgICAgICAgICByZXR1cm4gIXN0cmNtcCgiYXVkaW8iLCB0eXBlKTsKIAogICAgICAgICBjYXNlICdhdmMxJzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDU2MmM2MjUuLmQxNTM1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtMzY1LDEwICszNjUsMTAgQEAKICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggY2lwaGVyIGtleSBmcm9tICclcycuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIGlmIChrZXktPnNpemUoKSAhPSAxNikgewotICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwga2V5VVJJLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIApAQCAtMTM2Niw3ICsxMzY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYnl0ZXNSZWFkOwotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCAudHMgc2VnbWVudCBhdCB1cmwgJyVzJyIsIHVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmlEZWJ1Z1N0cmluZyh1cmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCBmOWY4YTNkLi43MTUxZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMyw2ICszLDEwIEBACiAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IDA4NTYwOGIuLjc5MmE2OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9JRDMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTU2LDYgKzU4LDU1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVtb3J5U291cmNlKTsKIH07CiAKK2NsYXNzIERhdGFTb3VyY2VVbndyYXBwZXIgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgeworCitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZVVud3JhcHBlcihEYXRhU291cmNlSGVscGVyICpzb3VyY2VoZWxwZXIpIHsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZWhlbHBlcjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBPSzsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOworfTsKKworCitJRDM6OklEMyhEYXRhU291cmNlSGVscGVyICpzb3VyY2VoZWxwZXIsIGJvb2wgaWdub3JlVjEsIG9mZjY0X3Qgb2Zmc2V0KQorICAgIDogbUlzVmFsaWQoZmFsc2UpLAorICAgICAgbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1GaXJzdEZyYW1lT2Zmc2V0KDApLAorICAgICAgbVZlcnNpb24oSUQzX1VOS05PV04pLAorICAgICAgbVJhd1NpemUoMCkgeworICAgIERhdGFTb3VyY2VVbndyYXBwZXIgc291cmNlKHNvdXJjZWhlbHBlcik7CisgICAgbUlzVmFsaWQgPSBwYXJzZVYyKCZzb3VyY2UsIG9mZnNldCk7CisKKyAgICBpZiAoIW1Jc1ZhbGlkICYmICFpZ25vcmVWMSkgeworICAgICAgICBtSXNWYWxpZCA9IHBhcnNlVjEoJnNvdXJjZSk7CisgICAgfQorfQorCiBJRDM6OklEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKICAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKICAgICAgIG1EYXRhKE5VTEwpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCmluZGV4IGE5MjQxOTcuLjhiMjAxODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTUxLDEyICs1MSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QmFuZHdpZHRoSGlzdG9yeVNpemUoc2l6ZV90IG51bUhpc3RvcnlJdGVtcyk7CiAKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKLQotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCk7Ci0KICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAppbmRleCA3YzIzOTFlLi41ZTQzM2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IElEMyB7CiAgICAgZW51bSBWZXJzaW9uIHsKQEAgLTM1LDYgKzM2LDcgQEAKICAgICAgICAgSUQzX1YyXzQsCiAgICAgfTsKIAorICAgIGV4cGxpY2l0IElEMyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIElEMyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlKTsKICAgICB+SUQzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCBmNDM5YTFjLi41OTZlZmI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCiAgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKQEAgLTUxLDYgKzUzLDggQEAKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KIAorICAgIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgc2l6ZV90IGNhY2hlZFNpemUoKTsKQEAgLTEzNSw3ICsxMzksNyBAQAogICAgIHNzaXplX3QgcmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmNjRfdCBvZmZzZXQpOwogCi0gICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OworICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2wob2ZmNjRfdCBvZmZzZXQsIHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Q7CiAKICAgICB2b2lkIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgKICAgICAgICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQgPSBmYWxzZSwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggYzI4NjUxNi4uNjRkY2E0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICBDb2xvckNvbnZlcnRlciAqbUNvbnZlcnRlcjsKICAgICBZVVZNb2RlIG1ZVVZNb2RlOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGU7CiAgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKICAgICBpbnQzMl90IG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggMWE0NGUxZi4uYzUwNjc3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDcgKzI2LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRGF0YVNvdXJjZTsKLWNsYXNzIE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IEltYWdlRGVjb2RlcjsKIHN0cnVjdCBGcmFtZVJlY3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDk3ZDE1YTcuLjlkNDZkMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAogICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgICAgICBrV2hhdEZvcmNlU3RhdGVUcmFuc2l0aW9uICAgID0gJ2ZzdHQnLAorICAgICAgICBrV2hhdENoZWNrSWZTdHVjayAgICAgICAgICAgID0gJ0NzdGsnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTIzNiw2ICsyMzcsOCBAQAogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtTGFzdE5hdGl2ZVdpbmRvd0Nyb3A7CiAgICAgaW50MzJfdCBtTGFzdE5hdGl2ZVdpbmRvd0RhdGFTcGFjZTsKICAgICBIRFJTdGF0aWNJbmZvIG1MYXN0SERSU3RhdGljSW5mbzsKKyAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlcjsKKyAgICBzcDxBQnVmZmVyPiBtTGFzdEhkcjEwUGx1c0J1ZmZlcjsKICAgICBzcDxBTWVzc2FnZT4gbUNvbmZpZ0Zvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwpAQCAtMjg5LDYgKzI5Miw3IEBACiAKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OwogICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4OworICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4OwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEFDb2RlY0J1ZmZlckNoYW5uZWw+IG1CdWZmZXJDaGFubmVsOwogCkBAIC00MjMsNiArNDI3LDExIEBACiAgICAgLy8gdW5zcGVjaWZpZWQgdmFsdWVzLgogICAgIHZvaWQgb25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKIAorICAgIC8vIG5vdGlmaWVzIHRoZSBjb2RlYyB0aGF0IHRoZSBjb25maWcgd2l0aCB8Y29uZmlnSW5kZXh8IGhhcyBjaGFuZ2VkLCB0aGUgdmFsdWUKKyAgICAvLyBjYW4gYmUgcXVlcmllZCBieSBPTVggZ2V0Q29uZmlnLCBhbmQgdGhlIGNvbmZpZyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgbmV4dAorICAgIC8vIG91dHB1dCBidWZmZXIgbm90aWZpZWQgYWZ0ZXIgdGhpcyBjYWxsYmFjay4KKyAgICB2b2lkIG9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpOworCiAgICAgLy8gZ2V0cyBpbmRleCBvciBzZXRzIGl0IHRvIDAgb24gZXJyb3IuIFJldHVybnMgZXJyb3IgZnJvbSBjb2RlYy4KICAgICBzdGF0dXNfdCBpbml0RGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKTsKIApAQCAtNDM0LDEyICs0NDMsMjIgQEAKICAgICAvLyBzZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAorICAgIC8vIHNldHMgfGhkcjEwUGx1c0luZm98LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KKyAgICBzdGF0dXNfdCBzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKTsKKwogICAgIC8vIGdldHMgfHBhcmFtc3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm8oRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpOwogCiAgICAgLy8gZ2V0cyBIRFIgc3RhdGljIGluZm9ybWF0aW9uIGZvciB0aGUgdmlkZW8gZW5jb2Rlci9kZWNvZGVyIHBvcnQgYW5kIHNldHMgdGhlbSBpbnRvIHxmb3JtYXR8LgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm9Gb3JWaWRlb0NvZGVjKE9NWF9VMzIgcG9ydEluZGV4LCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKKyAgICAvLyBnZXRzIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBwYXJhbXMuIElmIHxwYXJhbVNpemVVc2VkfCBpcyB6ZXJvLCBpdCdzCisgICAgLy8gcG9zc2libGUgdGhhdCB0aGUgcmV0dXJuZWQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIG9ubHkgaGFzIHRoZQorICAgIC8vIG5QYXJhbVNpemVVc2VkIGZpZWxkIHVwZGF0ZWQsIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhlIHN0b3JhZ2UgaXMgaW5zdWZmaWNpZW50LgorICAgIC8vIEluIHRoaXMgY2FzZSwgZ2V0SERSMTBQbHVzSW5mbygpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB8cGFyYW1TaXplVXNlZHwKKyAgICAvLyBzcGVjaWZpZWQgdG8gdGhlIHByZXZpb3VzIHJldHVybmVkIHZhbHVlLgorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogZ2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCA9IDApOworCiAgICAgdHlwZWRlZiBzdHJ1Y3QgZHJjUGFyYW1zIHsKICAgICAgICAgaW50MzJfdCBkcmNDdXQ7CiAgICAgICAgIGludDMyX3QgZHJjQm9vc3Q7CkBAIC00NjAsNiArNDc5LDggQEAKIAogICAgIHN0YXR1c190IHNldHVwRUFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIAorICAgIHN0YXR1c190IHNldHVwQUM0Q29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpOworCiAgICAgc3RhdHVzX3Qgc2VsZWN0QXVkaW9Qb3J0Rm9ybWF0KAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9BVURJT19DT0RJTkdUWVBFIGRlc2lyZWRGb3JtYXQpOwogCkBAIC00NjcsNyArNDg4LDggQEAKICAgICBzdGF0dXNfdCBzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMsCkBAIC00NzYsNiArNDk4LDcgQEAKICAgICBzdGF0dXNfdCBzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKICAgICBzdGF0dXNfdCBzZXRMYXRlbmN5KHVpbnQzMl90IGxhdGVuY3kpOwogICAgIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworICAgIHN0YXR1c190IHNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKTsKICAgICBzdGF0dXNfdCBzZXRPcGVyYXRpbmdSYXRlKGZsb2F0IHJhdGVGbG9hdCwgYm9vbCBpc1ZpZGVvKTsKICAgICBzdGF0dXNfdCBnZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgKmludHJhUmVmcmVzaFBlcmlvZCk7CiAgICAgc3RhdHVzX3Qgc2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90IGludHJhUmVmcmVzaFBlcmlvZCwgYm9vbCBpbkNvbmZpZ3VyZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDIwNmQzMjIuLmIwZTMyZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTY5LDYgKzY5LDcgQEAKIAogICAgIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2xlYXJGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gQ2xlYXJGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJGaWxlU291cmNlKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CisgICAgTXV0ZXggbUxvY2s7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7CisgICAgQ2xlYXJGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MDdhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBDbGVhck1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhck1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xlYXJNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9NRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNWIzNTQzZC4uNzViMGQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtMzUsMjEgKzM1LDMyIEBACiAKICAgICBib29sIGlzRHN0UkdCKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFNyY0NvbG9yU3BhY2UodWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2Zlcik7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0KAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKKyAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOworICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CisgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKKworICAgICAgICBib29sIGlzQnQ3MDkoKTsKKyAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICB9OworCiAgICAgc3RydWN0IEJpdG1hcFBhcmFtcyB7CiAgICAgICAgIEJpdG1hcFBhcmFtcygKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CkBAIC02NSw2ICs3Niw3IEBACiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CisgICAgQ29sb3JTcGFjZSBtU3JjQ29sb3JTcGFjZTsKICAgICB1aW50OF90ICptQ2xpcDsKIAogICAgIHVpbnQ4X3QgKmluaXRDbGlwKCk7CkBAIC03OCw2ICs5MCw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2E0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWI4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCisgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAorICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCisgICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOworCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90ICogLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKKyAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDg2MDQ4OTAuLmI2MTBlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0yMCw0NyArMjAsMjkgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBDbGVhckZpbGVTb3VyY2UgewogcHVibGljOgogICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIC8vIEZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAogICAgIEZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzRHJtKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBpbnQgbUZkOwotICAgIGludDY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1MZW5ndGg7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgU3RyaW5nOCBtTmFtZTsKLQogICAgIC8qZm9yIERSTSovCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CkBAIC02OCw3ICs1MCw3IEBACiAgICAgc3NpemVfdCBtRHJtQnVmU2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOwogCi0gICAgc3NpemVfdCByZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBGaWxlU291cmNlKGNvbnN0IEZpbGVTb3VyY2UgJik7CiAgICAgRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEZpbGVTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKaW5kZXggZjBlYmQ0OC4uYjgzYTk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCBmMTg5NDBkLi44MDMxNTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOyAvLyBTdGFydCB0aW1lIG9mZnNldCB3aGVuIEIgRnJhbWVzIGFyZSBwcmVzZW50CiAgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAKICAgICB2b2lkIHNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIGludDY0X3QgZ2V0U3RhcnRUaW1lc3RhbXBVcygpOyAgLy8gTm90IGNvbnN0CisgICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CkBAIC0yNTUsNyArMjU3LDkgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOworICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKICAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOwogICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZDQ5YzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQorICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgorICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQorICAgICAgICBtTWVtb3J5ID0gbWVtOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgorICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCisgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcworICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KKyAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCisgICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7CisKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworCisgICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KKyAgICB2b2lkIGNsYWltKCk7CisKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7CisgICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOworICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7CisKKyAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgorICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7CisgICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOworICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKKyAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQorICAgIH07CisKKyAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODBlNDliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2JmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworfTsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOworCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOworCisgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICAgICAgZGVsZXRlIG1Gb3JtYXQ7CisgICAgfTsKKworICAgIENNZWRpYUJ1ZmZlciAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVsZWFzZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmVsZWFzZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkICogeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5kYXRhKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNpemUgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNpemUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2Vfb2Zmc2V0ID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2VfbGVuZ3RoID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2V0X3JhbmdlID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2V0X3JhbmdlKG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+bWV0YV9kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiBBTWVkaWFGb3JtYXQqIHsKKyAgICAgICAgICAgIGlmICgoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIG1XcmFwcGVyID0gbnVsbHB0cjsKKyAgICAgICAgbUZvcm1hdCA9IG51bGxwdHI7CisgICAgfQorcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXIgKm1XcmFwcGVyOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwOWIzZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjExNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKKworICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBib29sIGhhc19idWZmZXJzKCk7CisKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKKyAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOworCisgICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPmFkZF9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoc2l6ZSk7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFkZF9idWZmZXIoYnVmKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aW5pdCA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIC0+IGJvb2wgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5pbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgICAgICAgLy8gICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+bVdyYXBwZXItPmluaXQgPSBudWxscHRyOyAvLyBlbmZvcmNlIGNhbGwtb25jZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmFjcXVpcmVfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZiwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYWNxdWlyZWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmFjcXVpcmVkQnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIGFjcXVpcmVkQnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gYWNxdWlyZWRCdWYtPndyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmhhc19idWZmZXJzID0gW10odm9pZCAqaGFuZGxlKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmhhc19idWZmZXJzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbVdyYXBwZXI7CisgICAgc3RydWN0IEludGVybmFsRGF0YTsKKyAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICB2b2lkIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjJkY2E1YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zMSw2ICszMSwyMSBAQAogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOwogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDogICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDogICAgICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOiAgICAgICAgICAgICAgcmV0dXJuICJIaWdoMTAiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDIyOiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0MjIiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOiByZXR1cm4gIkNvbnN0cmFpbmVkQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6ICAgICByZXR1cm4gIkNvbnN0cmFpbmVkSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7CkBAIC00OCw2ICs2MywzNSBAQAogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNiAgICAgICA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYxICAgICAgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MiAgICAgID0gMHg4MDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMWI6ICAgIHJldHVybiAiMWIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDEyOiAgICByZXR1cm4gIjEuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMzogICAgcmV0dXJuICIxLjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWQ0xldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7CkBAIC01OSw2ICsxMDMsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNQcm9maWxlQmFzZWxpbmU6ICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZTogcmV0dXJuICJCYWNrd2FyZENvbXBhdGlibGUiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSVNXVjI6ICAgICAgICAgICAgICByZXR1cm4gIklTV1YyIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb246ICAgIHJldHVybiAiSGlnaENvbXByZXNzaW9uIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUludGVybmV0OiAgICAgICAgICAgcmV0dXJuICJJbnRlcm5ldCI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5OiAgICAgICAgcmV0dXJuICJIaWdoTGF0ZW5jeSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwxMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDIwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMzAgICAgICA9IDB4MDQ7CkBAIC02OCw2ICsxMjcsMjAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSDI2M0xldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNMZXZlbDEwOiAgIHJldHVybiAiMTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDIwOiAgIHJldHVybiAiMjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDMwOiAgIHJldHVybiAiMzAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQwOiAgIHJldHVybiAiNDAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQ1OiAgIHJldHVybiAiNDUiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDUwOiAgIHJldHVybiAiNTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDYwOiAgIHJldHVybiAiNjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDcwOiAgIHJldHVybiAiNzAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICAgICA9IDB4MDQ7CkBAIC04NSw2ICsxNTgsMjggQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgICByZXR1cm4gIlNpbXBsZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICAgcmV0dXJuICJDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICAgcmV0dXJuICJOYml0IjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICAgcmV0dXJuICJTY2FsYWJsZVRleHR1cmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgICByZXR1cm4gIlNpbXBsZUZhY2UiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgICByZXR1cm4gIlNpbXBsZUZCQSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgIHJldHVybiAiQmFzaWNBbmltYXRlZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgIHJldHVybiAiSHlicmlkIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiAgcmV0dXJuICJBZHZhbmNlZFJlYWxUaW1lIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICAgcmV0dXJuICJDb3JlU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgICByZXR1cm4gIkFkdmFuY2VkQ29kaW5nIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICAgcmV0dXJuICJBZHZhbmNlZENvcmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6ICByZXR1cm4gIkFkdmFuY2VkU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgICByZXR1cm4gIkFkdmFuY2VkU2ltcGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKQEAgLTk2LDYgKzE5MSwyMiBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzRMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMDogICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwwYjogIHJldHVybiAiMGIiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwxOiAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDI6ICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMzogICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwzYjogIHJldHVybiAiM2IiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0OiAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDRhOiAgcmV0dXJuICI0YSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDU6ICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNjogICByZXR1cm4gIjYiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMDsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlNDIyICAgICAgICAgICAgICAgICA9IDB4MDI7CkBAIC0xMDMsMTIgKzIxNCwzNSBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMlByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlU2ltcGxlOiAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlTWFpbjogICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZTQyMjogICAgICAgcmV0dXJuICI0MjIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNOUjogICAgICAgcmV0dXJuICJTTlIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNwYXRpYWw6ICAgcmV0dXJuICJTcGF0aWFsIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVIaWdoOiAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxMTDogIHJldHVybiAiTEwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxNTDogIHJldHVybiAiTUwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxIMTQ6IHJldHVybiAiSDE0IjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSEw6ICByZXR1cm4gIkhMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSFA6ICByZXR1cm4gIkhQIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOwpAQCAtMTIyLDE5ICsyNTYsNzAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEVMRCAgICAgICAgPSAzOTsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFhIRSAgICAgICAgPSA0MjsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BQUNPYmplY3QoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TWFpbjogICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFBQ09iamVjdExDOiAgICAgICAgICAgcmV0dXJuICJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U1NSOiAgICAgICAgICByZXR1cm4gIlNTUiI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TFRQOiAgICAgICAgICByZXR1cm4gIkxUUCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEU6ICAgICAgICAgICByZXR1cm4gIkhFIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RTY2FsYWJsZTogICAgIHJldHVybiAiU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVSTEM6ICAgICAgICAgcmV0dXJuICJFUkxDIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUlNjYWxhYmxlOiAgIHJldHVybiAiRVJTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TEQ6ICAgICAgICAgICByZXR1cm4gIkxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RIRV9QUzogICAgICAgIHJldHVybiAiSEVfUFMiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVMRDogICAgICAgICAgcmV0dXJuICJFTEQiOworICAgICAgICBjYXNlIEFBQ09iamVjdFhIRTogICAgICAgICAgcmV0dXJuICJYSEUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDhMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJWMCI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjE6IHJldHVybiAiVjEiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24yOiByZXR1cm4gIlYyIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJWMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhQcm9maWxlTWFpbiA9IDB4MDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUwID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUxID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUyID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOVByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6ICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUxOiAgICAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjogICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTM6ICAgICAgICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOiAgICAgICAgcmV0dXJuICIySERSIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjogICAgICAgIHJldHVybiAiM0hEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6ICByZXR1cm4gIjJIRFJQbHVzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjEwUGx1czogIHJldHVybiAiM0hEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDExID0gMHgyOwpAQCAtMTUxLDEwICszMzYsMTEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIFZQOUxldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIFZQOUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIFZQOUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMiA9IDB4MDQ7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMDogICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMTogICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMjogICAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMiAgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIxID0gMHgyOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMiA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjMgPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzEgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMiA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMzID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNCAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDEgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDIgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDMgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNSAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUxID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MiA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTMgPSAweDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjEgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MiA9IDB4NDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYzID0gMHg4MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNyAgPSAweDEwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzEgPSAweDIwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzIgPSAweDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzMgPSAweDgwMDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIyOiAgICByZXR1cm4gIjIuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMzogICAgcmV0dXJuICIyLjMiOworICAgICAgICBjYXNlIEFWMUxldmVsMzogICAgIHJldHVybiAiMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMTogICAgcmV0dXJuICIzLjEiOworICAgICAgICBjYXNlIEFWMUxldmVsMzI6ICAgIHJldHVybiAiMy4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMzOiAgICByZXR1cm4gIjMuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNDM6ICAgIHJldHVybiAiNC4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIEFWMUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MzogICAgcmV0dXJuICI1LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNjogICAgIHJldHVybiAiNiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MTogICAgcmV0dXJuICI2LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNjI6ICAgIHJldHVybiAiNi4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYzOiAgICByZXR1cm4gIjYuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3OiAgICAgcmV0dXJuICI3IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDcxOiAgICByZXR1cm4gIjcuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MjogICAgcmV0dXJuICI3LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNzM6ICAgIHJldHVybiAiNy4zIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluICAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMCAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpblN0aWxsICAgPSAweDA0OwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzID0gMHgyMDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0hFVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjogICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwOiAgICAgICAgICAgICByZXR1cm4gIk1haW4xMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluU3RpbGw6ICAgICAgICAgIHJldHVybiAiTWFpblN0aWxsIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6ICAgIHJldHVybiAiTWFpbjEwSERSMTBQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOwpAQCAtMTgzLDYgKzQ2OCwzOCBAQAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MiA9IDB4MTAwMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjIgPSAweDIwMDAwMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDE6ICAgIHJldHVybiAiTWFpbiAxIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDE6ICAgIHJldHVybiAiSGlnaCAxIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDI6ICAgIHJldHVybiAiTWFpbiAyIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDI6ICAgIHJldHVybiAiSGlnaCAyIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDIxOiAgIHJldHVybiAiTWFpbiAyLjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMjE6ICAgcmV0dXJuICJIaWdoIDIuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzOiAgICByZXR1cm4gIk1haW4gMyI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwzOiAgICByZXR1cm4gIkhpZ2ggMyI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzMTogICByZXR1cm4gIk1haW4gMy4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDMxOiAgIHJldHVybiAiSGlnaCAzLjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDogICAgcmV0dXJuICJNYWluIDQiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNDogICAgcmV0dXJuICJIaWdoIDQiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDE6ICAgcmV0dXJuICJNYWluIDQuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw0MTogICByZXR1cm4gIkhpZ2ggNC4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDU6ICAgIHJldHVybiAiTWFpbiA1IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDU6ICAgIHJldHVybiAiSGlnaCA1IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDUxOiAgIHJldHVybiAiTWFpbiA1LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTE6ICAgcmV0dXJuICJIaWdoIDUuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1MjogICByZXR1cm4gIk1haW4gNS4yIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDUyOiAgIHJldHVybiAiSGlnaCA1LjIiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjogICAgcmV0dXJuICJNYWluIDYiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjogICAgcmV0dXJuICJIaWdoIDYiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjE6ICAgcmV0dXJuICJNYWluIDYuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2MTogICByZXR1cm4gIkhpZ2ggNi4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDYyOiAgIHJldHVybiAiTWFpbiA2LjIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjI6ICAgcmV0dXJuICJIaWdoIDYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyID0gMHg0OwpAQCAtMTk0LDYgKzUxMSwyMiBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ID0gMHgxMDA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgPSAweDIwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvblByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlcjogcmV0dXJuICJEdmF2UGVyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuOiByZXR1cm4gIkR2YXZQZW4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXI6IHJldHVybiAiRHZoZURlciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbjogcmV0dXJuICJEdmhlRGVuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyOiByZXR1cm4gIkR2aGVEdHIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG46IHJldHVybiAiRHZoZVN0biI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aDogcmV0dXJuICJEdmhlRHRoIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiOiByZXR1cm4gIkR2aGVEdGIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdDogIHJldHVybiAiRHZoZVN0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2U6ICByZXR1cm4gIkR2YXZTZSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDI0ICAgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMzAgICAgPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMjQgICA9IDB4NDsKQEAgLTIwNCwxMCArNTM3LDM0IEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNDggICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNjAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEhkMjQ6ICByZXR1cm4gIkhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxIZDMwOiAgcmV0dXJuICJIZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkMjQ6IHJldHVybiAiRmhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMDogcmV0dXJuICJGaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDYwOiByZXR1cm4gIkZoZDYwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMjQ6IHJldHVybiAiVWhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMDogcmV0dXJuICJVaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDQ4OiByZXR1cm4gIlVoZDQ4IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNjA6IHJldHVybiAiVWhkNjAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DQlIgPSAyOwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NRID0gMDsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9WQlIgPSAxOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0JpdHJhdGVNb2RlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DQlI6ICByZXR1cm4gIkNCUiI7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX0NROiAgIHJldHVybiAiQ1EiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9WQlI6ICByZXR1cm4gIlZCUiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCAgICAgICAgICAgICA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1ICAgICAgICAgICA9IDU7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0ICAgICAgICAgICA9IDQ7CkBAIC0yNjEsNiArNjE4LDY0IEBACiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICA9IDB4N2ZhMzBjMDA7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3ZjAwMDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Db2xvckZvcm1hdChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NDogICAgICAgICAgICAgICByZXR1cm4gIjEyYml0UkdCNDQ0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1OiAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QVJHQjE1NTUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQ6ICAgICAgICAgICAgIHJldHVybiAiMTZiaXRBUkdCNDQ0NCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRCR1I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdEJHUjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdFJHQjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NTogICAgICAgICAgICAgcmV0dXJuICIxOGJpdEFSR0IxNjY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Qml0QkdSNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Yml0UkdCNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2OiAgICAgICAgICAgICByZXR1cm4gIjE5Yml0QVJHQjE2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjY6ICAgICAgICAgICAgIHJldHVybiAiMjRCaXRBQkdSNjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NzogICAgICAgICAgICAgcmV0dXJuICIyNGJpdEFSR0IxODg3IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2OiAgICAgICAgICAgICByZXR1cm4gIjI0Qml0QVJHQjY2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRCR1I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRSR0I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODg6ICAgICAgICAgICAgIHJldHVybiAiMjViaXRBUkdCMTg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFCR1I4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QVJHQjg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRCR1JBODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMjogICAgICAgICAgICAgICAgcmV0dXJuICI4Yml0UkdCMzMyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDYllDclk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNiWUNyWSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q3JZQ2JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDcllDYlkiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwxNjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDE2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyNCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDMyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMzIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw4OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdE1vbm9jaHJvbWU6ICAgICAgICAgICAgICAgIHJldHVybiAiTW9ub2Nocm9tZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdDogICAgICAgICAgICAgcmV0dXJuICJSYXdCYXllcjEwYml0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQ6ICAgICAgICAgICAgICByZXR1cm4gIlJhd0JheWVyOGJpdCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZDogICAgcmV0dXJuICJSYXdCYXllcjhiaXRjb21wcmVzc2VkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6ICAgICAgICAgICAgICByZXR1cm4gIlJHQkFGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6ICAgICAgICAgICAgICAgcmV0dXJuICJSR0JGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJTdXJmYWNlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZQ2JZQ3I6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIllDYllDciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WUNyWUNiOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZQ3JZQ2IiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDExUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQxMVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjBQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjJQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIyUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOiAgICAgcmV0dXJuICJRQ09NX1lVVjQyMFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6IHJldHVybiAiVElfWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfSW50cmFSZWZyZXNoW10gPSAiaW50cmEtcmVmcmVzaCI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1BhcnRpYWxGcmFtZVtdID0gInBhcnRpYWwtZnJhbWUiOwpAQCAtMjcwLDYgKzY4NSw3IEBACiAvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVjFbXSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWQ1tdID0gInZpZGVvL2F2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IRVZDW10gPSAidmlkZW8vaGV2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHNFtdID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzI3LDYgKzc0Myw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CkBAIC0zMzUsNiArNzUyLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9TVEFOREFSRFtdID0gImNvbG9yLXN0YW5kYXJkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9UUkFOU0ZFUltdID0gImNvbG9yLXRyYW5zZmVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT01QTEVYSVRZW10gPSAiY29tcGxleGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEW10gPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9EVVJBVElPTltdID0gImR1cmF0aW9uVXMiOwogY29uc3RleHByIGNoYXIgS0VZX0ZFQVRVUkVfW10gPSAiZmVhdHVyZS0iOwogY29uc3RleHByIGNoYXIgS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUxbXSA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKQEAgLTM0Miw2ICs3NjAsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7CiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hEUjEwX1BMVVNfSU5GT1tdID0gImhkcjEwLXBsdXMtaW5mbyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSEVJR0hUW10gPSAiaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JX0ZSQU1FX0lOVEVSVkFMW10gPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0RbXSA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CkBAIC0zNTQsOCArNzczLDEwIEBACiBjb25zdGV4cHIgY2hhciBLRVlfTEFURU5DWVtdID0gImxhdGVuY3kiOwogY29uc3RleHByIGNoYXIgS0VZX0xFVkVMW10gPSAibGV2ZWwiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9CSVRfUkFURVtdID0gIm1heC1iaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSW10gPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1dJRFRIW10gPSAibWF4LXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NSU1FW10gPSAibWltZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CkBAIC00MTAsOCArODMxLDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRVtdID0gInRpbWUtb2Zmc2V0LXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAicmVxdWVzdC1zeW5jIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORFtdID0gImRyb3AtaW5wdXQtZnJhbWVzIjsKK2NvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FW10gPSAiZHJvcC1zdGFydC10aW1lLXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggNTlmNTdjNy4uZjUzYjIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtNDgsNiArNDgsMTMgQEAKICAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KICAgICAgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgLyoqCisgICAgICogRmluZCBhbiBleGlzdGluZyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBjb2RlYyBuYW1lIGFuZCByZXR1cm4gYQorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm91bmQgYWRkZWQgYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGlmIGZvdW5kLCBvciBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpjb2RlY05hbWUpOwogcHJpdmF0ZToKICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDZhNWM2YjYuLjA5NjM5ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTcwLDcgKzcwLDEyIEBACiAgICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTiAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKIAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLmVhODc5NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDEwIEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMjYgKzM1LDI2IEBACiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CiAgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRleCBnUGx1Z2luTXV0ZXg7Ci0gICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CiAgICAgc3RhdGljIGJvb2wgZ1BsdWdpbnNSZWdpc3RlcmVkOworICAgIHN0YXRpYyBib29sIGdJZ25vcmVWZXJzaW9uOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9ycygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvKiBkbGV4dGluZm8sCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKIAotICAgIHN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgc25pZmYoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCi0gICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogCi0gICAgc3RhdGljIHZvaWQgVXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKTsKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKaW5kZXggZmUwZTYxMy4uYWNhYTZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0xOSw1MCArMTksMjEgQEAKICNkZWZpbmUgTUVESUFfSFRUUF9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAotc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIENsZWFyTWVkaWFIVFRQIHsKICAgICBNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKLSAgICBBU3RyaW5nIG1MYXN0VVJJOwotCi0gICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOwotICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA2NmY0ZDcyLi42OWQ2Y2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICAgICAgID0gMSwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAgICA9IDIsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfSEVJRiAgICAgICAgPSAzLAorICAgICAgICBPVVRQVVRfRk9STUFUX09HRyAgICAgICAgID0gNCwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxNjBmOGQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZTEyMTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MDdhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FVEFfREFUQV9CQVNFX0hfCisKKyNkZWZpbmUgTUVUQV9EQVRBX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorZW51bSB7CisgICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZworICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKKyAgICBrS2V5RGlzcGxheVdpZHRoICAgICAgPSAnZFdpZCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlEaXNwbGF5SGVpZ2h0ICAgICA9ICdkSGd0JywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCisgICAga0tleVNBUldpZHRoICAgICAgICAgID0gJ3NhclcnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gd2lkdGgKKyAgICBrS2V5U0FSSGVpZ2h0ICAgICAgICAgPSAnc2FySCcsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyBoZWlnaHQKKyAgICBrS2V5VGh1bWJuYWlsV2lkdGggICAgPSAndGhiVycsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgd2lkdGgKKyAgICBrS2V5VGh1bWJuYWlsSGVpZ2h0ICAgPSAndGhiSCcsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgaGVpZ2h0CisKKyAgICAvLyBhIHJlY3RhbmdsZSwgaWYgYWJzZW50IGFzc3VtZWQgdG8gYmUgKDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKKyAgICBrS2V5Q3JvcFJlY3QgICAgICAgICAgPSAnY3JvcCcsCisKKyAgICBrS2V5Um90YXRpb24gICAgICAgICAgPSAncm90QScsICAvLyBpbnQzMl90IChhbmdsZSBpbiBkZWdyZWVzKQorICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKKyAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90CisgICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbE1hc2sgICAgICAgPSAnY2hubScsICAvLyBpbnQzMl90CisgICAga0tleVNhbXBsZVJhdGUgICAgICAgID0gJ3NydGUnLCAgLy8gaW50MzJfdCAoYXVkaW8gc2FtcGxpbmcgcmF0ZSBIeikKKyAgICBrS2V5UGNtRW5jb2RpbmcgICAgICAgPSAnUENNZScsICAvLyBpbnQzMl90IChhdWRpbyBlbmNvZGluZyBlbnVtKQorICAgIGtLZXlGcmFtZVJhdGUgICAgICAgICA9ICdmcm1SJywgIC8vIGludDMyX3QgKHZpZGVvIGZyYW1lIHJhdGUgZnBzKQorICAgIGtLZXlCaXRSYXRlICAgICAgICAgICA9ICdicnRlJywgIC8vIGludDMyX3QgKGJwcykKKyAgICBrS2V5TWF4Qml0UmF0ZSAgICAgICAgPSAnbXhCcicsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleUJpdHNQZXJTYW1wbGUgICAgID0gJ2JpdHMnLCAgLy8gaW50MzJfdCAoYml0cyBwZXIgc2FtcGxlKQorICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CisgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlBVjFDICAgICAgICAgICAgICA9ICdhdjFjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQorICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKKyAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQorICAgIGtLZXlGbGFjTWV0YWRhdGEgICAgICA9ICdmbE1kJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZwOUNvZGVjUHJpdmF0ZSAgID0gJ3ZwOXAnLCAgLy8gcmF3IGRhdGEgKHZwOSBjc2QgaW5mb3JtYXRpb24pCisgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlJc011eGVyRGF0YSAgICAgICA9ICdtdXhkJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleURlY29kaW5nVGltZSAgICAgID0gJ2RlY1QnLCAgLy8gaW50NjRfdCAoZGVjb2RpbmcgdGltZXN0YW1wIGluIHVzZWNzKQorICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQorICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAorICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKKyAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCisgICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAorICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKKyAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCisgICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAorICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKKyAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCisgICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorCisgICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZworICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCisgICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZworICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCisgICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZworICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQorICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCisgICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZworICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCisgICAga0tleUNvbXBpbGF0aW9uICAgICAgID0gJ2NwaWwnLCAgLy8gY3N0cmluZworICAgIGtLZXlMb2NhdGlvbiAgICAgICAgICA9ICdsb2MgJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5VGltZVNjYWxlICAgICAgICAgPSAndG1zbCcsICAvLyBpbnQzMl90CisgICAga0tleUNhcHR1cmVGcmFtZXJhdGUgID0gJ2NhcEYnLCAgLy8gZmxvYXQgKGNhcHR1cmUgZnBzKQorCisgICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKKyAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90CisgICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAorICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKKworICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZworICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKKyAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgorICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKKworICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKKyAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCisgICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAorCisgICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5TnVtQnVmZmVycyAgICAgICAgPSAnbmJiZicsICAvLyBpbnQzMl90CisKKyAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KKyAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQorCisgICAga0tleVZhbGlkU2FtcGxlcyAgICAgID0gJ3ZhbEQnLCAgLy8gaW50MzJfdAorCisgICAga0tleUlzVW5yZWFkYWJsZSAgICAgID0gJ3VucmUnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KKyAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKKyAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUaGUgbWFudWZhY3R1cmVyIGNvZGUgZm9yIHRoaXMgbWVkaWEKKyAgICBrS2V5TWFudWZhY3R1cmVyICA9ICdtYW51JywgIC8vIGNzdHJpbmcKKworICAgIC8vIFRvIHN0b3JlIHRoZSB0aW1lZCB0ZXh0IGZvcm1hdCBkYXRhCisgICAga0tleVRleHRGb3JtYXREYXRhICAgID0gJ3RleHQnLCAgLy8gcmF3IGRhdGEKKworICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMgPSAnc2VjdScsICAvLyBib29sIChpbnQzMl90KQorCisgICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAorICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgorICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQorICAgIC8vIGZyYWdtZW50cywgaS5lLiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEgYWx0ZXJuYXRlLgorICAgIC8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBieSBjb252ZW50aW9uIHBsYWluIGRhdGEgKGlmIHRoYXQncyBub3QgdGhlCisgICAgLy8gY2FzZSwgc2ltcGx5IHNwZWNpZnkgcGxhaW4gZnJhZ21lbnQgc2l6ZSBvZiAwKS4KKyAgICAvLyBrS2V5RW5jcnlwdGVkU2l6ZXMgYW5kIGtLZXlQbGFpblNpemVzIGVhY2ggbWFwIHRvIGFuIGFycmF5IG9mCisgICAgLy8gc2l6ZV90IHZhbHVlcy4gVGhlIHN1bSB0b3RhbCBvZiBhbGwgc2l6ZV90IHZhbHVlcyBvZiBib3RoIGFycmF5cworICAgIC8vIG11c3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkYXRhIChpLmUuIE1lZGlhQnVmZmVyJ3MgcmFuZ2VfbGVuZ3RoKCkpLgorICAgIC8vIElmIGJvdGggYXJyYXlzIGFyZSBwcmVzZW50LCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAvLyBJZiBvbmx5IGVuY3J5cHRlZCBzaXplcyBhcmUgcHJlc2VudCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsCisgICAgLy8gcGxhaW4gc2l6ZXMgYXJlIDAsIGkuZS4gYWxsIGZyYWdtZW50cyBhcmUgZW5jcnlwdGVkLgorICAgIC8vIFRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZXNlIGFycmF5LCB1c2UgdGhlIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSBBUEksIGkuZS4KKyAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKKyAgICAvLyBtZXRhLT5zZXREYXRhKAorICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOworICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgorICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCisgICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KKyAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCisgICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAorCisgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CisKKyAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVByaXZhdGVEYXRhICAgICA9ICdjYWRjJywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrID0gJ2NibGsnLCAgLy8gdWludDhfdAorICAgIGtLZXlTa2lwQnl0ZUJsb2NrICAgICA9ICdzYmxrJywgIC8vIHVpbnQ4X3QKKworICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QuCisgICAga0tleVRyYWNrSXNBdXRvc2VsZWN0ID0gJ2F1dG8nLCAvLyBib29sIChpbnQzMl90KQorICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQuCisgICAga0tleVRyYWNrSXNEZWZhdWx0ICAgID0gJ2RmbHQnLCAvLyBib29sIChpbnQzMl90KQorICAgIC8vIFNpbWlsYXIgdG8gTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSBidXQgcGVydGFpbnMgdG8gYXYgdHJhY2tzIGFzIHdlbGwuCisgICAga0tleVRyYWNrSXNGb3JjZWQgICAgID0gJ2ZyY2QnLCAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gSDI2NCBzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24gb2Zmc2V0cy9zaXplcworICAgIGtLZXlTRUkgICAgICAgICAgICAgICA9ICdzZWkgJywgLy8gcmF3IGRhdGEKKworICAgIC8vIE1QRUcgdXNlciBkYXRhIG9mZnNldHMKKyAgICBrS2V5TXBlZ1VzZXJEYXRhICAgICAgPSAnbXB1ZCcsIC8vIHNpemVfdFtdCisKKyAgICAvLyBIRFIgcmVsYXRlZAorICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCisgICAga0tleUhkcjEwUGx1c0luZm8gICAgPSAnaGRyRCcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBjb2xvciBhc3BlY3RzCisgICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQorICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcworICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCisgICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgorICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQorICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAorCisgICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAorICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0CisgICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCisgICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCisgICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCisgICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQorICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKKyAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAorICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQorICAgIGtLZXlFeGlmVGlmZk9mZnNldCAgID0gJ3RoZHInLCAvLyBpbnQzMl90LCBpZiA+IDAsIGJ1ZmZlciBjb250YWlucyBleGlmIGRhdGEgYmxvY2sgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aWZmIGhkciBhdCBzcGVjaWZpZWQgb2Zmc2V0CisgICAga0tleVBjbUJpZ0VuZGlhbiAgICAgPSAncGNtYicsIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBLZXkgZm9yIEFMQUMgTWFnaWMgQ29va2llCisgICAga0tleUFsYWNNYWdpY0Nvb2tpZSAgPSAnYWxtYycsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBBQy00IEF1ZGlvUHJlc2VudGF0aW9uSW5mbworICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gPSAnYXVkUCcsICAvLyByYXcgZGF0YQorfTsKKworZW51bSB7CisgICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKKyAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAorICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCisgICAga1R5cGVBVjFDICAgICAgICA9ICdhdjFjJywKKyAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAorfTsKKworZW51bSB7CisgICAga0NyeXB0b01vZGVVbmVuY3J5cHRlZCA9IDAsCisgICAga0NyeXB0b01vZGVBZXNDdHIgICAgICA9IDEsCisgICAga0NyeXB0b01vZGVBZXNDYmMgICAgICA9IDIsCit9OworCitjbGFzcyBQYXJjZWw7CisKK2NsYXNzIE1ldGFEYXRhQmFzZSB7CitwdWJsaWM6CisgICAgTWV0YURhdGFCYXNlKCk7CisgICAgTWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSk7CisgICAgTWV0YURhdGFCYXNlJiBvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIH5NZXRhRGF0YUJhc2UoKTsKKworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCisgICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCisgICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCisgICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCisgICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCisgICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCisgICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCisgICAgfTsKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOworCisgICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKKyAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7CisKKyAgICBib29sIHNldFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAorICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworCisgICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0OworCisgICAgYm9vbCBmaW5kUmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKKyAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OworCisgICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yOworICAgIGZyaWVuZCBjbGFzcyBNZXRhRGF0YTsKKworICAgIHN0cnVjdCB0eXBlZF9kYXRhOworICAgIHN0cnVjdCBSZWN0OworICAgIHN0cnVjdCBNZXRhRGF0YUludGVybmFsOworICAgIE1ldGFEYXRhSW50ZXJuYWwgKm1JbnRlcm5hbERhdGE7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7CisgICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAppbmRleCBkNWE4MDgwLi5kY2FmMjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaApAQCAtMjAsMTMgKzIwLDI0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCiAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRVRBX0RBVEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTRhNzA5NS4uZjM0ZjliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTY0LDggKzY1LDYgQEAKIAogICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCi0gICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0KICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwogCkBAIC05Nyw2ICs5Niw4IEBACiAKICAgICBib29sIGdldENhY2hlZER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1ByZXNlbnRhdGlvbnMoc2l6ZV90IHRyYWNrSWR4LCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVNZWRpYUV4dHJhY3RvcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgzN2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPR0dfV1JJVEVSX0hfCisKKyNkZWZpbmUgT0dHX1dSSVRFUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9nZ1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CisgICAgT2dnV3JpdGVyKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEqIHBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB+T2dnV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbVNhbXBsZVJhdGU7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbUVzdGltYXRlZER1cmF0aW9uVXM7CisKKyAgICBzdGF0aWMgdm9pZCogVGhyZWFkV3JhcHBlcih2b2lkKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBpbnQzMl90IG1DdXJyZW50UGFja2V0SWQ7CisgICAgT2dnU3RyZWFtU3RhdGUqIG1PcyA9IG51bGxwdHI7CisKKyAgICBPZ2dXcml0ZXIoY29uc3QgT2dnV3JpdGVyJik7CisgICAgT2dnV3JpdGVyJiBvcGVyYXRvcj0oY29uc3QgT2dnV3JpdGVyJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9HR19XUklURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAppbmRleCAyOGY2MDk0Li4xNDEwYTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0yMyw4ICsyMywxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtQWxsb3dTdXJmYWNlRW5jb2RlcnM7IC8vIGFsbG93IHN1cmZhY2UgZW5jb2RlcnMKKwogcHVibGljOgotICAgIE9teEluZm9CdWlsZGVyKCk7CisgICAgZXhwbGljaXQgT214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycyk7CiAgICAgfk9teEluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA2YTI4ZTBiLi5lOGUwYTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwpAQCAtNTAsNiArNTIsMTAgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbnNlY3NfdCBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbnNlY3NfdCBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA3NDUyOTAxLi4xNDgyMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NiwxMiArNDYsMTMgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKK3R5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7Cit0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMTE3LDE1ICsxMTgsMTIgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKKyAgICB1aW50MzJfdCBtUE1UVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtUE1UX0NSQzsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOwpAQCAtMTQyLDE1ICsxNDAsMTUgQEAKIH07CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpOworICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKTsKIAogICAgIHVuc2lnbmVkIHR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHVuc2lnbmVkIHR5cGVFeHQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZUV4dDsgfQogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CisgICAgdm9pZCBzZXRBdWRpb1ByZXNlbnRhdGlvbnMoQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIGF1ZGlvUHJlc2VudGF0aW9ucykgeworICAgICAgICBtQXVkaW9QcmVzZW50YXRpb25zID0gYXVkaW9QcmVzZW50YXRpb25zOworICAgIH0KIAogICAgIHZvaWQgc2V0Q2FzSW5mbygKICAgICAgICAgICAgIGludDMyX3Qgc3lzdGVtSWQsCkBAIC0xOTQsNiArMTkyLDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC0yMTAsMTMgKzIwOSwxNiBAQAogICAgIGJvb2wgbVNjcmFtYmxlZDsKICAgICBib29sIG1TYW1wbGVFbmNyeXB0ZWQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwotICAgIHNwPElNZW1vcnk+IG1NZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRBbGxvY2F0b3I+IG1IaWRsQWxsb2NhdG9yOwogICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKworICAgIC8vIFNlbmQgYXVkaW8gcHJlc2VudGF0aW9ucyBhbG9uZyB3aXRoIGFjY2VzcyB1bml0cy4KKyAgICB2b2lkIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKICAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYwpAQCAtMjk5LDYgKzMwMSw4IEBACiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAorICAgICAgbVBNVFZlcnNpb24oMHhmZmZmZmZmZiksCisgICAgICBtUE1UX0NSQygweGZmZmZmZmZmKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSwKICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBpbmZvTGVuZ3RoKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gOSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOwpAQCAtNDg2LDcgKzQ5MCwxMyBAQAogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7Ci0gICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoNSkpOworICAgIGJvb2wgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIHBtdFZlcnNpb24gPSBici0+Z2V0Qml0cyg1KTsKKyAgICBpZiAocG10VmVyc2lvbiAhPSBtUE1UVmVyc2lvbikgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVFZlcnNpb24gPSBwbXRWZXJzaW9uOworICAgIH0KKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBwbXRWZXJzaW9uKTsKICAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKICAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CiAgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CkBAIC01MTMsNDMgKzUyMywxNjYgQEAKICAgICAvLyBpbmZvQnl0ZXNSZW1haW5pbmcgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlCiAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gb2YgRVNfaW5mb3MuIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgICAgLy8gZmluYWwgQ1JDLgotICAgIHNpemVfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKKyAgICBpbnQzMl90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCiAgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7Ci0KLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7Ci0KKyAgICAgICAgU3RyZWFtSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UeXBlID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBpbmZvLm1UeXBlKTsKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygzKSk7CiAKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKLSAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGVsZW1lbnRhcnlQSUQpOworICAgICAgICBpbmZvLm1QSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBpbmZvLm1QSUQpOwogCiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOwogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAKICAgICAgICAgQ0FEZXNjcmlwdG9yIHN0cmVhbUNBOwotICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmluZENBRGVzY3JpcHRvcihiciwgRVNfaW5mb19sZW5ndGgsICZzdHJlYW1DQSk7CisgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYOworCisgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5jbGVhcigpOworICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChFU19pbmZvX2xlbmd0aCA+IDIgJiYgaW5mb0J5dGVzUmVtYWluaW5nID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnID0gMHglMDJ4IiwgZGVzY3JpcHRvcl90YWcpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIGxlbiA9ICV1IiwgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSAyOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gRVNfaW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCAtPSA0OworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1Qcml2YXRlRGF0YS5hc3NpZ24oYnItPmRhdGEoKSwgYnItPmRhdGEoKSArIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5tVHlwZSA9PSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjVGFnRXh0ID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZ19leHQgPSAweCUwMngiLCBkZXNjVGFnRXh0KTsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aC0tOworICAgICAgICAgICAgICAgIC8vIFRoZSBBQzQgZGVzY3JpcHRvciBpcyB1c2VkIGluIHRoZSBQU0kgUE1UIHRvIGlkZW50aWZ5IHN0cmVhbXMgd2hpY2ggY2FycnkgQUM0CisgICAgICAgICAgICAgICAgLy8gYXVkaW8uCisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTEwCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9wcmVzZWxlY3Rpb25zID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcHJlc2VsZWN0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBici0+Z2V0Qml0cyg1KTsgIC8vIHByZXNlbGVjdGlvbl9pZAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpb19yZW5kZXJpbmdfaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBzdGF0aWNfY2FzdDxNYXN0ZXJpbmdJbmRpY2F0aW9uPihici0+Z2V0Qml0cygzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAlZCIsIGludGVyYWN0aXZpdHlfZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFuZ3VhZ2VfY29kZV9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X2xhYmVsX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnV0dXJlX2V4dGVuc2lvbiA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZV9jb2RlX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMV0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsyXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBTdHJpbmc4KGxhbmd1YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXBzIHRoZSBwcmVzZW50YXRpb24gaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFWFRfREVTQ1JJUFRPUl9EVkJfTUVTU0FHRSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHByZXNlbnRhdGlvbiBsYWJlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xhYmVsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lc3NhZ2VfaWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBtZXNzYWdlX2lkID0gJXUiLCBtZXNzYWdlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hdXhfY29tcG9uZW50cyA9IGJyLT5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyg1KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKG51bV9hdXhfY29tcG9uZW50cyAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhudW1fYXV4X2NvbXBvbmVudHMgKiA4KTsgIC8vIGNvbXBvbmVudF90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmVfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCk7ICAvLyBmdXR1cmVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChoYXNTdHJlYW1DQSAmJiAhbVBhcnNlci0+bUNhc01hbmFnZXItPmFkZFN0cmVhbSgKLSAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgZWxlbWVudGFyeVBJRCwgc3RyZWFtQ0EpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGluZm8ubVBJRCwgc3RyZWFtQ0EpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIFN0cmVhbUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGluZm8ubVBJRCA9IGVsZW1lbnRhcnlQSUQ7Ci0gICAgICAgIGluZm8ubUNBU3lzdGVtSWQgPSBoYXNQcm9ncmFtQ0EgPyBwcm9ncmFtQ0EubVN5c3RlbUlEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID8gc3RyZWFtQ0EubVN5c3RlbUlEICA6IC0xOwotICAgICAgICBpbmZvcy5wdXNoKGluZm8pOworICAgICAgICBpZiAoaGFzUHJvZ3JhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBwcm9ncmFtQ0E7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzU3RyZWFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHN0cmVhbUNBOworICAgICAgICB9CiAKLSAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKICAgICB9CiAKICAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKICAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKICAgICB9Ci0gICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworICAgIHVuc2lnbmVkIGNyYyA9IGJyLT5nZXRCaXRzKDMyKTsKKyAgICBpZiAoY3JjICE9IG1QTVRfQ1JDKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UX0NSQyA9IGNyYzsKKyAgICB9CisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBjcmMpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKQEAgLTYwMSwxNiArNzM0LDE5IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGluZm8ubVBJRCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIFBDUl9QSUQsIGluZm8ubUNBU3lzdGVtSWQpOworICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXMsIFBDUl9QSUQsIGluZm8pOwogCiAgICAgICAgICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHN0cmVhbS0+c2lnbmFsTmV3U2FtcGxlQWVzS2V5KG1TYW1wbGVBZXNLZXlJdGVtKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FTeXN0ZW1JZCA+PSAwOworICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwOwogICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGluZm8ubVBJRCwgc3RyZWFtKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbmRleCA+PSAwICYmIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+aXNBdWRpbygpCisgICAgICAgICAgICAgICAgICYmIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTcxNywzNCArODUzLDMzIEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0oCi0gICAgICAgIFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKQorICAgICAgICBQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKQogICAgIDogbVByb2dyYW0ocHJvZ3JhbSksCi0gICAgICBtRWxlbWVudGFyeVBJRChlbGVtZW50YXJ5UElEKSwKLSAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAorICAgICAgbUVsZW1lbnRhcnlQSUQoaW5mby5tUElEKSwKKyAgICAgIG1TdHJlYW1UeXBlKGluZm8ubVR5cGUpLAorICAgICAgbVN0cmVhbVR5cGVFeHQoaW5mby5tVHlwZUV4dCksCiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSwKLSAgICAgIG1TY3JhbWJsZWQoQ0Ffc3lzdGVtX0lEID49IDApIHsKLQorICAgICAgbVNjcmFtYmxlZChpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDApLAorICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpIHsKICAgICBtU2FtcGxlRW5jcnlwdGVkID0KICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRCAgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDsKIAogICAgIEFMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4LCBzY3JhbWJsZWQgJWQsIFNhbXBsZUVuY3J5cHRlZDogJWQiLAotICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CisgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOwogCi0gICAgdWludDMyX3QgZmxhZ3MgPQotICAgICAgICAgICAgKGlzVmlkZW8oKSAmJiBtU2NyYW1ibGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YSA6Ci0gICAgICAgICAgICAobVNhbXBsZUVuY3J5cHRlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGEgOgotICAgICAgICAgICAgMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKCgoaXNWaWRlbygpIHx8IGlzQXVkaW8oKSkgJiYgbVNjcmFtYmxlZCkpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGE7CisgICAgfSBlbHNlIGlmIChtU2FtcGxlRW5jcnlwdGVkKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhOworICAgIH0KIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpJTlZBTElEOwogCkBAIC03ODEsMTMgKzkxNiwyMyBAQAogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFQUMzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1FVEFEQVRBOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0gUElEIDB4JTAyeCBoYXMgaW52YWxpZCBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTgwNyw3ICs5NTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaXNBdWRpbygpID8gTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCk7CiAgICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIENBX3N5c3RlbV9JRCk7CisgICAgICAgICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBpbmZvLm1DQURlc2NyaXB0b3I7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgZGVzY3JpcHRvci5tU3lzdGVtSUQpOworCisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLnNpemUoKSk7CisKICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgyNywxNiArOTc4LDQzIEBACiAgICAgICAgICAgICBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+Y2FwYWNpdHkoKSwgbmVlZGVkU2l6ZSwgbVNjcmFtYmxlZCk7CiAKICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIsIG5ld1NjcmFtYmxlZEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBuZXdNZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBuZXdEZWFsZXI7CisgICAgc3A8VE1lbW9yeT4gbmV3TWVtOwogICAgIGlmIChtU2NyYW1ibGVkKSB7Ci0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCi0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKLSAgICAgICAgbmV3RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZWVkZWRTaXplLCAiQVRTUGFyc2VyIik7Ci0gICAgICAgIG5ld01lbSA9IG5ld0RlYWxlci0+YWxsb2NhdGUobmVlZGVkU2l6ZSk7Ci0gICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+cG9pbnRlcigpLCBuZXdNZW0tPnNpemUoKSk7CisgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtSGlkbEFsbG9jYXRvciA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gY2FuJ3QgZ2V0IGhpZGwgYWxsb2NhdG9yIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfbWVtb3J5IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gbUhpZGxBbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG5lZWRlZFNpemUsCisgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSB0cmFuc3BvcnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld01lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICBpZiAobmV3TWVtID09IG51bGxwdHIgfHwgbmV3TWVtLT5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgZmFpbGVkIHRvIG1hcCBtZW1vcnkiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPmdldFBvaW50ZXIoKSwgbmV3TWVtLT5nZXRTaXplKCkpOwogCiAgICAgICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG5ld1NjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLApAQCAtODQ1LDI0ICsxMDIzLDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICB9Ci0gICAgICAgIG1NZW0gPSBuZXdNZW07Ci0gICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CisgICAgICAgIG1IaWRsTWVtb3J5ID0gbmV3TWVtOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CiAKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9IDBVTEw7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gICh1aW50NjRfdCluZWVkZWRTaXplOwogCi0gICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKLQotICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG5lZWRlZFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTk4Niw5ICsxMTU1LDEyIEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRDoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0Nyw3ICsxNTE5LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1NZW0gPT0gTlVMTCkgeworICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtSGlkbE1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBzY3JhbWJsZWQgcGFja2V0cyB3aXRob3V0IHNoYXJlZCBtZW1vcnkhIik7CiAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzk1LDcgKzE1NjcsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNTg0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTYwMiw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NDIsMTcgKzE2MTMsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOwogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMiLAotICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE2NDcsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNjU2LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1MTQsNiArMTcxMSwxMyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMobUF1ZGlvUHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgc3A8QUJ1ZmZlcj4gYXAgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkob3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBhcCk7Cit9CisKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCiAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sLApAQCAtMTU2NCw2ICsxNzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKQEAgLTE1NzYsNiArMTc4Myw5IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXVkaW9QcmVzZW50YXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGY5ZGNiYzkuLmE1MDdiOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTMwLDkgKzMwLDE0IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDY2ZDdkYzEuLjYyZTNhNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMjIzLDkgKzIyMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAwLCBtcGVnVXNlckRhdGEtPmRhdGEoKSwgbXBlZ1VzZXJEYXRhLT5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXA7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmYXApICYmIGFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgMCwgYXAtPmRhdGEoKSwgYXAtPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNyeXB0b01vZGU7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9Nb2RlIiwgJmNyeXB0b01vZGUpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGNyeXB0b0tleTsKKyAgICAgICAgICAgIGludDMyX3QgcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJCeXRlc0J1ZmZlciwgZW5jQnl0ZXNCdWZmZXI7CiAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b0tleSIsICZjcnlwdG9LZXkpKTsKQEAgLTIzMyw2ICsyNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjbGVhckJ5dGVzQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImVuY0J5dGVzIiwgJmVuY0J5dGVzQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAmJiBlbmNCeXRlc0J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInBlc09mZnNldCIsICZwZXNPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYmIChwZXNPZmZzZXQgPj0gMCkgJiYgKHBlc09mZnNldCA8IDY1NTM2KSk7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCkBAIC0yNDAsNiArMjQ5LDExIEBACiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBhcnJheVswXSA9ICh1aW50OF90KSAoY3J5cHRvS2V5ICYgMHhmZik7CisgICAgICAgICAgICAvLyBhcnJheVsxXSBjb250YWlucyBQRVMgaGVhZGVyIGZsYWcsIHdoaWNoIHdlIGRvbid0IHVzZS4KKyAgICAgICAgICAgIC8vIGFycmF5WzJ+M10gY29udGFpbiB0aGUgUEVTIG9mZnNldC4KKyAgICAgICAgICAgIGFycmF5WzJdID0gKHVpbnQ4X3QpIChwZXNPZmZzZXQgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5WzNdID0gKHVpbnQ4X3QpICgocGVzT2Zmc2V0ID4+IDgpICYgMHhmZik7CisKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCBjOWU1MTlmLi5iOTFlZGNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTg2LDYgKzg2LDIxIEBACiAgICAgbUNhc1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAorc3RhdGljIGludDMyX3QgcmVhZFZhcmlhYmxlQml0cyhBQml0UmVhZGVyICZiaXRzLCBpbnQzMl90IG5iaXRzKSB7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW50MzJfdCBtb3JlX2JpdHMgPSAxOworCisgICAgd2hpbGUgKG1vcmVfYml0cykgeworICAgICAgICB2YWx1ZSArPSBiaXRzLmdldEJpdHMobmJpdHMpOworICAgICAgICBtb3JlX2JpdHMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgICAgIGlmICghbW9yZV9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIHZhbHVlIDw8PSBuYml0czsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCiAvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKIHN0YXRpYyB1bnNpZ25lZCBwYXJzZUFDM1N5bmNGcmFtZSgKQEAgLTE5NSw4ICsyMTAsMTUzIEBACiAgICAgcmV0dXJuIHBheWxvYWRTaXplOwogfQogCi1zdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCBOVUxMKSA+IDA7CisvLyBQYXJzZSBFQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAorLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCisvLyBBVFNDIEEvNTI6MjAxMiBFMi4zLjEKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZUVBQzNTeW5jRnJhbWUoCisgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZTJbXSA9IHsyNDAwMCwgMjIwNTAsIDE2MDAwfTsKKworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJpdHMuZ2V0Qml0cygxNikgIT0gMHgwQjc3KSB7CisgICAgICAgIEFMT0dFKCJObyB2YWxpZCBzeW5jIHdvcmQgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgcGFyc2UgdXAgdG8gYnNpZCBzbyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCB0aGF0IG1hbnkgYml0cworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyICsgMyArIDExICsgMiArIDIgKyAzICsgMSArIDUpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RybXR5cCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoc3RybXR5cCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3Qgc3RybXR5cCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdWJzdHJlYW1pZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAvLyBvbmx5IHRoZSBmaXJzdCBpbmRlcGVuZGVudCBzdHJlYW0gaXMgc3VwcG9ydGVkCisgICAgaWYgKChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSAmJiBzdWJzdHJlYW1pZCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGZybXNpeiA9IGJpdHMuZ2V0Qml0cygxMSk7CisgICAgdW5zaWduZWQgZnNjb2QgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGUgPSAwOworICAgIGlmIChmc2NvZCA9PSAweDMpIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QyID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QyID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgZnNjb2QyIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgfQorCisgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgYnNpZCA9IGJpdHMuZ2V0Qml0cyg1KTsKKyAgICBpZiAoYnNpZCA8IDExIHx8IGJzaWQgPiAxNikgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIENvdWxkIGJlIEFDLTMgb3Igc29tZSB1bmtub3duIEVBQzMgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IGluZGVwZW5kYW50IHN0cmVhbQorICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMICYmIChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoIkVBQzMgY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HVigiRUFDMyBzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gZnJtc2l6ICsgMTsKKyAgICBwYXlsb2FkU2l6ZSA8PD0gMTsgIC8vIGNvbnZlcnQgZnJvbSAxNi1iaXQgd29yZHMgdG8gYnl0ZXMKKworICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKK30KKworLy8gUGFyc2UgQUM0IGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lCisvLyBhbmQgdXBkYXRlIGZyYW1lU2l6ZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpLCBBbm5leCBDCisgICAgLy8gVGhlIHN5bmNfd29yZCBjYW4gYmUgZWl0aGVyIDB4QUM0MCBvciAweEFDNDEuCisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQwID0gMHhBQzQwOworICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MSA9IDB4QUM0MTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0gMDsKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpbnQzMl90IHN5bmNXb3JkID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBpZiAoKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDApICYmIChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQxKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzeW5jd29yZCBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGhlYWRlclNpemUgKz0gMjsKKworICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaGVhZGVyU2l6ZSArPSAyOworICAgIGlmIChmcmFtZVNpemUgPT0gMHhGRkZGKSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygyNCk7CisgICAgICAgIGhlYWRlclNpemUgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZyYW1lU2l6ZSArPSBoZWFkZXJTaXplOworICAgIC8vIElmIHRoZSBzeW5jX3dvcmQgaXMgMHhBQzQxLCBhIGNyY193b3JkIGlzIGFsc28gdHJhbnNtaXR0ZWQuCisgICAgaWYgKHN5bmNXb3JkID09IGtTeW5jV29yZEFDNDEpIHsKKyAgICAgICAgZnJhbWVTaXplICs9IDI7IC8vIGNyY193b3JkCisgICAgfQorICAgIEFMT0dWKCJBQzQgZnJhbWVTaXplID0gJXUiLCBmcmFtZVNpemUpOworCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xIDYuMi4xLjEKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1WZXJzaW9uID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChiaXRzdHJlYW1WZXJzaW9uID09IDMpIHsKKyAgICAgICAgYml0c3RyZWFtVmVyc2lvbiArPSByZWFkVmFyaWFibGVCaXRzKGJpdHMsIDIpOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoMTApOyAvLyBTZXF1ZW5jZSBDb3VudGVyCisKKyAgICB1aW50MzJfdCBiV2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICBpZiAoYldhaXRGcmFtZXMpIHsKKyAgICAgICAgdWludDMyX3Qgd2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAgICAgaWYgKHdhaXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBicl9jb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwIFYxLjEuMSBUYWJsZSA4MgorICAgIGJvb2wgZnNJbmRleCA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBmc0luZGV4ID8gNDgwMDAgOiA0NDEwMDsKKworICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEFDNCBTZXR0aW5nIG1Gb3JtYXQiKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgLy8gW0ZJWE1FXSBBQzQgY2hhbm5lbCBjb3VudCBpcyBkZWZpbmVkIHBlciBwcmVzZW50YXRpb24uIFByb3ZpZGUgYSBkZWZhdWx0IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gYXMgc3RlcmVvIGZvciB0aGUgZW50aXJlIHN0cmVhbS4KKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSkgeworICAgIHJldHVybiBwYXJzZUFDNFN5bmNGcmFtZShwdHIsIHNpemUsIGZyYW1lU2l6ZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBRFRTSGVhZGVyKApAQCAtMjc5LDcgKzQzOSw4IEBACiAgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworCisgICAgaWYgKCFpc1NjcmFtYmxlZCgpICYmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKICAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKQEAgLTM5MCwxMiArNTUxLDE5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgQUMzOgorICAgICAgICAgICAgY2FzZSBFQUMzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQwNiw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiAoRSlBQzMgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNiArNTg0LDQzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGksIGZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDNCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplICE9IHNpemUgLSBzdGFydE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQUM0IGZyYW1lIHNpemUgaXMgJXUgYnl0ZXMsIHdoaWxlIHRoZSBidWZmZXIgc2l6ZSBpcyAlemQgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzaXplIC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNDk0LDYgKzY5OSw3IEBACiAKIHZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgc3A8QUJ1ZmZlcj4gZW5jU2l6ZXMpIHsKICAgICBpZiAoIWlzU2NyYW1ibGVkKCkpIHsKQEAgLTUyMSw2ICs3MjcsNyBAQAogCiAgICAgU2NyYW1ibGVkUmFuZ2VJbmZvIHNjcmFtYmxlZEluZm87CiAgICAgc2NyYW1ibGVkSW5mby5tTGVuZ3RoID0gc2l6ZTsKKyAgICBzY3JhbWJsZWRJbmZvLm1MZWFkaW5nQ2xlYXJCeXRlcyA9IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHNjcmFtYmxlZEluZm8ubUtleUlkID0ga2V5SWQ7CiAgICAgc2NyYW1ibGVkSW5mby5tSXNTeW5jID0gaXNTeW5jOwogICAgIHNjcmFtYmxlZEluZm8ubUNsZWFyU2l6ZXMgPSBjbGVhclNpemVzOwpAQCAtNTMzLDcgKzc0MCw2IEBACiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKSB7CiAgICAgc2l6ZV90IG5leHRTY2FuID0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIGludDMyX3QgcGVzT2Zmc2V0ID0gMCwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPSAwOwogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4sICZwZXNPZmZzZXQsICZwZXNTY3JhbWJsaW5nQ29udHJvbCk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewpAQCAtNTQ0LDYgKzc1MCw3IEBACiAgICAgLy8gcmV0dXJuIHNjcmFtYmxlZCB1bml0CiAgICAgaW50MzJfdCBrZXlJZCA9IHBlc1NjcmFtYmxpbmdDb250cm9sLCBpc1N5bmMgPSAwLCBzY3JhbWJsZWRMZW5ndGggPSAwOwogICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIGVuY1NpemVzOworICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICB3aGlsZSAobVNjcmFtYmxlZFJhbmdlSW5mb3Muc2l6ZSgpID4gbVJhbmdlSW5mb3Muc2l6ZSgpKSB7CiAgICAgICAgIGF1dG8gaXQgPSBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZmV0Y2hpbmcgc2NyYW1ibGVkIHJhbmdlOiBzaXplPSV6dSIsIG1Nb2RlLCBpdC0+bUxlbmd0aCk7CkBAIC01NjEsNiArNzY4LDcgQEAKICAgICAgICAgY2xlYXJTaXplcyA9IGl0LT5tQ2xlYXJTaXplczsKICAgICAgICAgZW5jU2l6ZXMgPSBpdC0+bUVuY1NpemVzOwogICAgICAgICBpc1N5bmMgPSBpdC0+bUlzU3luYzsKKyAgICAgICAgbGVhZGluZ0NsZWFyQnl0ZXMgPSBpdC0+bUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5lcmFzZShpdCk7CiAgICAgfQogICAgIGlmIChzY3JhbWJsZWRMZW5ndGggPT0gMCkgewpAQCAtNTY4LDI2ICs3NzYsNzQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2tpcCB0aGUgUEVTIGhlYWRlciwgYW5kIGNvcHkgdGhlIHJlc3QgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKLSAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAotICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgcGVzT2Zmc2V0LAotICAgICAgICAgICAgc2NyYW1ibGVkTGVuZ3RoIC0gcGVzT2Zmc2V0KTsKLQotICAgIC8vIGZpeCB1cCBmaXJzdCBzYW1wbGUgc2l6ZSBhZnRlciBza2lwcGluZyB0aGUgUEVTIGhlYWRlcgotICAgIGlmIChwZXNPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0Q2xlYXJTaXplID0gKihpbnQzMl90KiljbGVhclNpemVzLT5kYXRhKCk7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0RW5jU2l6ZSA9ICooaW50MzJfdCopZW5jU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgLy8gQ3V0IGF3YXkgdGhlIFBFUyBoZWFkZXIKLSAgICAgICAgaWYgKGZpcnN0Q2xlYXJTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgVFMtbGV2ZWwgc2NyYW1ibGluZywgd2UgZGVzY3JhbWJsZWQgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAob3IgaXQgd2FzIGNsZWFyIHRvIGJlZ2luIHdpdGgpCi0gICAgICAgICAgICBmaXJzdENsZWFyU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbmNTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBiZSBQRVMtbGV2ZWwgc2NyYW1ibGluZwotICAgICAgICAgICAgZmlyc3RFbmNTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluZm8sIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBjbGVhcgorICAgIC8vIHJhbmdlIG9uIG1CdWZmZXIuIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmNsdWRlcyB0aGUKKyAgICAvLyBQRVMgaGVhZGVyIHBvcnRpb24sIHdoaWxlIG1CdWZmZXIgZG9lc24ndC4KKyAgICBpZiAoKGludDMyX3QpbGVhZGluZ0NsZWFyQnl0ZXMgPiBwZXNPZmZzZXQpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbGVhZGluZ0NsZWFyQnl0ZXMgLSBwZXNPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KIAorICAgIC8vIFRyeSB0byBwYXJzZSBmb3JtYXRzLCBhbmQgaWYgdW5hdmFpbGFibGUgc2V0IHVwIGEgZHVtbXkgZm9ybWF0LgorICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBzY3JhbWJsZWQgY29udGVudCBmb3Igbm93LgorICAgIC8vICh3aWxsIGJlIGV4cGFuZGVkIGxhdGVyKS4KKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBQUMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qcHJvZmlsZSovLCA3IC8qc2FtcGxpbmdfZnJlcV9pbmRleCovLCAxIC8qY2hhbm5lbF9jb25maWcqLyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIGZvciBzY3JhbWJsZWQgY29udGVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgMCwgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIGNvcHkgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKKyAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBzY3JhbWJsZWRMZW5ndGgpOworCiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBpZiAoaXNTeW5jKSB7CiAgICAgICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwpAQCAtNjAwLDYgKzg1Niw3IEBACiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3J5cHRvS2V5Iiwga2V5SWQpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJjbGVhckJ5dGVzIiwgY2xlYXJTaXplcyk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImVuY0J5dGVzIiwgZW5jU2l6ZXMpOworICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInBlc09mZnNldCIsIHBlc09mZnNldCk7CiAKICAgICBtZW1tb3ZlKG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHNjcmFtYmxlZExlbmd0aCwKQEAgLTYxNCw3ICs4NzEsMTEgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0ICYmICFpc1NjcmFtYmxlZCgpKSB7CisgICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7CisgICAgfQorCisgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCkgewogICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTY0OCw3ICs5MDksMTAgQEAKICAgICAgICAgY2FzZSBBQUM6CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKICAgICAgICAgY2FzZSBBQzM6Ci0gICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKTsKKyAgICAgICAgY2FzZSBFQUMzOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpOwogICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKQEAgLTY2NiwzNCArOTMwLDM4IEBACiAgICAgfQogfQogCi1zcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUMzKCkgeworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKSB7CiAgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3M7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKICAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CiAKICAgICAgICAgKytzeW5jU3RhcnRQb3M7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzMiKTsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEUvQUMzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzAxLDcgKzk2OSw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0KICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKQEAgLTcxMCw3ICs5NzcsMTIgQEAKIAogICAgIC8vIE5vdCBkZWNyeXB0aW5nIGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgaWYgKG1TYW1wbGVEZWNyeXB0b3IgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIEFVIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBtQVVJbmRleCsrOwogCkBAIC03MzAsNiArMTAwMiw2OSBAQAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUM0KCkgeworICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7CisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKworICAgICAgICArK3N5bmNTdGFydFBvczsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQVVJbmRleCsrOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisKKyAgICBtZW1tb3ZlKAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUsCisgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpIHsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg1MSwyNSArMTE4NiwxMSBAQAogICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlID09IDN1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOwotICAgICAgICAgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQotCiAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC04ODQsMTIgKzEyMDUsMTIgQEAKIAogICAgICAgICAgICAgQUxPR0koImZvdW5kIEFBQyBjb2RlYyBjb25maWcgKCVkIEh6LCAlZCBjaGFubmVscykiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAotICAgICAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCi0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCisgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQorICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKKwogICAgICAgICAvLyBhZHRzX3ZhcmlhYmxlX2hlYWRlcgogCiAgICAgICAgIC8vIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9iaXQsIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydApAQCAtMTAwNCwyNyArMTMyNSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKQEAgLTEzMjQsMjUgKzE2MjQsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBmZmNiNTAyLi4zMjI3ZjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICBIMjY0LAogICAgICAgICBBQUMsCiAgICAgICAgIEFDMywKKyAgICAgICAgRUFDMywKKyAgICAgICAgQUM0LAogICAgICAgICBNUEVHX0FVRElPLAogICAgICAgICBNUEVHX1ZJREVPLAogICAgICAgICBNUEVHNF9WSURFTywKQEAgLTU5LDYgKzYxLDcgQEAKIAogICAgIHZvaWQgYXBwZW5kU2NyYW1ibGVkRGF0YSgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICAgICAgaW50MzJfdCBrZXlJZCwgYm9vbCBpc1N5bmMsCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcyk7CiAKQEAgLTg0LDggKzg3LDggQEAKICAgICB9OwogCiAgICAgc3RydWN0IFNjcmFtYmxlZFJhbmdlSW5mbyB7Ci0gICAgICAgIC8vaW50NjRfdCBtVGltZXN0YW1wVXM7CiAgICAgICAgIHNpemVfdCBtTGVuZ3RoOworICAgICAgICBzaXplX3QgbUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBpbnQzMl90IG1LZXlJZDsKICAgICAgICAgaW50MzJfdCBtSXNTeW5jOwogICAgICAgICBzcDxBQnVmZmVyPiBtQ2xlYXJTaXplczsKQEAgLTExNSw3ICsxMTgsOCBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKLSAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCmluZGV4IDRlMmQzOTguLjEyMWJiMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKQEAgLTEyNCwxMSArMTI0LDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBxdWlyayA6IGNvZGVjLT5zZWNvbmQucXVpcmtTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgeworICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicXVpcms6OnJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAppbmRleCA0NDdhZjZmLi4yZTA0MWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcApAQCAtNjEsMTAgKzYxLDcgQEAKICAgICAgICAgcm9sZS5yb2xlID0gcm9sZVBhaXIuZmlyc3Q7CiAgICAgICAgIHJvbGUudHlwZSA9IHJvbGVQYWlyLnNlY29uZC50eXBlOwogICAgICAgICByb2xlLmlzRW5jb2RlciA9IHJvbGVQYWlyLnNlY29uZC5pc0VuY29kZXI7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluCi0gICAgICAgIC8vIHRoZSB4bWwgZmlsZS4gT25jZSB3ZSBoYXZlIGEgd2F5IHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiwgaXQKLSAgICAgICAgLy8gc2hvdWxkIGJlIHBhcnNlZCBwcm9wZXJseS4KLSAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZVBhaXIuZmlyc3QuY29tcGFyZSgwLCA1LCAiYXVkaW8iKSA9PSAwOworICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZCBhbmQgaWdub3JlZCwgdXNpbmcgcmFuayBpbnN0ZWFkCiAgICAgICAgIGhpZGxfdmVjPE5vZGVJbmZvPiYgbm9kZUxpc3QgPSByb2xlLm5vZGVzOwogICAgICAgICBub2RlTGlzdC5yZXNpemUocm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0LnNpemUoKSk7CiAgICAgICAgIHNpemVfdCBqID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggMTBiOTVkOS4uNDM4MzAwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTUzLDcgKzUzLDYgQEAKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKICAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAppbmRleCA5ZWQ0YTk5Li4xYjg0OTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKQEAgLTE1MCw2ICsxNTAsOCBAQAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA4IiwgInZpZGVvX2VuY29kZXIudnA4IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIsICJ2aWRlb19lbmNvZGVyLnZwOSIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdjEiLCAidmlkZW9fZW5jb2Rlci5hdjEiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIucmF3IiwgImF1ZGlvX2VuY29kZXIucmF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwKQEAgLTE2NCw2ICsxNjYsMTAgQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjMyIsICJhdWRpb19lbmNvZGVyLmFjMyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjMyIsICJhdWRpb19lbmNvZGVyLmVhYzMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzX2pvYyIsICJhdWRpb19lbmNvZGVyLmVhYzNfam9jIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjNCIsICJhdWRpb19lbmNvZGVyLmFjNCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCiAgICAgICAgICAgICAiaW1hZ2VfZGVjb2Rlci5oZWljIiwgImltYWdlX2VuY29kZXIuaGVpYyIgfSwKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IDU1YWZlMDQuLmRkYjQ1OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTM0LDcgKzM0LDggQEAKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUhhbmRsZXIobmV3IEFIYW5kbGVyUmVmbGVjdG9yPFNpbXBsZVNvZnRPTVhDb21wb25lbnQ+KHRoaXMpKSwKICAgICAgIG1TdGF0ZShPTVhfU3RhdGVMb2FkZWQpLAotICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCisgICAgICBtRnJhbWVDb25maWcoZmFsc2UpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKG5hbWUpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAKQEAgLTIwNCw2ICsyMDUsMjEgQEAKICAgICB9CiB9CiAKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGJvb2wgZnJhbWVDb25maWcgPSBtRnJhbWVDb25maWc7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBpbnRlcm5hbFNldENvbmZpZyhpbmRleCwgcGFyYW1zLCAmZnJhbWVDb25maWcpOworICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBtRnJhbWVDb25maWcgPSBmcmFtZUNvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50Ojp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqaGVhZGVyLAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKQEAgLTMzNiw2ICszNTIsMTAgQEAKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoImhlYWRlciIsIGJ1ZmZlcik7CisgICAgaWYgKG1GcmFtZUNvbmZpZykgeworICAgICAgICBtc2ctPnNldEludDMyKCJmcmFtZS1jb25maWciLCBtRnJhbWVDb25maWcpOworICAgICAgICBtRnJhbWVDb25maWcgPSBmYWxzZTsKKyAgICB9CiAgICAgbXNnLT5wb3N0KCk7CiAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTM3OCw2ICszOTgsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlciIsICh2b2lkICoqKSZoZWFkZXIpKTsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb25maWc7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1jb25maWciLCAmZnJhbWVDb25maWcpKSB7CisgICAgICAgICAgICAgICAgZnJhbWVDb25maWcgPSAwOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nICYmIG1UYXJnZXRTdGF0ZSA9PSBtU3RhdGUpOwogCkBAIC0zOTMsNiArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIWJ1ZmZlci0+bU93bmVkQnlVcyk7CiAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb25maWcgPSAoYm9vbClmcmFtZUNvbmZpZzsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSygobXNnVHlwZSA9PSBrV2hhdEVtcHR5VGhpc0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvcnQtPm1EZWYuZURpciA9PSBPTVhfRGlySW5wdXQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOTM1ZGMzNC4uZTg1M2RhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMTU0LDEyICsxNTQsMTIgQEAKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKLSAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCiAgICAgaW50MzJfdCBicHAgPSAobU91dHB1dEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpID8gMiA6IDE7CisgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogYnBwOwogICAgIG91dERlZi0+bkJ1ZmZlclNpemUgPQotICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIGJwcCAqIDMpIC8gMjsKKyAgICAgICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMykgLyAyOwogCiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqaW5EZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgaW5EZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTUwMiw3ICs1MDIsOCBAQAogICAgICAgICAgICAgLy8gVGhlc2UgdmFsdWVzIHdlcmUgY2hvc2VuIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZnVydGhlciBkb3duIHRoZSBsaW5lLCBhbmQgZG8KICAgICAgICAgICAgIC8vIG5vdCBpbmRpY2F0ZSBzdXBwb3J0IGZvciAzMmt4MzJrIHZpZGVvLgogICAgICAgICAgICAgaWYgKG5ld1dpZHRoID4gMzI3NjggfHwgbmV3SGVpZ2h0ID4gMzI3NjgKLSAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgeworICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPCAtMzI3NjgKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIyODg1NDIxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KQEAgLTYwMSwxMyArNjAyLDQwIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUhkcjEwUGx1c091dHB1dHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtSGRyMTBQbHVzT3V0cHV0cy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgYXV0byBpbmZvID0gKCppdCkuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIG91dFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICAgICAgb3V0UGFyYW1zLT5uUGFyYW1TaXplVXNlZCA9IGluZm8tPnNpemUoKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIGVub3VnaAorICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2UsIHJldHVybiB0aGUgc2l6ZSBvbmx5IGFuZCBkbyBub3QgcmVtb3ZlIHRoZSBwYXJhbSB5ZXQuCisgICAgICAgICAgICAgICAgaWYgKG91dFBhcmFtcy0+blBhcmFtU2l6ZSA+PSBpbmZvLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG91dFBhcmFtcy0+blZhbHVlLCBpbmZvLT5kYXRhKCksIGluZm8tPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNPdXRwdXRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZXJmbG93OworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKXsKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyl7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2Uga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXg6CiAgICAgICAgIHsKQEAgLTY1NywxMSArNjg1LDU1IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGluUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCpmcmFtZUNvbmZpZykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IHRvIGFwcGVuZCB0byB0aGUgY3VycmVudCBmcmFtZSBjb25maWcgc2V0LgorICAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd2Ugc2ltcGx5IHJlcGxhY2Ugd2l0aCB0aGUgbGFzdCBzZXQgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNJbnB1dHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAqKC0tbUhkcjEwUGx1c0lucHV0cy5lbmQoKSkgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJhbXMtPm5WYWx1ZSwgaW5QYXJhbXMtPm5QYXJhbVNpemVVc2VkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3Jpbmcga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OiBhcHBlbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSBjb25maWcgd2hpbGUgbm8gZnJhbWUgY29uZmlnIGlzIHByZXNlbnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBmcmFtZSBjb25maWcsIHNldHRpbmcgKmZyYW1lQ29uZmlnIHRvIHRydWUgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoZSBjbGllbnQgbWFya3MgdGhlIG5leHQgcXVldWVkIGlucHV0IGZyYW1lIHRvIGFwcGx5IGl0LgorICAgICAgICAgICAgICAgICpmcmFtZUNvbmZpZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUhkcjEwUGx1c0lucHV0cy5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJhbXMtPm5WYWx1ZSwgaW5QYXJhbXMtPm5QYXJhbVNpemVVc2VkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKK3NwPEFCdWZmZXI+IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCkgeworICAgIGF1dG8gaXQgPSBtSGRyMTBQbHVzSW5wdXRzLmJlZ2luKCk7CisgICAgc3A8QUJ1ZmZlcj4gaW5mbyA9ICppdDsKKyAgICBtSGRyMTBQbHVzSW5wdXRzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKSB7CisgICAgbUhkcjEwUGx1c091dHB1dHMucHVzaF9iYWNrKGluZm8pOworICAgIG5vdGlmeShPTVhfRXZlbnRDb25maWdVcGRhdGUsCisgICAgICAgICAgIGtPdXRwdXRQb3J0SW5kZXgsCisgICAgICAgICAgIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgTlVMTCk7Cit9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CkBAIC02NzYsNiArNzQ4LDEwIEBACiAgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkpIHsKICAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleDsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIikKKyAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwpAQCAtNjkzLDYgKzc2OSwxMCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCkgewogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAppbmRleCBhOWZjZTU1Li4wZjIyOWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApAQCAtMTkwLDcgKzE5MCwxMiBAQAogICovCiAvLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKIGlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOworICAgIGlmICh0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpOworICAgIH0gZWxzZSBpZiAodC5pc0RlYWRPYmplY3QoKSkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCmluZGV4IDFkMWYyYmQuLjZiYmVkZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMjgsNiArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBBQnVmZmVyOwogCiBzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWwgewogICAgIE9NWF9VMzIgbVByb2ZpbGU7CkBAIC00OSw2ICs1MSw3IEBACiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUhlYWRlcjsKICAgICAgICAgYm9vbCBtT3duZWRCeVVzOworICAgICAgICBib29sIG1GcmFtZUNvbmZpZzsKICAgICB9OwogCiAgICAgc3RydWN0IFBvcnRJbmZvIHsKQEAgLTc2LDYgKzc5LDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOworCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmZ2V0UG9ydFF1ZXVlKE9NWF9VMzIgcG9ydEluZGV4KTsKIApAQCAtMTAxLDYgKzEwNyw3IEBACiAgICAgT01YX1NUQVRFVFlQRSBtVGFyZ2V0U3RhdGU7CiAKICAgICBWZWN0b3I8UG9ydEluZm8+IG1Qb3J0czsKKyAgICBzdGQ6OmF0b21pY19ib29sIG1GcmFtZUNvbmZpZzsKIAogICAgIGJvb2wgaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIGNvbnN0OwpAQCAtMTE0LDYgKzEyMSw5IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCmluZGV4IDU2ZmM2OTEuLjNiMzgxY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KQEAgLTI4LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00OCw2ICs1MCw3IEBACiAgICAgZW51bSB7CiAgICAgICAgIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAxLAogICAgICAgICBrRGVzY3JpYmVIZHJTdGF0aWNJbmZvSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDIsCisgICAgICAgIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC02OCw4ICs3MSw4IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKQEAgLTgwLDYgKzgzLDggQEAKIAogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CiAKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpOworCiAgICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGJvdGggbWluaW11bSBidWZmZXIgY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2YKICAgICAvLyBpbnB1dCBwb3J0IHRvIGJlIHxudW1JbnB1dEJ1ZmZlcnN8LiBJdCB3aWxsIGFsc28gc2V0IGJvdGggbWluaW11bSBidWZmZXIKICAgICAvLyBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZiBvdXRwdXQgcG9ydCB0byBiZSB8bnVtT3V0cHV0QnVmZmVyc3wuCkBAIC0xNjYsNiArMTcxLDkgQEAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZHVtcCB0aGUgQ29sb3JBc3BlY3RzLgogICAgIHZvaWQgZHVtcENvbG9yQXNwZWN0cyhjb25zdCBDb2xvckFzcGVjdHMgJmNvbG9yQXNwZWN0cyk7CiAKKyAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpOworICAgIHZvaWQgcXVldWVPdXRwdXRGcmFtZUNvbmZpZyhjb25zdCBzcDxBQnVmZmVyPiAmaW5mbyk7CisKIHByaXZhdGU6CiAgICAgdWludDMyX3QgbU1pbklucHV0QnVmZmVyU2l6ZTsKICAgICB1aW50MzJfdCBtTWluQ29tcHJlc3Npb25SYXRpbzsKQEAgLTE3NCw2ICsxODIsOSBAQAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIG1Db2RpbmdUeXBlOwogICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICptUHJvZmlsZUxldmVsczsKICAgICBzaXplX3QgbU51bVByb2ZpbGVMZXZlbHM7CisgICAgdHlwZWRlZiBMaXN0PHNwPEFCdWZmZXI+ID4gSGRyMTBQbHVzSW5mb0xpc3Q7CisgICAgSGRyMTBQbHVzSW5mb0xpc3QgbUhkcjEwUGx1c0lucHV0czsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzT3V0cHV0czsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZWYzNjk4Mi4uZmIwMzIyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTksNyArOSw2IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKQEAgLTI5LDYgKzI4LDcgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCAxNWE3NjU1Li5jMmYxMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggODJhMDYzMS4uNDMwMmFlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTQyMyw2ICs0MjMsMTEgQEAKICAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIChtT3RoZXJEYXRhTGVuQml0cyAvIDgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBvZmZzZXQgKz0gbU90aGVyRGF0YUxlbkJpdHMgLyA4OwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBtTnVtU3ViRnJhbWVzICYmIG9mZnNldCA+PSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coIlNraXAgc3ViZnJhbWVzIGFmdGVyICVkLCB0b3RhbCAlZCIsIChpbnQpaSwgKGludCltTnVtU3ViRnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggMDE2MTdiNi4uNzg5ZTYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTksOCArNjAsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE1LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI1NCw3ICsyNTUsNyBAQAogCiAgICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUoaG9zdC5jX3N0cigpKTsKICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gaG9zdCAlcyIsIGhvc3QuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJVbmtub3duIGhvc3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyhob3N0KS5jX3N0cigpKTsKIAogICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FTk9FTlQpOwogICAgICAgICByZXBseS0+cG9zdCgpOwpAQCAtMjY2LDkgKzI2Nyw5IEBACiAgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CiAKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFNQIik7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCwgbVVJRCk7CiAgICAgfQogCiAgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIGZhbHNlKTsKQEAgLTI5Nyw4ICsyOTgsOCBAQAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMzE1LDggKzMxNiw4IEBACiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpwZXJmb3JtRGlzY29ubmVjdCgpIHsKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgfQogICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTM4OSw4ICszOTAsOCBAQAogCiAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggMzI1MDg0Yy4uOTI2MzU2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXMiLCBsaW5lLmNfc3RyKCkpOwogCiAgICAgICAgIHN3aXRjaCAobGluZS5jX3N0cigpWzBdKSB7CiAgICAgICAgICAgICBjYXNlICd2JzoKQEAgLTI2MSw3ICsyNjEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdD0iLCA0KSkgeworICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkgJiYgc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0OiIsIDQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCA1OTUxZGRmLi45YmM5Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCkBAIC00OSw2ICs0OSwyMSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTgzNTE2Li5iNDUxNWU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTM0NCw4ICszNDUsNyBAQAogCiAgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShtU2Vzc2lvbkhvc3QuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvb2sgdXAgYWRkcmVzcyBvZiBzZXNzaW9uIGhvc3QgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkhvc3QuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb29rIHVwIGFkZHJlc3Mgb2Ygc2Vzc2lvbiBob3N0Iik7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC01MzAsNyArNTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKHBhdGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CkBAIC03NTcsMTAgKzc1NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFjay0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKHRyYWNrLT5tUlRQU29ja2V0KTsKQEAgLTg4NiwxMCArODg2LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRQU29ja2V0KTsKQEAgLTE2NjUsMTIgKzE2NjUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1SVFBTb2NrZXQsICZpbmZvLT5tUlRDUFNvY2tldCwgJnJ0cFBvcnQpOwogCiAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0LCBtVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CkBAIC0xOTEyLDcgKzE5MTIsNyBAQAogICAgICAgICAgICAgbUxhc3RNZWRpYVRpbWVVcyA9IG1lZGlhVGltZVVzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgMCkgeworICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCAwICYmICFtU2Vla2FibGUpIHsKICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyBlYXJseSBhY2Nlc3NVbml0LiIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzNmI3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgorI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7CisgICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0YWdnaW5nIHNvY2tldCAlZCBmb3IgdWlkICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCB1aWQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKSB7CisgICAgaW50IHJlcyA9IHF0YWd1aWRfdW50YWdTb2NrZXQoc29ja2ZkKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB1bnRhZ2dpbmcgc29ja2V0ICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCBnZXRldWlkKCkpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKKyAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKSB7CisgICAgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhzb2NrZmQsIGdldGV1aWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVlZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBORVRXT1JLX1VUSUxTX0hfCisjZGVmaW5lIE5FVFdPUktfVVRJTFNfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTmV0d29ya1V0aWxzIHsKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKKyAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKKworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKTsKKyAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5FVFdPUktfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjE1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorCisvLyBOZXR3b3JrVXRpbHMgaW1wbGVtZW50YXRpb24gZm9yIGFwcGxpY2F0aW9uIHByb2Nlc3MuCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQsIHVpZF90LCB1aW50MzJfdCkgeworICAgIC8vIE5vIG9wLiBGcmFtZXdvcmsgYWxyZWFkeSBoYW5kbGVzIHRoZSBkYXRhIHVzYWdlIGJpbGxpbmcgZm9yIGFwcGxpY2F0aW9ucy4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50LCB1aWRfdCkgeworICAgIC8vIE5vIG9wLiBGcmFtZXdvcmsgYWxyZWFkeSBoYW5kbGVzIHRoZSBkYXRhIHVzYWdlIGJpbGxpbmcgZm9yIGFwcGxpY2F0aW9ucy4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCkgeworICAgIC8vIE5vIG9wLgorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGQ0NTljYmQuLjY2NWQ1MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC00MSw3ICs0MSw3IEBACiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpIHsKKyAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgQ2xlYXJNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgewogICAgIG1OZXRMb29wZXItPnNldE5hbWUoInNkcCBuZXQiKTsKICAgICBtTmV0TG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCmluZGV4IGE0ZTg4OWQuLjY5MzU2NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCkBAIC0yMiwzICsyMiwzMyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQyIiwKKworICAgIHNyY3M6IFsiVGV4dERlc2NyaXB0aW9uczIuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhlYWNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zMi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitUZXh0RGVzY3JpcHRpb25zMjo6VGV4dERlc2NyaXB0aW9uczIoKSB7Cit9CisKK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpnZXRQbGF5ZXJNZXNzYWdlT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworICAgIGlmIChmbGFncyAmIElOX0JBTkRfVEVYVF8zR1BQKSB7CisgICAgICAgIGlmIChmbGFncyAmIEdMT0JBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0M0dQUEdsb2JhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCBwbGF5ZXJNc2cpOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgTE9DQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgT1VUX09GX0JBTkRfVEVYVF9TUlQpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgTE9DQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHRpbWVNcywgcGxheWVyTXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8gUGFyc2UgdGhlIFNSVCB0ZXh0IHNhbXBsZSwgYW5kIHN0b3JlIHRoZSB0aW1pbmcgYW5kIHRleHQgc2FtcGxlIGluIGEgUGxheWVyTWVzc2FnZS4KKy8vIFRoZSBQbGF5ZXJNZXNzYWdlIHdpbGwgYmUgc2VudCB0byBNZWRpYVBsYXllcjIuamF2YSB0aHJvdWdoIGV2ZW50LCBhbmQgd2lsbCBiZQorLy8gcGFyc2VkIGluIFRpbWVkVGV4dC5qYXZhLgorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9MT0NBTF9TRVRUSU5HKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVEFSVF9USU1FKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRpbWVNcyk7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVCk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShkYXRhLCBzaXplKTsKKworICAgIHJldHVybiBPSzsKK30KKworLy8gRXh0cmFjdCB0aGUgbG9jYWwgM0dQUCBkaXNwbGF5IGRlc2NyaXB0aW9ucy4gM0dQUCBsb2NhbCBkZXNjcmlwdGlvbnMKKy8vIGFyZSBhcHBlbmRlZCB0byB0aGUgdGV4dCBzYW1wbGUgaWYgYW55Lgorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9MT0NBTF9TRVRUSU5HKTsKKworICAgIC8vIHdyaXRlIHN0YXJ0IHRpbWUgdG8gZGlzcGxheSB0aGlzIHRleHQgc2FtcGxlCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgc3NpemVfdCB0ZXh0TGVuID0gKCpkYXRhKSA8PCA4IHwgKCooZGF0YSArIDEpKTsKKworICAgIGlmIChzaXplIDwgdGV4dExlbiArIDIpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIHdyaXRlIHRleHQgc2FtcGxlIGxlbmd0aCBhbmQgdGV4dCBzYW1wbGUgaXRzZWxmCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSArIDIsIHRleHRMZW4pOworCisgICAgaWYgKHNpemUgPiB0ZXh0TGVuICsgMikgeworICAgICAgICBkYXRhICs9ICh0ZXh0TGVuICsgMik7CisgICAgICAgIHNpemUgLT0gKHRleHRMZW4gKyAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgd2hpbGUgKHNpemUgPj0gOCkgeworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgc3NpemVfdCBjaHVua1NpemUgPSBVMzJfQVQodG1wRGF0YSk7ICAgICAgLy8gc2l6ZSBpbmNsdWRlcyBzaXplIGFuZCB0eXBlCisgICAgICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IFUzMl9BVCh0bXBEYXRhICsgNCk7CisKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA8PSA4IHx8IGNodW5rU2l6ZSA+IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBjaHVua1NpemUgLSA4OworCisgICAgICAgIHRtcERhdGEgKz0gODsKKworICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICAvLyAndGJveCcgYm94IHRvIGluZGljYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdGV4dCB3aXRoIHZhbHVlcworICAgICAgICAgICAgLy8gb2YgdG9wLCBsZWZ0LCBib3R0b20gYW5kIHJpZ2h0CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICdiJywgJ28nLCAneCcpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSArPSBjaHVua1NpemU7CisgICAgICAgIHNpemUgLT0gY2h1bmtTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8gVG8gZXh0cmFjdCBib3ggJ3R4M2cnIGRlZmluZWQgaW4gM0dQUCBUUyAyNi4yNDUsIGFuZCBzdG9yZSBpdCBpbiBhIFBsYXllck1lc3NhZ2UKK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUEdsb2JhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0dMT0JBTF9TRVRUSU5HKTsKKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgc3NpemVfdCBjaHVua1NpemUgPSBVMzJfQVQoZGF0YSk7CisgICAgICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IFUzMl9BVChkYXRhICsgNCk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSBkYXRhOworICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzaXplIC0gODsKKworICAgICAgICBpZiAoc2l6ZSA8IGNodW5rU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChjaHVua1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDE4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU2tpcCBESVNQTEFZX0ZMQUdTLCBTVFJVQ1RfSlVTVElGSUNBVElPTiwgYW5kIEJBQ0tHUk9VTkRfQ09MT1JfUkdCQQorICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMTg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVF9QT1MpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgMikpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTg7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIHJlbWFpbmluZyBkYXRhLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2QyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApAQCAtMCwwICsxLDg4IEBACisgLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEVYVF9ERVNDUklQVElPTlMyX0hfCisKKyNkZWZpbmUgVEVYVF9ERVNDUklQVElPTlMyX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUZXh0RGVzY3JpcHRpb25zMiB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIElOX0JBTkRfVEVYVF8zR1BQICAgICAgICAgICAgID0gMHgwMSwKKyAgICAgICAgT1VUX09GX0JBTkRfVEVYVF9TUlQgICAgICAgICAgPSAweDAyLAorCisgICAgICAgIEdMT0JBTF9ERVNDUklQVElPTlMgICAgICAgICAgID0gMHgxMDAsCisgICAgICAgIExPQ0FMX0RFU0NSSVBUSU9OUyAgICAgICAgICAgID0gMHgyMDAsCisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRQbGF5ZXJNZXNzYWdlT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKK3ByaXZhdGU6CisgICAgVGV4dERlc2NyaXB0aW9uczIoKTsKKworICAgIGVudW0geworICAgICAgICAvLyBUaGVzZSBrZXlzIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSBrZXlzIGluIFRpbWVkVGV4dC5qYXZhCisgICAgICAgIEtFWV9ESVNQTEFZX0ZMQUdTICAgICAgICAgICAgICAgICA9IDEsIC8vIGludAorICAgICAgICBLRVlfU1RZTEVfRkxBR1MgICAgICAgICAgICAgICAgICAgPSAyLCAvLyBpbnQKKyAgICAgICAgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSAgICAgICAgID0gMywgLy8gaW50CisgICAgICAgIEtFWV9ISUdITElHSFRfQ09MT1JfUkdCQSAgICAgICAgICA9IDQsIC8vIGludAorICAgICAgICBLRVlfU0NST0xMX0RFTEFZICAgICAgICAgICAgICAgICAgPSA1LCAvLyBpbnQKKyAgICAgICAgS0VZX1dSQVBfVEVYVCAgICAgICAgICAgICAgICAgICAgID0gNiwgLy8gaW50CisgICAgICAgIEtFWV9TVEFSVF9USU1FICAgICAgICAgICAgICAgICAgICA9IDcsIC8vIGludAorICAgICAgICBLRVlfU1RSVUNUX0JMSU5LSU5HX1RFWFRfTElTVCAgICAgPSA4LCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfRk9OVF9MSVNUICAgICAgICAgICAgICA9IDksIC8vIExpc3Q8Rm9udD4KKyAgICAgICAgS0VZX1NUUlVDVF9ISUdITElHSFRfTElTVCAgICAgICAgID0gMTAsIC8vIExpc3Q8Q2hhclBvcz4KKyAgICAgICAgS0VZX1NUUlVDVF9IWVBFUl9URVhUX0xJU1QgICAgICAgID0gMTEsIC8vIExpc3Q8SHlwZXJUZXh0PgorICAgICAgICBLRVlfU1RSVUNUX0tBUkFPS0VfTElTVCAgICAgICAgICAgPSAxMiwgLy8gTGlzdDxLYXJhb2tlPgorICAgICAgICBLRVlfU1RSVUNUX1NUWUxFX0xJU1QgICAgICAgICAgICAgPSAxMywgLy8gTGlzdDxTdHlsZT4KKyAgICAgICAgS0VZX1NUUlVDVF9URVhUX1BPUyAgICAgICAgICAgICAgID0gMTQsIC8vIFRleHRQb3MKKyAgICAgICAgS0VZX1NUUlVDVF9KVVNUSUZJQ0FUSU9OICAgICAgICAgID0gMTUsIC8vIEp1c3RpZmljYXRpb24KKyAgICAgICAgS0VZX1NUUlVDVF9URVhUICAgICAgICAgICAgICAgICAgID0gMTYsIC8vIFRleHQKKworICAgICAgICBLRVlfR0xPQkFMX1NFVFRJTkcgICAgICAgICAgICAgICAgPSAxMDEsCisgICAgICAgIEtFWV9MT0NBTF9TRVRUSU5HICAgICAgICAgICAgICAgICA9IDEwMiwKKyAgICAgICAgS0VZX1NUQVJUX0NIQVIgICAgICAgICAgICAgICAgICAgID0gMTAzLAorICAgICAgICBLRVlfRU5EX0NIQVIgICAgICAgICAgICAgICAgICAgICAgPSAxMDQsCisgICAgICAgIEtFWV9GT05UX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwKKyAgICAgICAgS0VZX0ZPTlRfU0laRSAgICAgICAgICAgICAgICAgICAgID0gMTA2LAorICAgICAgICBLRVlfVEVYVF9DT0xPUl9SR0JBICAgICAgICAgICAgICAgPSAxMDcsCisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUEdsb2JhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGV4dERlc2NyaXB0aW9uczIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gVEVYVF9ERVNDUklQVElPTlMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKaW5kZXggMjY2YjYxMS4uNjRlY2MyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icApAQCAtMzEsNCArMzEsOCBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcAppbmRleCBhNTEyMGI5Li40ZDUwNGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApAQCAtMzA1LDYgKzMwNSw3IEBACiB9CiAKIHNwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICBjb25zdCBjaGFyICpjb2RlYywKICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICBkb3VibGUgcmF0ZSwKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiwKQEAgLTMyMiw3ICszMjMsNyBAQAogICAgICAgICAgICAgdWlkLAogICAgICAgICAgICAgbGFjaW5nLAogICAgICAgICAgICAgbGFuZywKLSAgICAgICAgICAgICJBX1ZPUkJJUyIsCisgICAgICAgICAgICBjb2RlYywKICAgICAgICAgICAgIGtBdWRpb1R5cGUsCiAgICAgICAgICAgICB0cmFja0VudHJ5RmllbGRzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCmluZGV4IGZmYmJhMWIuLmE5NGMyM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlID0gMTAwMDAwMCwgZG91YmxlIGR1ciA9IDApOwogCiAgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBBdWRpb1RyYWNrRW50cnkoCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb2RlYywKICAgICAgICAgICAgIGludCBjaGFucywKICAgICAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCmluZGV4IDRkNzNlYjguLmIwYTMwM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCkBAIC0xMTIsNDYgKzExNCwxMDIgQEAKIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OmF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3QgbkNoYW5uZWxzLCBzYW1wbGVyYXRlOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7Ci0gICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAotICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7Ci0gICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlOwogCiAgICAgaWYgKCFtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCisgICAgICAgIHx8ICFtZC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpKSB7CiAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOwogICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworICAgIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkpIHsKKyAgICAgICAgLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKyAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHRyYWNrIGlzbid0IHN0YW5kYXJkaXplZCwgaXRzIHZhbHVlIHNob3VsZCBiZSAiQV9PUFVTIi4KKyAgICAgICAgT3B1c0hlYWRlciBoZWFkZXI7CisgICAgICAgIGhlYWRlci5jaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICAvLyAtIENoYW5uZWwgbWFwcGluZyBmYW1pbHkgKDggYml0cyB1bnNpZ25lZCkKKyAgICAgICAgLy8gIC0tICAwID0gb25lIHN0cmVhbTogbW9ubyBvciBMLFIgc3RlcmVvCisgICAgICAgIC8vICAtLSAgMSA9IGNoYW5uZWxzIGluIHZvcmJpcyBzcGVjIG9yZGVyOiBtb25vIG9yIEwsUiBzdGVyZW8gb3IgLi4uIG9yIEZMLEMsRlIsUkwsUlIsTEZFLCAuLi4KKyAgICAgICAgLy8gIC0tICAyLi4yNTQgPSByZXNlcnZlZCAodHJlYXQgYXMgMjU1KQorICAgICAgICAvLyAgLS0gIDI1NSA9IG5vIGRlZmluZWQgY2hhbm5lbCBtZWFuaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vICBvdXIgaW1wbGVtZW50YXRpb24gZW5jb2RlczogIDAsIDEsIG9yIDI1NQorICAgICAgICBoZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChuQ2hhbm5lbHMgPiA4KSA/IDI1NSA6IChuQ2hhbm5lbHMgPiAyKSk7CisgICAgICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgaGVhZGVyLnNraXBfc2FtcGxlcyA9IDA7CiAKLSAgICBvZmZfdCBvZmYgPSAwOwotICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOwotICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKLSAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisgICAgICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgICAgIC8vIGV4cGVjdCBudW1iZXJzIGluIHRoZSBsb3cgMzAncyBoZXJlLiBXcml0ZU9wdXNIZWFkZXIoKSB3aWxsIHRlbGwgdXMKKyAgICAgICAgLy8gaWYgdGhpbmdzIGFyZSBiYWQuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICAgICAgaW50IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBzYW1wbGVyYXRlLCAodWludDhfdCopaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJfZGF0YSkpOwogCi0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworICAgICAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGRpZG4ndCBmaWxsIG91dCB0aGF0IGhlYWRlciBmb3Igc29tZSByZWFzb24KKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2VuZXJhdGUgT1BVUyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUyOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDA7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKIAotICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCi0gICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKLSAgICByZXR1cm4gZW50cnk7CisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90KiBjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsICh1aW50OF90KiloZWFkZXJfZGF0YSwgaGVhZGVyU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9CisgICAgICAgICAgICAgICAgV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9PUFVTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLCBjb2RlY1ByaXZhdGVCdWYpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICAgICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworCisgICAgICAgIGlmICghbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCisgICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICAgICAgQUxPR0UoIk1pc3NpbmcgaGVhZGVyIGZvcm1hdCBrZXlzIGZvciB2b3JiaXMgdHJhY2siKTsKKyAgICAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKyAgICAgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX1ZPUkJJUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwgY29kZWNQcml2YXRlQnVmKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIGlzIG5vdCBhIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiLCBtaW1lVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc2l6ZV90IFdlYm1Xcml0ZXI6Om51bVRyYWNrcygpIHsKQEAgLTM4MiwxNiArNDQwLDE4IEBACiAgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogICAgIGNvbnN0IGNoYXIgKnZwOSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKICAgICBjb25zdCBjaGFyICp2b3JiaXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiAKICAgICBzaXplX3Qgc3RyZWFtSW5kZXg7CiAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2cDgsIHN0cmxlbih2cDgpKSB8fAogICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgdnA5LCBzdHJsZW4odnA5KSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpIHx8CisgICAgICAgICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzKTsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMsICVzLCBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcywgb3B1cyk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggZWRkOGZiYy4uODE5MDU4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSw5IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCAyZGVjOWZhLi43MDQ2ZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTI2LDggKzI2LDkgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGV4cGF0Lmg+CiAKLSNpbmNsdWRlIDxjY3R5cGU+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzI2LDggKzMyNyw4IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpIHx8IHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSkgeworICAgICAgICAgICAgICAgICh2b2lkKWFkZFF1aXJrKGF0dHJzLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgewogICAgICAgICAgICAgICAgICh2b2lkKWFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7CkBAIC0zNDgsNiArMzQ5LDggQEAKICAgICAgICAgICAgIGlmIChvdXRzaWRlICYmCiAgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkFsaWFzIikpIHsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRBbGlhcyhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJMaW1pdCIpKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpYWRkTGltaXQoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7CkBAIC00OTksNiArNTAyLDcgQEAKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnJhbmsgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CkBAIC01MjAsNiArNTI0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuayIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogcmFuayBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmsgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTU3NiwxMCArNTg2LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmFuayAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICghbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuZW1wdHkoKSAmJiBtQ3VycmVudENvZGVjLT5zZWNvbmQucmFuayAhPSByYW5rKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjb2RlIFwiJXNcIiByYW5rIGNoYW5nZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuY19zdHIoKSwgcmFuayk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5yYW5rID0gcmFuazsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnRhZykgewogICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTYwNiw3ICs2MjUsMTIgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyB0YWdTdHJpbmcgPSB0YWc7CisgICAgc3RkOjp0cmFuc2Zvcm0odGFnU3RyaW5nLmJlZ2luKCksIHRhZ1N0cmluZy5lbmQoKSwgdGFnU3RyaW5nLmJlZ2luKCksIDo6dG9sb3dlcik7CisgICAgdGFnU3RyaW5nLmFwcGVuZCgiOjoiKTsKKyAgICB0YWdTdHJpbmcuYXBwZW5kKG5hbWUpOworICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5xdWlya1NldC5lbXBsYWNlKHRhZ1N0cmluZy5jX3N0cigpKTsKKyAgICBBTE9HSSgiYWRkaW5nICVzIHRvICVzIiwgdGFnU3RyaW5nLmNfc3RyKCksIG1DdXJyZW50Q29kZWMtPmZpcnN0LmNfc3RyKCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzYwLDYgKzc4NCw3IEBACiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgInBlcmZvcm1hbmNlLXBvaW50LSIpIHx8CiAgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewogICAgICAgICAvLyAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgogICAgICAgICAvLyAxKSBtaW4tbWF4CkBAIC05NjQsNiArOTg5LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiBuYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhbGlhcyB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuYWxpYXNlcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwJgogICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CkBAIC05OTgsNiArMTA1MSw3IEBACiAgICAgICAgIGNvbnN0IGF1dG8mIGNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0OwogICAgICAgICBib29sIGlzRW5jb2RlciA9IGNvZGVjLnNlY29uZC5pc0VuY29kZXI7CiAgICAgICAgIHNpemVfdCBvcmRlciA9IGNvZGVjLnNlY29uZC5vcmRlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmFuayA9IGNvZGVjLnNlY29uZC5yYW5rOwogICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gY29kZWMuc2Vjb25kLnR5cGVNYXA7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVNYXApIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gdHlwZS5maXJzdDsKQEAgLTEwNDEsMTEgKzEwOTUsMjEgQEAKIAogICAgICAgICAgICAgTm9kZUluZm8gbm9kZUluZm87CiAgICAgICAgICAgICBub2RlSW5mby5uYW1lID0gY29kZWNOYW1lOworICAgICAgICAgICAgLy8gTk9URTogbm8gYWxpYXNlcyBhcmUgZXhwb3NlZCBpbiByb2xlIGluZm8KKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBxdWlya3MgYXJlIGV4cG9zZWQgYXMgbm9kZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnJlc2VydmUodHlwZUF0dHJpYnV0ZU1hcC5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiB0eXBlQXR0cmlidXRlTWFwKSB7CiAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGV7YXR0cmlidXRlLmZpcnN0LCBhdHRyaWJ1dGUuc2Vjb25kfSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZxdWlyayA6IGNvZGVjLnNlY29uZC5xdWlya1NldCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJIYXNQcmVmaXgocXVpcmsuY19zdHIoKSwgImF0dHJpYnV0ZTo6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soQXR0cmlidXRle3F1aXJrLCAicHJlc2VudCJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJhbmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAppbmRleCBjYzY5ZTUyLi43YTk4NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApAQCAtNjUsNiArNjUsOCBAQAogICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCiAgICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKICAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGlhc2VzOyAvLy88IE5hbWUgYWxpYXNlcyBmb3IgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnN0cmluZyByYW5rOyAgLy8vPCBSYW5rIG9mIHRoaXMgY29kZWMuIFRoaXMgaXMgYSBudW1lcmljIHN0cmluZy4KICAgICB9OwogCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CkBAIC03Niw2ICs3OCw3IEBACiAgICAgc3RydWN0IE5vZGVJbmZvIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0OworICAgICAgICAvLyBub3RlOiBhbGlhc2VzIGFyZSBub3QgZXhwb3NlZCBoZXJlIGFzIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSByb2xlIG1hcAogICAgIH07CiAKICAgICAvKioKQEAgLTE3MSw4ICsxNzQsOSBAQAogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cik7CiAKLSAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqdGFnKTsKICAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggMTZjN2JlOS4uODM3NzcyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0zNCw2ICszNCw3IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKICAgICBdLAogCisgICAgLy8gYmFjayB0byAzMi1iaXQsIGIvMTI2NTAyNjEzCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIAogICAgIGluaXRfcmM6IFsibWVkaWFzZXJ2ZXIucmMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggZjI1ZmM3MS4uYmQ2YTZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTQ3LDYgKzQ3LDkgQEAKIGNvbnN0ZXhwciB1bnNpZ25lZCBNQVhfRklMRV9DSFVOS19TSVpFID0gQUlPX0JVRlNfTUFYICogQUlPX0JVRl9MRU47CiAKIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTVRQX0ZJTEVfU0laRSA9IDB4RkZGRkZGRkY7CisvLyBOb3RlOiBQT0xMX1RJTUVPVVRfTVMgPSAwIG1lYW5zIHJldHVybiBpbW1lZGlhdGVseSBpLmUuIG5vIHNsZWVwLgorLy8gQW5kIHRoaXMgd2lsbCBjYXVzZSBoaWdoIENQVSB1c2FnZS4KK2NvbnN0ZXhwciBpbnQzMl90IFBPTExfVElNRU9VVF9NUyA9IDUwMDsKIAogc3RydWN0IHRpbWVzcGVjIFpFUk9fVElNRU9VVCA9IHsgMCwgMCB9OwogCkBAIC0yMTIsNyArMjE1LDYgQEAKICAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOwogICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKLSAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgewogICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewpAQCAtMjI1LDggKzIyNyw4IEBACiAgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKICAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKICAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgewpAQCAtMzA2LDcgKzMwOCw3IEBACiAgICAgaW50IGVycm9yID0gMDsKIAogICAgIHdoaWxlIChudW1fZXZlbnRzIDwgbWluX2V2ZW50cykgewotICAgICAgICBpZiAocG9sbChtUG9sbEZkcywgMiwgMCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIFBPTExfVElNRU9VVF9NUykgPT0gLTEpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgZHVyaW5nIHBvbGwoKSI7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggY2NkZGQ2ZS4uY2E4Y2I3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTk5LDYgKzk5LDcgQEAKICAgICBNVFBfRVZFTlRfU1RPUkVfQURERUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsCiAgICAgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQsCisgICAgTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsCiB9OwogCiBNdHBTZXJ2ZXI6Ok10cFNlcnZlcihJTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBpbnQgY29udHJvbEZkLCBib29sIHB0cCwKQEAgLTI1OSw2ICsyNjAsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELCBoYW5kbGUpOwogfQogCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBBTE9HVigic2VuZE9iamVjdEluZm9DaGFuZ2VkICVkXG4iLCBoYW5kbGUpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwgaGFuZGxlKTsKK30KKwogdm9pZCBNdHBTZXJ2ZXI6OnNlbmRTdG9yZUFkZGVkKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIEFMT0dWKCJzZW5kU3RvcmVBZGRlZCAlMDhYXG4iLCBpZCk7CiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9TVE9SRV9BRERFRCwgaWQpOwpAQCAtNDQyLDYgKzQ0OCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBpZiAocmVzcG9uc2UgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgQUxPR1coIltNVFBdIGdvdCByZXNwb25zZSAweCVYIGluIGNvbW1hbmQgJXMgKCV4KSIsIHJlc3BvbnNlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CiAgICAgaWYgKHJlc3BvbnNlID09IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBtUmVzcG9uc2Uuc2V0UmVzcG9uc2VDb2RlKHJlc3BvbnNlKTsKQEAgLTY1Miw4ICs2NjEsOCBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CiAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7Ci0gICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAotICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXMgKDB4JTA0WClcbiIsIGhhbmRsZSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSwgcHJvcGVydHkpOwogCiAgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7CiB9CkBAIC05NDYsNyArOTU1LDggQEAKICAgICBpZiAoIW1EYXRhLmdldFN0cmluZyhtb2RpZmllZCkpIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7ICAgICAvLyBkYXRlIG1vZGlmaWVkCiAgICAgLy8ga2V5d29yZHMgZm9sbG93CiAKLSAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAlMDRYXG4iLCAoY29uc3QgY2hhciAqKW5hbWUsIGZvcm1hdCk7CisgICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogMHglMDRYICglcylcbiIsIChjb25zdCBjaGFyKiluYW1lLCBmb3JtYXQsCisgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOwogICAgIHRpbWVfdCBtb2RpZmllZFRpbWU7CiAgICAgaWYgKCFwYXJzZURhdGVUaW1lKG1vZGlmaWVkLCBtb2RpZmllZFRpbWUpKQogICAgICAgICBtb2RpZmllZFRpbWUgPSAwOwpAQCAtOTY3LDkgKzk3NywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFOwogICAgIH0KIAotICAgIEFMT0dEKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR1YoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsIGZvcm1hdCwKICAgICAgICAgICAgIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HRCgiaGFuZGxlOiAlZCwgcGFyZW50OiAlZCwgc3RvcmFnZUlEOiAlMDhYIiwgaGFuZGxlLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgewogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCmluZGV4IGY2OTM5ZDcuLjFmODc5OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTExNSw2ICsxMTUsNyBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9uZGsvQW5kcm9pZC5icAppbmRleCAxYjhkZGQ5Li5mOWYxYWNjIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9uZGsvQW5kcm9pZC5icApAQCAtMzEsNiArMzEsMTMgQEAKICAgICBsaWNlbnNlOiAiTk9USUNFIiwKIH0KIAorLy8gZm9yIHVzZSB3aXRoIGhlYWRlcl9saWJzCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXQorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKIApAQCAtNTUsNyArNjIsNiBAQAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKLQogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKQEAgLTY1LDIyICs3MSwzMiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhX2puaSIsCisgICAgICAgICJsaWJtZWRpYV9qbmlfdXRpbHMiLAogICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJhbmRyb2lkIiwKLSAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAorICAgIF0sCisKKyAgICByZXF1aXJlZDogWworICAgICAgICAvLyBsaWJtZWRpYW5kayBtYXkgYmUgdXNlZCBieSBKYXZhIGFuZCBub24tSmF2YSB0aGluZ3MuIFdoZW4gbG93ZXItbGV2ZWwgdGhpbmdzIHVzZSBpdCwKKyAgICAgICAgLy8gdGhleSBzaG91bGRuJ3QgaGF2ZSB0byB0YWtlIG9uIHRoZSBjb3N0IG9mIGxvYWRpbmcgbGliYW5kcm9pZF9ydW50aW1lLgorICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCkBAIC0xMDQsNSArMTIwLDYzIEBACiBsbG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX3V0aWxzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IDIwYjE2NjcuLjE4ODNmNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIk5ka0ltYWdlUmVhZGVyUHJpdi5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9VdGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkL0FIYXJkd2FyZUJ1ZmZlckhlbHBlcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEzLmgiCiAKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiAgICAgYXV0byBsb2NrZWRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXI+KCk7CiAKLSAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBhbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyX2NvbnZlcnRUb0dyYWxsb2NVc2FnZUJpdHMobVVzYWdlKTsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBBSGFyZHdhcmVCdWZmZXJfY29udmVydFRvR3JhbGxvY1VzYWdlQml0cyhtVXNhZ2UpOwogCiAgICAgc3RhdHVzX3QgcmV0ID0KICAgICAgICAgICAgIGxvY2tJbWFnZUZyb21CdWZmZXIobUJ1ZmZlciwgZ3JhbGxvY1VzYWdlLCBtQnVmZmVyLT5tRmVuY2UtPmR1cCgpLCBsb2NrZWRCdWZmZXIuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggYmU2MzVmZi4uYmNjN2ZmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC0yNSw5ICsyNSwxMCBAQAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX1V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9QdWJsaWNGb3JtYXQuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWQvQUhhcmR3YXJlQnVmZmVySGVscGVycy5oPgogI2luY2x1ZGUgPGdyYWxsb2N1c2FnZS9HcmFsbG9jVXNhZ2VDb252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDMsNiArNDQsMTAgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0NvbnRleHRLZXkgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtHcmFwaGljQnVmZmVyS2V5ID0gIkdyYXBoaWNCdWZmZXIiOwogCitzdGF0aWMgY29uc3RleHByIGludCBrV2luZG93SGFsVG9rZW5TaXplTWF4ID0gMjU2OworCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pOworCiBib29sCiBBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2FnZSBoYXMgZWl0aGVyIENQVV9SRUFEX09GVEVOIG9yIENQVV9SRUFEIHNldC4gTm90ZSB0aGF0IGNoZWNrIGFnYWluc3QKQEAgLTYzLDYgKzY4LDkgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIC8vIEZvciBwcml2YXRlIGZvcm1hdCwgY3B1IHVzYWdlIGlzIHByb2hpYml0ZWQuCkBAIC04OSw2ICs5Nyw5IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSEVJQzoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX0pQRUc6CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTI2MSw5ICsyNzIsOSBAQAogbWVkaWFfc3RhdHVzX3QKIEFJbWFnZVJlYWRlcjo6aW5pdCgpIHsKICAgICBQdWJsaWNGb3JtYXQgcHVibGljRm9ybWF0ID0gc3RhdGljX2Nhc3Q8UHVibGljRm9ybWF0PihtRm9ybWF0KTsKLSAgICBtSGFsRm9ybWF0ID0gYW5kcm9pZF92aWV3X1N1cmZhY2VfbWFwUHVibGljRm9ybWF0VG9IYWxGb3JtYXQocHVibGljRm9ybWF0KTsKLSAgICBtSGFsRGF0YVNwYWNlID0gYW5kcm9pZF92aWV3X1N1cmZhY2VfbWFwUHVibGljRm9ybWF0VG9IYWxEYXRhc3BhY2UocHVibGljRm9ybWF0KTsKLSAgICBtSGFsVXNhZ2UgPSBhbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyX2NvbnZlcnRUb0dyYWxsb2NVc2FnZUJpdHMobVVzYWdlKTsKKyAgICBtSGFsRm9ybWF0ID0gbWFwUHVibGljRm9ybWF0VG9IYWxGb3JtYXQocHVibGljRm9ybWF0KTsKKyAgICBtSGFsRGF0YVNwYWNlID0gbWFwUHVibGljRm9ybWF0VG9IYWxEYXRhc3BhY2UocHVibGljRm9ybWF0KTsKKyAgICBtSGFsVXNhZ2UgPSBBSGFyZHdhcmVCdWZmZXJfY29udmVydFRvR3JhbGxvY1VzYWdlQml0cyhtVXNhZ2UpOwogCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JQcm9kdWNlcjsKICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnYkNvbnN1bWVyOwpAQCAtMzAxLDYgKzMxMiw5IEBACiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEJ1ZmZlckl0ZW1Db25zdW1lciBidWZmZXIgZGF0YVNwYWNlIik7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CisgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVCkgeworICAgICAgICBnYkNvbnN1bWVyLT5zZXRDb25zdW1lcklzUHJvdGVjdGVkKHRydWUpOworICAgIH0KIAogICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CiAgICAgaWYgKG1TdXJmYWNlID09IG51bGxwdHIpIHsKQEAgLTM1MCw4ICszNjQsMTAgQEAKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChpbWFnZS0+bUxvY2spOwotICAgICAgICByZWxlYXNlSW1hZ2VMb2NrZWQoaW1hZ2UsIC8qcmVsZWFzZUZlbmNlRmQqLy0xKTsKKyAgICAgICAgLy8gRG8gbm90IGFsdGVyIG1BY3F1aXJlZEltYWdlcyB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG9uIGl0CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEsIC8qY2xlYXJDYWNoZSovZmFsc2UpOwogICAgIH0KKyAgICBtQWNxdWlyZWRJbWFnZXMuY2xlYXIoKTsKIAogICAgIC8vIERlbGV0ZSBCdWZmZXIgSXRlbXMKICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwpAQCAtMzYzLDYgKzM3OSwxNSBAQAogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5hYmFuZG9uKCk7CiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobnVsbHB0cik7CiAgICAgfQorCisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgc2l6ZSA9IG1XaW5kb3dIYW5kbGUtPmRhdGFbMF07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtV2luZG93SGFuZGxlLT5kYXRhWzFdKSwgc2l6ZSk7CisgICAgICAgIGRlbGV0ZUhhbFRva2VuKGhhbFRva2VuKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobVdpbmRvd0hhbmRsZSk7CisgICAgfQogfQogCiBtZWRpYV9zdGF0dXNfdApAQCAtNDgxLDcgKzUwNiw3IEBACiB9CiAKIHZvaWQKLUFJbWFnZVJlYWRlcjo6cmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgeworQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUpIHsKICAgICBCdWZmZXJJdGVtKiBidWZmZXIgPSBpbWFnZS0+bUJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlzIG5vdCBmYXRhbApAQCAtNTA1LDYgKzUzMCwxMCBAQAogICAgIGltYWdlLT5tTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBpbWFnZS0+bUlzQ2xvc2VkID0gdHJ1ZTsKIAorICAgIGlmICghY2xlYXJDYWNoZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIC8vIGNsZWFudXAgYWNxdWlyZWQgaW1hZ2UgbGlzdAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwpAQCAtNTIyLDYgKzU1MSwyNSBAQAogICAgIH0KIH0KIAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyOjpnZXRXaW5kb3dOYXRpdmVIYW5kbGUobmF0aXZlX2hhbmRsZSAqKmhhbmRsZSkgeworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4obVByb2R1Y2VyKTsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBpZiAoIWNyZWF0ZUhhbFRva2VuKGhnYnAsICZoYWxUb2tlbikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBtV2luZG93SGFuZGxlID0gY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoaGFsVG9rZW4pOworICAgIGlmICghbVdpbmRvd0hhbmRsZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIGludAogQUltYWdlUmVhZGVyOjpnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAtMTsKQEAgLTU4NSw2ICs2MzMsMzMgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKAorICAgICAgICBjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pIHsKKyAgICAvLyBXZSBhdHRlbXB0IHRvIHN0b3JlIGhhbFRva2VuIGluIHRoZSBpbnRzIG9mIHRoZSBuYXRpdmVfaGFuZGxlX3QgYWZ0ZXIgaXRzCisgICAgLy8gc2l6ZS4gVGhlIGZpcnN0IGludCBzdG9yZXMgdGhlIHNpemUgb2YgdGhlIHRva2VuLiBXZSBzdG9yZSB0aGlzIGluIGFuIGludAorICAgIC8vIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMgd2hlcmUgc2l6ZV90IGFuZCBpbnQgZG8gbm90IGhhdmUgdGhlIHNhbWUKKyAgICAvLyBhbGlnbm1lbnQuCisgICAgc2l6ZV90IG5oRGF0YUJ5dGVTaXplID0gaGFsVG9rZW4uc2l6ZSgpOworICAgIGlmIChuaERhdGFCeXRlU2l6ZSA+IGtXaW5kb3dIYWxUb2tlblNpemVNYXgpIHsKKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHRva2VuIGlzbid0IHJlYXNvbmFibGUuLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IG51bUludHMgPSBjZWlsKG5oRGF0YUJ5dGVTaXplIC8gc2l6ZW9mKGludCkpICsgMTsKKworICAgIC8vIFdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdywgd2hldGhlciBudW1JbnRzIGNhbiBmaXQgaW4gYW4gaW50LCBzaW5jZSB3ZQorICAgIC8vIGV4cGVjdCBrV2luZG93SGFsVG9rZW5TaXplTWF4IHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdC4KKyAgICAvLyBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3Qgd2l0aCAwIG51bUZkcyBhbmQgbnVtSW50cyBudW1iZXIgb2YgaW50cy4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgbnVtSW50cyk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIHRva2VuIGluIHRoZSBmaXJzdCBpbnQuCisgICAgbmgtPmRhdGFbMF0gPSBuaERhdGFCeXRlU2l6ZTsKKyAgICBtZW1jcHkoJihuaC0+ZGF0YVsxXSksIGhhbFRva2VuLmRhdGEoKSwgbmhEYXRhQnl0ZVNpemUpOworICAgIHJldHVybiBuaDsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLApAQCAtNTk0LDYgKzY2OSwxOSBAQAogICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4sIG1heEltYWdlcywgcmVhZGVyKTsKIH0KIAorZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICAgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlci0+Z2V0V2luZG93TmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK30gLy9leHRlcm4gIkMiCisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCBiZWQ4YTIxLi5lMzI4Y2IxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZU5leHRJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVMYXRlc3RJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0V2luZG93TmF0aXZlSGFuZGxlKC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCiAgICAgQU5hdGl2ZVdpbmRvdyogZ2V0V2luZG93KCkgICAgY29uc3QgeyByZXR1cm4gbVdpbmRvdy5nZXQoKTsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRXaWR0aCgpICAgICBjb25zdCB7IHJldHVybiBtV2lkdGg7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0SGVpZ2h0KCkgICAgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfTsKQEAgLTg2LDcgKzg4LDcgQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlSW1hZ2VMb2NrZWQoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKIAogICAgIC8vIENhbGxlZCBieSBBSW1hZ2UvfkFJbWFnZVJlYWRlciB0byBjbG9zZSBpbWFnZS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdyYWIgQUltYWdlOjptTG9jawotICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7CisgICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUgPSB0cnVlKTsKIAogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVyV2lkdGgoQnVmZmVySXRlbSogYnVmZmVyKTsKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlckhlaWdodChCdWZmZXJJdGVtKiBidWZmZXIpOwpAQCAtMTYwLDYgKzE2Miw3IEBACiAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICBtV2luZG93OworICAgIG5hdGl2ZV9oYW5kbGVfdCogICAgICAgICAgIG1XaW5kb3dIYW5kbGUgPSBudWxscHRyOwogCiAgICAgTGlzdDxBSW1hZ2UqPiAgICAgICAgICAgICAgbUFjcXVpcmVkSW1hZ2VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYzIzZjE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCmluZGV4IGQ3MTkzY2EuLmNlMmM2NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFEcm1TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCmluZGV4IDlkMDBlNWUuLjA4OTFmMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0yMywzMiArMjMsMTAyIEBACiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KIAogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKKworI2luY2x1ZGUgPG11dGV4PiAvLyBzdGQ6OmNhbGxfb25jZSxvbmNlX2ZsYWcKKyNpbmNsdWRlIDxkbGZjbi5oPiAvLyBkbG9wZW4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKy8vIGxvYWQgbGliYW5kcm9pZF9ydW50aW1lLnNvIGxhemlseS4KKy8vIEEgdmVuZG9yIHByb2Nlc3MgbWF5IHVzZSBsaWJtZWRpYW5kayBidXQgc2hvdWxkIG5vdCBkZXBlbmQgb24gbGliYW5kcm9pZF9ydW50aW1lLgorLy8gVE9ETyhqb295dW5nKTogcmVtb3ZlIGR1cGxpY2F0ZSAoYi8xMjU1NTAxMjEpCisvLyBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2JpbmRlci9uZGsvaWJpbmRlcl9qbmkuY3BwCituYW1lc3BhY2UgeworCit0eXBlZGVmIEpOSUVudiogKCpnZXRKTklFbnZfdCkoKTsKK3R5cGVkZWYgc3A8SUJpbmRlcj4gKCppYmluZGVyRm9ySmF2YU9iamVjdF90KShKTklFbnYqIGVudiwgam9iamVjdCBvYmopOworCitnZXRKTklFbnZfdCBnZXRKTklFbnZfOworaWJpbmRlckZvckphdmFPYmplY3RfdCBpYmluZGVyRm9ySmF2YU9iamVjdF87CisKK3N0ZDo6b25jZV9mbGFnIG1Mb2FkRmxhZzsKKwordm9pZCBsb2FkKCkgeworICAgIHN0ZDo6Y2FsbF9vbmNlKG1Mb2FkRmxhZywgW10oKSB7CisgICAgICAgIHZvaWQqIGhhbmRsZSA9IGRsb3BlbigibGliYW5kcm9pZF9ydW50aW1lLnNvIiwgUlRMRF9MQVpZKTsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gbGliYW5kcm9pZF9ydW50aW1lLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2V0Sk5JRW52XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Z2V0Sk5JRW52X3Q+KAorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIl9aTjdhbmRyb2lkMTRBbmRyb2lkUnVudGltZTlnZXRKTklFbnZFdiIpKTsKKyAgICAgICAgaWYgKGdldEpOSUVudl8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYuIik7CisgICAgICAgICAgICAvLyBubyByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8aWJpbmRlckZvckphdmFPYmplY3RfdD4oCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiX1pON2FuZHJvaWQyMGliaW5kZXJGb3JKYXZhT2JqZWN0RVA3X0pOSUVudlA4X2pvYmplY3QiKSk7CisgICAgICAgIGlmIChpYmluZGVyRm9ySmF2YU9iamVjdF8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGliaW5kZXJGb3JKYXZhT2JqZWN0LiIpOworICAgICAgICAgICAgLy8gbm8gcmV0dXJuCisgICAgICAgIH0KKyAgICB9KTsKK30KKworSk5JRW52KiBnZXRKTklFbnYoKSB7CisgICAgbG9hZCgpOworICAgIGlmIChnZXRKTklFbnZfID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiAoZ2V0Sk5JRW52XykoKTsKK30KKworc3A8SUJpbmRlcj4gaWJpbmRlckZvckphdmFPYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7CisgICAgbG9hZCgpOworICAgIGlmIChpYmluZGVyRm9ySmF2YU9iamVjdF8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIChpYmluZGVyRm9ySmF2YU9iamVjdF8pKGVudiwgb2JqKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKwogc3RydWN0IEFNZWRpYURhdGFTb3VyY2UgewogICAgIHZvaWQgKnVzZXJkYXRhOwogICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OwogICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemU7CisgICAgc3A8RGF0YVNvdXJjZT4gbUltcGw7CisgICAgdWludDMyX3QgbUZsYWdzOwogfTsKIAogTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUpOworICAgIG1EYXRhU291cmNlLT5tSW1wbCA9IGRhdGFTb3VyY2UtPm1JbXBsOworICAgIG1EYXRhU291cmNlLT5tRmxhZ3MgPSBkYXRhU291cmNlLT5tRmxhZ3M7CiB9CiAKIE5ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgewpAQCAtNTksOSArMTI5LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit1aW50MzJfdCBOZGtEYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbURhdGFTb3VyY2UtPm1GbGFnczsKK30KKwogc3NpemVfdCBOZGtEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKQEAgLTkyLDYgKzE2NiwxMDAgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE5ka0RhdGFTb3VyY2U6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemVwdHIpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgIT0gTlVMTAorICAgICAgICAgICAgJiYgbURhdGFTb3VyY2UtPnVzZXJkYXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemVwdHIgIT0gTlVMTCkgeworICAgICAgICBzaXplID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQpOworICAgICAgICAqc2l6ZXB0ciA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBzaXplID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBpbnQgdmVyc2lvbikgeworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIG9iaik7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUFNlcnZpY2UoZW52LCBvYmopOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZVRlbXBsYXRlKAorICAgICAgICBKTklFbnYgKmVudiwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBjaGFyICpjbGF6eiwKKyAgICAgICAgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICBjb25zdCBjaGFyICpzaWduYXR1cmUsCisgICAgICAgIGludCB2ZXJzaW9uKSB7CisgICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKKyAgICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImh0dHAgc2VydmljZSBtdXN0IGJlIGNyZWF0ZWQgZnJvbSBKYXZhIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcyhjbGF6eik7CisgICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWEoMilIdHRwU2VydmljZSIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLCBtZXRob2QsIHNpZ25hdHVyZSk7CisgICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpzdHJpbmcganVyaSA9IGVudi0+TmV3U3RyaW5nVVRGKHVyaSk7CisKKyAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoanVyaSk7CisKKyAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooZW52LCBzZXJ2aWNlLCB2ZXJzaW9uKTsKKyAgICByZXR1cm4gaHR0cFNlcnZpY2U7CisKK30KKworc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZShjb25zdCBjaGFyICp1cmksIGludCB2ZXJzaW9uKSB7CisKKyAgICBKTklFbnYgKmVudjsKKyAgICBjb25zdCBjaGFyICpjbGF6eiwgKm1ldGhvZCwgKnNpZ25hdHVyZTsKKworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBlbnYgPSBnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSI7CisgICAgICAgICAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2UiOworICAgICAgICAgICAgbWV0aG9kID0gImNyZWF0ZUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBTZXJ2aWNlOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoZW52LCB1cmksIGNsYXp6LCBtZXRob2QsIHNpZ25hdHVyZSwgdmVyc2lvbik7CisKK30KKwogZXh0ZXJuICJDIiB7CiAKIEVYUE9SVApAQCAtMTA1LDYgKzI3MywzMiBAQAogfQogCiBFWFBPUlQKK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIHsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IHNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleV92YWx1ZXNbaSAqIDJdKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgoa2V5X3ZhbHVlc1tpICogMiArIDFdKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShzZXJ2aWNlLCB1cmksICZoZWFkZXJzKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTE9HSSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlICVzIGZsYWdzICV1Iiwgc291cmNlLT50b1N0cmluZygpLmNfc3RyKCksIHNvdXJjZS0+ZmxhZ3MoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZSogYVNvdXJjZSA9IGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKHNvdXJjZSk7CisgICAgYVNvdXJjZS0+bUltcGwgPSBzb3VyY2U7CisgICAgYVNvdXJjZS0+bUZsYWdzID0gc291cmNlLT5mbGFncygpOworICAgIHJldHVybiBhU291cmNlOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgewogICAgIEFMT0dWKCJkdG9yIik7CiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewpAQCAtMTMyLDUgKzMyNiwxNiBAQAogICAgIG1Tb3VyY2UtPmNsb3NlID0gY2xvc2U7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Y2xvc2UobVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemUpIHsKKyAgICBtU291cmNlLT5nZXRBdmFpbGFibGVTaXplID0gZ2V0QXZhaWxhYmxlU2l6ZTsKK30KKwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNTdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmdldEF2YWlsYWJsZVNpemUob2Zmc2V0LCAmc2l6ZSk7CisgICAgcmV0dXJuICBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMzMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNkZWZpbmUgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgQU1lZGlhRGF0YVNvdXJjZSogY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtU291cmNlLCBzb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1Tb3VyY2UsIERhdGFTb3VyY2VfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1Tb3VyY2UsIERhdGFTb3VyY2VfY2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUpOworICAgIHJldHVybiBtU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCmluZGV4IGVhOWM4NjUuLjE2ZmY5NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQzLDExICs0NCwxMyBAQAogICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOwpAQCAtNTksNSArNjIsNyBAQAogCiB9OwogCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pOworCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCBiNmVhMTgzLi4yZGViMWE0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTI3NCw3ICsyNzQsMTAgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7Ci0gICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7CisgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0ciwKKyAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgIHJldHVybiAoc3RhdHVzID09IE9LKSAmJiBpc1N1cHBvcnRlZDsKIH0KIAogRVhQT1JUCkBAIC00MzAsNiArNDMzLDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNjk3LDcgKzcwMSw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGFjODM3YTMuLmM4M2IyNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zMywzMSArMzQsMjkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfT0s7Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CiAgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CiB9OwogCitzcDxBQnVmZmVyPiBVMzJBcnJheVRvU2l6ZUJ1ZihzaXplX3QgbnVtU3ViU2FtcGxlcywgdWludDMyX3QgKmRhdGEpIHsKKyAgICBpZiAobnVtU3ViU2FtcGxlcyA+ICBTSVpFX01BWCAvIHNpemVvZihzaXplX3QpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBzaXplYnVmID0gbmV3IEFCdWZmZXIobnVtU3ViU2FtcGxlcyAqIHNpemVvZihzaXplX3QpKTsKKyAgICBzaXplX3QgKnNpemVzID0gKHNpemVfdCAqKXNpemVidWYtPmRhdGEoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgc2l6ZXMgIT0gTlVMTCAmJiBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIHNpemVzW2ldID0gZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHNpemVidWY7Cit9CisKIGV4dGVybiAiQyIgewogCiBFWFBPUlQKQEAgLTgyLDQ3ICs4MSwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNyZWF0ZSBodHRwIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlzW2ldKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgodmFsdWVzW2ldKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmksIG51bWhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7Ci0gICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOwotICAgIGlmIChlbnYgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZShwYXRoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIEphdmEgdGhyZWFkIik7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpOwotICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhSHR0cFNlcnZpY2UiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLAotICAgICAgICAgICAgImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyIpOwotICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpzdHJpbmcgamxvYyA9IGVudi0+TmV3U3RyaW5nVVRGKGxvY2F0aW9uKTsKLQotICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwgamxvYyk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihqbG9jKTsKLQotICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKLSAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgc2VydmljZSk7Ci0gICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBsb2NhdGlvbiwgTlVMTCk7Ci0gICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhtRGF0YSwgbG9jYXRpb24sIDAsIE5VTEwsIE5VTEwpOwogfQogCiBFWFBPUlQKQEAgLTM2Myw3ICszNTAsNyBAQAogICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmNyeXB0ZWRkYXRhLCAmY3J5cHRlZHNpemUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CisgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CiAKICAgICBjb25zdCB2b2lkICpjbGVhcmRhdGE7CiAgICAgc2l6ZV90IGNsZWFyc2l6ZTsKQEAgLTM5Nyw2ICszODQsMTYgQEAKICAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKICAgICB9CiAKKyAgICBpZiAoc2l6ZW9mKHVpbnQzMl90KSAhPSBzaXplb2Yoc2l6ZV90KSkgeworICAgICAgICBzcDxBQnVmZmVyPiBjbGVhcmJ1ZiAgID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY2xlYXJkYXRhKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZiA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNyeXB0ZWRkYXRhKTsKKyAgICAgICAgY2xlYXJkYXRhICAgPSBjbGVhcmJ1ZiAgICA9PSBOVUxMID8gTlVMTCA6IGNsZWFyYnVmLT5kYXRhKCk7CisgICAgICAgIGNyeXB0ZWRkYXRhID0gY3J5cHRlZGRhdGEgPT0gTlVMTCA/IE5VTEwgOiBjcnlwdGVkYnVmLT5kYXRhKCk7CisgICAgICAgIGlmKGNyeXB0ZWRkYXRhID09IE5VTEwgfHwgY2xlYXJkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCiAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLAogICAgICAgICAgICAgKHVpbnQ4X3QqKSBrZXksCkBAIC00NzIsNiArNDY5LDE2IEBACiAgICAgICAgIG1ldGEtPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLCBtcGVnVXNlckRhdGEpOwogICAgIH0KIAorICAgIGNvbnN0IHZvaWQgKmF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXI7CisgICAgc2l6ZV90IGF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZERhdGEoCisgICAgICAgICAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmZGF0YVR5cGUsCisgICAgICAgICAgICAmYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlciwgJmF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXVkaW9QcmVzZW50YXRpb25zRGF0YSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyLCBhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGgpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYXVkaW9QcmVzZW50YXRpb25zRGF0YSk7CisgICAgfQorCiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKaW5kZXggZjMyYjgzZS4uNzY4YTdhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0yMCw0MyArMjAsMjAgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBTdHJpbmc4IG1EZWJ1ZzsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Ci19OwotCiBleHRlcm4gIkMiIHsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgQUxPR1YoInByaXZhdGUgY3RvciIpOwotICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7Ci0gICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOwotICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKLSAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgfQotICAgIHJldHVybiBtRGF0YTsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKLSAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Ci19Ci0KLQogLyoKICAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKICAqLwpAQCAtNzQsNiArNTEsMjEgQEAKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5jbGVhcigpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgeworICAgIGlmICghdG8gfHwgIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgdG8tPm1Gb3JtYXQtPmNsZWFyKCk7CisgICAgdG8tPm1Gb3JtYXQtPmV4dGVuZChmcm9tLT5tRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiAKIEVYUE9SVAogY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKQEAgLTI1Niw3ICsyNDgsNyBAQAogfQogCiBFWFBPUlQKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKICAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAogICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwpAQCAtMjc1LDY1ICsyNjcsMTIyIEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UID0gImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgPSAiYWFjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFID0gImFhYy1zYnItbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSA9ICJhbGJ1bSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCA9ICJhbGJ1bWFydCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCA9ICJhbGJ1bWFydGlzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgPSAiYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPID0gImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgPQorICAgICAgICAiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCA9ICJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEID0gImF1ZGlvLXNlc3Npb24taWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SID0gImF1dGhvciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgPSAiYml0cmF0ZS1tb2RlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFID0gImJpdHMtcGVyLXNhbXBsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgPSAiY2FwdHVyZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgPSAiY2R0cmFja251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFID0gImNvbG9yLXJhbmdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEID0gImNvbG9yLXN0YW5kYXJkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSID0gImNvbG9yLXRyYW5zZmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OID0gImNvbXBpbGF0aW9uIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFkgPSAiY29tcGxleGl0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiA9ICJjb21wb3NlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLXBsYWluLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgPSAiY3NkLWF2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyA9ICJjc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzID0gImQyNjMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSA9ICJkYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgPSAiZGlzY251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgPSAiY3JvcCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCA9ICJkaXNwbGF5LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIID0gImRpc3BsYXktd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZID0gImVuY29kZXItZGVsYXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HID0gImVuY29kZXItcGFkZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTID0gImVzZHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgPSAiZXhpZi1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFID0gImV4aWYtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgPSAiZnJhbWUtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFID0gImdlbnJlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUyA9ICJncmlkLWNvbHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTID0gImdyaWQtcm93cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUjEwX1BMVVNfSU5GTyA9ICJoZHIxMC1wbHVzLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgPSAiaXMtc3luYy1mcmFtZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSA9ICJsYXRlbmN5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMID0gImxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgPSAibG9vcCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCA9ICJseXJpY2lzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgPSAibWFudWZhY3R1cmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSA9ICJtYXgtYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVIgPSAibWF4LWZwcy10by1lbmNvZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggPSAicHNzaCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgPSAic2FyLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggPSAic2FyLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSA9ICJzZWkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUID0gInNsaWNlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCA9ICJ0aHVtYm5haWwtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FID0gInRodW1ibmFpbC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCA9ICJ0aHVtYm5haWwtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQgPSAidGlsZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCA9ICJ0aWxlLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMgPSAidGltZVVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFID0gInRpdGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEID0gInRyYWNrLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYID0gInRyYWNrLWluZGV4IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgPSAidmFsaWQtc2FtcGxlcyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7Ci0KK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgPSAieWVhciI7CiAKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTY1NjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgotICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgotICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KLSAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KLSAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCi0gKi8KLQotI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLSNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUFNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2codm9pZCopOwotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCmluZGV4IGRmZmM0ZDcuLmQxOTkyYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKQEAgLTIwLDcgKzIwLDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhTXV4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yOSwyMSArMzAsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjNlNjBkZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSw1MSBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5LAorCisgICAgLyoqCisgICAgICogQ29tcHJlc3NlZCBIRUlDIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZm9ybWF0IGRlZmluZXMgdGhlIEhFSUMgYnJhbmQgb2YgSGlnaCBFZmZpY2llbmN5IEltYWdlIEZpbGUKKyAgICAgKiBGb3JtYXQgYXMgZGVzY3JpYmVkIGluIElTTy9JRUMgMjMwMDgtMTIuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfSEVJQyA9IDB4NDg0NTQ5NDYsCisKKyAgICAvKioKKyAgICAgKiBEZXB0aCBhdWdtZW50ZWQgY29tcHJlc3NlZCBKUEVHIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPkpQRUcgY29tcHJlc3NlZCBtYWluIGltYWdlIGFsb25nIHdpdGggWE1QIGVtYmVkZGVkIGRlcHRoIG1ldGFkYXRhCisgICAgICogZm9sbG93aW5nIElTTyAxNjY4NC0xOjIwMTEoRSkuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRyA9IDB4Njk2NTY5NjMsCisKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNjhkZTE3Ni4uZTVkODYzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIF9OREtfSU1BR0VfUkVBREVSX0gKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCkBAIC00NjEsNiArNDY0LDIzIEBACiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciogbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisvKgorICogR2V0IHRoZSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUgQU5hdGl2ZVdpbmRvdyBvd25lZCBieSB0aGUKKyAqIEFJbWFnZVJlYWRlciBwcm92aWRlZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gaGFuZGxlIFRoZSBvdXRwdXQgbmF0aXZlX2hhbmRsZV90LiBUaGlzIG5hdGl2ZSBoYW5kbGUgaXMgb3duZWQgYnkKKyAqICAgICAgICAgICAgICAgdGhpcyBpbWFnZSByZWFkZXIuCisgKgorICogQHJldHVybiBBTUVESUFfT0sgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICogICAgICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgcmVhZGVyIG9yIGhhbmRsZSBhcmUgTlVMTC4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gaWYgc29tZSBvdGhlciBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKIF9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IGVhNWJhMGMuLjE2YjFlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC00MywxNCArNDMsOSBAQAogLyoKICAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCiAgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKLSAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5Ci0gKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSAqCi0gKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAotICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQotICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKLSAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKLSAqIGZyYW1ld29yay4KKyAqIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIHxjbG9zZXwgY2FuIGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUKKyAqIHRocmVhZCBpbnZva2luZyB8cmVhZEF0fC4gQXMgc3VjaCwgdGhlIEltcGxlbWVudGF0aW9ucyBvZiBBTWVkaWFEYXRhU291cmNlIGNhbGxiYWNrcworICogbXVzdCBiZSB0aHJlYWRzYWZlLgogICovCiAKIC8qKgpAQCAtNzQsOSArNjksMTkgQEAKIHR5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSh2b2lkICp1c2VyZGF0YSk7CiAKIC8qKgotICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB8Y2xvc2V8IGlzIGNhbGxlZAotICogbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlLgorICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZAorICogcmVzb3VyY2VzLgorICoKKyAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB0aGUgZmlyc3QgfGNsb3NlfCBpcworICogY2FsbGVkLCBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UgZXhjZXB0CisgKiBmb3IgfGNsb3NlfCBpdHNlbGYuCisgKgorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIGFsbG93cyByZWFkQXQgY2FsbHMgdGhhdCB3ZXJlIGJsb2NrZWQgd2FpdGluZworICogZm9yIEkvTyBkYXRhIHRvIHJldHVybiBwcm9tcHRseS4KKyAqCisgKiBXaGVuIHVzaW5nIEFNZWRpYURhdGFTb3VyY2UgYXMgaW5wdXQgdG8gQU1lZGlhRXh0cmFjdG9yLCBjbG9zaW5nCisgKiBoYXMgdGhlIGVmZmVjdCBvZiB1bmJsb2NraW5nIHNsb3cgcmVhZHMgaW5zaWRlIG9mIHNldERhdGFTb3VyY2UKKyAqIGFuZCByZWFkU2FtcGxlRGF0YS4KICAqLwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRGF0YVNvdXJjZUNsb3NlKSh2b2lkICp1c2VyZGF0YSk7CiAKQEAgLTg2LDYgKzkxLDM4IEBACiAgKi8KIEFNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3KCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENhbGxlZCB0byBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZQorICogc3RhcnRpbmcgYXQgfG9mZnNldHwgd2l0aG91dCBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFJldHVybiAtMSB3aGVuIHN1Y2ggYW4gZXN0aW1hdGUgaXMgbm90IHBvc3NpYmxlLgorICovCit0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworLyoqCisgKiBDcmVhdGUgbmV3IG1lZGlhIGRhdGEgc291cmNlLiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZvciB0aGUgbmV3IGRhdGEgc291cmNlIG9iamVjdCBmYWlscy4KKyAqCisgKiBTZXQgdGhlIHx1cml8IGZyb20gd2hpY2ggdGhlIGRhdGEgc291cmNlIHdpbGwgcmVhZCwKKyAqIHBsdXMgYWRkaXRpb25hbCBodHRwIGhlYWRlcnMgd2hlbiBpbml0aWF0aW5nIHRoZSByZXF1ZXN0LgorICoKKyAqIEhlYWRlcnMgd2lsbCBjb250YWluIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSB8a2V5X3ZhbHVlc3wKKyAqIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAqCisgKiBrZXlfdmFsdWVzWzBdOmtleV92YWx1ZXNbMV0KKyAqIGtleV92YWx1ZXNbMl06a2V5X3ZhbHVlc1szXQorICogLi4uCisgKiBrZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyXTprZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyICsgMV0KKyAqCisgKi8KK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiAvKioKICAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBkYXRhIHNvdXJjZS4KICAqLwpAQCAtMTM3LDYgKzE3NCwzMCBAQAogCiAjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlQ2xvc2UgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcworICogdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2Ugc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IHdpdGhvdXQKKyAqIGJsb2NraW5nIGZvciBJL08uCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplCisgKiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZSgKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDc1ZjQ2MDUuLjJiZTFkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTYzLDYgKzYzLDcgQEAKICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04gICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA1LAogICAgIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDYsCiAgICAgQU1FRElBX0VSUk9SX0lPICAgICAgICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNywKKyAgICBBTUVESUFfRVJST1JfV09VTERfQkxPQ0sgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA4LAogCiAgICAgQU1FRElBX0RSTV9FUlJPUl9CQVNFICAgICAgICAgICAgICA9IC0yMDAwMCwKICAgICBBTUVESUFfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgID0gQU1FRElBX0RSTV9FUlJPUl9CQVNFIC0gMSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDZhMTc5NmYuLmUzZDlmZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtNzIsNyArNzIsNiBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICBjb25zdCBjaGFyICpsb2NhdGlvbikgX19JTlRST0RVQ0VEX0lOKDIxKTsKLSAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA1Zjc4MDRkLi41NmJjYWFiIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTgzLDEzICs4Myw5IEBACiAvKioKICAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCiAgKi8KLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCi0KLS8qKgotICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KLSAqLwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OIF9fSU5UUk9EVUNFRF9JTigyOCk7CkBAIC0xNTYsNyArMTUyLDYgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggX19JTlRST0RVQ0VEX0lOKDIxKTsKLQogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CkBAIC0xNzAsNiArMTY1LDc2IEBACiAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIHJlbW92ZSBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGdpdmVuIEFNZWRpYUZvcm1hdAorICovCit2b2lkIEFNZWRpYUZvcm1hdF9jbGVhcihBTWVkaWFGb3JtYXQqKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIGNvcHkgb25lIEFNZWRpYUZvcm1hdCB0byBhbm90aGVyCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BST0dSQU1fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EQVRFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VTRFMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HRU5SRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFOVUZBQ1RVUkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USVRMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IGRlZWNiNjMuLjk3NTY5MjYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC00LDYgKzQsNyBAQAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgorICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGU7ICN2bmRrCiAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEhlaWdodDsgIyBpbnRyb2R1Y2VkPTI0CkBAIC0zNCw2NCArMzUsMTE4IEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BVVRIT1I7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0U7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1A7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfR0VOUkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPT1A7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QU1NIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfWUVBUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGU7CkBAIC0xNDIsNiArMTk3LDkgQEAKICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ld1VyaTsgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlOyAgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9jbG9zZVNlc3Npb247CiAgICAgQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRDsKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKQEAgLTE4OCw2ICsyNDYsOCBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcjsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRm9ybWF0X2NvcHk7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKICAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBmZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxOZGtJbWFnZVJlYWRlclByaXYuaD4KKyNpbmNsdWRlIDx2bmRrL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ltYWdlQnVmZmVyVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU47CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEltYWdlcyA9IDE7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCA9IDEzODQ4ODg2MTE7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAgPSBmYWxzZTsKK3N0YXRpYyBjb25zdGV4cHIgYW5kcm9pZF9kYXRhc3BhY2Uga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CitzdGF0aWMgY29uc3QgUmVjdCBrUXVldWVCdWZmZXJJbnB1dFJlY3QgPSBSZWN0KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSA9IDA7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSA9IDA7CitzdGF0aWMgY29uc3Qgc3A8RmVuY2U+IGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzID0gMTAwICogMTAwMDsKKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2Uoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwga0ltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUJ1ZmZlclVzYWdlICwga01heEltYWdlcywgJmltYWdlUmVhZGVyXyk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICBBU1NFUlRfTkUoaW1hZ2VSZWFkZXJfLCBudWxscHRyKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJEZXRhY2hlZENiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWFnZVJlYWRlcl8pIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIEFJbWFnZSAqb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfT0s7CisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW10oQUltYWdlICppbWcpIHsgQUltYWdlX2RlbGV0ZShpbWcpOyB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIGltYWdlIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoaW1hZ2VSZWFkZXJfLCAmb3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfTkUoaW1nLCBudWxscHRyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhIGhhbmRsZSB0byB0aGUgaW1hZ2UncyBoYXJkd2FyZSBidWZmZXIgYW5kIGEKKyAgICAgICAgLy8gbmF0aXZlIGhhbmRsZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyICpoYXJkd2FyZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIEFTU0VSVF9ORShoYXJkd2FyZUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICAgICAgaW1hZ2VBdmFpbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgaW1hZ2VDb25kVmFyXy5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikgeworICAgICAgICAodm9pZClyZWFkZXI7CisgICAgICAgIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKnRoaXNDb250ZXh0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqPihjb250ZXh0KTsKKyAgICAgICAgdGhpc0NvbnRleHQtPkhhbmRsZUltYWdlQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJSZW1vdmVkKHZvaWQgKiwgQUltYWdlUmVhZGVyICosIEFIYXJkd2FyZUJ1ZmZlciAqKSB7CisgICAgfQorCisgICAgQUltYWdlUmVhZGVyICppbWFnZVJlYWRlcl8gPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlUmVhZGVyQXZhaWxhYmxlQ2Jfe3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgaW1hZ2VSZWFkZXJEZXRhY2hlZENiX3t0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworICAgIHN0ZDo6bXV0ZXggaW1hZ2VBdmFpbGFibGVNdXRleF87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW1hZ2VDb25kVmFyXzsKKyAgICBib29sIGltYWdlQXZhaWxhYmxlXyA9IGZhbHNlOworfTsKKworc3RhdGljIHZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBBSW1hZ2VSZWFkZXIuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShpbWFnZVJlYWRlcl8sICZuaCk7CisgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG9ubHkgaW50cyBpbiB0aGUgaGFuZGxlLgorICAgIEFTU0VSVF9FUShuaC0+bnVtRmRzLCAwKTsKKyAgICBBU1NFUlRfTkUobmgtPm51bUludHMsIDApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgSEdCUCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGhhbmRsZS4KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0gIEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShuaCk7CisgICAgQVNTRVJUX05FKGhnYnAsIG51bGxwdHIpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGhnYnApOworICAgIGludCBkZXF1ZXVlZFNsb3QgPSAtMTsKKyAgICBzcDxGZW5jZT4gZGVxdWV1ZWRGZW5jZTsKKyAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBvdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5jb25uZWN0KG51bGxwdHIsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgZmFsc2UsICZvdXRwdXQpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZGVxdWV1ZSBhIGJ1ZmZlci4KKyAgICBBU1NFUlRfRVEoT0ssCisgICAgICAgICAgICAgIH5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OICYKKyAgICAgICAgICAgICAgICAgICAgICAoaWdicC0+ZGVxdWV1ZUJ1ZmZlcigmZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUZvcm1hdCwga0ltYWdlQnVmZmVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpKTsKKyAgICBFWFBFQ1RfTEUoMCwgZGVxdWV1ZWRTbG90KTsKKyAgICBFWFBFQ1RfR1QoQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMsIGRlcXVldWVkU2xvdCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBkZXF1ZXVlZEJ1ZmZlcjsKKyAgICBpZ2JwLT5yZXF1ZXN0QnVmZmVyKGRlcXVldWVkU2xvdCwgJmRlcXVldWVkQnVmZmVyKTsKKyAgICB1aW50OF90KiBpbWcgPSBudWxscHRyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPmxvY2soa0ltYWdlQnVmZmVyVXNhZ2UsICh2b2lkKiopKCZpbWcpKSk7CisKKyAgICAvLyBXcml0ZSBpbiBzb21lIGR1bW15IGltYWdlIGRhdGEuCisgICAgZmlsbFJHQkE4QnVmZmVyKGltZywgZGVxdWV1ZWRCdWZmZXItPmdldFdpZHRoKCksIGRlcXVldWVkQnVmZmVyLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRCdWZmZXItPmdldFN0cmlkZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT51bmxvY2soKSk7CisgICAgUXVldWVCdWZmZXJJbnB1dCBxdWV1ZUJ1ZmZlcklucHV0KGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UpOworICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+cXVldWVCdWZmZXIoZGVxdWV1ZWRTbG90LCBxdWV1ZUJ1ZmZlcklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KSk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgb25JbWFnZUF2YWlsYWJsZSBjYWxsYmFjayBpcyBjYWxsZWQsIG9yIHRpbWVvdXQgY29tcGxldGVzLgorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgaW1hZ2VDb25kVmFyXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXXsgcmV0dXJuIHRoaXMtPmltYWdlQXZhaWxhYmxlXzt9KTsKKyAgICBFWFBFQ1RfVFJVRShpbWFnZUF2YWlsYWJsZV8pIDw8ICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGltYWdlIGRhdGEgdG8gYmUgaGFuZGxlZCFcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOworCitzdGF0aWMgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUCAoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgaGFsVG9rZW4gdmVjPHVpbnQ4X3Q+CisgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGNvbnN0X2Nhc3Q8aW50ICo+KCYoaGFuZGxlLT5kYXRhWzFdKSkpLAorICAgICAgICBoYW5kbGUtPmRhdGFbMF0pOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIHJldHVybiBoZ2JwOworfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAwICB8fAorICAgICAgICBoYW5kbGUtPm51bUludHMgPCBzdGQ6OmNlaWwoc2l6ZW9mKHNpemVfdCkgLyBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQKGhhbmRsZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgYWltZworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBkNmRhZTViLi5hMTE2MDJiIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2LDI1ICsxNiwzOSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgIF0sCiAKKyAgICBsb2d0YWdzOiBbIkV2ZW50TG9nVGFncy5sb2d0YWdzIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHByb2R1Y3RfaXNfaW90OiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLURUQVJHRVRfQU5EUk9JRF9USElOR1MiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMGVhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0wLDAgKzEsNDEgQEAKKyMgVGhlIGVudHJpZXMgaW4gdGhpcyBmaWxlIG1hcCBhIHNwYXJzZSBzZXQgb2YgbG9nIHRhZyBudW1iZXJzIHRvIHRhZyBuYW1lcy4KKyMgVGhpcyBpcyBpbnN0YWxsZWQgb24gdGhlIGRldmljZSwgaW4gL3N5c3RlbS9ldGMsIGFuZCBwYXJzZWQgYnkgbG9nY2F0LgorIworIyBUYWcgbnVtYmVycyBhcmUgZGVjaW1hbCBpbnRlZ2VycywgZnJvbSAwIHRvIDJeMzEuICAoTGV0J3MgbGVhdmUgdGhlCisjIG5lZ2F0aXZlIHZhbHVlcyBhbG9uZSBmb3Igbm93LikKKyMKKyMgVGFnIG5hbWVzIGFyZSBvbmUgb3IgbW9yZSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzIG9yIHVuZGVyc2NvcmVzLCBpLmUuCisjICJbQS1aXVthLXpdWzAtOV1fIi4gIERvIG5vdCBpbmNsdWRlIHNwYWNlcyBvciBwdW5jdHVhdGlvbiAodGhlIGZvcm1lcgorIyBpbXBhY3RzIGxvZyByZWFkYWJpbGl0eSwgdGhlIGxhdHRlciBtYWtlcyByZWdleCBzZWFyY2hlcyBtb3JlIGFubm95aW5nKS4KKyMKKyMgVGFnIG51bWJlcnMgYW5kIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcworIyBzdGFydGluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4KKyMKKyMgT3B0aW9uYWxseSwgYWZ0ZXIgdGhlIHRhZyBuYW1lcyBjYW4gYmUgcHV0IGEgZGVzY3JpcHRpb24gZm9yIHRoZSB2YWx1ZShzKQorIyBvZiB0aGUgdGFnLiBEZXNjcmlwdGlvbiBhcmUgaW4gdGhlIGZvcm1hdAorIyAgICAoPG5hbWU+fGRhdGEgdHlwZVt8ZGF0YSB1bml0XSkKKyMgTXVsdGlwbGUgdmFsdWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorIworIyBUaGUgZGF0YSB0eXBlIGlzIGEgbnVtYmVyIGZyb20gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisjIDE6IGludAorIyAyOiBsb25nCisjIDM6IHN0cmluZworIyA0OiBsaXN0CisjCisjIFRoZSBkYXRhIHVuaXQgaXMgYSBudW1iZXIgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisjIDE6IE51bWJlciBvZiBvYmplY3RzCisjIDI6IE51bWJlciBvZiBieXRlcworIyAzOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzCisjIDQ6IE51bWJlciBvZiBhbGxvY2F0aW9ucworIyA1OiBJZAorIyA2OiBQZXJjZW50CisjIERlZmF1bHQgdmFsdWUgZm9yIGRhdGEgb2YgdHlwZSBpbnQvbG9uZyBpcyAyIChieXRlcykuCisjCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSB0YWdzLgorCisjIDYxMDAwIC0gNjExOTkgcmVzZXJ2ZWQgZm9yIGF1ZGlvc2VydmVyCisKKzYxMDAwIGF1ZGlvc2VydmVyX2JpbmRlcl90aW1lb3V0IChjb21tYW5kfDMpCisKKyMgTk9URSAtIHRoZSByYW5nZSAxMDAwMDAwLTIwMDAwMDAgaXMgcmVzZXJ2ZWQgZm9yIHBhcnRuZXJzIGFuZCBvdGhlcnMgd2hvCisjIHdhbnQgdG8gZGVmaW5lIHRoZWlyIG93biBsb2cgdGFncyB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIGNvcmUgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYjI0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZVV0aWxpdGllcyIKKworI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKKyAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKKyAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKKyAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCisgKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgorICovCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CisKK3N0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKKyAgICB9CisgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcworICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQorICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKKyAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCisgICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCisgICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgorICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2VzWzBdOworfQorCitzdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQorICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgorICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgorICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQorICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXBwT3BzLmNoZWNrT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKK30KKworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKK30KKwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm47CisKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Cit9CisKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCisgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKKyAgICAvLyBnaXZlbiB0aGlzIGlzIGEgcGVybWlzc2lvbiBjaGVjaywgY291bGQgdGhpcyBiZSBpc0F1ZGlvU2VydmVyT3JSb290VWlkKCk/CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgKKyAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQpOworCisjaWZkZWYgVEFSR0VUX0FORFJPSURfVEhJTkdTCisgICAgaWYgKCFvaykgeworICAgICAgICAvLyBVc2UgYSBzZWNvbmRhcnkgcGVybWlzc2lvbiBvbiBBbmRyb2lkIFRoaW5ncyB0byBhbGxvdyBhIG1vcmUgbGVuaWVudCBsZXZlbCBvZiBwcm90ZWN0aW9uLgorICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCgKKyAgICAgICAgICAgICAgICAiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dFKCJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworI2Vsc2UKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbmRpZgorICAgIHJldHVybiBvazsKK30KKworYm9vbCBkdW1wQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKKyAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCisgICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkKK3sKKyAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgSU1lbW9yeSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGlNZW1vcnktPmdldE1lbW9yeSgpOworICAgIGlmIChoZWFwID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBoZWFwIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG9mZl90IHNpemUgPSBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoaU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwgfHwgc2l6ZSA8IChvZmZfdClpTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogcG9pbnRlciAlcCBzaXplICV6dSBmZCBzaXplICV1IiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpTWVtb3J5LT5wb2ludGVyKCksIGlNZW1vcnktPnNpemUoKSwgKHVpbnQzMl90KXNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6cmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpIHsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgaWYgKHNtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gcGFja2FnZU1hbmFnZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KG5hdGl2ZVBhY2thZ2VNYW5hZ2VyTmFtZSkpOworICAgIGlmIChwYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIG5hdGl2ZSBwYWNrYWdlIG1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4ocGFja2FnZU1hbmFnZXIpOworfQorCitzdGQ6Om9wdGlvbmFsPGJvb2w+IE1lZGlhUGFja2FnZU1hbmFnZXI6OmRvSXNBbGxvd2VkKHVpZF90IHVpZCkgeworICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvKiogQ2FuIG5vdCBmZXRjaCBwYWNrYWdlIG1hbmFnZXIgYXQgY29uc3RydWN0aW9uIGl0IG1heSBub3QgeWV0IGJlIHJlZ2lzdGVyZWQuICovCisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGFzIHBhY2thZ2UgbWFuYWdlciBpcyBub3QgcmVhY2hhYmxlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWNrYWdlTmFtZXM7CisgICAgYXV0byBzdGF0dXMgPSBtUGFja2FnZU1hbmFnZXItPmdldE5hbWVzRm9yVWlkcyh7KGludDMyX3QpdWlkfSwgJnBhY2thZ2VOYW1lcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgcGFja2FnZSBuYW1lcyBjb3VsZCBub3QgYmUgIgorICAgICAgICAgICAgICAicmV0cmlldmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIGlmIChwYWNrYWdlTmFtZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgZm9yIHVpZCAldSBpcyBkZW5pZWQgYXMgbm8gcGFja2FnZSBuYW1lIGNvdWxkIGJlIHJldHJpZXZlZCAiCisgICAgICAgICAgICAgICJmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBpc0FsbG93ZWQ7CisgICAgc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5pc0F1ZGlvUGxheWJhY2tDYXB0dXJlQWxsb3dlZChwYWNrYWdlTmFtZXMsICZpc0FsbG93ZWQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIG1hbmlmZXN0IHByb3BlcnR5IGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgIT0gaXNBbGxvd2VkLnNpemUoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIHBhY2thZ2UgbWFuYWdlciByZXR1cm5lZCBpbmNvaGVyZW50IgorICAgICAgICAgICAgICAiIHJlc3BvbnNlIHNpemU6ICV6dSAhPSAlenUiLCBfX2Z1bmNfXywgdWlkLCBwYWNrYWdlTmFtZXMuc2l6ZSgpLCBpc0FsbG93ZWQuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBaaXAgdG9nZXRoZXIgcGFja2FnZU5hbWVzIGFuZCBpc0FsbG93ZWQgZm9yIGRlYnVnIGxvZ3MKKyAgICBQYWNrYWdlcyYgcGFja2FnZXMgPSBtRGVidWdMb2dbdWlkXTsKKyAgICBwYWNrYWdlcy5yZXNpemUocGFja2FnZU5hbWVzLnNpemUoKSk7IC8vIFJldXNlIGFsbCBvYmplY3RzCisgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4ocGFja2FnZU5hbWVzKSwgZW5kKHBhY2thZ2VOYW1lcyksIGJlZ2luKGlzQWxsb3dlZCksCisgICAgICAgICAgICAgICAgICAgYmVnaW4ocGFja2FnZXMpLCBbXSAoYXV0byYgbmFtZSwgYm9vbCBpc0FsbG93ZWQpIC0+IFBhY2thZ2UgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShuYW1lKSwgaXNBbGxvd2VkfTsKKyAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIE9ubHkgYWxsb3cgcGxheWJhY2sgcmVjb3JkIGlmIGFsbCBwYWNrYWdlcyBpbiB0aGlzIFVJRCBhbGxvdyBpdAorICAgIGJvb2wgcGxheWJhY2tDYXB0dXJlQWxsb3dlZCA9IHN0ZDo6YWxsX29mKGJlZ2luKGlzQWxsb3dlZCksIGVuZChpc0FsbG93ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShib29sIGIpIHsgcmV0dXJuIGI7IH0pOworCisgICAgcmV0dXJuIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQ7Cit9CisKK3ZvaWQgTWVkaWFQYWNrYWdlTWFuYWdlcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0IHsKKyAgICBkcHJpbnRmKGZkLCAiJSpzQWxsb3cgcGxheWJhY2sgY2FwdHVyZSBsb2c6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqc05vIHBhY2thZ2UgbWFuYWdlclxuIiwgc3BhY2VzICsgMiwgIiIpOworICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiJSpzUGFja2FnZSBtYW5hZ2VyIGVycm9yczogJXVcbiIsIHNwYWNlcyArIDIsICIiLCBtUGFja2FnZU1hbmFnZXJFcnJvcnMpOworCisgICAgZm9yIChjb25zdCBhdXRvJiB1aWRDYWNoZSA6IG1EZWJ1Z0xvZykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2thZ2UgOiBzdGQ6OmdldDxQYWNrYWdlcz4odWlkQ2FjaGUpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJSpzLSB1aWQ9JTV1LCBhbGxvd1BsYXliYWNrQ2FwdHVyZT0lcywgcGFja2FnZU5hbWU9JXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxjb25zdCB1aWRfdD4odWlkQ2FjaGUpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLnBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5uYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNmNGVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRMb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3NwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCit7CisgICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CisgICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQorICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKK3sKK30KKworVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgeworICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCituc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOworICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOworICAgIG1Db25kLnNpZ25hbCgpOworICAgIHJldHVybiBlbmRUaW1lTnM7Cit9CisKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK2Jvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICBjb25zdCBjaGFyICp0YWc7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7CisgICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAorICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKKyAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19FVkVOVF9TVFJJTkcoTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VULCB0YWcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZGUxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorI2RlZmluZSBBSU1BR0VfUkVBREVSX1VUSUxTX0gKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWltZyB7CisKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBSZXRyaWV2ZXMgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmVfaGFuZGxlX3QKKy8vIHByb3ZpZGVkICh0aGlzIG5hdGl2ZSBoYW5kbGUgTVVTVCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgpKS4KK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSk7CisKK30vLyBuYW1lc3BhY2UgYWltZworfS8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FJTUFHRV9SRUFERVJfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNkM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8ga2VlcCB2YWx1ZXMgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYXYvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKK2VudW0geworICBMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQgPSA2MTAwMCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzcwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBVVRJTFNfU0VSVklDRVVUSUxJVElFU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQXVkaW8gcGVybWlzc2lvbiB1dGlsaXRpZXMKKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gc3lzdGVtIHNlcnZpY2VzLgorLy8gV2UgYWxsb3cgdGhhdCBzb21lIHNlcnZpY2VzIG1pZ2h0IGhhdmUgc2VwYXJhdGUgcHJvY2Vzc2VzIHRvCisvLyBoYW5kbGUgbXVsdGlwbGUgdXNlcnMsIGUuZy4gdTEwX3N5c3RlbSwgdTEwX2JsdWV0b290aCwgdTEwX3JhZGlvLgorc3RhdGljIGlubGluZSBib29sIGlzU2VydmljZVVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Cit9CisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIGF1ZGlvc2VydmVyLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVI7Cit9CisKKy8vIFVzZWQgZm9yIHNvbWUgcGVybWlzc2lvbiBjaGVja3MuCisvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIHx8IHVpZCA9PSBBSURfUk9PVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgY29tZSBmcm9tIHN5c3RlbSBzZXJ2ZXIgb3IgaW50ZXJuYWwuCisvLyBOb3RlOiBzeXN0ZW0gc2VydmVyIGlzIG11bHRpcHJvY2VzcyBmb3IgbXVsdGlwbGUgdXNlcnMuICBhdWRpb3NlcnZlciBpcyBub3QuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpID09IEFJRF9TWVNURU0gfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gTWVkaWFzZXJ2ZXIgbWF5IGZvcndhcmQgdGhlIGNsaWVudCBQSUQgYW5kIFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsOworLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHN3aXRjaCAodWlkKSB7CisgICAgY2FzZSBBSURfTUVESUE6CisgICAgY2FzZSBBSURfQVVESU9TRVJWRVI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOworYm9vbCBkdW1wQWxsb3dlZCgpOworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CitzdGF0dXNfdCBjaGVja0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpOworCitjbGFzcyBNZWRpYVBhY2thZ2VNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgICAvKiogUXVlcnkgdGhlIFBhY2thZ2VNYW5hZ2VyIHRvIGNoZWNrIGlmIGFsbCBhcHBzIG9mIGFuIFVJRCBhbGxvdyBwbGF5YmFjayBjYXB0dXJlLiAqLworICAgIGJvb2wgYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkX3QgdWlkKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gZG9Jc0FsbG93ZWQodWlkKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlckVycm9ycysrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOworICAgIH0KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7Citwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogbmF0aXZlUGFja2FnZU1hbmFnZXJOYW1lID0gInBhY2thZ2VfbmF0aXZlIjsKKyAgICBzdGQ6Om9wdGlvbmFsPGJvb2w+IGRvSXNBbGxvd2VkKHVpZF90IHVpZCk7CisgICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpOworICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IG1QYWNrYWdlTWFuYWdlcjsgLy8gVG8gY2hlY2sgYXBwcyBtYW5pZmVzdAorICAgIHVpbnRfdCBtUGFja2FnZU1hbmFnZXJFcnJvcnMgPSAwOworICAgIHN0cnVjdCBQYWNrYWdlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgYm9vbCBwbGF5YmFja0NhcHR1cmVBbGxvd2VkID0gZmFsc2U7CisgICAgfTsKKyAgICB1c2luZyBQYWNrYWdlcyA9IHN0ZDo6dmVjdG9yPFBhY2thZ2U+OworICAgIHN0ZDo6bWFwPHVpZF90LCBQYWNrYWdlcz4gbURlYnVnTG9nOworfTsKK30KKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKcmVuYW1lIHRvIG1lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmOWRjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIHBhY2thZ2UgaXMgZXhjbHVkZWQgZnJvbSBidWlsZCBmb3Igbm93IHNpbmNlIEFQSXMgdXNpbmcgdGhpcyBhcGsgYmVjYW1lIGhpZGRlbi4KLSMKLSNMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0jaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkgIyBCdWlsZCBNZWRpYUNvbXBvbmVudHMgb25seSBpZiB0aGlzIGlzIG5vdCBhIFBESyBidWlsZC4gIE1lZGlhQ29tcG9uZW50cyB3b24ndAotIyMgYnVpbGQgaW4gUERLIGJ1aWxkcyBiZWNhdXNlIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEgaXMgbm90IGF2YWlsYWJsZSBidXQKLSMjIElNZWRpYVNlc3Npb24yLmFpZGwgYW5kIElNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYXJlIHVzaW5nIGNsYXNzZXMgZnJvbQotIyMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS4KLSMKLSNpbmNsdWRlICQoQ0xFQVJfVkFSUykKLSMKLSNMT0NBTF9QQUNLQUdFX05BTUUgOj0gTWVkaWFDb21wb25lbnRzCi0jTE9DQUxfTU9EVUxFX09XTkVSIDo9IGdvb2dsZQotIwotIyMgVE9ETzogY3JlYXRlIGEgc2VwYXJhdGUga2V5IGZvciB0aGlzIHBhY2thZ2UuCi0jTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLSMKLSMjIFRPRE86IFVzZSBTeXN0ZW0gU0RLIG9uY2UgcHVibGljIEFQSXMgYXJlIGFwcHJvdmVkCi0jIyBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAotI0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0jCi0jTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSMgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKLSMgICAgJChjYWxsIGFsbC1JYWlkbC1maWxlcy11bmRlciwgc3JjKQotIwotI0xPQ0FMX1BST0dVQVJEX0ZMQUdfRklMRVMgOj0gcHJvZ3VhcmQuY2ZnCi0jCi0jTE9DQUxfTVVMVElMSUIgOj0gZmlyc3QKLSMKLSNMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLXN1cHBvcnQtYW5ub3RhdGlvbnMKLSMKLSMjIFRvIGVtYmVkIG5hdGl2ZSBsaWJyYXJpZXMgaW4gcGFja2FnZSwgdW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdy4KLSMjTE9DQUxfTU9EVUxFX1RBR1MgOj0gc2FtcGxlcwotIyNMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0jIyAgICBsaWJhYWNleHRyYWN0b3IgXAotIyMgICAgbGliYW1yZXh0cmFjdG9yIFwKLSMjICAgIGxpYmZsYWNleHRyYWN0b3IgXAotIyMgICAgbGlibWlkaWV4dHJhY3RvciBcCi0jIyAgICBsaWJta3ZleHRyYWN0b3IgXAotIyMgICAgbGlibXAzZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wNGV4dHJhY3RvciBcCi0jIyAgICBsaWJtcGVnMmV4dHJhY3RvciBcCi0jIyAgICBsaWJvZ2dleHRyYWN0b3IgXAotIyMgICAgbGlid2F2ZXh0cmFjdG9yIFwKLSMKLSMjIFRPRE86IFJlbW92ZSBkZXBlbmRlbmN5IHdpdGggb3RoZXIgc3VwcG9ydCBsaWJyYXJpZXMuCi0jTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTICs9IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LWFwcGNvbXBhdCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1wYWxldHRlCi0jTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKLSMKLSNpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLSMKLSNlbmRpZiAgIyBpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQotIwotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmRjYTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUiCi0gICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKLSAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KLQotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBDb21wb25lbnRzIFVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDptdWx0aUFyY2g9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmV4dHJhY3ROYXRpdmVMaWJzPSJmYWxzZSI+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JmNzMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgS2VlcCBlbnRyeSBwb2ludCBmb3IgdXBkYXRhYmxlIEphdmEgY2xhc3NlcwotLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IHsKLSAgIHB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgaW5pdGlhbGl6ZShhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKTsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZmQ1MWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzgyNTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGRkZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOWNkNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTJhZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzA3ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzJkMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDVlZTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZDM0MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2YjY1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQzMDVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmZGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOWRmNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMzQ0YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwMzQyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzIzZTQ1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwYzI1YTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmZGI5YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDZjMTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNiZjQ4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkxMWI1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0ZWQ1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmN2UwYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1NThhOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhMWE4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5YWVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNjhlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjNzc3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwODc5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQyYzljLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAyYWI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU0ZjYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZlYmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDZlYTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzkwYzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxZGMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjRkNTg2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2JiNzcyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Y2M5ODQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI2MTdlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VmZWYzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhMDA0N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTVkNmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTM0MzEwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Yzg5OWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzhlMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTJmYzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODg0ZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGFjNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjEwNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWMwNjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmQ0OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzOTMzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNWE2Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmU1NzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNWQ2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGZhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZmUwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM0OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFlOTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDIxOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzBmYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMmYyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3MWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3ZjYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDFiMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmI2OTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlMTAxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzNTJjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzMmU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZiYTMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNiNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGJiMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NjEyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxN2E5Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmY2MzNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUxODExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmE1M2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDVkY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlNGVhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NzI0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNiNDEwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE4YWJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODExMzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGIxOTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhYmEzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNGQ1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk1N2IzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQzODRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzYyOTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YWI2ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlN2Y3NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhM2NhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FlY2RlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhkMGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGJlM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGYxYmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxOGI0Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjMmMwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZhZTQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRjMjg5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjkzMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTFmNjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZmFmZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyYmQ4Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNhMWY4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGMxMDY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MmI4MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZmJhMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3ZjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNTQ3OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk1YWYwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTBiN2YwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTcwZjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTQwM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0NGJmZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNjA0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBkNTU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjNDhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDhmOGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YjkwZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyMzRhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNDUyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFjZjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQwOGI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZWIzZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU4YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZmMwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhMTZhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU5OGNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZkMTZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNzA0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNmRiMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzODI4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjY2M3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzhjZWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDAxYjllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzFkZDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjc4ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjMmNkYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjNWJlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FkMGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1OTIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODdlMjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDZkYjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyMjViYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2OTdkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdlYzIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg0MGJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDVlM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzdjNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZGMxMzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDYxN2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjMwNzczLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVkN2Q3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjM4ZDU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDAzNDlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY3YzQ2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZjZWJmNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhMzJhN2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjJjYTM3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTMxMjU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzFlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTQ2YTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NWU4N2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjQ0MDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTdlMDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjM1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDVjM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTNiYTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1Y2ExOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjMTgzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM5MTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzNjYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NDRjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjM3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkMWRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU3MTA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjU5NmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2OGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMGRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUzOWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjMTVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWViYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOTFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNjZmOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhMzRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJkZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGJjYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2NmIzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1YThmYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGViMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGEyYjYwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiODBhYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWVmZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwY2MzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZTZmYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgxNmM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQyOTMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDViN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2EwZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyYTY1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkZWJjMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U3OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNmOTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmFkOWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZGQ4ZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwZmQ1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjVjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UxZWYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcxMGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MWMwODAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhNmIzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlOGZlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I4NDBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI0MDUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzE4YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTc1M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyOTFiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxYzYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0YTcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2UwYTYwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFmM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTUxZWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4NjY3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiODE4My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkzZjE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzVlMTU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmZhMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjdlNTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhYzRkYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhODZmNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAxMDkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzk2ZjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTAwMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzE1ODEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5NjIwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2OTUwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UxYmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4ZjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzJlOTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDVkMmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwZDUyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2MWFlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWEzZjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QxNjZmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTUyN2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjJhOGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzN2FmNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMzFlZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQ5ZjU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhlYjc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTBlMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDI1ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3NmUxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZjFlZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZkY2RkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U5YjgxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjllNDQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDljYTg5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYzc1ZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYmQyN2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViYjBhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MTRhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdmZTVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmIyYzEwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGIyMTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U3ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2MDFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5MjhkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyZmQ3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE3MWE4Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4Y2I2Y2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljODg2M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzM1MDM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZhNDg1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGNhNjc4Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzMDVkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Mzk1ZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE3MjgyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmMGY1My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTgwZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWMzOTM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwMjUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjI4ZjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQyNzdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2NWJmYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzVkNmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY0YWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMDY0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTMyNGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODYxOGYwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZDc3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZDc3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjRlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1ZjAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1Yzc1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWM3ZmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI4N2U0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3ZDBjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmE3MmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjUwZWVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0NDM1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODc3YzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI3ZjBhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMTliYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTkyMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI3NmIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzMDVkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE5NTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzFhNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGxheWVyLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiA+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYmFja2dyb3VuZCI+Ci0gICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjMjYwMDAwMDAiIC8+Ci0gICAgICAgIDwvc2hhcGU+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3NlY29uZGFyeVByb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiM1Q2ZmZmZmZiIgLz4KLSAgICAgICAgICAgIDwvc2hhcGU+Ci0gICAgICAgIDwvY2xpcD4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvcHJvZ3Jlc3MiPgotICAgICAgICA8Y2xpcD4KLSAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICAgICAgICAgIDwvc2hhcGU+Ci0gICAgICAgIDwvY2xpcD4KLSAgICA8L2l0ZW0+Ci08L2xheWVyLWxpc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM1OTcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpzaGFwZT0ib3ZhbCIgPgotICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgotICAgIDxzaXplCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjVmNzFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMjAsMTFINy44M2w1LjU5LC01LjU5TDEyLDRsLTgsOCA4LDggMS40MSwtMS40MUw3LjgzLDEzSDIwdi0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjIyOGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxMmgtMnYzaC0zdjJoNXYtNXpNNyw5aDNMMTAsN0w1LDd2NWgyTDcsOXpNMjEsM0wzLDNjLTEuMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuOSwyIDIsMmgxOGMxLjEsMCAyLC0wLjkgMiwtMkwyMyw1YzAsLTEuMSAtMC45LC0yIC0yLC0yek0yMSwxOS4wMUwzLDE5LjAxTDMsNC45OWgxOHYxNC4wMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MxMmI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsM3Y5LjI4Yy0wLjQ3LC0wLjE3IC0wLjk3LC0wLjI4IC0xLjUsLTAuMjhDOC4wMSwxMiA2LDE0LjAxIDYsMTYuNVM4LjAxLDIxIDEwLjUsMjFjMi4zMSwwIDQuMiwtMS43NSA0LjQ1LC00SDE1VjZoNFYzaC03eiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmY3MjBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzNmQxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTUuNDEsNy40MUwxNCw2bC02LDYgNiw2IDEuNDEsLTEuNDFMMTAuODMsMTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyY2UwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEwLDZMOC41OSw3LjQxIDEzLjE3LDEybC00LjU4LDQuNTlMMTAsMThsNiwtNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2VlNjQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iNTEyZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjUxMmRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iNTEyIgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjUxMiI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzYxNjE2MSIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTSAwIDAgSCA1MTIgViA1MTIgSCAwIFYgMCBaIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNTI1MjUyIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMjU2LDE1MXYxMjMuMTRjLTYuODgtNC4wMi0xNC44Mi02LjQ4LTIzLjMzLTYuNDggYy0yNS43OCwwLTQ2LjY3LDIwLjg4LTQ2LjY3LDQ2LjY3YzAsMjUuNzgsMjAuODgsNDYuNjcsNDYuNjcsNDYuNjdzNDYuNjctMjAuODgsNDYuNjctNDYuNjdWMTk3LjY3SDMyNlYxNTFIMjU2eiIgLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmRmMTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTI0LDI0SDBWMGgyNHYyNHogTSAwLDAiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkuNiAxMy41aC40Yy4yIDAgLjQsLS4xLjUsLS4ycy4yLC0uMi4yLC0uNHYtLjJzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjVzLS4xLjEsLS4yLjEsLS4xLjEsLS4xLjJ2LjJoLTFjMCwtLjIgMCwtLjMuMSwtLjVzLjIsLS4zLjMsLS40LjMsLS4yLjQsLS4yLjQsLS4xLjUsLS4xYy4yIDAgLjQgMCAuNi4xcy4zLjEuNS4yLjIuMi4zLjQuMS4zLjEuNXYuM3MtLjEuMiwtLjEuMywtLjEuMiwtLjIuMiwtLjIuMSwtLjMuMmMuMi4xLjQuMi41LjRzLjIuNC4yLjZjMCAuMiAwIC40LC0uMS41cy0uMi4zLC0uMy40LC0uMy4yLC0uNS4yLC0uNC4xLC0uNi4xYy0uMiAwLC0uNCAwLC0uNSwtLjFzLS4zLC0uMSwtLjUsLS4yLC0uMiwtLjIsLS4zLC0uNCwtLjEsLS40LC0uMSwtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMSwtLjEuMiwtLjEuMSwtLjEuMSwtLjJ2LS41cy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS42di0uN3ptNS43LjdjMCAuMyAwIC42LC0uMS44bC0uMy42cy0uMy4zLC0uNS4zLC0uNC4xLC0uNi4xLC0uNCAwLC0uNiwtLjEsLS4zLC0uMiwtLjUsLS4zLC0uMiwtLjMsLS4zLC0uNiwtLjEsLS41LC0uMSwtLjh2LS43YzAsLS4zIDAsLS42LjEsLS44bC4zLC0uNnMuMywtLjMuNSwtLjMuNCwtLjEuNiwtLjEuNCAwIC42LjEuMy4yLjUuMy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOSwtLjh2LS41cy0uMSwtLjIsLS4xLC0uMywtLjEsLS4xLC0uMiwtLjIsLS4yLC0uMSwtLjMsLS4xLC0uMiAwLC0uMy4xbC0uMi4ycy0uMS4yLC0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMywtLjFsLjIsLS4ycy4xLC0uMi4xLC0uM3YtMS41ek00IDEzYzAgNC40IDMuNiA4IDggOHM4LC0zLjYgOCwtOGgtMmMwIDMuMywtMi43IDYsLTYgNnMtNiwtMi43LC02LC02IDIuNywtNiA2LC02djRsNSwtNSwtNSwtNXY0Yy00LjQgMCwtOCAzLjYsLTggOHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci0gICAgPC9ncm91cD4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGY2YmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik03LDE0TDUsMTR2NWg1di0yTDcsMTd2LTN6TTUsMTBoMkw3LDdoM0wxMCw1TDUsNXY1ek0xNywxN2gtM3YyaDV2LTVoLTJ2M3pNMTQsNXYyaDN2M2gyTDE5LDVoLTV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjA0ZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTUsMTZoM3YzaDJ2LTVMNSwxNHYyek04LDhMNSw4djJoNUwxMCw1TDgsNXYzek0xNCwxOWgydi0zaDN2LTJoLTV2NXpNMTYsOEwxNiw1aC0ydjVoNUwxOSw4aC0zeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWQ3NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEKLTE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOSAuOTIgQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEgLjQ1IC0yLjEKLTEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNiAuNTkgLS44NiAuNTkgLTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxCi0xLjc5LTQgNC00czQgMS43OSA0IDRjMCAuODgtLjM2IDEuNjgtLjkzIDIuMjV6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZlMjJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIzNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIzNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggMTFIOS41di0yaC0ydjJINlY5aDEuNXYyLjVoMlY5SDExdjZ6bTctMWMwIDAuNTUtMC40NSAxLTEgMWgtMC43NXYxLjVoLTEuNVYxNUgxNGMtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2NHptLTMuNS0wLjVoMnYtM2gtMnYzeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhZjZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTlINVY1aDdWM0g1Yy0xLjExLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC44OSwyIDIsMmgxNGMxLjEsMCAyLC0wLjkgMiwtMnYtN2gtMnY3ek0xNCwzdjJoMy41OWwtOS44Myw5LjgzIDEuNDEsMS40MUwxOSw2LjQxVjEwaDJWM2gtN3oiLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjBhYWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2Mi4yMWwyLjQ1LDIuNDVjMC4wMywtMC4yIDAuMDUsLTAuNDEgMC4wNSwtMC42M3pNMTksMTJjMCwwLjk0IC0wLjIsMS44MiAtMC41NCwyLjY0bDEuNTEsMS41MUMyMC42MywxNC45MSAyMSwxMy41IDIxLDEyYzAsLTQuMjggLTIuOTksLTcuODYgLTcsLTguNzd2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXpNNC4yNywzTDMsNC4yNyA3LjczLDlMMyw5djZoNGw1LDV2LTYuNzNsNC4yNSw0LjI1Yy0wLjY3LDAuNTIgLTEuNDIsMC45MyAtMi4yNSwxLjE4djIuMDZjMS4zOCwtMC4zMSAyLjYzLC0wLjk1IDMuNjksLTEuODFMMTkuNzMsMjEgMjEsMTkuNzNsLTksLTlMNC4yNywzek0xMiw0TDkuOTEsNi4wOSAxMiw4LjE4TDEyLDR6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiZTIyOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTEsMTZMOSwxNkw5LDhoMnY4ek0xNSwxNmgtMkwxMyw4aDJ2OHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzOWRlZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMCwxNi41di05bDYsNC41IC02LDQuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmQ1ZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpmaWxsVHlwZT0iZXZlbk9kZCIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyYzAsNS41Miw0LjQ4LDEwLDEwLDEwYzUuNTIsMCwxMC00LjQ4LDEwLTEwCi1DMjIsNi40OCwxNy41MiwyLDEyLDJ6Ci1NMTgsMTJjMCwzLjMxLTIuNjksNi02LDZjLTMuMzEsMC02LTIuNjktNi02aDJjMCwyLjIxLDEuNzksNCw0LDRzNC0xLjc5LDQtNHMtMS43OS00LTQtNHYzTDgsN2w0LTR2MwotQzE1LjMxLDYsMTgsOC42OSwxOCwxMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTg2YjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxncm91cD4KLSAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHogTSAwLDAiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNiwtNiA2LC02LC0yLjcsLTYsLTZINGMwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLTgsLTMuNiwtOCwtOCwtOHptLTEuMSAxMUgxMHYtMy4zTDkgMTN2LS43bDEuOCwtLjZoLjFWMTZ6bTQuMywtMS44YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xYy4yLjEuMy4yLjUuM3MuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci0gICAgPC9ncm91cD4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjYjZkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksM0g1QzMuODksMywzLDMuOSwzLDV2MTRjMCwxLjEsMC44OSwyLDIsMmgxNGMxLjEsMCwyLTAuOSwyLTJWNUMyMSwzLjksMjAuMSwzLDE5LDN6Ci1NMTMsOWg0YzAuNTUsMCwxLDAuNDUsMSwxdjQgYzAsMC41NS0wLjQ1LDEtMSwxaC00Vjl6Ci1NOS41LDEzLjV2LTFIN2MtMC41NSwwLTEtMC40NS0xLTFWMTBjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMXYxSDkuNXYtMC41aC0ydjFIMTAKLWMwLjU1LDAsMSwwLjQ1LDEsMVYxNGMwLDAuNTUtMC40NSwxLTEsMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMXYtMWgxLjV2MC41SDkuNXoKLU0xNC41LDEzLjVoMnYtM2gtMlYxMy41eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OWVjYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkuNDMsMTIuOThjMC4wNCwtMC4zMiAwLjA3LC0wLjY0IDAuMDcsLTAuOThzLTAuMDMsLTAuNjYgLTAuMDcsLTAuOThsMi4xMSwtMS42NWMwLjE5LC0wLjE1IDAuMjQsLTAuNDIgMC4xMiwtMC42NGwtMiwtMy40NmMtMC4xMiwtMC4yMiAtMC4zOSwtMC4zIC0wLjYxLC0wLjIybC0yLjQ5LDFjLTAuNTIsLTAuNCAtMS4wOCwtMC43MyAtMS42OSwtMC45OGwtMC4zOCwtMi42NUMxNC40NiwyLjE4IDE0LjI1LDIgMTQsMmgtNGMtMC4yNSwwIC0wLjQ2LDAuMTggLTAuNDksMC40MmwtMC4zOCwyLjY1Yy0wLjYxLDAuMjUgLTEuMTcsMC41OSAtMS42OSwwLjk4bC0yLjQ5LC0xYy0wLjIzLC0wLjA5IC0wLjQ5LDAgLTAuNjEsMC4yMmwtMiwzLjQ2Yy0wLjEzLDAuMjIgLTAuMDcsMC40OSAwLjEyLDAuNjRsMi4xMSwxLjY1Yy0wLjA0LDAuMzIgLTAuMDcsMC42NSAtMC4wNywwLjk4czAuMDMsMC42NiAwLjA3LDAuOThsLTIuMTEsMS42NWMtMC4xOSwwLjE1IC0wLjI0LDAuNDIgLTAuMTIsMC42NGwyLDMuNDZjMC4xMiwwLjIyIDAuMzksMC4zIDAuNjEsMC4yMmwyLjQ5LC0xYzAuNTIsMC40IDEuMDgsMC43MyAxLjY5LDAuOThsMC4zOCwyLjY1YzAuMDMsMC4yNCAwLjI0LDAuNDIgMC40OSwwLjQyaDRjMC4yNSwwIDAuNDYsLTAuMTggMC40OSwtMC40MmwwLjM4LC0yLjY1YzAuNjEsLTAuMjUgMS4xNywtMC41OSAxLjY5LC0wLjk4bDIuNDksMWMwLjIzLDAuMDkgMC40OSwwIDAuNjEsLTAuMjJsMiwtMy40NmMwLjEyLC0wLjIyIDAuMDcsLTAuNDkgLTAuMTIsLTAuNjRsLTIuMTEsLTEuNjV6TTEyLDE1LjVjLTEuOTMsMCAtMy41LC0xLjU3IC0zLjUsLTMuNXMxLjU3LC0zLjUgMy41LC0zLjUgMy41LDEuNTcgMy41LDMuNSAtMS41NywzLjUgLTMuNSwzLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjI4MTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTYsMThsOC41LC02TDYsNnYxMnpNMTYsNnYxMmgyVjZoLTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkYTMxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTYsNmgydjEyTDYsMTh6TTkuNSwxMmw4LjUsNkwxOCw2eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGE3MjdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkuNSw1LjV2MTNoLTE1di0xM0gxOS41eiBNMTksNEg1QzMuODksNCwzLDQuOSwzLDZ2MTJjMCwxLjEsMC44OSwyLDIsMmgxNGMxLjEsMCwyLTAuOSwyLTJWNkMyMSw0LjksMjAuMSw0LDE5LDRMMTksNHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMSwxMUg5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwLDAuNTUtMC40NSwxLTEsMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE4LDExaC0xLjV2LTAuNWgtMnYzaDJWMTNIMTh2MWMwLDAuNTUtMC40NSwxLTEsMWgtM2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzkxYzA2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCA3SDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAgMC41NS0wLjQ1IDEtMSAxSDdjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjF6bTcgMGgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCAwLjU1LTAuNDUgMS0xIDFoLTNjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiMmI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0zLDl2Nmg0bDUsNUwxMiw0TDcsOUwzLDl6TTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjguMDVjMS40OCwtMC43MyAyLjUsLTIuMjUgMi41LC00LjAyek0xNCwzLjIzdjIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzFzLTIuMTEsNS44NSAtNSw2LjcxdjIuMDZjNC4wMSwtMC45MSA3LC00LjQ5IDcsLTguNzdzLTIuOTksLTcuODYgLTcsLTguNzd6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGZmMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZjN2ZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWFmN2IzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2I0MTcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMWRmYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrYWJsZT0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDNkODRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrYWJsZT0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4YzhjNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2RpYWxvZ19jbG9zZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1MGUwZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RpYWxvZ19jbG9zZV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotCi08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzdlY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyayBleGNlcHQgZm9yIGluc2V0Ci0gICAgIHdoaWNoIGluY2x1ZGVzIHVubmVjZXNzYXJ5IHBhZGRpbmcuIC0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KLSAgICA8Y29ybmVycyBhbmRyb2lkOnJhZGl1cz0iMmRwIiAvPgotICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSJAY29sb3IvYmFja2dyb3VuZF9mbG9hdGluZ19tYXRlcmlhbF9kYXJrIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIyMzVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodCBleGNlcHQgZm9yIGluc2V0Ci0gICAgIHdoaWNoIGluY2x1ZGVzIHVubmVjZXNzYXJ5IHBhZGRpbmcuIC0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KLSAgICA8Y29ybmVycyBhbmRyb2lkOnJhZGl1cz0iMmRwIiAvPgotICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSJAY29sb3IvYmFja2dyb3VuZF9mbG9hdGluZ19tYXRlcmlhbF9saWdodCIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3MmJjOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzZmRiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjE4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkMWYwMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDVhMzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZiN2E2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTA4YTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM2Y2U4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjRmZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfYXVkaW90cmFja19kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzlkYmMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjZhMTcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08cGF0aEludGVycG9sYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpjb250cm9sWDE9IjAuNCIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgotICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiZjI5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08cGF0aEludGVycG9sYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpjb250cm9sWDE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRkMzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+Ci0KLSAgICA8SW1hZ2VWaWV3Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuNSIKLSAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKLSAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIiAvPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTZkY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3ViX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ3YTcyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVjayIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTU5NTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wYXVzZSIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0IiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U3MDU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNCMzAwRkYwMCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuSW1hZ2UiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjFiYjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmVhNWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3ViX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEyOGQwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVjayIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTQ3ODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wcmV2IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wYXVzZSIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmZ3ZCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0IiAvPgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU4ZjA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXIiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGxheW91dC90aXRsZV9iYXJfZ3JhZGllbnQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXIiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbi5CYWNrIi8+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfdGV4dCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYmFjayIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTVzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIi8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfZXh0ZXJuYWxfbGluayIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotCi0gICAgICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfdGV4dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEwc3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9sYXVuY2giCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbi5MYXVuY2giIC8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPHZpZXcgY2xhc3M9ImNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b24iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXN0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uIiAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2VudGVyX3ZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWluaW1hbF9leHRyYV92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+Ci0KLSAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgotICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4KLQotICAgICAgICA8U2Vla0JhcgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzcyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbWN2Ml9zZWVrX2Jhcl9kZXNjIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIxMGRwIi8+Ci0KLSAgICAgICAgPFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3NfYnVmZmVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMGRwIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDRkcCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfc2tpcF90aW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfY3VycmVudCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkN1cnJlbnQiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9pbnRlcnB1bmN0IgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuSW50ZXJwdW5jdCIvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2VuZCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkVuZCIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXJfcmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEVuZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXNpY19jb250cm9scyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3JlbWFpbmluZyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXV0ZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uTXV0ZSIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJ0aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5DQyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIi8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfcmlnaHQiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9leHRyYV9jb250cm9scyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIj4KLQotICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jdXN0b21fYnV0dG9ucyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWRlb19xdWFsaXR5IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dGluZ3MiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X2xlZnQiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93TGVmdCIvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYzgwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wYXVzZSIgc3R5bGU9IkBzdHlsZS9NaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iIC8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODllMTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfdGl0bGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KLSAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX2xpc3QiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6ZGl2aWRlckhlaWdodD0iMGRwIiAvPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvZW1wdHkiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNDBkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iOTBkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl9zZWFyY2hpbmciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgLz4KLSAgICAgICAgPFByb2dyZXNzQmFyIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkcCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppbmRldGVybWluYXRlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvcHJvZ3Jlc3NCYXJTdHlsZUhvcml6b250YWwiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ODc5Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9pY29uIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMjRkcCIgLz4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9uYW1lIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMmRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9kZXNjIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA0NDcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2V4cGFuZGFibGVfYXJlYSIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RpYWxvZ19hcmVhIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvY29sb3JCYWNrZ3JvdW5kRmxvYXRpbmciPgotICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdGl0bGVfYmFyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI3MmRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jbG9zZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9Ij9hdHRyL21lZGlhUm91dGVDbG9zZURyYXdhYmxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIiAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY3VzdG9tX2NvbnRyb2wiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGVmYXVsdF9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2FydCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDphZGp1c3RWaWV3Qm91bmRzPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvY29sb3JQcmltYXJ5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2FsYnVtX2FydCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgotICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9tZWRpYV9tYWluX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTZkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij4KLSAgICAgICAgICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3BsYXliYWNrX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiID4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3BsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9zdWJ0aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KLSAgICAgICAgICAgICAgICAgICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX2RpdmlkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9Ij9hdHRyL21lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaW5jZSBkaWFsb2cncyB0b3AgbGF5b3V0IG1yX2V4cGFuZGFibGVfYXJlYSBpcyBjbGlja2FibGUsIGl0IHByb3BhZ2F0ZXMgcHJlc3NlZCBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpdHMgbm9uLWNsaWNrYWJsZSBjaGlsZHJlbi4gU3BlY2lmeSBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIgdG8gcHJldmVudCB2b2x1bWUgc2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gaGF2aW5nIGZhbHNlIHByZXNzZWQgc3RhdGUuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfZ3JvdXBfbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJTdHlsZT0ib3V0c2lkZU92ZXJsYXkiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIC8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPC9GcmFtZUxheW91dD4KLSAgICAgICAgPFNjcm9sbFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uUGFuZWwiCi0gICAgICAgICAgICBzdHlsZT0iP2F0dHIvYnV0dG9uQmFyU3R5bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmZpbGxWaWV3cG9ydD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSW5kaWNhdG9ycz0idG9wfGJvdHRvbSI+Ci0gICAgICAgICAgICA8YW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRwIj4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjMiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhck5ldXRyYWxCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgICAgICA8YW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5TcGFjZQotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwYWNlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjIiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhck5lZ2F0aXZlQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24xIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJQb3NpdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgPC9hbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dD4KLSAgICAgICAgPC9TY3JvbGxWaWV3PgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OTA1OGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdm9sdW1lX2l0ZW1fY29udGFpbmVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNjBkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iOGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIj4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfaXRlbV9pY29uIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9Ij9hdHRyL21lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiIC8+Ci0gICAgICAgICAgICA8YW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQwZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQwZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQwZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzMDUzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpkaXZpZGVyPSJAbnVsbCIKLSAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCI+Ci08L0xpc3RWaWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFmYzZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KLSAgICA8Z3JhZGllbnQKLSAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSJAY29sb3IvdGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0IgotICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSJAY29sb3IvdGl0bGVfYmFyX2dyYWRpZW50X2VuZCIKLSAgICAgICAgYW5kcm9pZDphbmdsZT0iLTI3MCIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyMzBhZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdGVsc2VsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25vcHBpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlVpdHNhYWkta25vcHBpZS4gT250a29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJVaXRzYWFpLWtub3BwaWUuIEtvcHBlbCB0YW5zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlVpdHNhYWkta25vcHBpZS4gR2Vrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2FhaSB1aXQgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJWaW5kIHRhbnMgdG9lc3RlbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhvdSBvcCB1aXRzYWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJNYWFrIHRvZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJMYWF0IHdhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJWb3UgdWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJWb3UgaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWt1bnN3ZXJrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZWdseWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGlzIGdla2llcyBuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5saWd0aW5nIGJlc2tpa2JhYXIgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTYWFpIHRhbnMgc2tlcm0gdWl0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWExOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGIteGIreGLk+GJtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhiJjhiKPhiKrhi6vhi47hib0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhi6hDYXN0IOGKoOGLneGIq+GIrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGMjeGKleGKmeGKkOGJtSDhibDhiYvhiK3hjKfhiI0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qg4Yqg4Yud4Yir4YitIOGJoOGIm+GMiOGKk+GKmOGJtSDhiIvhi60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4Ymw4YyI4YqT4Yqd4Ym34YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3Qg4Yqg4Yu14Yit4YyNIOGLiOGLsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGImOGIo+GIquGLq+GLjuGJveGKlSDhiaDhiJvhjI3hipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGMjeGKleGKmeGKkOGJtSDhiqDhiYvhiK3hjKUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0IOGIm+GLteGIqOGMjSDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGLneGMiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGKoOGMq+GLjeGJtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YiI4Yqg4Y2N4YmzIOGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGKoOGIteGNiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Yiw4Yml4Yi14YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Yuo4Yqg4YiN4Ymg4YidIOGIteGKkC3hjKXhiaDhiaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Ymw4YqV4Yi44Yir4Ymz4Ym9IOGLqOGLteGIneGNhSDhiJjhiYbhjKPhjKDhiKrhi6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGIneGKleGInSDhiJvhiIXhi7DhiKjhiJjhiKjhjIMg4Yqg4YiN4Ymw4YiY4Yio4Yyg4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhiJ3hipXhiJ0g4YiY4Yio4YyDIOGKoOGLreGMiOGKneGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Yib4YurIOGMiOGMveGKlSDhiaDhiJjhi43hiLDhi7Ug4YiL4YutIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZiOTdkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itin2YTZhti42KfZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYp9mE2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiy2LEg2KfZhNil2LHYs9in2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINmC2LfYuSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KzYp9ix2Y0g2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYpdix2LPYp9mEINil2YTZiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itis2KfYsdmNINin2YTYqNit2Ksg2LnZhiDYo9is2YfYstipIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itil2YrZgtin2YEg2KfZhNil2LHYs9in2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itil2LrZhNin2YIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLYqti02LrZitmEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLYpdmK2YLYp9mBINmF2KTZgtiqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KXZitmC2KfZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itiq2YjYs9mK2LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiq2LXYutmK2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYtdmI2LHYqSDYp9mE2KPZhNio2YjZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLYtNix2YrYtyDYqtmF2LHZitixINmF2LPYqtmI2Ykg2KfZhNi12YjYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2YTZhSDZitiq2YUg2KfYrtiq2YrYp9ixINij2Yog2YjYs9in2KbYtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2YTYpyDYqtiq2YjZgdixINij2Yog2YXYudmE2YjZhdin2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itis2KfYsdmNINil2LHYs9in2YQg2KfZhNi02KfYtNipIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M2MGFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJDaWhhemxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IllhecSxbSBkw7x5bcmZc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW0gZMO8eW3JmXNpLiBCYcSfbGFudMSxIGvJmXNpbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJZYXnEsW0gZMO8eW3JmXNpLiBRb8WfdWx1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJZYXnEsW0gZMO8eW3JmXNpLiBRb8WfdWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJCdXJhIHlhecSxbWxhecSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGF4dGFyxLFsxLFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLFuxLEga8mZc2luIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFtxLEgZGF5YW5kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJRYXBhZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmFkxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJkdXJ1biI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2zJmW5kaXJpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWcSxxJ9jYW1sYcWfZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYm9tIGluY8mZc8mZbsmZdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU8mZcyBoyZlybWkgZGl5aXJjyZl5aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSGXDpyBiaXIgbWVkaWEgc2XDp2lsbcmZeWliIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLGj2zDp2F0YW4gbcmZbHVtYXQgeW94ZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW1sYW7EsXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1YmQ2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgUHJlYmFjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIFByZWJhY2kuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSBQcmViYWNpLiBQb3ZlenVqZSBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSBQcmViYWNpLiBQb3ZlemFuIGplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZWJhY3VqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUHJvbmFsYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBwcmViYWNpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZvcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQdXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVtYSBpemFicmFuaWggbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaXN1IGRvc3R1cG5lIG5pa2FrdmUgaW5mb3JtYWNpamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzOTFjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodGW0YHRgtGN0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0YvQu9Cw0LTRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0JDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCG0LTQt9C1INC/0LDQtNC60LvRjtGH0Y3QvdC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQn9Cw0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotGA0LDQvdGB0LvRltGA0LDQstCw0YbRjCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0YvQu9Cw0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQtNC70YPRh9GL0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/Ri9C90ZbRhtGMINGC0YDQsNC90YHQu9GP0YbRi9GOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNGL0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YDQsNC50LPRgNCw0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNGL0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KHQv9GL0L3RltGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQs9Cw0YDQvdGD0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9Cw0YDQvdGD0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCS0L7QutC70LDQtNC60LAg0LDQu9GM0LHQvtC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0J/QsNGe0LfRg9C90L7QuiDQs9GD0YfQvdCw0YHRhtGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQnNC10LTRi9GP0YTQsNC50Lsg0L3QtSDQstGL0LHRgNCw0L3RiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0IbQvdGE0LDRgNC80LDRhtGL0Y8g0LDQtNGB0YPRgtC90ZbRh9Cw0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L0g0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzEyZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0JLRgNGK0LfQutCw0YLQsCDQtSDQv9GA0LXQutGA0LDRgtC10L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KHQstGK0YDQt9Cy0LAg0YHQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQo9GB0YLQsNC90L7QstC10L3QsCDQtSDQstGA0YrQt9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LTQsNCy0LDQvdC1INC60YrQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0YrRgNGB0Y/RgiDRgdC1INGD0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60YDQsNGC0Y/QstCw0L3QtSDQvdCwINCy0YDRitC30LrQsNGC0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0LjRgNCw0L3QtSDQvdCwINC/0YDQtdC00LDQstCw0L3QtdGC0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDRgtCy0LDRgNGP0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdC60LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9C+0YHRgtCw0LLRj9C90LUg0L3QsCDQv9Cw0YPQt9CwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KHQv9C40YDQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQs9GK0LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LLQuNCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAg0L3QsCDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0J/Qu9GK0LfQs9Cw0Ycg0LfQsCDRgdC40LvQsNGC0LAg0L3QsCDQt9Cy0YPQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndGP0LzQsCDQuNC30LHRgNCw0L3QsCDQvNGD0LvRgtC40LzQtdC00LjRjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3Rj9C80LAg0L3QsNC70LjRh9C90LAg0LjQvdGE0L7RgNC80LDRhtC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCV0LrRgNCw0L3RitGCINGB0LUg0L/RgNC10LTQsNCy0LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZjU5MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Ka44Ka/4Ka44KeN4Kaf4KeH4KauIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4KauIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgprngpq/gprzgp4fgppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgppXgprDgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+CngeCmleCnjeCmpCDgprngpq/gprzgp4fgppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KaP4Kak4KeHIOCmleCmvuCmuOCnjeCmnyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr/gppXgp4cg4KaW4KeL4KaB4Kac4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr4g4Kas4Kao4KeN4KanIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kas4Kao4KeN4KanIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCmmuCmvuCmsuCmvuCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kas4Ka/4Kaw4Ka+4KauIOCmpuCmv+CmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCmpeCmvuCmruCmvuCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCmrOCmoeCmvCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCmuOCmmeCnjeCmleCngeCmmuCmv+CmpCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpoXgp43gpq/gpr7gprLgpqzgpr7gpq4g4Ka24KeI4Kay4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCmreCmsuCmv+CmieCmriDgprjgp43gprLgpr7gpofgpqHgpr7gprAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCmleCni+CmqOCniyDgpq7gpr/gpqHgpr/gpq/gprzgpr4g4Kao4Ka/4Kaw4KeN4Kas4Ka+4Kaa4KaoIOCmleCmsOCmviDgprngpq/gprzgpqjgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCmleCni+CmqOCniyDgpqTgpqXgp43gpq8g4KaJ4Kaq4Kay4Kas4KeN4KanIOCmqOCnh+CmhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Ka44KeN4KaV4KeN4Kaw4KeA4KaoIOCmleCmvuCmuOCnjeCmnyDgppXgprDgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTFjNzQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgemEgZW1pdGlyYW5qZS4gUG92ZXppdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgemEgZW1pdGlyYW5qZS4gUG92ZXphbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBwcmViYWNpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZvcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamVkYW4gbWVkaWogbmlqZSBvZGFicmFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW1hIGRvc3R1cG5paCBpbmZvcm1hY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjg1YWNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDsyBkXCdlbWV0cmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDsyBFbWV0LiBEZXNjb25uZWN0YXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDsyBFbWV0LiBTXCdlc3TDoCBjb25uZWN0YW50LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDsyBFbWV0LiBDb25uZWN0YXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtZXQgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNcJ2VzdGFuIGNlcmNhbnQgZGlzcG9zaXRpdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29ubmVjdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBdHVyYSBsXCdlbWlzc2nDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVGFuY2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1ZWl4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQb3NhIGVuIHBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXR1cmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEZXNwbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVwbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYXRnZSBkZSBsXCfDoGxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBsbGlzY2FudCBkZSB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc1wnaGEgc2VsZWNjaW9uYXQgY2FwIGZpdHhlciBtdWx0aW3DqGRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaGkgaGEgaW5mb3JtYWNpw7MgZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc3Npw7MgZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YTg5MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOpbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJaYcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIE9kcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvam92w6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2plbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iT2Rlc8OtbGF0IGRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSGxlZMOhbsOtIHphxZnDrXplbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXN0YXZpdCBvZGVzw61sw6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdsWZw610Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUMWZZWhyw6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQb3phc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2JhbGl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2JhbCBhbGJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc3V2bsOtayBobGFzaXRvc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZWJ5bGEgdnlicsOhbmEgxb7DoWRuw6EgbcOpZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZWpzb3Uga8KgZGlzcG96aWNpIMW+w6FkbsOpIGluZm9ybWFjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iT2Rlc8OtbMOhbsOtIG9ic2FodSBvYnJhem92a3kiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2E3OTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGVkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXAuIEZvcmJpbmRlbHNlbiBlciBhZmJydWR0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXAuIE9wcmV0dGVyIGZvcmJpbmRlbHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcC4gVGlsc2x1dHRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRlciBlbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmYnJ5ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgbWVkIGF0IGNhc3RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJMdWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwaWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlPDpnQgcMOlIHBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlVkdmlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Ikx5ZHN0eXJrZXNreWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nZW4gbWVkaWVyIGVyIG1hcmtlcmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXIgZXIgaW5nZW4gdGlsZ8OmbmdlbGlnZSBvcGx5c25pbmdlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpnJtZW4gY2FzdGVzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJmNTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHZXLDpHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1TeW1ib2wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gTmljaHQgdmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYmluZHVuZyB3aXJkIGhlcmdlc3RlbGx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU3RyZWFtZW4gYXVmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iR2Vyw6R0ZSB3ZXJkZW4gZ2VzdWNodC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVmVyYmluZHVuZyB0cmVubmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RyZWFtaW5nIGJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNjaGxpZcOfZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJXaWVkZXJnZWJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2llcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1heGltaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik1pbmltaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWNvdmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNjaGllYmVyZWdsZXIgZsO8ciBkaWUgTGF1dHN0w6Rya2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IktlaW5lIE1lZGllbiBhdXNnZXfDpGhsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2VpbmUgSW5mb3JtYXRpb25lbiB2ZXJmw7xnYmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJCaWxkc2NoaXJtIHdpcmQgZ2VzdHJlYW10LiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZjY5Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLOo8+Nz4PPhM63zrzOsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLOo8+Fz4POus61z4XOrc+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4izprOv8+FzrzPgM6vIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOkc+Azr/Pg8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863LiDOo8+Nzr3OtM61z4POtyDPg861IM61zr7Orc67zrnOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6jz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLOnM61z4TOrM60zr/Pg863IM+DzrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLOlc+Nz4HOtc+Dzrcgz4PPhc+DzrrOtc+Fz47OvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLOkc+Azr/Pg8+Nzr3OtM61z4POtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Is6UzrnOsc66zr/PgM6uIM68zrXPhM6szrTOv8+DzrfPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4izprOu861zq/Pg865zrzOvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Is6Rzr3Osc+AzrHPgc6xzrPPic6zzq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Is6gzrHPjc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLOlM65zrHOus6/z4DOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Is6Rzr3OrM+Az4TPhc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Is6jz43OvM+Az4TPhc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLOlc6+z47Phs+FzrvOu86/IM6szrvOvM+Azr/Phc68Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Is6hz4XOuM68zrnPg8+EzrnOus+MIM6tzr3PhM6xz4POt8+CIM6uz4fOv8+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLOlM61zr0gzq3Ph86/z4XOvSDOtc+AzrnOu861zrPOtc6vIM68zq3Pg86xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOtM65zrHOuM6tz4POuc68zrXPgiDPgM67zrfPgc6/z4bOv8+Bzq/Otc+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLOnM61z4TOrM60zr/Pg863IM6/zrjPjM69zrfPgiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzAwN2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjlN5c3RlbeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI/igI/igI/igI/igI5EZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCOQ2FzdCBidXR0b27igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVk4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZ+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI/igI7igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI5DYXN0IGJ1dHRvbi4gQ29ubmVjdGVk4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjkNhc3QgdG/igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI/igI7igI7igI5GaW5kaW5nIGRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCORGlzY29ubmVjdOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjlN0b3AgY2FzdGluZ+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCOQ2xvc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI5QbGF54oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI7igI7igI7igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI5QYXVzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjlN0b3DigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI/igI/igI5FeHBhbmTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjkNvbGxhcHNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCOQWxidW0gYXJ04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjlZvbHVtZSBzbGlkZXLigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjk5vIG1lZGlhIHNlbGVjdGVk4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI7igI5ObyBpbmZvIGF2YWlsYWJsZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCOQ2FzdGluZyBzY3JlZW7igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZWFkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoZGVzY29uZWN0YWRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoY29uZWN0YW5kbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoY29uZWN0YWRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGxhIHRyYW5zbWlzacOzbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZW4gZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGVsIHZvbHVtZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIHNlbGVjY2lvbsOzIG5pbmfDum4gY29udGVuaWRvIG11bHRpbWVkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlNpbiBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpZW5kbyBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0MzAwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW52aWFyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVudmlhciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBlbnbDrW8gZGUgY29udGVuaWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkZWwgw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZSB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ8O6biBtZWRpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaGF5IGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbnZpYW5kbyBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzMjM1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTw7xzdGVlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJTZWFkbWVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw5xsZWthbmRlbnVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZHVzIG9uIGthdGtlc3RhdHVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDnGxla2FuZGVudXBwLiDDnGhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDnGxla2FuZGVudXBwLiDDnGhlbmRhdHVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsOcbGVrYW5kbWluZSBzZWFkbWVzc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZWFkbWV0ZSBvdHNpbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrZXN0YSDDvGhlbmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlBlYXRhIMO8bGVrYW5kbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsZ2VtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRXNpdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQZWF0YW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQZWF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhaWVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJBaGVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pIGt1anVuZHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhlbGl0dWdldnVzZSBsaXVndXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZWRpYXQgcG9sZSB2YWxpdHVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUZWF2ZSBwdXVkdWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFhbmlrdXZhIMO8bGVrYW5kbWluZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhMTllNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdhaWx1YWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJZ29ycmkgYm90b2lhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWdvcnR6ZWtvIGJvdG9pYS4gRGVza29uZWt0YXR1dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklnb3J0emVrbyBib3RvaWEuIEtvbmVrdGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklnb3J0emVrbyBib3RvaWEuIEtvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Iklnb3JyaSBob25hOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdhaWx1YWsgYmlsYXR6ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVza29uZWt0YXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXR6aSBpZ29ydHplYXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJJdHhpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRXJyZXByb2R1eml0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2F0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkdlbGRpdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaYWJhbGR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUb2xlc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1hcmVuIGF6YWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJvbHVtZW5hcmVuIGdyYWR1YXR6YWlsZWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkV6IGRhIGhhdXRhdHUgbXVsdGltZWRpYS1lZHVraXJpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRXogZGFnbyBpbmZvcm1hemlvcmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQYW50YWlsYSBpZ29ydHplbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2Yzc3OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9uM2LPYqtmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itiv2LPYqtqv2KfZh+KAjNmH2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYr9qp2YXZhyDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2KfYsdiq2KjYp9i3INmC2LfYuSDYtNivIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2K/Ysdit2KfZhCDZhdix2KrYqNi34oCM2LPYp9iy24wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINmF2LHYqtio2Lcg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9ix2LPYp9mEINmF2K3YqtmI2Kcg2KjZhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itm+24zYr9inINqp2LHYr9mGINiv2LPYqtqv2KfZh+KAjNmH2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2LHYqtio2KfYtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itiq2YjZgtmBINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjYs9iq2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLZvtiu2LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItmF2qnYqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itiq2YjZgtmBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KjYstix2q8g2qnYsdiv2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itqp2YjahtqpINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LnaqdizINix2YjbjCDYrNmE2K8g2KLZhNio2YjZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZhNi62LLZhtiv2Ycg2YXbjNiy2KfZhiDYtdiv2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itix2LPYp9mG2Ycg2KfZhtiq2K7Yp9ioINmG2LTYr9mHINin2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2KfYt9mE2KfYudin2Kog2K/YsSDYr9iz2KrYsdizINmG24zYs9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYr9ix2K3Yp9mEINmB2LHYs9iq2KfYr9mGINi12YHYrdmHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjgzNDM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IkrDpHJqZXN0ZWxtw6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTGFpdHRlZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LXBhaW5pa2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LXBhaW5pa2UuIFlodGV5cyBrYXRrYWlzdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXTDpMOkbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0dHkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU3VvcmF0b2lzdG9uIGtvaGRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRXRzaXTDpMOkbiBsYWl0dGVpdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2Fpc2UgeWh0ZXlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTG9wZXRhIHN1b3JhdG9pc3RvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlRvaXN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iS2Vza2V5dMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUHlzw6R5dMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFhamVubmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRpaXZpc3TDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaW4ga2Fuc2lrdXZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IsOEw6RuZW52b2ltYWtrdXVkZW4gbGl1a3Vzw6TDpGRpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRWkgdmFsaXR0dWEgbWVkaWFhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlldG9qYSBlaSBvbGUgc2FhdGF2aWxsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU3VvcmF0b2lzdGV0YWFuIG7DpHl0dMO2w6QiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmOTg0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm91dG9uIERpZmZ1c2VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm91dG9uIERpZmZ1c2VyLiBEw6ljb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdXRvbiBEaWZmdXNlci4gQ29ubmV4aW9uIGVuIGNvdXJz4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdXRvbiBEaWZmdXNlci4gQ29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkRpZmZ1c2VyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2UgZMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMaXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJbnRlcnJvbXByZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSByw6lnbGFnZSBkdSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3VycyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMzEyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJY8O0bmUgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikljw7RuZSBDYXN0LiBEw6ljb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikljw7RuZSBDYXN0LiBDb25uZXhpb27igKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWPDtG5lIENhc3QuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZXIgc3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlsc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEw6ljb25uZWN0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlY3R1cmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJz4oCmIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJjMzU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbWl0aXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlciBlbWlzacOzbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUGVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iQW1wbGlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29udHJhZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc3ByYXphYmxlIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm9uIHNlIHNlbGVjY2lvbmFyb24gcmVjdXJzb3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vbiBoYWkgaW5mb3JtYWNpw7NuIGRpc3Bvw7FpYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzacOzbiBkZSBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkNWYzZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqrjgqr/gqrjgq43gqp/gqq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4Kqh4Kq/4Kq44KuN4KqV4Kqo4KuH4KqV4KuN4KqfIOCqleCqsOCrjeCqr+CrgeCqgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqogg4Kqw4Kq54KuN4Kqv4KuB4KqCIOCqm+CrhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqr+CrgeCqgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgqobgqqjgqr4g4Kqq4KqwIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqongqqrgqpXgqrDgqqPgq4sg4Kq24KuL4Kqn4KuAIOCqsOCqueCrjeCqr+CqvuCqgiDgqpvgq4Dgqo8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kqh4Kq/4Kq44KuN4KqV4Kqo4KuH4KqV4KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgqrXgqr7gqqjgq4HgqoIg4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqqzgqoLgqqcg4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kqa4Kqy4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgqqXgq4vgqq3gqr7gqrXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgqrDgq4vgqpXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqrXgqr/gqrjgq43gqqTgq4PgqqQg4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqrjgqoLgqpXgq4Hgqprgqr/gqqQg4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KqG4Kqy4KuN4Kqs4KquIOCqleCqsuCqviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqrXgq4ngqrLgq43gqq/gq4Hgqq4g4Kq44KuN4Kqy4Kq+4KqH4Kqh4KqwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqpXgq4vgqogg4Kqu4KuA4Kqh4Kq/4Kqv4Kq+IOCqquCquOCqguCqpiDgqpXgqrDgq4fgqrIg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqpXgq4vgqogg4Kqu4Kq+4Kq54Kq/4Kqk4KuAIOCqieCqquCqsuCqrOCrjeCqpyDgqqjgqqXgq4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCquOCrjeCqleCrjeCqsOCrgOCqqOCqqOCrhyDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuAIOCqsOCqueCrjeCqr+CqvuCqgiDgqpvgq4ciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTJhNTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4KS44KS/4KS44KWN4KSf4KSuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCkoeCkv+CkteCkvuCkh+CkuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkoeCkv+CkuOCkleCkqOClh+CkleCljeCknyDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWLIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSH4KS4IOCkquCksCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSh4KS/4KS14KS+4KSH4KS4IOCkouClguCkguCkoiDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSo4KS+IOCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpJrgpLLgpL7gpI/gpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCksOCli+CkleClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpJvgpYvgpJ/gpL4g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYvgpIgg4KSu4KWA4KSh4KS/4KSv4KS+IOCkmuCkr+CkqOCkv+CkpCDgpKjgpLngpYDgpIIg4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpIgg4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkruCljOCknOClguCkpiDgpKjgpLngpYDgpIIg4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4KSfIOCkueCliyDgpLDgpLngpYAg4KS54KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQzZWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN1c3RhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikd1bWIgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gVmV6YSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXppdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3ZlemFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dmFyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVrY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2HFvmltYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgZ2xhc25vxId1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplIG9kYWJyYW4gbmlqZWRhbiBtZWRpaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5mb3JtYWNpamUgbmlzdSBkb3N0dXBuZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pdGlyYW5qZSB6YXNsb25hIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZiZGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlJlbmRzemVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVzemvDtnrDtmsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDgXRrw7xsZMOpcyBnb21iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw4F0a8O8bGTDqXMgZ29tYi4gS2FwY3NvbGF0IGJvbnR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvenRhdHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsOBdGvDvGxkw6lzIGlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkVzemvDtnrDtmsga2VyZXPDqXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkxldsOhbGFzenTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLDgXRrw7xsZMOpcyBsZcOhbGzDrXTDoXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJCZXrDoXLDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWrDoXRzesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU3rDvG5ldGVsdGV0w6lzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTGXDoWxsw610w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2lib250w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLDlnNzemVjc3Vrw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTGVtZXpib3LDrXTDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIYW5nZXLFkXN6YWLDoWx5esOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaW5jcyBtw6lkaWEga2l2w6FsYXN6dHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaW5jcyBpbmZvcm3DoWNpw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkvDqXBlcm55xZF0YXJ0YWxvbSDDoXRrw7xsZMOpc2UiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzgyYjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i1YDVodW01aHVr9Wh1oDVoyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLVjdWh1oDWhNWl1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1bYg1aHVttW71aHVv9W+1aHVriDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1bjWgtW0INWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i1LjVttW/1oDVpdaEINW91aHWgNaE1agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLVjdWh1oDWhNWl1oDVqyDVuNaA1bjVttW41oLVtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLUsdW21bvVodW/1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItS01aHVpNWh1oDVpdaB1bbVpdWsINWw1aXVvNWh1oDVsdWh1a/VuNaC1bTVqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i1ZPVodWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItWG1b7VodWj1aHWgNWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i1LTVodWk1aHWgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItS01aHVpNWh1oDVpdaB1bbVpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i1LjVttWk1aHWgNWx1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItS/1bjVrtWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItSx1azVotW41bTVqyDVt9Wh1brVq9WvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItWB1aHVtdW21asg1bjWgtWq1aPVttW41oLVqdW11aHVtiDVr9Wh1oDVo9Wh1b7VuNaA1avVuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i1YTVpdWk1avVoSDWhtWh1bXVrNWl1oAg1bnVpdW2INWo1bbVv9aA1b7VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLVj9Wl1bLVpdWv1bjWgtWp1bXVuNaC1bbVttWl1oDVqCDVsNWh1b3VodW21aXVrNWrINW51aXVtiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i1LfVr9aA1aHVttWoINWw1aXVvNWh1oDVsdWh1a/VvtW41oLVtCDVpyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNzUyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVG9tYm9sIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUb21ib2wgQ2FzdC4gVGVycHV0dXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRvbWJvbCBDYXN0LiBNZW5naHVidW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRvbWJvbCBDYXN0LiBUZXJodWJ1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXNpa2FuIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbmdrYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHV0dXNrYW4gc2FtYnVuZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSGVudGlrYW4gY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVHV0dXAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQdXRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTHVhc2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ2l1dGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbXB1bCBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCaWxhaCBnZXNlciB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IlRpZGFrIGFkYSBtZWRpYSB5YW5nIGRpcGlsaWgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZGFrIGFkYSBpbmZvIHlhbmcgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWlzaSBsYXlhciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzNWVhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJLZXJmaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUw6ZraSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOadHNlbmRpbmdhcmhuYXBwdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBBZnRlbmd0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5naXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmd0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNlbmRhIMO6dCDDrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxlaXRhw7AgYcOwIHTDpmtqdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZ0ZW5namFzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0w7bDsHZhIMO6dHNlbmRpbmd1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJMb2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BpbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ikhsw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdMO2w7B2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlN0w6Zra2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik1pbm5rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBsw7Z0dXVtc2xhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIbGrDs8Owc3R5cmtzc2xlw7BpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFbmdpbm4gbWnDsGlsbCB2YWxpbm4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkVuZ2FyIHVwcGzDvXNpbmdhciDDrSBib8OwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2tqw6FyIHNlbmR1ciDDunQiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmUzYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlB1bHNhbnRlIFRyYXNtZXR0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gRGlzY29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc2lvbmUgaW4gY29yc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFzbWV0dGkgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJpY2VyY2EgZGkgZGlzcG9zaXRpdmkgaW4gY29yc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2NvbGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBpIHRyYXNtaXNzaW9uZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2hpdWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmlwcm9kdWNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkludGVycm9tcGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFc3BhbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb21wcmltaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkNvcGVydGluYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJEaXNwb3NpdGl2byBkaSBzY29ycmltZW50byBkZWwgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXNzdW4gY29udGVudXRvIG11bHRpbWVkaWFsZSBzZWxlemlvbmF0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVzc3VuYSBpbmZvcm1hemlvbmUgZGlzcG9uaWJpbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYXNtaXNzaW9uZSBkZWxsbyBzY2hlcm1vIGluIGNvcnNvIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJiMGNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itee16LXqNeb16oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i157Xm9ep15nXqNeZ150iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16DXldeq16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XqteX15HXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee15fXldeR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i15TXoteR16jXlCDXkNecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i157Xl9ek16kg157Xm9ep15nXqNeZ150iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i16DXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i15TXpNeh16cg15DXqiDXlNeU16LXkdeo15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Iteh15LXldeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i15TXpNei15wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IteU16nXlNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i15TXpNeh16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLXlNeo15fXkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i15vXldeV16UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLXoteY15nXpNeqINeQ15zXkdeV150iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i157Xl9eV15XXnyDXoteV16bXnteUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLXnNeQINeg15HXl9eo15Qg157Xk9eZ15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IteQ15nXnyDXnteZ15PXoiDXltee15nXnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i15TXoteR16jXqiDXnteh15og157XqteR16bXoteqIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ5NzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuOCt+OCueODhuODoCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLnq6/mnKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLjgq3jg6Pjgrnjg4jjgqLjgqTjgrPjg7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa6Kej6Zmk5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprmuIjjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i44Kt44Oj44K544OI44GZ44KL44OH44OQ44Kk44K5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i56uv5pyr44KS5qSc57Si44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuaOpee2muOCkuino+mZpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuOCreODo+OCueODiOOCkuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6ZaJ44GY44KLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5YaN55SfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLkuIDmmYLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaKmOOCiuOBn+OBn+OCgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuOCouODq+ODkOODoOOCouODvOODiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/jgrnjg6njgqTjg4Djg7wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuODoeODh+OCo+OCouOBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5oOF5aCx44GM44GC44KK44G+44Gb44KTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLnlLvpnaLjgpLjgq3jg6Pjgrnjg4jjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTA4MWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YOh4YOY4YOh4YOi4YOU4YOb4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Lhg5Dhg5fhg5jhg6jhg6Phg5rhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDkDoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5jhg6Eg4YOb4YOd4YOr4YOY4YOU4YOR4YOQLi4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGDmeGDkOGDleGDqOGDmOGDoOGDmOGDoSDhg5Lhg5Dhg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhg5Phg5Dhg67hg6Phg6Dhg5Xhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhg5Phg5Dhg5nhg5Xhg6Dhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGDnuGDkOGDo+GDluGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGDkuGDkOGDqOGDmuGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YOp4YOQ4YOZ4YOU4YOq4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YOQ4YOa4YOR4YOd4YOb4YOY4YOhIOGDkuGDkOGDoOGDlOGDmeGDkOGDnOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhg67hg5vhg5jhg6Eg4YOh4YOa4YOQ4YOY4YOT4YOU4YOg4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhg5vhg5Thg5Phg5jhg5Ag4YOQ4YOg4YOp4YOU4YOj4YOa4YOYIOGDkOGDoCDhg5Dhg6Dhg5jhg6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGDmOGDnOGDpOGDneGDoOGDm+GDkOGDquGDmOGDkCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIOGDruGDlOGDmuGDm+GDmOGDoeGDkOGDrOGDleGDk+GDneGDm+GDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDlOGDmeGDoOGDkOGDnOGDmOGDoSDhg5Lhg5Dhg5Phg5Dhg6rhg5Thg5vhg5AiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGNiYjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0JbSr9C50LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0prSsdGA0YvQu9KT0YvQu9Cw0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyDRgtKv0LnQvNC10YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0JDQttGL0YDQsNGC0YPQu9GLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvRg9C00LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70LTRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQmtC10LvQtdGB0ZbQs9C1INGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0prSsdGA0YvQu9KT0YvQu9Cw0YDQtNGLINGC0LDQsdGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LbRi9GA0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YPQtNGLINGC0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQltCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCe0LnQvdCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0JrRltC00ZbRgNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQotC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCW0LDRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JbQuNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INGI0LXQsdC10YDRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGL0LHRi9GBINC00LXSo9Cz0LXQudGW0L3RltKjINC20q/Qs9GW0YDRgtC60ZbRgdGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQldGI0LHRltGAINGC0LDRgdGD0YjRiyDRgtCw0qPQtNCw0LvQvNCw0pPQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLSmtC+0Lsg0LbQtdGC0ZbQvNC00ZYg0LDSm9C/0LDRgNCw0YIg0LbQvtKbIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC90LTRiyDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0NzgwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhnpThn5Lhnprhnpbhn5DhnpPhn5LhnpIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4Z6U4Z+K4Z684Z6P4Z674Z6E4Z6B4Z624Z6fIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+GegOGetuGej+Gfi+GeleGfkuGej+GetuGeheGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGegOGfhuGeluGeu+GehOGel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6X4Z+S4Z6H4Z624Z6U4Z+L4Z6g4Z6+4Z6ZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGelOGeieGfkuGeh+GevOGek+GekeGfhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGegOGfhuGeluGeu+GehOGen+GfkuGenOGfguGehOGemuGegOGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhnpXhn5LhnorhnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhnojhnpThn4vhnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGelOGet+GekSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGeheGetuGegOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Z6V4Z+S4Z6i4Z624Z6AIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Z6I4Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Z6W4Z6E4Z+S4Z6a4Z644Z6AIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhnpThnoThn5Lhnprhnr3hnpgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhnp/hn5LhnpPhnrbhnorhn4Phnp/hnrfhnpvhn5LhnpThn4jhnqLhnrbhnpvhn4vhnpThn4rhnrvhnpgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Z6a4Z6U4Z624Z6a4Z6A4Z6Y4Z+S4Z6a4Z634Z6P4Z6f4Z+G4Z6h4Z+B4Z6EIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhnoLhn5LhnpjhnrbhnpPhnoDhnrbhnprhnofhn5Lhnprhnr7hnp/hnpjhn4Hhnozhn4DhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGemOGet+Gek+GemOGetuGek+GeluGfkOGej+GfjOGemOGetuGek+GekeGfgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6B4Z624Z6f4Z6i4Z+B4Z6A4Z+S4Z6a4Z6E4Z+LIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM3ZmRkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCyuOCyv+CyuOCzjeCyn+CygiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgsrjgsr7gsqfgsqjgspfgsrPgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCysuCyvuCyl+Cyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CypOCyl+CziuCyguCyoeCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgsofgsqbgspXgs43gspXgs4Yg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LK44LK+4LKn4LKo4LKX4LKz4LKo4LON4LKo4LOBIOCyueCzgeCyoeCzgeCyleCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOB4LK14LK/4LKV4LOGIOCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LKu4LOB4LKa4LON4LKa4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LKq4LON4LKy4LOHIOCyruCyvuCyoeCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LK14LK/4LKw4LK+4LKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LK14LK/4LK44LON4LKk4LKw4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsrjgsoLgspXgs4Hgsprgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsobgsrLgs43gsqzgsq7gs40g4LKV4LKy4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCyteCyvuCysuCzjeCyr+CzguCyruCzjSDgsrjgs43gsrLgs4jgsqHgsrDgs40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsqfgs43gsq/gsq4g4LKG4LKv4LON4LKV4LOG4LKu4LK+4LKh4LKy4LK+4LKX4LK/4LKy4LON4LKyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LK54LK/4LKk4LK/IOCysuCyreCzjeCyr+CyteCyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LKq4LKw4LKm4LOG4LKv4LKo4LON4LKo4LOBIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4OTNhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLsi5zsiqTthZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i7KCE7IahIOuyhO2KvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuyghOyGoSDrsoTtirwuIOyXsOqysCDtlbTsoJzrkKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuyghOyGoSDrsoTtirwuIOyXsOqysCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKw65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuyghOyGoe2VoCDquLDquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLquLDquLDrpbwg7LC+64qUIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLsl7DqsrAg7ZW07KCcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i7KCE7IahIOykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i64ur6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i7J6s7IOdIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLsnbzsi5zspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLtjrzsuZjquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iuygkeq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuyVqOuylOyVhO2KuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLrs7zrpagg7Iqs65287J20642UIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLshKDtg53tlZwg66+465SU7Ja0IOyXhuydjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i7KCV67O06rCAIOyXhuyKteuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iu2ZlOuptCDsoITshqEg7KSRIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzgxM2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCi0YPRgtGD0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLSr9C30LzTqdC60YLTqdGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDQsNC20YvRgNCw0L8g0YLRg9GA0LDRgi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YPRg9C00LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRi9C/INGC0YPRgNCw0YIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLTqdC806nQvdC60q/Qs9OpINGH0YvQs9Cw0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLSr9C30LzTqdC60YLTqdGAINC40LfQtNC10LvSr9Kv0LTTqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KLRi9GI0Log0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNC90YMg0YLQvtC60YLQvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCe0LnQvdC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotGL0L3QtNGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtC60YLQvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCW0LDQudGL0L8g0LrTqdGA0YHTqdGC0q/SryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JbRi9C50YvRiNGC0YvRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0LzRg9C60LDQsdCw0YHRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLSrtC90LTSryDQutCw0YLRg9GD0LvQsNGC0YPRg9GH0YMg0YHRi9C00YvRgNC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCR0LjRgCDQtNCwINC80LXQtNC40LAg0YTQsNC50Lsg0YLQsNC90LTQsNC70LPQsNC9INC20L7QuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0K3RhyDQvNCw0LDQu9GL0LzQsNGCINC20L7QuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YvQu9GD0YPQtNCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjFlMWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gTWVkaWFSb3V0ZUNvbnRyb2xsZXIncyB2b2x1bWUgZ3JvdXAgbGlzdCAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIE1heGltdW0gaGVpZ2h0IG9mIHZvbHVtZSBncm91cCBsaXN0LiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0Ij4xMzJkcDwvZGltZW4+Ci0gICAgPCEtLSBIZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGl0ZW0uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0Ij42MWRwPC9kaW1lbj4KLSAgICA8IS0tIFNpemUgb2YgYW4gaXRlbSdzIGljb24uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIj4xOGRwPC9kaW1lbj4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3MzdkYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLguqXgurDguprgurvgupoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Lqt4Lq44Lqb4Lqw4LqB4Lqt4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4Lqb4Lq44LuI4Lqh4oCL4LqE4Lqy4oCL4Lqq4oCL4LqX4LuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgupXgurHgupTguoHgurLgupngu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqB4Lqz4Lql4Lqx4LqH4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6meC6q+C6siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC6geC6s+C6peC6seC6h+KAi+C6iuC6reC6geKAi+C6q+C6suKAi+C6reC6uOKAi+C6m+C6sOKAi+C6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgupXgurHgupTguoHgurLgupngu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguqLgurjgupTguoHgurLgupnguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC6m+C6tOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC6q+C6vOC6tOC7ieC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lqi4Lq44LqU4LqK4Lq74LuI4Lqn4LqE4Lqy4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lqi4Lq44LqUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LqC4Lqw4Lqr4LqN4Lqy4LqNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguqvguo3gu43gu4nguqXgurvguociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgu5zgu4ngurLgupvgurvguoHguq3gurDguqXgurDguprgu43gu4ngurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LqV4Lq74Lqn4Lqb4Lqx4Lqa4Lql4Lqw4LqU4Lqx4Lqa4Lqq4Lq94LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguprgu43gu4jigIvgu4TgupTgu4nigIvgu4DguqXgurfguq3guoHigIvguqHgurXigIvgu4DgupTguo3igIvgu4PgupTigIvgu4Tguqfgu4kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC6muC7jeC7iOKAi+C6oeC6teKAi+C6guC7jeC7ieKAi+C6oeC6ueC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqe4Lqy4Lqa4Luc4LuJ4Lqy4LqI4LuNIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjAzNmQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4ixK5yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQZXJkYXZpbW8gbXlndHVrYXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQZXJkYXZpbW8gbXlndHVrYXMuIEF0c2lqdW5ndGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5naWFtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlBlcmR1b3RpIMSvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmFuZGFtaSDEr3JlbmdpbmlhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBdGp1bmd0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN1c3RhYmR5dGkgcGVyZGF2aW3EhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVcW+ZGFyeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVpc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQcmlzdGFiZHl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN1c3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJxaFza2xlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU3V0cmF1a3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1vIHZpcsWhZWxpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHYXJzdW1vIMWhbGlhdcW+aWtsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lcGFzaXJpbmt0YSBqb2tpYSBtZWRpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWphIG5lcGFzaWVraWFtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGVyZHVvZGFtYXMgZWtyYW5hcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MDYzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0xJNtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJJZXLEq2NlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkFwcmFpZGVzIHBvZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBwxIFydHJhdWt0cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQXByYWlkZXMgcG9nYS4gTm90aWVrIHNhdmllbm9qdW1hIGl6dmVpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgaXp2ZWlkb3RzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkFwcmFpZMSrxaFhbmEgdXogaWVyxKtjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5vdGllayBpZXLEq8SNdSBtZWtsxJPFoWFuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBdHZpZW5vdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFwdHVyxJN0IGFwcmFpZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkFpenbEk3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQXRza2HFhm90Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFwdHVyxJN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iSXp2xJNyc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNha8S8YXV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1hIHbEgWNpxYbFoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTa2HEvHVtYSBzbMSrZG5pcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmF2IGF0bGFzxKt0aSBtdWx0aXZpZGVzIGZhaWxpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOYXYgcGllZWphbWEgaW5mb3JtxIFjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJOb3RpZWsgZWtyxIFuYSBhcHJhaWRlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRlZTM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXQtNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvtC/0YfQtdGC0L4g0LfQsCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCY0YHQutC70YPRh9C10L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCh0LUg0L/QvtCy0YDQt9GD0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0J/QvtCy0YDQt9Cw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQldC80LjRgtGD0LLQsNGYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQodC1INCx0LDRgNCw0LDRgiDRg9GA0LXQtNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCY0YHQutC70YPRh9C4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQvtC/0YDQuCDQs9C+INC10LzQuNGC0YPQstCw0ZrQtdGC0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDRgtCy0L7RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KDQtdC/0YDQvtC00YPRhtC40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KHQvtC/0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC+0LHQtdGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQmtC+0YDQuNGG0LAg0L3QsCDQsNC70LHRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCb0LjQt9Cz0LDRhyDQt9CwINGY0LDRh9C40L3QsCDQvdCwINC30LLRg9C6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC1INGB0LUg0LjQt9Cx0YDQsNC90Lgg0LzQtdC00LjRg9C80LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LXQvNCwINC00L7RgdGC0LDQv9C90Lgg0LjQvdGE0L7RgNC80LDRhtC40LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCV0LrRgNCw0L3QvtGCINGB0LUg0LXQvNC40YLRg9Cy0LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTE0YjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LS44LS/4LS44LWN4LSx4LWN4LSx4LSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC0n+C0vuC0quC1jeC0quC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0muC1jeC0muC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4oCM4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0pOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgtIfgtKTgtL/gtLLgtYfgtJXgtY3gtJXgtY0g4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+IOC0leC0o+C1jeC0n+C1huC0pOC1jeC0pOC1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtb0g4LSo4LS/4LW84LSk4LWN4LSk4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgtIXgtLXgtLjgtL7gtKjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtKrgtY3gtLLgtYcg4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgtKTgtb3gtJXgtY3gtJXgtL7gtLLgtIIg4LSo4LS/4LW84LSk4LWN4LSk4LWCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LSo4LS/4LSw4LWN4oCN4LSk4LWN4LSk4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LS14LS/4LSV4LS44LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgtJrgtYHgtLDgtYHgtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtIbgtb3gtKzgtIIg4LSG4LW84LSf4LWN4LSf4LWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC0teC1i+C0s+C0v+C0r+C0giDgtLjgtY3gtLLgtYjgtKHgtbwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC0ruC1gOC0oeC0v+C0r+C0r+C1iuC0qOC1jeC0qOC1geC0giDgtKTgtL/gtLDgtJ7gtY3gtJ7gtYbgtJ/gtYHgtKTgtY3gtKTgtL/gtJ/gtY3gtJ/gtL/gtLLgtY3gtLIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC0teC0v+C0teC0sOC0meC1jeC0meC0s+C1iuC0qOC1jeC0qOC1geC0giDgtLLgtK3gtY3gtK/gtK7gtLLgtY3gtLIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC0uOC1jeKAjOC0leC1jeC0sOC1gOC1uyDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODdjOTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi06nRhdOp06nRgNOp0LzQttKv0q/QtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCh0LDQu9GB0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7QtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LPQtNGB0L7QvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQlNCw0LzQttGD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotOp0YXTqdOp0YDTqdC80LYg0YXQsNC50LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQodCw0LvQs9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQlNCw0LzQttGD0YPQu9Cw0YXRi9CzINC30L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQpdCw0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCi0L7Qs9C70YPRg9C70LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLSr9GAINC30L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQlNGN0LvQs9GN0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCl0YPRgNCw0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCm0L7QvNCz0LjQudC9INC30YPRgNCw0LMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRg9GD0L3RiyDRgtKv0LLRiNC40L0g0YLQsNCw0YDRg9GD0LvQsNCz0YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCv0LzQsNGAINGHINC80LXQtNC40LAg0YHQvtC90LPQvtC+0LPSr9C5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQnNGN0LTRjdGN0LvRjdC7INCx0LDQudGF0LPSr9C5INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCU0Y3Qu9Cz0Y3RhtC40LnQsyDQtNCw0LzQttGD0YPQu9C2INCx0LDQudC90LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZmJlYmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4KS44KS/4KS44KWN4KSf4KSuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjLiDgpKHgpL/gpLjgpY3gpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KWH4KSy4KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KWH4KSy4KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkr+CkvuCkteCksCDgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4IOCktuCli+Ckp+CkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KWN4oCN4KSV4KSo4KWH4KSV4KWN4oCN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKPgpYcg4KSl4KS+4KSC4KSs4KS14KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSq4KWN4KSy4KWHIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KS14KS/4KSw4KS+4KSuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSl4KS+4KSC4KSs4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KWD4KSkIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KS44KSC4KSV4KWB4KSa4KS/4KSkIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkheCksuCljeCkrOCkriDgpJXgpLLgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWN4KS54KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkr+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSu4KWA4KSh4KS/4KSv4KS+IOCkqOCkv+CkteCkoeCksuCkviDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+Cko+CkpOClgOCkueClgCDgpK7gpL7gpLngpL/gpKTgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkqOCkvuCkueClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODVlNDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0YW5nIEhhbnRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dGFuZyBoYW50YXIuIFNhbWJ1bmdhbiBkaXB1dHVza2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRhbmcgaGFudGFyLiBNZW55YW1idW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dGFuZyBoYW50YXIuIERpc2FtYnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJIYW50YXIga2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHV0dXNrYW4gc2FtYnVuZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQmVyaGVudGkgbWVuZ2hhbnRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVHV0dXAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJNYWluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLZW1iYW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSdW50dWhrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTZW5pIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBlbHVuY3VyIGtlbGFudGFuZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWFkYSBtZWRpYSBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJNYWtsdW1hdCB0aWRhayB0ZXJzZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTWVuZ2hhbnRhciBza3JpbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzZDgwNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhgIXhgJThgIXhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YCF4YCA4YC64YCV4YCF4YC54YCF4YCK4YC64YC44YCZ4YC74YCs4YC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YCA4YCs4YCF4YC64YCQ4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAgeGAnOGAr+GAkOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJnhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJThgLHhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAkeGArOGAuOGAnuGAiuGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCF4YCA4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YCF4YCA4YC64YCV4YCF4YC54YCF4YCK4YC64YC44YCZ4YC74YCs4YC4IOGAm+GAvuGArOGAluGAveGAseGAgeGAvOGAhOGAuuGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhgIbhgIDhgLrhgJ7hgL3hgJrhgLrhgJnhgL7hgK8g4YCW4YC84YCQ4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCB4YC84YCE4YC64YC4IOGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YCV4YCt4YCQ4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YCW4YC94YCE4YC34YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhgIHhgI/hgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhgJbhgLzhgJThgLfhgLrhgIHhgLvhgJvhgJThgLrhgYMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGAgeGAseGAq+GAgOGAuuGAnuGAreGAmeGAuuGAuOGAm+GAlOGAui4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGAoeGAmuGAuuGAnOGAuuGAmOGAmeGAuuGAleGAr+GAtiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhgKHhgJ7hgLbhgKHhgJDhgK3hgK/hgLjhgKHhgIDhgLvhgJrhgLrhgIHhgLvhgK3hgJThgLrhgJ7hgIrhgLfhgLog4YCG4YCc4YCt4YCv4YCA4YC64YCS4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhgJnhgIrhgLrhgJ7hgIrhgLfhgLrhgJnhgK7hgJLhgK7hgJnhgL4g4YCZ4YCb4YC94YCx4YC44YCB4YC74YCa4YC64YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhgKHhgIHhgLvhgIDhgLrhgKHhgJzhgIDhgLog4YCZ4YCb4YCb4YC+4YCt4YCU4YCt4YCv4YCE4YC64YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhgJDhgIrhgLrhgLjhgJbhgLzhgJDhgLrhgJvhgLHhgLgg4YCZ4YC74YCA4YC64YCU4YC+4YCs4YCV4YC84YCE4YC6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjc2NGM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pa29uZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyYWtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBLb2JsZXIgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gVGlsa29ibGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU8O4a2VyIGV0dGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29ibGUgZnJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcHAgY2FzdGluZ2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJMdWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BpbGwgYXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlNldHQgcMOlIHBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpa2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2xpZGVicnl0ZXIgZm9yIHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJEdSBoYXIgaWtrZSB2YWxndCBub2VuIG1lZGllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5nZW4gaW5mb3JtYXNqb24gZXIgdGlsZ2plbmdlbGlnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0ZXIgc2tqZXJtZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4KSq4KWN4KSw4KSj4KS+4KSy4KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCkieCkquCkleCksOCko+CkueCksOClgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qg4KSs4KSf4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkteCkv+CkmuCljeCkm+Clh+CkpiDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLngpYHgpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkreCkr+CliyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpLjgpK7gpL4gQ2FzdCDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpK/gpKjgpY3gpKTgpY3gpLDgpLngpLDgpYIg4KSq4KSk4KWN4KSk4KS+IOCksuCkl+CkvuCkieCkgeCkpuCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iY2FzdGluZyDgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkqOCljeCkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKzgpJzgpL7gpIngpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleCljeCkt+Ckv+CkquCljeCkpCDgpKrgpL7gpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkreCli+CksuCljeCkr+ClgeCkruCkleCliyDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleClgeCkqOCliCDgpK7gpL/gpKHgpL/gpK/gpL4g4KSa4KSv4KSoIOCkreCkj+CkleCliyDgpJvgpYjgpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCknOCkvuCkqOCkleCkvuCksOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpL/gpKggY2FzdCDgpJfgpLDgpY3gpKbgpYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZGY2MmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmF0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWljb29uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyB2ZXJicm9rZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgbWFrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1pY29vbi4gVmVyYm9uZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlbiBuYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQXBwYXJhdGVuIHpvZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMb3Nrb3BwZWxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3RlbiBzdG9wcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTbHVpdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik9uZGVyYnJla2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlVpdHZvdXdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FtZW52b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWhvZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lc2NodWlmcmVnZWxhYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgZ2VzZWxlY3RlZXJkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGluZm9ybWF0aWUgYmVzY2hpa2JhYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNjaGVybSBjYXN0ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWRmNzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Ki44Ki/4Ki44Kif4KiuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCooeCov+CoteCovuCoiOCouOCovuCogiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuColeCovuCouOConyDgqKzgqJ/gqKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOCooeCov+CouOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgqI/gqKXgqYcg4KiV4Ki+4Ki44KifIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCooeCpgOCoteCovuCoiOCouOCovuCogiDgqKjgqYLgqbAg4Kiy4Kmx4Kit4Ki/4KiGIOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCooeCov+CouOColeCoqOCpiOColeConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqJXgqL7gqLjgqJ8g4KiV4Kiw4Kio4Ki+IOCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgqKrgqLLgqYcg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgqLDgqYvgqJXgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Ki14Ki/4Ki44Kik4Ki+4KiwIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCokOCosuCorOCoriDgqIbgqLDgqJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Ki14KmM4Kiy4Kiv4KmC4KiuIOCouOCosuCovuCoiOCooeCosCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KiV4KmL4KiIIOCoteCpgCDgqK7gqYDgqKHgqYDgqIYg4Kio4Ki54KmA4KiCIOComuCpgeCoo+Cov+CohiDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuColeCpi+CoiCDgqJzgqL7gqKPgqJXgqL7gqLDgqYAg4KiJ4Kiq4Kiy4Kis4KinIOCoqOCoueCpgOCogiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Ki44KiV4KmN4Kiw4KmA4KioIOConOCpi+CpnCDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzkyYTZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcnrEhWR6ZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlByenljaXNrIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIFJvesWCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiDFgcSFY3rEmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIFBvxYLEhWN6b25vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByemVzecWCYWogbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJabmFqZG93YW5pZSB1cnrEhWR6ZcWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kxYLEhWN6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF0cnp5bWFqIHByemVzecWCYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmFta25paiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik9kdHfDs3J6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJXc3RyenltYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXRyenltYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3p3acWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJad2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9rxYJhZGthIGFsYnVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTdXdhayBnxYJvxZtub8WbY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSB3eWJyYW5vIG11bHRpbWVkacOzdyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQnJhayBpbmZvcm1hY2ppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcnplc3nFgmFtIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzYxOWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w6NvIFRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgcGFyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxvY2FsaXphbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGVyIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVjb2xoZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBcnRlIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sZSBkZXNsaXphbnRlIGRlIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtYSBtw61kaWEgc2VsZWNpb25hZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGluZG8gYSB0ZWxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGE2MWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w6NvIFRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDo28gVHJhbnNtaXRpci4gRGVzbGlnYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gVHJhbnNtaXRpci4gQSBsaWdhci4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gVHJhbnNtaXRpci4gTGlnYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgcGFyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkEgbG9jYWxpemFyIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNhc3NvY2lhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlBhcmFyIGEgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJbnRlcnJvbXBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZW0gZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xvIGRlIGRlc2xpemUgZG8gdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW0gc3Vwb3J0ZSBtdWx0aW3DqWRpYSBzZWxlY2lvbmFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkEgdHJhbnNtaXRpciBvIGVjcsOjIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w6NvIFRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgcGFyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxvY2FsaXphbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGVyIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVjb2xoZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBcnRlIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sZSBkZXNsaXphbnRlIGRlIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtYSBtw61kaWEgc2VsZWNpb25hZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGluZG8gYSB0ZWxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJiMmY2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gRGVjb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBTZSBjb25lY3RlYXrEgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIENvbmVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByb2llY3RhyJtpIHBlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2UgY2F1dMSDIGRpc3Bveml0aXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlY29uZWN0YcibaS12xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOdSBtYWkgcHJvaWVjdGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsOObmNoaWRlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVkYcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iw45udHJlcnVwZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik9wcmnIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHRpbmRlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXN0csOibmdlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iR3JhZmljYSBhbGJ1bXVsdWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2xpc29yIHBlbnRydSB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmljaXVuIGZpyJlpZXIgbWVkaWEgc2VsZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik51IHN1bnQgZGlzcG9uaWJpbGUgaW5mb3JtYcibaWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNlIHByb2llY3RlYXrEgyBlY3JhbnVsIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzQ2MmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQvtGC0LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LDQtdGC0YHRjy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JLRi9Cx0LXRgNC40YLQtSDRg9GB0YLRgNC+0LnRgdGC0LLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7QuNGB0Log0YPRgdGC0YDQvtC50YHRgtCy4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCe0YLQutC70Y7Rh9C40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCf0YDQtdC60YDQsNGC0LjRgtGMINGC0YDQsNC90YHQu9GP0YbQuNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNGL0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0L7RgdC/0YDQvtC40LfQstC10YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQvtGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCe0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LLQtdGA0L3Rg9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LLQtdGA0L3Rg9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQoNC10LPRg9C70Y/RgtC+0YAg0LPRgNC+0LzQutC+0YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQnNC10LTQuNCw0YTQsNC50Lsg0L3QtSDQstGL0LHRgNCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCU0LDQvdC90YvRhSDQvdC10YIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0L7QtNC60LvRjtGH0LXQvdC40LUg0Log0YPQtNCw0LvQtdC90L3QvtC80YMg0LzQvtC90LjRgtC+0YDRgyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1Y2U1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtrTgtq/gt4rgtrDgtq3gt5LgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LaL4La04LeP4LaC4LacIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrguIOC3gOC3kuC3g+C2seC3iuC2sOC3kiDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrjgt5LgtrHgt4oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgt4Dgt5Lgtprgt4/gt4HgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtovgtrTgt4/gtoLgtpwg4LeD4LeZ4LeA4LeT4La4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC3gOC3kuC3g+C2seC3iuC2sOC3kiDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgt4Dgt5Lgtprgt4/gt4Eg4Laa4LeS4La74LeT4La4IOC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC3gOC3g+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC2sOC3j+C3gOC2seC2uiDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC3gOC3kuC2u+C3j+C2uCDgtpzgtrHgt4rgt4DgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Lav4LeS4LacIOC3hOC2u+C3kuC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LeE4Laa4LeU4LeF4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LaH4La94LeK4La24La4IOC2muC2veC3j+C3gCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgt4Tgtqwg4La04La74LeS4La44LePIOC3g+C3iuC2veC2uuC3kuC2qeC2u+C2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4La44LeP4Law4LeK4oCN4La64La6IOC2reC3neC2u+C3jyDgtrHgt5Dgtq0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC2veC2tuC3jyDgtpzgtq0g4LeE4LeQ4Laa4LeSIOC2reC3nOC2u+C2reC3lOC2u+C3lCDgtrHgt5zgtrjgt5Dgtq0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC3gOC3kuC2muC3j+C3gSDgtq3gt5LgtrvgtroiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGFhMTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOpbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJaYXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI1pZGxvIHByZW5vc3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjWlkbG8gcHJlbm9zdS4gT2Rwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcMOhamEgc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXBvamVuw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlbm9zIGRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSMS+YWRhasO6IHNhIHphcmlhZGVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXN0YXZpxaUgcHJlbsOhxaFhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXZyaWXFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWhyYcWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQb3phc3RhdmnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3RhdmnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWmJhbGnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9icsOhem9rIGFsYnVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3PDunZhxI0gaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHPDuiB2eWJyYW7DqSDFvmlhZG5lIG3DqWRpw6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pZSBzw7oga8KgZGlzcG96w61jaWkgxb5pYWRuZSBpbmZvcm3DoWNpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlbsOhxaFhIHNhIG9icmF6b3ZrYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNGNlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTmFwcmF2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikd1bWIgemEgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSBwcmVraW5qZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gVnpwb3N0YXZsamFuamUgcG92ZXphdmUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHZ6cG9zdGF2bGplbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZWR2YWphbmplIHByZWs6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSXNrYW5qZSBuYXByYXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSBwb3ZlemF2byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlVzdGF2aSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmFwcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJVc3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSYXrFoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU3RybmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJEcnNuaWsgemEgZ2xhc25vc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pIGl6YnJhbmUgcHJlZHN0YXZub3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iUG9kYXRraSBuaXNvIG5hIHZvbGpvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVkdmFqYW5qZSB6YXNsb25hIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZlMTEwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGFqaXNqZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgc2hrw6twdXR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBQbyBsaWRoZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIGxpZGh1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21ldG8gdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQbyBrw6tya29uIHBhamlzamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2hrw6twdXRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTmRhbG8gdHJhbnNtZXRpbWluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJNYnlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ikx1YWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXrDqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik5kYWxvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmdqZXJvamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlBhbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IktvcGVydGluYSBlIGFsYnVtaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUnLDq3NocWl0w6tzaSBpIHZvbHVtaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik51ayB1IHpnam9kaCBhc25qw6sgbWVkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik51ayBqZXBldCBhc25qw6sgaW5mb3JtYWNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBvIHRyYW5zbWV0b24gZWtyYW5pbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhYmFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10ZLQsNGY0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0JLQtdC30LAg0ZjQtSDQv9GA0LXQutC40L3Rg9GC0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfRg9GY0LUg0YHQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30LDQvSDRmNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdCx0LDRhtGD0Zgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0YDQvtC90LDQu9Cw0LbQtdGa0LUg0YPRgNC10ZLQsNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrQuNC90Lgg0LLQtdC30YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQl9Cw0YPRgdGC0LDQstC4INC/0YDQtdCx0LDRhtC40LLQsNGa0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDRgtCy0L7RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0LDRg9GB0YLQsNCy0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQutGD0L/QuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LzQvtGCINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQmtC70LjQt9Cw0Ycg0LfQsCDRmNCw0YfQuNC90YMg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtdC80LAg0LjQt9Cw0LHRgNCw0L3QuNGFINC80LXQtNC40ZjQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QuNGB0YMg0LTQvtGB0YLRg9C/0L3QtSDQvdC40LrQsNC60LLQtSDQuNC90YTQvtGA0LzQsNGG0LjRmNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9GA0LXQsdCw0YbRg9GY0LUg0YHQtSDQtdC60YDQsNC9Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTdkM2UwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcsOlbmtvcHBsYWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0YSB0aWxsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTGV0YXIgZWZ0ZXIgZW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb3BwbGEgZnLDpW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTbHV0YSBjYXN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3TDpG5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlbGEgdXBwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF2YnJ5dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0w7ZrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iS29tcHJpbWVyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNraXZvbXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9seW1yZWdsYWdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdhIG1lZGlhIGhhciB2YWx0cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGV0IGZpbm5zIGluZ2VuIGluZm9ybWF0aW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Okcm1lbiBjYXN0YXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjJjYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iTWZ1bW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJLaXR1ZmUgY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW1lb25kb2xld2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW5hdW5nYW5pc2hhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW1ldW5nYW5pc2h3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUdW1hIGt3ZW55ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkluYXRhZnV0YSB2aWZhYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbmRvYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFjaGEga3V0dW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGdW5nYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkNoZXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTaXRpc2hhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU2ltYW1pc2hhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFudWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ikt1bmphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FuYWEgeWEgYWxiYW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktpdGVsZXppIGNoYSBzYXV0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSGFrdW5hIG1hdWRodWkgeWFsaXlvY2hhZ3VsaXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIYWt1bmEgbWFlbGV6byB5YWxpeW9wYXRpa2FuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iSW5hdHVtYSBza3JpbmkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0MjM0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NjAlPC9pdGVtPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+OTAlPC9pdGVtPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGFiOGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjUwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjcwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NzhmMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgrprgrr/grrjgr43grp/grq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4K6a4K6+4K6k4K6p4K6Z4K+N4K6V4K6z4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4K6k4K6/4K6w4K+I4K6v4K6/4K6f4K+BIOCuquCun+CvjeCun+CuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCupOCvgeCuo+CvjeCun+Cuv+CuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgrofgrqTgrrHgr43grpXgr4Eg4K6F4K6p4K+B4K6q4K+N4K6q4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4K6a4K6+4K6k4K6p4K6Z4K+N4K6V4K6z4K+I4K6k4K+NIOCupOCvh+Cun+CvgeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgrqTgr4rgrp/grrDgr43grqrgr4jgrqTgr40g4K6k4K+B4K6j4K+N4K6f4K6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K614K6k4K+IIOCuqOCuv+CuseCvgeCupOCvjeCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4K6u4K+C4K6f4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4K6H4K6v4K6V4K+N4K6V4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgrofgrp/gr4jgrqjgrr/grrHgr4HgrqTgr43grqTgr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgrqjgrr/grrHgr4HgrqTgr43grqTgr4HgrrXgrqTgrrHgr43grpXgrr7grqkg4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4K614K6/4K6w4K6/4K614K6+4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgrprgr4HgrrDgr4HgrpXgr43grpXgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgrobgrrLgr43grqrgrq7gr40g4K6G4K6w4K+N4K6f4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCukuCusuCuv+Cur+Cus+CuteCvgSDgrrjgr43grrLgr4jgrp/grrDgr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCuruCvgOCun+Cuv+Cur+CuviDgro7grqTgr4HgrrXgr4Hgrq7gr40g4K6k4K+H4K6w4K+N4K6o4K+N4K6k4K+G4K6f4K+B4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K614K6/4K6y4K+N4K6y4K+IIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgrqTgrpXgrrXgrrLgr40g4K6O4K6k4K+B4K614K+B4K6u4K6/4K6y4K+N4K6y4K+IIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgrqTgrr/grrDgr4jgrq/gr4gg4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6V4K6/4K6x4K+A4K6w4K+N4K6V4K6z4K+NIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDMxMmUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCwuOCwv+CwuOCxjeCwn+CwruCxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LC/IOCwrOCwn+CwqOCxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgsKbgsYDgsKjgsL/gsJXgsL8g4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwguCwoeCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCwqOCxgSDgsJXgsKjgsYHgsJfgsYrgsILgsJ/gsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCwquCxjeCwsOCwuOCwvuCwsOCwvuCwqOCxjeCwqOCwvyDgsIbgsKrgsL/gsLXgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCwruCxguCwuOCwv+CwteCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCwquCxjeCwsuCxhyDgsJrgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCwquCwvuCwnOCxjSDgsJrgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsIbgsKrgsL/gsLXgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsLXgsL/gsLjgsY3gsKTgsLDgsL/gsILgsKrgsJzgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCwleCxgeCwpuCwv+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCwhuCwsuCxjeCwrOCwruCxjSDgsIbgsLDgsY3gsJ/gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LC14LC+4LCy4LGN4LCv4LGC4LCu4LGNIOCwuOCxjeCwsuCwr+Cwv+CwoeCwsOCxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LCu4LGA4LCh4LC/4LCv4LC+IOCwj+CwpuCxgCDgsI7gsILgsJrgsYHgsJXgsYvgsKzgsKHgsLLgsYfgsKbgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCwuOCwruCwvuCwmuCwvuCwsOCwgiDgsIXgsILgsKbgsYHgsKzgsL7gsJ/gsYHgsLLgsYsg4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsLjgsY3gsJXgsY3gsLDgsYDgsKjgsY3igIzgsKjgsYEg4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhOGFlNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLguKPguLDguJrguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Lit4Li44Lib4LiB4Lij4LiT4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4geC4s+C4peC4seC4h+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguYDguIrguLfguYjguK3guKHguJXguYjguK3guYHguKXguYnguKciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LmB4LiE4Liq4LiV4LmM4LmE4Lib4Lii4Lix4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LiB4Liz4Lil4Lix4LiH4LiE4LmJ4LiZ4Lir4Liy4Lit4Li44Lib4LiB4Lij4LiT4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC4q+C4ouC4uOC4lOC5geC4hOC4quC4leC5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lib4Li04LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LmA4Lil4LmI4LiZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguKvguKLguLjguJTguIrguLHguYjguKfguITguKPguLLguKciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguKvguKLguLjguJQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguILguKLguLLguKIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC4ouC4uOC4miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC4m+C4geC4reC4seC4peC4muC4seC5ieC4oSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLguYHguJbguJrguYDguKXguLfguYjguK3guJnguJvguKPguLHguJrguKPguLDguJTguLHguJrguYDguKrguLXguKLguIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC5hOC4oeC5iOC5hOC4lOC5ieC5gOC4peC4t+C4reC4geC4quC4t+C5iOC4reC5hOC4p+C5iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LmE4Lih4LmI4Lih4Li14LiC4LmJ4Lit4Lih4Li54LilIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguIHguLPguKXguLHguIfguYHguITguKrguJXguYzguKvguJnguYnguLLguIjguK0iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmUzZDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik1nYSBEZXZpY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXR0b24gbmEgSS1jYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0dG9uIG5hIEktY2FzdC4gTmFkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXR0b24gbmEgSS1jYXN0LiBLdW1va29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWtha29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJLWNhc3Qgc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOYWdoYWhhbmFwIG5nIG1nYSBkZXZpY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iSWRpc2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJaGludG8gYW5nIHBhZy1jYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJJc2FyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkktcGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSS1wYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkloaW50byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbGF3YWtpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iSS1jb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTbGlkZXIgbmcgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJXYWxhbmcgcGluaWxpbmcgbWVkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IldhbGFuZyBhdmFpbGFibGUgbmEgaW1wb3JtYXN5b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IktpbmEtY2FzdCBhbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY2MzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJDaWhhemxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IllhecSxbmxhIGTDvMSfbWVzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbnTEsSBrZXNpbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW7EsXlvciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW5kxLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4ixZ51cmF5YSB5YXnEsW5sYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBidWx1bnV5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsXnEsSBrZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW7EsSBkdXJkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkthcGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmFrbGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJEYXJhbHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGLDvG0ga2FwYcSfxLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2VzIGTDvHpleWkga2F5ZMSxcm1hIMOndWJ1xJ91Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWR5YSBzZcOnaWxtZWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCaWxnaSB5b2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbmxhbsSxeW9yIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2QzNjVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDQuNGB0YLRgNC+0ZciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCS0ZbQtOKAmdGU0LTQvdCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L3RjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotGA0LDQvdGB0LvRjtCy0LDRgtC4INC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDQuNGB0YLRgNC+0ZfQsiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQktGW0LTQutC70Y7Rh9C40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCf0YDQuNC/0LjQvdC40YLQuCDRgtGA0LDQvdGB0LvRj9GG0ZbRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktGW0LTRgtCy0L7RgNC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40LfRg9C/0LjQvdC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCf0YDQuNC/0LjQvdC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0L7Qt9Cz0L7RgNC90YPRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0L7RgNC90YPRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC60LvQsNC00LjQvdC60LAg0LDQu9GM0LHQvtC80YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0J/QvtCy0LfRg9C90L7QuiDQs9GD0YfQvdC+0YHRgtGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQnNC10LTRltCwLdGE0LDQudC7INC90LUg0LLQuNCx0YDQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LXQvNCw0ZQg0LTQsNC90LjRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0KLRgNCw0L3RgdC70Y/RhtGW0Y8g0LXQutGA0LDQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJjNTk4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz2LPZudmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itii2YTYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINi624zYsSDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2YXZhtiz2YTaqSDbgdmIINix24HYpyDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LMg2YXbjNq6INqp2KfYs9m5INqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KLZhNin2Kog2KrZhNin2LQg24HZiCDYsduB25Ig24HbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iti624zYsSDZhdmG2LPZhNqpINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2qnYp9iz2bkg2qnYsdmG2Kcg2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLahtmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItmF2YjZgtmI2YEg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYsdmI2qnbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2b7avtuM2YTYp9im24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2LPaqduM2pHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2KfZhNio2YUg2KLYsdm5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmI2KfZhNuM2YjZhSDYs9mE2KfYptuM2ojYsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2qnZiNim24wg2YXbjNqI24zYpyDZhdmG2KrYrtioINmG24HbjNq6INuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itqp2YjYptuMINmF2LnZhNmI2YXYp9iqINiv2LPYqtuM2KfYqCDZhtuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2LPaqdix24zZhiDaqdin2LPZuSDbgdmIINix24HbjCDbgduSIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGEwODE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlRpemltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlF1cmlsbWFsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVemlsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFubW9xZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJRdXlpZGFnaWdhIHRyYW5zbGF0c2l5YSBxaWxpc2g6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUXVyaWxtYWxhcm5pIHRvcGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJVbGFuaXNobmkgdXppc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJUcmFuc2xhdHNpeWFuaSB0b+KAmHh0YXRpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IllvcGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkJvc2hsYXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJUb+KAmHh0YXRpYiB0dXJpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJUb+KAmHh0YXRpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJZb3lpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IllpZ+KAmGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYm9tIG11cW92YXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlRvdnVzaCBiYWxhbmRsaWdpIHNsYXlkZXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNdWx0aW1lZGlhIHRhbmxhbWFnYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkhlY2ggcWFuZGF5IG1h4oCZbHVtb3QgeW/igJhxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3Jhbm5pIHRyYW5zbGF0c2l5YSBxaWxpc2giPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOThjY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSOG7hyB0aOG7kW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ik7DunQgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJOw7p0IHRydXnhu4FuLiDEkMOjIG5n4bqvdCBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iTsO6dCB0cnV54buBbi4gxJBhbmcga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iTsO6dCB0cnV54buBbi4gxJDDoyBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcnV54buBbiB04bubaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IsSQYW5nIHTDrG0gdGhp4bq/dCBi4buLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik5n4bqvdCBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkThu6tuZyB0cnV54buBbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4ixJDDs25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGjDoXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlThuqFtIGThu6tuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkThu6tuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik3hu58gcuG7mW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaHUgZ+G7jW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhuqJuaCBiw6xhIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlRoYW5oIHRyxrDhu6N0IMOibSBsxrDhu6NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2jDtG5nIGPDsyBwaMawxqFuZyB0aeG7h24gbsOgbyDEkcaw4bujYyBjaOG7jW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iktow7RuZyBjw7MgdGjDtG5nIHRpbiBuw6BvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLEkGFuZyB0cnV54buBbiBtw6BuIGjDrG5oIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjJkMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e7nyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLorr7lpIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXlsITmjInpkq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXlsITmjInpkq7jgILlt7Lmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleWwhOaMiemSruOAguato+WcqOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXlsITmjInpkq7jgILlt7Lov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5bCE5YiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5p+l5om+6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuaWreW8gOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleWwhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i5YWz6ZetIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmoLlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXlvIAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtui1tyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuS4k+i+keWwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5HlnZciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumAieaLqeS7u+S9leWqkuS9kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKh5pyJ5Lu75L2V55u45YWz5L+h5oGvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXlsITlsY/luZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZTVjMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIleOAguW3suino+mZpOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV44CC5q2j5Zyo6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIleOAguW3sumAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7oh7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5bCa5pyq6YG45pOH5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInoqbPntLDos4fmlpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2FmZGUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV77yb5bey5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXvvJvpgKPnt5rkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV77yb5bey6YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgbjlj5bku7vkvZXlqpLpq5QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaykuacieWPr+eUqOeahOizh+ioiiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA3YzQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IklzaXN0aW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFtYWRpdmF5aXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSW5raW5vYmhvIHllLUNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3VucWFueXVsaXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V5YXhodW55d2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eGh1bnlpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2FrYXphIGt1LSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ikl0aG9sYSBhbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOcWFtdWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTWlzYSB1a3VzYWthemEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlZhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJEbGFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTWlzYSBpc2lraGFzaGFuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik1pc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJOd2ViYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iR29xYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlVidWNpa28gYmUtYWxiaGFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJJc2lsYXlpZGEgc2V2b2x1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF5aWtobyBpbWlkaXlhIGVraGV0aGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQWx1a2hvIHVsd2F6aSBvbHV0aG9sYWthbGF5byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iSXNpa3Jpbmkgc29rdXNha2F6YSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODczMjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJzcGVlZF9tdWx0aXBsaWVkX2J5XzEwMCI+Ci0gICAgICAgIDxpdGVtPjI1PC9pdGVtPgotICAgICAgICA8aXRlbT41MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NzU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEwMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTI1PC9pdGVtPgotICAgICAgICA8aXRlbT4xNTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjIwMDwvaXRlbT4KLSAgICA8L2ludGVnZXItYXJyYXk+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzI4NWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNZWRpYVJvdXRlQnV0dG9uIj4KLSAgICAgICAgPCEtLSBUaGlzIGRyYXdhYmxlIGlzIGEgc3RhdGUgbGlzdCB3aGVyZSB0aGUgImNoZWNrZWQiIHN0YXRlCi0gICAgICAgICAgICAgaW5kaWNhdGVzIGFjdGl2ZSBtZWRpYSByb3V0aW5nLiAgQ2hlY2thYmxlIGluZGljYXRlcyBjb25uZWN0aW5nCi0gICAgICAgICAgICAgYW5kIG5vbi1jaGVja2VkIC8gbm9uLWNoZWNrYWJsZSBpbmRpY2F0ZXMKLSAgICAgICAgICAgICB0aGF0IG1lZGlhIGlzIHBsYXlpbmcgdG8gdGhlIGxvY2FsIGRldmljZSBvbmx5LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0iZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIDwhLS0gVGludCB0byBhcHBseSB0byB0aGUgbWVkaWEgcm91dGUgYnV0dG9uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uVGludCIgZm9ybWF0PSJjb2xvciIgLz4KLQotICAgICAgICA8YXR0ciBuYW1lPSJhbmRyb2lkOm1pbldpZHRoIiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJhbmRyb2lkOm1pbkhlaWdodCIgLz4KLSAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgotCi0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUaGVtZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JjMjk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGNvbG9yIG5hbWU9ImdyYXkiPiM4MDgwODA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZSI+I2ZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9IndoaXRlX29wYWNpdHlfNzAiPiNCM2ZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJsYWNrX29wYWNpdHlfNzAiPiNCMzAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCI+IzUwMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X2VuZCI+IzAwMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIj4jNDAyMDIwMjA8L2NvbG9yPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2IwMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIERpYWxvZyBzaXplIC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjMyMGRwPC9kaW1lbj4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjMyMGRwPC9kaW1lbj4KLQotICAgIDwhLS0gTWVkaWFSb3V0ZUNvbnRyb2xsZXIncyB2b2x1bWUgZ3JvdXAgbGlzdCAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIE1heGltdW0gaGVpZ2h0IG9mIHZvbHVtZSBncm91cCBsaXN0LiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0Ij4yODhkcDwvZGltZW4+Ci0gICAgPCEtLSBIZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGl0ZW0uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0Ij42OGRwPC9kaW1lbj4KLSAgICA8IS0tIFNpemUgb2YgYW4gaXRlbSdzIGljb24uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIj4xNmRwPC9kaW1lbj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZXhwYW5kL2NvbGxhcHNlIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBpbiBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgotICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIG91dCBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMiPjIwMDwvaW50ZWdlcj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIj4xNTBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0Ij4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiPjIwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4xOGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSI+MTJzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTBzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc193aWR0aCI+MjI1ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0Ij41NGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSI+MzBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MjdkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSI+MTZzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xM3NwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9zZXR0aW5nc19vZmZzZXQiPjhkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyI+NGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9wYXVzZV9pY29uX3NpemUiPjM2ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfaWNvbl9zaXplIj4yOGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX21pbmltYWxfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9pY29uX21hcmdpbiI+MTBkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiPjIzMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIj4xNzZkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiPjJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPjEyZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2J1ZmZlcl92aWV3X2hlaWdodCI+NWRwPC9kaW1lbj4KLSAgICA8IS0tIFRPRE86IGFkanVzdCBib3R0b20gYmFyIHZpZXcgLS0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTdhM2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSBkZWZhdWx0IHN5c3RlbSByb3V0ZSBwcmlvciB0byBKZWxseWJlYW4uIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIj5TeXN0ZW08L3N0cmluZz4KLQotICAgIDwhLS0gTmFtZSBmb3IgdGhlIHVzZXIgcm91dGUgY2F0ZWdvcnkgY3JlYXRlZCB3aGVuIHB1Ymxpc2hpbmcgcm91dGVzIHRvIHRoZSBzeXN0ZW0gaW4gSmVsbHliZWFuIGFuZCBhYm92ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIj5EZXZpY2VzPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFN0cmluZyB0byBiZSBzaG93biBhcyBhIHRvb2x0aXAgb2YgTWVkaWFSb3V0ZUJ1dHRvbgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIj5DYXN0IGJ1dHRvbjwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gbm8gcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGlsZSBjb25uZWN0aW5nIHRvIGEgcmVtb3RlIGRldmljZS4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciPkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBhIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIG9mIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSI+Q2FzdCB0bzwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBkZXZpY2VzIGhhdmUgYmVlbiBmb3VuZC4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciPkZpbmRpbmcgZGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBCdXR0b24gdG8gZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuICBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiPkRpc2Nvbm5lY3Q8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIHN0b3AgcGxheWJhY2sgYW5kIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyI+U3RvcCBjYXN0aW5nPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZGlhbG9nIGNsb3NlIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIj5DbG9zZTwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IG1lZGlhIHBsYXkgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSI+UGxheTwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IG1lZGlhIHBhdXNlIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIj5QYXVzZTwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IG1lZGlhIHN0b3AgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCI+U3RvcDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGdyb3VwIGV4cGFuZCBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBzaG93cyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiPkV4cGFuZDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGdyb3VwIGNvbGxhcHNlIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIGhpZGVzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIj5Db2xsYXBzZTwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGFsYnVtIGFydCBidXR0b24uIENsaWNraW5nIG9uIHRoZSBhbGJ1bSBhcnQgdGFrZXMgdXNlciB0byBhIHByZWRlZmluZWQgYWN0aXZpdHkgcGVyIG1lZGlhIGFwcC4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiPkFsYnVtIGFydDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IHZvbHVtZSBzbGlkZXIuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIj5Wb2x1bWUgc2xpZGVyPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIG1lZGlhIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgcGxheWJhY2suIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiPk5vIG1lZGlhIHNlbGVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIHRpdGxlL2Rlc2NyaXB0aW9uIGhhdmUgYmVlbiBmb3VuZCBmb3IgYSBnaXZlbiBzb25nL3ZpZGVvLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIj5ObyBpbmZvIGF2YWlsYWJsZTwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iPkNhc3Rpbmcgc2NyZWVuPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGVycm9yIGFsZXJ0IHdoZW4gYSB2aWRlbyBjb250YWluZXIgaXMgbm90IHZhbGlkIGZvciBwcm9ncmVzc2l2ZSBkb3dubG9hZC9wbGF5YmFjay4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfaW52YWxpZF9wcm9ncmVzc2l2ZV9wbGF5YmFjayI+VGhpcyB2aWRlbyBpc25cJ3QgdmFsaWQgZm9yIHN0cmVhbWluZyB0byB0aGlzIGRldmljZS48L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGVycm9yIGFsZXJ0IHdoZW4gYSB2aWRlbyBjYW5ub3QgYmUgcGxheWVkLiBJdCBjYW4gYmUgdXNlZCBieSBhbnkgYXBwLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF91bmtub3duIj5DYW5cJ3QgcGxheSB0aGlzIHZpZGVvLjwvc3RyaW5nPgotICAgIDwhLS0gQnV0dG9uIHRvIGNsb3NlIGVycm9yIGFsZXJ0IHdoZW4gYSB2aWRlbyBjYW5ub3QgYmUgcGxheWVkLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfYnV0dG9uIj5PSzwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHNraXAgd2FpdCB0aW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lIj4KLSAgICAgICAgWW91IGNhbiBza2lwIEFkIGluIDx4bGlmZjpnIGlkPSJ3YWl0X3RpbWUiIGV4YW1wbGU9IjUiPiUxJGQ8L3hsaWZmOmc+cwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCB0b3RhbCByZW1haW5pbmcgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9yZW1haW5pbmdfdGltZSI+Ci0gICAgICAgIEFkIMK3IDx4bGlmZjpnIGlkPSJyZW1haW5pbmdfdGltZSIgZXhhbXBsZT0iMToxNSI+JTEkczwveGxpZmY6Zz4gcmVtYWluaW5nCi0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBjYW4gcHJlc3MgdGhlIGJ1dHRvbiB0byBnbyB0byBhbiBleHRlcm5hbCB3ZWJzaXRlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3RleHQiPlZpc2l0IEFkdmVydGlzZXI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RleHQiPkNsb3NlZCBjYXB0aW9uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCI+T2ZmPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0Ij5BdWRpbyB0cmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0Ij5Ob25lPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X3RleHQiPlZpZGVvIHF1YWxpdHk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfYXV0b190ZXh0Ij5BdXRvPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9oZWxwX3RleHQiPkhlbHAgJmFtcDsgZmVlZGJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQiPlBsYXliYWNrIHNwZWVkPC9zdHJpbmc+Ci0gICAgPHN0cmluZy1hcnJheSBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZHMiPgotICAgICAgICA8aXRlbT4wLjI1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MC41eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MC43NXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPk5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MS4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjJ4PC9pdGVtPgotICAgIDwvc3RyaW5nLWFycmF5PgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBmb3IgZGlzcGxheWluZyB0aW1lLiBVc2VkIHRvIGNhbGN1bGF0ZSB3aGljaCBzaXplIGxheW91dCB0byB1c2UuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlciI+MDA6MDA6MDA8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBzdWJ0aXRsZSB0cmFjayBudW1iZXIuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQiPgotICAgICAgICBUcmFjayA8eGxpZmY6ZyBpZD0idHJhY2tfbnVtYmVyIiBleGFtcGxlPSIxIj4lMSRzPC94bGlmZjpnPgotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhdWRpbyB0cmFjayBudW1iZXIuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbnVtYmVyX3RleHQiPgotICAgICAgICBUcmFjayA8eGxpZmY6ZyBpZD0iYXVkaW9fbnVtYmVyIiBleGFtcGxlPSIxIj4lMSRzPC94bGlmZjpnPgotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyB1bmtub3duIHNvbmcgdGl0bGUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiPlNvbmcgdGl0bGUgdW5rbm93bjwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyB1bmtub3duIGFydGlzdCBuYW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCI+QXJ0aXN0IHVua25vd248L3N0cmluZz4KLQotICAgIDwhLS1Db250ZW50IERlc2NyaXB0aW9ucyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfYmFja19idXR0b25fZGVzYyI+QmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjIj5TZWUgbW9yZSBidXR0b25zPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X3JpZ2h0X2J1dHRvbl9kZXNjIj5CYWNrIHRvIHByZXZpb3VzIGJ1dHRvbiBsaXN0PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3NlZWtfYmFyX2Rlc2MiPlBsYXliYWNrIHByb2dyZXNzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3NldHRpbmdzX2J1dHRvbl9kZXNjIj5TZXR0aW5nczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml92aWRlb19xdWFsaXR5X2J1dHRvbl9kZXNjIj5WaWRlbyBRdWFsaXR5IFNlbGVjdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vbiI+U3VidGl0bGUgaXMgb24uIENsaWNrIHRvIGhpZGUgaXQuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29mZiI+U3VidGl0bGUgaXMgb2ZmLiBDbGljayB0byBzaG93IGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MiPlJlcGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wbGF5X2J1dHRvbl9kZXNjIj5QbGF5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3BhdXNlX2J1dHRvbl9kZXNjIj5QYXVzZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wcmV2aW91c19idXR0b25fZGVzYyI+UHJldmlvdXMgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbmV4dF9idXR0b25fZGVzYyI+TmV4dCBtZWRpYTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2MiPlJld2luZCBieSAxMCBzZWNvbmRzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Zmd2RfYnV0dG9uX2Rlc2MiPkdvIGZvcndhcmQgYnkgMzAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2MiPkxhdW5jaCBMaW5rPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211dGVkX2J1dHRvbl9kZXNjIj5NdXRlZC4gQ2xpY2sgdG8gdW5tdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MiPkNsaWNrIHRvIE11dGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2MiPkZ1bGwgc2NyZWVuPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5YThlZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX25leHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX25leHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9Ik1pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij40NmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NWRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjVkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjM2ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MzZkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uLkJhY2siPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Fycm93X2JhY2s8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfYmFja19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uLkxhdW5jaCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfbGF1bmNoPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2xhdW5jaF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij40ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5DdXJyZW50Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5JbnRlcnB1bmN0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPsK3PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuRW5kIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl9ob3Jpem9udGFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uQ0MiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3N1YnRpdGxlX29mZjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9jY19pc19vZmY8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZnVsbHNjcmVlbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX292ZXJmbG93X3JpZ2h0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93TGVmdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NldHRpbmdzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3NldHRpbmdzX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk11dGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3VubXV0ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSI+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eTwvaXRlbT4KLSAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4wZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC42PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij50b3B8Y2VudGVyPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4wZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjM1PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxyaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC42NTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdCI+MjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8bGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTY5MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b24iCi0gICAgICAgICAgICBwYXJlbnQ9IldpZGdldC5BcHBDb21wYXQuQWN0aW9uQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSI+QGRyYXdhYmxlL21yX2J1dHRvbl9kYXJrPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lk1lZGlhUm91dGVyLkxpZ2h0Lk1lZGlhUm91dGVCdXR0b24iCi0gICAgICAgICAgICBwYXJlbnQ9IldpZGdldC5BcHBDb21wYXQuTGlnaHQuQWN0aW9uQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSI+QGRyYXdhYmxlL21yX2J1dHRvbl9saWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5UaXRsZSIgLz4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuU3ViaGVhZCIgLz4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5Cb2R5MSIgLz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwZThjNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHJlc291cmNlcz4KLSAgICA8IS0tamF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImNjIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iZmZ3ZCIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9Im1lZGlhY29udHJvbGxlcl9wcm9ncmVzcyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9Im5leHQiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwYXVzZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InByZXYiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJyZXciIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZV9jdXJyZW50IiAvLS0+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhNzU0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3R2X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBudWxsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHRDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHQiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbC5MaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLkxpZ2h0Lk1lZGlhUm91dGVCdXR0b248L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2dyZXk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3R2X2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0PC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBudWxsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHQuRGFya0NvbnRyb2xQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0KLSAgICA8L3N0eWxlPgotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbC5MaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiMWExZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVXNhZ2UgJy4gcnVuY3RzLnNoJwotCi1mdW5jdGlvbiBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UoKSB7Ci0gIGVjaG8gJ3J1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cyBbb3B0aW9uXTogQnVpbGQsIGZsYXNoIGRldmljZSwnCi0gIGVjaG8gJyAgICAgICAgICAgICAgYW5kIHJ1biBzdWJzZXQgb2YgQ3RzTWVkaWFUZXN0Q2FzZXMgdGhhdCBNZWRpYUNvbXBvbmVudHMgY292ZXJzLicKLSAgZWNobyAnICAgICAgICAgICpXYXJuaW5nKiBUaGlzIGJ5cGFzc2VzIENUUyBzZXR1cCAoZS5nLiBkb3dubG9hZCBtZWRpYSBjb250ZW50cyBmcm9tIHNlcnZlciknCi0gIGVjaG8gJyAgICAgICAgICBGb3IgcnVubmluZyBDVFMgaW4gb2ZmaWNpYWwgd2F5LCB1c2UgYXRlc3Qgb3IgY3RzLXRyYWRlZmVkICcKLSAgZWNobyAnICAgICAtaHwtLWhlbHA6IFRoaXMgaGVscCcKLSAgZWNobyAnICAgICAtLXNraXA6IFNraXAgYnVpbGQgYW5kIGZsYXNoLiBKdXN0IHJlcnVuLXRlc3RzJwotICBlY2hvICcgICAgIC0tbWluOiBPbmx5IHJlYnVpbGQgdGVzdHMgYW5kIHVwZGF0YWJsZSBsaWJyYXJ5LicKLSAgZWNobyAnICAgICAtLXRlc3Q6IE9ubHkgcmVidWlsZCB0ZXN0cycKLSAgZWNobyAnICAgICAtcyBbZGV2aWNlX2lkXTogU3BlY2lmeSBhIGRldmljZSBuYW1lIHRvIHJ1biB0ZXN0IGFnYWluc3QuJwotICBlY2hvICcgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGRlZmluZSAke0FEQkhPU1R9IGluc3RlYWQuJwotICBlY2hvICcgICAgIC1yIFtjb3VudF06IFJlcGVhdCB0ZXN0cyBmb3IgZ2l2ZW4gY291bnQuIEl0IHdpbGwgc3RvcCB3aGVuIGZhaWxzLicKLSAgZWNobyAnICAgICAtLWlnbm9yZTogS2VlcCByZXBlYXRpbmcgdGVzdHMgZXZlbiB3aGVuIGl0IGZhaWxzLicKLSAgZWNobyAnICAgICAtdCBbdGVzdF06IE9ubHkgcnVuIHRoZSBzcGVjaWZpYyB0ZXN0LiBDYW4gYmUgZWl0aGVyIGEgY2xhc3Mgb3IgYSBtZXRob2QuJwotfQotCi1mdW5jdGlvbiBydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMoKSB7Ci0gICMgRWRpdCBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgb3RoZXIgdGVzdHMuCi0gICMgTGlzdCB1cCBsaWJzIGFuZCBhcGtzIGluIHRoZSBtZWRpYV9hcGkgbmVlZGVkIGZvciB0ZXN0cywgYW5kIHBsYWNlIHRlc3QgdGFyZ2V0IGF0IHRoZSBsYXN0LgotICBsb2NhbCBURVNUX1BBQ0tBR0VfRElSPSgiZnJhbWV3b3Jrcy9hdi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdCIpCi0gIGxvY2FsIFRFU1RfUEFDS0FHRT0oImFuZHJvaWQubWVkaWEuY3RzIikKLSAgbG9jYWwgQlVJTERfVEFSR0VUUz0oIk1lZGlhQ29tcG9uZW50cyIgIkN0c01lZGlhVGVzdENhc2VzIikKLSAgIyBEb24ndCBpbmNsdWRlIE1lZGlhQ29tcG9uZW50cyAtLSBpZiB3ZSBzaW1wbHkgaW5zdGFsbCBpdCwgc3lzdGVtIHNlcnZlcgotICAjIHdvdWxkbid0IHVzZSB0aGUgaW5zdGFsbGVkIG9uZS4KLSAgbG9jYWwgSU5TVEFMTF9UQVJHRVRTPSgiQ3RzTWVkaWFUZXN0Q2FzZXMiKQotICBsb2NhbCBURVNUX1JVTk5FUj0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKLSAgbG9jYWwgREVQRU5ERU5DSUVTPSgibW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IiAiYW5kcm9pZC1zdXBwb3J0LXRlc3QiICJjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIikKLSAgbG9jYWwgREVGQVVMVF9URVNUX1RBUkdFVD0iIgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFCcm93c2VyMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFDb250cm9sbGVyMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFNZXRhZGF0YTJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbjJfUGVybWlzc2lvblRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uTWFuYWdlcl9NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5TZXNzaW9uVG9rZW4yVGVzdCIKLSAgaWYgW1sgLXogIiR7QU5EUk9JRF9CVUlMRF9UT1B9IiBdXTsgdGhlbgotICAgIGVjaG8gIk5lZWRzIHRvIGx1bmNoIGEgdGFyZ2V0IGZpcnN0IgotICAgIHJldHVybgotICBmaQotCi0gIGxvY2FsIG9sZF9wYXRoPSR7T0xEUFdEfQotICB3aGlsZSB0cnVlOyBkbwotICAgIGxvY2FsIE9QVElPTl9TS0lQPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fTUlOPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fVEVTVD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1JFUEVBVF9DT1VOVD0iMSIKLSAgICBsb2NhbCBPUFRJT05fSUdOT1JFPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fVEVTVF9UQVJHRVQ9IiR7REVGQVVMVF9URVNUX1RBUkdFVH0iCi0gICAgbG9jYWwgYWRiaG9zdF9sb2NhbAotICAgIHdoaWxlICgoICIkIyIgKSk7IGRvCi0gICAgICBjYXNlICIkezF9IiBpbgotICAgICAgICAtaHwtLWhlbHApCi0gICAgICAgICAgX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCi0gICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1za2lwKQotICAgICAgICAgIE9QVElPTl9TS0lQPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tbWluKQotICAgICAgICAgIE9QVElPTl9NSU49InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLS10ZXN0KQotICAgICAgICAgIE9QVElPTl9URVNUPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC1zKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgYWRiaG9zdF9sb2NhbD0kezF9Ci0gICAgICAgICAgOzsKLSAgICAgICAgLXIpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBPUFRJT05fUkVQRUFUX0NPVU5UPSIkezF9IgotICAgICAgICAgIDs7Ci0gICAgICAgIC0taWdub3JlKQotICAgICAgICAgIE9QVElPTl9JR05PUkU9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLXQpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBPUFRJT05fVEVTVF9UQVJHRVQ9IiR7MX0iCi0gICAgICBlc2FjCi0gICAgICBzaGlmdAotICAgIGRvbmUKLQotICAgICMgQnVpbGQgYWRiIGNvbW1hbmQuCi0gICAgbG9jYWwgYWRiCi0gICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCi0gICAgICBhZGJob3N0X2xvY2FsPSR7QURCSE9TVH0KLSAgICBmaQotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgbG9jYWwgZGV2aWNlX2NvdW50PSQoYWRiIGRldmljZXMgfCBzZWQgJy9eW1s6c3BhY2U6XV0qJC9kJyB8IHdjIC1sKQotICAgICAgaWYgW1sgIiR7ZGV2aWNlX2NvdW50fSIgIT0gIjIiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIlRvbyBtYW55IGRldmljZXMuIFNwZWNpZnkgYSBkZXZpY2UuIiAmJiBicmVhawotICAgICAgZmkKLSAgICAgIGFkYj0iYWRiIgotICAgIGVsc2UKLSAgICAgIGFkYj0iYWRiIC1zICR7YWRiaG9zdF9sb2NhbH0iCi0gICAgZmkKLQotICAgIGxvY2FsIHRhcmdldF9kaXI9IiR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7VEVTVF9QQUNLQUdFX0RJUn0iCi0gICAgI2xvY2FsIFRFU1RfUEFDS0FHRT0kKHNlZCAtbiAncy9eLipcYnBhY2thZ2VcYj0iXChbYS16MC05XC5dKlwpIi4qJC9cMS9wJyAke3RhcmdldF9kaXJ9L0FuZHJvaWRNYW5pZmVzdC54bWwpCi0KLSAgICBpZiBbWyAiJHtPUFRJT05fU0tJUH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgaWYgbmVlZGVkLgotICAgICAgbG9jYWwgZGVwZW5kZW5jeQotICAgICAgbG9jYWwgYnVpbGRfZGVwZW5kZW5jeT0iIgotICAgICAgZm9yIGRlcGVuZGVuY3kgaW4gJHtERVBFTkRFTkNJRVNbQF19OyBkbwotICAgICAgICBpZiBbWyAiJHtkZXBlbmRlbmN5fSIgPT0gIm91dC8iKiBdXTsgdGhlbgotICAgICAgICAgIGlmIFtbICEgLWYgJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtkZXBlbmRlbmN5fSBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmIFtbICIkKGZpbmQgJHtPVVR9IC1uYW1lICR7ZGVwZW5kZW5jeX1faW50ZXJtZWRpYXRlcyB8IHdjIC1sKSIgPT0gIjAiIF1dOyB0aGVuCi0gICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7YnVpbGRfZGVwZW5kZW5jeX0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJCdWlsZGluZyBkZXBlbmRlbmNpZXMuIFdpbGwgb25seSBwcmludCBzdGRlcnIuIgotICAgICAgICBtICR7REVQRU5ERU5DSUVTW0BdfSAtaiA+IC9kZXYvbnVsbAotICAgICAgZmkKLQotICAgICAgIyBCdWlsZCB0ZXN0IGFwayBhbmQgcmVxdWlyZWQgYXBrLgotICAgICAgbG9jYWwgYnVpbGRfdGFyZ2V0cwotICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtJTlNUQUxMX1RBUkdFVFNbQF19IgotICAgICAgZWxpZiBbWyAiJHtPUFRJT05fTUlOfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7QlVJTERfVEFSR0VUU1tAXX0iCi0gICAgICBlbHNlCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7QlVJTERfVEFSR0VUU1tAXX0gZHJvaWQiCi0gICAgICBmaQotICAgICAgbSAke2J1aWxkX3RhcmdldHN9IC1qIHx8IGJyZWFrCi0KLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgICMgRmxhc2ggb25seSB3aGVuIG5lZWRlZAotICAgICAgICBsb2NhbCBkZXZpY2VfYnVpbGRfdHlwZT0iJCgke2FkYn0gc2hlbGwgZ2V0cHJvcCByby5idWlsZC50eXBlKSIKLSAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX2J1aWxkX3R5cGV9IiA9PSAidXNlciIgXV07IHRoZW4KLSAgICAgICAgICAjIFVzZXIgYnVpbGQuIENhbm5vdCBhZGIgc3luYwotICAgICAgICAgICR7YWRifSByZWJvb3QgYm9vdGxvYWRlcgotICAgICAgICAgIGZhc3Rib290IGZsYXNoYWxsCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAke2FkYn0gcm9vdAotICAgICAgICAgIGxvY2FsIGRldmljZV92ZXJpdHlfbW9kZT0iJCgke2FkYn0gc2hlbGwgZ2V0cHJvcCByby5ib290LnZlcml0eW1vZGUpIgotICAgICAgICAgIGlmIFtbICIke2RldmljZV92ZXJpdHlfbW9kZX0iICE9ICJkaXNhYmxlZCIgXV07IHRoZW4KLSAgICAgICAgICAgICR7YWRifSBkaXNhYmxlLXZlcml0eQotICAgICAgICAgICAgJHthZGJ9IHJlYm9vdAotICAgICAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBmaQotICAgICAgICAgICR7YWRifSByZW1vdW50Ci0gICAgICAgICAgJHthZGJ9IHNoZWxsIHN0b3AKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc2V0cHJvcCBsb2cudGFnLk1lZGlhU2Vzc2lvblNlcnZpY2UgREVCVUcKLSAgICAgICAgICAke2FkYn0gc3luYwotICAgICAgICAgICR7YWRifSBzaGVsbCBzdGFydAotICAgICAgICBmaQotICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCi0gICAgICAgICMgRW5zdXJlIHBhY2thZ2UgbWFuYWdlciBpcyBsb2FkZWQuCi0gICAgICAgICMgVE9ETyhqYWV3YW4pOiBGaW5kIGJldHRlciB3YXkgdG8gd2FpdAotICAgICAgICBzbGVlcCAxNQotICAgICAgZmkKLQotICAgICAgIyBJbnN0YWxsIGFwa3MKLSAgICAgIGxvY2FsIGluc3RhbGxfZmFpbGVkPSJmYWxzZSIKLSAgICAgIGZvciB0YXJnZXQgaW4gJHtJTlNUQUxMX1RBUkdFVFNbQF19OyBkbwotICAgICAgICBsb2NhbCBhcGtfcGF0aD0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrKQotICAgICAgICBsb2NhbCBhcGtfbnVtPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGsgfCB3YyAtbCkKLSAgICAgICAgaWYgW1sgIiR7YXBrX251bX0iICE9ICIxIiBdXTsgdGhlbgotICAgICAgICAgIGVjaG8gIkNhbm5vdCBsb2NhdGUgYSAke3RhcmdldH0uYXBrLiBGb3VuZCAke2Fwa19udW19IGFwa3MiICYmIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICAgIGVjaG8gIkluc3RhbGxpbmcgJHt0YXJnZXR9LmFway4gcGF0aD0ke2Fwa19wYXRofSIKLSAgICAgICAgJHthZGJ9IGluc3RhbGwgLXIgJHthcGtfcGF0aH0KLSAgICAgICAgaWYgW1sgIiR7P30iICE9ICIwIiBdXTsgdGhlbgotICAgICAgICAgIGluc3RhbGxfZmFpbGVkPSJ0cnVlIgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBpZiBbWyAiJHtpbnN0YWxsX2ZhaWxlZH0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJGYWlsZWQgdG8gaW5zdGFsbC4gVGVzdCB3b3VsZG4ndCBydW4uIgotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotCi0gICAgbG9jYWwgdGVzdF90YXJnZXQ9IiIKLSAgICBpZiBbWyAtbiAiJHtPUFRJT05fVEVTVF9UQVJHRVR9IiBdXTsgdGhlbgotICAgICAgdGVzdF90YXJnZXQ9Ii1lIGNsYXNzICR7T1BUSU9OX1RFU1RfVEFSR0VUfSIKLSAgICBmaQotCi0gICAgbG9jYWwgaQotICAgIGxvY2FsIHRtcGZpbGU9JCh0ZW1wZmlsZSkKLSAgICBmb3IgKChpPTE7IGkgPD0gJHtPUFRJT05fUkVQRUFUX0NPVU5UfTsgaSsrKSk7IGRvCi0gICAgICBlY2hvICJSdW4gdGVzdCAke2l9LyR7T1BUSU9OX1JFUEVBVF9DT1VOVH0iCi0gICAgICAke2FkYn0gc2hlbGwgYW0gaW5zdHJ1bWVudCAke3Rlc3RfdGFyZ2V0fSAtdyAke1RFU1RfUEFDS0FHRX0vJHtURVNUX1JVTk5FUn0gPiYgJHt0bXBmaWxlfQotICAgICAgY2F0ICR7dG1wZmlsZX0KLSAgICAgIGlmIFtbICIke09QVElPTl9JR05PUkV9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgaWYgW1sgLW4gIiQoZ3JlcCAke3RtcGZpbGV9IC1lICdGQUlMVVJFXHxjcmFzaGVkJykiIF1dOyB0aGVuCi0gICAgICAgICAgIyBhbSBpbnN0cnVtZW50IGRvZXNuJ3QgcmV0dXJuIGVycm9yIGNvZGUgc28gbmVlZCB0byBncmVwIHJlc3VsdCBtZXNzYWdlIGluc3RlYWQKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgcm0gJHt0bXBmaWxlfQotICAgIGJyZWFrCi0gIGRvbmUKLX0KLQotZWNobyAiRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYWRkZWQgdG8geW91ciBlbnZpcm9ubWVudDoiCi1fcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4OGI3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhU2Vzc2lvbjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFTZXNzaW9uMiB0byBNZWRpYUNvbnRyb2xsZXIyLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0vLyBUT0RPKGphZXdhbik6IChQb3N0IFApIEhhbmRsZSB3aGVuIHRoZSBwbGF5bGlzdCBiZWNvbWVzIHRvbyBodWdlLgotLy8gICAgICAgICAgICAgICBOb3RlIHRoYXQgUGFyY2VsbGVkU2xpY2VMaXN0IGlzbid0IGEgZ29vZCBpZGVhIGZvciB0aGUgcHVycG9zZS4gKHNlZTogYi8zNzQ5MzY3NykKLW9uZXdheSBpbnRlcmZhY2UgSU1lZGlhQ29udHJvbGxlcjIgewotICAgIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoaW50IHN0YXRlKTsKLSAgICB2b2lkIG9uUG9zaXRpb25DaGFuZ2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25Ncyk7Ci0gICAgdm9pZCBvblBsYXliYWNrU3BlZWRDaGFuZ2VkKGZsb2F0IHNwZWVkKTsKLSAgICB2b2lkIG9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgb25QbGF5YmFja0luZm9DaGFuZ2VkKGluIEJ1bmRsZSBwbGF5YmFja0luZm8pOwotICAgIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChpbnQgcmVwZWF0TW9kZSk7Ci0gICAgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChpbnQgc2h1ZmZsZU1vZGUpOwotICAgIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBpbiBCdW5kbGUgZXh0cmFzKTsKLQotICAgIHZvaWQgb25Db25uZWN0ZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwgaW4gQnVuZGxlIGNvbW1hbmRHcm91cCwKLSAgICAgICAgICAgIGludCBwbGF5ZXJTdGF0ZSwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywgaW4gQnVuZGxlIHBsYXliYWNrSW5mbywgaW50IHJlcGVhdE1vZGUsIGludCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgIGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpOwotICAgIHZvaWQgb25EaXNjb25uZWN0ZWQoKTsKLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBjb21tYW5kQnV0dG9ubGlzdCk7Ci0gICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoaW4gQnVuZGxlIGNvbW1hbmRzKTsKLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGluIEJ1bmRsZSBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEJyb3dzZXIgc2VwY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBvbkdldExpYnJhcnlSb290RG9uZShpbiBCdW5kbGUgcm9vdEhpbnRzLCBTdHJpbmcgcm9vdE1lZGlhSWQsIGluIEJ1bmRsZSByb290RXh0cmEpOwotICAgIHZvaWQgb25HZXRJdGVtRG9uZShTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIHJlc3VsdCk7Ci0gICAgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcm9vdE1lZGlhSWQsIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0NDY3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZnJvbSBNZWRpYUNvbnRyb2xsZXIyIHRvIE1lZGlhU2Vzc2lvbjIuCi0gKiA8cD4KLSAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCi0gKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCi0gKi8KLSAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIEhhbmRsZSB3aGVuIHRoZSBwbGF5bGlzdCBiZWNvbWVzIHRvbyBodWdlLgotIC8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYVNlc3Npb24yIHsKLSAgICAvLyBUT0RPKGphZXdhbik6IGFkZCBvbkNvbW1hbmQoKSB0byBzZW5kIHByaXZhdGUgY29tbWFuZAotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBXZSBtYXkgY29uc2lkZXIgdG8gYWRkIGFub3RoZXIgYmluZGVyIGp1c3QgZm9yIHRoZSBjb25uZWN0aW9uCi0gICAgLy8gICAgICAgICAgICAgICBub3QgdG8gZXhwb3NlIG90aGVyIG1ldGhvZHMgdG8gdGhlIGNvbnRyb2xsZXIgd2hvc2UgY29ubmVjdGlvbiB3YXNuJ3QgYWNjZXB0ZWQuCi0gICAgLy8gICAgICAgICAgICAgICBCdXQgdGhpcyB3b3VsZCBiZSBlbm91Z2ggZm9yIG5vdyBiZWNhdXNlIGl0J3MgdGhlIHNhbWUgYXMgZXhpc3RpbmcKLSAgICAvLyAgICAgICAgICAgICAgIE1lZGlhQnJvd3NlciBhbmQgTWVkaWFCcm93c2VyU2VydmljZS4KLSAgICB2b2lkIGNvbm5lY3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpOwotICAgIHZvaWQgcmVsZWFzZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotCi0gICAgdm9pZCBzZXRWb2x1bWVUbyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCB2YWx1ZSwgaW50IGZsYWdzKTsKLSAgICB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncyk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gc2VuZCBjb21tYW5kCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgaW4gQnVuZGxlIGFyZ3MpOwotICAgIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7Ci0KLSAgICB2b2lkIHByZXBhcmVGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgc2V0UmF0aW5nKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByYXRpbmcpOwotCi0gICAgdm9pZCBzZXRQbGF5bGlzdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotICAgIHZvaWQgc2tpcFRvTmV4dEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSk7Ci0gICAgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gbGlicmFyeSBzZXJ2aWNlIHNwZWNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgZ2V0TGlicmFyeVJvb3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgcm9vdEhpbnRzKTsKLSAgICB2b2lkIGdldEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCk7Ci0gICAgdm9pZCBnZXRDaGlsZHJlbihJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIGdldFNlYXJjaFJlc3VsdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgc3Vic2NyaWJlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHVuc3Vic2NyaWJlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkKTsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwOTA5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1lZGlhQnJvd3NlcjJJbXBsIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUJyb3dzZXIyIjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IGNoYW5nZS4KLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgTWVkaWFCcm93c2VyMkltcGwoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBpbnN0YW5jZSwgdG9rZW4sIGV4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgTWVkaWFCcm93c2VyMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIyKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldExpYnJhcnlSb290X2ltcGwoQnVuZGxlIHJvb3RIaW50cykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0TGlicmFyeVJvb3QoZ2V0Q29udHJvbGxlclN0dWIoKSwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZV9pbXBsKFN0cmluZyBwYXJlbnRJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZV9pbXBsKFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51bnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRJdGVtX2ltcGwoU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldEl0ZW0oZ2V0Q29udHJvbGxlclN0dWIoKSwgbWVkaWFJZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbl9pbXBsKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldENoaWxkcmVuKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VhcmNoKGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0X2ltcGwoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldFNlYXJjaFJlc3VsdChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldExpYnJhcnlSb290RG9uZSgKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByb290SGludHMsIGZpbmFsIFN0cmluZyByb290TWVkaWFJZCwgZmluYWwgQnVuZGxlIHJvb3RFeHRyYSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRMaWJyYXJ5Um9vdERvbmUoZ2V0SW5zdGFuY2UoKSwgcm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRJdGVtRG9uZShTdHJpbmcgbWVkaWFJZCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldEl0ZW1Eb25lKGdldEluc3RhbmNlKCksIG1lZGlhSWQsIGl0ZW0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRDaGlsZHJlbkRvbmUoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChnZXRJbnN0YW5jZSgpLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShnZXRJbnN0YW5jZSgpLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoZmluYWwgU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkNoaWxkcmVuQ2hhbmdlZChnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTM2NWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEE7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkk7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5SZXBlYXRNb2RlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlNodWZmbGVNb2RlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlcjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJTdHViIG1Db250cm9sbGVyU3R1YjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIHByaXZhdGUgZmluYWwgSUJpbmRlci5EZWF0aFJlY2lwaWVudCBtRGVhdGhSZWNpcGllbnQ7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVsZWFzZWQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTGlzdDxNZWRpYUl0ZW0yPiBtUGxheWxpc3Q7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbVBsYXlsaXN0TWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQFJlcGVhdE1vZGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBTaHVmZmxlTW9kZSBpbnQgbVNodWZmbGVNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtUGxheWVyU3RhdGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25FdmVudFRpbWVNczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbk1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZsb2F0IG1QbGF5YmFja1NwZWVkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbUJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgbUFsbG93ZWRDb21tYW5kczsKLQotICAgIC8vIEFzc2lnbm1lbnQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgbG9jayBob2xkLCBidXQgc2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgdG8gcHJldmVudAotICAgIC8vIHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICAvLyBQb3N0Zml4IC1CaW5kZXIgaXMgYWRkZWQgdG8gZXhwbGljaXRseSBzaG93IHRoYXQgaXQncyBwb3RlbnRpYWxseSByZW1vdGUgcHJvY2VzcyBjYWxsLgotICAgIC8vIFRlY2huaWNhbGx5IC1JbnRlcmZhY2UgaXMgbW9yZSBjb3JyZWN0LCBidXQgaXQgbWF5IG1pc3JlYWQgdGhhdCBpdCdzIGludGVyZmFjZSAodnMgY2xhc3MpCi0gICAgLy8gc28gbGV0J3Mga2VlcCB0aGlzIHBvc3RmaXggdW50aWwgd2UgZmluZCBiZXR0ZXIgcG9zdGZpeC4KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVxdWlyZSBzZXNzaW9uIGFjdGl2ZW5lc3MgY2hhbmdlZCBsaXN0ZW5lciwgYmVjYXVzZSBjb250cm9sbGVyIGNhbiBiZQotICAgIC8vICAgICAgICAgICAgICAgYXZhaWxhYmxlIHdoZW4gdGhlIHNlc3Npb24ncyBwbGF5ZXIgaXMgbnVsbC4KLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMkltcGwoQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0b2tlbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNvbnRyb2xsZXJTdHViID0gbmV3IE1lZGlhQ29udHJvbGxlcjJTdHViKHRoaXMpOwotICAgICAgICBtVG9rZW4gPSB0b2tlbjsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIG1EZWF0aFJlY2lwaWVudCA9ICgpIC0+IHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICB9OwotCi0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IE1vcmUgc2FuaXR5IGNoZWNrcy4KLSAgICAgICAgaWYgKG1Ub2tlbi5nZXRUeXBlKCkgPT0gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT04pIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24KLSAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2Vzc2lvbiBzZXJ2aWNlCi0gICAgICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgewotICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3lzdGVtIHNlcnZlciAoTWVkaWFTZXNzaW9uU2VydmljZSkgdGhhdCB3YW50cyB0byBtb25pdG9yIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYmluZCBpZiBhYmxlLi4KLSAgICAgICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYmluZGVyIGluIHRoZSBzZXNzaW9uIHRva2VuIGluc3RlYWQgb2YgYmluZCBieSBpdHMgb3duLgotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgaG9sZHMgdGhlIGJpbmRpbmcgdG8gdGhlIHNlcnZpY2UgKmZvcmV2ZXIqIGFuZCBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbmV2ZXIgc3RvcC4KLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gc3lzdGVtIHNlcnZlciB3YW50cyB0byBkaXNwYXRjaCBtZWRpYSBrZXkgZXZlbnRzIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGEgZGVhZCBzZXJ2aWNlLgotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTeXN0ZW0gc2VydmVyIGJpbmRzIHRvIGEgc2Vzc2lvbiBzZXJ2aWNlLiBTaG91bGQgdW5iaW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXNlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXNzaW9uU2VydmljZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1NlcnZpY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXJ2aWNlKCkgewotICAgICAgICAvLyBTZXJ2aWNlLiBOZWVkcyB0byBnZXQgZnJlc2ggYmluZGVyIHdoZW5ldmVyIGNvbm5lY3Rpb24gaXMgbmVlZGVkLgotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pOwotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUobVRva2VuLmdldFBhY2thZ2VOYW1lKCksIGltcGwuZ2V0U2VydmljZU5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlKCkgaW5zdGVhZCBvZiBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkgdG8gc3RhcnQgc2Vzc2lvbiBzZXJ2aWNlIGZvciB0aHJlZQotICAgICAgICAvLyByZWFzb25zLgotICAgICAgICAvLyAxLiBQcmV2ZW50IHNlc3Npb24gc2VydmljZSBvd25lcidzIHN0b3BTZWxmKCkgZnJvbSBkZXN0cm95aW5nIHNlcnZpY2UuCi0gICAgICAgIC8vICAgIFdpdGggdGhlIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSwgc2VydmljZSdzIGNhbGwgb2Ygc3RvcFNlbGYoKSB3aWxsIHRyaWdnZXIgaW1tZWRpYXRlCi0gICAgICAgIC8vICAgIG9uRGVzdHJveSgpIGNhbGxzIG9uIHRoZSBtYWluIHRocmVhZCBldmVuIHdoZW4gb25Db25uZWN0KCkgaXMgcnVubmluZyBpbiBhbm90aGVyCi0gICAgICAgIC8vICAgIHRocmVhZC4KLSAgICAgICAgLy8gMi4gTWluaW1pemUgQVBJcyBmb3IgZGV2ZWxvcGVycyB0byB0YWtlIGNhcmUgYWJvdXQuCi0gICAgICAgIC8vICAgIFdpdGggYmluZFNlcnZpY2UoKSwgZGV2ZWxvcGVycyBvbmx5IG5lZWQgdG8gdGFrZSBjYXJlIGFib3V0IFNlcnZpY2Uub25CaW5kKCkKLSAgICAgICAgLy8gICAgYnV0IFNlcnZpY2Uub25TdGFydENvbW1hbmQoKSBzaG91bGQgYmUgYWxzbyB0YWtlbiBjYXJlIGFib3V0IHdpdGggdGhlCi0gICAgICAgIC8vICAgIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKS4KLSAgICAgICAgLy8gMy4gRnV0dXJlIHN1cHBvcnQgZm9yIFVJLWxlc3MgcGxheWJhY2sKLSAgICAgICAgLy8gICAgSWYgYSBzZXJ2aWNlIHdhbnRzIHRvIGtlZXAgcnVubmluZywgaXQgc2hvdWxkIGJlIGVpdGhlciBmb3JlZ3JvdW5kIHNlcnZpY2Ugb3IKLSAgICAgICAgLy8gICAgYm91bmRlZCBzZXJ2aWNlLiBCdXQgdGhlcmUgaGFkIGJlZW4gcmVxdWVzdCBmb3IgdGhlIGZlYXR1cmUgZm9yIHN5c3RlbSBhcHBzCi0gICAgICAgIC8vICAgIGFuZCB1c2luZyBiaW5kU2VydmljZSgpIHdpbGwgYmUgYmV0dGVyIGZpdCB3aXRoIGl0LgotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgIC8vIFVzZSBiaW5kU2VydmljZUFzVXNlcigpIGZvciBiaW5kaW5nIGZyb20gc3lzdGVtIHNlcnZpY2UgdG8gYXZvaWQgZm9sbG93aW5nIHdhcm5pbmcuCi0gICAgICAgICAgICAvLyBDb250ZXh0SW1wbDogQ2FsbGluZyBhIG1ldGhvZCBpbiB0aGUgc3lzdGVtIHByb2Nlc3Mgd2l0aG91dCBhIHF1YWxpZmllZCB1c2VyCi0gICAgICAgICAgICByZXN1bHQgPSBtQ29udGV4dC5iaW5kU2VydmljZUFzVXNlcihpbnRlbnQsIG1TZXJ2aWNlQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFLAotICAgICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLmdldFVzZXJIYW5kbGVGb3JVaWQobVRva2VuLmdldFVpZCgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsIG1TZXJ2aWNlQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiYmluZCB0byAiICsgbVRva2VuICsgIiBmYWlsZWQiKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYmluZCB0byAiICsgbVRva2VuICsgIiBzdWNjZXNzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2Vzc2lvbihJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXNzaW9uQmluZGVyLmNvbm5lY3QobUNvbnRyb2xsZXJTdHViLCBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byBjYWxsIGNvbm5lY3Rpb24gcmVxdWVzdC4gRnJhbWV3b3JrIHdpbGwgcmV0cnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhdXRvbWF0aWNhbGx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2UgZnJvbSAiICsgbVRva2VuKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgcmUtZW50ZXJhbmNlIGZyb20gdGhlIENvbnRyb2xsZXJDYWxsYmFjay5vbkRpc2Nvbm5lY3RlZCgpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlzUmVsZWFzZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICAgICAgICAgIG1Db250cm9sbGVyU3R1Yi5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hc0JpbmRlcigpLnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVsZWFzZShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBOby1vcC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkRpc2Nvbm5lY3RlZChtSW5zdGFuY2UpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgTWVkaWFDb250cm9sbGVyMlN0dWIgZ2V0Q29udHJvbGxlclN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbGxlclN0dWI7Ci0gICAgfQotCi0gICAgRXhlY3V0b3IgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIH0KLQotICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1BbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGlzbid0IGFsbG93ZWQgdG8uCi0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZENvZGU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1BbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmQ9IiArIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRTZXNzaW9uVG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub2tlbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZF9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgcmV0dXJuIGJpbmRlciAhPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlfaW1wbCgpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGF1c2VfaW1wbCgpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUEFVU0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3BfaW1wbCgpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU1RPUCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUHJldmlvdXNJdGVtKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb05leHRJdGVtKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChjb21tYW5kQ29kZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChtQ29udHJvbGxlclN0dWIsIGNvbW1hbmRDb2RlLCBhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvX2ltcGwoaW50IHZhbHVlLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgLy8gVE9ETyhoZG1vb24pOiBzYW5pdHkgY2hlY2sKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VUX1ZPTFVNRSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0Vm9sdW1lVG8obUNvbnRyb2xsZXJTdHViLCB2YWx1ZSwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWVfaW1wbChpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgLy8gVE9ETyhoZG1vb24pOiBzYW5pdHkgY2hlY2sKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VUX1ZPTFVNRSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYWRqdXN0Vm9sdW1lKG1Db250cm9sbGVyU3R1YiwgZGlyZWN0aW9uLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEKTsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nX2ltcGwoU3RyaW5nIG1lZGlhSWQsIFJhdGluZzIgcmF0aW5nKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmF0aW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJhdGluZyBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UmF0aW5nKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgcmF0aW5nLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciBjYikgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShjb21tYW5kKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kQ3VzdG9tQ29tbWFuZChtQ29udHJvbGxlclN0dWIsIGNvbW1hbmQudG9CdW5kbGUoKSwgYXJncywgY2IpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGxpc3QuZ2V0KGkpLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRQbGF5bGlzdChtQ29udHJvbGxlclN0dWIsIGJ1bmRsZUxpc3QsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEobUNvbnRyb2xsZXJTdHViLCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVfaW1wbCgpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUFJFUEFSRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmFzdEZvcndhcmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IGZhc3QgZm9yd2FyZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9GQVNUX0ZPUldBUkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJld2luZF9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgcmV3aW5kIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQotICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1JFV0lORCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2Vla1RvX2ltcGwobG9uZyBwb3MpIHsKLSAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBvc2l0aW9uIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBhcmdzLnB1dExvbmcoTWVkaWFTZXNzaW9uMlN0dWIuQVJHVU1FTlRfS0VZX1BPU0lUSU9OLCBwb3MpOwotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TRUVLX1RPLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkZFBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGluZGV4LCBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5yZW1vdmVQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVwbGFjZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGluZGV4LCBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2h1ZmZsZU1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0U2h1ZmZsZU1vZGUobUNvbnRyb2xsZXJTdHViLCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UmVwZWF0TW9kZShtQ29udHJvbGxlclN0dWIsIHJlcGVhdE1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGxheWJhY2tJbmZvIGdldFBsYXliYWNrSW5mb19pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXJTdGF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVEaWZmID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBtUG9zaXRpb25FdmVudFRpbWVNczsKLSAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRQb3NpdGlvbiA9IG1Qb3NpdGlvbk1zICsgKGxvbmcpIChtUGxheWJhY2tTcGVlZCAqIHRpbWVEaWZmKTsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBleHBlY3RlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5YmFja1NwZWVkX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTcGVlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBnZXRDdXJyZW50TWVkaWFJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXllclN0YXRlQ2hhbmdlcyhmaW5hbCBpbnQgc3RhdGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXllclN0YXRlID0gc3RhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKG1JbnN0YW5jZSwgc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZSB0byBzZWVrIGNvbXBsZXRlZAotICAgIHZvaWQgcHVzaFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGV2ZW50VGltZU1zLCBmaW5hbCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBldmVudFRpbWVNczsKLSAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TZWVrQ29tcGxldGVkKG1JbnN0YW5jZSwgcG9zaXRpb25Ncyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXliYWNrU3BlZWRDaGFuZ2VzKGZpbmFsIGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkID0gc3BlZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWJhY2tTcGVlZENoYW5nZWQobUluc3RhbmNlLCBzcGVlZCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBGaXggdGhpcyAtLSBpdCdzIG5vdyBidWZmZXJlZCBzdGF0ZQotICAgICAgICAgICAgLy9tQ2FsbGJhY2sub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChtSW5zdGFuY2UsIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXliYWNrSW5mb0NoYW5nZXMoZmluYWwgUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWJhY2tJbmZvQ2hhbmdlZChtSW5zdGFuY2UsIGluZm8pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdENoYW5nZXMoZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwgZmluYWwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VzKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobUluc3RhbmNlLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCByZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoRXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25FcnJvcihtSW5zdGFuY2UsIGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgdm9pZCBvbkNvbm5lY3RlZE5vdExvY2tlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzLAotICAgICAgICAgICAgZmluYWwgaW50IHBsYXllclN0YXRlLAotICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zLAotICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbk1zLAotICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgZmluYWwgUGxheWJhY2tJbmZvIGluZm8sCi0gICAgICAgICAgICBmaW5hbCBpbnQgcmVwZWF0TW9kZSwKLSAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsCi0gICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGVkTm90TG9ja2VkIHNlc3Npb25CaW5kZXI9IiArIHNlc3Npb25CaW5kZXIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBjbG9zZSA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCB8fCBhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gcmVqZWN0ZWQuCi0gICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25CaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3QgYmUgbm90aWZpZWQgYWJvdXQgdGhlIGNvbm5lY3Rpb24gcmVzdWx0IG1hbnkgdGltZXMuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQcm9iYWJseSBhIGJ1ZyBvciBtYWxpY2lvdXMgYXBwLiIpOwotICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kcyA9IGFsbG93ZWRDb21tYW5kczsKLSAgICAgICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBwbGF5ZXJTdGF0ZTsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IHBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkID0gcGxheWJhY2tTcGVlZDsKLSAgICAgICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OwotICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGxvY2FsIGJpbmRlciBpcyBuby1vcCwKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gY2FuIGJlIHVzZWQgd2l0aG91dCB3b3JyeWluZyBhYm91dCBkZWFkbG9jay4KLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBkaWVkIHRvbyBlYXJseS4iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgY29tbWFuZHMgdG8gcHJldmVudHMgaWxsZWdhbCBBUEkgY2FsbHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBtYXkgdHJpZ2dlciBDb250cm9sbGVyQ2FsbGJhY2tzIHdpdGggdGhlIGluaXRpYWwgdmFsdWVzCi0gICAgICAgICAgICAgICAgLy8gQnV0IGl0J3MgaGFyZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIHRoZSBjb250cm9sbGVyIGNhbGxiYWNrcwotICAgICAgICAgICAgICAgIC8vIE9ubHkgbm90aWZ5IGFib3V0IHRoZQotICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbm5lY3RlZChtSW5zdGFuY2UsIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjbG9zZSkgewotICAgICAgICAgICAgICAgIC8vIFRyaWNrIHRvIGNhbGwgcmVsZWFzZSgpIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jaywgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2sKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBkZXZlbG9wZXIncyBjdXN0b20gbG9jayB3aXRoaW4gdGhlIENvbnRyb2xsZXJDYWxsYmFjay5vbkRpc2Nvbm5lY3RlZCgpLgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoZmluYWwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGZpbmFsIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkN1c3RvbUNvbW1hbmQgY21kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIHRoZSBjb250cm9sbGVyIGV4aXN0cy4KLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUNvbW1hbmQobUluc3RhbmNlLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChtSW5zdGFuY2UsIGNvbW1hbmRzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoZmluYWwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21MYXlvdXRDaGFuZ2VkKG1JbnN0YW5jZSwgbGF5b3V0KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUNvbm5lY3Rpb24gaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpdCdzIGFsd2F5cyBtYWluLXRocmVhZC4KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2VydmljZUNvbm5lY3RlZCAiICsgbmFtZSArICIgIiArIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgICAgICAgICBpZiAoIW1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhuYW1lLmdldFBhY2thZ2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsIG5hbWUgKyAiIHdhcyBjb25uZWN0ZWQsIGJ1dCBleHBlY3RlZCBwa2c9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSArICIgd2l0aCBpZD0iICsgbVRva2VuLmdldElkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIgPSBJTWVkaWFTZXNzaW9uMi5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihzZXNzaW9uQmluZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAvLyBUZW1wb3JhbCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgY3Jhc2guIFN5c3RlbSB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgIC8vIHJlYmluZCwgc28ganVzdCBuby1vcC4KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVhbGx5PyBFaXRoZXIgZGlzY29ubmVjdCBjbGVhbmx5IG9yCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIHNlcnZpY2UgIiArIG5hbWUgKyAiIGlzIGRpc2Nvbm5lY3RlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJpbmRpbmdEaWVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gUGVybWFuZW50IGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBwYWNrYWdlIHVwZGF0ZSBvciByZW1vdmVkLgotICAgICAgICAgICAgLy8gVGhpcyBTZXNzaW9uU2VydmljZVJlY29yZCB3aWxsIGJlIHJlbW92ZWQgYWNjb3JkaW5nbHksIGJ1dCBmb3JnZXQgc2Vzc2lvbiBiaW5kZXIgaGVyZQotICAgICAgICAgICAgLy8gZm9yIHN1cmUuCi0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGxheWJhY2tJbmZvSW1wbCBpbXBsZW1lbnRzIFBsYXliYWNrSW5mb1Byb3ZpZGVyIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLnBsYXliYWNrX3R5cGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfVFlQRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuY29udHJvbF90eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfVk9MVU1FID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5tYXhfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DVVJSRU5UX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuY3VycmVudF92b2x1bWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVRElPX0FUVFJJQlVURVMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmF1ZGlvX2F0dHJzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFBsYXliYWNrSW5mbyBtSW5zdGFuY2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBsYXliYWNrVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRyb2xUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ3VycmVudFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cnM7Ci0KLSAgICAgICAgcHJpdmF0ZSBQbGF5YmFja0luZm9JbXBsKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tUeXBlID0gcGxheWJhY2tUeXBlOwotICAgICAgICAgICAgbUF1ZGlvQXR0cnMgPSBhdHRyczsKLSAgICAgICAgICAgIG1Db250cm9sVHlwZSA9IGNvbnRyb2xUeXBlOwotICAgICAgICAgICAgbU1heFZvbHVtZSA9IG1heDsKLSAgICAgICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudDsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBQbGF5YmFja0luZm8odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdWRpb0F0dHJpYnV0ZXMgZ2V0QXVkaW9BdHRyaWJ1dGVzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUF1ZGlvQXR0cnM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb250cm9sVHlwZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldE1heFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIH0KLQotICAgICAgICBQbGF5YmFja0luZm8gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIG1QbGF5YmFja1R5cGUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ09OVFJPTF9UWVBFLCBtQ29udHJvbFR5cGUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfTUFYX1ZPTFVNRSwgbU1heFZvbHVtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSwgbUN1cnJlbnRWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoS0VZX0FVRElPX0FUVFJJQlVURVMsIG1BdWRpb0F0dHJzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsCi0gICAgICAgICAgICAgICAgaW50IGNvbnRyb2xUeXBlLCBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja0luZm9JbXBsKHBsYXliYWNrVHlwZSwgYXR0cnMsIGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZVR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVDb250cm9sID0gYnVuZGxlLmdldEludChLRVlfQ09OVFJPTF9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBtYXhWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9NQVhfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjdXJyZW50Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfQ1VSUkVOVF9WT0xVTUUpOwotICAgICAgICAgICAgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzID0gYnVuZGxlLmdldFBhcmNlbGFibGUoS0VZX0FVRElPX0FUVFJJQlVURVMpOwotCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVR5cGUsIGF0dHJzLCB2b2x1bWVDb250cm9sLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZjNWRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbGxlcjJTdHViIGV4dGVuZHMgSU1lZGlhQ29udHJvbGxlcjIuU3R1YiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyU3R1YiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCi0KLSAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFDb250cm9sbGVyMkltcGw+IG1Db250cm9sbGVyOwotCi0gICAgTWVkaWFDb250cm9sbGVyMlN0dWIoTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcikgewotICAgICAgICBtQ29udHJvbGxlciA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIySW1wbCBnZXRDb250cm9sbGVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udHJvbGxlciBpcyByZWxlYXNlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFCcm93c2VyMkltcGwgZ2V0QnJvd3NlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICBpZiAoY29udHJvbGxlciBpbnN0YW5jZW9mIE1lZGlhQnJvd3NlcjJJbXBsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjJJbXBsKSBjb250cm9sbGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIG1Db250cm9sbGVyLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoaW50IHN0YXRlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWVyU3RhdGVDaGFuZ2VzKHN0YXRlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnRUaW1lTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBldmVudFRpbWVNcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3NpdGlvbk1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgcG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBvc2l0aW9uQ2hhbmdlcyhldmVudFRpbWVNcywgcG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXliYWNrU3BlZWRDaGFuZ2VzKHNwZWVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgYnVmZmVyZWRQb3NpdGlvbk1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGUsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5bGlzdEJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogcGxheWxpc3RCdW5kbGUpIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpOwotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgaXRlbSBpbiBwbGF5bGlzdCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5bGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RDaGFuZ2VzKHBsYXlsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFJlcGVhdE1vZGVDaGFuZ2VzKHJlcGVhdE1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChCdW5kbGUgcGxheWJhY2tJbmZvKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBpbmZvID0gUGxheWJhY2tJbmZvSW1wbC5mcm9tQnVuZGxlKHBsYXliYWNrSW5mbyk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBsYXliYWNrSW5mbyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXliYWNrSW5mb0NoYW5nZXMoaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwgQnVuZGxlIGNvbW1hbmRHcm91cCwKLSAgICAgICAgICAgIGludCBwbGF5ZXJTdGF0ZSwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywgQnVuZGxlIHBsYXliYWNrSW5mbywgaW50IHNodWZmbGVNb2RlLCBpbnQgcmVwZWF0TW9kZSwKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtTGlzdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQnVuZGxlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaXRlbUxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ29ubmVjdGVkTm90TG9ja2VkKHNlc3Npb25CaW5kZXIsCi0gICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kR3JvdXApLAotICAgICAgICAgICAgICAgIHBsYXllclN0YXRlLCBwb3NpdGlvbkV2ZW50VGltZU1zLCBwb3NpdGlvbk1zLCBwbGF5YmFja1NwZWVkLCBidWZmZXJlZFBvc2l0aW9uTXMsCi0gICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvSW1wbC5mcm9tQnVuZGxlKHBsYXliYWNrSW5mbyksIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAotICAgICAgICAgICAgICAgIGl0ZW1MaXN0LCBzZXNzaW9uQWN0aXZpdHkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzY29ubmVjdGVkKCkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uRGlzY29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpIHsKLSAgICAgICAgaWYgKGNvbW1hbmRCdXR0b25saXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRCdXR0b25saXN0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRCdXR0b25saXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uIGJ1dHRvbiA9IENvbW1hbmRCdXR0b25JbXBsLmZyb21CdW5kbGUoY29tbWFuZEJ1dHRvbmxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIGlmIChidXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxheW91dC5hZGQoYnV0dG9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChCdW5kbGUgY29tbWFuZHNCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcyA9IFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZHNCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZHMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DdXN0b21Db21tYW5kKEJ1bmRsZSBjb21tYW5kQnVuZGxlLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUNvbW1hbmQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gTWVkaWFCcm93c2VyIHNwZWNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldExpYnJhcnlSb290RG9uZShCdW5kbGUgcm9vdEhpbnRzLCBTdHJpbmcgcm9vdE1lZGlhSWQsIEJ1bmRsZSByb290RXh0cmEpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRJdGVtRG9uZShTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGl0ZW1CdW5kbGUpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRJdGVtRG9uZSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRDaGlsZHJlbkRvbmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblNlYXJjaFJlc3VsdENoYW5nZWQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldFNlYXJjaFJlc3VsdERvbmUoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DaGlsZHJlbkNoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYTBmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19CUk9XU0FCTEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX1BMQVlBQkxFOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GbGFnczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhSXRlbTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUl0ZW0ySW1wbCBpbXBsZW1lbnRzIE1lZGlhSXRlbTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRkxBR1MgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmZsYWdzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01FVEFEQVRBID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5tZXRhZGF0YSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VVUlEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi51dWlkIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFJdGVtMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKLSAgICBwcml2YXRlIGZpbmFsIFVVSUQgbVVVSUQ7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7Ci0KLSAgICAvLyBGcm9tIHRoZSBwdWJsaWMgQVBJCi0gICAgcHVibGljIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzKSB7Ci0gICAgICAgIHRoaXMobWVkaWFJZCwgZHNkLCBtZXRhZGF0YSwgZmxhZ3MsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MsIEBOdWxsYWJsZSBVVUlEIHV1aWQpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1lZGlhSWQsIG1ldGFkYXRhLmdldE1lZGlhSWQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGFkYXRhJ3MgaWQgc2hvdWxkIGJlIG1hdGNoZWQgd2l0aCB0aGUgbWVkaWFpZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUlkID0gbWVkaWFJZDsKLSAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZHNkOwotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIG1VVUlEID0gKHV1aWQgPT0gbnVsbCkgPyBVVUlELnJhbmRvbVVVSUQoKSA6IHV1aWQ7Ci0KLSAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhSXRlbTIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNZWRpYUl0ZW0yKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhSXRlbTIgb3RoZXIgPSAoTWVkaWFJdGVtMikgb2JqOwotICAgICAgICByZXR1cm4gbVVVSUQuZXF1YWxzKCgoTWVkaWFJdGVtMkltcGwpIG90aGVyLmdldFByb3ZpZGVyKCkpLm1VVUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBvYmplY3QgYXMgYSBidW5kbGUgdG8gc2hhcmUgYmV0d2VlbiBwcm9jZXNzZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGJ1bmRsZSBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0ZMQUdTLCBtRmxhZ3MpOwotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX01FVEFEQVRBLCBtTWV0YWRhdGEudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfVVVJRCwgbVVVSUQudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSB3aGljaCB3YXMgcHVibGlzaGVkIGJ5IHtAbGluayBNZWRpYUl0ZW0yI3RvQnVuZGxlKCl9LgotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX2ltcGwoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyB1dWlkU3RyaW5nID0gYnVuZGxlLmdldFN0cmluZyhLRVlfVVVJRCk7Ci0gICAgICAgIHJldHVybiBmcm9tQnVuZGxlKGJ1bmRsZSwgVVVJRC5mcm9tU3RyaW5nKHV1aWRTdHJpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9IHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgVVVJRH0uCi0gICAgICogSWYge0BsaW5rIFVVSUR9Ci0gICAgICogY2FuIGJlIG51bGwgZm9yIGNyZWF0aW5nIG5ldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSB3aGljaCB3YXMgcHVibGlzaGVkIGJ5IHtAbGluayBNZWRpYUl0ZW0yI3RvQnVuZGxlKCl9LgotICAgICAqIEBwYXJhbSB1dWlkIEEge0BsaW5rIFVVSUR9IHRvIG92ZXJyaWRlLiBDYW4gYmUge0BsaW5rIG51bGx9IGZvciBvdmVycmlkZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBzdGF0aWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUsIEBOdWxsYWJsZSBVVUlEIHV1aWQpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IGJ1bmRsZS5nZXRCdW5kbGUoS0VZX01FVEFEQVRBKTsKLSAgICAgICAgZmluYWwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgZmluYWwgaW50IGZsYWdzID0gYnVuZGxlLmdldEludChLRVlfRkxBR1MpOwotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsKGlkLCBudWxsLCBtZXRhZGF0YSwgZmxhZ3MsIHV1aWQpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNZWRpYUl0ZW0yeyIpOwotICAgICAgICBzYi5hcHBlbmQoIm1GbGFncz0iKS5hcHBlbmQobUZsYWdzKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIG1NZXRhZGF0YT0iKS5hcHBlbmQobU1ldGFkYXRhKTsKLSAgICAgICAgc2IuYXBwZW5kKCd9Jyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBARmxhZ3MgaW50IGdldEZsYWdzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtRmxhZ3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCcm93c2FibGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX0JST1dTQUJMRSkgIT0gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BsYXlhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19QTEFZQUJMRSkgIT0gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtSWQsIG1ldGFkYXRhLmdldE1lZGlhSWQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGFkYXRhJ3MgaWQgc2hvdWxkIGJlIG1hdGNoZWQgd2l0aCB0aGUgbWVkaWFJZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE5vbk51bGwgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGdldERhdGFTb3VyY2VEZXNjX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YVNvdXJjZURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIEJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIEBGbGFncyBpbnQgbUZsYWdzOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFJZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChCdWlsZGVyIGluc3RhbmNlLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWVkaWFJZF9pbXBsKEBOdWxsYWJsZSBTdHJpbmcgbWVkaWFJZCkgewotICAgICAgICAgICAgbU1lZGlhSWQgPSBtZWRpYUlkOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERhdGFTb3VyY2VEZXNjX2ltcGwoQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRhdGFTb3VyY2VEZXNjKSB7Ci0gICAgICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkYXRhU291cmNlRGVzYzsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhSXRlbTIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IChtTWV0YWRhdGEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEyLk1FVEFEQVRBX0tFWV9NRURJQV9JRCkgOiBudWxsOwotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyAgVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgaXRzIHN1ZmZpY2llbnQgKGUuZy4gVXNlIFVVSUQgaW5zdGVhZD8pCi0gICAgICAgICAgICAgICAgaWQgPSAobU1lZGlhSWQgIT0gbnVsbCkgPyBtTWVkaWFJZCA6IHRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsKGlkLCBtRGF0YVNvdXJjZURlc2MsIG1NZXRhZGF0YSwgbUZsYWdzKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzRjZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVyQmFzZUltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbCBleHRlbmRzIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCBpbXBsZW1lbnRzCi0gICAgICAgIE1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBtTGlicmFyeVNlc3Npb247Ci0KLSAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIGluc3RhbmNlKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGVfaW1wbCgpOwotCi0gICAgICAgIC8vIEVmZmVjdGl2ZWx5IGZpbmFsCi0gICAgICAgIE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKCEoc2Vzc2lvbiBpbnN0YW5jZW9mIE1lZGlhTGlicmFyeVNlc3Npb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgTWVkaWFMaWJyYXJ5U2Vzc2lvbiwgYnV0IHJldHVybmVkIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgfQotICAgICAgICBtTGlicmFyeVNlc3Npb24gPSAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgZ2V0U2Vzc2lvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBleHRlbmRzIE1lZGlhU2Vzc2lvbjJJbXBsCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhTGlicmFyeVNlc3Npb25Qcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHksIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBwbGF5ZXIsIGlkLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlciwgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICAvLyBEb24ndCBwdXQgYW55IGV4dHJhIGluaXRpYWxpemF0aW9uIGhlcmUuIEhlcmUncyB0aGUgcmVhc29uLgotICAgICAgICAgICAgLy8gU3lzdGVtIHNlcnZpY2Ugd2lsbCByZWNvZ25pemUgdGhpcyBzZXNzaW9uIGluc2lkZSBvZiB0aGUgc3VwZXIgY29uc3RydWN0b3IgYW5kIHdvdWxkCi0gICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoaXMgc2Vzc2lvbiBhc3N1bWluZyB0aGF0IGluaXRpYWxpemF0aW9uIGlzIGZpbmlzaGVkLiBIb3dldmVyLCBpZiBhbnkKLSAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGxvZ2ljIGlzIGhlcmUsIGNhbGxzIGZyb20gdGhlIHNlcnZlciB3b3VsZCBmYWlsLgotICAgICAgICAgICAgLy8gc2VlOiBNZWRpYVNlc3Npb24yU3R1YiNjb25uZWN0KCkKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb24pIHN1cGVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2spIHN1cGVyLmdldENhbGxiYWNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgICAgIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChjb250cm9sbGVyLCBwYXJlbnRJZCwgaXRlbUNvdW50LAotICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkX2ltcGwoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgICAgIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWQoY29udHJvbGxlciwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgQnVpbGRlckJhc2VJbXBsPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4gewotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwgQnVpbGRlciBpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXNzaW9uIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIExpYnJhcnlSb290SW1wbCBpbXBsZW1lbnRzIExpYnJhcnlSb290UHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIExpYnJhcnlSb290IG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvb3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKLQotICAgICAgICBwdWJsaWMgTGlicmFyeVJvb3RJbXBsKExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAocm9vdElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb290SWQgc2hvdWxkbid0IGJlIG51bGwuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Sb290SWQgPSByb290SWQ7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvb3RJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYzUzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi4qOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5CaXRtYXBLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuTG9uZ0tleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLlJhdGluZ0tleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLlRleHRLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFNZXRhZGF0YTJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYU1ldGFkYXRhMiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfTE9ORyA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1RFWFQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9CSVRNQVAgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9SQVRJTkcgPSAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9GTE9BVCA9IDQ7Ci0gICAgc3RhdGljIGZpbmFsIEFycmF5TWFwPFN0cmluZywgSW50ZWdlcj4gTUVUQURBVEFfS0VZU19UWVBFOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFID0gbmV3IEFycmF5TWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRFVSQVRJT04sIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BVVRIT1IsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1dSSVRFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUE9TRVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EQVRFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ZRUFSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9HRU5SRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVFJBQ0tfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1VTRVJfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1NVQlRJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0RFU0NSSVBUSU9OLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfSUQsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RPV05MT0FEX1NUQVRVUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9ERVNDUklQVElPTl9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9USVRMRSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRJU1QsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU0sCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX1dSSVRFUiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BVVRIT1IsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUE9TRVIKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQEJpdG1hcEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9CSVRNQVBfT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfVVJJX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUX1VSSSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJCi0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFNZXRhZGF0YTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJJbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyKHRoaXMpOwotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleV9pbXBsKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dF9pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuZ2V0U3RyaW5nKE1FVEFEQVRBX0tFWV9NRURJQV9JRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOwotICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldExvbmdfaW1wbChATG9uZ0tleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhrZXksIDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGdldFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKGtleSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgcmF0aW5nCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgUmF0aW5nLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByYXRpbmc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRGbG9hdChrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwX2ltcGwoQEJpdG1hcEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQml0bWFwIGJtcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBibXAgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIEJpdG1hcC4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm1wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoTUVUQURBVEFfS0VZX0VYVFJBUyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYW4gYnVuZGxlCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYW4gZXh0cmEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuc2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiAoYnVuZGxlID09IG51bGwpID8gbnVsbCA6IG5ldyBNZWRpYU1ldGFkYXRhMkltcGwoYnVuZGxlKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlLCBNZWRpYU1ldGFkYXRhMiBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzb3VyY2UudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoaW50IG1heEJpdG1hcFNpemUpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyKHRoaXMpOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbUJ1bmRsZS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CdW5kbGUuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSAoQml0bWFwKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC5nZXRIZWlnaHQoKSA+IG1heEJpdG1hcFNpemUgfHwgYm1wLmdldFdpZHRoKCkgPiBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucHV0Qml0bWFwKGtleSwgc2NhbGVCaXRtYXAoYm1wLCBtYXhCaXRtYXBTaXplKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0VGV4dF9pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXksIENoYXJTZXF1ZW5jZSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQ2hhclNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dExvbmdfaW1wbChATG9uZ0tleSBTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9MT05HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBsb25nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXksIFJhdGluZzIgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1JBVElORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgUmF0aW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoa2V5LCB2YWx1ZS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0Qml0bWFwX2ltcGwoQEJpdG1hcEtleSBTdHJpbmcga2V5LCBCaXRtYXAgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0JJVE1BUCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQml0bWFwIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfRkxPQVQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGZsb2F0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRGbG9hdChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoTUVUQURBVEFfS0VZX0VYVFJBUywgYnVuZGxlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbChtQnVuZGxlKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBCaXRtYXAgc2NhbGVCaXRtYXAoQml0bWFwIGJtcCwgaW50IG1heFNpemUpIHsKLSAgICAgICAgICAgIGZsb2F0IG1heFNpemVGID0gbWF4U2l6ZTsKLSAgICAgICAgICAgIGZsb2F0IHdpZHRoU2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRXaWR0aCgpOwotICAgICAgICAgICAgZmxvYXQgaGVpZ2h0U2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4od2lkdGhTY2FsZSwgaGVpZ2h0U2NhbGUpOwotICAgICAgICAgICAgaW50IGhlaWdodCA9IChpbnQpIChibXAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSAoaW50KSAoYm1wLmdldFdpZHRoKCkgKiBzY2FsZSk7Ci0gICAgICAgICAgICByZXR1cm4gQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChibXAsIHdpZHRoLCBoZWlnaHQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ0ZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uQ2FsbGJhY2tFeGVjdXRvcjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1lZGlhUGxheWxpc3RBZ2VudEltcGwgaW1wbGVtZW50cyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVBsYXlsaXN0QWdlbnQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gbUNhbGxiYWNrcyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChNZWRpYVBsYXlsaXN0QWdlbnQgaW5zdGFuY2UpIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrcy5nZXQoY2FsbGJhY2spICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjYWxsYmFjayBpcyBhbHJlYWR5IGFkZGVkLiBJZ25vcmluZy4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgZXhlY3V0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgdW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAotICAgICAgICAgICAgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFja3MucmVtb3ZlKGNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdD0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIHBsYXlsaXN0LCBtZXRhZGF0YSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRTaHVmZmxlTW9kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFJlcGVhdE1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtX2ltcGwoQE5vbk51bGwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHNkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtTGlzdCA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBpZiAoaXRlbUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gaXRlbUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCkgPT0gZHNkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBnZXRDYWxsYmFja3MoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGNhbGxiYWNrcy5wdXRBbGwobUNhbGxiYWNrcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzYwNDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9DVVNUT007Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOy8vTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yU3R1YiBtU2Vzc2lvblN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1TZXNzaW9uVG9rZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbVBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLQotICAgIC8vIG1QbGF5ZXIgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQsIGFuZCB3ZSBzaG91bGRuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgLy8gbm9yIGxlYXZlIGxvZyBhbHdheXMgZm9yIHVzaW5nIG1QbGF5ZXIgd2hlbiBpdCdzIG51bGwuIEhlcmUncyB0aGUgcmVhc29uLgotICAgIC8vIFdoZW4gYSBNZWRpYVNlc3Npb24yIGlzIGNsb3NlZCwgdGhlcmUgY291bGQgYmUgYSBwZW5kZWQgb3BlcmF0aW9uIGluIHRoZSBzZXNzaW9uIGNhbGxiYWNrCi0gICAgLy8gZXhlY3V0b3IgdGhhdCBtYXkgd2FudCB0byBhY2Nlc3MgdGhlIHBsYXllci4gSGVyZSdzIHRoZSBzYW1wbGUgY29kZSBzbmlwcGV0IGZvciB0aGF0LgotICAgIC8vCi0gICAgLy8gICBwdWJsaWMgdm9pZCBvbkZvbygpIHsKLSAgICAvLyAgICAgaWYgKG1QbGF5ZXIgPT0gbnVsbCkgcmV0dXJuOyAvLyBmaXJzdCBjaGVjawotICAgIC8vICAgICBtU2Vzc2lvbkNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0b3IoKCkgLT4gewotICAgIC8vICAgICAgIC8vIEVycm9yLiBTZXNzaW9uIG1heSBiZSBjbG9zZWQgYW5kIG1QbGF5ZXIgY2FuIGJlIG51bGwgaGVyZS4KLSAgICAvLyAgICAgICBtUGxheWVyLmZvbygpOwotICAgIC8vICAgICB9KTsKLSAgICAvLyAgIH0KLSAgICAvLwotICAgIC8vIEJ5IGFkZGluZyBwcm90ZWN0aXZlIGNvZGUsIHdlIGNhbiBhbHNvIHByb3RlY3QgQVBJcyBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciB0aGUgY2xvc2UoKQotICAgIC8vCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgcHV0IHZvbGF0aWxlIGhlcmU/Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25QbGF5bGlzdEFnZW50IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgbURzbUhlbHBlcjsKLQotICAgIC8qKgotICAgICAqIENhbiBiZSBvbmx5IGNhbGxlZCBieSB0aGUge0BsaW5rIEJ1aWxkZXIjYnVpbGQoKX0uCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcGxheWVyCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogQHBhcmFtIHBsYXlsaXN0QWdlbnQKLSAgICAgKiBAcGFyYW0gdm9sdW1lUHJvdmlkZXIKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbkFjdGl2aXR5Ci0gICAgICogQHBhcmFtIGNhbGxiYWNrRXhlY3V0b3IKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMkltcGwoQ29udGV4dCBjb250ZXh0LCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHksCi0gICAgICAgICAgICBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLCBTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIG90aGVyIHBhcmFtcy4KLSAgICAgICAgbUluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTsKLQotICAgICAgICAvLyBBcmd1bWVudCBjaGVja3MgYXJlIGRvbmUgYnkgYnVpbGRlciBhbHJlYWR5LgotICAgICAgICAvLyBJbml0aWFsaXplIGZpbmFscyBmaXJzdC4KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gY2FsbGJhY2tFeGVjdXRvcjsKLSAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgbVNlc3Npb25TdHViID0gbmV3IE1lZGlhU2Vzc2lvbjJTdHViKHRoaXMpOwotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWVyRXZlbnRDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgbVBsYXlsaXN0RXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayh0aGlzKTsKLQotICAgICAgICAvLyBJbmZlciB0eXBlIGZyb20gdGhlIGlkIGFuZCBwYWNrYWdlIG5hbWUuCi0gICAgICAgIFN0cmluZyBsaWJyYXJ5U2VydmljZSA9IGdldFNlcnZpY2VOYW1lKGNvbnRleHQsIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLCBpZCk7Ci0gICAgICAgIFN0cmluZyBzZXNzaW9uU2VydmljZSA9IGdldFNlcnZpY2VOYW1lKGNvbnRleHQsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLCBpZCk7Ci0gICAgICAgIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsICYmIGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFtYmlndW91cyBzZXNzaW9uIHR5cGUuIE11bHRpcGxlIgotICAgICAgICAgICAgICAgICAgICArICIgc2Vzc2lvbiBzZXJ2aWNlcyBkZWZpbmUgdGhlIHNhbWUgaWQ9IiArIGlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9MSUJSQVJZX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGxpYnJhcnlTZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT05fU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgc2Vzc2lvblNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBudWxsLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlUGxheWVyKHBsYXllciwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIpOwotCi0gICAgICAgIC8vIEFzayBzZXJ2ZXIgZm9yIHRoZSBzYW5pdHkgY2hlY2ssIGFuZCBzdGFydHMKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBtYWtpbmcgc2Vzc2lvbiBJRCB1bmlxdWUgJ3BlciBwYWNrYWdlJyBjYW5ub3QgYmUgZG9uZSBpbiBoZXJlLgotICAgICAgICAvLyBTZXJ2ZXIgY2FuIG9ubHkga25vdyBpZiB0aGUgcGFja2FnZSBoYXMgYW5vdGhlciBwcm9jZXNzIGFuZCBoYXMgYW5vdGhlciBzZXNzaW9uIHdpdGggdGhlCi0gICAgICAgIC8vIHNhbWUgaWQuIE5vdGUgdGhhdCAnSUQgaXMgdW5pcXVlIHBlciBwYWNrYWdlJyBpcyBpbXBvcnRhbnQgZm9yIGNvbnRyb2xsZXIgdG8gZGlzdGluZ3Vpc2gKLSAgICAgICAgLy8gYSBzZXNzaW9uIGluIGFub3RoZXIgcGFja2FnZS4KLSAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgIGlmICghbWFuYWdlci5jcmVhdGVTZXNzaW9uMihtU2Vzc2lvblRva2VuKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2Vzc2lvbiB3aXRoIHRoZSBzYW1lIGlkIGlzIGFscmVhZHkgdXNlZCBieSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGFub3RoZXIgcHJvY2Vzcy4gVXNlIE1lZGlhQ29udHJvbGxlcjIgaW5zdGVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgc2VydmljZUFjdGlvbiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlQWN0aW9uKTsKLSAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHNlcnZpY2VzID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKHNlcnZpY2VJbnRlbnQsCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VJZCA9IFNlc3Npb25Ub2tlbjJJbXBsLmdldFNlc3Npb25JZChzZXJ2aWNlcy5nZXQoaSkpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlSWQgIT0gbnVsbCAmJiBUZXh0VXRpbHMuZXF1YWxzKGlkLCBzZXJ2aWNlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFtYmlndW91cyBzZXNzaW9uIHR5cGUuIE11bHRpcGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2Vzc2lvbiBzZXJ2aWNlcyBkZWZpbmUgdGhlIHNhbWUgaWQ9IiArIGlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mby5uYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWVyX2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyKHBsYXllciwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXIoTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBvbGRQbGF5ZXI7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBvbGRBZ2VudDsKLSAgICAgICAgZmluYWwgUGxheWJhY2tJbmZvIGluZm8gPSBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lUHJvdmlkZXIsIHBsYXllci5nZXRBdWRpb0F0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG9sZFBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgICAgICBvbGRBZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbmV3IFNlc3Npb25QbGF5bGlzdEFnZW50KHRoaXMsIG1QbGF5ZXIpOwotICAgICAgICAgICAgICAgIGlmIChtRHNtSGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURzbUhlbHBlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFnZW50ID0gbVNlc3Npb25QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBhZ2VudDsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciAhPSBvbGRQbGF5ZXIpIHsKLSAgICAgICAgICAgIHBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdhcm5pbmc6IFBvb3JseSBpbXBsZW1lbnQgcGxheWVyIG1heSBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgIG9sZFBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG9sZEFnZW50KSB7Ci0gICAgICAgICAgICBhZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkQWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdhcm5pbmc6IFBvb3JseSBpbXBsZW1lbnQgcGxheWVyIG1heSBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgIG9sZEFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5YmFja0luZm9DaGFuZ2VkKGluZm8pOwotICAgICAgICAgICAgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChvbGRQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVwZWF0IHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgcGxheWxpc3QgYWdlbnQuCi0gICAgfQotCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzKSB7Ci0gICAgICAgIFBsYXliYWNrSW5mbyBpbmZvOwotICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHN0cmVhbTsKLSAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gYXR0cnMuZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9NYW5hZ2VyLlVTRV9ERUZBVUxUX1NUUkVBTV9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEl0IG1heSBoYXBwZW4gaWYgdGhlIEF1ZGlvQXR0cmlidXRlcyBkb2Vzbid0IGhhdmUgdXNhZ2UuCi0gICAgICAgICAgICAgICAgICAgIC8vIENoYW5nZSBpdCB0byB0aGUgU1RSRUFNX01VU0lDIGJlY2F1c2UgaXQncyBub3Qgc3VwcG9ydGVkIGJ5IGF1ZGlvIG1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHF1ZXJ5aW5nIHZvbHVtZSBsZXZlbC4KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMLAotICAgICAgICAgICAgICAgICAgICBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1ZvbHVtZUZpeGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9GSVhFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0FCU09MVVRFLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShzdHJlYW0pLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShzdHJlYW0pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFIC8qIENvbnRyb2xUeXBlICovLAotICAgICAgICAgICAgICAgICAgICBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q29udHJvbFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0TWF4Vm9sdW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldEN1cnJlbnRWb2x1bWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgLy8gU3RvcCBzeXN0ZW0gc2VydmljZSBmcm9tIGxpc3RlbmluZyB0aGlzIHNlc3Npb24gZmlyc3QuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBtYW5hZ2VyLmRlc3Ryb3lTZXNzaW9uMihtU2Vzc2lvblRva2VuKTsKLQotICAgICAgICBpZiAobVNlc3Npb25TdHViICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNlc3Npb24gaXMgbm93IHVuYXZhaWxhYmxlLCBpZD0iICsgbUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludmFsaWRhdGUgcHJldmlvdXNseSBwdWJsaXNoZWQgc2Vzc2lvbiBzdHViLgotICAgICAgICAgICAgbVNlc3Npb25TdHViLmRlc3Ryb3lOb3RMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQ7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IG51bGw7Ci0gICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQbGF5ZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjIgZ2V0Vm9sdW1lUHJvdmlkZXJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRUb2tlbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25Ub2tlbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxDb250cm9sbGVySW5mbz4gZ2V0Q29ubmVjdGVkQ29udHJvbGxlcnNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uU3R1Yi5nZXRDb250cm9sbGVycygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvRm9jdXNSZXF1ZXN0X2ltcGwoQXVkaW9Gb2N1c1JlcXVlc3QgYWZyKSB7Ci0gICAgICAgIC8vIGltcGxlbWVudAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlfaW1wbCgpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucGxheSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGF1c2VfaW1wbCgpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3BfaW1wbCgpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVzZXQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUxheW91dF9pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGF5b3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxheW91dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoY29udHJvbGxlciwgbGF5b3V0KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IGZvbGxvd3MKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZHMgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2V0QWxsb3dlZENvbW1hbmRzKGNvbnRyb2xsZXIsIGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNlbmRDdXN0b21Db21tYW5kKGNvbnRyb2xsZXIsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncykgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNlbmRDdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNldFBsYXlsaXN0KGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEobWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuYWRkUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0TWV0YWRhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBnZXRDdXJyZW50UGxheWxpc3RJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNldFJlcGVhdE1vZGUocmVwZWF0TW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFNodWZmbGVNb2RlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVfaW1wbCgpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucHJlcGFyZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2Vla1RvX2ltcGwobG9uZyBwb3MpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIuc2Vla1RvKHBvcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQFBsYXllclN0YXRlIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlVOS05PV05fVElNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlVOS05PV05fVElNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcl9pbXBsKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoQE5vbk51bGwgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgaWYgKGhlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJoZWxwZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtRHNtSGVscGVyID0gaGVscGVyOwotICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoaGVscGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtRHNtSGVscGVyID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5jbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIEVuZm9yY2VzIGRldmVsb3BlcnMgdG8gY2FsbCBhbGwgdGhlIG1ldGhvZHMgb24gdGhlIGluaXRpYWxseSBnaXZlbiB0aHJlYWQKLSAgICAvLyBiZWNhdXNlIGNhbGxzIGZyb20gdGhlIE1lZGlhQ29udHJvbGxlcjIgd2lsbCBiZSBydW4gb24gdGhlIHRocmVhZC4KLSAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBhbGxvdyBjYWxscyBmcm9tIHRoZSBtdWx0aXBsZSB0aHJlYWQ/Ci0gICAgLy8gICAgICAgICAgICAgICBJIHByZWZlciB0aGlzIHdheSBiZWNhdXNlIGFsbG93aW5nIG11bHRpcGxlIHRocmVhZCBtYXkgY2FzZSB0cmlja3kgaXNzdWUgbGlrZQotICAgIC8vICAgICAgICAgICAgICAgYi82MzQ0NjM2MC4gSWYgdGhlIHtAbGluayAjc2V0UGxheWVyKCl9IHdpdGgge0Bjb2RlIG51bGx9IGNhbiBiZSBjYWxsZWQgZnJvbQotICAgIC8vICAgICAgICAgICAgICAgYW5vdGhlciB0aHJlYWQsIHRyYW5zcG9ydCBjb250cm9scyBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoYXQuCi0gICAgLy8gICAgICAgICAgICAgICBUaGF0J3MgYmFzaWNhbGx5IHRoZSBkZXZlbG9wZXIncyBtaXN0YWtlLCBidXQgdGhleSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0J3MKLSAgICAvLyAgICAgICAgICAgICAgIGhhcHBlbmluZyBiZWhpbmQgdW50aWwgd2UgdGVsbCB0aGVtIHNvLgotICAgIC8vICAgICAgICAgICAgICAgSWYgZW5mb3JjaW5nIGNhbGxsaW5nIHRocmVhZCBkb2Vzbid0IGxvb2sgZ29vZCwgd2UgY2FuIGFsdGVybmF0aXZlbHkgcGljawotICAgIC8vICAgICAgICAgICAgICAgMS4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMuCi0gICAgLy8gICAgICAgICAgICAgICAyLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcywgZXhjZXB0IGZvciB0aGUKLSAgICAvLyAgICAgICAgICAgICAgICAgIHtAbGluayAjc2V0UGxheWVyKCl9LgotICAgIHZvaWQgZW5zdXJlQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBVbmNvbW1lbnQgb3IgcmVtb3ZlCi0gICAgICAgIC8qCi0gICAgICAgIGlmIChtSGFuZGxlci5nZXRMb29wZXIoKSAhPSBMb29wZXIubXlMb29wZXIoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUnVuIHRoaXMgb24gdGhlIGdpdmVuIHRocmVhZCIpOwotICAgICAgICB9Ki8KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKGxpc3QsIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE5vdExvY2tlZChtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE5vdExvY2tlZChyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWROb3RMb2NrZWQoc2h1ZmZsZU1vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKE1lZGlhUGxheWVyQmFzZSBvbGRQbGF5ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApIEZpbmQgYmV0dGVyIHdheSBmb3IgcGxheWVyLmdldFBsYXllclN0YXRlKCkgLy8KLSAgICAgICAgLy8gICAgICAgICAgICAgICBJbiB0aGVvcnksIFNlc3Npb24uZ2V0WFhYKCkgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBQbGF5ZXIuZ2V0WFhYKCkKLSAgICAgICAgLy8gICAgICAgICAgICAgICBhbmQgd2Ugc2hvdWxkIG5vdGlmeSBpbmZvcm1hdGlvbiBvZiB0aGUgc2Vzc2lvbi5nZXRYWFgoKSBpbnN0ZWFkIG9mCi0gICAgICAgIC8vICAgICAgICAgICAgICAgcGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vIE5vdGlmeSB0byBjb250cm9sbGVycyBhcyB3ZWxsLgotICAgICAgICBmaW5hbCBpbnQgc3RhdGUgPSBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IG9sZFBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWVyU3RhdGVDaGFuZ2VkTm90TG9ja2VkKHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWVNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uID0gcGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICBpZiAocG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGN1cnJlbnRUaW1lTXMsIHBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGZsb2F0IHNwZWVkID0gcGxheWVyLmdldFBsYXliYWNrU3BlZWQoKTsKLSAgICAgICAgaWYgKHNwZWVkICE9IG9sZFBsYXllci5nZXRQbGF5YmFja1NwZWVkKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChzcGVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICBpZiAoYnVmZmVyZWRQb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoYnVmZmVyZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWVyOwotICAgIH0KLQotICAgIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50KCkgewotICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgfQotCi0gICAgRXhlY3V0b3IgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIH0KLQotICAgIFNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1DYWxsYmFjazsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yU3R1YiBnZXRTZXNzaW9uU3R1YigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uU3R1YjsKLSAgICB9Ci0KLSAgICBWb2x1bWVQcm92aWRlcjIgZ2V0Vm9sdW1lUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgUGxheWJhY2tJbmZvIGdldFBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5ZXJFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXllckV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ3VycmVudE1lZGlhSXRlbUNoYW5nZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0pOwotICAgICAgICAgICAgICAgIC8vIFRPRE8gKGphZXdhbik6IE5vdGlmeSBjb250cm9sbGVycyB0aHJvdWdoIGFwcHJvcHJpYXRlIGNhbGxiYWNrLiAoYi83NDUwNTkzNikKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWVkaWFQcmVwYXJlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbk1lZGlhUHJlcGFyZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0pOwotICAgICAgICAgICAgICAgIC8vIFRPRE8gKGphZXdhbik6IE5vdGlmeSBjb250cm9sbGVycyB0aHJvdWdoIGFwcHJvcHJpYXRlIGNhbGxiYWNrLiAoYi83NDUwNTkzNikKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBtcGIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFNlc3Npb25TdHViKCkubm90aWZ5UGxheWVyU3RhdGVDaGFuZ2VkTm90TG9ja2VkKHN0YXRlKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIC8vIFRPRE8gKGphZXdhbik6IE5vdGlmeSBjb250cm9sbGVycyB0aHJvdWdoIGFwcHJvcHJpYXRlIGNhbGxiYWNrLiAoYi83NDUwNTkzNikKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBnZXRTZXNzaW9uKCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbShNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IHNlc3Npb24uZ2V0UGxheWxpc3RBZ2VudCgpOwotICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGFnZW50LmdldE1lZGlhSXRlbShkc2QpOwotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb3VsZCBub3QgZmluZCBtYXRjaGluZyBpdGVtIGZvciBkc2Q9IiArIGRzZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgICAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbW1hbmRJbXBsIGltcGxlbWVudHMgQ29tbWFuZFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5EX0NPREUKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY29tbWFuZF9jb2RlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmN1c3RvbV9jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5EX0VYVFJBUwotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5leHRyYXMiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNvbW1hbmQyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbW1hbmRDb2RlOwotICAgICAgICAvLyBOb25udWxsIGlmIGl0J3MgY3VzdG9tIGNvbW1hbmQKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IGNvbW1hbmRDb2RlOwotICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBudWxsOwotICAgICAgICAgICAgbUV4dHJhcyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBATm9uTnVsbCBTdHJpbmcgYWN0aW9uLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gQ09NTUFORF9DT0RFX0NVU1RPTTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gYWN0aW9uOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbW1hbmRDb2RlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldEN1c3RvbUNvbW1hbmRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VzdG9tQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgQnVuZGxlIGluc3RhbmNlIGZyb20gdGhlIENvbW1hbmQKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ09NTUFORF9DT0RFLCBtQ29tbWFuZENvZGUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCwgbUN1c3RvbUNvbW1hbmQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfQ09NTUFORF9FWFRSQVMsIG1FeHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IENvbW1hbmQgaW5zdGFuY2UgZnJvbSB0aGUgQnVuZGxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFNlc3Npb25Db21tYW5kMiBmcm9tQnVuZGxlX2ltcGwoQE5vbk51bGwgQnVuZGxlIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgY29kZSA9IGNvbW1hbmQuZ2V0SW50KEtFWV9DT01NQU5EX0NPREUpOwotICAgICAgICAgICAgaWYgKGNvZGUgIT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGNvZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VzdG9tQ29tbWFuZCA9IGNvbW1hbmQuZ2V0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5EKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VzdG9tQ29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjdXN0b21Db21tYW5kLCBjb21tYW5kLmdldEJ1bmRsZShLRVlfQ09NTUFORF9FWFRSQVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb21tYW5kSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kSW1wbCBvdGhlciA9IChDb21tYW5kSW1wbCkgb2JqOwotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb21wYXJlIENvbW1hbmRzIHdpdGggdGhlIGdlbmVyYXRlZCBVVUlELCBhcyB3ZSdyZSBkb2luZyBmb3IgdGhlIE1JMi4KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGUgPT0gb3RoZXIubUNvbW1hbmRDb2RlCi0gICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUN1c3RvbUNvbW1hbmQsIG90aGVyLm1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgICAgIHJldHVybiAoKG1DdXN0b21Db21tYW5kICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbUN1c3RvbUNvbW1hbmQuaGFzaENvZGUoKSA6IDApICogcHJpbWUgKyBtQ29tbWFuZENvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnQgc2V0IG9mIHtAbGluayBTZXNzaW9uQ29tbWFuZDJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWFuZEdyb3VwSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRHcm91cFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5EUyA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFzZXNzaW9uMi5jb21tYW5kZ3JvdXAuY29tbWFuZHMiOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgYWxsIGNvbW1hbmQgY29kZXMKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9DT01NQU5EX0NPREUgPSAiQ09NTUFORF9DT0RFXyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBjb21tYW5kIGNvZGVzIHRoYXQgd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSBNZWRpYVBsYXllckJhc2UKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0sgPSAiQ09NTUFORF9DT0RFX1BMQVlCQUNLXyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBjb21tYW5kIGNvZGVzIHRoYXQgd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSBNZWRpYVBsYXlsaXN0QWdlbnQKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QgPSAiQ09NTUFORF9DT0RFX1BMQVlMSVNUXyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBtQ29tbWFuZHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgbUluc3RhbmNlOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgaWYgKG90aGVyICE9IG51bGwgJiYgb3RoZXIgaW5zdGFuY2VvZiBDb21tYW5kR3JvdXBJbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmRzLmFkZEFsbCgoKENvbW1hbmRHcm91cEltcGwpIG90aGVyKS5tQ29tbWFuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbW1hbmRzLmFkZChjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGxQcmVkZWZpbmVkQ29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIGFkZENvbW1hbmRzV2l0aFByZWZpeChQUkVGSVhfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkQWxsUGxheWJhY2tDb21tYW5kcygpIHsKLSAgICAgICAgICAgIGFkZENvbW1hbmRzV2l0aFByZWZpeChQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkQWxsUGxheWxpc3RDb21tYW5kcygpIHsKLSAgICAgICAgICAgIGFkZENvbW1hbmRzV2l0aFByZWZpeChQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRDb21tYW5kc1dpdGhQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCk6IERvbid0IHVzZSByZWZsZWN0aW9uIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICAgICAgICBmaW5hbCBGaWVsZFtdIGZpZWxkcyA9IE1lZGlhU2Vzc2lvbjIuY2xhc3MuZ2V0RmllbGRzKCk7Ci0gICAgICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbW1hbmRzLmFkZChuZXcgU2Vzc2lvbkNvbW1hbmQyKGZpZWxkc1tpXS5nZXRJbnQobnVsbCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgIiArIGZpZWxkc1tpXSArICIgaW4gTWVkaWFTZXNzaW9uMiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5yZW1vdmUoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kcy5jb250YWlucyhjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoaW50IGNvZGUpIHsKLSAgICAgICAgICAgIGlmIChjb2RlID09IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVc2UgaGFzQ29tbWFuZChDb21tYW5kKSBmb3IgY3VzdG9tIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBtQ29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC5nZXRDb21tYW5kQ29kZSgpID09IGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbW1hbmRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG1Db21tYW5kcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBuZXcgYnVuZGxlIGZyb20gdGhlIENvbW1hbmRHcm91cAotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBtQ29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChjb21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT01NQU5EUywgbGlzdCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIENvbW1hbmRHcm91cCBmcm9tIHRoZSBidW5kbGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQE51bGxhYmxlIFNlc3Npb25Db21tYW5kR3JvdXAyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgY29tbWFuZHMpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PFBhcmNlbGFibGU+IGxpc3QgPSBjb21tYW5kcy5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT01NQU5EUyk7Ci0gICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kR3JvdXAgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmNlbGFibGUgcGFyY2VsYWJsZSA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKHBhcmNlbGFibGUgaW5zdGFuY2VvZiBCdW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IChCdW5kbGUpIHBhcmNlbGFibGU7Ci0gICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRHcm91cC5hZGRDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21tYW5kR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRyb2xsZXJJbmZvSW1wbCBpbXBsZW1lbnRzIENvbnRyb2xsZXJJbmZvUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJJbmZvIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVVpZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVHJ1c3RlZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBtQ29udHJvbGxlckJpbmRlcjsKLQotICAgICAgICBwdWJsaWMgQ29udHJvbGxlckluZm9JbXBsKENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsCi0gICAgICAgICAgICAgICAgaW50IHBpZCwgQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLCBATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1VaWQgPSB1aWQ7Ci0gICAgICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgICAgIG1Db250cm9sbGVyQmluZGVyID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgICAgICAvLyBBc2sgc2VydmVyIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgdHJ1c3RlZC4KLSAgICAgICAgICAgIC8vIEFwcCBjYW5ub3Qga25vdyB0aGlzIGJlY2F1c2UgYXBwcyBjYW5ub3QgcXVlcnkgZW5hYmxlZCBub3RpZmljYXRpb24gbGlzdGVuZXIgZm9yCi0gICAgICAgICAgICAvLyBhbm90aGVyIHBhY2thZ2UsIGJ1dCBzeXN0ZW0gc2VydmVyIGNhbiBkby4KLSAgICAgICAgICAgIG1Jc1RydXN0ZWQgPSBtYW5hZ2VyLmlzVHJ1c3RlZEZvck1lZGlhQ29udHJvbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbk1hbmFnZXIuUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUcnVzdGVkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlzVHJ1c3RlZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXF1YWxzKCgoQ29udHJvbGxlckluZm8pIG9iaikuZ2V0UHJvdmlkZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuICJDb250cm9sbGVySW5mbyB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiLCB1aWQ9IiArIG1VaWQgKyAiLCB0cnVzdGVkPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtSXNUcnVzdGVkICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm9JbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBvdGhlciA9IChDb250cm9sbGVySW5mb0ltcGwpIG9iajsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpLmVxdWFscyhvdGhlci5tQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRyb2xsZXJJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIElCaW5kZXIgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgQ29udHJvbGxlckluZm9JbXBsIGZyb20oQ29udHJvbGxlckluZm8gY29udHJvbGxlcikgewotICAgICAgICAgICAgcmV0dXJuIChDb250cm9sbGVySW5mb0ltcGwpIGNvbnRyb2xsZXIuZ2V0UHJvdmlkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWFuZEJ1dHRvbkltcGwgaW1wbGVtZW50cyBDb21tYW5kQnV0dG9uUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmNvbW1hbmQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lDT05fUkVTX0lECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5pY29uX3Jlc19pZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRElTUExBWV9OQU1FCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5kaXNwbGF5X25hbWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUwotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZXh0cmFzIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkFCTEVECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5lbmFibGVkIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24gbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUljb25SZXNJZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b25JbXBsKEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgaW50IGljb25SZXNJZCwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGRpc3BsYXlOYW1lLCBCdW5kbGUgZXh0cmFzLCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgIG1JY29uUmVzSWQgPSBpY29uUmVzSWQ7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgQ29tbWFuZEJ1dHRvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlCi0gICAgICAgIFNlc3Npb25Db21tYW5kMiBnZXRDb21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRJY29uUmVzSWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldERpc3BsYXlOYW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBCdW5kbGUgdG9CdW5kbGUoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfQ09NTUFORCwgbUNvbW1hbmQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9JQ09OX1JFU19JRCwgbUljb25SZXNJZCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9ESVNQTEFZX05BTUUsIG1EaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIG1FeHRyYXMpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oS0VZX0VOQUJMRUQsIG1FbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgQE51bGxhYmxlIENvbW1hbmRCdXR0b24gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbW1hbmRCdXR0b24uQnVpbGRlciBidWlsZGVyID0gbmV3IENvbW1hbmRCdXR0b24uQnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRDb21tYW5kKFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGJ1bmRsZS5nZXRCdW5kbGUoS0VZX0NPTU1BTkQpKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEljb25SZXNJZChidW5kbGUuZ2V0SW50KEtFWV9JQ09OX1JFU19JRCwgMCkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXREaXNwbGF5TmFtZShidW5kbGUuZ2V0U3RyaW5nKEtFWV9ESVNQTEFZX05BTUUpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RXh0cmFzKGJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUykpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGJ1bmRsZS5nZXRCb29sZWFuKEtFWV9FTkFCTEVEKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE1hbGZvcm1lZCBvciB2ZXJzaW9uIG1pc21hdGNoLiBSZXR1cm4gbnVsbCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBDb21tYW5kQnV0dG9ufS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBDb21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUljb25SZXNJZDsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb21tYW5kQnV0dG9uLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRDb21tYW5kX2ltcGwoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEljb25SZXNJZF9pbXBsKGludCByZXNJZCkgewotICAgICAgICAgICAgICAgIG1JY29uUmVzSWQgPSByZXNJZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0RGlzcGxheU5hbWVfaW1wbChTdHJpbmcgZGlzcGxheU5hbWUpIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0RXh0cmFzX2ltcGwoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAmJiBtQ29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVuYWJsZWQgYnV0dG9uIG5lZWRzIENvbW1hbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBjb250cm9sbGVyIHRvIGludm9rZSB0aGUgY29tbWFuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbW1hbmQgIT0gbnVsbCAmJiBtQ29tbWFuZC5nZXRDb21tYW5kQ29kZSgpID09IENPTU1BTkRfQ09ERV9DVVNUT00KLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtSWNvblJlc0lkID09IDAgfHwgVGV4dFV0aWxzLmlzRW1wdHkobURpc3BsYXlOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ3VzdG9tIGNvbW1hbmRzIG5lZWRzIGljb24gYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbmFtZSB0byBkaXNwbGF5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWFuZEJ1dHRvbkltcGwobUNvbW1hbmQsIG1JY29uUmVzSWQsIG1EaXNwbGF5TmFtZSwgbUV4dHJhcywgbUVuYWJsZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAubUluc3RhbmNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBCdWlsZGVyQmFzZUltcGw8VCBleHRlbmRzIE1lZGlhU2Vzc2lvbjIsIEMgZXh0ZW5kcyBTZXNzaW9uQ2FsbGJhY2s+Ci0gICAgICAgICAgICBpbXBsZW1lbnRzIEJ1aWxkZXJCYXNlUHJvdmlkZXI8VCwgQz4gewotICAgICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgICAgICBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICAgICAgU3RyaW5nIG1JZDsKLSAgICAgICAgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIEMgbUNhbGxiYWNrOwotICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb250ZXh0IGEgY29udGV4dAotICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBwbGF5ZXIgaXMgYQotICAgICAgICAgKiAgICAgIHtAbGluayBNZWRpYVNlc3Npb24yfSBvciB7QGxpbmsgTWVkaWFDb250cm9sbGVyMn0uCi0gICAgICAgICAqLwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFsc28gbmVlZCBleGVjdXRvcgotICAgICAgICBwdWJsaWMgQnVpbGRlckJhc2VJbXBsKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIC8vIEVuc3VyZSBub24tbnVsbAotICAgICAgICAgICAgbUlkID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyX2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0QWdlbnRfaW1wbChATm9uTnVsbCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXlsaXN0QWdlbnQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gcGxheWxpc3RBZ2VudDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVQcm92aWRlcl9pbXBsKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkFjdGl2aXR5X2ltcGwoUGVuZGluZ0ludGVudCBwaSkgewotICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHBpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldElkX2ltcGwoQE5vbk51bGwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgQyBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUIGJ1aWxkX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGV4dGVuZHMgQnVpbGRlckJhc2VJbXBsPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gewotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29udGV4dCBjb250ZXh0LCBCdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja0V4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IG1Db250ZXh0LmdldE1haW5FeGVjdXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrID0gbmV3IFNlc3Npb25DYWxsYmFjaygpIHt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY1N2Q3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMlN0dWIgZXh0ZW5kcyBJTWVkaWFTZXNzaW9uMi5TdHViIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX1BPU0lUSU9OID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3Bvc2l0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9JVEVNX0lOREVYID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X2l0ZW1faW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX1BMQVlMSVNUX1BBUkFNUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcGxheWxpc3RfcGFyYW1zIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IFJlbmFtZS4KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFNlc3Npb25Db21tYW5kMj4gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCA9Ci0gICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8PigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPElCaW5kZXIsIENvbnRyb2xsZXJJbmZvPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJQmluZGVyPiBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXNzaW9uQ29tbWFuZEdyb3VwMj4gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAgPQotICAgICAgICAgICAgbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2V0PFN0cmluZz4+IG1TdWJzY3JpcHRpb25zID0gbmV3IEFycmF5TWFwPD4oKTsKLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yU3R1YihNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ29tbWFuZEdyb3VwSW1wbCBncm91cCA9IG5ldyBDb21tYW5kR3JvdXBJbXBsKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWJhY2tDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBjb21tYW5kcyA9IGdyb3VwLmdldENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QuYXBwZW5kKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSwgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveU5vdExvY2tlZCgpIHsKLSAgICAgICAgZmluYWwgTGlzdDxDb250cm9sbGVySW5mbz4gbGlzdDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVNlc3Npb24uY2xlYXIoKTsKLSAgICAgICAgICAgIGxpc3QgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBjb250cm9sbGVyQmluZGVyID0KLSAgICAgICAgICAgICAgICAgICAgKChDb250cm9sbGVySW5mb0ltcGwpIGxpc3QuZ2V0KGkpLmdldFByb3ZpZGVyKCkpLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgaG9sZCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICAgICAgICAgICAgICBjb250cm9sbGVyQmluZGVyLm9uRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgaXMgZ29uZS4gU2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB3ZSdyZSBkZXN0cm95aW5nLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBnZXRTZXNzaW9uKCkgewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGdldExpYnJhcnlTZXNzaW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXNzaW9uIGlzbid0IGEgbGlicmFyeSBzZXNzaW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCkgc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gbUNvbnRyb2xsZXJzLmdldChjYWxsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXMgZGlzY29ubmVjdGVkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlcikgewotICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldFNlc3Npb24oKSBhbHJlYWR5IGxvZ2dlZCBpZiBzZXNzaW9uIGlzIGNsb3NlZC4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvSW1wbCBpbXBsID0gQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlcik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuZ2V0KGltcGwuZ2V0SWQoKSkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmNvbnRhaW5zKGltcGwuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbC5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIgKyAiIGlzbid0IGNvbm5lY3RlZCBub3IgY29ubmVjdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25SdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QuZ2V0KGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGFjY2VwdGVkID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ29tbWFuZFJlcXVlc3Qoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhY2NlcHRlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBydW4gcmVqZWN0ZWQgY29tbWFuZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb21tYW5kIChjb2RlPSIgKyBjb21tYW5kQ29kZSArICIpIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIgKyAiIHdhcyByZWplY3RlZCBieSAiICsgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQnJvd3NlckNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlicmFyeVNlc3Npb25SdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uID0gZ2V0TGlicmFyeVNlc3Npb24oKTsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChpbnQgY29tbWFuZENvZGUsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIExpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlcnMuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXJzLmdldChpKSwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIExpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlcnMuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXJzLmdldChpKSksIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnkoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlciwgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKSwgcnVubmFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnkoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgaW50IGNvbW1hbmRDb2RlLAotICAgICAgICAgICAgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlciwgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICAvLyBEbyBub3QgY2FsbCB0aGlzIEFQSSBkaXJlY3RseS4gVXNlIG5vdGlmeSgpIGluc3RlYWQuCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUludGVybmFsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlciwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCB8fCBpQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihjb250cm9sbGVyLCBpQ29udHJvbGxlcik7Ci0gICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyLnRvU3RyaW5nKCkgKyAiIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChpQ29udHJvbGxlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDdXJyZW50bHkgaXQncyBUcmFuc2FjdGlvblRvb0xhcmdlRXhjZXB0aW9uIG9yIERlYWRTeXN0ZW1FeGNlcHRpb24uCi0gICAgICAgICAgICAvLyBXZSdkIGJldHRlciB0byBsZWF2ZSBsb2cgZm9yIHRob3NlIGNhc2VzIGJlY2F1c2UKLSAgICAgICAgICAgIC8vICAgLSBUcmFuc2FjdGlvblRvb0xhcmdlRXhjZXB0aW9uIG1lYW5zIHRoYXQgd2UgbWF5IG5lZWQgdG8gZml4IG91ciBjb2RlLgotICAgICAgICAgICAgLy8gICAgIChlLmcuIGFkZCBwYWdpbmF0aW9uIG9yIHNwZWNpYWwgd2F5IHRvIGRlbGl2ZXIgQml0bWFwKQotICAgICAgICAgICAgLy8gICAtIERlYWRTeXN0ZW1FeGNlcHRpb24gbWVhbnMgdGhhdCBlcnJvcnMgYXJvdW5kIGl0IGNhbiBiZSBpZ25vcmVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiRXhjZXB0aW9uIGluICIgKyBjb250cm9sbGVyLnRvU3RyaW5nKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ29udHJvbGxlckNsb3NlZChJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgewotICAgICAgICBDb250cm9sbGVySW5mbyBjb250cm9sbGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLnJlbW92ZShpQ29udHJvbGxlci5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2luZyAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkRpc2Nvbm5lY3RlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBzZXNzaW9uIG92ZXJyaWRlcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gc2Vzc2lvbi5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gbmV3IENvbnRyb2xsZXJJbmZvKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgQmluZGVyLmdldENhbGxpbmdVaWQoKSwgQmluZGVyLmdldENhbGxpbmdQaWQoKSwgY2FsbGluZ1BhY2thZ2UsIGNhbGxlcik7Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIC8vIEtlZXAgY29ubmVjdGluZyBjb250cm9sbGVycy4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGhlbHBzIHNlc3Npb25zIHRvIGNhbGwgQVBJcyBpbiB0aGUgb25Db25uZWN0KCkgKGUuZy4gc2V0Q3VzdG9tTGF5b3V0KCkpCi0gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBwZW5kaW5nIHRoZW0uCi0gICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5hZGQoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ29ubmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAvLyBEb24ndCByZWplY3QgY29ubmVjdGlvbiBmb3IgdGhlIHJlcXVlc3QgZnJvbSB0cnVzdGVkIGFwcC4KLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBmYWlsIHRvIHJldHJpZXZlIHNlc3Npb24ncyBpbmZvcm1hdGlvbiB0byBkaXNwYXRjaAotICAgICAgICAgICAgLy8gbWVkaWEga2V5cyB0by4KLSAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ID0gYWxsb3dlZENvbW1hbmRzICE9IG51bGwgfHwgY29udHJvbGxlckluZm8uaXNUcnVzdGVkKCk7Ci0gICAgICAgICAgICBpZiAoYWNjZXB0KSB7Ci0gICAgICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIGNvbnRyb2xsZXJJbXBsID0gQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBY2NlcHRpbmcgY29ubmVjdGlvbiwgY29udHJvbGxlckluZm89IiArIGNvbnRyb2xsZXJJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvciB0cnVzdGVkIGFwcHMsIHNlbmQgbm9uLW51bGwgYWxsb3dlZCBjb21tYW5kcyB0byBrZWVwIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcyA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKGNvbnRyb2xsZXJJbXBsLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJbXBsLmdldElkKCksICBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVySW5mbywgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgY29ubmVjdGlvbiBpcyBhY2NlcHRlZCwgbm90aWZ5IHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoZSBjb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIEl0J3MgbmVlZGVkIGJlY2F1c2Ugd2UgY2Fubm90IGNhbGwgc3luY2hyb25vdXMgY2FsbHMgYmV0d2VlbiBzZXNzaW9uL2NvbnRyb2xsZXIuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UncmUgZG9pbmcgdGhpcyBhZnRlciB0aGUgb25Db25uZWN0aW9uQ2hhbmdlZCgpLCBidXQgdGhlcmUncyBubyBndWFyYW50ZWUKLSAgICAgICAgICAgICAgICAvLyAgICAgICB0aGF0IGV2ZW50cyBoZXJlIGFyZSBub3RpZmllZCBhZnRlciB0aGUgb25Db25uZWN0ZWQoKSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgSU1lZGlhQ29udHJvbGxlcjIgaXMgb25ld2F5IChpLmUuIGFzeW5jIGNhbGwpIGFuZCBTdHViIHdpbGwKLSAgICAgICAgICAgICAgICAvLyAgICAgICB1c2UgdGhyZWFkIHBvbGwgZm9yIGluY29taW5nIGNhbGxzLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcyA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXliYWNrU3BlZWQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcyA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9ICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0UGxheWJhY2tJbmZvKCkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVwZWF0TW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFNodWZmbGVNb2RlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uLmdldFNlc3Npb25BY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWxpc3QoKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRmluZCBhIHdheSB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgaXRlbUJ1bmRsZSA9IGl0ZW0udG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLmFkZChpdGVtQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRG91YmxlIGNoZWNrIGlmIHNlc3Npb24gaXMgc3RpbGwgdGhlcmUsIGJlY2F1c2UgY2xvc2UoKSBjYW4gYmUgY2FsbGVkIGluIGFub3RoZXIKLSAgICAgICAgICAgICAgICAvLyB0aHJlYWQuCi0gICAgICAgICAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGVyLm9uQ29ubmVjdGVkKE1lZGlhU2Vzc2lvbjJTdHViLnRoaXMsIGFsbG93ZWRDb21tYW5kcy50b0J1bmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclN0YXRlLCBwb3NpdGlvbkV2ZW50VGltZU1zLCBwb3NpdGlvbk1zLCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUG9zaXRpb25NcywgcGxheWJhY2tJbmZvQnVuZGxlLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBoZXJlLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWplY3RpbmcgY29ubmVjdGlvbiwgY29udHJvbGxlckluZm89IiArIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGVyLm9uRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFuIGlzc3VlIGJlY2F1c2Ugd2UnbGwgaWdub3JlIGl0IGFueXdheS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGNhbGxlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG8oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBpbnQgdmFsdWUsIGZpbmFsIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogU2V0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uU2V0Vm9sdW1lVG8odmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGp1c3QgbG9jYWwgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25BZGp1c3RWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIEJ1bmRsZSBhcmdzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIGNvbW1hbmRDb2RlLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUEFVU0U6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU1RPUDoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkU6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TRUVLX1RPOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2Vla1RvKGFyZ3MuZ2V0TG9uZyhBUkdVTUVOVF9LRVlfUE9TSVRJT04pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXNlbmQgdW5rbm93biAobmV3KSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjdXN0b20gY29tbWFuZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgY29tbWFuZEJ1bmRsZSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmdzLCBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAic2VuZEN1c3RvbUNvbW1hbmQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kIGZyb20gIgotICAgICAgICAgICAgICAgICAgICArIGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ3VzdG9tQ29tbWFuZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmkoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBVcmkgdXJpLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tVXJpKCk6IElnbm9yaW5nIG51bGwgdXJpIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tVXJpKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNILAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tU2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmkoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBVcmkgdXJpLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tVXJpKCk6IElnbm9yaW5nIG51bGwgdXJpIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tVXJpKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2goZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNILAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tU2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbU1lZGlhSWQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmcoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByYXRpbmdCdW5kbGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1NFVF9SQVRJTkcsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIHJhdGluZ0J1bmRsZSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBSYXRpbmcyIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShyYXRpbmdCdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIHJhdGluZyBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2V0UmF0aW5nKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgbWVkaWFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgTGlzdDxCdW5kbGU+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGxheWxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFBsYXlsaXN0KCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVjcmVhdGVzIFVVSUQgaW4gdGhlIHBsYXlsaXN0Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShwbGF5bGlzdC5nZXQoaSksIG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFBsYXlsaXN0KGxpc3QsIE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkudXBkYXRlUGxheWxpc3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgVVVJRCBmcm9tIHRoZSBpbmNvbWluZyBtZWRpYSBpZCwgc28gY29udHJvbGxlciBtYXkgcmV1c2UgYSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIG11bHRpcGxlIHRpbWVzIGZvciBhZGRQbGF5bGlzdEl0ZW0uCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pOwotICAgICAgICAgICAgLy8gTm90ZTogTWVkaWFJdGVtMiBoYXMgaGlkZGVuIFVVSUQgdG8gaWRlbnRpZnkgaXQgYWNyb3NzIHRoZSBwcm9jZXNzZXMuCi0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgVVVJRCBmcm9tIHRoZSBpbmNvbWluZyBtZWRpYSBpZCwgc28gY29udHJvbGxlciBtYXkgcmV1c2UgYSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIG11bHRpcGxlIHRpbWVzIGZvciByZXBsYWNlUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucmVwbGFjZVBsYXlsaXN0SXRlbShpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX1RPX1BMQVlMSVNUX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJza2lwVG9QbGF5bGlzdEl0ZW0oKTogSWdub3JpbmcgbnVsbCBtZWRpYUl0ZW0gZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogTWVkaWFJdGVtMiBoYXMgaGlkZGVuIFVVSUQgdG8gaWRlbnRpZnkgaXQgYWNyb3NzIHRoZSBwcm9jZXNzZXMuCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QbGF5bGlzdEl0ZW0oTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX1BSRVZfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9ORVhUX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBSURMIG1ldGhvZHMgZm9yIExpYnJhcnlTZXNzaW9uIG92ZXJyaWRlcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldExpYnJhcnlSb290KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIHJvb3RIaW50cykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBmaW5hbCBMaWJyYXJ5Um9vdCByb290ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0TGlicmFyeVJvb3Qoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCByb290SGludHMpOwotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0Um9vdElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldEl0ZW0oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgcmVzdWx0ID09IG51bGwgPyBudWxsIDogcmVzdWx0LnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRDaGlsZHJlbihzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuc2l6ZSgpID4gcGFnZVNpemUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbkdldENoaWxkcmVuKCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSBpdGVtcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBhZ2UgLyBwYWdlU2l6ZS4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgcGFnZT0iICsgcGFnZSArICIgcGFnZVNpemU9IiArIHBhZ2VTaXplICsgIiBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldFNlYXJjaFJlc3VsdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuc2l6ZSgpID4gcGFnZVNpemUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbkdldFNlYXJjaFJlc3VsdCgpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRlbXMgbW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRpb24pIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInN1YnNjcmliZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhcmVudElkLCBvcHRpb24pOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbiA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5wdXQoY29udHJvbGxlciwgc3Vic2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChwYXJlbnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ1bnN1YnNjcmliZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblVuc3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcGFyZW50SWQpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhU2Vzc2lvbjJJbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIFBvc3QtUCkgTmVlZCBhIHdheSB0byBnZXQgY29udHJvbGxlciB3aXRoIHBlcm1pc3Npb25zCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbnRyb2xsZXJzKCkgewotICAgICAgICBBcnJheUxpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlcnMuYWRkKG1Db250cm9sbGVycy52YWx1ZUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcnM7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWVyU3RhdGVDaGFuZ2VkTm90TG9ja2VkKGludCBzdGF0ZSkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXllclN0YXRlQ2hhbmdlZChzdGF0ZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBvc2l0aW9uQ2hhbmdlZChldmVudFRpbWVNcywgcG9zaXRpb25Ncyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWJhY2tTcGVlZENoYW5nZWQoc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBsYXlvdXRCdW5kbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxheW91dC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoKENvbW1hbmRCdXR0b25JbXBsKSBsYXlvdXQuZ2V0KGkpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dEJ1bmRsZXMuYWRkKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dEJ1bmRsZXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQoTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgIGlmIChwbGF5bGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0LmdldChpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBwbGF5bGlzdC5nZXQoaSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0Q2hhbmdlZChidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE5vdExvY2tlZChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEsCi0gICAgICAgICAgICAgICAgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblJlcGVhdE1vZGVDaGFuZ2VkKHJlcGVhdE1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWROb3RMb2NrZWQoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TaHVmZmxlTW9kZUNoYW5nZWQoc2h1ZmZsZU1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja0luZm9DaGFuZ2VkKE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbykgewotICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0KLSAgICAgICAgICAgICAgICAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpIHBsYXliYWNrSW5mby5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWJhY2tJbmZvQ2hhbmdlZChwbGF5YmFja0luZm9CdW5kbGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHMoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXIsIGNvbW1hbmRzKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChjb21tYW5kcy50b0J1bmRsZSgpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKHJlY2VpdmVyICE9IG51bGwgJiYgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIGlmIHJlc3VsdCByZWNlaXZlciBpcyIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gY29tbWFuZC50b0J1bmRsZSgpOwotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gY29tbWFuZC50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVBJcyBmb3IgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdWJzY3JpYmVkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb25zID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMgPT0gbnVsbCB8fCAhc3Vic2NyaXB0aW9ucy5jb250YWlucyhwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1pc2MKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIFNlc3Npb25SdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgTGlicmFyeVNlc3Npb25SdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24sIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgTm90aWZ5UnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNlYjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyLk1lZGlhTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVG9rZW5UeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vLyBUT0RPKGphZXdhbik6IE5lZWQgYSB0ZXN0IGZvciBzZXNzaW9uIHNlcnZpY2UgaXRzZWxmLgotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNUFNlc3Npb25TZXJ2aWNlIjsgLy8gdG8gbWVldCAyMyBjaGFyIGxpbWl0IGluIExvZyB0YWcKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UgdGhpcy4gKGIvNzQwOTQ2MTEpCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IFNlc3Npb25TZXJ2aWNlRXZlbnRDYWxsYmFjaygpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZpY2F0aW9uTWFuYWdlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBJbnRlbnQgbVN0YXJ0U2VsZkludGVudDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nRm9yZWdyb3VuZDsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjIgbVNlc3Npb247Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsKE1lZGlhU2Vzc2lvblNlcnZpY2UyIGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsKCIgKyBpbnN0YW5jZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpOwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uIG9uVXBkYXRlTm90aWZpY2F0aW9uX2ltcGwoKSB7Ci0gICAgICAgIC8vIFByb3ZpZGUgZGVmYXVsdCBub3RpZmljYXRpb24gVUkgbGF0ZXIuCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1JbnN0YW5jZS5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9TRVJWSUNFKTsKLSAgICAgICAgbVN0YXJ0U2VsZkludGVudCA9IG5ldyBJbnRlbnQobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4yKG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSAhPSBnZXRTZXNzaW9uVHlwZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiBzZXJ2aWNlLCBidXQgd2FzICIgKyB0b2tlbi5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uID0gbUluc3RhbmNlLm9uQ3JlYXRlU2Vzc2lvbih0b2tlbi5nZXRJZCgpKTsKLSAgICAgICAgaWYgKG1TZXNzaW9uID09IG51bGwgfHwgIXRva2VuLmdldElkKCkuZXF1YWxzKG1TZXNzaW9uLmdldFRva2VuKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHdpdGggaWQgIiArIHRva2VuLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBidXQgZ290ICIgKyBtU2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBVbmNvbW1lbnQgaGVyZS4KLSAgICAgICAgLy8gbVNlc3Npb24ucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFjaywgbVNlc3Npb24uZ2V0RXhlY3V0b3IoKSk7Ci0gICAgfQotCi0gICAgQFRva2VuVHlwZSBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZF9pbXBsKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNZWRpYVNlc3Npb24ySW1wbCkgbVNlc3Npb24uZ2V0UHJvdmlkZXIoKSkuZ2V0U2Vzc2lvblN0dWIoKS5hc0JpbmRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oaW50IHBsYXllclN0YXRlKSB7Ci0gICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIG1lZGlhTm90aWZpY2F0aW9uID0gbUluc3RhbmNlLm9uVXBkYXRlTm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIGlmIChtZWRpYU5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKHBsYXllclN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICBpZiAoIW1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UobVN0YXJ0U2VsZkludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmQobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfSURMRToKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZ0ZvcmVncm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0b3BGb3JlZ3JvdW5kKHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAotICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZWRpYU5vdGlmaWNhdGlvbkltcGwgaW1wbGVtZW50cyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5vdGlmaWNhdGlvbklkOwotICAgICAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbkltcGwoTWVkaWFOb3RpZmljYXRpb24gaW5zdGFuY2UsIGludCBub3RpZmljYXRpb25JZCwKLSAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3RpZmljYXRpb24gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JZCA9IG5vdGlmaWNhdGlvbklkOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldE5vdGlmaWNhdGlvbklkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5vdGlmaWNhdGlvbklkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb24gZ2V0Tm90aWZpY2F0aW9uX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5vdGlmaWNhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1ODEyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJhdGluZzIuKjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzIuU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuUmF0aW5nMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotcHVibGljIGZpbmFsIGNsYXNzIFJhdGluZzJJbXBsIGltcGxlbWVudHMgUmF0aW5nMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJhdGluZzIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVFlMRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIuc3R5bGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVkFMVUUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnZhbHVlIjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0IFJBVElOR19OT1RfUkFURUQgPSAtMS4wZjsKLQotICAgIHByaXZhdGUgZmluYWwgUmF0aW5nMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJhdGluZ1N0eWxlOwotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVJhdGluZ1ZhbHVlOwotCi0gICAgcHJpdmF0ZSBSYXRpbmcySW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlLCBmbG9hdCByYXRpbmcpIHsKLSAgICAgICAgbVJhdGluZ1N0eWxlID0gcmF0aW5nU3R5bGU7Ci0gICAgICAgIG1SYXRpbmdWYWx1ZSA9IHJhdGluZzsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFJhdGluZzIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICByZXR1cm4gIlJhdGluZzI6c3R5bGU9IiArIG1SYXRpbmdTdHlsZSArICIgcmF0aW5nPSIKLSAgICAgICAgICAgICAgICArIChtUmF0aW5nVmFsdWUgPCAwLjBmID8gInVucmF0ZWQiIDogU3RyaW5nLnZhbHVlT2YobVJhdGluZ1ZhbHVlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBSYXRpbmcyKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFJhdGluZzJJbXBsIG90aGVyID0gKFJhdGluZzJJbXBsKSAoKFJhdGluZzIpIG9iaikuZ2V0UHJvdmlkZXIoKTsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZSA9PSBvdGhlci5tUmF0aW5nU3R5bGUKLSAgICAgICAgICAgICAgICAmJiBtUmF0aW5nVmFsdWUgPT0gb3RoZXIubVJhdGluZ1ZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChtUmF0aW5nU3R5bGUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgfQotCi0gICAgUmF0aW5nMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKGJ1bmRsZS5nZXRJbnQoS0VZX1NUWUxFKSwgYnVuZGxlLmdldEZsb2F0KEtFWV9WQUxVRSkpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9TVFlMRSwgbVJhdGluZ1N0eWxlKTsKLSAgICAgICAgYnVuZGxlLnB1dEZsb2F0KEtFWV9WQUxVRSwgbVJhdGluZ1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19pbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUpIHsKLSAgICAgICAgc3dpdGNoKHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19IRUFSVDoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX1RIVU1CX1VQX0RPV046Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19QRVJDRU5UQUdFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwocmF0aW5nU3R5bGUsIFJBVElOR19OT1RfUkFURUQpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX2ltcGwoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKFJBVElOR19IRUFSVCwgaGFzSGVhcnQgPyAxLjBmIDogMC4wZikuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfaW1wbChib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKFJBVElOR19USFVNQl9VUF9ET1dOLCB0aHVtYklzVXAgPyAxLjBmIDogMC4wZikuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3U3RhclJhdGluZ19pbXBsKGludCBzdGFyUmF0aW5nU3R5bGUsIGZsb2F0IHN0YXJSYXRpbmcpIHsKLSAgICAgICAgZmxvYXQgbWF4UmF0aW5nID0gUkFUSU5HX05PVF9SQVRFRDsKLSAgICAgICAgc3dpdGNoKHN0YXJSYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgICAgICBtYXhSYXRpbmcgPSAzLjBmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKLSAgICAgICAgICAgICAgICBtYXhSYXRpbmcgPSA0LjBmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgICAgICBtYXhSYXRpbmcgPSA1LjBmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHJhdGluZyBzdHlsZSAoIiArIHN0YXJSYXRpbmdTdHlsZSArICIpIGZvciBhIHN0YXIgcmF0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzdGFyUmF0aW5nIDwgMC4wZikgfHwgKHN0YXJSYXRpbmcgPiBtYXhSYXRpbmcpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gc2V0IG91dCBvZiByYW5nZSBzdGFyLWJhc2VkIHJhdGluZyIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChzdGFyUmF0aW5nU3R5bGUsIHN0YXJSYXRpbmcpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChmbG9hdCBwZXJjZW50KSB7Ci0gICAgICAgIGlmICgocGVyY2VudCA8IDAuMGYpIHx8IChwZXJjZW50ID4gMTAwLjBmKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBwZXJjZW50YWdlLWJhc2VkIHJhdGluZyB2YWx1ZSIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKFJBVElOR19QRVJDRU5UQUdFLCBwZXJjZW50KS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSYXRlZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlID49IDAuMGY7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSYXRpbmdTdHlsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYXJ0X2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX0hFQVJUKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1SYXRpbmdWYWx1ZSA9PSAxLjBmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVGh1bWJVcF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19USFVNQl9VUF9ET1dOKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1SYXRpbmdWYWx1ZSA9PSAxLjBmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRTdGFyUmF0aW5nX2ltcGwoKSB7Ci0gICAgICAgIHN3aXRjaCAobVJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRQZXJjZW50UmF0aW5nX2ltcGwoKSB7Ci0gICAgICAgIGlmICgobVJhdGluZ1N0eWxlICE9IFJBVElOR19QRVJDRU5UQUdFKSB8fCAhbUluc3RhbmNlLmlzUmF0ZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xLjBmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1MGQzNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVNlc3Npb25TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50Lkl0ZW1BY3Rpb25DYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50LlNlc3Npb25BY3Rpb25DYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50LlN0YXR1c0NhbGxiYWNrOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotQFJlcXVpcmVzQXBpKGFwaSA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuTE9MTElQT1ApCi1wdWJsaWMgY2xhc3MgUm91dGVQbGF5ZXIgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQTEFZQkFDS19BQ1RJT05TID0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UKLSAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8KLSAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotCi0gICAgcHJpdmF0ZSBSZW1vdGVQbGF5YmFja0NsaWVudCBtQ2xpZW50OwotICAgIHByaXZhdGUgU3RyaW5nIG1TZXNzaW9uSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUl0ZW1JZDsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2sgPSBuZXcgU3RhdHVzQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIFJvdXRlUGxheWVyKENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIG1DbGllbnQgPSBuZXcgUmVtb3RlUGxheWJhY2tDbGllbnQoY29udGV4dCwgcm91dGUpOwotICAgICAgICBtQ2xpZW50LnNldFN0YXR1c0NhbGxiYWNrKG1TdGF0dXNDYWxsYmFjayk7Ci0gICAgICAgIG1DbGllbnQuc3RhcnRTZXNzaW9uKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5KCkgewotICAgICAgICBtQ2xpZW50LnJlc3VtZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIG1DbGllbnQucGF1c2UobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICBtQ2xpZW50LnNlZWsobUl0ZW1JZCwgcG9zLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBtQ2xpZW50LnN0b3AobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBtQ2xpZW50LnBsYXkoZHNkLmdldFVyaSgpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcGxheUludGVybmFsKGRzZC5nZXRVcmkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIGlmIChtQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DbGllbnQucmVsZWFzZSgpOwotICAgICAgICAgICAgbUNsaWVudCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlJbnRlcm5hbChVcmkgdXJpKSB7Ci0gICAgICAgIG1DbGllbnQucGxheSh1cmksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlc3Npb25TdGF0dXMoU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlSXRlbVN0YXR1cyhTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICBtSXRlbUlkID0gaXRlbUlkOwotICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsIHx8IG1DYWxsYmFjayA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChpdGVtU3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzU3MGFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tOwotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblBsYXlsaXN0QWdlbnQgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnQiOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX1BMQVlMSVNUID0gLTE7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBOT19WQUxJRF9JVEVNUyA9IC0yOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5SXRlbSBtRW9wUGxheUl0ZW0gPSBuZXcgUGxheUl0ZW0oRU5EX09GX1BMQVlMSVNULCBudWxsKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOwotICAgIHByaXZhdGUgZmluYWwgTXlQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJDYWxsYmFjazsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgbURzbUhlbHBlcjsKLSAgICAvLyBUT0RPOiBDaGVjayBpZiBoYXZpbmcgdGhlIHNhbWUgaXRlbSBpcyBva2F5IChiLzc0MDkwNzQxKQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtUGxheWxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVNodWZmbGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1hcDxNZWRpYUl0ZW0yLCBEYXRhU291cmNlRGVzYz4gbUl0ZW1Ec2RNYXAgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVJlcGVhdE1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5SXRlbSBtQ3VycmVudDsKLQotICAgIC8vIENhbGxlZCBvbiBzZXNzaW9uIGNhbGxiYWNrIGV4ZWN1dG9yLgotICAgIHByaXZhdGUgY2xhc3MgTXlQbGF5ZXJFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBtcGIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgaWYgKG1QbGF5ZXIgIT0gbXBiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCAmJiBtQ3VycmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFBsYXlJdGVtIHsKLSAgICAgICAgaW50IHNodWZmbGVkSWR4OwotICAgICAgICBEYXRhU291cmNlRGVzYyBkc2Q7Ci0gICAgICAgIE1lZGlhSXRlbTIgbWVkaWFJdGVtOwotCi0gICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCkgewotICAgICAgICAgICAgdGhpcyhzaHVmZmxlZElkeCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgdGhpcy5zaHVmZmxlZElkeCA9IHNodWZmbGVkSWR4OwotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKHRoaXMubWVkaWFJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gZHNkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgICAgIGlmICh0aGlzID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IG1TaHVmZmxlZExpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSAhPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtLmdldERhdGFTb3VyY2VEZXNjKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhbWVkaWFJdGVtLmdldERhdGFTb3VyY2VEZXNjKCkuZXF1YWxzKGRzZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uUGxheWxpc3RBZ2VudChATm9uTnVsbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uSW1wbCwKLSAgICAgICAgICAgIEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JbXBsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlc3Npb25JbXBsIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBzZXNzaW9uSW1wbDsKLSAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgbVBsYXllckNhbGxiYWNrID0gbmV3IE15UGxheWVyRXZlbnRDYWxsYmFjaygpOwotICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtU2Vzc2lvbkltcGwuZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLCBtUGxheWVyQ2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcihATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKHBsYXllciA9PSBtUGxheWVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyQ2FsbGJhY2spOwotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkltcGwuZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLCBtUGxheWVyQ2FsbGJhY2spOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtRHNtSGVscGVyID0gaGVscGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtRHNtSGVscGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobVBsYXlsaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0KEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1QbGF5bGlzdC5jbGVhcigpOwotICAgICAgICAgICAgbVBsYXlsaXN0LmFkZEFsbChsaXN0KTsKLSAgICAgICAgICAgIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKTsKLQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBtTWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbShpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBpbmRleDsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgaXRlbSBpbiByYW5kb20gcG9zaXRpb24gb2YgbVNodWZmbGVkTGlzdC4KLSAgICAgICAgICAgICAgICBzaHVmZmxlZElkeCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KG1TaHVmZmxlZExpc3Quc2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoc2h1ZmZsZWRJZHgsIGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LnJlbW92ZShpdGVtKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaHVmZmxlZExpc3QucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC5zaXplKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtUGxheWxpc3QuZ2V0KGluZGV4KSk7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUobVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKTsKLSAgICAgICAgICAgIG1TaHVmZmxlZExpc3Quc2V0KHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5zZXQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgaXRlbS5lcXVhbHMobUN1cnJlbnQubWVkaWFJdGVtKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihpdGVtKTsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudCA9IG5ldyBQbGF5SXRlbShzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBsYXlJdGVtIHByZXYgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgLTEpOwotICAgICAgICAgICAgaWYgKHByZXYgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBwcmV2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBsYXlJdGVtIG5leHQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICBpZiAobmV4dCAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORQotICAgICAgICAgICAgICAgIHx8IHJlcGVhdE1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgICAgIHN3aXRjaCAocmVwZWF0TW9kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50ICE9IG51bGwgJiYgbUN1cnJlbnQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTDoKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtU2h1ZmZsZU1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGlmIChzaHVmZmxlTW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORQotICAgICAgICAgICAgICAgIHx8IHNodWZmbGVNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgICAgIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGludCBnZXRDdXJTaHVmZmxlZEluZGV4KCkgewotICAgICAgICByZXR1cm4gaGFzVmFsaWRJdGVtKCkgPyBtQ3VycmVudC5zaHVmZmxlZElkeCA6IE5PX1ZBTElEX0lURU1TOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZEl0ZW0oKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudCAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gaXRlbS5nZXREYXRhU291cmNlRGVzYygpOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnB1dChpdGVtLCBkc2QpOwotICAgICAgICAgICAgcmV0dXJuIGRzZDsKLSAgICAgICAgfQotICAgICAgICBkc2QgPSBtSXRlbURzZE1hcC5nZXQoaXRlbSk7Ci0gICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRzZDsKLSAgICAgICAgfQotICAgICAgICBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlciA9IG1Ec21IZWxwZXI7Ci0gICAgICAgIGlmIChoZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogRG8gbm90IGNhbGwgb25EYXRhU291cmNlTWlzc2luZyB3aXRoIHRoZSBsb2NrIChiLzc0MDkwNzQxKS4KLSAgICAgICAgICAgIGRzZCA9IGhlbHBlci5vbkRhdGFTb3VyY2VNaXNzaW5nKG1TZXNzaW9uSW1wbC5nZXRJbnN0YW5jZSgpLCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1JdGVtRHNkTWFwLnB1dChpdGVtLCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkc2Q7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogY29uc2lkZXIgdG8gY2FsbCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQgaW5zaWRlIChiLzc0MDkwNzQxKQotICAgIHByaXZhdGUgUGxheUl0ZW0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoaW50IGN1clNodWZmbGVkSWR4LCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgIGludCBzaXplID0gbVBsYXlsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4ID09IEVORF9PRl9QTEFZTElTVCkgewotICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSAoZGlyZWN0aW9uID4gMCkgPyAtMSA6IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ICs9IGRpcmVjdGlvbjsKLSAgICAgICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA8IDAgfHwgY3VyU2h1ZmZsZWRJZHggPj0gbVBsYXlsaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSBSRVBFQVRfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSA9PSBzaXplIC0gMSkgPyBudWxsIDogbUVvcFBsYXlJdGVtOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gY3VyU2h1ZmZsZWRJZHggPCAwID8gbVBsYXlsaXN0LnNpemUoKSAtIDEgOiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobVNodWZmbGVkTGlzdC5nZXQoY3VyU2h1ZmZsZWRJZHgpKTsKLSAgICAgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGxheUl0ZW0oY3VyU2h1ZmZsZWRJZHgsIGRzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpIHsKLSAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobUN1cnJlbnQubWVkaWFJdGVtKTsKLSAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IDApIHsKLSAgICAgICAgICAgIC8vIEFkZGVkIGFuIGl0ZW0uCi0gICAgICAgICAgICBtQ3VycmVudC5zaHVmZmxlZElkeCA9IHNodWZmbGVkSWR4OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJyZW50LnNodWZmbGVkSWR4ID49IG1TaHVmZmxlZExpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1TaHVmZmxlZExpc3Quc2l6ZSgpIC0gMSwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudC5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChtQ3VycmVudC5zaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICBpZiAocmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtQ3VycmVudC5tZWRpYUl0ZW0pID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50ID09IG51bGwgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QbGF5ZXIuZ2V0Q3VycmVudERhdGFTb3VyY2UoKSAhPSBtQ3VycmVudC5kc2QpIHsKLSAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShtQ3VycmVudC5kc2QpOwotICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChtUmVwZWF0TW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBDYWxsIHNldE5leHREYXRhU291cmNlIChiLzc0MDkwNzQxKQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCkgewotICAgICAgICBtU2h1ZmZsZWRMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1TaHVmZmxlZExpc3QuYWRkQWxsKG1QbGF5bGlzdCk7Ci0gICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwKLSAgICAgICAgICAgICAgICB8fCBtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShtU2h1ZmZsZWRMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENsYW1wcyB2YWx1ZSB0byBbMCwgc2l6ZV0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2xhbXAoaW50IHZhbHVlLCBpbnQgc2l6ZSkgewotICAgICAgICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHZhbHVlID4gc2l6ZSkgPyBzaXplIDogdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNmOGM0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVG9rZW5UeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblRva2VuMkltcGwgaW1wbGVtZW50cyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVUlEID0gImFuZHJvaWQubWVkaWEudG9rZW4udWlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RZUEUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi50eXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnBhY2thZ2VfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWSUNFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXJ2aWNlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVNTSU9OX0JJTkRFUiA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlc3Npb25fYmluZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVVpZDsKLSAgICBwcml2YXRlIGZpbmFsIEBUb2tlblR5cGUgaW50IG1UeXBlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvKioKLSAgICAgKiBQdWJsaWMgY29uc3RydWN0b3IgZm9yIHRoZSBsZWdhY3kgc3VwcG9ydCAoaS5lLiBicm93c2VyIGNhbiB0cnkgY29ubmVjdGluZyB0byBhbnkgYnJvd3NlcgotICAgICAqIHNlcnZpY2UgaWYgaXQga25vd3MgdGhlIHNlcnZpY2UgbmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMkltcGwoQ29udGV4dCBjb250ZXh0LCBTZXNzaW9uVG9rZW4yIGluc3RhbmNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIGludCB1aWQpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIC8vIENhbGN1bGF0ZSB1aWQgaWYgaXQncyBub3Qgc3BlY2lmaWVkLgotICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBpZiAodWlkIDwgMCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB1aWQgPSBtYW5hZ2VyLmdldFBhY2thZ2VVaWQocGFja2FnZU5hbWUsIDApOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgZmluZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVVpZCA9IHVpZDsKLQotICAgICAgICAvLyBJbmZlciBpZCBhbmQgdHlwZSBmcm9tIHBhY2thZ2UgbmFtZSBhbmQgc2VydmljZSBuYW1lCi0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIG11bHRpLXVzZXIuCi0gICAgICAgIFN0cmluZyBpZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgICAgIG1UeXBlID0gVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXRyeSB3aXRoIHNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgbUlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfU0VTU0lPTl9TRVJWSUNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSAiICsgc2VydmljZU5hbWUgKyAiIGRvZXNuJ3QgaW1wbGVtZW50IgotICAgICAgICAgICAgICAgICAgICArICIgc2Vzc2lvbiBzZXJ2aWNlIG5vciBsaWJyYXJ5IHNlcnZpY2UuIFVzZSBzZXJ2aWNlJ3MgZnVsbCBuYW1lLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgIH0KLQotICAgIFNlc3Npb25Ub2tlbjJJbXBsKGludCB1aWQsIGludCB0eXBlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlkLAotICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBzYW5pdHkgY2hlY2sgKGIvNzM4NjM4NjUpCi0gICAgICAgIG1VaWQgPSB1aWQ7Ci0gICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgU2Vzc2lvblRva2VuMih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UoUGFja2FnZU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHNlcnZpY2VJbnRlcmZhY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShwYWNrYWdlTmFtZSk7Ci0gICAgICAgIC8vIFVzZSBxdWVyeUludGVudFNlcnZpY2VzIHRvIGZpbmQgc2VydmljZXMgd2l0aCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS4KLSAgICAgICAgLy8gV2UgY2Fubm90IHVzZSByZXNvbHZlU2VydmljZSB3aXRoIGludGVudCBzcGVjaWZpZWQgY2xhc3MgbmFtZSwgYmVjYXVzZSByZXNvbHZlU2VydmljZQotICAgICAgICAvLyBpZ25vcmVzIGFjdGlvbnMgaWYgSW50ZW50LnNldENsYXNzTmFtZSgpIGlzIHNwZWNpZmllZC4KLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gbGlzdCA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcygKLSAgICAgICAgICAgICAgICBzZXJ2aWNlSW50ZW50LCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZUluZm8gPT0gbnVsbCB8fCByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhyZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5uYW1lLCBzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNlc3Npb25JZChyZXNvbHZlSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbykgewotICAgICAgICBpZiAocmVzb2x2ZUluZm8gPT0gbnVsbCB8fCByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX01FVEFfREFUQSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVWlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRfaW1wKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVR5cGU7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbVNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgdWlkID0gYnVuZGxlLmdldEludChLRVlfVUlEKTsKLSAgICAgICAgZmluYWwgQFRva2VuVHlwZSBpbnQgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1RZUEUsIC0xKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gYnVuZGxlLmdldFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lID0gYnVuZGxlLmdldFN0cmluZyhLRVlfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBJQmluZGVyIHNlc3Npb25CaW5kZXIgPSBidW5kbGUuZ2V0QmluZGVyKEtFWV9TRVNTSU9OX0JJTkRFUik7Ci0KLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrLgotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OOgotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzZXNzaW9uQmluZGVyIGZvciBzZXNzaW9uLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmluZGVyPSIgKyBzZXNzaW9uQmluZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTl9TRVJWSUNFOgotICAgICAgICAgICAgY2FzZSBUWVBFX0xJQlJBUllfU0VSVklDRToKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gc2VydmljZSBuZWVkcyBzZXJ2aWNlIG5hbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkgfHwgaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFja2FnZSBuYW1lIG5vciBJRCBjYW5ub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKHVpZCwgdHlwZSwgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lLCBpZCwKLSAgICAgICAgICAgICAgICBzZXNzaW9uQmluZGVyICE9IG51bGwgPyBJTWVkaWFTZXNzaW9uMi5TdHViLmFzSW50ZXJmYWNlKHNlc3Npb25CaW5kZXIpIDogbnVsbCkKLSAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1VJRCwgbVVpZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSwgbVBhY2thZ2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfU0VSVklDRV9OQU1FLCBtU2VydmljZU5hbWUpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVFlQRSwgbVR5cGUpOwotICAgICAgICBidW5kbGUucHV0QmluZGVyKEtFWV9TRVNTSU9OX0JJTkRFUiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciAhPSBudWxsID8gbVNlc3Npb25CaW5kZXIuYXNCaW5kZXIoKSA6IG51bGwpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgIHJldHVybiBtVHlwZQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVVpZAotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVBhY2thZ2VOYW1lLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1JZC5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtU2VydmljZU5hbWUgIT0gbnVsbCA/IG1TZXJ2aWNlTmFtZS5oYXNoQ29kZSgpIDogMCkpKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBTZXNzaW9uVG9rZW4yKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIG90aGVyID0gZnJvbSgoU2Vzc2lvblRva2VuMikgb2JqKTsKLSAgICAgICAgcmV0dXJuIG1VaWQgPT0gb3RoZXIubVVpZAotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVBhY2thZ2VOYW1lLCBvdGhlci5tUGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtU2VydmljZU5hbWUsIG90aGVyLm1TZXJ2aWNlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1JZCwgb3RoZXIubUlkKQotICAgICAgICAgICAgICAgICYmIG1UeXBlID09IG90aGVyLm1UeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJTZXNzaW9uVG9rZW4ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiBpZD0iICsgbUlkICsgIiB0eXBlPSIgKyBtVHlwZQotICAgICAgICAgICAgICAgICsgIiBzZXJ2aWNlPSIgKyBtU2VydmljZU5hbWUgKyAiIGJpbmRlcj0iICsgbVNlc3Npb25CaW5kZXIgKyAifSI7Ci0gICAgfQotCi0gICAgc3RhdGljIFNlc3Npb25Ub2tlbjJJbXBsIGZyb20oU2Vzc2lvblRva2VuMiB0b2tlbikgewotICAgICAgICByZXR1cm4gKChTZXNzaW9uVG9rZW4ySW1wbCkgdG9rZW4uZ2V0UHJvdmlkZXIoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMmUxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfUkVMQVRJVkU7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5Wb2x1bWVQcm92aWRlcjJQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFZvbHVtZVByb3ZpZGVyMkltcGwgaW1wbGVtZW50cyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVQcm92aWRlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOwotCi0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIySW1wbChWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXIyLkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSwgaW50IG1heFZvbHVtZSwgaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0ZJWEVEICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX1JFTEFUSVZFCi0gICAgICAgICAgICAgICAgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIGNvbnRyb2xUeXBlICIgKyBjb250cm9sVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1heFZvbHVtZSA8IDAgfHwgY3VycmVudFZvbHVtZSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFZvbHVtZSA+IG1heFZvbHVtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgZ3JlYXRlciB0aGFuIG1heFZvbHVtZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgbU1heFZvbHVtZSA9IG1heFZvbHVtZTsKLSAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE1heFZvbHVtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRWb2x1bWVfaW1wbChpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICBpZiAoY3VycmVudFZvbHVtZSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVDaGFuZ2VkKG1JbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSB2b2x1bWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdlZWM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5TdHlsZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVuZGVybGluZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVwZGF0ZUFwcGVhcmFuY2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvblN0eWxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLkNsb3NlZENhcHRpb25SZW5kZXJlciBzaW5jZSBQCi1wdWJsaWMgY2xhc3MgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIGV4dGVuZHMgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBDZWE2MDhDQ1dpZGdldCBtQ0NXaWRnZXQ7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX01JTUUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgY3JlYXRlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICBpZiAoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChtQ0NXaWRnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DQ1dpZGdldCA9IG5ldyBDZWE2MDhDQ1dpZGdldChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENlYTYwOENhcHRpb25UcmFjayhtQ0NXaWRnZXQsIGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIG1hdGNoaW5nIGZvcm1hdDogIiArIGZvcm1hdC50b1N0cmluZygpKTsKLSAgICB9Ci19Ci0KLWNsYXNzIENlYTYwOENhcHRpb25UcmFjayBleHRlbmRzIFN1YnRpdGxlVHJhY2sgewotICAgIHByaXZhdGUgZmluYWwgQ2VhNjA4Q0NQYXJzZXIgbUNDUGFyc2VyOwotICAgIHByaXZhdGUgZmluYWwgQ2VhNjA4Q0NXaWRnZXQgbVJlbmRlcmluZ1dpZGdldDsKLQotICAgIENlYTYwOENhcHRpb25UcmFjayhDZWE2MDhDQ1dpZGdldCByZW5kZXJpbmdXaWRnZXQsIE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzdXBlcihmb3JtYXQpOwotCi0gICAgICAgIG1SZW5kZXJpbmdXaWRnZXQgPSByZW5kZXJpbmdXaWRnZXQ7Ci0gICAgICAgIG1DQ1BhcnNlciA9IG5ldyBDZWE2MDhDQ1BhcnNlcihtUmVuZGVyaW5nV2lkZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKSB7Ci0gICAgICAgIG1DQ1BhcnNlci5wYXJzZShkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZW5kZXJpbmdXaWRnZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKSB7Ci0gICAgICAgIC8vIE92ZXJyaWRpbmcgd2l0aCBOTy1PUCwgQ0MgcmVuZGVyaW5nIGJ5LXBhc3NlcyB0aGlzCi0gICAgfQotfQotCi0vKioKLSAqIEFic3RyYWN0IHdpZGdldCBjbGFzcyB0byByZW5kZXIgYSBjbG9zZWQgY2FwdGlvbiB0cmFjay4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ2xvc2VkQ2FwdGlvbldpZGdldCBleHRlbmRzIFZpZXdHcm91cCBpbXBsZW1lbnRzIFN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0IHsKLQotICAgIGludGVyZmFjZSBDbG9zZWRDYXB0aW9uTGF5b3V0IHsKLSAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSk7Ci0gICAgICAgIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IHNjYWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXB0aW9uU3R5bGUgREVGQVVMVF9DQVBUSU9OX1NUWUxFID0gQ2FwdGlvblN0eWxlLkRFRkFVTFQ7Ci0KLSAgICAvKiogQ2FwdGlvbmluZyBtYW5hZ2VyLCB1c2VkIHRvIG9idGFpbiBhbmQgdHJhY2sgY2FwdGlvbiBwcm9wZXJ0aWVzLiAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ01hbmFnZXIgbU1hbmFnZXI7Ci0KLSAgICAvKiogQ3VycmVudCBjYXB0aW9uIHN0eWxlLiAqLwotICAgIHByb3RlY3RlZCBDYXB0aW9uU3R5bGUgbUNhcHRpb25TdHlsZTsKLQotICAgIC8qKiBDYWxsYmFjayBmb3IgcmVuZGVyaW5nIGNoYW5nZXMuICovCi0gICAgcHJvdGVjdGVkIE9uQ2hhbmdlZExpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIC8qKiBDb25jcmV0ZSBsYXlvdXQgb2YgQ0MuICovCi0gICAgcHJvdGVjdGVkIENsb3NlZENhcHRpb25MYXlvdXQgbUNsb3NlZENhcHRpb25MYXlvdXQ7Ci0KLSAgICAvKiogV2hldGhlciBhIGNhcHRpb24gc3R5bGUgY2hhbmdlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXNDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAotICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLQotICAgICAgICAvLyBDYW5ub3QgcmVuZGVyIHRleHQgb3ZlciB2aWRlbyB3aGVuIGxheWVyIHR5cGUgaXMgaGFyZHdhcmUuCi0gICAgICAgIHNldExheWVyVHlwZShWaWV3LkxBWUVSX1RZUEVfU09GVFdBUkUsIG51bGwpOwotCi0gICAgICAgIG1NYW5hZ2VyID0gKENhcHRpb25pbmdNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUobU1hbmFnZXIuZ2V0VXNlclN0eWxlKCkpOwotCi0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0ID0gY3JlYXRlQ2FwdGlvbkxheW91dChjb250ZXh0KTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUobU1hbmFnZXIuZ2V0Rm9udFNjYWxlKCkpOwotICAgICAgICBhZGRWaWV3KChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0LCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotCi0gICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xvc2VkQ2FwdGlvbkxheW91dCBjcmVhdGVDYXB0aW9uTGF5b3V0KENvbnRleHQgY29udGV4dCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkNoYW5nZWRMaXN0ZW5lcihPbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKHdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICBtZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIGxheW91dCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLm1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5sYXlvdXQobCwgdCwgciwgYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFuYWdlcyB3aGV0aGVyIHRoaXMgcmVuZGVyZXIgaXMgbGlzdGVuaW5nIGZvciBjYXB0aW9uIHN0eWxlIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgbUNhcHRpb25pbmdMaXN0ZW5lciA9IG5ldyBDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVzZXJTdHlsZUNoYW5nZWQoQ2FwdGlvblN0eWxlIHVzZXJTdHlsZSkgewotICAgICAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKHVzZXJTdHlsZSk7Ci0gICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Gb250U2NhbGVDaGFuZ2VkKGZsb2F0IGZvbnRTY2FsZSkgewotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKGZvbnRTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRzTGlzdGVuZXIgPSBpc0F0dGFjaGVkVG9XaW5kb3coKSAmJiBnZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOwotICAgICAgICBpZiAobUhhc0NoYW5nZUxpc3RlbmVyICE9IG5lZWRzTGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1IYXNDaGFuZ2VMaXN0ZW5lciA9IG5lZWRzTGlzdGVuZXI7Ci0KLSAgICAgICAgICAgIGlmIChuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogQ0NQYXJzZXIgcHJvY2Vzc2VzIENFQS02MDggY2xvc2VkIGNhcHRpb24gZGF0YS4KLSAqCi0gKiBJdCBjYWxscyBiYWNrIGludG8gT25EaXNwbGF5Q2hhbmdlZExpc3RlbmVyIHVwb24KLSAqIGRpc3BsYXkgY2hhbmdlIHdpdGggc3R5bGVkIHRleHQgZm9yIHJlbmRlcmluZy4KLSAqCi0gKi8KLWNsYXNzIENlYTYwOENDUGFyc2VyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IDE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT0xTID0gMzI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNlYTYwOENDUGFyc2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSUQgPSAtMTsKLQotICAgIC8vIEVJQS1DRUEtNjA4OiBUYWJsZSA3MCAtIENvbnRyb2wgQ29kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkNMID0gMHgyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlMgID0gMHgyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU9GID0gMHgyMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU9OID0gMHgyMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVSID0gMHgyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlUyID0gMHgyNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlUzID0gMHgyNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlU0ID0gMHgyNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9OID0gMHgyODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkRDID0gMHgyOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFIgID0gMHgyYTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlREID0gMHgyYjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRURNID0gMHgyYzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1IgID0gMHgyZDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5NID0gMHgyZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9DID0gMHgyZjsKLQotICAgIC8vIFRyYW5zcGFyZW50IFNwYWNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUUyA9ICdcdTAwQTAnOwotCi0gICAgLy8gQ2FwdGlvbmluZyBNb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1VOS05PV04gPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BBSU5UX09OID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ST0xMX1VQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QT1BfT04gPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1RFWFQgPSA0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBpbnQgbU1vZGUgPSBNT0RFX1BBSU5UX09OOwotICAgIHByaXZhdGUgaW50IG1Sb2xsVXBTaXplID0gNDsKLSAgICBwcml2YXRlIGludCBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgbURpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKLSAgICBwcml2YXRlIENDTWVtb3J5IG1Ob25EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtVGV4dE1lbSA9IG5ldyBDQ01lbW9yeSgpOwotCi0gICAgQ2VhNjA4Q0NQYXJzZXIoRGlzcGxheUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IENDRGF0YS5mcm9tQnl0ZUFycmF5KGRhdGEpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2NEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNjRGF0YVtpXS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhbmRsZUN0cmxDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlVGFiT2Zmc2V0cyhjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVBBQ0NvZGUoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVNaWRSb3dDb2RlKGNjRGF0YVtpXSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGFuZGxlRGlzcGxheWFibGVDaGFycyhjY0RhdGFbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIERpc3BsYXlMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpOwotICAgICAgICBDYXB0aW9uU3R5bGUgZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDQ01lbW9yeSBnZXRNZW1vcnkoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgQ0MgbWVtb3J5IHRvIG9wZXJhdGUgb24gZm9yIGN1cnJlbnQgbW9kZQotICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7Ci0gICAgICAgIGNhc2UgTU9ERV9QT1BfT046Ci0gICAgICAgICAgICByZXR1cm4gbU5vbkRpc3BsYXk7Ci0gICAgICAgIGNhc2UgTU9ERV9URVhUOgotICAgICAgICAgICAgLy8gVE9ETyhjaHopOiBzdXBwb3J0IG9ubHkgY2FwdGlvbiBtb2RlIGZvciBub3csCi0gICAgICAgICAgICAvLyBpbiB0ZXh0IG1vZGUsIGR1bXAgZXZlcnl0aGluZyB0byB0ZXh0IG1lbS4KLSAgICAgICAgICAgIHJldHVybiBtVGV4dE1lbTsKLSAgICAgICAgY2FzZSBNT0RFX1BBSU5UX09OOgotICAgICAgICBjYXNlIE1PREVfUk9MTF9VUDoKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExvZy53KFRBRywgInVucmVjb2dpbml6ZWQgbW9kZTogIiArIG1Nb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpZiAoIWNjRGF0YS5pc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRlbmRlZCBjaGFyIGluY2x1ZGVzIDEgYXV0b21hdGljIGJhY2tzcGFjZQotICAgICAgICBpZiAoY2NEYXRhLmlzRXh0ZW5kZWRDaGFyKCkpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVRleHQoY2NEYXRhLmdldERpc3BsYXlUZXh0KCkpOwotCi0gICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1BBSU5UX09OIHx8IG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZU1pZFJvd0NvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBTdHlsZUNvZGUgbSA9IGNjRGF0YS5nZXRNaWRSb3coKTsKLSAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVNaWRSb3dDb2RlKG0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVQQUNDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgUEFDIHBhYyA9IGNjRGF0YS5nZXRQQUMoKTsKLQotICAgICAgICBpZiAocGFjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5tb3ZlQmFzZWxpbmVUbyhwYWMuZ2V0Um93KCksIG1Sb2xsVXBTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlUEFDKHBhYyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlVGFiT2Zmc2V0cyhDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCB0YWJzID0gY2NEYXRhLmdldFRhYk9mZnNldCgpOwotCi0gICAgICAgIGlmICh0YWJzID4gMCkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkudGFiKHRhYnMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZUN0cmxDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaW50IGN0cmxDb2RlID0gY2NEYXRhLmdldEN0cmxDb2RlKCk7Ci0KLSAgICAgICAgaWYgKG1QcmV2Q3RybENvZGUgIT0gSU5WQUxJRCAmJiBtUHJldkN0cmxDb2RlID09IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICAvLyBkaXNjYXJkIGRvdWJsZSBjdHJsIGNvZGVzIChidXQgaWYgdGhlcmUncyBhIDNyZCBvbmUsIHdlIHN0aWxsIHRha2UgdGhhdCkKLSAgICAgICAgICAgIG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goY3RybENvZGUpIHsKLSAgICAgICAgY2FzZSBSQ0w6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcG9wLW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUE9QX09OOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlM6Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVSOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuZGVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVTI6Ci0gICAgICAgIGNhc2UgUlUzOgotICAgICAgICBjYXNlIFJVNDoKLSAgICAgICAgICAgIG1Sb2xsVXBTaXplID0gKGN0cmxDb2RlIC0gMHgyMyk7Ci0gICAgICAgICAgICAvLyBlcmFzZSBtZW1vcnkgaWYgY3VycmVudGx5IGluIG90aGVyIHN0eWxlCi0gICAgICAgICAgICBpZiAobU1vZGUgIT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2VsZWN0IHJvbGwtdXAgc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9ST0xMX1VQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9OOgotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRmxhc2ggT24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJEQzoKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwYWludC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BBSU5UX09OOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFI6Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfVEVYVDsKLSAgICAgICAgICAgIG1UZXh0TWVtLmVyYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVEQ6Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfVEVYVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVETToKLSAgICAgICAgICAgIC8vIGVyYXNlIGRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1I6Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkucm9sbFVwKG1Sb2xsVXBTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkuY3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFTk06Ci0gICAgICAgICAgICAvLyBlcmFzZSBub24tZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFT0M6Ci0gICAgICAgICAgICAvLyBzd2FwIGRpc3BsYXkvbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBzd2FwTWVtb3J5KCk7Ci0gICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcG9wLW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUE9QX09OOwotICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5WQUxJRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByZXZDdHJsQ29kZSA9IGN0cmxDb2RlOwotCi0gICAgICAgIC8vIGhhbmRsZWQKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSA9IG1MaXN0ZW5lci5nZXRDYXB0aW9uU3R5bGUoKTsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlDaGFuZ2VkKG1EaXNwbGF5LmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3dhcE1lbW9yeSgpIHsKLSAgICAgICAgQ0NNZW1vcnkgdGVtcCA9IG1EaXNwbGF5OwotICAgICAgICBtRGlzcGxheSA9IG1Ob25EaXNwbGF5OwotICAgICAgICBtTm9uRGlzcGxheSA9IHRlbXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3R5bGVDb2RlIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURSA9IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfR1JFRU4gPSAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0JMVUUgPSAyOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0NZQU4gPSAzOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1JFRCA9IDQ7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfWUVMTE9XID0gNTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9NQUdFTlRBID0gNjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9JTlZBTElEID0gNzsKLQotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX0lUQUxJQ1MgICA9IDB4MDAwMDAwMDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfVU5ERVJMSU5FID0gMHgwMDAwMDAwMjsKLQotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gbUNvbG9yTWFwID0gewotICAgICAgICAgICAgIldISVRFIiwgIkdSRUVOIiwgIkJMVUUiLCAiQ1lBTiIsICJSRUQiLCAiWUVMTE9XIiwgIk1BR0VOVEEiLCAiSU5WQUxJRCIKLSAgICAgICAgfTsKLQotICAgICAgICBmaW5hbCBpbnQgbVN0eWxlOwotICAgICAgICBmaW5hbCBpbnQgbUNvbG9yOwotCi0gICAgICAgIHN0YXRpYyBTdHlsZUNvZGUgZnJvbUJ5dGUoYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKLSAgICAgICAgICAgIGludCBjb2xvciA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLQotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgY29sb3IgPSBDT0xPUl9XSElURTsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0eWxlQ29kZShzdHlsZSwgY29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3R5bGVDb2RlKGludCBzdHlsZSwgaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtU3R5bGUgPSBzdHlsZTsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0l0YWxpY3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVW5kZXJsaW5lKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9VTkRFUkxJTkUpICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sb3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCJ7Iik7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKG1Db2xvck1hcFttQ29sb3JdKTsKLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgSVRBTElDUyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9VTkRFUkxJTkUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIFVOREVSTElORSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLmFwcGVuZCgifSIpOwotCi0gICAgICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQQUMgZXh0ZW5kcyBTdHlsZUNvZGUgewotICAgICAgICBmaW5hbCBpbnQgbVJvdzsKLSAgICAgICAgZmluYWwgaW50IG1Db2w7Ci0KLSAgICAgICAgc3RhdGljIFBBQyBmcm9tQnl0ZXMoYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgaW50W10gcm93VGFibGUgPSB7MTEsIDEsIDMsIDEyLCAxNCwgNSwgNywgOX07Ci0gICAgICAgICAgICBpbnQgcm93ID0gcm93VGFibGVbZGF0YTEgJiAweDA3XSArICgoZGF0YTIgJiAweDIwKSA+PiA1KTsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEwKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW5kZW50IGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgaW5kZW50ID0gKGRhdGEyID4+IDEpICYgMHg3OwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgaW5kZW50ICogNCwgc3R5bGUsIENPTE9SX1dISVRFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc3R5bGUgY29kZQotICAgICAgICAgICAgICAgIGludCBjb2xvciA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLQotICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBDT0xPUl9XSElURTsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCAtMSwgc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFBBQyhpbnQgcm93LCBpbnQgY29sLCBpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgc3VwZXIoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgICAgIG1Sb3cgPSByb3c7Ci0gICAgICAgICAgICBtQ29sID0gY29sOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0luZGVudFBBQygpIHsKLSAgICAgICAgICAgIHJldHVybiAobUNvbCA+PSAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRSb3coKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDb2woKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInslZCwgJWR9LCAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1Sb3csIG1Db2wsIHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXV0YWJsZSB2ZXJzaW9uIG9mIEJhY2tncm91bmRTcGFuIHRvIGZhY2lsaXRhdGUgdGV4dCByZW5kZXJpbmcgd2l0aCBlZGdlIHN0eWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuIGV4dGVuZHMgQ2hhcmFjdGVyU3R5bGUKLSAgICAgICAgICAgIGltcGxlbWVudHMgVXBkYXRlQXBwZWFyYW5jZSB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db2xvcjsKLQotICAgICAgICBwdWJsaWMgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZShUZXh0UGFpbnQgZHMpIHsKLSAgICAgICAgICAgIGRzLmJnQ29sb3IgPSBtQ29sb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDQ0xpbmVCdWlsZGVyIGtlZXBzIHRyYWNrIG9mIGRpc3BsYXlhYmxlIGNoYXJzLCBhcyB3ZWxsIGFzCi0gICAgICogTWlkUm93IHN0eWxlcyBhbmQgUEFDcywgZm9yIGEgc2luZ2xlIGxpbmUgb2YgQ0MgbWVtb3J5LgotICAgICAqCi0gICAgICogSXQgZ2VuZXJhdGVzIHN0eWxlZCB0ZXh0IHZpYSBnZXRTdHlsZWRUZXh0KCkgbWV0aG9kLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbURpc3BsYXlDaGFyczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtTWlkUm93U3R5bGVzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1QQUNTdHlsZXM7Ci0KLSAgICAgICAgQ0NMaW5lQnVpbGRlcihTdHJpbmcgc3RyKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICAgICAgbVBBQ1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENoYXJBdChpbnQgaW5kZXgsIGNoYXIgY2gpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMuc2V0Q2hhckF0KGluZGV4LCBjaCk7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldE1pZFJvd0F0KGludCBpbmRleCwgU3R5bGVDb2RlIG0pIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMuc2V0Q2hhckF0KGluZGV4LCAnICcpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBtOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRQQUNBdChpbnQgaW5kZXgsIFBBQyBwYWMpIHsKLSAgICAgICAgICAgIG1QQUNTdHlsZXNbaW5kZXhdID0gcGFjOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5jaGFyQXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxlbmd0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmxlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBseVN0eWxlU3BhbigKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHN0eWxlZFRleHQsCi0gICAgICAgICAgICAgICAgU3R5bGVDb2RlIHMsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICAgICAgaWYgKHMuaXNJdGFsaWNzKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3R5bGVTcGFuKGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UuSVRBTElDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMuaXNVbmRlcmxpbmUoKSkgewotICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVbmRlcmxpbmVTcGFuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHN0eWxlZFRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihtRGlzcGxheUNoYXJzKTsKLSAgICAgICAgICAgIGludCBzdGFydCA9IC0xLCBuZXh0ID0gMDsKLSAgICAgICAgICAgIGludCBzdHlsZVN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICBTdHlsZUNvZGUgY3VyU3R5bGUgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKG5leHQgPCBtRGlzcGxheUNoYXJzLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgU3R5bGVDb2RlIG5ld1N0eWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobU1pZFJvd1N0eWxlc1tuZXh0XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IG1pZC1yb3cgc3R5bGUgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlID0gbU1pZFJvd1N0eWxlc1tuZXh0XTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QQUNTdHlsZXNbbmV4dF0gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoc3R5bGVTdGFydCA8IDAgfHwgc3RhcnQgPCAwKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBQQUMgc3R5bGUgY2hhbmdlLCBvbmx5IGlmOgotICAgICAgICAgICAgICAgICAgICAvLyAxLiBubyBzdHlsZSBzZXQsIG9yCi0gICAgICAgICAgICAgICAgICAgIC8vIDIuIHN0eWxlIHNldCwgYnV0IHByZXYgY2hhciBpcyBub25lLWRpc3BsYXlhYmxlCi0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlID0gbVBBQ1N0eWxlc1tuZXh0XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyU3R5bGUgPSBuZXdTdHlsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlU3RhcnQgPj0gMCAmJiBzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBuZXdTdHlsZSwgc3R5bGVTdGFydCwgbmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3R5bGVTdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRTdGFydCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KHN0YXJ0KSA9PSAnICcgPyBzdGFydCA6IHN0YXJ0IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkRW5kID0gbURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCAtIDEpID09ICcgJyA/IG5leHQgOiBuZXh0ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihjYXB0aW9uU3R5bGUuYmFja2dyb3VuZENvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFN0YXJ0LCBleHBhbmRlZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlU3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgY3VyU3R5bGUsIHN0eWxlU3RhcnQsIGV4cGFuZGVkRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXh0Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHlsZWRUZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ01lbW9yeSBtb2RlbHMgYSBjb25zb2xlLXN0eWxlIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NNZW1vcnkgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQmxhbmtMaW5lOwotICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJ1aWxkZXJbXSBtTGluZXMgPSBuZXcgQ0NMaW5lQnVpbGRlcltNQVhfUk9XUyArIDJdOwotICAgICAgICBwcml2YXRlIGludCBtUm93OwotICAgICAgICBwcml2YXRlIGludCBtQ29sOwotCi0gICAgICAgIENDTWVtb3J5KCkgewotICAgICAgICAgICAgY2hhcltdIGJsYW5rID0gbmV3IGNoYXJbTUFYX0NPTFMgKyAyXTsKLSAgICAgICAgICAgIEFycmF5cy5maWxsKGJsYW5rLCBUUyk7Ci0gICAgICAgICAgICBtQmxhbmtMaW5lID0gbmV3IFN0cmluZyhibGFuayk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVyYXNlKCkgewotICAgICAgICAgICAgLy8gZXJhc2UgYWxsIGxpbmVzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm93ID0gTUFYX1JPV1M7Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZGVyKCkgewotICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XS5jaGFyQXQoaSkgIT0gVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBtQ29sOyBqIDwgbUxpbmVzW21Sb3ddLmxlbmd0aCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGluZXNbal0uc2V0Q2hhckF0KGosIFRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0YWIoaW50IHRhYnMpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCh0YWJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYnMoKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woLTEpOwotICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddLnNldENoYXJBdChtQ29sLCBUUyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db2wgPT0gTUFYX0NPTFMgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNwZWMgcmVjb21tZW5kYXRpb246Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGN1cnNvciB3YXMgYXQgY29sIDMyLCBtb3ZlIGN1cnNvcgotICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGNvbCAzMSBhbmQgZXJhc2UgYm90aCBjb2wgMzEmMzIKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddLnNldENoYXJBdChNQVhfQ09MUywgVFMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY3IoKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yVG8obVJvdyArIDEsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByb2xsVXAoaW50IHdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdGFydFJvdyA9IG1Sb3cgLSB3aW5kb3dTaXplICsgMTsKLSAgICAgICAgICAgIGlmIChzdGFydFJvdyA8IDEpIHsKLSAgICAgICAgICAgICAgICBzdGFydFJvdyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSBzdGFydFJvdzsgaSA8IG1Sb3c7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG1MaW5lc1tpICsgMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSBtUm93OyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2xlYXIgYmFzZSByb3cKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBjb2wgMSwgaW4gY2FzZSBQQUMgaXMgbm90IHNlbnQKLSAgICAgICAgICAgIG1Db2wgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRDaGFyQXQobUNvbCwgdGV4dC5jaGFyQXQoaSkpOwotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVNaWRSb3dDb2RlKFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldE1pZFJvd0F0KG1Db2wsIG0pOwotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVBBQyhQQUMgcGFjKSB7Ci0gICAgICAgICAgICBpZiAocGFjLmlzSW5kZW50UEFDKCkpIHsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yVG8ocGFjLmdldFJvdygpLCBwYWMuZ2V0Q29sKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yVG8ocGFjLmdldFJvdygpLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0UEFDQXQobUNvbCwgcGFjKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTcGFubmFibGVTdHJpbmdCdWlsZGVyPiByb3dzID0gbmV3IEFycmF5TGlzdDw+KE1BWF9ST1dTKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICByb3dzLmFkZChtTGluZXNbaV0gIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGluZXNbaV0uZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpIDogbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93cy50b0FycmF5KG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyW01BWF9ST1dTXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2xhbXAoaW50IHgsIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIHJldHVybiB4IDwgbWluID8gbWluIDogKHggPiBtYXggPyBtYXggOiB4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG8oaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICAgICAgbUNvbCA9IGNsYW1wKGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUb1JvdyhpbnQgcm93KSB7Ci0gICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvckJ5Q29sKGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChtQ29sICsgY29sLCAxLCBNQVhfQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUJhc2VsaW5lVG8oaW50IGJhc2VSb3csIGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVJvdyA9PSBiYXNlUm93KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGFjdHVhbFdpbmRvd1NpemUgPSB3aW5kb3dTaXplOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IGJhc2VSb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gbVJvdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpZiAoYmFzZVJvdyA8IG1Sb3cpIHsKLSAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gYm90dG9tIHRvIHRvcCByb3cKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBhY3R1YWxXaW5kb3dTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gdG9wIHRvIGJvdHRvbSByb3cKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsV2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNsZWFyIHJlc3Qgb2YgdGhlIHJvd3MKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYmFzZVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSBiYXNlUm93ICsgMTsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIENDTGluZUJ1aWxkZXIgZ2V0TGluZUJ1ZmZlcihpbnQgcm93KSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW3Jvd10gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1tyb3ddID0gbmV3IENDTGluZUJ1aWxkZXIobUJsYW5rTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUxpbmVzW3Jvd107Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENDRGF0YSBwYXJzZXMgdGhlIHJhdyBDQyBieXRlIHBhaXIgaW50byBkaXNwbGF5YWJsZSBjaGFycywKLSAgICAgKiBtaXNjIGNvbnRyb2wgY29kZXMsIE1pZC1Sb3cgb3IgUHJlYW1ibGUgQWRkcmVzcyBDb2Rlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0RhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbVR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtRGF0YTE7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtRGF0YTI7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbUN0cmxDb2RlTWFwID0gewotICAgICAgICAgICAgIlJDTCIsICJCUyIgLCAiQU9GIiwgIkFPTiIsCi0gICAgICAgICAgICAiREVSIiwgIlJVMiIsICJSVTMiLCAiUlU0IiwKLSAgICAgICAgICAgICJGT04iLCAiUkRDIiwgIlRSIiAsICJSVEQiLAotICAgICAgICAgICAgIkVETSIsICJDUiIgLCAiRU5NIiwgIkVPQyIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVNwZWNpYWxDaGFyTWFwID0gewotICAgICAgICAgICAgIlx1MDBBRSIsCi0gICAgICAgICAgICAiXHUwMEIwIiwKLSAgICAgICAgICAgICJcdTAwQkQiLAotICAgICAgICAgICAgIlx1MDBCRiIsCi0gICAgICAgICAgICAiXHUyMTIyIiwKLSAgICAgICAgICAgICJcdTAwQTIiLAotICAgICAgICAgICAgIlx1MDBBMyIsCi0gICAgICAgICAgICAiXHUyNjZBIiwgLy8gRWlnaHRoIG5vdGUKLSAgICAgICAgICAgICJcdTAwRTAiLAotICAgICAgICAgICAgIlx1MDBBMCIsIC8vIFRyYW5zcGFyZW50IHNwYWNlCi0gICAgICAgICAgICAiXHUwMEU4IiwKLSAgICAgICAgICAgICJcdTAwRTIiLAotICAgICAgICAgICAgIlx1MDBFQSIsCi0gICAgICAgICAgICAiXHUwMEVFIiwKLSAgICAgICAgICAgICJcdTAwRjQiLAotICAgICAgICAgICAgIlx1MDBGQiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVNwYW5pc2hDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gU3BhbmlzaCBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDMSIsIC8vIEEKLSAgICAgICAgICAgICJcdTAwQzkiLCAvLyBFCi0gICAgICAgICAgICAiXHUwMEQzIiwgLy8gSQotICAgICAgICAgICAgIlx1MDBEQSIsIC8vIE8KLSAgICAgICAgICAgICJcdTAwREMiLCAvLyBVCi0gICAgICAgICAgICAiXHUwMEZDIiwgLy8gdQotICAgICAgICAgICAgIlx1MjAxOCIsIC8vIG9wZW5pbmcgc2luZ2xlIHF1b3RlCi0gICAgICAgICAgICAiXHUwMEExIiwgLy8gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyawotICAgICAgICAgICAgIioiLAotICAgICAgICAgICAgIiciLAotICAgICAgICAgICAgIlx1MjAxNCIsIC8vIGVtIGRhc2gKLSAgICAgICAgICAgICJcdTAwQTkiLCAvLyBDb3B5cmlnaHQKLSAgICAgICAgICAgICJcdTIxMjAiLCAvLyBTZXJ2aWNlbWFyawotICAgICAgICAgICAgIlx1MjAyMiIsIC8vIHJvdW5kIGJ1bGxldAotICAgICAgICAgICAgIlx1MjAxQyIsIC8vIG9wZW5pbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAiXHUyMDFEIiwgLy8gY2xvc2luZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgIC8vIEZyZW5jaAotICAgICAgICAgICAgIlx1MDBDMCIsCi0gICAgICAgICAgICAiXHUwMEMyIiwKLSAgICAgICAgICAgICJcdTAwQzciLAotICAgICAgICAgICAgIlx1MDBDOCIsCi0gICAgICAgICAgICAiXHUwMENBIiwKLSAgICAgICAgICAgICJcdTAwQ0IiLAotICAgICAgICAgICAgIlx1MDBFQiIsCi0gICAgICAgICAgICAiXHUwMENFIiwKLSAgICAgICAgICAgICJcdTAwQ0YiLAotICAgICAgICAgICAgIlx1MDBFRiIsCi0gICAgICAgICAgICAiXHUwMEQ0IiwKLSAgICAgICAgICAgICJcdTAwRDkiLAotICAgICAgICAgICAgIlx1MDBGOSIsCi0gICAgICAgICAgICAiXHUwMERCIiwKLSAgICAgICAgICAgICJcdTAwQUIiLAotICAgICAgICAgICAgIlx1MDBCQiIKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtUHJvdHVndWVzZUNoYXJNYXAgPSB7Ci0gICAgICAgICAgICAvLyBQb3J0dWd1ZXNlCi0gICAgICAgICAgICAiXHUwMEMzIiwKLSAgICAgICAgICAgICJcdTAwRTMiLAotICAgICAgICAgICAgIlx1MDBDRCIsCi0gICAgICAgICAgICAiXHUwMENDIiwKLSAgICAgICAgICAgICJcdTAwRUMiLAotICAgICAgICAgICAgIlx1MDBEMiIsCi0gICAgICAgICAgICAiXHUwMEYyIiwKLSAgICAgICAgICAgICJcdTAwRDUiLAotICAgICAgICAgICAgIlx1MDBGNSIsCi0gICAgICAgICAgICAieyIsCi0gICAgICAgICAgICAifSIsCi0gICAgICAgICAgICAiXFwiLAotICAgICAgICAgICAgIl4iLAotICAgICAgICAgICAgIl8iLAotICAgICAgICAgICAgInwiLAotICAgICAgICAgICAgIn4iLAotICAgICAgICAgICAgLy8gR2VybWFuIGFuZCBtaXNjIGNoYXJzCi0gICAgICAgICAgICAiXHUwMEM0IiwKLSAgICAgICAgICAgICJcdTAwRTQiLAotICAgICAgICAgICAgIlx1MDBENiIsCi0gICAgICAgICAgICAiXHUwMEY2IiwKLSAgICAgICAgICAgICJcdTAwREYiLAotICAgICAgICAgICAgIlx1MDBBNSIsCi0gICAgICAgICAgICAiXHUwMEE0IiwKLSAgICAgICAgICAgICJcdTI1MDIiLCAvLyB2ZXJ0aWNhbCBiYXIKLSAgICAgICAgICAgICJcdTAwQzUiLAotICAgICAgICAgICAgIlx1MDBFNSIsCi0gICAgICAgICAgICAiXHUwMEQ4IiwKLSAgICAgICAgICAgICJcdTAwRjgiLAotICAgICAgICAgICAgIlx1MjUwQyIsIC8vIHRvcC1sZWZ0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxMCIsIC8vIHRvcC1yaWdodCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTQiLCAvLyBsb3dlci1sZWZ0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxOCIsIC8vIGxvd2VyLXJpZ2h0IGNvcm5lcgotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBDQ0RhdGFbXSBmcm9tQnl0ZUFycmF5KGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBuZXcgQ0NEYXRhW2RhdGEubGVuZ3RoIC8gM107Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2NEYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2NEYXRhW2ldID0gbmV3IENDRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDNdLAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogMyArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogMyArIDJdKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNjRGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIENDRGF0YShieXRlIHR5cGUsIGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgICAgIG1EYXRhMSA9IGRhdGExOwotICAgICAgICAgICAgbURhdGEyID0gZGF0YTI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q3RybENvZGUoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE0IHx8IG1EYXRhMSA9PSAweDFjKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZSBnZXRNaWRSb3coKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IHN1cHBvcnQgc3RhbmRhcmQgTWlkLXJvdyBjb2RlcywgaWdub3JlCi0gICAgICAgICAgICAvLyBvcHRpb25hbCBiYWNrZ3JvdW5kL2ZvcmVncm91bmQgbWlkLXJvdyBjb2RlcwotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGVDb2RlLmZyb21CeXRlKG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFBBQyBnZXRQQUMoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSAmIDB4NzApID09IDB4MTAKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1EYXRhMiAmIDB4NDApID09IDB4NDAKLSAgICAgICAgICAgICAgICAgICAgJiYgKChtRGF0YTEgJiAweDA3KSAhPSAwIHx8IChtRGF0YTIgJiAweDIwKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBQQUMuZnJvbUJ5dGVzKG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFRhYk9mZnNldCgpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTcgfHwgbURhdGExID09IDB4MWYpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIxICYmIG1EYXRhMiA8PSAweDIzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMiAmIDB4MzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc3BsYXlhYmxlQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0Jhc2ljQ2hhcigpIHx8IGlzU3BlY2lhbENoYXIoKSB8fCBpc0V4dGVuZGVkQ2hhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERpc3BsYXlUZXh0KCkgewotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGdldEJhc2ljQ2hhcnMoKTsKLQotICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gIGdldFNwZWNpYWxDaGFyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gZ2V0RXh0ZW5kZWRDaGFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3RyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY3RybENvZGVUb1N0cmluZyhpbnQgY3RybENvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3RybENvZGVNYXBbY3RybENvZGUgLSAweDIwXTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jhc2ljQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NwZWNpYWxDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDMwICYmIG1EYXRhMiA8PSAweDNmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuZGVkQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDEyIHx8IG1EYXRhMSA9PSAweDFBCi0gICAgICAgICAgICAgICAgICAgIHx8IG1EYXRhMSA9PSAweDEzIHx8IG1EYXRhMSA9PSAweDFCKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGNoYXIgZ2V0QmFzaWNDaGFyKGJ5dGUgZGF0YSkgewotICAgICAgICAgICAgY2hhciBjOwotICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgbm9uLUFTQ0lJIG9uZXMKLSAgICAgICAgICAgIHN3aXRjaCAoZGF0YSkgewotICAgICAgICAgICAgICAgIGNhc2UgMHgyQTogYyA9ICdcdTAwRTEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUM6IGMgPSAnXHUwMEU5JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVFOiBjID0gJ1x1MDBFRCc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RjogYyA9ICdcdTAwRjMnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NjA6IGMgPSAnXHUwMEZBJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdCOiBjID0gJ1x1MDBFNyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QzogYyA9ICdcdTAwRjcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Q6IGMgPSAnXHUwMEQxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdFOiBjID0gJ1x1MDBGMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RjogYyA9ICdcdTI1ODgnOyBicmVhazsgLy8gRnVsbCBibG9jawotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGMgPSAoY2hhcikgZGF0YTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEJhc2ljQ2hhcnMoKSB7Ci0gICAgICAgICAgICBpZiAobURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigyKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGExKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDMwICYmIG1EYXRhMiA8PSAweDNmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsQ2hhck1hcFttRGF0YTIgLSAweDMwXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDEyIHx8IG1EYXRhMSA9PSAweDFBKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZil7Ci0gICAgICAgICAgICAgICAgLy8gMSBTcGFuaXNoL0ZyZW5jaCBjaGFyCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1TcGFuaXNoQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1EYXRhMSA9PSAweDEzIHx8IG1EYXRhMSA9PSAweDFCKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZil7Ci0gICAgICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtUHJvdHVndWVzZUNoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyOwotCi0gICAgICAgICAgICBpZiAobURhdGExIDwgMHgxMCAmJiBtRGF0YTIgPCAweDEwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTnVsbCBQYWQsIGlnbm9yZQotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdTnVsbDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGN0cmxDb2RlID0gZ2V0Q3RybENvZGUoKTsKLSAgICAgICAgICAgIGlmIChjdHJsQ29kZSAhPSBJTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF0lcyIsIG1UeXBlLCBjdHJsQ29kZVRvU3RyaW5nKGN0cmxDb2RlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB0YWJPZmZzZXQgPSBnZXRUYWJPZmZzZXQoKTsKLSAgICAgICAgICAgIGlmICh0YWJPZmZzZXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1UYWIlZCIsIG1UeXBlLCB0YWJPZmZzZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQQUMgcGFjID0gZ2V0UEFDKCk7Ci0gICAgICAgICAgICBpZiAocGFjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVBBQzogJXMiLCBtVHlwZSwgcGFjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHlsZUNvZGUgbSA9IGdldE1pZFJvdygpOwotICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdTWlkLXJvdzogJXMiLCBtVHlwZSwgbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzRGlzcGxheWFibGVDaGFyKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXURpc3BsYXlhYmxlOiAlcyAoJTAyeCAlMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSwgZ2V0RGlzcGxheVRleHQoKSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogV2lkZ2V0IGNhcGFibGUgb2YgcmVuZGVyaW5nIENFQS02MDggY2xvc2VkIGNhcHRpb25zLgotICovCi1jbGFzcyBDZWE2MDhDQ1dpZGdldCBleHRlbmRzIENsb3NlZENhcHRpb25XaWRnZXQgaW1wbGVtZW50cyBDZWE2MDhDQ1BhcnNlci5EaXNwbGF5TGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY3QgbVRleHRCb3VuZHMgPSBuZXcgUmVjdCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtRHVtbXlUZXh0ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQiOwotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAotICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbkxheW91dCBjcmVhdGVDYXB0aW9uTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gbmV3IENDTGF5b3V0KGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKSB7Ci0gICAgICAgICgoQ0NMYXlvdXQpIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS51cGRhdGUoc3R5bGVkVGV4dHMpOwotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ2hhbmdlZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDYXB0aW9uU3R5bGUgZ2V0Q2FwdGlvblN0eWxlKCkgewotICAgICAgICByZXR1cm4gbUNhcHRpb25TdHlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCb3ggZXh0ZW5kcyBUZXh0VmlldyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEZPTlRfUEFERElOR19SQVRJTyA9IDAuNzVmOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFREdFX09VVExJTkVfUkFUSU8gPSAwLjFmOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFREdFX1NIQURPV19SQVRJTyA9IDAuMDVmOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1PdXRsaW5lV2lkdGg7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd1JhZGl1czsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93T2Zmc2V0OwotCi0gICAgICAgIHByaXZhdGUgaW50IG1UZXh0Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJnQ29sb3IgPSBDb2xvci5CTEFDSzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VUeXBlID0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9OT05FOwotICAgICAgICBwcml2YXRlIGludCBtRWRnZUNvbG9yID0gQ29sb3IuVFJBTlNQQVJFTlQ7Ci0KLSAgICAgICAgQ0NMaW5lQm94KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSKTsKLSAgICAgICAgICAgIHNldEJhY2tncm91bmRDb2xvcihDb2xvci5UUkFOU1BBUkVOVCk7Ci0gICAgICAgICAgICBzZXRUZXh0Q29sb3IoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgc2V0VHlwZWZhY2UoVHlwZWZhY2UuTU9OT1NQQUNFKTsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGRlZmF1bHQgKHdpbGwgYmUgdXBkYXRlZCBsYXRlciBkdXJpbmcgbWVhc3VyZSkKLSAgICAgICAgICAgIG1PdXRsaW5lV2lkdGggPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX291dGxpbmVfd2lkdGgpOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X3JhZGl1cyk7Ci0gICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIG1UZXh0Q29sb3IgPSBjYXB0aW9uU3R5bGUuZm9yZWdyb3VuZENvbG9yOwotICAgICAgICAgICAgbUJnQ29sb3IgPSBjYXB0aW9uU3R5bGUuYmFja2dyb3VuZENvbG9yOwotICAgICAgICAgICAgbUVkZ2VUeXBlID0gY2FwdGlvblN0eWxlLmVkZ2VUeXBlOwotICAgICAgICAgICAgbUVkZ2VDb2xvciA9IGNhcHRpb25TdHlsZS5lZGdlQ29sb3I7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIG1TaGFkb3dPZmZzZXQsIG1TaGFkb3dPZmZzZXQsIG1FZGdlQ29sb3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgZmxvYXQgZm9udFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKSAqIEZPTlRfUEFERElOR19SQVRJTzsKLSAgICAgICAgICAgIHNldFRleHRTaXplKFR5cGVkVmFsdWUuQ09NUExFWF9VTklUX1BYLCBmb250U2l6ZSk7Ci0KLSAgICAgICAgICAgIG1PdXRsaW5lV2lkdGggPSBFREdFX09VVExJTkVfUkFUSU8gKiBmb250U2l6ZSArIDEuMGY7Ci0gICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gRURHRV9TSEFET1dfUkFUSU8gKiBmb250U2l6ZSArIDEuMGY7OwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IG1TaGFkb3dSYWRpdXM7Ci0KLSAgICAgICAgICAgIC8vIHNldCBmb250IHNjYWxlIGluIHRoZSBYIGRpcmVjdGlvbiB0byBtYXRjaCB0aGUgcmVxdWlyZWQgd2lkdGgKLSAgICAgICAgICAgIHNldFNjYWxlWCgxLjBmKTsKLSAgICAgICAgICAgIGdldFBhaW50KCkuZ2V0VGV4dEJvdW5kcyhtRHVtbXlUZXh0LCAwLCBtRHVtbXlUZXh0Lmxlbmd0aCgpLCBtVGV4dEJvdW5kcyk7Ci0gICAgICAgICAgICBmbG9hdCBhY3R1YWxUZXh0V2lkdGggPSBtVGV4dEJvdW5kcy53aWR0aCgpOwotICAgICAgICAgICAgZmxvYXQgcmVxdWlyZWRUZXh0V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgc2V0U2NhbGVYKHJlcXVpcmVkVGV4dFdpZHRoIC8gYWN0dWFsVGV4dFdpZHRoKTsKLQotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9VTlNQRUNJRklFRAotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9OT05FCi0gICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlc2UgZWRnZSBzdHlsZXMgZG9uJ3QgcmVxdWlyZSBhIHNlY29uZCBwYXNzCi0gICAgICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX09VVExJTkUpIHsKLSAgICAgICAgICAgICAgICBkcmF3RWRnZU91dGxpbmUoYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFJhaXNlZCBvciBkZXByZXNzZWQKLSAgICAgICAgICAgICAgICBkcmF3RWRnZVJhaXNlZE9yRGVwcmVzc2VkKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlT3V0bGluZShDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIFBhaW50LkpvaW4gcHJldmlvdXNKb2luID0gdGV4dFBhaW50LmdldFN0cm9rZUpvaW4oKTsKLSAgICAgICAgICAgIGZsb2F0IHByZXZpb3VzV2lkdGggPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlV2lkdGgoKTsKLQotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1FZGdlQ29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTExfQU5EX1NUUk9LRSk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlSm9pbihQYWludC5Kb2luLlJPVU5EKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChtT3V0bGluZVdpZHRoKTsKLQotICAgICAgICAgICAgLy8gRHJhdyBvdXRsaW5lIGFuZCBiYWNrZ3JvdW5kIG9ubHkuCi0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc2V0dGluZ3MuCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlSm9pbihwcmV2aW91c0pvaW4pOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKHByZXZpb3VzV2lkdGgpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgLy8gRHJhdyBmb3JlZ3JvdW5kIG9ubHkuCi0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZVJhaXNlZE9yRGVwcmVzc2VkKENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKLQotICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJhaXNlZCA9IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1JBSVNFRDsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvclVwID0gcmFpc2VkID8gQ29sb3IuV0hJVEUgOiBtRWRnZUNvbG9yOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yRG93biA9IHJhaXNlZCA/IG1FZGdlQ29sb3IgOiBDb2xvci5XSElURTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldCA9IG1TaGFkb3dSYWRpdXMgLyAyZjsKLQotICAgICAgICAgICAgLy8gRHJhdyBiYWNrZ3JvdW5kIGFuZCB0ZXh0IHdpdGggc2hhZG93IHVwCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCAtb2Zmc2V0LCAtb2Zmc2V0LCBjb2xvclVwKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLQotICAgICAgICAgICAgLy8gRHJhdyB0ZXh0IHdpdGggc2hhZG93IGRvd24KLSAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsICtvZmZzZXQsICtvZmZzZXQsIGNvbG9yRG93bik7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgc2V0dGluZ3MKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0QmFja2dyb3VuZFNwYW5zKGludCBjb2xvcikgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBnZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUgPSAoU3Bhbm5hYmxlKSB0ZXh0OwotICAgICAgICAgICAgICAgIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuW10gYmdTcGFucyA9IHNwYW5uYWJsZS5nZXRTcGFucygKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNwYW5uYWJsZS5sZW5ndGgoKSwgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmdTcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBiZ1NwYW5zW2ldLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMYXlvdXQgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBDbG9zZWRDYXB0aW9uTGF5b3V0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gQ2VhNjA4Q0NQYXJzZXIuTUFYX1JPV1M7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFNBRkVfQVJFQV9SQVRJTyA9IDAuOWY7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCb3hbXSBtTGluZUJveGVzID0gbmV3IENDTGluZUJveFtNQVhfUk9XU107Ci0KLSAgICAgICAgQ0NMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5TVEFSVCk7Ci0gICAgICAgICAgICBzZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXSA9IG5ldyBDQ0xpbmVCb3goZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICBhZGRWaWV3KG1MaW5lQm94ZXNbaV0sIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldENhcHRpb25TdHlsZShjYXB0aW9uU3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZXMgdGhlIGZvbnQgc2NhbGUgY2hhbmdlcyBvZiB0aGUgc3lzdGVtIHdpZGUgQ0MgcHJlZmVyZW5jZS4KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSB0ZXh0QnVmZmVyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodGV4dEJ1ZmZlcltpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VGV4dCh0ZXh0QnVmZmVyW2ldLCBUZXh0Vmlldy5CdWZmZXJUeXBlLlNQQU5OQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoID0gZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgaW50IHNhZmVIZWlnaHQgPSBnZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAvLyBDRUEtNjA4IGFzc3VtZXMgNDozIHZpZGVvCi0gICAgICAgICAgICBpZiAoc2FmZVdpZHRoICogMyA+PSBzYWZlSGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHNhZmVIZWlnaHQgKiA0IC8gMzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHNhZmVXaWR0aCAqIDMgLyA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOwotCi0gICAgICAgICAgICBpbnQgbGluZUhlaWdodCA9IHNhZmVIZWlnaHQgLyBNQVhfUk9XUzsKLSAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgaW50IGxpbmVXaWR0aE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBzYWZlV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLm1lYXN1cmUobGluZVdpZHRoTWVhc3VyZVNwZWMsIGxpbmVIZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICAgICAgLy8gc2FmZSBjYXB0aW9uIGFyZWEKLSAgICAgICAgICAgIGludCB2aWV3UG9ydFdpZHRoID0gciAtIGw7Ci0gICAgICAgICAgICBpbnQgdmlld1BvcnRIZWlnaHQgPSBiIC0gdDsKLSAgICAgICAgICAgIGludCBzYWZlV2lkdGgsIHNhZmVIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBDRUEtNjA4IGFzc3VtZXMgNDozIHZpZGVvCi0gICAgICAgICAgICBpZiAodmlld1BvcnRXaWR0aCAqIDMgPj0gdmlld1BvcnRIZWlnaHQgKiA0KSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRIZWlnaHQgKiA0IC8gMzsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRIZWlnaHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0V2lkdGg7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0V2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gKHZpZXdQb3J0V2lkdGggLSBzYWZlV2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGludCB0b3AgPSAodmlld1BvcnRIZWlnaHQgLSBzYWZlSGVpZ2h0KSAvIDI7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubGF5b3V0KAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiBpIC8gTUFYX1JPV1MsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgc2FmZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIChpICsgMSkgLyBNQVhfUk9XUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzZkN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotLy8gTm90ZTogVGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGFuZHJvaWQubWVkaWEuTWVkaWFUaW1lUHJvdmlkZXIuCi1wdWJsaWMgaW50ZXJmYWNlIE1lZGlhVGltZVByb3ZpZGVyIHsKLSAgICAvLyB3ZSBkbyBub3QgYWxsb3cgbmVnYXRpdmUgbWVkaWEgdGltZQotICAgIC8qKgotICAgICAqIFByZXNlbnRhdGlvbiB0aW1lIHZhbHVlIGlmIG5vIHRpbWVkIGV2ZW50IG5vdGlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIE5PX1RJTUUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAotICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRpbWVVcyBpcwotICAgICAqIG5vdCBuZWdhdGl2ZSwgaXQgYWxzbyByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIGZvciBhIHRpbWVkIGV2ZW50Ci0gICAgICogbm90aWZpY2F0aW9uIHdoZW4gdGhlIHByZXNlbnRhdGlvbiB0aW1lIHJlYWNoZXMgKGJlY29tZXMgZ3JlYXRlcikgdGhhbgotICAgICAqIHRoZSB2YWx1ZSBzcGVjaWZpZWQuICBUaGlzIGhhcHBlbnMgaW1tZWRpYXRlbHkgaWYgdGhlIGN1cnJlbnQgbWVkaWEgdGltZQotICAgICAqIGlzIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRpbWVVcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lVXMgcHJlc2VudGF0aW9uIHRpbWUgdG8gZ2V0IHRpbWVkIGV2ZW50IGNhbGxiYWNrIGF0IChvcgotICAgICAqICAgICAgICAgICAgICAge0BsaW5rICNOT19USU1FfSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlBdChsb25nIHRpbWVVcywgT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aGUgbWVkaWEKLSAgICAgKiBpcyBzdG9wcGVkLCB0aGUgbGlzdGVuZXIgd2lsbCBpbW1lZGlhdGVseSByZWNlaXZlIGEgc3RvcCBub3RpZmljYXRpb24uCi0gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHJlY2VpdmUgYSB0aW1lZCBldmVudCBub3RpZmljYXRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZVVwZGF0ZShPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsTm90aWZpY2F0aW9ucyhPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBwcmVzZW50YXRpb24gdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVjaXNlICAgV2hldGhlciBnZXR0aW5nIGEgcHJlY2lzZSB0aW1lIGlzIGltcG9ydGFudC4gVGhpcyBpcwotICAgICAqICAgICAgICAgICAgICAgICAgbW9yZSBjb3N0bHkuCi0gICAgICogQHBhcmFtIG1vbm90b25pYyBXaGV0aGVyIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIG1vbm90b25pYzogdGhhdCBpcywKLSAgICAgKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGFzdCByZXR1cm5lZCB0aW1lLiAgRG9uJ3QKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhpcyB0byB0cnVlLiAgRS5nLiB0aGlzIGhhcyB1bmRlc2lyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnNlcXVlbmNlcyBpZiB0aGUgbWVkaWEgaXMgc2Vla2VkIGJldHdlZW4gY2FsbHMuCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG1lZGlhIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRUaW1lVXMoYm9vbGVhbiBwcmVjaXNlLCBib29sZWFuIG1vbm90b25pYykKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZWdpc3RlcmVkIHRpbWUgd2FzIHJlYWNoZWQgbmF0dXJhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdGltZVVzIGN1cnJlbnQgbWVkaWEgdGltZQotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvblRpbWVkRXZlbnQobG9uZyB0aW1lVXMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbWVkaWEgdGltZSBjaGFuZ2VkIGR1ZSB0byBzZWVraW5nLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdGltZVVzIGN1cnJlbnQgbWVkaWEgdGltZQotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvblNlZWsobG9uZyB0aW1lVXMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGxheWJhY2sgc3RvcHBlZC4gIFRoaXMgaXMgbm90IGNhbGxlZCBvbiBwYXVzZSwgb25seQotICAgICAgICAgKiBvbiBmdWxsIHN0b3AsIGF0IHdoaWNoIHBvaW50IHRoZXJlIGlzIG5vIGZ1cnRoZXIgY3VycmVudCBtZWRpYSB0aW1lLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvblN0b3AoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQ1NWQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlQ29udHJvbGxlciBzaW5jZSBQCi0vKioKLSAqIFRoZSBzdWJ0aXRsZSBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBhcmNoaXRlY3R1cmUgdG8gZGlzcGxheSBzdWJ0aXRsZXMgZm9yIGEKLSAqIG1lZGlhIHNvdXJjZS4gIEl0IGFsbG93cyBzcGVjaWZ5aW5nIHdoaWNoIHRyYWNrcyB0byBkaXNwbGF5LCBvbiB3aGljaCBhbmNob3IKLSAqIHRvIGRpc3BsYXkgdGhlbSwgYW5kIGFsc28gYWxsb3dzIGFkZGluZyBleHRlcm5hbCwgb3V0LW9mLWJhbmQgc3VidGl0bGUgdHJhY2tzLgotICovCi1wdWJsaWMgY2xhc3MgU3VidGl0bGVDb250cm9sbGVyIHsKLSAgICBwcml2YXRlIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBWZWN0b3I8UmVuZGVyZXI+IG1SZW5kZXJlcnM7Ci0gICAgcHJpdmF0ZSBWZWN0b3I8U3VidGl0bGVUcmFjaz4gbVRyYWNrczsKLSAgICBwcml2YXRlIFN1YnRpdGxlVHJhY2sgbVNlbGVjdGVkVHJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nOwotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIgbUNhcHRpb25pbmdNYW5hZ2VyOwotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NIT1cgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX0hJREUgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0sgPSA0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyLkNhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBIYW5kbGVyLkNhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgY2FzZSBXSEFUX1NIT1c6Ci0gICAgICAgICAgICAgICAgZG9TaG93KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfSElERToKLSAgICAgICAgICAgICAgICBkb0hpZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TRUxFQ1RfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3RUcmFjaygoU3VidGl0bGVUcmFjayltc2cub2JqKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSzoKLSAgICAgICAgICAgICAgICBkb1NlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciA9Ci0gICAgICAgIG5ldyBDYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5hYmxlZENoYW5nZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2NhbGVDaGFuZ2VkKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN1YnRpdGxlIGNvbnRyb2xsZXIgZm9yIGEgbWVkaWEgcGxheWJhY2sgb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotICAgICAqIHRoZSBNZWRpYVRpbWVQcm92aWRlciBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIE1lZGlhVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlciwKLSAgICAgICAgICAgIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotCi0gICAgICAgIG1SZW5kZXJlcnMgPSBuZXcgVmVjdG9yPFJlbmRlcmVyPigpOwotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgICAgICBtVHJhY2tzID0gbmV3IFZlY3RvcjxTdWJ0aXRsZVRyYWNrPigpOwotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIgPQotICAgICAgICAgICAgKENhcHRpb25pbmdNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgc3VidGl0bGUgdHJhY2tzIGZvciB0aGlzIG1lZGlhLiBUaGVzZSBpbmNsdWRlCi0gICAgICogdGhlIHRyYWNrcyBmb3VuZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9IGFzIHdlbGwgYXMgYW55IHRyYWNrcyBhZGRlZAotICAgICAqIG1hbnVhbGx5IHZpYSB7QGxpbmsgI2FkZFRyYWNrfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFja1tdIGdldFRyYWNrcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgIFN1YnRpdGxlVHJhY2tbXSB0cmFja3MgPSBuZXcgU3VidGl0bGVUcmFja1ttVHJhY2tzLnNpemUoKV07Ci0gICAgICAgICAgICBtVHJhY2tzLnRvQXJyYXkodHJhY2tzKTsKLSAgICAgICAgICAgIHJldHVybiB0cmFja3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXRTZWxlY3RlZFRyYWNrKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgewotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrLmdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYSBzdWJ0aXRsZSB0cmFjay4gIEFzIGEgcmVzdWx0LCB0aGlzIHRyYWNrIHdpbGwgcmVjZWl2ZQotICAgICAqIGluLWJhbmQgZGF0YSBmcm9tIHRoZSB7QGxpbmsgTWVkaWFQbGF5ZXJ9LiAgSG93ZXZlciwgdGhpcyBkb2VzCi0gICAgICogbm90IGNoYW5nZSB0aGUgc3VidGl0bGUgdmlzaWJpbGl0eS4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHN1YnRpdGxlIHRyYWNrIHRvIHNlbGVjdC4gIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgIHRyYWNrcyBpbiB7QGxpbmsgI2dldFRyYWNrc30uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFjayB3YXMgc3VjY2Vzc2Z1bGx5IHNlbGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwgJiYgIW1UcmFja3MuY29udGFpbnModHJhY2spKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NFTEVDVF9UUkFDSywgdHJhY2spKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgewotICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IHRyYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suaGlkZSgpOwotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2V0VGltZVByb3ZpZGVyKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSB0cmFjazsKLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2V0VGltZVByb3ZpZGVyKG1UaW1lUHJvdmlkZXIpOwotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQodHJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBzdWJ0aXRsZSB0cmFjayBiYXNlZCBvbiBzeXN0ZW0gcHJlZmVyZW5jZXMsIG9yIG51bGwsCi0gICAgICogaWYgbm8gc3VjaCB0cmFjayBleGlzdHMgaW4gdGhpcyBtYW5hZ2VyLgotICAgICAqCi0gICAgICogU3VwcG9ydHMgSExTLWZsYWdzOiBBVVRPU0VMRUNULCBGT1JDRUQgJiBERUZBVUxULgotICAgICAqCi0gICAgICogMS4gSWYgY2FwdGlvbmluZyBpcyBkaXNhYmxlZCwgb25seSBjb25zaWRlciBGT1JDRUQgdHJhY2tzLiBPdGhlcndpc2UsCi0gICAgICogY29uc2lkZXIgYWxsIHRyYWNrcywgYnV0IHByZWZlciBub24tRk9SQ0VEIG9uZXMuCi0gICAgICogMi4gSWYgdXNlciBzZWxlY3RlZCAiRGVmYXVsdCIgY2FwdGlvbiBsYW5ndWFnZToKLSAgICAgKiAgIGEuIElmIHRoZXJlIGlzIGEgY29uc2lkZXJlZCB0cmFjayB3aXRoIERFRkFVTFQ9eWVzLCByZXR1cm5zIHRoYXQgdHJhY2sKLSAgICAgKiAgICAgIChmYXZvciB0aGUgZmlyc3Qgb25lIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KLSAgICAgKiAgICAgIG9uZSBkZWZhdWx0IHRyYWNrcywgb3IgdGhlIGZpcnN0IGluIGdlbmVyYWwgaWYgbm9uZSBvZiB0aGVtIGFyZSBpbgotICAgICAqICAgICAgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UpLgotICAgICAqICAgYi4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhIHRyYWNrIHdpdGggQVVUT1NFTEVDVD15ZXMgaW4gdGhlIGN1cnJlbnQKLSAgICAgKiAgICAgIGxhbmd1YWdlLCByZXR1cm4gdGhhdCBvbmUuCi0gICAgICogICBjLiBJZiB0aGVyZSBhcmUgbm8gZGVmYXVsdCB0cmFja3MsIGFuZCBubyBhdXRvc2VsZWN0YWJsZSB0cmFja3MgaW4gdGhlCi0gICAgICogICAgICBjdXJyZW50IGxhbmd1YWdlLCByZXR1cm4gbnVsbC4KLSAgICAgKiAzLiBJZiB0aGVyZSBpcyBhIHRyYWNrIHdpdGggdGhlIGNhcHRpb24gbGFuZ3VhZ2UsIHNlbGVjdCB0aGF0IG9uZS4gIFByZWZlcgotICAgICAqIHRoZSBvbmUgd2l0aCBBVVRPU0VMRUNUPW5vLgotICAgICAqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZSBmbGFncyBhcmUgREVGQVVMVD1ubywgQVVUT1NFTEVDVD15ZXMKLSAgICAgKiBhbmQgRk9SQ0VEPW5vLgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgU3VidGl0bGVUcmFjayBiZXN0VHJhY2sgPSBudWxsOwotICAgICAgICBpbnQgYmVzdFNjb3JlID0gLTE7Ci0KLSAgICAgICAgTG9jYWxlIHNlbGVjdGVkTG9jYWxlID0gbUNhcHRpb25pbmdNYW5hZ2VyLmdldExvY2FsZSgpOwotICAgICAgICBMb2NhbGUgbG9jYWxlID0gc2VsZWN0ZWRMb2NhbGU7Ci0gICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHNlbGVjdEZvcmNlZCA9ICFtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgIGZvciAoU3VidGl0bGVUcmFjayB0cmFjazogbVRyYWNrcykgewotICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IHRyYWNrLmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX0xBTkdVQUdFKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlZCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDA7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvc2VsZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QsIDEpICE9IDA7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc19kZWZhdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQsIDApICE9IDA7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGxhbmd1YWdlTWF0Y2hlcyA9Ci0gICAgICAgICAgICAgICAgICAgIChsb2NhbGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMoIiIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkpOwotICAgICAgICAgICAgICAgIC8vIGlzX2RlZmF1bHQgaXMgbWVhbmluZ2xlc3MgdW5sZXNzIGNhcHRpb24gbGFuZ3VhZ2UgaXMgJ2RlZmF1bHQnCi0gICAgICAgICAgICAgICAgaW50IHNjb3JlID0gKGZvcmNlZCA/IDAgOiA4KSArCi0gICAgICAgICAgICAgICAgICAgICgoKHNlbGVjdGVkTG9jYWxlID09IG51bGwpICYmIGlzX2RlZmF1bHQpID8gNCA6IDApICsKLSAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgPyAwIDogMikgKyAobGFuZ3VhZ2VNYXRjaGVzID8gMSA6IDApOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdEZvcmNlZCAmJiAhZm9yY2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IG51bGwgbG9jYWxlL2xhbmd1YWdlIGFzIG1hdGNoaW5nIGFueSBsYW5ndWFnZQotICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCAmJiBpc19kZWZhdWx0KSB8fAotICAgICAgICAgICAgICAgICAgICAobGFuZ3VhZ2VNYXRjaGVzICYmCi0gICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCB8fCBmb3JjZWQgfHwgc2VsZWN0ZWRMb2NhbGUgIT0gbnVsbCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0VHJhY2sgPSB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVzdFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotCi0gICAgLyoqIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhbmNob3IgdGhyZWFkICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBpZiAobVRyYWNrSXNFeHBsaWNpdCkgewotICAgICAgICAgICAgLy8gSWYgdHJhY2sgc2VsZWN0aW9uIGlzIGV4cGxpY2l0LCBidXQgdmlzaWJpbGl0eQotICAgICAgICAgICAgLy8gaXMgbm90LCBpdCBmYWxscyBiYWNrIHRvIHRoZSBjYXB0aW9uaW5nIHNldHRpbmcKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKSB8fAotICAgICAgICAgICAgICAgICAgICAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suZ2V0Rm9ybWF0KCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwKSkgewotICAgICAgICAgICAgICAgICAgICBzaG93KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtU2VsZWN0ZWRUcmFjay5nZXRUcmFja1R5cGUoKSA9PSBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICAgICAgICAgICAgICBoaWRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgY2FuIGhhdmUgYSBkZWZhdWx0IChmb3JjZWQpIHRyYWNrIGV2ZW4gaWYgY2FwdGlvbmluZwotICAgICAgICAvLyBpcyBub3QgZW5hYmxlZC4gIFRoaXMgaXMgaGFuZGxlZCBieSBnZXREZWZhdWx0VHJhY2soKS4KLSAgICAgICAgLy8gU2hvdyB0aGlzIHRyYWNrIHVubGVzcyBzdWJ0aXRsZXMgd2VyZSBleHBsaWNpdGx5IGhpZGRlbi4KLSAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IGdldERlZmF1bHRUcmFjaygpOwotICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VsZWN0VHJhY2sodHJhY2spOwotICAgICAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKLSAgICAgICAgICAgICAgICBzaG93KCk7Ci0gICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogbXVzdCBiZSBjYWxsZWQgZnJvbSBhbmNob3IgdGhyZWFkICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgIGhpZGUoKTsKLSAgICAgICAgc2VsZWN0VHJhY2sobnVsbCk7Ci0gICAgICAgIG1UcmFja3MuY2xlYXIoKTsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3LCBleHRlcm5hbCBzdWJ0aXRsZSB0cmFjayB0byB0aGUgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBhZGRUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcmVuZGVyZXIuY3JlYXRlVHJhY2soZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TSE9XKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2hvdygpIHsKLSAgICAgICAgbVNob3dpbmcgPSB0cnVlOwotICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2hvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGlkZSB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX0hJREUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9IaWRlKCkgewotICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suaGlkZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1TaG93aW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBzdXBwb3J0aW5nIGEgc2luZ2xlIG9yIG11bHRpcGxlIHN1YnRpdGxlIHR5cGVzIGluIHtAbGluawotICAgICAqIE1lZGlhUGxheWVyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFJlbmRlcmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9J3Mge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlcn0gd2hlbiBhIG5ldwotICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayBpcyBkZXRlY3RlZCwgdG8gc2VlIGlmIGl0IHNob3VsZCB1c2UgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogcGFyc2UgYW5kIGRpc3BsYXkgdGhpcyBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFjayBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKLSAgICAgICAgICogcmVuZGVyZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9J3Mge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlcn0gZm9yIGVhY2gKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgdGhhdCB3YXMgZGV0ZWN0ZWQgYW5kIGlzIHN1cHBvcnRlZCBieSB0aGlzIG9iamVjdCB0bwotICAgICAgICAgKiBjcmVhdGUgYSB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0LiAgVGhpcyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkCi0gICAgICAgICAqIGZvciBlYWNoIHRyYWNrIHRoYXQgd2FzIGZvdW5kLiAgSWYgdGhlIHRyYWNrIGlzIHNlbGVjdGVkIGZvciBkaXNwbGF5LAotICAgICAgICAgKiB0aGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UgYW5kIGRpc3BsYXkgdGhlIHRyYWNrIGRhdGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBhcnNlCi0gICAgICAgICAqIGFuZCByZW5kZXIgdGhlIHN1YnRpdGxlIHRyYWNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IFN1YnRpdGxlVHJhY2sgY3JlYXRlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgc3VwcG9ydCBmb3IgYSBzdWJ0aXRsZSBmb3JtYXQgaW4ge0BsaW5rIE1lZGlhUGxheWVyfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW5kZXJlciBhIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXJ9IG9iamVjdCB0aGF0IGFkZHMKLSAgICAgKiAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgYSBzdWJ0aXRsZSBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZW5kZXJlcihSZW5kZXJlciByZW5kZXJlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgLy8gVE9ETyBob3cgdG8gZ2V0IGF2YWlsYWJsZSByZW5kZXJlcnMgaW4gdGhlIHN5c3RlbQotICAgICAgICAgICAgaWYgKCFtUmVuZGVyZXJzLmNvbnRhaW5zKHJlbmRlcmVyKSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIGFkZGVkIHJlbmRlcmVycyBvdmVycmlkZSBleGlzdGluZyBvbmVzICh0byBhbGxvdyByZXBsYWNpbmc/KQotICAgICAgICAgICAgICAgIG1SZW5kZXJlcnMuYWRkKHJlbmRlcmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlbmRlcmVyRm9yKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgLy8gVE9ETyBob3cgdG8gZ2V0IGF2YWlsYWJsZSByZW5kZXJlcnMgaW4gdGhlIHN5c3RlbQotICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgewotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnRpdGxlIGFuY2hvciwgYW4gb2JqZWN0IHRoYXQgaXMgYWJsZSB0byBkaXNwbGF5IGEgc3VidGl0bGUgcmVuZGVyZXIsCi0gICAgICogZS5nLiBhIFZpZGVvVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEFuY2hvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbmNob3Igc2hvdWxkIHVzZSB0aGUgc3VwcGxpZWQgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCwgb3IKLSAgICAgICAgICogbm9uZSBpZiBpdCBpcyBudWxsLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9ycyBwcm92aWRlIHRoZSBsb29wZXIgb24gd2hpY2ggYWxsIHRyYWNrIHZpc2liaWxpdHkgY2hhbmdlcwotICAgICAgICAgKiAodHJhY2suc2hvdy9oaWRlLCBzZXRTdWJ0aXRsZVdpZGdldCkgd2lsbCB0YWtlIHBsYWNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgQW5jaG9yIG1BbmNob3I7Ci0KLSAgICAvKioKLSAgICAgKiAgY2FsbGVkIGZyb20gYW5jaG9yJ3MgbG9vcGVyIChpZiBhbnksIGJvdGggd2hlbiB1bnNldHRpbmcgYW5kCi0gICAgICogIHNldHRpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5jaG9yKEFuY2hvciBhbmNob3IpIHsKLSAgICAgICAgaWYgKG1BbmNob3IgPT0gYW5jaG9yKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBtQW5jaG9yID0gYW5jaG9yOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobUFuY2hvci5nZXRTdWJ0aXRsZUxvb3BlcigpLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQW5jaG9yTG9vcGVyKCkgewotICAgICAgICBhc3NlcnQgbUhhbmRsZXIgIT0gbnVsbCA6ICJTaG91bGQgaGF2ZSBhIGxvb3BlciBhbHJlYWR5IjsKLSAgICAgICAgYXNzZXJ0IExvb3Blci5teUxvb3BlcigpID09IG1IYW5kbGVyLmdldExvb3BlcigpCi0gICAgICAgICAgICAgICAgOiAiTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgbG9vcGVyIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc09uQW5jaG9yKE1lc3NhZ2UgbSkgewotICAgICAgICBhc3NlcnQgbUhhbmRsZXIgIT0gbnVsbCA6ICJTaG91bGQgaGF2ZSBhIGxvb3BlciBhbHJlYWR5IjsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpID09IG1IYW5kbGVyLmdldExvb3BlcigpKSB7Ci0gICAgICAgICAgICBtSGFuZGxlci5kaXNwYXRjaE1lc3NhZ2UobSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBzdWJ0aXRsZSB0cmFjayBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRyYWNrIHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrIG9yIG51bGwKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVUcmFja1NlbGVjdGVkKFN1YnRpdGxlVHJhY2sgdHJhY2spOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdGVuZXIgbUxpc3RlbmVyOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MDY0YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZVRyYWNrIHNpbmNlIFAKLS8qKgotICogQSBzdWJ0aXRsZSB0cmFjayBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgYW5kIGRpc3BsYXlpbmcKLSAqIGFuIGluc3RhbmNlIG9mIGEgcGFydGljdWxhciB0eXBlIG9mIHN1YnRpdGxlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VidGl0bGVUcmFjayBpbXBsZW1lbnRzIE1lZGlhVGltZVByb3ZpZGVyLk9uTWVkaWFUaW1lTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVUcmFjayI7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZU1zOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFRpbWVNczsKLQotICAgIHByaXZhdGUgUnVubmFibGUgbVJ1bm5hYmxlOwotCi0gICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5RW5kVGltZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUlEID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7Ci0KLSAgICBwcml2YXRlIEN1ZUxpc3QgbUN1ZXM7Ci0gICAgZmluYWwgcHJpdmF0ZSBWZWN0b3I8Q3VlPiBtQWN0aXZlQ3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigpOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1WaXNpYmxlOwotCi0gICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgTWVkaWFGb3JtYXQgbUZvcm1hdDsKLQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBtQ3VlcyA9IG5ldyBDdWVMaXN0KCk7Ci0gICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICBtTGFzdFRpbWVNcyA9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYUZvcm1hdCBnZXRGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiBtRm9ybWF0OwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IC0xOwotCi0gICAgcHVibGljIHZvaWQgb25EYXRhKFN1YnRpdGxlRGF0YSBkYXRhKSB7Ci0gICAgICAgIGxvbmcgcnVuSUQgPSBkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyAxOwotICAgICAgICBvbkRhdGEoZGF0YS5nZXREYXRhKCksIHRydWUgLyogZW9zICovLCBydW5JRCk7Ci0gICAgICAgIHNldFJ1bkRpc2NhcmRUaW1lTXMoCi0gICAgICAgICAgICAgICAgcnVuSUQsCi0gICAgICAgICAgICAgICAgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIGRhdGEuZ2V0RHVyYXRpb25VcygpKSAvIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGlucHV0IGRhdGEgZm9yIHRoZSBzdWJ0aXRsZSB0cmFjay4gIFRoZQotICAgICAqIGNvbXBsZXRlIHN1YnRpdGxlIGZvciBhIHRyYWNrIGNhbiBpbmNsdWRlIG11bHRpcGxlIHdob2xlIHVuaXRzCi0gICAgICogKHJ1bnMpLiAgRWFjaCBvZiB0aGVzZSB1bml0cyBjYW4gaGF2ZSBtdWx0aXBsZSBzZWN0aW9ucy4gIFRoZQotICAgICAqIGNvbnRlbnRzIG9mIGEgcnVuIGFyZSBzdWJtaXR0ZWQgaW4gc2VxdWVudGlhbCBvcmRlciwgd2l0aCBlb3MKLSAgICAgKiBpbmRpY2F0aW5nIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIHJ1bi4gIENhbGxzIGZyb20gZGlmZmVyZW50Ci0gICAgICogcnVucyBtdXN0IG5vdCBiZSBpbnRlcm1peGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgc3VidGl0bGUgZGF0YSBieXRlIGJ1ZmZlcgotICAgICAqIEBwYXJhbSBlb3MgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIHJ1bi4KLSAgICAgKiBAcGFyYW0gcnVuSUQgbW9zdGx5LXVuaXF1ZSBJRCBmb3IgdGhpcyBydW4gb2YgZGF0YS4gIFN1YnRpdGxlIGN1ZXMKLSAgICAgKiAgICAgICAgICAgICAgd2l0aCBydW5JRCBvZiAwIGFyZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKLSAgICAgKiAgICAgICAgICAgICAgZGlzcGxheS4gIEN1ZXMgd2l0aCBydW5JRCBvZiB+MCBhcmUgZGlzY2FyZGVkCi0gICAgICogICAgICAgICAgICAgIG9ubHkgYXQgdGhlIGRlbGV0aW9uIG9mIHRoZSB0cmFjayBvYmplY3QuICBDdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggb3RoZXIgcnVuSUQtcyBhcmUgZGlzY2FyZGVkIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgIHJ1biwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB0aW1lc3RhbXAgb2YKLSAgICAgKiAgICAgICAgICAgICAgYW55IG9mIGl0cyBjdWVzICh3aXRoIHRoaXMgcnVuSUQpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYWRkaW5nIHRoZSBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0IHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwKLSAgICAgKiBhcyB3ZWxsIGFzIHdoZW4gc2hvd2luZyBvciBoaWRpbmcgdGhlIHN1YnRpdGxlIHRyYWNrLCBvciB3aGVuIHRoZSB2aWRlbwotICAgICAqIHN1cmZhY2UgcG9zaXRpb24gaGFzIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3aWRnZXQgdGhhdCByZW5kZXJzIHRoaXMgc3VidGl0bGUgdHJhY2suIEZvciBtb3N0IHJlbmRlcmVycwotICAgICAqICAgICAgICAgdGhlcmUgc2hvdWxkIGJlIGEgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSB0aGF0IGlzIHVzZWQgZm9yIGFsbAotICAgICAqICAgICAgICAgdHJhY2tzIHN1cHBvcnRlZCBieSB0aGF0IHJlbmRlcmVyLCBhcyBhdCBtb3N0IG9uZSBzdWJ0aXRsZSB0cmFjawotICAgICAqICAgICAgICAgaXMgdmlzaWJsZSBhdCBvbmUgdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2ZSBjdWVzIGhhdmUgY2hhbmdlZCwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgc3VidGl0bGUKLSAgICAgKiB2aWV3IHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3Vlcyk7Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlQWN0aXZlQ3Vlcyhib29sZWFuIHJlYnVpbGQsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIC8vIG91dC1vZi1vcmRlciB0aW1lcyBtZWFuIHNlZWtpbmcgb3IgbmV3IGFjdGl2ZSBjdWVzIGJlaW5nIGFkZGVkCi0gICAgICAgIC8vIChkdXJpbmcgdGhlaXIgb3duIHRpbWVzcGFuKQotICAgICAgICBpZiAocmVidWlsZCB8fCBtTGFzdFVwZGF0ZVRpbWVNcyA+IHRpbWVNcykgewotICAgICAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXQgPQotICAgICAgICAgICAgICAgIG1DdWVzLmVudHJpZXNCZXR3ZWVuKG1MYXN0VXBkYXRlVGltZU1zLCB0aW1lTXMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBQYWlyPExvbmcsIEN1ZT4gZXZlbnQgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBDdWUgY3VlID0gZXZlbnQuc2Vjb25kOwotCi0gICAgICAgICAgICBpZiAoY3VlLm1FbmRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcGFzdCBjdWVzCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZW1vdmluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1SdW5JRCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1TdGFydFRpbWVNcyA9PSBldmVudC5maXJzdCkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgY3VlcwotICAgICAgICAgICAgICAgIC8vIFRSSUNLWTogdGhpcyB3aWxsIGhhcHBlbiBpbiBzdGFydCBvcmRlcgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nICIgKyBjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBjdWUgaXMgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21wbGV0ZSBhbnkgcnVucyAqLwotICAgICAgICB3aGlsZSAobVJ1bnNCeUVuZFRpbWUuc2l6ZSgpID4gMCAmJgotICAgICAgICAgICAgICAgbVJ1bnNCeUVuZFRpbWUua2V5QXQoMCkgPD0gdGltZU1zKSB7Ci0gICAgICAgICAgICByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoMCk7IC8vIHJlbW92ZXMgZWxlbWVudAotICAgICAgICB9Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gdGltZU1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoaW50IGl4KSB7Ci0gICAgICAgIFJ1biBydW4gPSBtUnVuc0J5RW5kVGltZS52YWx1ZUF0KGl4KTsKLSAgICAgICAgd2hpbGUgKHJ1biAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDdWUgY3VlID0gcnVuLm1GaXJzdEN1ZTsKLSAgICAgICAgICAgIHdoaWxlIChjdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIEN1ZSBuZXh0Q3VlID0gY3VlLm1OZXh0SW5SdW47Ci0gICAgICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBudWxsOwotICAgICAgICAgICAgICAgIGN1ZSA9IG5leHRDdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUnVuc0J5SUQucmVtb3ZlKHJ1bi5tUnVuSUQpOwotICAgICAgICAgICAgUnVuIG5leHRSdW4gPSBydW4ubU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgICAgIHJ1bi5tUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIHJ1biA9IG5leHRSdW47Ci0gICAgICAgIH0KLSAgICAgICAgbVJ1bnNCeUVuZFRpbWUucmVtb3ZlQXQoaXgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8qIHJlbW92ZSBhbGwgY3VlcyAodW50YW5nbGUgYWxsIGNyb3NzLWxpbmtzKSAqLwotICAgICAgICBpbnQgc2l6ZSA9IG1SdW5zQnlFbmRUaW1lLnNpemUoKTsKLSAgICAgICAgZm9yKGludCBpeCA9IHNpemUgLSAxOyBpeCA+PSAwOyBpeC0tKSB7Ci0gICAgICAgICAgICByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHRha2VUaW1lKGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIG1MYXN0VGltZU1zID0gdGltZU1zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckFjdGl2ZUN1ZXMoKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQ2xlYXJpbmcgIiArIG1BY3RpdmVDdWVzLnNpemUoKSArICIgYWN0aXZlIGN1ZXMiKTsKLSAgICAgICAgbUFjdGl2ZUN1ZXMuY2xlYXIoKTsKLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzY2hlZHVsZVRpbWVkRXZlbnRzKCkgewotICAgICAgICAvKiBnZXQgdGltZXMgZm9yIHRoZSBuZXh0IGV2ZW50ICovCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gbUN1ZXMubmV4dFRpbWVBZnRlcihtTGFzdFRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNjaGVkIEAiICsgbU5leHRTY2hlZHVsZWRUaW1lTXMgKyAiIGFmdGVyICIgKyBtTGFzdFRpbWVNcyk7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLm5vdGlmeUF0KAotICAgICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA+PSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChtTmV4dFNjaGVkdWxlZFRpbWVNcyAqIDEwMDApIDogTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblRpbWVkRXZlbnQobG9uZyB0aW1lVXMpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblRpbWVkRXZlbnQgIiArIHRpbWVVcyk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgbG9uZyB0aW1lTXMgPSB0aW1lVXMgLyAxMDAwOwotICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3VlcyhmYWxzZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlZWsobG9uZyB0aW1lVXMpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblNlZWsgIiArIHRpbWVVcyk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgbG9uZyB0aW1lTXMgPSB0aW1lVXMgLyAxMDAwOwotICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aW1lTXMpOwotICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU3RvcCIpOwotICAgICAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgICAgICBtTGFzdFRpbWVNcyA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IC0xOwotICAgICAgICBtVGltZVByb3ZpZGVyLm5vdGlmeUF0KE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsIHRoaXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotCi0gICAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICAgICAgaWYgKG1WaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgIFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQgPSBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICAgICAgaWYgKHJlbmRlcmluZ1dpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZW5kZXJpbmdXaWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgaWYgKCFtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQgPSBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICAgICAgaWYgKHJlbmRlcmluZ1dpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZW5kZXJpbmdXaWRnZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpc2libGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQ3VlKEN1ZSBjdWUpIHsKLSAgICAgICAgbUN1ZXMuYWRkKGN1ZSk7Ci0KLSAgICAgICAgaWYgKGN1ZS5tUnVuSUQgIT0gMCkgewotICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQoY3VlLm1SdW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4gPSBuZXcgUnVuKCk7Ci0gICAgICAgICAgICAgICAgbVJ1bnNCeUlELnB1dChjdWUubVJ1bklELCBydW4pOwotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bi5tRW5kVGltZU1zIDwgY3VlLm1FbmRUaW1lTXMpIHsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsaW5rLXVwIGN1ZXMgaW4gdGhlIHNhbWUgcnVuCi0gICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICBydW4ubUZpcnN0Q3VlID0gY3VlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgYSBjdWUgaXMgYWRkZWQgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSwgbmVlZCB0byByZWZyZXNoIHZpZXcKLSAgICAgICAgbG9uZyBub3dNcyA9IC0xOwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5vd01zID0gbVRpbWVQcm92aWRlci5nZXRDdXJyZW50VGltZVVzKAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcHJlY2lzZSAqLywgdHJ1ZSAvKiBtb25vdG9uaWMgKi8pIC8gMTAwMDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGFzIGl0IHdlIGFyZSBub3QgcGxheWluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtVmlzaWJsZT0iICsgbVZpc2libGUgKyAiLCAiICsKLSAgICAgICAgICAgICAgICBjdWUubVN0YXJ0VGltZU1zICsgIiA8PSAiICsgbm93TXMgKyAiLCAiICsKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyArICIgPj0gIiArIG1MYXN0VGltZU1zKTsKLQotICAgICAgICBpZiAobVZpc2libGUgJiYKLSAgICAgICAgICAgICAgICBjdWUubVN0YXJ0VGltZU1zIDw9IG5vd01zICYmCi0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgdHJ1c3Qgbm93TXMsIHNvIGNoZWNrIGFueSBjdWUgc2luY2UgbGFzdCBjYWxsYmFjawotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zKSB7Ci0gICAgICAgICAgICBpZiAobVJ1bm5hYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSB0aGlzOwotICAgICAgICAgICAgZmluYWwgbG9uZyB0aGVuTXMgPSBub3dNczsKLSAgICAgICAgICAgIG1SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gd2l0aCBzeW5jaHJvbml6ZWQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgYXJlIGdvaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIGRvIG11bHRpcGxlIHVwZGF0ZXMgYXMgdGhlIHJ1bm5hYmxlIGNvdWxkIGJlIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZy4KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0cmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJ1bm5hYmxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGhlbk1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIC8vIGRlbGF5IHVwZGF0ZSBzbyB3ZSBkb24ndCB1cGRhdGUgdmlldyBvbiBldmVyeSBjdWUuICBUT0RPIHdoeSAxMD8KLSAgICAgICAgICAgIGlmIChtSGFuZGxlci5wb3N0RGVsYXllZChtUnVubmFibGUsIDEwIC8qIGRlbGF5ICovKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2NoZWR1bGluZyB1cGRhdGUiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudyhUQUcsICJmYWlsZWQgdG8gc2NoZWR1bGUgc3VidGl0bGUgdmlldyB1cGRhdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMgJiYKLSAgICAgICAgICAgICAgICAoY3VlLm1TdGFydFRpbWVNcyA8IG1OZXh0U2NoZWR1bGVkVGltZU1zIHx8Ci0gICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zIDwgMCkpIHsKLSAgICAgICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VGltZVByb3ZpZGVyKE1lZGlhVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlcikgewotICAgICAgICBpZiAobVRpbWVQcm92aWRlciA9PSB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3RhdGljIGNsYXNzIEN1ZUxpc3QgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1ZUxpc3QiOwotICAgICAgICAvLyBzaW1wbGlzdGljLCBpbmVmZmljaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1DdWVzOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGRFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oMik7Ci0gICAgICAgICAgICAgICAgbUN1ZXMucHV0KHRpbWVNcywgY3Vlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZXMuY29udGFpbnMoY3VlKSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkdXBsaWNhdGUgY3VlcwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3Vlcy5hZGQoY3VlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3Vlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUodGltZU1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQ3VlIGN1ZSkgewotICAgICAgICAgICAgLy8gaWdub3JlIG5vbi1wb3NpdGl2ZS1kdXJhdGlvbiBjdWVzCi0gICAgICAgICAgICBpZiAoY3VlLm1TdGFydFRpbWVNcyA+PSBjdWUubUVuZFRpbWVNcykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmICghYWRkRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyBsYXN0VGltZU1zID0gY3VlLm1TdGFydFRpbWVNczsKLSAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA+IGxhc3RUaW1lTXMgJiYgdGltZU1zIDwgY3VlLm1FbmRUaW1lTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KGN1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUaW1lTXMgPSB0aW1lTXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZEV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4+IGVudHJpZXNCZXR3ZWVuKAotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbGFzdFRpbWVNcywgZmluYWwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+ID4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNsaWNlICgiICsgbGFzdFRpbWVNcyArICIsICIgKyB0aW1lTXMgKyAiXT0iKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1ZXMuc3ViTWFwKGxhc3RUaW1lTXMgKyAxLCB0aW1lTXMgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcihudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBuZXh0VGltZUFmdGVyKGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4+IHRhaWwgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0YWlsID0gbUN1ZXMudGFpbE1hcCh0aW1lTXMgKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAodGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWlsLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9IGNhdGNoKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFtRG9uZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgUGFpcjxMb25nLCBDdWU+IG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Eb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RFbnRyeSA9IG5ldyBQYWlyPExvbmcsIEN1ZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcywgbUxpc3RJdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbUxpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICBpZiAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1MYXN0RW50cnk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgcmVtb3ZpbmcgZW5kIHRhZ3MKLSAgICAgICAgICAgICAgICBpZiAobUxhc3RMaXN0SXRlcmF0b3IgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RFbnRyeS5zZWNvbmQubUVuZFRpbWVNcyAhPSBtTGFzdEVudHJ5LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBlbmQtY3VlCi0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtQ3Vlcy5nZXQobUxhc3RFbnRyeS5maXJzdCkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKG1MYXN0RW50cnkuZmlyc3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByZXN0IG9mIHRoZSBjdWVzCi0gICAgICAgICAgICAgICAgQ3VlIGN1ZSA9IG1MYXN0RW50cnkuc2Vjb25kOwotICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEVudHJ5SXRlcmF0b3IoU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gY3VlcykgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCBjdWVzICsgIiIpOwotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gY3VlczsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbmV4dEtleSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgbmV4dEtleSgpIHsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlbWFpbmluZ0N1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zID0gbVJlbWFpbmluZ0N1ZXMuZmlyc3RLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLmdldChtQ3VycmVudFRpbWVNcykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy50YWlsTWFwKG1DdXJyZW50VGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIGxvbmcgbUN1cnJlbnRUaW1lTXM7Ci0gICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEN1ZT4gbUxpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZTsKLSAgICAgICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbVJlbWFpbmluZ0N1ZXM7Ci0gICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEN1ZT4gbUxhc3RMaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIFBhaXI8TG9uZyxDdWU+IG1MYXN0RW50cnk7Ci0gICAgICAgIH0KLQotICAgICAgICBDdWVMaXN0KCkgewotICAgICAgICAgICAgbUN1ZXMgPSBuZXcgVHJlZU1hcDxMb25nLCBWZWN0b3I8Q3VlPj4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VlIHsKLSAgICAgICAgcHVibGljIGxvbmcgbVN0YXJ0VGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZ1tdIG1Jbm5lclRpbWVzTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRDsKLQotICAgICAgICBwdWJsaWMgQ3VlIG1OZXh0SW5SdW47Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UaW1lKGxvbmcgdGltZU1zKSB7IH0KLSAgICB9Ci0KLSAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lICh3aXRoIGRlZmF1bHQgZW5kIHRpbWUpICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRSdW4obG9uZyBydW5JRCkgewotICAgICAgICBpZiAocnVuSUQgIT0gMCAmJiBydW5JRCAhPSB+MCkgewotICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQocnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuLnN0b3JlQnlFbmRUaW1lTXMobVJ1bnNCeUVuZFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSB3aXRoIGdpdmVuIGVuZCB0aW1lICovCi0gICAgcHVibGljIHZvaWQgc2V0UnVuRGlzY2FyZFRpbWVNcyhsb25nIHJ1bklELCBsb25nIHRpbWVNcykgewotICAgICAgICBpZiAocnVuSUQgIT0gMCAmJiBydW5JRCAhPSB+MCkgewotICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQocnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSB0aW1lTXM7Ci0gICAgICAgICAgICAgICAgcnVuLnN0b3JlQnlFbmRUaW1lTXMobVJ1bnNCeUVuZFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHdoZXRoZXIgdGhpcyBpcyBhIHRleHQgdHJhY2sgd2hvIGZpcmVzIGV2ZW50cyBpbnN0ZWFkIGdldHRpbmcgcmVuZGVyZWQgKi8KLSAgICBwdWJsaWMgaW50IGdldFRyYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmluZ1dpZGdldCgpID09IG51bGwKLSAgICAgICAgICAgICAgICA/IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVAotICAgICAgICAgICAgICAgIDogVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSdW4gewotICAgICAgICBwdWJsaWMgQ3VlIG1GaXJzdEN1ZTsKLSAgICAgICAgcHVibGljIFJ1biBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgUnVuIG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXMgPSAtMTsKLSAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEID0gMDsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdG9yZWRFbmRUaW1lTXMgPSAtMTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUJ5RW5kVGltZU1zKExvbmdTcGFyc2VBcnJheTxSdW4+IHJ1bnNCeUVuZFRpbWUpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgdmFsdWUgaWYgYW55Ci0gICAgICAgICAgICBpbnQgaXggPSBydW5zQnlFbmRUaW1lLmluZGV4T2ZLZXkobVN0b3JlZEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoaXggPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXMgPT0gcnVuc0J5RW5kVGltZS52YWx1ZUF0KGl4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucmVtb3ZlQXQoaXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5zZXRWYWx1ZUF0KGl4LCBtTmV4dFJ1bkF0RW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVBdEVuZFRpbWVNcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgbmV3IHZhbHVlCi0gICAgICAgICAgICBpZiAobUVuZFRpbWVNcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IHJ1bnNCeUVuZFRpbWUuZ2V0KG1FbmRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcy5tUHJldlJ1bkF0RW5kVGltZU1zID0gdGhpczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5wdXQobUVuZFRpbWVNcywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbVN0b3JlZEVuZFRpbWVNcyA9IG1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBdEVuZFRpbWVNcygpIHsKLSAgICAgICAgICAgIFJ1biBwcmV2ID0gbVByZXZSdW5BdEVuZFRpbWVNczsKLQotICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMubU5leHRSdW5BdEVuZFRpbWVNcyA9IG1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcy5tUHJldlJ1bkF0RW5kVGltZU1zID0gcHJldjsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVuZGVyaW5nIHN1YnRpdGxlcyBvbnRvIGEgQ2FudmFzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyaW5nV2lkZ2V0IHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHdpZGdldCdzIGNhbGxiYWNrLCB3aGljaCBpcyB1c2VkIHRvIHNlbmQgdXBkYXRlcyB3aGVuIHRoZQotICAgICAgICAgKiByZW5kZXJlZCBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdXBkYXRlIGNhbGxiYWNrCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPbkNoYW5nZWRMaXN0ZW5lcihPbkNoYW5nZWRMaXN0ZW5lciBjYWxsYmFjayk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHdpZGdldCdzIHNpemUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBpbiBwaXhlbHMKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgaW4gcGl4ZWxzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgd2lkZ2V0IHNob3VsZCBkcmF3IHN1YnRpdGxlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZpc2libGUgdHJ1ZSBpZiBzdWJ0aXRsZXMgc2hvdWxkIGJlIGRyYXduLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVuZGVycyBzdWJ0aXRsZXMgb250byBhIHtAbGluayBDYW52YXN9LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gYyBjYW52YXMgb24gd2hpY2ggdG8gcmVuZGVyIHN1YnRpdGxlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgYyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBkZXRhY2hlZCBmcm9tIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGJhY2sgdXNlZCB0byBzZW5kIHVwZGF0ZXMgYWJvdXQgY2hhbmdlcyB0byByZW5kZXJpbmcgZGF0YS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25DaGFuZ2VkTGlzdGVuZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyaW5nIGRhdGEgaGFzIGNoYW5nZWQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogQHBhcmFtIHJlbmRlcmluZ1dpZGdldCB0aGUgd2lkZ2V0IHdob3NlIGRhdGEgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JlNTQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyLk1lZGlhTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhSXRlbTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyLkxpYnJhcnlSb290UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFNZXRhZGF0YTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkJ1aWxkZXJCYXNlUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyLk1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlN0YXRpY1Byb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5Wb2x1bWVQcm92aWRlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5MaWJyYXJ5Um9vdEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJhdGluZzJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MkltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwaUZhY3RvcnkgaW1wbGVtZW50cyBTdGF0aWNQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBBcGlGYWN0b3J5KCkgeyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0YXRpY1Byb3ZpZGVyIGluaXRpYWxpemUoQXBwbGljYXRpb25JbmZvIHVwZGF0YWJsZUluZm8pIHsKLSAgICAgICAgQXBpSGVscGVyLmluaXRpYWxpemUodXBkYXRhYmxlSW5mbyk7Ci0gICAgICAgIHJldHVybiBuZXcgQXBpRmFjdG9yeSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sbGVyMigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xsZXIySW1wbChjb250ZXh0LCBpbnN0YW5jZSwgdG9rZW4sIGV4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJQcm92aWRlciBjcmVhdGVNZWRpYUJyb3dzZXIyKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4sIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUJyb3dzZXIySW1wbChjb250ZXh0LCBpbnN0YW5jZSwgdG9rZW4sIGV4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmQoCi0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSwgU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhKSB7Ci0gICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCAmJiBleHRyYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgYWN0aW9uLCBleHRyYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Db21tYW5kMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kKEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kR3JvdXBQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIFNlc3Npb25Db21tYW5kR3JvdXAyIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbChpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAob3RoZXIgPT0gbnVsbCkgPyBudWxsIDogb3RoZXIuZ2V0UHJvdmlkZXIoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Db21tYW5kR3JvdXAyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cChCdW5kbGUgY29tbWFuZHMpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbnRyb2xsZXJJbmZvUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbnRyb2xsZXJJbmZvKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwgaW50IHBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgSUludGVyZmFjZSBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbnRyb2xsZXJJbmZvSW1wbChjb250ZXh0LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCB1aWQsIHBpZCwgcGFja2FnZU5hbWUsIChJTWVkaWFDb250cm9sbGVyMikgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRCdXR0b25CdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiBjcmVhdGVNZWRpYVNlc3Npb24yQnVpbGRlcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgTWVkaWFTZXNzaW9uMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckltcGwoY29udGV4dCwgaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyKE1lZGlhU2Vzc2lvblNlcnZpY2UyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMk1lZGlhTm90aWZpY2F0aW9uKAotICAgICAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gaW5zdGFuY2UsIGludCBub3RpZmljYXRpb25JZCwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5NZWRpYU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UsIG5vdGlmaWNhdGlvbklkLCBub3RpZmljYXRpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyKE1lZGlhTGlicmFyeVNlcnZpY2UyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+Ci0gICAgICAgIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyQnVpbGRlcihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLAotICAgICAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbi5CdWlsZGVyIGluc3RhbmNlLCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkJ1aWxkZXJJbXBsKHNlcnZpY2UsIGluc3RhbmNlLCBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlicmFyeVJvb3RQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkxpYnJhcnlSb290KAotICAgICAgICAgICAgTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaWJyYXJ5Um9vdEltcGwoaW5zdGFuY2UsIHJvb3RJZCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xWaWV3MihNZWRpYUNvbnRyb2xWaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbFZpZXcySW1wbChpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlkZW9WaWV3MlByb3ZpZGVyIGNyZWF0ZVZpZGVvVmlldzIoCi0gICAgICAgICAgICBWaWRlb1ZpZXcyIGluc3RhbmNlLCBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWaWRlb1ZpZXcySW1wbChpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIGNyZWF0ZVNlc3Npb25Ub2tlbjIoQ29udGV4dCBjb250ZXh0LCBTZXNzaW9uVG9rZW4yIGluc3RhbmNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIGludCB1aWQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbChjb250ZXh0LCBpbnN0YW5jZSwgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lLCB1aWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfU2Vzc2lvblRva2VuMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYUl0ZW0yQnVpbGRlcihNZWRpYUl0ZW0yLkJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICBpbnQgZmxhZ3MpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgZmxhZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfTWVkaWFJdGVtMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgY3JlYXRlVm9sdW1lUHJvdmlkZXIyKFZvbHVtZVByb3ZpZGVyMiBpbnN0YW5jZSwgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgaW50IG1heFZvbHVtZSwgaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWb2x1bWVQcm92aWRlcjJJbXBsKGluc3RhbmNlLCBjb250cm9sVHlwZSwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZnJvbUJ1bmRsZV9NZWRpYU1ldGFkYXRhMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYU1ldGFkYXRhMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlLCBNZWRpYU1ldGFkYXRhMiBzb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIHNvdXJjZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgZnJvbUJ1bmRsZV9SYXRpbmcyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfUmF0aW5nMihpbnQgcmF0aW5nU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1VucmF0ZWRSYXRpbmdfaW1wbChyYXRpbmdTdHlsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfUmF0aW5nMihib29sZWFuIGhhc0hlYXJ0KSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdIZWFydFJhdGluZ19pbXBsKGhhc0hlYXJ0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19SYXRpbmcyKGJvb2xlYW4gdGh1bWJJc1VwKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdUaHVtYlJhdGluZ19pbXBsKHRodW1iSXNVcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3U3RhclJhdGluZ19SYXRpbmcyKGludCBzdGFyUmF0aW5nU3R5bGUsIGZsb2F0IHN0YXJSYXRpbmcpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1N0YXJSYXRpbmdfaW1wbChzdGFyUmF0aW5nU3R5bGUsIHN0YXJSYXRpbmcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1BlcmNlbnRhZ2VSYXRpbmdfUmF0aW5nMihmbG9hdCBwZXJjZW50KSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwocGVyY2VudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIGNyZWF0ZU1lZGlhUGxheWxpc3RBZ2VudChNZWRpYVBsYXlsaXN0QWdlbnQgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhiYjQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5TcGFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXc7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlIZWxwZXIgewotICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uSW5mbyBzVXBkYXRhYmxlSW5mbzsKLQotICAgIEBHdWFyZGVkQnkoInRoaXMiKQotICAgIHByaXZhdGUgc3RhdGljIFRoZW1lIHNMaWJUaGVtZTsKLQotICAgIHByaXZhdGUgQXBpSGVscGVyKCkgeyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzVXBkYXRhYmxlSW5mbyA9IHVwZGF0YWJsZUluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZXMgZ2V0TGliUmVzb3VyY2VzKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWUoY29udGV4dCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIHJldHVybiBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lSWQpIHsKLSAgICAgICAgVGhlbWUgdGhlbWUgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKLSAgICAgICAgdGhlbWUuYXBwbHlTdHlsZSh0aGVtZUlkLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUpIHsKLSAgICAgICAgaWYgKHRoZW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0TGliVGhlbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBMYXlvdXRJbmZsYXRlciBsYXlvdXRJbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuY2xvbmVJbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpKTsKLSAgICAgICAgbGF5b3V0SW5mbGF0ZXIuc2V0RmFjdG9yeTIobmV3IExheW91dEluZmxhdGVyLkZhY3RvcnkyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoTWVkaWFSb3V0ZUJ1dHRvbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE92ZXJsYXlMaXN0Vmlldy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3ZlcmxheUxpc3RWaWV3KGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJ1dHRvbkJhckxheW91dC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uQmFyTGF5b3V0KGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNwYWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcGFjZShjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25DcmVhdGVWaWV3KG51bGwsIG5hbWUsIGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBsYXlvdXRJbmZsYXRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIGludCBsaWJSZXNJZCkgewotICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCBnZXRMaWJUaGVtZShjb250ZXh0KSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgdGhlbWUsIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkLAotICAgICAgICAgICAgQE51bGxhYmxlIFZpZXdHcm91cCByb290LCBib29sZWFuIGF0dGFjaFRvUm9vdCkgewotICAgICAgICB0cnkgKFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRMYXlvdXQobGliUmVzSWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgdGhlbWUpLmluZmxhdGUocGFyc2VyLCByb290LCBhdHRhY2hUb1Jvb3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFRoZW1lIGdldExpYlRoZW1lU3luY2hyb25pemVkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7Ci0KLSAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgaGFzbid0IGJlZW4gY2FsbGVkIHlldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzTGliVGhlbWUgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKHNVcGRhdGFibGVJbmZvKS5uZXdUaGVtZSgpOwotICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0NmFmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDI0KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJBcGkyNCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXREZXZpY2VUeXBlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERldmljZVR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U4ZDQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIgZGlzcGxheXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiBtZWRpYSByb3V0ZSBidXR0b259Ci0gKiBpbiB0aGUgYXBwbGljYXRpb24ncyB7QGxpbmsgQWN0aW9uQmFyfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3Qgcm91dGVzIGFuZAotICogdG8gY29udHJvbCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gbXVzdCBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZAotICogdG8gc2VsZWN0IGJ5IHNwZWNpZnlpbmcgYSB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSB3aXRoIHRoZQotICoge0BsaW5rICNzZXRSb3V0ZVNlbGVjdG9yfSBtZXRob2QuCi0gKiA8L3A+PHA+Ci0gKiBSZWZlciB0byB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGJ1dHRvbiB0aGF0IHdpbGwKLSAqIGFwcGVhciBpbiB0aGUgYWN0aW9uIGJhciBtZW51LiAgTm90ZSB0aGF0IGluc3RlYWQgb2YgZGlzYWJsaW5nIHRoZSBidXR0b24KLSAqIHdoZW4gbm8gcm91dGVzIGFyZSBhdmFpbGFibGUsIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBpbnN0ZWFkIG1ha2UgdGhlCi0gKiBtZW51IGl0ZW0gaW52aXNpYmxlLiAgSW4gdGhpcyB3YXksIHRoZSBidXR0b24gd2lsbCBvbmx5IGJlIHZpc2libGUgd2hlbiBpdAotICogaXMgcG9zc2libGUgZm9yIHRoZSB1c2VyIHRvIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBtYXRjaGluZyByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgQXBwQ29tcGF0QWN0aXZpdHl9IGZyb20gdGhlIDxjb2RlPmFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQ8L2NvZGU+Ci0gKiBzdXBwb3J0IGxpYnJhcnkuICBSZWZlciB0byBzdXBwb3J0IGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+RXhhbXBsZTwvaDM+Ci0gKiA8cD4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVmaW5lIGEgbWVudSByZXNvdXJjZSB0byBpbmNsdWRlIHRoZSBwcm92aWRlciBpbiB0aGUKLSAqIGFjdGlvbiBiYXIgb3B0aW9ucyBtZW51LiAgTm90ZSB0aGF0IHRoZSBzdXBwb3J0IGxpYnJhcnkgYWN0aW9uIGJhciB1c2VzIGF0dHJpYnV0ZXMKLSAqIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzb3VyY2UgbmFtZXNwYWNlIHJhdGhlciB0aGFuIHRoZSBmcmFtZXdvcmsncwotICogcmVzb3VyY2UgbmFtZXNwYWNlIHRvIGNvbmZpZ3VyZSBlYWNoIGl0ZW0uCi0gKiA8L3A+PHByZT4KLSAqICZsdDttZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAqICAgICAgICAgeG1sbnM6YXBwPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzLWF1dG8iPgotICogICAgICZsdDtpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVkaWFfcm91dGVfbWVudV9pdGVtIgotICogICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lZGlhX3JvdXRlX21lbnVfdGl0bGUiCi0gKiAgICAgICAgIGFwcDpzaG93QXNBY3Rpb249ImFsd2F5cyIKLSAqICAgICAgICAgYXBwOmFjdGlvblByb3ZpZGVyQ2xhc3M9ImFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIi8+Ci0gKiAmbHQ7L21lbnU+Ci0gKiA8L3ByZT48cD4KLSAqIFRoZW4gY29uZmlndXJlIHRoZSBtZW51IGFuZCBzZXQgdGhlIHJvdXRlIHNlbGVjdG9yIGZvciB0aGUgY2hvb3Nlci4KLSAqIDwvcD48cHJlPgotICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBcHBDb21wYXRBY3Rpdml0eSB7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOwotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAqCi0gKiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICoKLSAqICAgICAgICAgbVJvdXRlciA9IE1lZGlhcm91dGVyLmdldEluc3RhbmNlKHRoaXMpOwotICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOwotICogICAgIH0KLSAqCi0gKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAqICAgICAvLyB0aGUgYXBwbGljYXRpb24gaXMgaW50ZXJlc3RlZCBpbiBzbyB0aGF0IGl0IGNhbiB0cnkgdG8gZGlzY292ZXIgc3VpdGFibGUgb25lcy4KLSAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKLSAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAqCi0gKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKLSAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gKiAgICAgfQotICoKLSAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gKiAgICAgLy8gbmVlZHMgdG8gaW52ZXN0IGVmZm9ydCB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIG9mIHRoZXNlIGtpbmRzIGZvciBub3cuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAqCi0gKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gKiAgICAgfQotICoKLSAqICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotICogICAgICAgICBzdXBlci5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOwotICoKLSAqICAgICAgICAgZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShSLm1lbnUuc2FtcGxlX21lZGlhX3JvdXRlcl9tZW51LCBtZW51KTsKLSAqCi0gKiAgICAgICAgIE1lbnVJdGVtIG1lZGlhUm91dGVNZW51SXRlbSA9IG1lbnUuZmluZEl0ZW0oUi5pZC5tZWRpYV9yb3V0ZV9tZW51X2l0ZW0pOwotICogICAgICAgICBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyID0KLSAqICAgICAgICAgICAgICAgICAoTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyKU1lbnVJdGVtQ29tcGF0LmdldEFjdGlvblByb3ZpZGVyKG1lZGlhUm91dGVNZW51SXRlbSk7Ci0gKiAgICAgICAgIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIHJldHVybiB0cnVlOwotICogICAgIH0KLSAqCi0gKiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNeUNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCi0gKiAgICAgfQotICogfQotICogPC9wcmU+Ci0gKgotICogQHNlZSAjc2V0Um91dGVTZWxlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQWN0aW9uUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1CdXR0b247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhY3Rpb24gcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgLy8gRklYTUU6IFdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gaXMgc3RpbGwgbmVlZGVkIGJ5IHRoZSBVSS4gIFVuZm9ydHVuYXRlbHkgdGhpcyBtZWFucyB0aGUgYWN0aW9uIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBtYXkgbGVhayBjYWxsYmFja3MgdW50aWwgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy4gIFRoaXMgbWF5IHJlc3VsdCBpbgotICAgICAgICAgICAgLy8gbWVkaWEgcm91dGUgcHJvdmlkZXJzIGRvaW5nIG1vcmUgd29yayB0aGFuIG5lY2Vzc2FyeSBpbiB0aGUgc2hvcnQgdGVybQotICAgICAgICAgICAgLy8gd2hpbGUgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IGFyZSBubyBsb25nZXIgb2YgaW50ZXJlc3QgdG8gdGhlCi0gICAgICAgICAgICAvLyBhcHBsaWNhdGlvbi4gIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIG5lZWQgc29tZQotICAgICAgICAgICAgLy8gaW5kaWNhdGlvbiBmcm9tIHRoZSBmcmFtZXdvcmsgdGhhdCBpdCBpcyBiZWluZyBkZXN0cm95ZWQuCi0gICAgICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotCi0gICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRpYWxvZyBmYWN0b3J5LCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZGlhbG9nIGZhY3RvcnksIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlhbG9nRmFjdG9yeShATm9uTnVsbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaWFsb2dGYWN0b3J5ICE9IGZhY3RvcnkpIHsKLSAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0RGlhbG9nRmFjdG9yeShmYWN0b3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFzc29jaWF0ZWQgbWVkaWEgcm91dGUgYnV0dG9uLCBvciBudWxsIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBnZXRNZWRpYVJvdXRlQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbWVkaWEgcm91dGUgYnV0dG9uIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBidXR0b24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQnV0dG9uKGdldENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZUFjdGlvblZpZXcoKSB7Ci0gICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm9uQ3JlYXRlQWN0aW9uVmlldzogdGhpcyBBY3Rpb25Qcm92aWRlciBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICJ3aXRoIGEgbWVudSBpdGVtLiBEb24ndCByZXVzZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VzISAiICsKLSAgICAgICAgICAgICAgICAgICAgIkFiYW5kb25pbmcgdGhlIG9sZCBtZW51IGl0ZW0uLi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdXR0b24gPSBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKTsKLSAgICAgICAgbUJ1dHRvbi5zZXRDaGVhdFNoZWV0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgbUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIG1CdXR0b24uc2V0RGlhbG9nRmFjdG9yeShtRGlhbG9nRmFjdG9yeSk7Ci0gICAgICAgIG1CdXR0b24uc2V0TGF5b3V0UGFyYW1zKG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgIHJldHVybiBtQnV0dG9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uUGVyZm9ybURlZmF1bHRBY3Rpb24oKSB7Ci0gICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnV0dG9uLnNob3dEaWFsb2coKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb3ZlcnJpZGVzSXRlbVZpc2liaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZXIuaXNSb3V0ZUF2YWlsYWJsZShtU2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpOwotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICByZWZyZXNoVmlzaWJpbGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+IG1Qcm92aWRlcldlYWs7Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyQ2FsbGJhY2soTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXJXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPihwcm92aWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWZyZXNoUm91dGUoTWVkaWFSb3V0ZXIgcm91dGVyKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJXZWFrLmdldCgpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5yZWZyZXNoUm91dGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm91dGVyLnJlbW92ZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlOGE2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuVG9vbHRpcENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYnV0dG9uIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3Qgcm91dGVzIGFuZCB0byBjb250cm9sIHRoZQotICogY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gbXVzdCBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZAotICogdG8gc2VsZWN0IGJ5IHNwZWNpZnlpbmcgYSB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSB3aXRoIHRoZQotICoge0BsaW5rICNzZXRSb3V0ZVNlbGVjdG9yfSBtZXRob2QuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBkb2VzIG5vdAotICogbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvcigpIHNlbGVjdG9yfSwgdGhlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbgotICogYW4gaW5hY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29ubmVjdGVkIHRvIGEKLSAqIHJvdXRlIG9mIHRoZSBraW5kIHRoYXQgaXQgd2FudHMgdG8gdXNlLiAgQ2xpY2tpbmcgb24gdGhlIGJ1dHRvbiBvcGVucwotICogYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIHJvdXRlLgotICogSWYgbm8gbm9uLWRlZmF1bHQgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgaXQgaXMgbm90IHBvc3NpYmxlIGZvciBhbiBhY3RpdmUKLSAqIHNjYW4gdG8gZGlzY292ZXIgYW55IG1hdGNoaW5nIHJvdXRlcywgdGhlbiB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBjYW5ub3QKLSAqIGJlIGNsaWNrZWQuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbm9uLWRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwgdGhlIGJ1dHRvbiB3aWxsCi0gKiBhcHBlYXIgaW4gYW4gYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgY29ubmVjdGVkCi0gKiB0byBhIHJvdXRlIG9mIHRoZSBraW5kIHRoYXQgaXQgd2FudHMgdG8gdXNlLiAgVGhlIGJ1dHRvbiBtYXkgYWxzbyBhcHBlYXIKLSAqIGluIGFuIGludGVybWVkaWFyeSBjb25uZWN0aW5nIHN0YXRlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nCi0gKiB0byB0aGUgZGVzdGluYXRpb24gYnV0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBkb2luZyBzby4gIEluIGVpdGhlciBjYXNlLCBjbGlja2luZwotICogb24gdGhlIGJ1dHRvbiBvcGVucyBhIHtAbGluayBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIKLSAqIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50IHJvdXRlLgotICogPC9wPgotICoKLSAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBidXR0b24sIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLSAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjQ8L2NvZGU+Ci0gKiBzdXBwb3J0IGxpYnJhcnkuICBSZWZlciB0byBzdXBwb3J0IGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICogQHNlZSAjc2V0Um91dGVTZWxlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUJ1dHRvbiBleHRlbmRzIFZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUJ1dHRvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hPT1NFUl9GUkFHTUVOVF9UQUcgPQotICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYXJvdXRlcjpNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcgPQotICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYXJvdXRlcjpNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgaW50IG1Sb3V0ZUNhbGxiYWNrRmxhZ3M7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHNSZW1vdGVJbmRpY2F0b3JDYWNoZSA9Ci0gICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8PigyKTsKLSAgICBwcml2YXRlIFJlbW90ZUluZGljYXRvckxvYWRlciBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyOwotICAgIHByaXZhdGUgRHJhd2FibGUgbVJlbW90ZUluZGljYXRvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJlbW90ZUFjdGl2ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ29ubmVjdGluZzsKLQotICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbUJ1dHRvblRpbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU1pbldpZHRoOwotICAgIHByaXZhdGUgaW50IG1NaW5IZWlnaHQ7Ci0KLSAgICAvLyBUaGUgY2hlY2tlZCBzdGF0ZSBpcyB1c2VkIHdoZW4gY29ubmVjdGVkIHRvIGEgcmVtb3RlIHJvdXRlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLRURfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2VkCi0gICAgfTsKLQotICAgIC8vIFRoZSBjaGVja2FibGUgc3RhdGUgaXMgdXNlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGEgcmVtb3RlIHJvdXRlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLQUJMRV9TVEFURV9TRVQgPSB7Ci0gICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrYWJsZQotICAgIH07Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBSLmF0dHIubWVkaWFSb3V0ZUJ1dHRvblN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihNZWRpYVJvdXRlclRoZW1lSGVscGVyLmNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoY29udGV4dCksIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLQotICAgICAgICBSZXNvdXJjZXMuVGhlbWUgdGhlbWUgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpLCB0cnVlKTsKLSAgICAgICAgVHlwZWRBcnJheSBhID0gdGhlbWUub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uLCBkZWZTdHlsZUF0dHIsIDApOwotCi0gICAgICAgIG1CdXR0b25UaW50ID0gYS5nZXRDb2xvclN0YXRlTGlzdChSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX21lZGlhUm91dGVCdXR0b25UaW50KTsKLSAgICAgICAgbU1pbldpZHRoID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbldpZHRoLCAwKTsKLSAgICAgICAgbU1pbkhlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5IZWlnaHQsIDApOwotICAgICAgICBpbnQgcmVtb3RlSW5kaWNhdG9yUmVzSWQgPSBhLmdldFJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9leHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlLCAwKTsKLSAgICAgICAgYS5yZWN5Y2xlKCk7Ci0KLSAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclJlc0lkICE9IDApIHsKLSAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgcmVtb3RlSW5kaWNhdG9yU3RhdGUgPQotICAgICAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUuZ2V0KHJlbW90ZUluZGljYXRvclJlc0lkKTsKLSAgICAgICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yU3RhdGUubmV3RHJhd2FibGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgPSBuZXcgUmVtb3RlSW5kaWNhdG9yTG9hZGVyKHJlbW90ZUluZGljYXRvclJlc0lkKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyLmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5USFJFQURfUE9PTF9FWEVDVVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBzZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3Rvci4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLiBNYXkgYmUgemVybyBvciBhIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBhbmQKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSAmJiBtUm91dGVDYWxsYmFja0ZsYWdzID09IGZsYWdzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgbVJvdXRlQ2FsbGJhY2tGbGFncyA9IGZsYWdzOwotCi0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLCBmbGFncyk7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRpYWxvZyBmYWN0b3J5LCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZGlhbG9nIGZhY3RvcnksIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlhbG9nRmFjdG9yeShATm9uTnVsbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgdGhlIHJvdXRlIGNob29zZXIgb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3IgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBkb2VzCi0gICAgICogbm90IG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9LCB0aGVuIHNob3dzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKiBPdGhlcndpc2UsIHNob3dzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyB0byBvZmZlciB0aGUgdXNlcgotICAgICAqIGEgY2hvaWNlIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGUgcm91dGUgb3IgcGVyZm9ybSBvdGhlciBjb250cm9sIGFjdGlvbnMKLSAgICAgKiBzdWNoIGFzIHNldHRpbmcgdGhlIHJvdXRlJ3Mgdm9sdW1lLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlhbG9nRmFjdG9yeX0KLSAgICAgKiB0byBwcm92aWRlIGEgY3VzdG9taXplZCBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGRpYWxvZyB3YXMgYWN0dWFsbHkgc2hvd24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYWN0aXZpdHkgaXMgbm90IGEgc3ViY2xhc3Mgb2YKLSAgICAgKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpIHsKLSAgICAgICAgaWYgKCFtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VyIGZtID0gZ2V0QWN0aXZpdHkoKS5nZXRGcmFnbWVudE1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGZtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRnJhZ21lbnRBY3Rpdml0eSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmIChyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpIHx8ICFyb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKSkgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENIT09TRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjaG9vc2VyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICAgICAgZi5zaG93KGZtLCBDSE9PU0VSX0ZSQUdNRU5UX1RBRyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGYgPQotICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgICAgICAgICAgZi5zaG93KGZtLCBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotICAgICAgICAvLyBHcm9zcyB3YXkgb2YgdW53cmFwcGluZyB0aGUgQWN0aXZpdHkgc28gd2UgY2FuIGdldCB0aGUgRnJhZ21lbnRNYW5hZ2VyCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgd2hpbGUgKGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0V3JhcHBlcikgewotICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoQWN0aXZpdHkpY29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQgPSAoKENvbnRleHRXcmFwcGVyKWNvbnRleHQpLmdldEJhc2VDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRvIGVuYWJsZSBzaG93aW5nIGEgdG9hc3Qgd2l0aCB0aGUgY29udGVudCBkZXNjcmlwdG9yIG9mIHRoZQotICAgICAqIGJ1dHRvbiB3aGVuIHRoZSBidXR0b24gaXMgbG9uZyBwcmVzc2VkLgotICAgICAqLwotICAgIHZvaWQgc2V0Q2hlYXRTaGVldEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgVG9vbHRpcENvbXBhdC5zZXRUb29sdGlwVGV4dCh0aGlzLCBlbmFibGUKLSAgICAgICAgICAgICAgICA/IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uKQotICAgICAgICAgICAgICAgIDogbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNsaWNrKCkgewotICAgICAgICAvLyBTZW5kIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhbmQgY2FsbCBsaXN0ZW5lcnMKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gc3VwZXIucGVyZm9ybUNsaWNrKCk7Ci0gICAgICAgIGlmICghaGFuZGxlZCkgewotICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0KFNvdW5kRWZmZWN0Q29uc3RhbnRzLkNMSUNLKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2hvd0RpYWxvZygpIHx8IGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZShpbnQgZXh0cmFTcGFjZSkgewotICAgICAgICBmaW5hbCBpbnRbXSBkcmF3YWJsZVN0YXRlID0gc3VwZXIub25DcmVhdGVEcmF3YWJsZVN0YXRlKGV4dHJhU3BhY2UgKyAxKTsKLQotICAgICAgICAvLyBUZWNobmljYWxseSB3ZSBzaG91bGQgYmUgaGFuZGxpbmcgdGhpcyBtb3JlIGNvbXBsZXRlbHksIGJ1dCB0aGVzZQotICAgICAgICAvLyBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBoZXJlLiBDaGVja2FibGUgaXMgdXNlZCB0byBleHByZXNzIHRoZSBjb25uZWN0aW5nCi0gICAgICAgIC8vIGRyYXdhYmxlIHN0YXRlIGFuZCBpdCdzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGNoZWNrIGZvciB0aGUgcHVycG9zZXMKLSAgICAgICAgLy8gb2Ygc3RhdGUgc2VsZWN0aW9uIGhlcmUuCi0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLQUJMRV9TVEFURV9TRVQpOwotICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKLSAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tFRF9TVEFURV9TRVQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkcmF3YWJsZVN0YXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkgewotICAgICAgICBzdXBlci5kcmF3YWJsZVN0YXRlQ2hhbmdlZCgpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludFtdIG15RHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0U3RhdGUobXlEcmF3YWJsZVN0YXRlKTsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIHJlbW90ZSByb3V0ZSBpbmRpY2F0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUoRHJhd2FibGUgZCkgewotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvckxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyLmNhbmNlbChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgdW5zY2hlZHVsZURyYXdhYmxlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtQnV0dG9uVGludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZCA9IERyYXdhYmxlQ29tcGF0LndyYXAoZC5tdXRhdGUoKSk7Ci0gICAgICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuc2V0VGludExpc3QoZCwgbUJ1dHRvblRpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZC5zZXRDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIGQuc2V0U3RhdGUoZ2V0RHJhd2FibGVTdGF0ZSgpKTsKLSAgICAgICAgICAgIGQuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1SZW1vdGVJbmRpY2F0b3IgPSBkOwotCi0gICAgICAgIHJlZnJlc2hEcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdyAmJiBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIGlmICghY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlEcmF3YWJsZShEcmF3YWJsZSB3aG8pIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZlcmlmeURyYXdhYmxlKHdobykgfHwgd2hvID09IG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQganVtcERyYXdhYmxlc1RvQ3VycmVudFN0YXRlKCkgewotICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIHN1cGVyIHRvIGhhbmRsZSB0aGUgYmFja2dyb3VuZCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuCi0gICAgICAgIC8vc3VwZXIuanVtcERyYXdhYmxlc1RvQ3VycmVudFN0YXRlKCk7Ci0gICAgICAgIGlmIChnZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKGdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgb3VyIG93biByZW1vdGUgaW5kaWNhdG9yLgotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUobVJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KGludCB2aXNpYmlsaXR5KSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBtUm91dGVDYWxsYmFja0ZsYWdzKTsKLSAgICAgICAgfQotICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heChtTWluV2lkdGgsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpICsgZ2V0UGFkZGluZ0xlZnQoKSArIGdldFBhZGRpbmdSaWdodCgpIDogMCk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heChtTWluSGVpZ2h0LCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljSGVpZ2h0KCkgKyBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCkgOiAwKTsKLQotICAgICAgICBpbnQgbWVhc3VyZWRXaWR0aDsKLSAgICAgICAgc3dpdGNoICh3aWR0aE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGhTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5BVF9NT1NUOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSBNYXRoLm1pbih3aWR0aFNpemUsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtZWFzdXJlZEhlaWdodDsKLSAgICAgICAgc3dpdGNoIChoZWlnaHRNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHRTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5BVF9NT1NUOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0U2l6ZSwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24obWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gZ2V0UGFkZGluZ0xlZnQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCByaWdodCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0b3AgPSBnZXRQYWRkaW5nVG9wKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3V2lkdGggPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd0hlaWdodCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljSGVpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd0xlZnQgPSBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCAtIGRyYXdXaWR0aCkgLyAyOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdUb3AgPSB0b3AgKyAoYm90dG9tIC0gdG9wIC0gZHJhd0hlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldEJvdW5kcyhkcmF3TGVmdCwgZHJhd1RvcCwKLSAgICAgICAgICAgICAgICAgICAgZHJhd0xlZnQgKyBkcmF3V2lkdGgsIGRyYXdUb3AgKyBkcmF3SGVpZ2h0KTsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZHJhdyhjYW52YXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoUm91dGUoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzUmVtb3RlID0gIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNDb25uZWN0aW5nID0gaXNSZW1vdGUgJiYgcm91dGUuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNSZWZyZXNoID0gZmFsc2U7Ci0gICAgICAgIGlmIChtUmVtb3RlQWN0aXZlICE9IGlzUmVtb3RlKSB7Ci0gICAgICAgICAgICBtUmVtb3RlQWN0aXZlID0gaXNSZW1vdGU7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nICE9IGlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbUlzQ29ubmVjdGluZyA9IGlzQ29ubmVjdGluZzsKLSAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHJlZnJlc2hEcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBzZXRFbmFibGVkKG1Sb3V0ZXIuaXNSb3V0ZUF2YWlsYWJsZShtU2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIGlmICgobmVlZHNSZWZyZXNoIHx8IGlzQ29ubmVjdGluZykgJiYgIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlbW90ZSAmJiAhaXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcm91dGUgaXMgYWxyZWFkeSBjb25uZWN0ZWQgYmVmb3JlIHRoZSB2aWV3IGlzIGF0dGFjaGVkLCBzaG93IHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgLy8gZnJhbWUgb2YgdGhlIGNvbm5lY3RlZCBhbmltYXRpb24gaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaW50IHJlc0lkOwotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nOwotICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXRTdHJpbmcocmVzSWQpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlbW90ZUluZGljYXRvckxvYWRlciBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBEcmF3YWJsZT4gewotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUmVzSWQ7Ci0KLSAgICAgICAgUmVtb3RlSW5kaWNhdG9yTG9hZGVyKGludCByZXNJZCkgewotICAgICAgICAgICAgbVJlc0lkID0gcmVzSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIERyYXdhYmxlIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldERyYXdhYmxlKG1SZXNJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2FjaGVBbmRSZXNldChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5wdXQobVJlc0lkLCByZW1vdGVJbmRpY2F0b3IuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM2NGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLkFwcENvbXBhdERpYWxvZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgcm91dGUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3IuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIjsKLQotICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJvdXRlIGxpc3QgaW1tZWRpYXRlbHkgdG8gYXZvaWQgdW5uYXR1cmFsIGRpYWxvZyBjaGFuZ2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfUk9VVEVTX0RFTEFZX01TID0gMzAwTDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfUk9VVEVTID0gMTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Sb3V0ZXM7Ci0gICAgcHJpdmF0ZSBSb3V0ZUFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfUk9VVEVTOgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVSb3V0ZXMoKExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPikgbWVzc2FnZS5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7Ci0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIHN1cGVyKG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkpLCB0aGVtZSk7Ci0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gZmlsdGVyIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIHJvdXRlcyBpbiB0aGUgcHJvdmlkZWQgbGlzdCBhbmQKLSAgICAgKiByZW1vdmVzIHRob3NlIGZvciB3aGljaCB7QGxpbmsgI29uRmlsdGVyUm91dGV9IHJldHVybnMgZmFsc2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlcyBUaGUgbGlzdCBvZiByb3V0ZXMgdG8gZmlsdGVyIGluLXBsYWNlLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRmlsdGVyUm91dGVzKEBOb25OdWxsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHJvdXRlcy5zaXplKCk7IGktLSA+IDA7ICkgewotICAgICAgICAgICAgaWYgKCFvbkZpbHRlclJvdXRlKHJvdXRlcy5nZXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgcm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZW5hYmxlZCBub24tZGVmYXVsdCByb3V0ZXMgdGhhdAotICAgICAqIG1hdGNoIHRoZSBzZWxlY3Rvci4gIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGZpbHRlciByb3V0ZXMKLSAgICAgKiBkaWZmZXJlbnRseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGNvbnNpZGVyLCBuZXZlciBudWxsLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkZpbHRlclJvdXRlKEBOb25OdWxsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICByZXR1cm4gIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgcm91dGUuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgdGl0bGVJZCkgewotICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIHNldENvbnRlbnRWaWV3KEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoZ2V0Q29udGV4dCgpKSksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9kaWFsb2cpKTsKLQotICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1BZGFwdGVyID0gbmV3IFJvdXRlQWRhcHRlcihnZXRDb250ZXh0KCksIG1Sb3V0ZXMpOwotICAgICAgICBtTGlzdFZpZXcgPSAoTGlzdFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9saXN0KTsKLSAgICAgICAgbUxpc3RWaWV3LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtQWRhcHRlcik7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRFbXB0eVZpZXcoZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5lbXB0eSkpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl90aXRsZSk7Ci0KLSAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZy4gQWxzbyBjYWxsZWQgd2hlbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGdldFdpbmRvdygpLnNldExheW91dChNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKGdldENvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1VQREFURV9ST1VURVMpOwotCi0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaGVzIHRoZSBsaXN0IG9mIHJvdXRlcyB0aGF0IGFyZSBzaG93biBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFJvdXRlcygpIHsKLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4obVJvdXRlci5nZXRSb3V0ZXMoKSk7Ci0gICAgICAgICAgICBvbkZpbHRlclJvdXRlcyhyb3V0ZXMpOwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyb3V0ZXMsIFJvdXRlQ29tcGFyYXRvci5zSW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbUxhc3RVcGRhdGVUaW1lID49IFVQREFURV9ST1VURVNfREVMQVlfTVMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1VQREFURV9ST1VURVMpOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9ST1VURVMsIHJvdXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgKyBVUERBVEVfUk9VVEVTX0RFTEFZX01TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlUm91dGVzKExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1Sb3V0ZXMuY2xlYXIoKTsKLSAgICAgICAgbVJvdXRlcy5hZGRBbGwocm91dGVzKTsKLSAgICAgICAgbUFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJvdXRlQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+Ci0gICAgICAgICAgICBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1EZWZhdWx0SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtVHZJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VySWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckdyb3VwSWNvbjsKLQotICAgICAgICBwdWJsaWMgUm91dGVBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgcm91dGVzKTsKLQotICAgICAgICAgICAgVHlwZWRBcnJheSBzdHlsZWRBdHRyaWJ1dGVzID0gQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlVHZJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgbURlZmF1bHRJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgwKTsKLSAgICAgICAgICAgIG1Udkljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDEpOwotICAgICAgICAgICAgbVNwZWFrZXJJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgyKTsKLSAgICAgICAgICAgIG1TcGVha2VyR3JvdXBJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgzKTsKLSAgICAgICAgICAgIHN0eWxlZEF0dHJpYnV0ZXMucmVjeWNsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SXRlbShwb3NpdGlvbikuaXNFbmFibGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGNvbnZlcnRWaWV3OwotICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXcgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoZ2V0Q29udGV4dCgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2xpc3RfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDEgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9uYW1lKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQyID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfZGVzYyk7Ci0gICAgICAgICAgICB0ZXh0MS5zZXRUZXh0KHJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSByb3V0ZS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nICYmICFUZXh0VXRpbHMuaXNFbXB0eShkZXNjcmlwdGlvbikpIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQk9UVE9NKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZXcuc2V0RW5hYmxlZChyb3V0ZS5pc0VuYWJsZWQoKSk7Ci0KLSAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IChJbWFnZVZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9pY29uKTsKLSAgICAgICAgICAgIGlmIChpY29uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShnZXRJY29uRHJhd2FibGUocm91dGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2aWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJvdXRlLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcm91dGUuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBVcmkgaWNvblVyaSA9IHJvdXRlLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgIGlmIChpY29uVXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0oaWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVN0cmVhbShpcywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byBsb2FkICIgKyBpY29uVXJpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmFsbHMgYmFjay4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEljb25EcmF3YWJsZShyb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldERlZmF1bHRJY29uRHJhd2FibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGlzIHNwZWNpZmllZCwgdXNlIGl0LgotICAgICAgICAgICAgc3dpdGNoIChyb3V0ZS5nZXREZXZpY2VUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfVFY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVHZJY29uOwotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1NQRUFLRVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckljb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgYmVzdCBndWVzcyBiYXNlZCBvbiBvdGhlciByb3V0ZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAvLyBPbmx5IHNwZWFrZXJzIGNhbiBiZSBncm91cGVkIGZvciBub3cuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VyR3JvdXBJY29uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0SWNvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSb3V0ZUNvbXBhcmF0b3Igc0luc3RhbmNlID0gbmV3IFJvdXRlQ29tcGFyYXRvcigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGxocywgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJocykgewotICAgICAgICAgICAgcmV0dXJuIGxocy5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaHMuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTZiMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAqIDxwPgotICogQ3JlYXRlcyBhIHtAbGluayBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ30uICBUaGUgYXBwbGljYXRpb24gbWF5IHN1YmNsYXNzCi0gKiB0aGlzIGRpYWxvZyBmcmFnbWVudCB0byBjdXN0b21pemUgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9TRUxFQ1RPUiA9ICJzZWxlY3RvciI7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG1EaWFsb2c7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgotICAgICAqIDxwPgotICAgICAqIEFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBhbHNvIHBvc3Nlc3MgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpIHsKLSAgICAgICAgc2V0Q2FuY2VsYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgZGlhbG9nID0gKE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKWdldERpYWxvZygpOwotICAgICAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNob29zZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBvbkNyZWF0ZUNob29zZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIG1EaWFsb2cuc2V0Um91dGVTZWxlY3RvcihnZXRSb3V0ZVNlbGVjdG9yKCkpOwotICAgICAgICByZXR1cm4gbURpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbURpYWxvZy51cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwY2ZjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUEFVU0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BMQVk7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BMQVlfUEFVU0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1NUT1A7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5NZWRpYURlc2NyaXB0aW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5NZWRpYU1ldGFkYXRhQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5ncmFwaGljcy5QYWxldHRlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2xhdGVBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Lk92ZXJsYXlPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCi0gKiA8cD4KLSAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIGV4dGVuZHMgQWxlcnREaWFsb2cgewotICAgIC8vIFRhZ3Mgc2hvdWxkIGJlIGxlc3MgdGhhbiAyNCBjaGFyYWN0ZXJzIGxvbmcgKHNlZSBkb2NzIGZvciBhbmRyb2lkLnV0aWwuTG9nLmlzTG9nZ2FibGUoKSkKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ3RybERpYWxvZyI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICAvLyBUaW1lIHRvIHdhaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSB2b2x1bWUgd2hlbiB0aGUgdXNlciBsZXRzIGdvIG9mIHRoZSBzZWVrIGJhcgotICAgIC8vIHRvIGFsbG93IHRoZSByb3V0ZSBwcm92aWRlciB0aW1lIHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIGFuZCBwdWJsaXNoIGEgbmV3Ci0gICAgLy8gcm91dGUgZGVzY3JpcHRvci4KLSAgICBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTID0gNTAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyA9IChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMzBMKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fTkVVVFJBTF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24yOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1NUT1BfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjE7Ci0KLSAgICBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1DcmVhdGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLQotICAgIHByaXZhdGUgaW50IG1EaWFsb2dDb250ZW50V2lkdGg7Ci0KLSAgICBwcml2YXRlIFZpZXcgbUN1c3RvbUNvbnRyb2xWaWV3OwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbURpc2Nvbm5lY3RCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVN0b3BDYXN0aW5nQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVBsYXliYWNrQ29udHJvbEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1DbG9zZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbiBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKLQotICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUV4cGFuZGFibGVBcmVhTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1EaWFsb2dBcmVhTGF5b3V0OwotICAgIEZyYW1lTGF5b3V0IG1EZWZhdWx0Q29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1DdXN0b21Db250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1BcnRWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUm91dGVOYW1lVGV4dFZpZXc7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gdHJ1ZTsKLSAgICAvLyBMYXlvdXQgZm9yIG1lZGlhIGNvbnRyb2xsZXJzIGluY2x1ZGluZyBwbGF5L3BhdXNlIGJ1dHRvbiBhbmQgdGhlIG1haW4gdm9sdW1lIHNsaWRlci4KLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtTWVkaWFNYWluQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIFJlbGF0aXZlTGF5b3V0IG1QbGF5YmFja0NvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVZvbHVtZUNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBWaWV3IG1EaXZpZGVyVmlldzsKLQotICAgIE92ZXJsYXlMaXN0VmlldyBtVm9sdW1lR3JvdXBMaXN0OwotICAgIFZvbHVtZUdyb3VwQWRhcHRlciBtVm9sdW1lR3JvdXBBZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlczsKLSAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZDsKLSAgICBwcml2YXRlIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQ7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcDsKLSAgICBTZWVrQmFyIG1Wb2x1bWVTbGlkZXI7Ci0gICAgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgbVZvbHVtZUNoYW5nZUxpc3RlbmVyOwotICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0OwotICAgIHByaXZhdGUgZmluYWwgaW50IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFNlZWtCYXI+IG1Wb2x1bWVTbGlkZXJNYXA7Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXJDb21wYXQgbU1lZGlhQ29udHJvbGxlcjsKLSAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBtQ29udHJvbGxlckNhbGxiYWNrOwotICAgIFBsYXliYWNrU3RhdGVDb21wYXQgbVN0YXRlOwotICAgIE1lZGlhRGVzY3JpcHRpb25Db21wYXQgbURlc2NyaXB0aW9uOwotCi0gICAgRmV0Y2hBcnRUYXNrIG1GZXRjaEFydFRhc2s7Ci0gICAgQml0bWFwIG1BcnRJY29uQml0bWFwOwotICAgIFVyaSBtQXJ0SWNvblVyaTsKLSAgICBib29sZWFuIG1BcnRJY29uSXNMb2FkZWQ7Ci0gICAgQml0bWFwIG1BcnRJY29uTG9hZGVkQml0bWFwOwotICAgIGludCBtQXJ0SWNvbkJhY2tncm91bmRDb2xvcjsKLQotICAgIGJvb2xlYW4gbUhhc1BlbmRpbmdVcGRhdGU7Ci0gICAgYm9vbGVhbiBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZDsKLQotICAgIGJvb2xlYW4gbUlzR3JvdXBFeHBhbmRlZDsKLSAgICBib29sZWFuIG1Jc0dyb3VwTGlzdEFuaW1hdGluZzsKLSAgICBib29sZWFuIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmc7Ci0gICAgaW50IG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zOwotICAgIHByaXZhdGUgaW50IG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zOwotICAgIHByaXZhdGUgaW50IG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NczsKLQotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7Ci0KLSAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0KLSAgICBSdW5uYWJsZSBtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7Ci0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIHN1cGVyKG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkpLCB0aGVtZSk7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Db250cm9sbGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKTsKLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICAgICAgbVJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcCA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCk7Ci0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKLSAgICAgICAgbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IubGluZWFyX291dF9zbG93X2luKTsKLSAgICAgICAgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmZhc3Rfb3V0X3Nsb3dfaW4pOwotICAgICAgICBtQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IgPSBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSB0aGF0IHRoaXMgZGlhbG9nIGlzIGNvbnRyb2xsaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gZ2V0Um91dGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdldEdyb3VwKCkgewotICAgICAgICBpZiAobVJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSBtUm91dGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgdGhlIHN1YmNsYXNzIGFuIG9wcG9ydHVuaXR5IHRvIGNyZWF0ZSBhIHZpZXcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGRlZmF1bHQgbWVkaWEKLSAgICAgKiBjb250cm9scyBmb3IgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIFRoZSBkaWFsb2cncyBzYXZlZCBpbnN0YW5jZSBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSBjb250cm9sIHZpZXcgdGhhdCB3YXMgY3JlYXRlZCBieSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUpfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3IGdldE1lZGlhQ29udHJvbFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ29udHJvbEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sRW5hYmxlZCAhPSBlbmFibGUpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IGVuYWJsZTsKLSAgICAgICAgICAgIGlmIChtQ3JlYXRlZCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKLSAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZUNvbnRyb2xFbmFibGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byB1c2UgZm9yIG1ldGFkYXRhIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuIFRoZSBkaWFsb2cKLSAgICAgKiB3aWxsIGxpc3RlbiB0byBjaGFuZ2VzIG9uIHRoaXMgc2Vzc2lvbiBhbmQgdXBkYXRlIHRoZSBVSSBhdXRvbWF0aWNhbGx5IGluCi0gICAgICogcmVzcG9uc2UgdG8gY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXNzaW9uVG9rZW4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvbihNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gc2Vzc2lvblRva2VuKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlc3Npb25Ub2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbmV3IE1lZGlhQ29udHJvbGxlckNvbXBhdChtQ29udGV4dCwgc2Vzc2lvblRva2VuKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNyZWF0aW5nIG1lZGlhIGNvbnRyb2xsZXIgaW4gc2V0TWVkaWFTZXNzaW9uLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhQ29tcGF0IG1ldGFkYXRhID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgIDogbU1lZGlhQ29udHJvbGxlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICBtRGVzY3JpcHRpb24gPSBtZXRhZGF0YSA9PSBudWxsID8gbnVsbCA6IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIG1TdGF0ZSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwgOiBtTWVkaWFDb250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vzc2lvbiB0byB1c2UgZm9yIG1ldGFkYXRhIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwgOiBtTWVkaWFDb250cm9sbGVyLmdldFNlc3Npb25Ub2tlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGVSZXNvdXJjZShhbmRyb2lkLlIuY29sb3IudHJhbnNwYXJlbnQpOwotCi0gICAgICAgIHNldENvbnRlbnRWaWV3KEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShtQ29udGV4dCwgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKG1Db250ZXh0KSksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYikpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgbmV1dHJhbCBidXR0b24uCi0gICAgICAgIGZpbmRWaWV3QnlJZChCVVRUT05fTkVVVFJBTF9SRVNfSUQpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBDbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsaWNrTGlzdGVuZXIoKTsKLQotICAgICAgICBtRXhwYW5kYWJsZUFyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9leHBhbmRhYmxlX2FyZWEpOwotICAgICAgICBtRXhwYW5kYWJsZUFyZWFMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtRGlhbG9nQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RpYWxvZ19hcmVhKTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyBFYXQgdW5oYW5kbGVkIHRvdWNoIGV2ZW50cy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGludCBjb2xvciA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0QnV0dG9uVGV4dENvbG9yKG1Db250ZXh0KTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9kaXNjb25uZWN0KSk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9TVE9QX1JFU19JRCk7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZykpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nsb3NlKTsKLSAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY3VzdG9tX2NvbnRyb2wpOwotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kZWZhdWx0X2NvbnRyb2wpOwotCi0gICAgICAgIC8vIFN0YXJ0IHRoZSBzZXNzaW9uIGFjdGl2aXR5IHdoZW4gYSBjb250ZW50IGl0ZW0gKGFsYnVtIGFydCwgdGl0bGUgb3Igc3VidGl0bGUpIGlzIGNsaWNrZWQuCi0gICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyIG9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBtTWVkaWFDb250cm9sbGVyLmdldFNlc3Npb25BY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS5zZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBwaSArICIgd2FzIG5vdCBzZW50LCBpdCBoYWQgYmVlbiBjYW5jZWxlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbUFydFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9hcnQpOwotICAgICAgICBtQXJ0Vmlldy5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLSAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZV9jb250YWluZXIpLnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOwotCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfbWVkaWFfbWFpbl9jb250cm9sKTsKLSAgICAgICAgbURpdmlkZXJWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9kaXZpZGVyKTsKLQotICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfcGxheWJhY2tfY29udHJvbCk7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfc3VidGl0bGUpOwotICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2NvbnRyb2wpOwotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfc2xpZGVyKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRUYWcobVJvdXRlKTsKLSAgICAgICAgbVZvbHVtZUNoYW5nZUxpc3RlbmVyID0gbmV3IFZvbHVtZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2dyb3VwX2xpc3QpOwotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4oKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlciA9IG5ldyBWb2x1bWVHcm91cEFkYXB0ZXIobVZvbHVtZUdyb3VwTGlzdC5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRBZGFwdGVyKG1Wb2x1bWVHcm91cEFkYXB0ZXIpOwotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCwgbVZvbHVtZUdyb3VwTGlzdCwgZ2V0R3JvdXAoKSAhPSBudWxsKTsKLSAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcikgbVZvbHVtZVNsaWRlciwgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOwotICAgICAgICBtVm9sdW1lU2xpZGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyTWFwLnB1dChtUm91dGUsIG1Wb2x1bWVTbGlkZXIpOwotCi0gICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uID0KLSAgICAgICAgICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9ncm91cF9leHBhbmRfY29sbGFwc2UpOwotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9hZEludGVycG9sYXRvcigpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zKTsKLSAgICAgICAgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyk7Ci0KLSAgICAgICAgbUN1c3RvbUNvbnRyb2xWaWV3ID0gb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQuYWRkVmlldyhtQ3VzdG9tQ29udHJvbFZpZXcpOwotICAgICAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgICAgIG1DcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZy4gQWxzbyBjYWxsZWQgd2hlbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgobUNvbnRleHQpOwotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQod2lkdGgsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLQotICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOwotICAgICAgICBtRGlhbG9nQ29udGVudFdpZHRoID0gd2lkdGggLSBkZWNvclZpZXcuZ2V0UGFkZGluZ0xlZnQoKSAtIGRlY29yVmlldy5nZXRQYWRkaW5nUmlnaHQoKTsKLQotICAgICAgICBSZXNvdXJjZXMgcmVzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCk7Ci0KLSAgICAgICAgLy8gRmV0Y2ggYXJ0IGljb25zIGFnYWluIGZvciBsYXlvdXQgY2hhbmdlcyB0byByZXNpemUgaXQgYWNjb3JkaW5nbHkKLSAgICAgICAgbUFydEljb25CaXRtYXAgPSBudWxsOwotICAgICAgICBtQXJ0SWNvblVyaSA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLQotICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obnVsbCk7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgbVJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOID8gLTEgOiAxKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGUoYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIC8vIERlZmVyIGRpYWxvZyB1cGRhdGVzIGlmIGEgdXNlciBpcyBhZGp1c3RpbmcgYSB2b2x1bWUgaW4gdGhlIGxpc3QKLSAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCB8PSBhbmltYXRlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVJvdXRlLmlzU2VsZWN0ZWQoKSB8fCBtUm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUNyZWF0ZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0Vmlldy5zZXRUZXh0KG1Sb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KG1Sb3V0ZS5jYW5EaXNjb25uZWN0KCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydEljb25Jc0xvYWRlZCkgewotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQobUFydEljb25Mb2FkZWRCaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3Qgc2V0IGFydHdvcmsgaW1hZ2Ugd2l0aCByZWN5Y2xlZCBiaXRtYXA6ICIgKyBtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEltYWdlQml0bWFwKG1BcnRJY29uTG9hZGVkQml0bWFwKTsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobUFydEljb25CYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xlYXJMb2FkZWRCaXRtYXAoKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCk7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQoYW5pbWF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQml0bWFwUmVjeWNsZWQoQml0bWFwIGJpdG1hcCkgewotICAgICAgICByZXR1cm4gYml0bWFwICE9IG51bGwgJiYgYml0bWFwLmlzUmVjeWNsZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIChtRGVzY3JpcHRpb24gIT0gbnVsbCB8fCBtU3RhdGUgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIG1haW4gbWVkaWEgY29udHJvbGxlciB3aGljaCBpbmNsdWRlcyBwbGF5YmFjayBjb250cm9sIGFuZCBtYXN0ZXIKLSAgICAgKiB2b2x1bWUgY29udHJvbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRNYWluQ29udHJvbGxlckhlaWdodChib29sZWFuIHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IDA7Ci0gICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sIHx8IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIGhlaWdodCArPSBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRQYWRkaW5nVG9wKCkKLSAgICAgICAgICAgICAgICAgICAgKyBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRQYWRkaW5nQm90dG9tKCk7Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSAgbVBsYXliYWNrQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sICYmIG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gbURpdmlkZXJWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlaWdodDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpIHsKLSAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoZSB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nIG9mIHRoZSBjb250cm9sIGxheW91dCBhY2NvcmRpbmcgdG8gdGhlIGRpc3BsYXkKLSAgICAgICAgLy8gaGVpZ2h0LgotICAgICAgICBtRGl2aWRlclZpZXcuc2V0VmlzaWJpbGl0eSgobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRQotICAgICAgICAgICAgICAgICYmIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eSgobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORQotICAgICAgICAgICAgICAgICYmICFjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuR09ORSA6IFZpZXcuVklTSUJMRSk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHQoZmluYWwgYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVmZXIgdGhlIHVwZGF0ZSB1bnRpbCB0aGUgZmlyc3QgbGF5b3V0IGhhcyBvY2N1cnJlZCwgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlCi0gICAgICAgIC8vIG92ZXJhbGwgdmlzaWJsZSBkaXNwbGF5IHNpemUgaW4gd2hpY2ggdGhlIHdpbmRvdyB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8gaGFzIGJlZW4KLSAgICAgICAgLy8gcG9zaXRpb25lZCBpbi4KLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cExpc3RBbmltYXRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0SW50ZXJuYWwoYW5pbWF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBoZWlnaHQgb2Ygdmlld3MgYW5kIGhpZGUgYXJ0d29yayBvciBtZXRhZGF0YSBpZiBzcGFjZSBpcyBsaW1pdGVkLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0SW50ZXJuYWwoYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIC8vIE1lYXN1cmUgdGhlIHNpemUgb2Ygd2lkZ2V0cyBhbmQgZ2V0IHRoZSBoZWlnaHQgb2YgbWFpbiBjb21wb25lbnRzLgotICAgICAgICBpbnQgb2xkSGVpZ2h0ID0gZ2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKTsKLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgZGVjb3JWaWV3Lm1lYXN1cmUoCi0gICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKS53aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSksCi0gICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG9sZEhlaWdodCk7Ci0gICAgICAgIGludCBhcnRWaWV3SGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRWaWV3LmdldERyYXdhYmxlKCkgaW5zdGFuY2VvZiBCaXRtYXBEcmF3YWJsZSkgewotICAgICAgICAgICAgQml0bWFwIGFydCA9ICgoQml0bWFwRHJhd2FibGUpIG1BcnRWaWV3LmdldERyYXdhYmxlKCkpLmdldEJpdG1hcCgpOwotICAgICAgICAgICAgaWYgKGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJ0Vmlld0hlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQoYXJ0LmdldFdpZHRoKCksIGFydC5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0U2NhbGVUeXBlKGFydC5nZXRXaWR0aCgpID49IGFydC5nZXRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9YWSA6IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX0NFTlRFUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG1haW5Db250cm9sbGVySGVpZ2h0ID0gZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKTsKLSAgICAgICAgaW50IHZvbHVtZUdyb3VwTGlzdENvdW50ID0gbUdyb3VwTWVtYmVyUm91dGVzLnNpemUoKTsKLSAgICAgICAgLy8gU2NhbGUgZG93biB2b2x1bWUgZ3JvdXAgbGlzdCBpdGVtcyBpbiBsYW5kc2NhcGUgbW9kZS4KLSAgICAgICAgaW50IGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gMCA6Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBnZXRHcm91cCgpLmdldFJvdXRlcygpLnNpemUoKTsKLSAgICAgICAgaWYgKHZvbHVtZUdyb3VwTGlzdENvdW50ID4gMCkgewotICAgICAgICAgICAgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgKz0gbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7Ci0gICAgICAgIH0KLSAgICAgICAgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBNYXRoLm1pbihleHBhbmRlZEdyb3VwTGlzdEhlaWdodCwgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCk7Ci0gICAgICAgIGludCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ID0gbUlzR3JvdXBFeHBhbmRlZCA/IGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0IDogMDsKLQotICAgICAgICBpbnQgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPQotICAgICAgICAgICAgICAgIE1hdGgubWF4KGFydFZpZXdIZWlnaHQsIHZpc2libGVHcm91cExpc3RIZWlnaHQpICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOwotICAgICAgICBkZWNvclZpZXcuZ2V0V2luZG93VmlzaWJsZURpc3BsYXlGcmFtZSh2aXNpYmxlUmVjdCk7Ci0gICAgICAgIC8vIEhlaWdodCBvZiBub24tY29udHJvbCB2aWV3cyBpbiBkZWNvciB2aWV3LgotICAgICAgICAvLyBUaGlzIGluY2x1ZGVzIHRpdGxlIGJhciwgYnV0dG9uIGJhciwgYW5kIGRpYWxvZydzIHZlcnRpY2FsIHBhZGRpbmcgd2hpY2ggc2hvdWxkIGJlCi0gICAgICAgIC8vIGFsd2F5cyBzaG93bi4KLSAgICAgICAgaW50IG5vbkNvbnRyb2xWaWV3SGVpZ2h0ID0gbURpYWxvZ0FyZWFMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgIC0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBoZWlnaHQgZm9yIGNvbnRyb2xzIHRvIGZpdCBzY3JlZW4uCi0gICAgICAgIGludCBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKSAtIG5vbkNvbnRyb2xWaWV3SGVpZ2h0OwotCi0gICAgICAgIC8vIFNob3cgYXJ0d29yayBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBhcnRWaWV3SGVpZ2h0ID4gMAotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IDw9IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgbUFydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1BcnRWaWV3LCBhcnRWaWV3SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCkgKyBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgID49IG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9IHZpc2libGVHcm91cExpc3RIZWlnaHQgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBTaG93IHRoZSBwbGF5YmFjayBjb250cm9sIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKQotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IDw9IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIG1haW5Db250cm9sbGVySGVpZ2h0ID0gZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoCi0gICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKLSAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPQotICAgICAgICAgICAgICAgIE1hdGgubWF4KGFydFZpZXdIZWlnaHQsIHZpc2libGVHcm91cExpc3RIZWlnaHQpICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0KLSAgICAgICAgLy8gTGltaXQgdGhlIHZvbHVtZSBncm91cCBsaXN0IGhlaWdodCB0byBmaXQgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID4gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0IC09IChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCAtIG1heGltdW1Db250cm9sVmlld0hlaWdodCk7Ci0gICAgICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9IG1heGltdW1Db250cm9sVmlld0hlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxheW91dHMgd2l0aCB0aGUgY29tcHV0ZWQgaGVpZ2h0cy4KLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgaWYgKGFuaW1hdGUpIHsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTWF4aW1pemUgdGhlIHdpbmRvdyBzaXplIHdpdGggYSB0cmFuc3BhcmVudCBsYXlvdXQgaW4gYWR2YW5jZSBmb3Igc21vb3RoIGFuaW1hdGlvbi4KLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1FeHBhbmRhYmxlQXJlYUxheW91dCwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkpOwotICAgICAgICByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlVm9sdW1lR3JvdXBJdGVtSGVpZ2h0KFZpZXcgaXRlbSkgewotICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgaXRlbS5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQoY29udGFpbmVyLCBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCk7Ci0gICAgICAgIFZpZXcgaWNvbiA9IGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7Ci0gICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBpY29uLmdldExheW91dFBhcmFtcygpOwotICAgICAgICBscC53aWR0aCA9IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgICAgIGxwLmhlaWdodCA9IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgICAgIGljb24uc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUxheW91dEhlaWdodChmaW5hbCBWaWV3IHZpZXcsIGludCB0YXJnZXRIZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHN0YXJ0VmFsdWUgPSBnZXRMYXlvdXRIZWlnaHQodmlldyk7Ci0gICAgICAgIGZpbmFsIGludCBlbmRWYWx1ZSA9IHRhcmdldEhlaWdodDsKLSAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBuZXcgQW5pbWF0aW9uKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gc3RhcnRWYWx1ZSAtIChpbnQpICgoc3RhcnRWYWx1ZSAtIGVuZFZhbHVlKSAqIGludGVycG9sYXRlZFRpbWUpOwotICAgICAgICAgICAgICAgIHNldExheW91dEhlaWdodCh2aWV3LCBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBhbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7Ci0gICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgfQotICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW0pOwotICAgIH0KLQotICAgIHZvaWQgbG9hZEludGVycG9sYXRvcigpIHsKLSAgICAgICAgbUludGVycG9sYXRvciA9Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA/IG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgOiBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShtUm91dGUpKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE1heChtUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3MobVJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KGdldEdyb3VwKCkgPT0gbnVsbCA/IFZpZXcuR09ORQotICAgICAgICAgICAgICAgICAgICAgICAgOiBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMgPSBnZXRHcm91cCgpID09IG51bGwgPyBudWxsIDogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmxpc3RVbm9yZGVyZWRFcXVhbHMobUdyb3VwTWVtYmVyUm91dGVzLCByb3V0ZXMpKSB7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwID0gYW5pbWF0ZQotICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJvdW5kTWFwKG1Wb2x1bWVHcm91cExpc3QsIG1Wb2x1bWVHcm91cEFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgICAgIDogbnVsbDsKLSAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1CaXRtYXBNYXAobUNvbnRleHQsIG1Wb2x1bWVHcm91cExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlcikgOiBudWxsOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zQWRkZWQobUdyb3VwTWVtYmVyUm91dGVzLCByb3V0ZXMpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNSZW1vdmVkKG1Hcm91cE1lbWJlclJvdXRlcywKLSAgICAgICAgICAgICAgICAgICAgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5hZGRBbGwoMCwgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLnJlbW92ZUFsbChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkKTsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1Jc0dyb3VwRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpICsgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKHByZXZpb3VzUm91dGVCb3VuZE1hcCwgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXMoZmluYWwgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgZmluYWwgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKHByZXZpb3VzUm91dGVCb3VuZE1hcCwgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwoCi0gICAgICAgICAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCi0gICAgICAgICAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgewotICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPT0gbnVsbCB8fCBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgZ3JvdXBTaXplRGVsdGEgPSBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgLSBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdGFydEFuaW1hdGlvbkFsbCgpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QucG9zdERlbGF5ZWQobUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBBbmltYXRlIHZpc2libGUgaXRlbXMgZnJvbSBwcmV2aW91cyBwb3NpdGlvbnMgdG8gY3VycmVudCBwb3NpdGlvbnMgZXhjZXB0IHJvdXRlcyBhZGRlZAotICAgICAgICAvLyBqdXN0IGJlZm9yZS4gQWRkZWQgcm91dGVzIHdpbGwgcmVtYWluIGhpZGRlbiB1bnRpbCB0cmFuc2xhdGUgYW5pbWF0aW9uIGZpbmlzaGVzLgotICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFJlY3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCBjdXJyZW50VG9wID0gdmlldy5nZXRUb3AoKTsKLSAgICAgICAgICAgIGludCBwcmV2aW91c1RvcCA9IHByZXZpb3VzQm91bmRzICE9IG51bGwgPyBwcmV2aW91c0JvdW5kcy50b3AKLSAgICAgICAgICAgICAgICAgICAgOiAoY3VycmVudFRvcCArIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ3JvdXBTaXplRGVsdGEpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNUb3AgPSBjdXJyZW50VG9wOwotICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMC4wZik7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgcHJldmlvdXNUb3AgLSBjdXJyZW50VG9wLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbih0cmFuc2xhdGlvbkFuaW0pOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJvdW5kTWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICBwcmV2aW91c1JvdXRlQml0bWFwTWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBhIG1lbWJlciByb3V0ZSBkb2Vzbid0IGV4aXN0IGFueSBsb25nZXIsIGl0IGNhbiBiZSBlaXRoZXIgcmVtb3ZlZCBvciBtb3ZlZCBvdXQgb2YgdGhlCi0gICAgICAgIC8vIExpc3RWaWV3IGxheW91dCBib3VuZGFyeS4gSW4gdGhpcyBjYXNlLCB1c2UgdGhlIHByZXZpb3VzbHkgY2FwdHVyZWQgYml0bWFwcyBmb3IKLSAgICAgICAgLy8gYW5pbWF0aW9uLgotICAgICAgICBmb3IgKE1hcC5FbnRyeTxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBpdGVtCi0gICAgICAgICAgICAgICAgOiBwcmV2aW91c1JvdXRlQml0bWFwTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGl0ZW0uZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBpdGVtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgT3ZlcmxheU9iamVjdCBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IE92ZXJsYXlPYmplY3QoYml0bWFwLCBib3VuZHMpLnNldEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGRlbHRhWSA9IGdyb3VwU2l6ZURlbHRhICogbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IE92ZXJsYXlPYmplY3QoYml0bWFwLCBib3VuZHMpLnNldFRyYW5zbGF0ZVlBbmltYXRpb24oZGVsdGFZKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFuaW1hdGlvbkVuZExpc3RlbmVyKG5ldyBPdmVybGF5T2JqZWN0Lk9uQW5pbWF0aW9uRW5kTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuYWRkT3ZlcmxheU9iamVjdChvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpIHsKLSAgICAgICAgY2xlYXJHcm91cExpc3RBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGZhZGVJbkFkZGVkUm91dGVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGZpbmlzaEFuaW1hdGlvbihib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOwotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gbnVsbDsKLSAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgIGlmIChtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nKSB7Ci0gICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQoYW5pbWF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmYWRlSW5BZGRlZFJvdXRlcygpIHsKLSAgICAgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotICAgICAgICB9OwotICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2xlYXJHcm91cExpc3RBbmltYXRpb24oYm9vbGVhbiBleGNlcHRBZGRlZFJvdXRlcykgewotICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRBZGRlZFJvdXRlcyAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgIGNvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDEuMGYpOwotICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0b3BBbmltYXRpb25BbGwoKTsKLSAgICAgICAgaWYgKCFleGNlcHRBZGRlZFJvdXRlcykgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRUaXRsZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNUaXRsZSA9ICFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRTdWJ0aXRsZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNTdWJ0aXRsZSA9ICFUZXh0VXRpbHMuaXNFbXB0eShzdWJ0aXRsZSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1RpdGxlID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIHNob3dTdWJ0aXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Sb3V0ZS5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKQotICAgICAgICAgICAgICAgICAgICAhPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4KLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbikpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBudWxsIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfTk9ORSkgewotICAgICAgICAgICAgICAgIC8vIFNob3cgIk5vIG1lZGlhIHNlbGVjdGVkIiBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUgcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQpKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzVGl0bGUgJiYgIWhhc1N1YnRpdGxlKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUpKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzVGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1N1YnRpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dTdWJ0aXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dUaXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N1YnRpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLQotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BsYXlpbmcgPSBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX0JVRkZFUklORwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgIENvbnRleHQgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dCA9IG1QbGF5YmFja0NvbnRyb2xCdXR0b24uZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaW50IGljb25EcmF3YWJsZUF0dHIgPSAwOwotICAgICAgICAgICAgICAgIGludCBpY29uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaXNQbGF5aW5nICYmIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQYXVzZURyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxheWluZyAmJiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVTdG9wRHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQbGF5aW5nICYmIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBsYXlEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldEltYWdlUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRUaGVtZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dCwgaWNvbkRyYXdhYmxlQXR0cikpOwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LmdldFJlc291cmNlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dChpY29uRGVzY1Jlc0lkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QTEFZIHwgQUNUSU9OX1BMQVlfUEFVU0UpKSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BBVVNFIHwgQUNUSU9OX1BMQVlfUEFVU0UpKSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIEFDVElPTl9TVE9QKSAhPSAwOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICByZXR1cm4gbVZvbHVtZUNvbnRyb2xFbmFibGVkICYmIHJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkKLSAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMYXlvdXRIZWlnaHQoVmlldyB2aWV3KSB7Ci0gICAgICAgIHJldHVybiB2aWV3LmdldExheW91dFBhcmFtcygpLmhlaWdodDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRMYXlvdXRIZWlnaHQoVmlldyB2aWV3LCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBscC5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVyaUVxdWFscyhVcmkgdXJpMSwgVXJpIHVyaTIpIHsKLSAgICAgICAgaWYgKHVyaTEgIT0gbnVsbCAmJiB1cmkxLmVxdWFscyh1cmkyKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpMSA9PSBudWxsICYmIHVyaTIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZGVzaXJlZCBhcnQgaGVpZ2h0IHRvIGZpdCBpbnRvIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqLwotICAgIGludCBnZXREZXNpcmVkQXJ0SGVpZ2h0KGludCBvcmlnaW5hbFdpZHRoLCBpbnQgb3JpZ2luYWxIZWlnaHQpIHsKLSAgICAgICAgaWYgKG9yaWdpbmFsV2lkdGggPj0gb3JpZ2luYWxIZWlnaHQpIHsKLSAgICAgICAgICAgIC8vIEZvciBsYW5kc2NhcGUgYXJ0LCBmaXQgd2lkdGggdG8gZGlhbG9nIHdpZHRoLgotICAgICAgICAgICAgcmV0dXJuIChpbnQpICgoZmxvYXQpIG1EaWFsb2dDb250ZW50V2lkdGggKiBvcmlnaW5hbEhlaWdodCAvIG9yaWdpbmFsV2lkdGggKyAwLjVmKTsKLSAgICAgICAgfQotICAgICAgICAvLyBGb3IgcG9ydHJhaXQgYXJ0LCBmaXQgaGVpZ2h0IHRvIDE2OjkgcmF0aW8gY2FzZSdzIGhlaWdodC4KLSAgICAgICAgcmV0dXJuIChpbnQpICgoZmxvYXQpIG1EaWFsb2dDb250ZW50V2lkdGggKiA5IC8gMTYgKyAwLjVmKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpIHsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsIHx8ICFpc0ljb25DaGFuZ2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZldGNoQXJ0VGFzayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmV0Y2hBcnRUYXNrLmNhbmNlbCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbmV3IEZldGNoQXJ0VGFzaygpOwotICAgICAgICBtRmV0Y2hBcnRUYXNrLmV4ZWN1dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgYml0bWFwIGxvYWRlZCBieSBGZXRjaEFydFRhc2suIFdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBsb2FkZWQgYml0bWFwcyBhcmUgYXBwbGllZAotICAgICAqIHRvIGFydHdvcmssIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyTG9hZGVkQml0bWFwKCkgewotICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gZmFsc2U7Ci0gICAgICAgIG1BcnRJY29uTG9hZGVkQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25CYWNrZ3JvdW5kQ29sb3IgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhIG5ldyBhcnQgaW1hZ2UgaXMgZGlmZmVyZW50IGZyb20gYW4gb3JpZ2luYWwgYXJ0IGltYWdlLiBDb21wYXJlcwotICAgICAqIEJpdG1hcCBvYmplY3RzIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlcyBVUklzIG9ubHkgaWYgYml0bWFwIGlzIHVuY2hhbmdlZCB3aXRoCi0gICAgICogYSBudWxsIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ljb25DaGFuZ2VkKCkgewotICAgICAgICBCaXRtYXAgbmV3Qml0bWFwID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG5ld1VyaSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uVXJpKCk7Ci0gICAgICAgIEJpdG1hcCBvbGRCaXRtYXAgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvbkJpdG1hcCA6IG1GZXRjaEFydFRhc2suZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICBVcmkgb2xkVXJpID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25VcmkgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25VcmkoKTsKLSAgICAgICAgaWYgKG9sZEJpdG1hcCAhPSBuZXdCaXRtYXApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9sZEJpdG1hcCA9PSBudWxsICYmICF1cmlFcXVhbHMob2xkVXJpLCBuZXdVcmkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICB1cGRhdGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIFNlZWtCYXIgdm9sdW1lU2xpZGVyID0gbVZvbHVtZVNsaWRlck1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgaW50IHZvbHVtZSA9IHJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Sb3V0ZVZvbHVtZUNoYW5nZWQoKSwgcm91dGUuZ2V0Vm9sdW1lOiIgKyB2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZvbHVtZVNsaWRlciAhPSBudWxsICYmIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhQ29udHJvbGxlckNvbXBhdC5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkRlc3Ryb3llZCgpIHsKLSAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGVDb21wYXQgc3RhdGUpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhQ29tcGF0IG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBtZXRhZGF0YSA9PSBudWxsID8gbnVsbCA6IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIENsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBpZCA9IHYuZ2V0SWQoKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBCVVRUT05fU1RPUF9SRVNfSUQgfHwgaWQgPT0gQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZS5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlci51bnNlbGVjdChpZCA9PSBCVVRUT05fU1RPUF9SRVNfSUQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCkgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwgJiYgbVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BsYXlpbmcgPSBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb25EZXNjUmVzSWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGF5aW5nICYmIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxheWluZyAmJiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQbGF5aW5nICYmIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQW5ub3VuY2UgdGhlIGFjdGlvbiBmb3IgYWNjZXNzaWJpbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5TWFuYWdlciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFjdGlvbkRlc2NSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQuVFlQRV9BTk5PVU5DRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRDbGFzc05hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKGFjdGlvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBSLmlkLm1yX2Nsb3NlKSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdG9wVHJhY2tpbmdUb3VjaCA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAobUhhc1BlbmRpbmdVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnJlbW92ZUNhbGxiYWNrcyhtU3RvcFRyYWNraW5nVG91Y2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgLy8gRGVmZXIgcmVzZXR0aW5nIG1Wb2x1bWVTbGlkZXJUb3VjaGVkIHRvIGFsbG93IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAgICAgICAgLy8gYSBsaXR0bGUgdGltZSB0byBzZXR0bGUgaW50byBpdHMgbmV3IHN0YXRlIGFuZCBwdWJsaXNoIHRoZSBmaW5hbAotICAgICAgICAgICAgLy8gdm9sdW1lIHVwZGF0ZS4KLSAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucG9zdERlbGF5ZWQobVN0b3BUcmFja2luZ1RvdWNoLCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgIGlmIChmcm9tVXNlcikgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUHJvZ3Jlc3NDaGFuZ2VkKCk6IGNhbGxpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhUm91dGVyLlJvdXRlSW5mby5yZXF1ZXN0U2V0Vm9sdW1lKCIgKyBwcm9ncmVzcyArICIpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJvdXRlLnJlcXVlc3RTZXRWb2x1bWUocHJvZ3Jlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVHcm91cEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOwotCi0gICAgICAgIHB1YmxpYyBWb2x1bWVHcm91cEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gb2JqZWN0cykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhmaW5hbCBpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIFZpZXcgdiA9IGNvbnZlcnRWaWV3OwotICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHYgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHBhcmVudC5nZXRDb250ZXh0KCkpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVm9sdW1lR3JvdXBJdGVtSGVpZ2h0KHYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSByb3V0ZS5pc0VuYWJsZWQoKTsKLQotICAgICAgICAgICAgICAgIFRleHRWaWV3IHJvdXRlTmFtZSA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRUZXh0KHJvdXRlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcikgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfc2xpZGVyKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldENvbnRleHQoKSwgdm9sdW1lU2xpZGVyLCBtVm9sdW1lR3JvdXBMaXN0KTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0VGFnKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyTWFwLnB1dChyb3V0ZSwgdm9sdW1lU2xpZGVyKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0SGlkZVRodW1iKCFpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heChyb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Mocm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3MoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEltYWdlVmlldyB2b2x1bWVJdGVtSWNvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICAgICAgICAgIHZvbHVtZUl0ZW1JY29uLnNldEFscGhhKGlzRW5hYmxlZCA/IDB4RkYgOiAoaW50KSAoMHhGRiAqIG1EaXNhYmxlZEFscGhhKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBvdmVybGF5IGJpdG1hcCBleGlzdHMsIHJlYWwgdmlldyBzaG91bGQgcmVtYWluIGhpZGRlbiB1bnRpbAotICAgICAgICAgICAgICAgIC8vIHRoZSBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zZXRWaXNpYmlsaXR5KG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAuY29udGFpbnMocm91dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJvdXRlcyB3aGljaCBhcmUgYmVpbmcgYWRkZWQgd2lsbCBiZSBpbnZpc2libGUgdW50aWwgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMC4wZik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB2LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHYuc3RhcnRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRmV0Y2hBcnRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEJpdG1hcD4gewotICAgICAgICAvLyBTaG93IGFuaW1hdGlvbiBvbmx5IHdoZW4gZmV0Y2hpbmcgdGFrZXMgYSBsb25nIHRpbWUuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0hPV19BTklNX1RJTUVfVEhSRVNIT0xEX01JTExJUyA9IDEyMEw7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUljb25CaXRtYXA7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZU1pbGxpczsKLQotICAgICAgICBGZXRjaEFydFRhc2soKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGJpdG1hcCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBmZXRjaCB0aGUgZ2l2ZW4gYXJ0IGJpdG1hcCBiZWNhdXNlIGl0J3MgYWxyZWFkeSByZWN5Y2xlZC4iKTsKLSAgICAgICAgICAgICAgICBiaXRtYXAgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUljb25CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgICAgICBtSWNvblVyaSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uVXJpKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQml0bWFwIGdldEljb25CaXRtYXAoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25CaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25Vcmk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25QcmVFeGVjdXRlKCkgewotICAgICAgICAgICAgbVN0YXJ0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgY2xlYXJMb2FkZWRCaXRtYXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQml0bWFwIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJnKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtSWNvbkJpdG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJ0ID0gbUljb25CaXRtYXA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1JY29uVXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFF1ZXJ5IGFydCBzaXplLgotICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucyA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vdXRXaWR0aCA9PSAwIHx8IG9wdGlvbnMub3V0SGVpZ2h0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJld2luZCB0aGUgc3RyZWFtIGluIG9yZGVyIHRvIHJlc3RhcnQgYXJ0IGRlY29kaW5nLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWxlZCB0byByZXdpbmQgdGhlIHN0cmVhbSwgdHJ5IHRvIHJlb3BlbiBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgc2l6ZSB0byBkZWNvZGUgdGhlIGFydCBhbmQgcG9zc2libHkgcmVzaXplIGl0LgotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVxSGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChvcHRpb25zLm91dFdpZHRoLCBvcHRpb25zLm91dEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByYXRpbyA9IG9wdGlvbnMub3V0SGVpZ2h0IC8gcmVxSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluU2FtcGxlU2l6ZSA9IE1hdGgubWF4KDEsIEludGVnZXIuaGlnaGVzdE9uZUJpdChyYXRpbykpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJ0ID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYXJ0KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHVzZSByZWN5Y2xlZCBiaXRtYXA6ICIgKyBhcnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFydCAhPSBudWxsICYmIGFydC5nZXRXaWR0aCgpIDwgYXJ0LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gUG9ydHJhaXQgYXJ0IHJlcXVpcmVzIGRvbWluYW50IGNvbG9yIGFzIGJhY2tncm91bmQgY29sb3IuCi0gICAgICAgICAgICAgICAgUGFsZXR0ZSBwYWxldHRlID0gbmV3IFBhbGV0dGUuQnVpbGRlcihhcnQpLm1heGltdW1Db2xvckNvdW50KDEpLmdlbmVyYXRlKCk7Ci0gICAgICAgICAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IHBhbGV0dGUuZ2V0U3dhdGNoZXMoKS5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gMCA6IHBhbGV0dGUuZ2V0U3dhdGNoZXMoKS5nZXQoMCkuZ2V0UmdiKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQml0bWFwIGFydCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzayA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1BcnRJY29uQml0bWFwLCBtSWNvbkJpdG1hcCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIU9iamVjdHNDb21wYXQuZXF1YWxzKG1BcnRJY29uVXJpLCBtSWNvblVyaSkpIHsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgICAgIG1BcnRJY29uTG9hZGVkQml0bWFwID0gYXJ0OwotICAgICAgICAgICAgICAgIG1BcnRJY29uVXJpID0gbUljb25Vcmk7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CYWNrZ3JvdW5kQ29sb3IgPSBtQmFja2dyb3VuZENvbG9yOwotICAgICAgICAgICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWVNaWxsaXM7Ci0gICAgICAgICAgICAgICAgLy8gTG9hZGVkIGJpdG1hcCB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIG5leHQgdXBkYXRlCi0gICAgICAgICAgICAgICAgdXBkYXRlKGVsYXBzZWRUaW1lTWlsbGlzID4gU0hPV19BTklNX1RJTUVfVEhSRVNIT0xEX01JTExJUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKFVyaSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgaWYgKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRS5lcXVhbHMoc2NoZW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9GSUxFLmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldENvbm5lY3RUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVhZFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0gPT0gbnVsbCkgPyBudWxsIDogbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWQ3NGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAqIDxwPgotICogQ3JlYXRlcyBhIHtAbGluayBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ30uICBUaGUgYXBwbGljYXRpb24gbWF5IHN1YmNsYXNzCi0gKiB0aGlzIGRpYWxvZyBmcmFnbWVudCB0byBjdXN0b21pemUgdGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIG1EaWFsb2c7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgotICAgICAqIDxwPgotICAgICAqIEFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBhbHNvIHBvc3Nlc3MgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpIHsKLSAgICAgICAgc2V0Q2FuY2VsYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbURpYWxvZy5jbGVhckdyb3VwTGlzdEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbURpYWxvZy51cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllYWYzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBtZWRpYSByb3V0ZQotICogY2hvb3NlciBhbmQgY29udHJvbGxlciBkaWFsb2dzIGFzIG5lZWRlZC4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgcHJvdmlkaW5nIGEgc3ViY2xhc3Mgb2YgdGhlCi0gKiBkaWFsb2cgZmFjdG9yeSB0byB0aGUge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVCdXR0b24jc2V0RGlhbG9nRmFjdG9yeSBzZXREaWFsb2dGYWN0b3J5fSBtZXRob2QuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3Rvcnkgc0RlZmF1bHQgPSBuZXcgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5LCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gc0RlZmF1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNob29zZXIgZGlhbG9nIGlzIGJlaW5nIG9wZW5lZCBhbmQgaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIGZyYWdtZW50LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIGN1c3RvbWl6ZWQgZnJhZ21lbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCBvbkNyZWF0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIG9wZW5lZCBhbmQgaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIGZyYWdtZW50LgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIGN1c3RvbWl6ZWQgZnJhZ21lbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYmY3Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIgewotICAgIC8qKgotICAgICAqIFRoZSBmcmFtZXdvcmsgc2hvdWxkIHNldCB0aGUgZGlhbG9nIHdpZHRoIHByb3Blcmx5LCBidXQgc29tZWhvdyBpdCBkb2Vzbid0IHdvcmssIGhlbmNlCi0gICAgICogZHVwbGljYXRpbmcgYSBzaW1pbGFyIGxvZ2ljIGhlcmUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgd2lkdGguCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhbG9nV2lkdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNQb3J0cmFpdCA9IG1ldHJpY3Mud2lkdGhQaXhlbHMgPCBtZXRyaWNzLmhlaWdodFBpeGVsczsKLQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRWYWx1ZShpc1BvcnRyYWl0Ci0gICAgICAgICAgICAgICAgPyBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vcgotICAgICAgICAgICAgICAgIDogUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0RJTUVOU0lPTikgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlLmdldERpbWVuc2lvbihtZXRyaWNzKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9GUkFDVElPTikgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlLmdldEZyYWN0aW9uKG1ldHJpY3Mud2lkdGhQaXhlbHMsIG1ldHJpY3Mud2lkdGhQaXhlbHMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgcmVnYXJkbGVzcyBvZiBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0MSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gbGlzdDIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGxpc3QxfQotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0d28gbGlzdHMgaGF2ZSBleGFjdGx5IHNhbWUgaXRlbXMgcmVnYXJkbGVzcyBvZiBvcmRlciwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gbGlzdFVub3JkZXJlZEVxdWFscyhMaXN0PEU+IGxpc3QxLCBMaXN0PEU+IGxpc3QyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0MSA9IG5ldyBIYXNoU2V0PD4obGlzdDEpOwotICAgICAgICBIYXNoU2V0PEU+IHNldDIgPSBuZXcgSGFzaFNldDw+KGxpc3QyKTsKLSAgICAgICAgcmV0dXJuIHNldDEuZXF1YWxzKHNldDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAotICAgICAqIGFmdGVyLWxpc3QgYnV0IGJlZm9yZS1saXN0LCB3aGljaCBtZWFucyBuZXdseSBhZGRlZCBpdGVtcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWZvcmUgQSBsaXN0Ci0gICAgICogQHBhcmFtIGFmdGVyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBiZWZvcmV9Ci0gICAgICogQHJldHVybiBBIHNldCBvZiBpdGVtcyB3aGljaCBjb250YWlucyBuZXdseSBhZGRlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc0FkZGVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihhZnRlcik7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYmVmb3JlKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBiZWZvcmUtbGlzdCBidXQgYWZ0ZXItbGlzdCwgd2hpY2ggbWVhbnMgcmVtb3ZlZCBpdGVtcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWZvcmUgQSBsaXN0Ci0gICAgICogQHBhcmFtIGFmdGVyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBiZWZvcmV9Ci0gICAgICogQHJldHVybiBBIHNldCBvZiBpdGVtcyB3aGljaCBjb250YWlucyByZW1vdmVkIGl0ZW1zIHdoaWxlCi0gICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zUmVtb3ZlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYmVmb3JlKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChhZnRlcik7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGFuIGl0ZW0tUmVjdCBtYXAgd2hpY2ggaW5kaWNhdGVzIHdoZXJlIG1lbWJlcgotICAgICAqIGl0ZW1zIGFyZSBsb2NhdGVkIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgYm91bmRzIG9mIHRoZWlyIHZpZXdzIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGxpc3Qgdmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoTWFwPEUsIFJlY3Q+IGdldEl0ZW1Cb3VuZE1hcChMaXN0VmlldyBsaXN0VmlldywKLSAgICAgICAgICAgIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0gICAgICAgIEhhc2hNYXA8RSwgUmVjdD4gaXRlbUJvdW5kTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBpbnQgZmlyc3RWaXNpYmxlUG9zaXRpb24gPSBsaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWaWV3LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdFZpc2libGVQb3NpdGlvbiArIGk7Ci0gICAgICAgICAgICBFIGl0ZW0gPSBhZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgVmlldyB2aWV3ID0gbGlzdFZpZXcuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGl0ZW1Cb3VuZE1hcC5wdXQoaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Qodmlldy5nZXRMZWZ0KCksIHZpZXcuZ2V0VG9wKCksIHZpZXcuZ2V0UmlnaHQoKSwgdmlldy5nZXRCb3R0b20oKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtQm91bmRNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGFuIGl0ZW0tQml0bWFwRHJhd2FibGUgbWFwIHdoaWNoIHN0b3JlcyBzbmFwc2hvdHMKLSAgICAgKiBvZiBtZW1iZXIgaXRlbXMgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBzbmFwc2hvdHMgb2YgdGhlaXIgdmlld3MgaW4gdGhlIGdpdmVuIGxpc3Qgdmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoTWFwPEUsIEJpdG1hcERyYXdhYmxlPiBnZXRJdGVtQml0bWFwTWFwKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIExpc3RWaWV3IGxpc3RWaWV3LCBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIEJpdG1hcERyYXdhYmxlPiBpdGVtQml0bWFwTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBpbnQgZmlyc3RWaXNpYmxlUG9zaXRpb24gPSBsaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWaWV3LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdFZpc2libGVQb3NpdGlvbiArIGk7Ci0gICAgICAgICAgICBFIGl0ZW0gPSBhZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgVmlldyB2aWV3ID0gbGlzdFZpZXcuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGl0ZW1CaXRtYXBNYXAucHV0KGl0ZW0sIGdldFZpZXdCaXRtYXAoY29udGV4dCwgdmlldykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtQml0bWFwTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcERyYXdhYmxlIGdldFZpZXdCaXRtYXAoQ29udGV4dCBjb250ZXh0LCBWaWV3IHZpZXcpIHsKLSAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAodmlldy5nZXRXaWR0aCgpLCB2aWV3LmdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKLSAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsKLSAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQml0bWFwRHJhd2FibGUoY29udGV4dC5nZXRSZXNvdXJjZXMoKSwgYml0bWFwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlZTExOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBkaXNjb3ZlcnkgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIFRoaXMgZnJhZ21lbnQgdGFrZXMgY2FyZSBvZiByZWdpc3RlcmluZyBhIGNhbGxiYWNrIGZvciBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkKLSAqIGR1cmluZyB0aGUge0BsaW5rIEZyYWdtZW50I29uU3RhcnQgb25TdGFydCgpfSBwaGFzZQotICogYW5kIHJlbW92aW5nIGl0IGR1cmluZyB0aGUge0BsaW5rIEZyYWdtZW50I29uU3RvcCBvblN0b3AoKX0gcGhhc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gbXVzdCBzdXBwbHkgYSByb3V0ZSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMKLSAqIHRvIGRpc2NvdmVyLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIG92ZXJyaWRlIHtAbGluayAjb25DcmVhdGVDYWxsYmFja30gdG8KLSAqIHByb3ZpZGUgdGhlIHtAbGluayBNZWRpYVJvdXRlcn0gY2FsbGJhY2sgdG8gcmVnaXN0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBOb3RlIHRoYXQgdGhlIGRpc2NvdmVyeSBjYWxsYmFjayBtYWtlcyB0aGUgYXBwbGljYXRpb24gYmUgY29ubmVjdGVkIHdpdGggYWxsIHRoZQotICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzfQotICogd2hpbGUgaXQgaXMgcmVnaXN0ZXJlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9TRUxFQ1RPUiA9ICJzZWxlY3RvciI7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyIGdldE1lZGlhUm91dGVyKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXIoKTsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlcigpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOwotCi0gICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBjcmVhdGUgdGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9Ci0gICAgICogdGhhdCB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgY2FsbGJhY2sgZG9lcyBub3RoaW5nLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bwotICAgICAqIHN1cHBseSBpdHMgb3duIGNhbGxiYWNrLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjYWxsYmFjaywgb3IgbnVsbCBpZiBubyBjYWxsYmFjayBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgb25DcmVhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlci5DYWxsYmFjaygpIHsgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gcHJlcGFyZSB0aGUgY2FsbGJhY2sgZmxhZ3MgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfSBpcyByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlc2lyZWQgY2FsbGJhY2sgZmxhZ3MuCi0gICAgICovCi0gICAgcHVibGljIGludCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkgewotICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBlbnN1cmVSb3V0ZXIoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gb25DcmVhdGVDYWxsYmFjaygpOwotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTBhOTVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5Db250ZXh0Q29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi0vKioKLSAqIENoZXZyb24vQ2FyZXQgYnV0dG9uIHRvIGV4cGFuZC9jb2xsYXBzZSBncm91cCB2b2x1bWUgbGlzdCB3aXRoIGFuaW1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbiBleHRlbmRzIEltYWdlQnV0dG9uIHsKLSAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGU7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGU7Ci0gICAgZmluYWwgU3RyaW5nIG1FeHBhbmRHcm91cERlc2NyaXB0aW9uOwotICAgIGZpbmFsIFN0cmluZyBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uOwotICAgIGJvb2xlYW4gbUlzR3JvdXBFeHBhbmRlZDsKLSAgICBPbkNsaWNrTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfZXhwYW5kKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2NvbGxhcHNlKTsKLQotICAgICAgICBDb2xvckZpbHRlciBmaWx0ZXIgPSBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIGRlZlN0eWxlQXR0ciksCi0gICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zZXRDb2xvckZpbHRlcihmaWx0ZXIpOwotICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZS5zZXRDb2xvckZpbHRlcihmaWx0ZXIpOwotCi0gICAgICAgIG1FeHBhbmRHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCk7Ci0gICAgICAgIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXApOwotCi0gICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLmdldEZyYW1lKDApKTsKLSAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLQotICAgICAgICBzdXBlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUpOwotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUpOwotICAgICAgICAgICAgICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ2xpY2sodmlldyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWQyMGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci0KLS8qKgotICogVm9sdW1lIHNsaWRlciB3aXRoIHNob3dpbmcsIGhpZGluZywgYW5kIGFwcGx5aW5nIGFscGhhIHN1cHBvcnRzIHRvIHRoZSB0aHVtYi4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgZXh0ZW5kcyBTZWVrQmFyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVWb2x1bWVTbGlkZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSGlkZVRodW1iOwotICAgIHByaXZhdGUgRHJhd2FibGUgbVRodW1iOwotICAgIHByaXZhdGUgaW50IG1Db2xvcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkgewotICAgICAgICBzdXBlci5kcmF3YWJsZVN0YXRlQ2hhbmdlZCgpOwotICAgICAgICBpbnQgYWxwaGEgPSBpc0VuYWJsZWQoKSA/IDB4RkYgOiAoaW50KSAoMHhGRiAqIG1EaXNhYmxlZEFscGhhKTsKLQotICAgICAgICAvLyBUaGUgdGh1bWIgZHJhd2FibGUgaXMgYSBjb2xsZWN0aW9uIG9mIGRyYXdhYmxlcyBhbmQgaXRzIGN1cnJlbnQgZHJhd2FibGVzIGFyZSBjaGFuZ2VkIHBlcgotICAgICAgICAvLyBzdGF0ZS4gQXBwbHkgdGhlIGNvbG9yIGZpbHRlciBhbmQgYWxwaGEgb24gZXZlcnkgc3RhdGUgY2hhbmdlLgotICAgICAgICBpZiAobVRodW1iICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRDb2xvckZpbHRlcihtQ29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICAgICAgbVRodW1iLnNldEFscGhhKGFscGhhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRDb2xvckZpbHRlcihtQ29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0QWxwaGEoYWxwaGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRodW1iKERyYXdhYmxlIHRodW1iKSB7Ci0gICAgICAgIG1UaHVtYiA9IHRodW1iOwotICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aHVtYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIaWRlVGh1bWIoYm9vbGVhbiBoaWRlVGh1bWIpIHsKLSAgICAgICAgaWYgKG1IaWRlVGh1bWIgPT0gaGlkZVRodW1iKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUhpZGVUaHVtYiA9IGhpZGVUaHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZvbHVtZSBzbGlkZXIgY29sb3IuIFRoZSBjaGFuZ2UgdGFrZXMgZWZmZWN0IG5leHQgdGltZSBkcmF3YWJsZSBzdGF0ZSBpcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQsIG90aGVyd2lzZSB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBzZWVuIHRocm91Z2gKLSAgICAgKiB0aGUgdGh1bWIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGludCBjb2xvcikgewotICAgICAgICBpZiAobUNvbG9yID09IGNvbG9yKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvbG9yLmFscGhhKGNvbG9yKSAhPSAweEZGKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJWb2x1bWUgc2xpZGVyIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudDogIyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbG9yKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmMDQyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5Db2xvclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlclRoZW1lSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fQ09OVFJBU1QgPSAzLjBmOwotCi0gICAgQEludERlZih7Q09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5ELCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkR9KQotICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ29udHJvbGxlckNvbG9yVHlwZSB7fQotCi0gICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQgPSAweERFMDAwMDAwOyAvKiBPcGFjaXR5IG9mIDg3JSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EID0gQ29sb3IuV0hJVEU7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gQXBwbHkgYmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUuCi0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLQotICAgICAgICAvLyBBcHBseSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBpbnQgc3R5bGUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpOwotICAgICAgICBpZiAoc3R5bGUgIT0gMCkgewotICAgICAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHN0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4gVGhleSBzaG91bGQgYmUgdXNlZCB0byBwcmVwYXJlCi0gICAgICogdGhlIGNvbnRleHQgYW5kIHRoZW1lIGZvciBhIHN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yICh0aGUgbGF0dGVyIG1ldGhvZCByZWxpZXMgb24gdGhlCi0gICAgICogZm9ybWVyIG1ldGhvZCB0byBwcm9wZXJseSBwcmVwYXJlIHRoZSBjb250ZXh0KToKLSAgICAgKiAgIHN1cGVyKGNvbnRleHQgPSBjcmVhdGVUaGVtZWREaWFsb2dDb250ZXh0KGNvbnRleHQsIHRoZW1lKSwKLSAgICAgKiAgICAgICAgICAgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoY29udGV4dCkpOwotICAgICAqCi0gICAgICogSXQgd2lsbCBhcHBseSB0aGVtZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIChzdHlsZSBsb29rdXBzIHdpbGwgYmUgZG9uZSBpbiByZXZlcnNlKToKLSAgICAgKiAgIDEpIEN1cnJlbnQgdGhlbWUKLSAgICAgKiAgIDIpIFN1cHBsaWVkIHRoZW1lCi0gICAgICogICAzKSBCYXNlIE1lZGlhIFJvdXRlciB0aGVtZQotICAgICAqICAgNCkgQ3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSwgaWYgcHJvdmlkZWQKLSAgICAgKi8KLSAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWREaWFsb2dDb250ZXh0KENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lLCBib29sZWFuIGFsZXJ0RGlhbG9nKSB7Ci0gICAgICAgIC8vIDEpIEN1cnJlbnQgdGhlbWUgaXMgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBjb250ZXh0Ci0KLSAgICAgICAgLy8gMikgSWYgbm8gdGhlbWUgaXMgc3VwcGxpZWQsIGxvb2sgaXQgdXAgZnJvbSB0aGUgY29udGV4dCAoZGlhbG9nVGhlbWUvYWxlcnREaWFsb2dUaGVtZSkKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAhYWxlcnREaWFsb2cgPyBhbmRyb2lkLlIuYXR0ci5kaWFsb2dUaGVtZSA6IGFuZHJvaWQuUi5hdHRyLmFsZXJ0RGlhbG9nVGhlbWUpOwotICAgICAgICB9Ci0gICAgICAgIC8vICAgIEFwcGx5IGl0Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSk7Ci0KLSAgICAgICAgLy8gMykgSWYgYSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gYXBwbHkgdGhlIGJhc2UgdGhlbWUKLSAgICAgICAgaWYgKGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSkgIT0gMCkgewotICAgICAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByZXZpb3VzIG1ldGhvZC4KLSAgICBzdGF0aWMgaW50IGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyA0KSBBcHBseSB0aGUgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZQotICAgICAgICBpbnQgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpOwotICAgICAgICBpZiAodGhlbWUgPT0gMCkgewotICAgICAgICAgICAgLy8gMykgTm8gY3VzdG9tIE1lZGlhUm91dGVyIHRoZW1lIHdhcyBwcm92aWRlZCBzbyBhcHBseSB0aGUgYmFzZSB0aGVtZSBpbnN0ZWFkCi0gICAgICAgICAgICB0aGVtZSA9IGdldFJvdXRlclRoZW1lSWQoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhlbWU7Ci0gICAgfQotICAgIC8vIEVORC4gUHJldmlvdXMgdHdvIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uCi0KLSAgICBzdGF0aWMgaW50IGdldFRoZW1lUmVzb3VyY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgYXR0cikgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKSA/IHZhbHVlLnJlc291cmNlSWQgOiAwOwotICAgIH0KLQotICAgIHN0YXRpYyBmbG9hdCBnZXREaXNhYmxlZEFscGhhKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuUi5hdHRyLmRpc2FibGVkQWxwaGEsIHZhbHVlLCB0cnVlKQotICAgICAgICAgICAgICAgID8gdmFsdWUuZ2V0RmxvYXQoKSA6IDAuNWY7Ci0gICAgfQotCi0gICAgc3RhdGljIEBDb250cm9sbGVyQ29sb3JUeXBlIGludCBnZXRDb250cm9sbGVyQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgIGlmIChwcmltYXJ5Q29sb3IgPT0gMCkgewotICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5Q29sb3IgPT0gMCkgewotICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IDB4RkYwMDAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvbG9yVXRpbHMuY2FsY3VsYXRlQ29udHJhc3QoQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5ELCBwcmltYXJ5Q29sb3IpCi0gICAgICAgICAgICAgICAgPj0gTUlOX0NPTlRSQVNUKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRCdXR0b25UZXh0Q29sb3IoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQmFja2dyb3VuZCk7Ci0KLSAgICAgICAgaWYgKENvbG9yVXRpbHMuY2FsY3VsYXRlQ29udHJhc3QocHJpbWFyeUNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpIDwgTUlOX0NPTlRSQVNUKSB7Ci0gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGNvbG9yQWNjZW50IGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBsb3cuCi0gICAgICAgICAgICByZXR1cm4gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckFjY2VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByaW1hcnlDb2xvcjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBWaWV3IG1haW5Db250cm9scywgVmlldyBncm91cENvbnRyb2xzLCBib29sZWFuIGhhc0dyb3VwKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgIGludCBwcmltYXJ5RGFya0NvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnlEYXJrKTsKLSAgICAgICAgaWYgKGhhc0dyb3VwICYmIGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2Ygc2hvd2luZyBkYXJrIGNvbnRyb2xzIGluIGEgcG9zc2libHkgZGFyayAoaS5lLiB0aGUgcHJpbWFyeSBkYXJrKSwgbW9kZWwKLSAgICAgICAgICAgIC8vIHRoZSB3aGl0ZSBkaWFsb2cgYW5kIHVzZSB0aGUgcHJpbWFyeSBjb2xvciBmb3IgdGhlIGdyb3VwIGNvbnRyb2xzLgotICAgICAgICAgICAgcHJpbWFyeURhcmtDb2xvciA9IHByaW1hcnlDb2xvcjsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IENvbG9yLldISVRFOwotICAgICAgICB9Ci0gICAgICAgIG1haW5Db250cm9scy5zZXRCYWNrZ3JvdW5kQ29sb3IocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRCYWNrZ3JvdW5kQ29sb3IocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgICAgIC8vIEFsc28gc3RvcmUgdGhlIGJhY2tncm91bmQgY29sb3JzIHRvIHRoZSB2aWV3IHRhZ3MuIFRoZXkgYXJlIHVzZWQgaW4KLSAgICAgICAgLy8gc2V0Vm9sdW1lU2xpZGVyQ29sb3IoKSBiZWxvdy4KLSAgICAgICAgbWFpbkNvbnRyb2xzLnNldFRhZyhwcmltYXJ5Q29sb3IpOwotICAgICAgICBncm91cENvbnRyb2xzLnNldFRhZyhwcmltYXJ5RGFya0NvbG9yKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIsIFZpZXcgYmFja2dyb3VuZFZpZXcpIHsKLSAgICAgICAgaW50IGNvbnRyb2xsZXJDb2xvciA9IGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKTsKLSAgICAgICAgaWYgKENvbG9yLmFscGhhKGNvbnRyb2xsZXJDb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgLy8gQ29tcG9zaXRlIHdpdGggdGhlIGJhY2tncm91bmQgaW4gb3JkZXIgbm90IHRvIHNob3cgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB0aHVtYi4KLSAgICAgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAoaW50KSBiYWNrZ3JvdW5kVmlldy5nZXRUYWcoKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJDb2xvciA9IENvbG9yVXRpbHMuY29tcG9zaXRlQ29sb3JzKGNvbnRyb2xsZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgfQotICAgICAgICB2b2x1bWVTbGlkZXIuc2V0Q29sb3IoY29udHJvbGxlckNvbG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlnaHRUaGVtZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIC8vIFRPRE8oc3VuZ3Nvbyk6IFN3aXRjaCB0byBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuaXNMaWdodFRoZW1lCi0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0LlIuYXR0ci5pc0xpZ2h0VGhlbWUsCi0gICAgICAgICAgICAgICAgdmFsdWUsIHRydWUpICYmIHZhbHVlLmRhdGEgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VGhlbWVDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSwgaW50IGF0dHIpIHsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGludFtdIGF0dHJzID0geyBhdHRyIH07Ci0gICAgICAgICAgICBUeXBlZEFycmF5IHRhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKHN0eWxlLCBhdHRycyk7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSB0YS5nZXRDb2xvcigwLCAwKTsKLSAgICAgICAgICAgIHRhLnJlY3ljbGUoKTsKLSAgICAgICAgICAgIGlmIChjb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS5yZXNvdXJjZUlkICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc291cmNlcygpLmdldENvbG9yKHZhbHVlLnJlc291cmNlSWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZS5kYXRhOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0Um91dGVyVGhlbWVJZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IHRoZW1lSWQ7Ci0gICAgICAgIGlmIChpc0xpZ2h0VGhlbWUoY29udGV4dCkpIHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0X0RhcmtDb250cm9sUGFuZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0Q29udHJvbFBhbmVsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhlbWVJZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwZGVlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBMaXN0VmlldyB3aGljaCBoYXMgYW4gYWRkaXRpb25hbCBvdmVybGF5IGxheWVyLiB7QGxpbmsgQml0bWFwRHJhd2FibGV9Ci0gKiBjYW4gYmUgYWRkZWQgdG8gdGhlIGxheWVyIGFuZCBjYW4gYmUgYW5pbWF0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPdmVybGF5TGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE92ZXJsYXlPYmplY3Q+IG1PdmVybGF5T2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgcHVibGljIE92ZXJsYXlMaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIE92ZXJsYXlMaXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgfQotCi0gICAgcHVibGljIE92ZXJsYXlMaXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgQW4gb2JqZWN0IHRvIGJlIGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE92ZXJsYXlPYmplY3QoT3ZlcmxheU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgbU92ZXJsYXlPYmplY3RzLmFkZChvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uQWxsKCkgewotICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7Ci0gICAgICAgICAgICBpZiAoIW9iamVjdC5pc0FuaW1hdGlvblN0YXJ0ZWQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdC5zdGFydEFuaW1hdGlvbihnZXREcmF3aW5nVGltZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgb2JqZWN0LnN0b3BBbmltYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobU92ZXJsYXlPYmplY3RzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPE92ZXJsYXlPYmplY3Q+IGl0ID0gbU92ZXJsYXlPYmplY3RzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT3ZlcmxheU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwRHJhd2FibGUgYml0bWFwID0gb2JqZWN0LmdldEJpdG1hcERyYXdhYmxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJpdG1hcC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LnVwZGF0ZShnZXREcmF3aW5nVGltZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBvYmplY3QgdG8gYmUgc2hvd24gaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdmVybGF5T2JqZWN0IHsKLSAgICAgICAgcHJpdmF0ZSBCaXRtYXBEcmF3YWJsZSBtQml0bWFwOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1DdXJyZW50QWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIFJlY3QgbUN1cnJlbnRCb3VuZHM7Ci0gICAgICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb247Ci0gICAgICAgIHByaXZhdGUgUmVjdCBtU3RhcnRSZWN0OwotICAgICAgICBwcml2YXRlIGludCBtRGVsdGFZOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TdGFydEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRW5kQWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgcHJpdmF0ZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdChCaXRtYXBEcmF3YWJsZSBiaXRtYXAsIFJlY3Qgc3RhcnRSZWN0KSB7Ci0gICAgICAgICAgICBtQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbVN0YXJ0UmVjdCA9IHN0YXJ0UmVjdDsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzID0gbmV3IFJlY3Qoc3RhcnRSZWN0KTsKLSAgICAgICAgICAgIGlmIChtQml0bWFwICE9IG51bGwgJiYgbUN1cnJlbnRCb3VuZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0QWxwaGEoKGludCkgKG1DdXJyZW50QWxwaGEgKiAyNTUpKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEJvdW5kcyhtQ3VycmVudEJvdW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgYml0bWFwIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBCaXRtYXBEcmF3YWJsZSB0aGF0IHRoaXMgb2JqZWN0IGhhcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCaXRtYXBEcmF3YWJsZSBnZXRCaXRtYXBEcmF3YWJsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHN0YXJ0ZWQgc3RhdHVzIG9mIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGhhcyBzdGFydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FuaW1hdGlvblN0YXJ0ZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgdmFyeWluZyBhbHBoYS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0QWxwaGEgU3RhcnRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24sIHdoZXJlIDEuMCBtZWFucwotICAgICAgICAgKiBmdWxseSBvcGFxdWUgYW5kIDAuMCBtZWFucyBmdWxseSB0cmFuc3BhcmVudC4KLSAgICAgICAgICogQHBhcmFtIGVuZEFscGhhIEVuZGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QWxwaGFBbmltYXRpb24oZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKLSAgICAgICAgICAgIG1TdGFydEFscGhhID0gc3RhcnRBbHBoYTsKLSAgICAgICAgICAgIG1FbmRBbHBoYSA9IGVuZEFscGhhOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIG1vdmluZyBvYmplY3RzIHZlcnRpY2FsbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YVkgRGlzdGFuY2UgdG8gbW92ZSBpbiBwaXhlbHMuCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldFRyYW5zbGF0ZVlBbmltYXRpb24oaW50IGRlbHRhWSkgewotICAgICAgICAgICAgbURlbHRhWSA9IGRlbHRhWTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIGxhc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbikgewotICAgICAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUgZm9yIHRoaXMgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0b3Igd2hpY2ggZGVmaW5lcyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7Ci0gICAgICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQmluZHMgYW4gYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQuCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFuaW1hdGlvbkVuZExpc3RlbmVyKE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RhcnRzIHRoZSBhbmltYXRpb24gYW5kIHNldHMgdGhlIHN0YXJ0IHRpbWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydFRpbWUgU3RhcnQgdGltZSB0byBiZSBzZXQgaW4gTWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbihsb25nIHN0YXJ0VGltZSkgewotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uKCkgewotICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxjdWxhdGVzIGFuZCB1cGRhdGVzIGN1cnJlbnQgYm91bmRzIGFuZCBhbHBoYSB2YWx1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIEN1cnJlbnQgdGltZS5pbiBtaWxsaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZShsb25nIGN1cnJlbnRUaW1lKSB7Ci0gICAgICAgICAgICBpZiAobUlzQW5pbWF0aW9uRW5kZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkVGltZSA9IChjdXJyZW50VGltZSAtIG1TdGFydFRpbWUpIC8gKGZsb2F0KSBtRHVyYXRpb247Ci0gICAgICAgICAgICBub3JtYWxpemVkVGltZSA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIG5vcm1hbGl6ZWRUaW1lKSk7Ci0gICAgICAgICAgICBpZiAoIW1Jc0FuaW1hdGlvblN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBub3JtYWxpemVkVGltZSA9IDAuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lID0gKG1JbnRlcnBvbGF0b3IgPT0gbnVsbCkgPyBub3JtYWxpemVkVGltZQotICAgICAgICAgICAgICAgICAgICA6IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihub3JtYWxpemVkVGltZSk7Ci0gICAgICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG1EZWx0YVkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLnRvcCA9IG1TdGFydFJlY3QudG9wICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMuYm90dG9tID0gbVN0YXJ0UmVjdC5ib3R0b20gKyBkZWx0YVk7Ci0gICAgICAgICAgICBtQ3VycmVudEFscGhhID0gbVN0YXJ0QWxwaGEgKyAobUVuZEFscGhhIC0gbVN0YXJ0QWxwaGEpICogaW50ZXJwb2xhdGVkVGltZTsKLSAgICAgICAgICAgIGlmIChtQml0bWFwICE9IG51bGwgJiYgbUN1cnJlbnRCb3VuZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0QWxwaGEoKGludCkgKG1DdXJyZW50QWxwaGEgKiAyNTUpKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEJvdW5kcyhtQ3VycmVudEJvdW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUlzQW5pbWF0aW9uU3RhcnRlZCAmJiBub3JtYWxpemVkVGltZSA+PSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gIW1Jc0FuaW1hdGlvbkVuZGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFuaW1hdGlvbiBsaXN0ZW5lciB0aGF0IHJlY2VpdmVzIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBOb3RpZmllcyB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1MzliZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTcpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbk1yMSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNFbmFibGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB3YXMKLSAgICAgICAgICAgIC8vIGFkZGVkIGluIEFQSSAxNy4gSG93ZXZlciwgc29tZSBmYWN0b3J5IHJlbGVhc2VzIG9mIEpCIE1SMSBtaXNzZWQgaXQuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBleCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBnZXQgcHJlc2VudGF0aW9uIGRpc3BsYXkgZm9yIHRoZSByb3V0ZS4iLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIHZlcnNpb24gb2YgTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2soKSB0aGF0IGFjY2VwdHMgYQotICAgICAqIGZsYWcgdG8gcGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEgc28gd2UgbmVlZCB0byBmb3JjZQotICAgICAqIHdpZmkgZGlzcGxheSBzY2FucyBkaXJlY3RseSB0aHJvdWdoIHRoZSBEaXNwbGF5TWFuYWdlci4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBY3RpdmVTY2FuV29ya2Fyb3VuZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgLy8gVGltZSBiZXR3ZWVuIHdpZmkgZGlzcGxheSBzY2FucyB3aGVuIGFjdGl2ZWx5IHNjYW5uaW5nIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRklfRElTUExBWV9TQ0FOX0lOVEVSVkFMID0gMTUwMDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlciBtRGlzcGxheU1hbmFnZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbVNjYW5XaWZpRGlzcGxheXNNZXRob2Q7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzOwotCi0gICAgICAgIHB1YmxpYyBBY3RpdmVTY2FuV29ya2Fyb3VuZChDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCAhPSAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSAoRGlzcGxheU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRJU1BMQVlfU0VSVklDRSk7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kID0gRGlzcGxheU1hbmFnZXIuY2xhc3MuZ2V0TWV0aG9kKCJzY2FuV2lmaURpc3BsYXlzIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVNjYW5Sb3V0ZVR5cGVzKGludCByb3V0ZVR5cGVzKSB7Ci0gICAgICAgICAgICAvLyBPbiBKQiBNUjEsIHRoZXJlIGlzIG5vIEFQSSB0byBzY2FuIHdpZmkgZGlzcGxheSByb3V0ZXMuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkIHdlIG11c3QgbWFrZSBhIGRpcmVjdCBjYWxsIGludG8gdGhlIERpc3BsYXlNYW5hZ2VyIHRvIHNjYW4KLSAgICAgICAgICAgIC8vIHdpZmkgZGlzcGxheXMgb24gdGhpcyB2ZXJzaW9uIGJ1dCBvbmx5IHdoZW4gbGl2ZSB2aWRlbyByb3V0ZXMgYXJlIHJlcXVlc3RlZC4KLSAgICAgICAgICAgIC8vIFNlZSBhbHNvIHRoZSBKZWxseWJlYW5NcjJJbXBsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgLy8gVGhpcyB3YXMgZml4ZWQgaW4gSkIgTVIyIGJ5IGFkZGluZyBhIG5ldyBvdmVybG9hZCBvZiBhZGRDYWxsYmFjaygpIHRvCi0gICAgICAgICAgICAvLyBlbmFibGUgYWN0aXZlIHNjYW5uaW5nIG9uIHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8pICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2NhbldpZmlEaXNwbGF5c01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMgYmVjYXVzZSB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJEaXNwbGF5TWFuYWdlci5zY2FuV2lmaURpc3BsYXlzKCkgbWV0aG9kIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QuaW52b2tlKG1EaXNwbGF5TWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cy4iLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cy4iLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKHRoaXMsIFdJRklfRElTUExBWV9TQ0FOX0lOVEVSVkFMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgaXNDb25uZWN0aW5nKCkgbWV0aG9kIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN0YXR1c0NvZGVNZXRob2Q7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TdGF0dXNDb25uZWN0aW5nOwotCi0gICAgICAgIHB1YmxpYyBJc0Nvbm5lY3RpbmdXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCAhPSAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpZWxkIHN0YXR1c0Nvbm5lY3RpbmdGaWVsZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRGaWVsZCgiU1RBVFVTX0NPTk5FQ1RJTkciKTsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQ29ubmVjdGluZyA9IHN0YXR1c0Nvbm5lY3RpbmdGaWVsZC5nZXRJbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgbUdldFN0YXR1c0NvZGVNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0TWV0aG9kKCJnZXRTdGF0dXNDb2RlIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTdGF0dXNDb2RlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IChJbnRlZ2VyKW1HZXRTdGF0dXNDb2RlTWV0aG9kLmludm9rZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXNDb2RlID09IG1TdGF0dXNDb25uZWN0aW5nOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBc3N1bWUgbm90IGNvbm5lY3RpbmcuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrUHJveHk8VD4gewotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTAzNTQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTgpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMiB7Ci0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmdldERlZmF1bHRSb3V0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaiwgaW50IGZsYWdzKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmFkZENhbGxiYWNrKHR5cGVzLAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrKWNhbGxiYWNrT2JqLCBmbGFncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbihPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiNTliOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vLyBAQFJlcXVpcmVzQXBpKDE2KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW4iOwotCi0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQID0gMHg4MDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyA9IDB4MTAwOwotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSID0gMHgyMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX09VVF9CTFVFVE9PVEggPSAweDgwIHwgMHgxMDAgfCAweDIwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9BVURJTyA9IDB4MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfVklERU8gPSAweDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9VU0VSID0gMHgwMDgwMDAwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9ST1VURV9UWVBFUyA9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU8KLSAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfUk9VVEVSX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um91dGVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRSb3V0ZUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldENhdGVnb3JpZXMoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldENhdGVnb3J5Q291bnQoKTsKLSAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRDYXRlZ29yeUF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGVkUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmdldFNlbGVjdGVkUm91dGUodHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnNlbGVjdFJvdXRlKHR5cGVzLAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmFkZENhbGxiYWNrKHR5cGVzLAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrKWNhbGxiYWNrT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrKWNhbGxiYWNrT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVSb3V0ZUNhdGVnb3J5KE9iamVjdCByb3V0ZXJPYmosCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0dyb3VwYWJsZSkgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuY3JlYXRlUm91dGVDYXRlZ29yeShuYW1lLCBpc0dyb3VwYWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuY3JlYXRlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmFkZFVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWb2x1bWVDYWxsYmFja1Byb3h5PFZvbHVtZUNhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gY2hlY2tSb3V0ZWRUb0JsdWV0b290aChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEF1ZGlvTWFuYWdlciBhdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgIENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gYXVkaW9NYW5hZ2VyLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICJnZXREZXZpY2VzRm9yU3RyZWFtIiwgaW50LmNsYXNzKTsKLSAgICAgICAgICAgIGludCBkZXZpY2UgPSAoSW50ZWdlcikgbWV0aG9kLmludm9rZShhdWRpb01hbmFnZXIsIEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgcmV0dXJuIChkZXZpY2UgJiBERVZJQ0VfT1VUX0JMVUVUT09USCkgIT0gMDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0TmFtZShPYmplY3Qgcm91dGVPYmosIENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldE5hbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXRTdGF0dXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3RhdHVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdXBwb3J0ZWRUeXBlcyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q2F0ZWdvcnkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEljb25EcmF3YWJsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZvbHVtZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRUYWcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGFnKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHRhZykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuc2V0VGFnKHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0R3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0R3JvdXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlT2JqIGluc3RhbmNlb2YgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUdyb3VwIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0R3JvdXBlZFJvdXRlcyhPYmplY3QgZ3JvdXBPYmopIHsKLSAgICAgICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXApZ3JvdXBPYmo7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBncm91cC5nZXRSb3V0ZUNvdW50KCk7Ci0gICAgICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFkZChncm91cC5nZXRSb3V0ZUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZShPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBuYW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0dXMoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2Ugc3RhdHVzKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0U3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWNvbkRyYXdhYmxlKE9iamVjdCByb3V0ZU9iaiwgRHJhd2FibGUgaWNvbikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldEljb25EcmF3YWJsZShpY29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdHlwZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrVHlwZSh0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmosIGludCBzdHJlYW0pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1N0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lTWF4KSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lTWF4KHZvbHVtZU1heCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lSGFuZGxpbmcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVIYW5kbGluZyh2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soT2JqZWN0IHJvdXRlT2JqLCBPYmplY3Qgdm9sdW1lQ2FsbGJhY2tPYmopIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2spdm9sdW1lQ2FsbGJhY2tPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgcmNjT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UmVtb3RlQ29udHJvbENsaWVudCgKLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudClyY2NPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNhdGVnb3J5IHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0TmFtZShPYmplY3QgY2F0ZWdvcnlPYmosIENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgICAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um91dGVzKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgQXJyYXlMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRSb3V0ZXMob3V0KTsKLSAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdXBwb3J0ZWRUeXBlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dyb3VwYWJsZShPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuaXNHcm91cGFibGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5ncm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIGZvciBsaW1pdGF0aW9ucyBvZiBzZWxlY3RSb3V0ZSgpIG9uIEpCIGFuZCBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VsZWN0Um91dGVXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbVNlbGVjdFJvdXRlSW50TWV0aG9kOwotCi0gICAgICAgIHB1YmxpYyBTZWxlY3RSb3V0ZVdvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kID0gYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0Um91dGVJbnQiLCBpbnQuY2xhc3MsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGludCByb3V0ZVR5cGVzID0gcm91dGUuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgICAgIGlmICgocm91dGVUeXBlcyAmIFJPVVRFX1RZUEVfVVNFUikgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBub24tdXNlciByb3V0ZXMuCi0gICAgICAgICAgICAgICAgLy8gT24gSkIgYW5kIEpCIE1SMSwgdGhlIHNlbGVjdFJvdXRlKCkgQVBJIG9ubHkgc3VwcG9ydHMgcHJvZ3JhbW1hdGljYWxseQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZyB1c2VyIHJvdXRlcy4gIFNvIGluc3RlYWQgd2UgcmVseSBvbiB0aGUgaGlkZGVuIHNlbGVjdFJvdXRlSW50KCkKLSAgICAgICAgICAgICAgICAvLyBtZXRob2Qgb24gdGhlc2UgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgbGltaXRhdGlvbiB3YXMgcmVtb3ZlZCBpbiBKQiBNUjIuCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RSb3V0ZUludE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QuaW52b2tlKHJvdXRlciwgdHlwZXMsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc3VjY2VzcyEKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZWNhdXNlIHRoZSBwbGF0Zm9ybSBpcyBtaXNzaW5nIHRoZSBzZWxlY3RSb3V0ZUludCgpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtZXRob2QuICBNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERlZmF1bHQgaGFuZGxpbmcuCi0gICAgICAgICAgICByb3V0ZXIuc2VsZWN0Um91dGUodHlwZXMsIHJvdXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgZ2V0RGVmYXVsdFJvdXRlKCkgbWV0aG9kIGRvZXMgbm90IGV4aXN0IGluIEpCIGFuZCBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kOwotCi0gICAgICAgIHB1YmxpYyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKCJnZXRTeXN0ZW1BdWRpb1JvdXRlIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotCi0gICAgICAgICAgICBpZiAobUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZC5pbnZva2Uocm91dGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ291bGQgbm90IGZpbmQgdGhlIG1ldGhvZCBvciBpdCBkb2VzIG5vdCB3b3JrLgotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaXJzdCByb3V0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCi0gICAgICAgICAgICByZXR1cm4gcm91dGVyLmdldFJvdXRlQXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZCh0eXBlLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlR3JvdXBlZChyb3V0ZSwgZ3JvdXAsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5ncm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbmdyb3VwZWQocm91dGUsIGdyb3VwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVWb2x1bWVDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBWb2x1bWVDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBWb2x1bWVDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdChyb3V0ZSwgdm9sdW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChyb3V0ZSwgZGlyZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5ZTc3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBtZWRpYSBjb250cm9sIGludGVudHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgZGVjbGFyZXMgYSBzZXQgb2Ygc3RhbmRhcmQgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBhbmQgYWN0aW9ucyB0aGF0Ci0gKiBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpZGVudGlmeSB0aGUgY2FwYWJpbGl0aWVzIG9mIG1lZGlhIHJvdXRlcyBhbmQgY29udHJvbCB0aGVtLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBzcGVjaWZ5IG1lYW5zIGJ5IHdoaWNoIGFwcGxpY2F0aW9ucyBjYW4KLSAqIHNlbmQgbWVkaWEgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVkaWEgcm91dGUuICBDYXRlZ29yaWVzIGFyZSBzb21ldGltZXMgcmVmZXJyZWQKLSAqIHRvIGFzIGRlc2NyaWJpbmcgInR5cGVzIiBvciAia2luZHMiIG9mIHJvdXRlcy4KLSAqIDwvcD48cD4KLSAqIEZvciBleGFtcGxlLCBpZiBhIHJvdXRlIHN1cHBvcnRzIHRoZSB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2sgY2F0ZWdvcnl9LAotICogdGhlbiBhbiBhcHBsaWNhdGlvbiBjYW4gYXNrIGl0IHRvIHBsYXkgbWVkaWEgcmVtb3RlbHkgYnkgc2VuZGluZyBhCi0gKiB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gaW50ZW50IHdpdGggdGhlIFVyaSBvZiB0aGUKLSAqIG1lZGlhIGNvbnRlbnQgdG8gcGxheS4gIFN1Y2ggYSByb3V0ZSBtYXkgdGhlbiBiZSByZWZlcnJlZCB0byBhcwotICogYSAicmVtb3RlIHBsYXliYWNrIHJvdXRlIiBiZWNhdXNlIGl0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4gIEl0IGlzIGNvbW1vbgotICogZm9yIGEgcm91dGUgdG8gc3VwcG9ydCBtdWx0aXBsZSBjYXRlZ29yaWVzIG9mIHJlcXVlc3RzIGF0IHRoZSBzYW1lIHRpbWUsIHN1Y2ggYXMKLSAqIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgZm9sbG93aW5nIHN0YW5kYXJkIHJvdXRlIGNhdGVnb3JpZXMgYXJlIGRlZmluZWQuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIGF1ZGlvCi0gKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSBhdWRpbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBzcGVha2VycwotICogYW5kIEJsdWV0b290aCBoZWFkc2V0cy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfVklERU8gTGl2ZSB2aWRlb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSB2aWRlbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgdmlkZW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgZGlzcGxheXMKLSAqIGFuZCB3aXJlbGVzcyBkaXNwbGF5cyB0aGF0IHN1cHBvcnQgbWlycm9yaW5nIGFuZAotICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfS4gIExpdmUgdmlkZW8gcm91dGVzIHR5cGljYWxseSBhbHNvCi0gKiBzdXBwb3J0IGxpdmUgYXVkaW8gY2FwYWJpbGl0aWVzLgotICogPGxpPntAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja306IFRoZSByb3V0ZSBzdXBwb3J0cyBzZW5kaW5nCi0gKiByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgZm9yIG1lZGlhIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGNvbnRlbnQgdG8gYmUKLSAqIHBsYXllZCBpcyBpZGVudGlmaWVkIGJ5IGEgVXJpIGFuZCBtaW1lLXR5cGUuCi0gKiA8L3VsPjxwPgotICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBkZWZpbmUgY3VzdG9tIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgb2YgdGhlaXIgb3duIGluCi0gKiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgb25lcy4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSB2YXJpZXR5Ci0gKiBvZiBmZWF0dXJlcyB0byBhcHBsaWNhdGlvbnMgdGhhdCByZWNvZ25pemUgYW5kIGtub3cgaG93IHRvIHVzZSB0aGVtLiAgRm9yIGV4YW1wbGUsCi0gKiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1pZ2h0IGRlZmluZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBpbmRpY2F0ZSB0aGF0IGl0cyByb3V0ZXMKLSAqIHN1cHBvcnQgYSBzcGVjaWFsIGRldmljZS1zcGVjaWZpYyBjb250cm9sIGludGVyZmFjZSBpbiBhZGRpdGlvbiB0byBvdGhlcgotICogc3RhbmRhcmQgZmVhdHVyZXMuCi0gKiA8L3A+PHA+Ci0gKiBBcHBsaWNhdGlvbnMgY2FuIGRldGVybWluZSB3aGljaCBjYXRlZ29yaWVzIGEgcm91dGUgc3VwcG9ydHMgYnkgdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeX0KLSAqIG9yIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmdldENvbnRyb2xGaWx0ZXJzfQotICogbWV0aG9kcy4gIEFwcGxpY2F0aW9ucyBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB0eXBlcyBvZiByb3V0ZXMgdGhhdCB0aGV5IHdhbnQgdG8gdXNlIGJ5Ci0gKiBjcmVhdGluZyB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30gdGhhdCBjb250YWluIHRoZSBkZXNpcmVkCi0gKiBjYXRlZ29yaWVzIGFuZCBhcmUgdXNlZCB0byBmaWx0ZXIgcm91dGVzIGluIHNldmVyYWwgcGFydHMgb2YgdGhlIG1lZGlhIHJvdXRlciBBUEkuCi0gKiA8L3A+Ci0gKgotICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnM8L2gzPgotICogPHA+Ci0gKiBNZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIHNwZWNpZnkgcGFydGljdWxhciBmdW5jdGlvbnMgdGhhdCBhcHBsaWNhdGlvbnMKLSAqIGNhbiBhc2sgdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVkaWEgcm91dGUgdG8gcGVyZm9ybS4gIE1lZGlhIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMKLSAqIHRha2UgdGhlIGZvcm0gb2YgaW50ZW50cyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIG90aGVyIGludGVudHMgdXNlZCB0byBzdGFydCBhY3Rpdml0aWVzCi0gKiBvciBzZW5kIGJyb2FkY2FzdHMuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1lZGlhIGNvbnRyb2wgaW50ZW50cyBhcmUgZGlyZWN0ZWQgdG8KLSAqIHJvdXRlcyByYXRoZXIgdGhhbiBhY3Rpdml0eSBvciBicm9hZGNhc3QgcmVjZWl2ZXIgY29tcG9uZW50cy4KLSAqIDwvcD48cD4KLSAqIEVhY2ggbWVkaWEgcm91dGUgY29udHJvbCBpbnRlbnQgc3BlY2lmaWVzIGFuIGFjdGlvbiwgYSBjYXRlZ29yeSBhbmQgc29tZSBudW1iZXIgb2YgcGFyYW1ldGVycwotICogdGhhdCBhcmUgc3VwcGxpZWQgYXMgZXh0cmFzLiAgQXBwbGljYXRpb25zIHNlbmQgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byByb3V0ZXMgdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc2VuZENvbnRyb2xSZXF1ZXN0fQotICogbWV0aG9kIGFuZCByZWNlaXZlIHJlc3VsdHMgdmlhIGEgY2FsbGJhY2suCi0gKiA8L3A+PHA+Ci0gKiBBbGwgbWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzCi0gKiB0aGF0IHN1cHBvcnQgdGhlbS4gIFRodXMgb25seSByZW1vdGUgcGxheWJhY2sgcm91dGVzIG1heSBwZXJmb3JtIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgotICogVGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBhY3Rpb24gc3BlY2lmaWVzIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGUgYWN0aW9uIGJlbG9uZ3MsCi0gKiB0aGUgcGFyYW1ldGVycyBpdCByZXF1aXJlcywgYW5kIHRoZSByZXN1bHRzIGl0IHJldHVybnMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99IGFuZCB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30KLSAqIHJvdXRlcyBwcmVzZW50IG1lZGlhIHVzaW5nIHN0YW5kYXJkIHN5c3RlbSBpbnRlcmZhY2VzIHN1Y2ggYXMgYXVkaW8gc3RyZWFtcywKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30gb3IgZGlzcGxheSBtaXJyb3JpbmcuICBUaGVzZSByb3V0ZXMgYXJlCi0gKiB0aGUgZWFzaWVzdCB0byB1c2UgYmVjYXVzZSBhcHBsaWNhdGlvbnMgc2ltcGx5IHJlbmRlciBjb250ZW50IGxvY2FsbHkgb24gdGhlIGRldmljZQotICogYW5kIHRoZSBzeXN0ZW0gc3RyZWFtcyBpdCB0byB0aGUgcm91dGUgZGVzdGluYXRpb24gYXV0b21hdGljYWxseS4KLSAqIDwvcD48cD4KLSAqIEluIG1vc3QgY2FzZXMsIGFwcGxpY2F0aW9ucyBjYW4gc3RyZWFtIGNvbnRlbnQgdG8gbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXMgaW4KLSAqIHRoZSBzYW1lIHdheSB0aGV5IHdvdWxkIHBsYXkgdGhlIGNvbnRlbnQgbG9jYWxseSB3aXRob3V0IGFueSBtb2RpZmljYXRpb24uICBIb3dldmVyLAotICogYXBwbGljYXRpb25zIG1heSBhbHNvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbW9yZSBzb3BoaXN0aWNhdGVkIGZlYXR1cmVzIHN1Y2gKLSAqIGFzIHNlY29uZC1zY3JlZW4gcHJlc2VudGF0aW9uIEFQSXMgdGhhdCBhcmUgcGFydGljdWxhciB0byB0aGVzZSByb3V0ZXMuCi0gKiA8L3A+Ci0gKgotICogPGgzPlJlbW90ZSBwbGF5YmFjayByb3V0ZXM8L2gzPgotICogPHA+Ci0gKiB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9IHJvdXRlcyBwcmVzZW50IG1lZGlhIHJlbW90ZWx5Ci0gKiBieSBwbGF5aW5nIGNvbnRlbnQgZnJvbSBhIFVyaS4KLSAqIFRoZXNlIHJvdXRlcyBkZXN0aW5hdGlvbnMgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgZmV0Y2hpbmcgYW5kIHJlbmRlcmluZyBjb250ZW50Ci0gKiBvbiB0aGVpciBvd24uICBBcHBsaWNhdGlvbnMgZG8gbm90IHJlbmRlciB0aGUgY29udGVudCB0aGVtc2VsdmVzOyBpbnN0ZWFkLCBhcHBsaWNhdGlvbnMKLSAqIHNlbmQgY29udHJvbCByZXF1ZXN0cyB0byBpbml0aWF0ZSBwbGF5LCBwYXVzZSwgcmVzdW1lLCBvciBzdG9wIG1lZGlhIGl0ZW1zIGFuZCByZWNlaXZlCi0gKiBzdGF0dXMgdXBkYXRlcyBhcyB0aGV5IGNoYW5nZSBzdGF0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+U2Vzc2lvbnM8L2g0PgotICogPHA+Ci0gKiBFYWNoIHJlbW90ZSBtZWRpYSBwbGF5YmFjayBhY3Rpb24gaXMgY29uZHVjdGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzZXNzaW9uLgotICogU2Vzc2lvbnMgYXJlIHVzZWQgdG8gcHJldmVudCBhcHBsaWNhdGlvbnMgZnJvbSBhY2NpZGVudGFsbHkgaW50ZXJmZXJpbmcgd2l0aCBvbmUKLSAqIGFub3RoZXIgYmVjYXVzZSBhdCBtb3N0IG9uZSBzZXNzaW9uIGNhbiBiZSB2YWxpZCBhdCBhIHRpbWUuCi0gKiA8L3A+PHA+Ci0gKiBBIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbiBhY3Rpb259Ci0gKiBhbmQgdGVybWluYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb24gYWN0aW9ufSB3aGVuIHRoZQotICogcm91dGUgcHJvdmlkZXMgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICogPC9wPjxwPgotICogRXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IHdhcyBhZGRlZCBpbiBhIGxhdGVyIHJldmlzaW9uIG9mIHRoZSBwcm90b2NvbCBzbyBub3QKLSAqIGFsbCByb3V0ZXMgc3VwcG9ydCBpdC4gIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAotICogdGhlbiBpbXBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgbWF5IHN0aWxsIGJlIHVzZWQuICBJbXBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHJlbGllcyBvbiB0aGUgdXNlIG9mIHRoZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGFuZCB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9Ci0gKiBhY3Rpb25zIHdoaWNoIGhhdmUgdGhlIHNpZGUtZWZmZWN0IG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gaWYgbm9uZSBpcyBwcm92aWRlZAotICogYXMgYXJndW1lbnQuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbmV3IHNlc3Npb24gaXMgY3JlYXRlZCwgdGhlIHByZXZpb3VzIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgYW5kIGFueSBvbmdvaW5nCi0gKiBtZWRpYSBwbGF5YmFjayBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgcmVxdWVzdGVkIGFjdGlvbiBpcyBwZXJmb3JtZWQuICBBbnkgYXR0ZW1wdAotICogdG8gdXNlIGFuIGludmFsaWRhdGVkIHNlc3Npb24gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICAoUHJvdG9jb2wgaW1wbGVtZW50YXRpb25zCi0gKiBhcmUgZW5jb3VyYWdlZCB0byBhZ2dyZXNzaXZlbHkgZGlzY2FyZCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW52YWxpZGF0ZWQgc2Vzc2lvbnMKLSAqIHNpbmNlIGl0IGlzIG5vIGxvbmdlciBvZiB1c2UuKQotICogPC9wPjxwPgotICogRWFjaCBzZXNzaW9uIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgc2Vzc2lvbiBpZCB0aGF0IG1heSBiZSB1c2VkIHRvIGNvbnRyb2wKLSAqIHRoZSBzZXNzaW9uIHVzaW5nIGFjdGlvbnMgc3VjaCBhcyBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBlbmQgc2Vzc2lvbi4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+TWVkaWEgaXRlbXM8L2g0PgotICogPHA+Ci0gKiBFYWNoIHN1Y2Nlc3NmdWwge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbgotICogcmV0dXJucyBhIHVuaXF1ZSBtZWRpYSBpdGVtIGlkIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0byBtb25pdG9yIGFuZCBjb250cm9sCi0gKiBwbGF5YmFjay4gIFRoZSBtZWRpYSBpdGVtIGlkIG1heSBiZSBwYXNzZWQgdG8gb3RoZXIgYWN0aW9ucyBzdWNoIGFzCi0gKiB7QGxpbmsgI0FDVElPTl9TRUVLIHNlZWt9IG9yIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1c30uICBJdCB3aWxsIGFsc28gYXBwZWFyCi0gKiBhcyBhIHBhcmFtZXRlciBpbiBzdGF0dXMgdXBkYXRlIGJyb2FkY2FzdHMgdG8gaWRlbnRpZnkgdGhlIGFzc29jaWF0ZWQgcGxheWJhY2sgcmVxdWVzdC4KLSAqIDwvcD48cD4KLSAqIEVhY2ggbWVkaWEgaXRlbSBpcyBzY29wZWQgdG8gdGhlIHNlc3Npb24gaW4gd2hpY2ggaXQgd2FzIGNyZWF0ZWQuICBUaGVyZWZvcmUgbWVkaWEgaXRlbQotICogaWRzIGFyZSBvbmx5IGV2ZXIgdXNlZCB0b2dldGhlciB3aXRoIHNlc3Npb24gaWRzLiAgTWVkaWEgaXRlbSBpZHMgYXJlIG1lYW5pbmdsZXNzCi0gKiBvbiB0aGVpciBvd24uICBXaGVuIHRoZSBzZXNzaW9uIGlzIGludmFsaWRhdGVkLCBhbGwgb2YgaXRzIG1lZGlhIGl0ZW1zIGFyZSBhbHNvCi0gKiBpbnZhbGlkYXRlZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+VGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KLSAqIDxwPgotICogRWFjaCBzZXNzaW9uIGhhcyBpdHMgb3duIHBsYXliYWNrIHF1ZXVlIHRoYXQgY29uc2lzdHMgb2YgdGhlIG1lZGlhIGl0ZW1zIHRoYXQKLSAqIGFyZSBwZW5kaW5nLCBwbGF5aW5nLCBidWZmZXJpbmcgb3IgcGF1c2VkLiAgSXRlbXMgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aGVuCi0gKiBhIHBsYXliYWNrIHJlcXVlc3QgaXMgaXNzdWVkLiAgSXRlbXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgd2hlbiB0aGV5IGFyZSBubwotICogbG9uZ2VyIGVsaWdpYmxlIGZvciBwbGF5YmFjayAoZW50ZXIgdGVybWluYWwgc3RhdGVzKS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBpbiB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gY2xhc3MsIG1lZGlhIGl0ZW1zIGluaXRpYWxseQotICogc3RhcnQgaW4gYSBwZW5kaW5nIHN0YXRlLCB0cmFuc2l0aW9uIHRvIHRoZSBwbGF5aW5nIChvciBidWZmZXJpbmcgb3IgcGF1c2VkKSBzdGF0ZQotICogZHVyaW5nIHBsYXliYWNrLCBhbmQgZW5kIGluIGEgZmluaXNoZWQsIGNhbmNlbGVkLCBpbnZhbGlkYXRlZCBvciBlcnJvciBzdGF0ZS4KLSAqIE9uY2UgdGhlIGN1cnJlbnQgaXRlbSBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSwgcGxheWJhY2sgcHJvY2VlZHMgb24gdG8gdGhlCi0gKiBuZXh0IGl0ZW0uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRldGVybWluZSB3aGV0aGVyIHRoZSByb3V0ZSBzdXBwb3J0cyBxdWV1aW5nIGJ5IGNoZWNraW5nCi0gKiB3aGV0aGVyIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIHJvdXRlJ3MgY29udHJvbCBmaWx0ZXIKLSAqIHVzaW5nIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sUmVxdWVzdCBSb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sUmVxdWVzdH0uCi0gKiA8L3A+PHA+Ci0gKiBJZiB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHJvdXRlIHByb21pc2VzCi0gKiB0byBhbGxvdyBhdCBsZWFzdCB0d28gaXRlbXMgKHBvc3NpYmx5IG1vcmUpIHRvIGJlIGVucXVldWVkIGF0IGEgdGltZS4gIEVucXVldWVkIGl0ZW1zIHBsYXkKLSAqIGJhY2sgdG8gYmFjayBvbmUgYWZ0ZXIgdGhlIG90aGVyIGFzIHRoZSBwcmV2aW91cyBpdGVtIGNvbXBsZXRlcy4gIElkZWFsbHkgdGhlcmUgc2hvdWxkCi0gKiBiZSBubyBhdWRpYmxlIHBhdXNlIGJldHdlZW4gaXRlbXMgZm9yIHN0YW5kYXJkIGF1ZGlvIGNvbnRlbnQgdHlwZXMuCi0gKiA8L3A+PHA+Ci0gKiBJZiB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSBxdWV1ZQotICogZWZmZWN0aXZlbHkgY29udGFpbnMgYXQgbW9zdCBvbmUgaXRlbSBhdCBhIHRpbWUuICBFYWNoIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mCi0gKiBjbGVhcmluZyB0aGUgcXVldWUgYW5kIHJlc2V0dGluZyBpdHMgc3RhdGUgYmVmb3JlIHRoZSBuZXh0IGl0ZW0gaXMgcGxheWVkLgotICogPC9wPgotICoKLSAqIDxoND5JbXBhY3Qgb2YgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgcGxheSBhY3Rpb25zIG9uIHRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBwYXVzZSwgcmVzdW1lIGFuZCBzdG9wIGFjdGlvbnMgYWZmZWN0IHRoZSBzZXNzaW9uJ3Mgd2hvbGUgcXVldWUuICBQYXVzZSBjYXVzZXMKLSAqIHRoZSBwbGF5YmFjayBxdWV1ZSB0byBiZSBzdXNwZW5kZWQgbm8gbWF0dGVyIHdoaWNoIGl0ZW0gaXMgY3VycmVudGx5IHBsYXlpbmcuCi0gKiBSZXN1bWUgcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgcGF1c2UuICBTdG9wIGNsZWFycyB0aGUgcXVldWUgYW5kIGFsc28gcmVzZXRzCi0gKiB0aGUgcGF1c2UgZmxhZyBqdXN0IGxpa2UgcmVzdW1lLgotICogPC9wPjxwPgotICogQXMgZGVzY3JpYmVkIGVhcmxpZXIsIHRoZSBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiBjbGVhcmluZyB0aGUgcXVldWUKLSAqIGFuZCBjb21wbGV0ZWx5IHJlc2V0dGluZyBpdHMgc3RhdGUgKGxpa2UgdGhlIHN0b3AgYWN0aW9uKSB0aGVuIGVucXVldWluZyBhCi0gKiBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuICBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50Ci0gKiB0byBzdG9wIGZvbGxvd2VkIGJ5IGFuIGFjdGlvbiB0byBlbnF1ZXVlIGFuIGl0ZW0uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcGxheSBhY3Rpb24gaXMgYWxzbyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucy4KLSAqIEFuIGFwcGxpY2F0aW9uIHdpdGggc2ltcGxlIG5lZWRzIG1heSBmaW5kIHRoYXQgaXQgb25seSBuZWVkcyB0byB1c2UgcGxheQotICogKGFuZCBvY2Nhc2lvbmFsbHkgc3RvcCkgdG8gY29udHJvbCBwbGF5YmFjay4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+UmVzb2x2aW5nIGNvbmZsaWN0cyBiZXR3ZWVuIGFwcGxpY2F0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFdoZW4gYW4gYXBwbGljYXRpb24gaGFzIGEgdmFsaWQgc2Vzc2lvbiwgaXQgaXMgZXNzZW50aWFsbHkgaW4gY29udHJvbCBvZiByZW1vdGUgcGxheWJhY2sKLSAqIG9uIHRoZSByb3V0ZS4gIE5vIG90aGVyIGFwcGxpY2F0aW9uIGNhbiB2aWV3IG9yIG1vZGlmeSB0aGUgcmVtb3RlIHBsYXliYWNrIHN0YXRlCi0gKiBvZiB0aGF0IGFwcGxpY2F0aW9uJ3Mgc2Vzc2lvbiB3aXRob3V0IGtub3dpbmcgaXRzIGlkLgotICogPC9wPjxwPgotICogSG93ZXZlciwgb3RoZXIgYXBwbGljYXRpb25zIGNhbiBwZXJmb3JtIGFjdGlvbnMgdGhhdCBoYXZlIHRoZSBlZmZlY3Qgb2Ygc3RvcHBpbmcKLSAqIHBsYXliYWNrIGFuZCBpbnZhbGlkYXRpbmcgdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIFdoZW4gdGhpcyBvY2N1cnMsIHRoZSBmb3JtZXIgYXBwbGljYXRpb24KLSAqIHdpbGwgYmUgaW5mb3JtZWQgdGhhdCBpdCBoYXMgbG9zdCBjb250cm9sIGJ5IHdheSBvZiBpbmRpdmlkdWFsIG1lZGlhIGl0ZW0gc3RhdHVzCi0gKiB1cGRhdGUgYnJvYWRjYXN0cyB0aGF0IGluZGljYXRlIHRoYXQgaXRzIHF1ZXVlZCBtZWRpYSBpdGVtcyBoYXZlIGJlY29tZQotICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0uICBUaGlzIGJyb2FkY2FzdAotICogaW1wbGllcyB0aGF0IHBsYXliYWNrIHdhcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgYnkgYW4gZXh0ZXJuYWwgY2F1c2UuCi0gKiA8L3A+PHA+Ci0gKiBBcHBsaWNhdGlvbnMgc2hvdWxkIGhhbmRsZSBjb25mbGljdHMgY29uc2VydmF0aXZlbHkgdG8gYWxsb3cgb3RoZXIgYXBwbGljYXRpb25zIHRvCi0gKiBzbW9vdGhseSBhc3N1bWUgY29udHJvbCBvdmVyIHRoZSByb3V0ZS4gIFdoZW4gYSBjb25mbGljdCBvY2N1cnMsIHRoZSBjdXJyZW50bHkgcGxheWluZwotICogYXBwbGljYXRpb24gc2hvdWxkIHJlbGVhc2UgaXRzIHNlc3Npb24gYW5kIGFsbG93IHRoZSBuZXcgYXBwbGljYXRpb24gdG8gdXNlIHRoZQotICogcm91dGUgdW50aWwgc3VjaCB0aW1lIGFzIHRoZSB1c2VyIGludGVydmVuZXMgdG8gdGFrZSBvdmVyIHRoZSByb3V0ZSBhZ2FpbiBhbmQgYmVnaW4KLSAqIGEgbmV3IHBsYXliYWNrIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0PkJhc2ljIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGJhc2ljIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSBhbGwgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMuICBUaGVzZSBhY3Rpb25zIGZvcm0gdGhlIGJhc2lzIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGFuZCBhcmUgcmVxdWlyZWQgaW4gYWxsIGltcGxlbWVudGF0aW9ucy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUExBWSBQbGF5fTogU3RhcnRzIHBsYXlpbmcgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1NFRUsgU2Vla306IFNldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gb2YgYSBzcGVjaWZpYyBtZWRpYSBpdGVtLgotICogPGxpPntAbGluayAjQUNUSU9OX0dFVF9TVEFUVVMgR2V0IHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0KLSAqIGluY2x1ZGluZyB0aGUgaXRlbSdzIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gYW5kIHByb2dyZXNzLgotICogPGxpPntAbGluayAjQUNUSU9OX1BBVVNFIFBhdXNlfTogUGF1c2VzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9SRVNVTUUgUmVzdW1lfTogUmVzdW1lcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RPUCBTdG9wfTogU3RvcHMgcGxheWJhY2ssIGNsZWFycyB0aGUgcXVldWUsIGFuZCByZXNldHMgdGhlCi0gKiBwYXVzZSBzdGF0ZS4KLSAqIDwvdWw+Ci0gKgotICogPGg0PlF1ZXVlIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHF1ZXVlIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHF1ZXVpbmcgY2FwYWJpbGl0aWVzLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTlFVRVVFIEVucXVldWV9OiBFbnF1ZXVlcyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQotICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldwotICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVNT1ZFIFJlbW92ZX06IFJlbW92ZXMgYSBzcGVjaWZpZWQgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAqIDwvdWw+Ci0gKgotICogPGg0PlNlc3Npb24gYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgc2Vzc2lvbiBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBzZXNzaW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIFN0YXJ0IHNlc3Npb259OiBTdGFydHMgYSBuZXcgc2Vzc2lvbiBleHBsaWNpdGx5LgotICogPGxpPntAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBHZXQgc2Vzc2lvbiBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBzZXNzaW9uLgotICogPGxpPntAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIEVuZCBzZXNzaW9ufTogRW5kcyBhIHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDwvdWw+Ci0gKgotICogPGg0PkltcGxlbWVudGF0aW9uIG5vdGU8L2g0PgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBtdXN0IGltcGxlbWVudCA8ZW0+YWxsPC9lbT4gb2YgdGhlCi0gKiBkb2N1bWVudGVkIGFjdGlvbnMsIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMuICBOb3RlIHRoYXQgdGhlIGRvY3VtZW50YXRpb24gaXMgd3JpdHRlbiBmcm9tCi0gKiB0aGUgcGVyc3BlY3RpdmUgb2YgYSBjbGllbnQgb2YgdGhlIHByb3RvY29sLiAgSW4gcGFydGljdWxhciwgd2hlbmV2ZXIgYSBwYXJhbWV0ZXIKLSAqIGlzIGRlc2NyaWJlZCBhcyBiZWluZyAib3B0aW9uYWwiLCBpdCBpcyBvbmx5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBjbGllbnQuCi0gKiBDb21wbGlhbnQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcHJvdG9jb2wgbXVzdCBzdXBwb3J0IGFsbAotICogb2YgdGhlIGZlYXR1cmVzIGRlc2NyaWJlZCBoZXJlaW4uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUNvbnRyb2xJbnRlbnQgewotICAgIC8qIFJvdXRlIGNhdGVnb3JpZXMuICovCi0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBMaXZlIGF1ZGlvLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHJvdXRpbmcgd2lsbCBhbGxvdyB0aGUgbWVkaWEgYXVkaW8gc3RyZWFtCi0gICAgICogdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLiAgVGhpcyBjYW4gaW5jbHVkZSBpbnRlcm5hbCBzcGVha2VycyBvcgotICAgICAqIGF1ZGlvIGphY2tzIG9uIHRoZSBkZXZpY2UgaXRzZWxmLCBBMkRQIGRldmljZXMsIGFuZCBtb3JlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGEgbGl2ZSBhdWRpbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gcm91dGluZyBpcyB0cmFuc3BhcmVudCB0byB0aGUgYXBwbGljYXRpb24uCi0gICAgICogQWxsIGF1ZGlvIHBsYXllZCBvbiB0aGUgbWVkaWEgc3RyZWFtIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSBhdWRpbyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfQVVESU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9BVURJTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBMaXZlIHZpZGVvLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyBsaXZlIHZpZGVvIHJvdXRpbmcgd2lsbCBhbGxvdyBhIG1pcnJvcmVkIHZlcnNpb24KLSAgICAgKiBvZiB0aGUgZGV2aWNlJ3MgcHJpbWFyeSBkaXNwbGF5IG9yIGEgY3VzdG9taXplZAotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byBiZSBzZW50IHRvIHN1cHBvcnRlZAotICAgICAqIGRlc3RpbmF0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgdmlkZW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIGFuZCB2aWRlbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50Ci0gICAgICogdG8gdGhlIGFwcGxpY2F0aW9uLiAgQnkgZGVmYXVsdCwgYXVkaW8gYW5kIHZpZGVvIGlzIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbi4gIEZvciBjZXJ0YWluIGxpdmUgdmlkZW8gcm91dGVzLCB0aGUgYXBwbGljYXRpb24gbWF5IGFsc28gdXNlIGEKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gcmVwbGFjZSB0aGUgbWlycm9yZWQgdmlldwotICAgICAqIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5IHdpdGggZGlmZmVyZW50IGNvbnRlbnQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgdmlkZW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldFByZXNlbnRhdGlvbkRpc3BsYXkoKQotICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9WSURFTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX1ZJREVPIjsKLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IFJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJvdXRpbmcgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBzZW5kCi0gICAgICogcmVxdWVzdHMgdG8gcGxheSBjb250ZW50IHJlbW90ZWx5IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlbW90ZSBwbGF5YmFjayByb3V0ZXMgZGVzdGluYXRpb25zIG9wZXJhdGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgbG9jYWwgZGV2aWNlLgotICAgICAqIFdoZW4gYSByZW1vdGUgcGxheWJhY2sgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gY29udHJvbCB0aGUgY29udGVudAotICAgICAqIHBsYXlpbmcgb24gdGhlIGRlc3RpbmF0aW9uIGJ5IHNlbmRpbmcgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRvIHRoZSByb3V0ZS4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBmcm9tIHRoZSByb3V0ZSByZWdhcmRpbmcKLSAgICAgKiByZW1vdGUgcGxheWJhY2suCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5SRU1PVEVfUExBWUJBQ0siOwotCi0gICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgaW5kaXZpZHVhbCBpdGVtcy4gKi8KLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUGxheSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RhcnQgcGxheWluZyBjb250ZW50IHdpdGgKLSAgICAgKiB0aGUge0BsaW5rIFVyaX0gc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgSW50ZW50fSdzIHtAbGluayBJbnRlbnQjZ2V0RGF0YSgpIGRhdGEgdXJpfS4KLSAgICAgKiBUaGUgYWN0aW9uIHJldHVybnMgYSBtZWRpYSBzZXNzaW9uIGlkIGFuZCBtZWRpYSBpdGVtIGlkIHdoaWNoIGNhbiBiZSB1c2VkCi0gICAgICogdG8gY29udHJvbCBwbGF5YmFjayB1c2luZyBvdGhlciByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogT25jZSBpbml0aWF0ZWQsIHBsYXliYWNrIG9mIHRoZSBzcGVjaWZpZWQgY29udGVudCB3aWxsIGJlIG1hbmFnZWQgaW5kZXBlbmRlbnRseQotICAgICAqIGJ5IHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYXMgdGhlIHN0YXRlCi0gICAgICogb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGRhdGEgdXJpIHNwZWNpZmllcyBhbiBIVFRQIG9yIEhUVFBTIHNjaGVtZSwgdGhlbiB0aGUgZGVzdGluYXRpb24gaXMKLSAgICAgKiByZXNwb25zaWJsZSBmb3IgZm9sbG93aW5nIEhUVFAgcmVkaXJlY3RzIHRvIGEgcmVhc29uYWJsZSBkZXB0aCBvZiBhdCBsZWFzdCAzCi0gICAgICogbGV2ZWxzIGFzIG1pZ2h0IHR5cGljYWxseSBiZSBoYW5kbGVkIGJ5IGEgd2ViIGJyb3dzZXIuICBJZiBhbiBIVFRQIGVycm9yCi0gICAgICogb2NjdXJzLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBzaG91bGQgc2VuZCBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzIHVwZGF0ZX0KLSAgICAgKiBiYWNrIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9FUlJPUiBlcnJvcn0KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2dldFBsYXliYWNrU3RhdGUoKSBwbGF5YmFjayBzdGF0ZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPk9uZSBpdGVtIGF0IGEgdGltZTwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogRWFjaCBzdWNjZXNzZnVsIHBsYXkgYWN0aW9uIDxlbT5yZXBsYWNlczwvZW0+IHRoZSBwcmV2aW91cyBwbGF5IGFjdGlvbi4KLSAgICAgKiBJZiBhbiBpdGVtIGlzIGFscmVhZHkgcGxheWluZywgdGhlbiBpdCBpcyBjYW5jZWxlZCwgdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZQotICAgICAqIGlzIGNsZWFyZWQgYW5kIHRoZSBuZXcgaXRlbSBiZWdpbnMgcGxheWluZyBpbW1lZGlhdGVseSAocmVnYXJkbGVzcyBvZgotICAgICAqIHdoZXRoZXIgdGhlIHByZXZpb3VzbHkgcGxheWluZyBpdGVtIGhhZCBiZWVuIHBhdXNlZCkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQgdG8ge0BsaW5rICNBQ1RJT05fU1RPUCBzdG9wfSBmb2xsb3dlZCBieSBhbiBhY3Rpb24KLSAgICAgKiB0byBlbnF1ZXVlIGEgbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5TZXNzaW9uczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXF1ZXN0IGhhcyB0aGUgZWZmZWN0IG9mIGltcGxpY2l0bHkgY3JlYXRpbmcgYSBtZWRpYSBzZXNzaW9uIHdoZW5ldmVyIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgdGhlIHtAbGluayAjRVhUUkFfU0VTU0lPTl9JRCBzZXNzaW9uIGlkfSBwYXJhbWV0ZXIuCi0gICAgICogQmVjYXVzZSB0aGVyZSBjYW4gb25seSBiZSBhdCBtb3N0IG9uZSB2YWxpZCBzZXNzaW9uIGF0IGEgdGltZSwgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbgotICAgICAqIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgaW52YWxpZGF0aW5nIGFueSBleGlzdGluZyBzZXNzaW9ucyBhbmQgdGhlaXIgbWVkaWEgaXRlbXMsCi0gICAgICogdGhlbiBoYW5kbGluZyB0aGUgcGxheWJhY2sgcmVxdWVzdCB3aXRoIGEgbmV3IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZXMgYW4gaW52YWxpZCBzZXNzaW9uIGlkLCB0aGVuIGFuIGVycm9yIGlzIHJldHVybmVkLgotICAgICAqIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGFzc3VtZSB0aGF0IGl0cyBzZXNzaW9uCi0gICAgICogaXMgbm8gbG9uZ2VyIHZhbGlkLiAgVG8gb2J0YWluIGEgbmV3IHNlc3Npb24sIHRoZSBhcHBsaWNhdGlvbiBtYXkgdHJ5IGFnYWluCi0gICAgICogYW5kIG9taXQgdGhlIHNlc3Npb24gaWQgcGFyYW1ldGVyLiAgSG93ZXZlciwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAotICAgICAqIG9ubHkgcmV0cnkgcmVxdWVzdHMgZHVlIHRvIGFuIGV4cGxpY2l0IGFjdGlvbiBwZXJmb3JtZWQgYnkgdGhlIHVzZXIsCi0gICAgICogc3VjaCBhcyB0aGUgdXNlciBjbGlja2luZyBvbiBhICJwbGF5IiBidXR0b24gaW4gdGhlIFVJLCBzaW5jZSBhbm90aGVyCi0gICAgICogYXBwbGljYXRpb24gbWF5IGJlIHRyeWluZyB0byB0YWtlIGNvbnRyb2wgb2YgdGhlIHJvdXRlIGFuZCB0aGUgZm9ybWVyCi0gICAgICogYXBwbGljYXRpb24gc2hvdWxkIHRyeSB0byBzdGF5IG91dCBvZiBpdHMgd2F5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXNzaW9ucywgcXVldWVzIGFuZCBtZWRpYSBpdGVtcywgcGxlYXNlIHJlZmVyIHRvIHRoZQotICAgICAqIGNsYXNzIGRvY3VtZW50YXRpb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRvIHdoaWNoIHRoZSBwbGF5YmFjayByZXF1ZXN0IGJlbG9uZ3MuICBJZiBvbWl0dGVkLCBhIG5ldyBzZXNzaW9uCi0gICAgICogaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsCi0gICAgICogY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KLSAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fTUVUQURBVEF9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBtZXRhZGF0YSBhc3NvY2lhdGVkCi0gICAgICogd2l0aCB0aGUgY29udGVudCBzdWNoIGFzIHRoZSB0aXRsZSBvZiBhIHNvbmcuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQotICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMKLSAgICAgKiBhYm91dCB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIGFmZmVjdGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGJlIGEgbmV3IHNlc3Npb24gaW4KLSAgICAgKiB0aGUgY2FzZSB3aGVyZSBubyBzZXNzaW9uIGlkIHdhcyBzdXBwbGllZCBhcyBhIHBhcmFtZXRlci4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIGFuIG9wYXF1ZSBzdHJpbmcgaWRlbnRpZmllcgotICAgICAqIHRvIHVzZSB0byByZWZlciB0byB0aGUgbWVkaWEgaXRlbSBpbiBzdWJzZXF1ZW50IHJlcXVlc3RzIHN1Y2ggYXMKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbmV3IG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5TdGF0dXMgdXBkYXRlczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhbgotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBzdGF0dXMgdXBkYXRlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHNpZ25pZmljYW50IG1lZGlhIGl0ZW0gc3RhdGUgY2hhbmdlcyBvY2N1ciBzdWNoIGFzIHdoZW4gcGxheWJhY2sgc3RhcnRzIG9yCi0gICAgICogc3RvcHMuICBUaGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBjaGFuZ2VzLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmV0cmlldmUgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gd2hlbiBuZWNlc3NhcnkKLSAgICAgKiB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30gcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiBhIHNlc3Npb24gaWQgd2FzIHByb3ZpZGVkIGJ1dCBpcyB1bmtub3duIG9yCi0gICAgICogbm8gbG9uZ2VyIHZhbGlkLCBpZiB0aGUgaXRlbSBVcmkgb3IgY29udGVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmCi0gICAgICogYW55IG90aGVyIGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgKiBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgKiBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoImh0dHA6Ly9leGFtcGxlLmNvbS92aWRlb3MvbW92aWUubXA0IiwgInZpZGVvL21wNCIpOwotICAgICAqIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdCBzdWNjZWVkZWQuCi0gICAgICogICAgICAgICAgICAgLy8gUGxheWJhY2sgbWF5IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJldHVybmVkIHNlc3Npb24gYW5kIGl0ZW0gaWQuCi0gICAgICogICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOwotICAgICAqICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZShkYXRhLmdldEJ1bmRsZSgKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAqICAgICAgICAgICAgIC8vIC4uLgotICAgICAqICAgICAgICAgfQotICAgICAqCi0gICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBtZXNzYWdlLCBCdW5kbGUgZGF0YSkgewotICAgICAqICAgICAgICAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9OwotICAgICAqICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICogfTwvcHJlPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QTEFZID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5QTEFZIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5xdWV1ZSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiB3b3JrcyBqdXN0IGxpa2Uge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBleGNlcHQgdGhhdCBpdCBkb2VzCi0gICAgICogbm90IGNsZWFyIHRoZSBxdWV1ZSBvciByZXNldCB0aGUgcGF1c2Ugc3RhdGUgd2hlbiBpdCBlbnF1ZXVlcyB0aGUKLSAgICAgKiBuZXcgbWVkaWEgaXRlbSBpbnRvIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBUaGlzIGFjdGlvbiBvbmx5Ci0gICAgICogZW5xdWV1ZXMgYSBtZWRpYSBpdGVtIHdpdGggbm8gb3RoZXIgc2lkZS1lZmZlY3RzIG9uIHRoZSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSBhbmQgdGhlbiB0aGUgaXRlbSB3aWxsIHBsYXkgaW1tZWRpYXRlbHkKLSAgICAgKiAoYXNzdW1pbmcgdGhlIHF1ZXVlIGlzIG5vdCBwYXVzZWQpLiAgT3RoZXJ3aXNlLCB0aGUgaXRlbSB3aWxsIHBsYXkKLSAgICAgKiBhZnRlciBhbGwgZWFybGllciBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBmaW5pc2hlZCBvciBiZWVuIHJlbW92ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBlbnF1ZXVlIGFjdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zIGp1c3QgbGlrZSBwbGF5LgotICAgICAqIEl0cyBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzIGFyZSBhbHNvIHRoZSBzYW1lLiAgT25seSB0aGUgcXVldWluZyBiZWhhdmlvcgotICAgICAqIGlzIGRpZmZlcmVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTlFVRVVFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTlFVRVVFIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU2VlayBtZWRpYSBpdGVtIHRvIGEgbmV3IHBsYXliYWNrIHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gbW9kaWZ5IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBvbmx5IGFmZmVjdHMgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG9mIHRoZSBtZWRpYSBpdGVtOyBub3QgaXRzIHBsYXliYWNrIHN0YXRlLgotICAgICAqIElmIHRoZSBwbGF5YmFjayBxdWV1ZSBpcyBwYXVzZWQsIHRoZW4gc2Vla2luZyBzZXRzIHRoZSBwb3NpdGlvbiBidXQgdGhlIGl0ZW0KLSAgICAgKiByZW1haW5zIHBhdXNlZC4gIExpa2V3aXNlIGlmIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZW4gc2Vla2luZyB3aWxsIGNhdXNlIHBsYXliYWNrCi0gICAgICogdG8ganVtcCB0byB0aGUgbmV3IHBvc2l0aW9uIGFuZCBjb250aW51ZSBwbGF5aW5nIGZyb20gdGhhdCBwb2ludC4gIElmIHRoZSBpdGVtIGhhcwotICAgICAqIG5vdCB5ZXQgc3RhcnRlZCBwbGF5aW5nLCB0aGVuIHRoZSBuZXcgcGxheWJhY2sgcG9zaXRpb24gaXMgcmVtZW1iZXJlZCBieSB0aGUKLSAgICAgKiBxdWV1ZSBhbmQgdXNlZCBhcyB0aGUgaXRlbSdzIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiB3aGVuIHBsYXliYWNrIGV2ZW50dWFsbHkgYmVnaW5zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgbWVkaWEgaXRlbSdzIHBsYXliYWNrIHBvc2l0aW9uIGlzIGNoYW5nZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gc2Vlay4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3Ci0gICAgICogY29udGVudCBwb3NpdGlvbiBmb3IgcGxheWJhY2sgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLCBpZiB0aGUgY29udGVudCBwb3NpdGlvbiBpcyBpbnZhbGlkLCBvciBpZiB0aGUgbWVkaWEgaXRlbQotICAgICAqIGlzIGluIGEgdGVybWluYWwgc3RhdGUuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFRUsgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFRUsiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBHZXQgbWVkaWEgaXRlbSBwbGF5YmFjayBzdGF0dXMKLSAgICAgKiBhbmQgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcHJvdmlkZSB1cGRhdGVkIHBsYXliYWNrIHN0YXR1cyBhbmQgcHJvZ3Jlc3MKLSAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcXVlcnkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjdXJyZW50IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9TVEFUVVMgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkdFVF9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZW1vdmUgbWVkaWEgaXRlbSBmcm9tIHNlc3Npb24ncyBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtCi0gICAgICogZnJvbSB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgSWYgdGhlIGN1cnJlbnQgaXRlbSBpcyByZW1vdmVkLCB0aGVuCi0gICAgICogcGxheWJhY2sgd2lsbCBwcm9jZWVkIHRvIHRoZSBuZXh0IG1lZGlhIGl0ZW0gKGFzc3VtaW5nIHRoZSBxdWV1ZSBoYXMgbm90IGJlZW4KLSAgICAgKiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHBhdXNlIHN0YXRlIG9mIHRoZSBxdWV1ZS4gIElmIHRoZSBxdWV1ZSB3YXMgcGF1c2VkCi0gICAgICogdGhlbiBpdCByZW1haW5zIHBhdXNlZCAoZXZlbiBpZiBpdCBpcyBub3cgZW1wdHkpIHVudGlsIGEgcmVzdW1lLCBzdG9wIG9yIHBsYXkKLSAgICAgKiBhY3Rpb24gaXMgaXNzdWVkIHRoYXQgY2F1c2VzIHRoZSBwYXVzZSBzdGF0ZSB0byBiZSBjbGVhcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHJlbW92ZS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLCBvciBpZiB0aGUgbWVkaWEgaXRlbSBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlCi0gICAgICogbm8gbG9uZ2VyIGluIHRoZSBxdWV1ZSkuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFTU9WRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVNT1ZFIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZSB3aG9sZSBwbGF5YmFjayBxdWV1ZS4gKi8KLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyB0aGUgcGxheWJhY2sgcXVldWUgb2YgdGhlIHNwZWNpZmllZCBzZXNzaW9uIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcGF1c2VkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBVVNFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5QQVVTRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlc3VtZSBtZWRpYSBwbGF5YmFjayAodW5wYXVzZSkuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyB0aGUgcGxheWJhY2sgcXVldWUgb2YgdGhlIHNwZWNpZmllZCBzZXNzaW9uIHRvIGJlIHJlc3VtZWQuCi0gICAgICogUmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2Yge0BsaW5rICNBQ1RJT05fUEFVU0V9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSByZXN1bWVkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVTVU1FID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRVNVTUUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTdG9wIG1lZGlhIHBsYXliYWNrIChjbGVhciBxdWV1ZSBhbmQgdW5wYXVzZSkuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdG9wIHBsYXliYWNrLCBjYW5jZWwgYW5kIHJlbW92ZQotICAgICAqIGFsbCBtZWRpYSBpdGVtcyBmcm9tIHRoZSBzZXNzaW9uJ3MgbWVkaWEgaXRlbSBxdWV1ZSBhbmQsIHJlc2V0IHRoZSBxdWV1ZSdzCi0gICAgICogcGF1c2Ugc3RhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHN0b3BwZWQgKGNsZWFyZWQgYW5kIHVucGF1c2VkKS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUT1AgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNUT1AiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTdGFydCBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gaW52YWxpZGF0ZSB0aGUgY3VycmVudCBzZXNzaW9uCi0gICAgICogYW5kIHN0YXJ0IGEgbmV3IHNlc3Npb24uICBUaGUgbmV3IHNlc3Npb24gaW5pdGlhbGx5IGhhcyBhbiBlbXB0eSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHByZXZpb3VzIHNlc3Npb24ncyBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlCi0gICAgICogaXMgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cwotICAgICAqIG9mIGVhY2ggaXRlbS4gIFRoZSBwcmV2aW91cyBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgbmV3IHNlc3Npb24KLSAgICAgKiB0YWtlcyBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQotICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMKLSAgICAgKiBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQotICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbQotICAgICAqIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdGhhdCB3YXMgc3RhcnRlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBhbHdheXMgYmUgYSBicmFuZCBuZXcgc2Vzc2lvbgotICAgICAqIGRpc3RpbmN0IGZyb20gYW55IG90aGVyIHByZXZpb3VzbHkgY3JlYXRlZCBzZXNzaW9ucy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5TdGF0dXMgdXBkYXRlczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhCi0gICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBzdGF0dXMgdXBkYXRlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHNpZ25pZmljYW50IG1lZGlhIHNlc3Npb24gc3RhdGUgY2hhbmdlcyBvY2N1ciBzdWNoIGFzIHdoZW4gdGhlIHNlc3Npb24ncwotICAgICAqIHF1ZXVlIGlzIHBhdXNlZCBvciByZXN1bWVkIG9yIHdoZW4gdGhlIHNlc3Npb24gaXMgdGVybWluYXRlZCBvciBpbnZhbGlkYXRlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkN1c3RvbSBtZXNzYWdlczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gdGhlIHNlc3Npb24gaGFzIGFueSBtZXNzYWdlcyB0byBzZW5kLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgI0VYVFJBX01FU1NBR0V9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX1NFU1NJT04gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNUQVJUX1NFU1NJT04iOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBHZXQgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcHJvdmlkZSB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gd2hvc2Ugc3RhdHVzIGlzIHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogY3VycmVudCBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkdFVF9TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVuZCBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gZW5kIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4KLSAgICAgKiBUaGUgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIHJvdXRlIGNlYXNlcyB0byBiZSB1bmRlciBjb250cm9sCi0gICAgICogb2YgdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24gaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNTRVNTSU9OX1NUQVRFX0VOREVEfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQgdG8KLSAgICAgKiB0aGUgc2Vzc2lvbidzIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAotICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogSW4gb3RoZXIgd29yZHMsIGl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG8gZW5kIGEgc2Vzc2lvbiBvdGhlciB0aGFuIHRoZQotICAgICAqIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5EX1NFU1NJT04gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVORF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIEN1c3RvbSBtZWRpYSBjb250cm9sIGFjdGlvbjogU2VuZCB7QGxpbmsgI0VYVFJBX01FU1NBR0V9LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByb3V0ZSB0byBoYW5kbGUgYSBtZXNzYWdlIGRlc2NyaWJlZCBieSBFWFRSQV9NRVNTQUdFLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB3aWxsIGhhbmRsZSB0aGlzIG1lc3NhZ2UuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRX0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHRvIHNlbmQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogQW55IG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIEFueSBlcnJvciBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VORF9NRVNTQUdFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRU5EX01FU1NBR0UiOwotCi0gICAgLyogRXh0cmFzIGFuZCByZWxhdGVkIGNvbnN0YW50cy4gKi8KLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBpZGVudGlmaWVzIHRoZSByZW1vdGUgcGxheWJhY2sgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgc2Vzc2lvbiB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgaXRlbSBpbiBxdWVzdGlvbiBiZWxvbmdzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICogdG8gcmVwcmVzZW50IG9uZSBwYXJ0aWN1bGFyIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgc2Vzc2lvbiBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fUEFVU0V9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfQotICAgICAqIHRvIGRlc2NyaWJlIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gcHJvdmlkZQotICAgICAqIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIGRhdGEgdGhhdCBjYW4gYmUgY29udmVydGVkIGludG8KLSAgICAgKiBhIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IG9iamVjdCB1c2luZwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjZnJvbUJ1bmRsZSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIGlkIGFuZCBpdHMgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIGFzIGEgYnVuZGxlIHRoYXQgY2FuIGJlIGRlY29kZWQgaW50byBhIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIG1lc3NhZ2UgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiB0aGUgbWVkaWEgc2Vzc2lvbiBoYXMgYSBtZXNzYWdlIHRvIHNlbmQsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIGlkIGFuZCBpdHMgbWVzc2FnZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRX0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZXNzYWdlIGZyb20KLSAgICAgKiB0aGUgc2Vzc2lvbiBhcyBhIGJ1bmRsZSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20ge0BsaW5rICNBQ1RJT05fUExBWX0gb3IKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0aGF0IHJlcHJlc2VudHMgdGhlIG1lZGlhIGl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUKLSAgICAgKiBwbGF5YmFjayByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBpdGVtIHRvIGJlIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKLSAgICAgKiB0aGUgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICogdG8gcmVwcmVzZW50IG9uZSBwYXJ0aWN1bGFyIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0lEID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX0lEIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBzdGF0dXMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBpdGVtIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9QTEFZfSwKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSwge0BsaW5rICNBQ1RJT05fU0VFS30sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfQotICAgICAqIHRvIGRlc2NyaWJlIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gcHJvdmlkZQotICAgICAqIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIGRhdGEgdGhhdCBjYW4gYmUgY29udmVydGVkIGludG8KLSAgICAgKiBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IG9iamVjdCB1c2luZwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZnJvbUJ1bmRsZSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBleHRyYTogTWVkaWEgaXRlbSBjb250ZW50IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IHRoZQotICAgICAqIHN0YXJ0aW5nIHBsYXliYWNrIHBvc2l0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU0VFS30gdG8gc2V0IGEgbmV3IHBsYXliYWNrIHBvc2l0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04gPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fUE9TSVRJT04iOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIG1ldGFkYXRhLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IG1ldGFkYXRhCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBtZXRhZGF0YSBrZXktdmFsdWUgcGFpcnMgYXMgZGVmaW5lZAotICAgICAqIGluIHtAbGluayBNZWRpYUl0ZW1NZXRhZGF0YX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fTUVUQURBVEEgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fTUVUQURBVEEiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBIVFRQIHJlcXVlc3QKLSAgICAgKiBoZWFkZXJzIHRvIGJlIGluY2x1ZGVkIHdoZW4gZmV0Y2hpbmcgdG8gdGhlIGNvbnRlbnQgaW5kaWNhdGVkIGJ5IHRoZSBtZWRpYQotICAgICAqIGl0ZW0ncyBkYXRhIFVyaS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBleHRyYSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgb3RoZXIKLSAgICAgKiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgc2VwYXJhdGVseSBmcm9tIHRoZSBtZWRpYSBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2Ygc3RyaW5nIGJhc2VkIGtleS12YWx1ZSBwYWlycwotICAgICAqIHRoYXQgZGVzY3JpYmUgdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0hUVFBfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSFRUUF9IRUFERVJTIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5Ci0gICAgICogYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgYSBwYXJ0aWN1bGFyCi0gICAgICogbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgaXRlbSBiZWxvbmdzLCB0aGUgc2Vzc2lvbiBzdGF0dXMsIHRoZSBpdGVtJ3MgaWQKLSAgICAgKiBhbmQgdGhlIGl0ZW0ncyB1cGRhdGVkIHN0YXR1cy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHNhbWUgcGVuZGluZyBpbnRlbnQgYW5kIGJyb2FkY2FzdCByZWNlaXZlciBtYXkgYmUgc2hhcmVkIGJ5IGFueSBudW1iZXIgb2YKLSAgICAgKiBtZWRpYSBpdGVtcyBzaW5jZSB0aGUgYnJvYWRjYXN0IGludGVudCBpbmNsdWRlcyB0aGUgbWVkaWEgc2Vzc2lvbiBpZAotICAgICAqIGFuZCBtZWRpYSBpdGVtIGlkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgaXRlbSBpbiBxdWVzdGlvbiBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZiB0aGUKLSAgICAgKiBtZWRpYSBpdGVtIGluIHF1ZXN0aW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUKLSAgICAgKiBpdGVtIGFzIGEgYnVuZGxlIHRoYXQgY2FuIGJlIGRlY29kZWQgaW50byBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU0VORF9NRVNTQUdFfSwgYW5kIGluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcnN9IHRvIGRlc2NyaWJlIGEgbWVzc2FnZSBiZXR3ZWVuIGEKLSAgICAgKiBzZXNzaW9uIGFuZCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0UiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogRXJyb3IgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggYWxsIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gZGVzY3JpYmUgdGhlIGNhdXNlIG9mIGFuIGVycm9yLgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIG9taXR0ZWQgd2hlbiB0aGUgZXJyb3IgaXMgdW5rbm93bi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIG9uZSBvZjoge0BsaW5rICNFUlJPUl9VTktOT1dOfSwge0BsaW5rICNFUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT059LAotICAgICAqIHtAbGluayAjRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEfSwge0BsaW5rICNFUlJPUl9JTlZBTElEX0lURU1fSUR9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9FUlJPUl9DT0RFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkVSUk9SX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTktOT1dOID0gMDsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04gPSAxOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIHNlc3Npb24gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfU0VTU0lPTl9JRCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgaXRlbSBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9JVEVNX0lEID0gMzsKLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sSW50ZW50KCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MmRkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBzcGVjaWZ5aW5nIG1ldGFkYXRhIGFib3V0IGEgbWVkaWEgaXRlbSBhcyBhIHtAbGluayBCdW5kbGV9LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBNZWRpYSBpdGVtIG1ldGFkYXRhIGlzIGRlc2NyaWJlZCBhcyBhIGJ1bmRsZSBvZiBrZXkvdmFsdWUgcGFpcnMgYXMgZGVmaW5lZAotICogaW4gdGhpcyBjbGFzcy4gIFRoZSBkb2N1bWVudGF0aW9uIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB2YWx1ZSBhc3NvY2lhdGVkCi0gKiB3aXRoIGVhY2gga2V5LgotICogPC9wPjxwPgotICogQW4gYXBwbGljYXRpb24gbWF5IHNwZWNpZnkgYWRkaXRpb25hbCBjdXN0b20gbWV0YWRhdGEga2V5cyBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlCi0gKiB0aGF0IHRoZXkgd2lsbCBiZSByZWNvZ25pemVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbU1ldGFkYXRhIHsKLSAgICAvKgotICAgICAqIE5vdGU6IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgYWxzbyBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBtZXRhZGF0YSBrZXlzIHRoYXQgY2FuIGJlCi0gICAgICogcmV0cmlldmVkIGZyb20gYSBjb250ZW50IHN0cmVhbSBhbHRob3VnaCB0aGUgcmVwcmVzZW50YXRpb24gaXMgc29tZXdoYXQgZGlmZmVyZW50IGhlcmUKLSAgICAgKiBzaW5jZSB3ZSBhcmUgc2VuZGluZyB0aGUgZGF0YSB0byBhIHJlbW90ZSBlbmRwb2ludC4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtTWV0YWRhdGEoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQWxidW0gYXJ0aXN0IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUSVNUIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIHRpdGxlLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fVElUTEUiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXJ0d29yayBVcmkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIFVSSSBmb3IgYW4gaW1hZ2UgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGl0ZW0sCi0gICAgICogc3VjaCBhcyBhbGJ1bSBvciBjb3ZlciBhcnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRXT1JLX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFSVFdPUktfVVJJIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBdXRob3IgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVVRIT1IgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BVVRIT1IiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQ29tcG9zZXIgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01QT1NFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBPU0VSIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IFRyYWNrIHRpdGxlLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVElUTEUiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFllYXIgb2YgcHVibGljYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgeWVhciBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ZRUFSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuWUVBUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogVHJhY2sgbnVtYmVyIChzdWNoIGFzIGEgdHJhY2sgb24gYSBDRCkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgdHJhY2sgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFJBQ0tfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVFJBQ0tfTlVNQkVSIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBEaXNjIG51bWJlciB3aXRoaW4gYSBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIGRpc2MgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRElTQ19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNDX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBMb25nIGtleTogSXRlbSBwbGF5YmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgPGNvZGU+bG9uZzwvY29kZT4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGR1cmF0aW9uIG1ldGFkYXRhIGlzIG9ubHkgYSBoaW50IHRvIGVuYWJsZSBhIHJlbW90ZSBtZWRpYSBwbGF5ZXIgdG8KLSAgICAgKiBndWVzcyB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgYmVmb3JlIGl0IGFjdHVhbGx5IG9wZW5zIHRoZSBtZWRpYSBzdHJlYW0uCi0gICAgICogVGhlIHJlbW90ZSBtZWRpYSBwbGF5ZXIgc2hvdWxkIHN0aWxsIGRldGVybWluZSB0aGUgYWN0dWFsIGNvbnRlbnQgZHVyYXRpb24gZnJvbQotICAgICAqIHRoZSBtZWRpYSBzdHJlYW0gaXRzZWxmIGluZGVwZW5kZW50IG9mIHRoZSB2YWx1ZSB0aGF0IG1heSBiZSBzcGVjaWZpZWQgYnkgdGhpcyBrZXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9EVVJBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRVUkFUSU9OIjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlYTJkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIEFzIGEgbWVkaWEgaXRlbSBpcyBwbGF5ZWQsIGl0IHRyYW5zaXRpb25zIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBzdGF0ZXMgaW5jbHVkaW5nOgotICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QRU5ESU5HIHBlbmRpbmd9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklORyBidWZmZXJpbmd9LAotICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HIHBsYXlpbmd9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BBVVNFRCBwYXVzZWR9LAotICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRCBmaW5pc2hlZH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9LAotICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0sIGFuZAotICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9FUlJPUiBlcnJvcn0uICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlCi0gKiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaXRzIG1lYW5pbmcuCi0gKiA8L3A+PHA+Ci0gKiBXaGlsZSB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGUgcGxheWJhY2sgc3RhdHVzIG1heSBhbHNvIGluY2x1ZGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZSB7QGxpbmsgI2dldENvbnRlbnRQb3NpdGlvbiBjb250ZW50IHBvc2l0aW9ufSBhbmQKLSAqIHtAbGluayAjZ2V0Q29udGVudER1cmF0aW9uIGNvbnRlbnQgZHVyYXRpb259IGFsdGhvdWdoIG5vdCBhbGwgcm91dGUgZGVzdGluYXRpb25zCi0gKiB3aWxsIHJlcG9ydCBpdC4KLSAqIDwvcD48cD4KLSAqIFRvIG1vbml0b3IgcGxheWJhY2sgc3RhdHVzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHN1cHBseSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byB1c2UgYXMgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gKiBmb3IgYSBnaXZlbiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXliYWNrIHJlcXVlc3R9LiAgTm90ZSB0aGF0Ci0gKiB0aGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlciB3aWxsIG9ubHkgYmUgaW52b2tlZCBmb3IgbWFqb3Igc3RhdHVzIGNoYW5nZXMgc3VjaCBhcyBhCi0gKiB0cmFuc2l0aW9uIGZyb20gcGxheWluZyB0byBmaW5pc2hlZC4KLSAqIDwvcD48cCBjbGFzcz0ibm90ZSI+Ci0gKiBUaGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBtaW5vciBwcm9ncmVzcyB1cGRhdGVzIHN1Y2ggYXMKLSAqIGNoYW5nZXMgdG8gcGxheWJhY2sgcG9zaXRpb24gb3IgZHVyYXRpb24uICBJZiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gbW9uaXRvcgotICogcGxheWJhY2sgcHJvZ3Jlc3MsIHRoZW4gaXQgbXVzdCB1c2UgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXMgcmVxdWVzdH0gdG8gcG9sbCBmb3IgY2hhbmdlcwotICogcGVyaW9kaWNhbGx5IGFuZCBlc3RpbWF0ZSB0aGUgcGxheWJhY2sgcG9zaXRpb24gd2hpbGUgcGxheWluZy4gIE5vdGUgdGhhdCB0aGVyZSBtYXkKLSAqIGJlIGEgc2lnbmlmaWNhbnQgcG93ZXIgaW1wYWN0IHRvIHBvbGxpbmcgc28gdGhlIGFwcGxpY2F0aW9uIGlzIGFkdmlzZWQgb25seQotICogdG8gcG9sbCB3aGVuIHRoZSBzY3JlZW4gaXMgb24gYW5kIG5ldmVyIG1vcmUgdGhhbiBhYm91dCBvbmNlIGV2ZXJ5IDUgc2Vjb25kcyBvciBzby4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1TdGF0dXMgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NUQVRFID0gInBsYXliYWNrU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfUE9TSVRJT04gPSAiY29udGVudFBvc2l0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX0RVUkFUSU9OID0gImNvbnRlbnREdXJhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQZW5kaW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBub3QgeWV0IHN0YXJ0ZWQgcGxheWJhY2sgYnV0IHdpbGwgYmUgcGxheWVkIGV2ZW50dWFsbHkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX1BFTkRJTkcgPSAwOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXlpbmcuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaXMgY3VycmVudGx5IHBsYXlpbmcuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX1BMQVlJTkcgPSAxOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBhdXNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCBwbGF5YmFjayBvZiB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiBwYXVzZWQuICBQbGF5YmFjayBjYW4gYmUKLSAgICAgKiByZXN1bWVkIHVzaW5nIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX1BBVVNFRCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogQnVmZmVyaW5nIG9yIHNlZWtpbmcgdG8gYSBuZXcgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gdGVtcG9yYXJpbHkgaW50ZXJydXB0ZWQKLSAgICAgKiB0byBmZXRjaCBtb3JlIGNvbnRlbnQuICBQbGF5YmFjayB3aWxsIGNvbnRpbnVlIGF1dG9tYXRpY2FsbHkKLSAgICAgKiB3aGVuIGVub3VnaCBjb250ZW50IGhhcyBiZWVuIGJ1ZmZlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgPSAzOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEZpbmlzaGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHBsYXllZCB0byB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGFuZCBmaW5pc2hlZCBub3JtYWxseS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBmaW5pc2hlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgPSA0OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IENhbmNlbGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBleHBsaWNpdGx5IHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgYnkgdGhlCi0gICAgICogYXBwbGljYXRpb24uICBJdGVtcyBtYXkgYmUgY2FuY2VsZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgdXNpbmcKLSAgICAgKiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIHJlbW92ZX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9IGFjdGlvbiBvciBieSBpc3N1aW5nCi0gICAgICogYW5vdGhlciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IGFjdGlvbiB0aGF0IGhhcyB0aGUKLSAgICAgKiBzaWRlLWVmZmVjdCBvZiBjbGVhcmluZyB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgY2FuY2VsZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEID0gNTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBJbnZhbGlkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgcGVybWFuZW50bHkgYW5kIGludm9sdW50YXJpbHkuCi0gICAgICogVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIGFuZCByZW1vdmVkCi0gICAgICogZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB0aGUgc2Vzc2lvbiB0byB3aGljaCBpdCBiZWxvbmdzIHdhcyBpbnZhbGlkYXRlZAotICAgICAqICh0eXBpY2FsbHkgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGludmFsaWRhdGlvbiBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZ2VuZXJhbGx5IHdhaXQgZm9yIHRoZSB1c2VyCi0gICAgICogdG8gcGVyZm9ybSBhbiBleHBsaWNpdCBhY3Rpb24sIHN1Y2ggYXMgY2xpY2tpbmcgb24gYSBwbGF5IGJ1dHRvbiBpbiB0aGUgVUksCi0gICAgICogYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG1lZGlhIHNlc3Npb24gdG8gYXZvaWQgdW5uZWNlc3NhcmlseSBpbnRlcnJ1cHRpbmcKLSAgICAgKiBhbm90aGVyIGFwcGxpY2F0aW9uIHRoYXQgbWF5IGhhdmUganVzdCBzdGFydGVkIHVzaW5nIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQW4gaW52YWxpZGF0ZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEID0gNjsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5YmFjayBoYWx0ZWQgb3IgYWJvcnRlZCBkdWUgdG8gYW4gZXJyb3IuCi0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZXMgb2YgZXJyb3JzIGFyZSBubyBuZXR3b3JrIGNvbm5lY3Rpdml0eSB3aGVuIGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgY29udGVudAotICAgICAqIGZyb20gYSBzZXJ2ZXIsIG9yIGV4cGlyZWQgdXNlciBjcmVkZW50aWFscyB3aGVuIHRyeWluZyB0byBwbGF5IHN1YnNjcmlwdGlvbi1iYXNlZAotICAgICAqIGNvbnRlbnQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgbWVkaWEgaXRlbSBpbiB0aGUgZXJyb3Igc3RhdGUgY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLAotICAgICAqIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9FUlJPUiA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhOiBIVFRQIHN0YXR1cyBjb2RlLgotICAgICAqIDxwPgotICAgICAqIFNwZWNpZmllcyB0aGUgSFRUUCBzdGF0dXMgY29kZSB0aGF0IHdhcyBlbmNvdW50ZXJlZCB3aGVuIHRoZSBjb250ZW50Ci0gICAgICogd2FzIHJlcXVlc3RlZCBhZnRlciBhbGwgcmVkaXJlY3RzIHdlcmUgZm9sbG93ZWQuICBUaGlzIGtleSBvbmx5IG5lZWRzIHRvCi0gICAgICogc3BlY2lmaWVkIHdoZW4gdGhlIGNvbnRlbnQgdXJpIHVzZXMgdGhlIEhUVFAgb3IgSFRUUFMgc2NoZW1lIGFuZCBhbiBlcnJvcgotICAgICAqIG9jY3VycmVkLiAgVGhpcyBrZXkgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvbnRlbnQgd2FzIGFibGUgdG8gYmUgcGxheWVkCi0gICAgICogc3VjY2Vzc2Z1bGx5OyB0aGVyZSBpcyBubyBuZWVkIHRvIHJlcG9ydCBhIDIwMCAoT0spIHN0YXR1cyBjb2RlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciBIVFRQIHN0YXR1cyBjb2RlLCBzdWNoIGFzIDQwMSAoVW5hdXRob3JpemVkKSwKLSAgICAgKiA0MDQgKE5vdCBGb3VuZCksIG9yIDUwMCAoU2VydmVyIEVycm9yKSwgb3IgMCBpZiBub25lLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1NUQVRVU19DT0RFID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnN0YXR1cy5leHRyYS5IVFRQX1NUQVRVU19DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXNwb25zZSBoZWFkZXJzLgotICAgICAqIDxwPgotICAgICAqIFNwZWNpZmllcyB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzIHRoYXQgd2VyZSByZXR1cm5lZCB3aGVuIHRoZSBjb250ZW50IHdhcwotICAgICAqIHJlcXVlc3RlZCBmcm9tIHRoZSBuZXR3b3JrLiAgVGhlIGhlYWRlcnMgbWF5IGluY2x1ZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IHRoZSBjb250ZW50IG9yIGFueSBlcnJvcnMgY29uZGl0aW9ucyB0aGF0IHdlcmUgZW5jb3VudGVyZWQgd2hpbGUKLSAgICAgKiB0cnlpbmcgdG8gZmV0Y2ggdGhlIGNvbnRlbnQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2Ygc3RyaW5nIGJhc2VkIGtleS12YWx1ZSBwYWlycwotICAgICAqIHRoYXQgZGVzY3JpYmUgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9SRVNQT05TRV9IRUFERVJTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnN0YXR1cy5leHRyYS5IVFRQX1JFU1BPTlNFX0hFQURFUlMiOwotCi0gICAgTWVkaWFJdGVtU3RhdHVzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgYm9vdCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0gdGltZSBiYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc3RhdHVzIHRpbWVzdGFtcCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZSgpfSB0aW1lIGJhc2UuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9USU1FU1RBTVApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBtZWRpYSBpdGVtLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgcGxheWJhY2sgc3RhdGUuICBPbmUgb2Yge0BsaW5rICNQTEFZQkFDS19TVEFURV9QRU5ESU5HfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkd9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BBVVNFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkd9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRH0sCi0gICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19TVEFURV9FUlJPUn0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1NUQVRFLCBQTEFZQkFDS19TVEFURV9FUlJPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCi0gICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudFBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX1BPU0lUSU9OLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZgotICAgICAqIG1pbGxpc2Vjb25kcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnREdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFJdGVtU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrU3RhdGU9IikuYXBwZW5kKHBsYXliYWNrU3RhdGVUb1N0cmluZyhnZXRQbGF5YmFja1N0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250ZW50UG9zaXRpb249IikuYXBwZW5kKGdldENvbnRlbnRQb3NpdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250ZW50RHVyYXRpb249IikuYXBwZW5kKGdldENvbnRlbnREdXJhdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwbGF5YmFja1N0YXRlVG9TdHJpbmcoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwZW5kaW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnVmZmVyaW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBsYXlpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwYXVzZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9GSU5JU0hFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImZpbmlzaGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJjYW5jZWxlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZGF0ZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVycm9yIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhwbGF5YmFja1N0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW1TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYUl0ZW1TdGF0dXMoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3RzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQotICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tTdGF0ZSBUaGUgaXRlbSBwbGF5YmFjayBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFBsYXliYWNrU3RhdGUocGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFJdGVtU3RhdHVzIHN0YXR1cykgewotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhdHVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc3RhdHVzLm1CdW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgYm9vdCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0gdGltZSBiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGltZXN0YW1wKGxvbmcgZWxhcHNlZFJlYWx0aW1lVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX1RJTUVTVEFNUCwgZWxhcHNlZFJlYWx0aW1lVGltZXN0YW1wKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBtZWRpYSBpdGVtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tTdGF0ZShpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUQVRFLCBwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50UG9zaXRpb24obG9uZyBwb3NpdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyCi0gICAgICAgICAqIG9mIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnREdXJhdGlvbihsb25nIGR1cmF0aW9uTWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIGR1cmF0aW9uTWlsbGlzZWNvbmRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW1TdGF0dXMgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbVN0YXR1cyhtQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzg0ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgcm91dGUuCi0gKiA8cD4KLSAqIEVhY2ggcm91dGUgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBhbiBvcGFxdWUgaWQgc3RyaW5nLiAgVGhpcyB0b2tlbgotICogbWF5IHRha2UgYW55IGZvcm0gYXMgbG9uZyBhcyBpdCBpcyB1bmlxdWUgd2l0aGluIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlRGVzY3JpcHRvciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiaWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dST1VQX01FTUJFUl9JRFMgPSAiZ3JvdXBNZW1iZXJJZHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAibmFtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQ1JJUFRJT04gPSAic3RhdHVzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1VSSSA9ICJpY29uVXJpIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkFCTEVEID0gImVuYWJsZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJTkcgPSAiY29ubmVjdGluZyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElPTl9TVEFURSA9ICJjb25uZWN0aW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfRklMVEVSUyA9ICJjb250cm9sRmlsdGVycyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9ICJwbGF5YmFja1R5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NUUkVBTSA9ICJwbGF5YmFja1N0cmVhbSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVWSUNFX1RZUEUgPSAiZGV2aWNlVHlwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FID0gInZvbHVtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX01BWCA9ICJ2b2x1bWVNYXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9IQU5ETElORyA9ICJ2b2x1bWVIYW5kbGluZyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQgPSAicHJlc2VudGF0aW9uRGlzcGxheUlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQU5fRElTQ09OTkVDVCA9ICJjYW5EaXNjb25uZWN0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVRUSU5HU19JTlRFTlQgPSAic2V0dGluZ3NJbnRlbnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01JTl9DTElFTlRfVkVSU0lPTiA9ICJtaW5DbGllbnRWZXJzaW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04gPSAibWF4Q2xpZW50VmVyc2lvbiI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzOwotCi0gICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxJbnRlbnRGaWx0ZXI+IGNvbnRyb2xGaWx0ZXJzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sRmlsdGVycyA9IGNvbnRyb2xGaWx0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGlkIGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlIGRlc2NyaXB0b3IgZnVuY3Rpb25zIGFzIGEgc3RhYmxlCi0gICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKLSAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICogPC9wPgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEdyb3VwTWVtYmVySWRzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0dST1VQX01FTUJFUl9JRFMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfREVTQ1JJUFRJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7Ci0gICAgICAgIFN0cmluZyBpY29uVXJpID0gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lDT05fVVJJKTsKLSAgICAgICAgcmV0dXJuIGljb25VcmkgPT0gbnVsbCA/IG51bGwgOiBVcmkucGFyc2UoaWNvblVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBjb25uZWN0aW5nLgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENvbm5lY3Rpb25TdGF0ZX0gaW5zdGVhZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoaXMgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0NPTk5FQ1RJT05fU1RBVEUsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgY2FuIG5vcm1hbGx5IGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrIHdoZW4KLSAgICAgKiB0aGUgZGVzdGluYXRpb24gZGV2aWNlIG9uIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQgdG8gdHdvIG9yIG1vcmUgc291cmNlCi0gICAgICogZGV2aWNlcy4gVGhlIHJvdXRlIHByb3ZpZGVyIHNob3VsZCB1cGRhdGUgdGhlIHJvdXRlIGltbWVkaWF0ZWx5IHdoZW4gdGhlCi0gICAgICogbnVtYmVyIG9mIGNvbm5lY3RlZCBkZXZpY2VzIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRvIHNwZWNpZnkgdGhhdCB0aGUgcm91dGUgc2hvdWxkIGRpc2Nvbm5lY3Qgd2l0aG91dCBzdG9wcGluZyB1c2UKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjdW5zZWxlY3QoaW50KX0gd2l0aAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4ge0BsaW5rIEludGVudFNlbmRlcn0gZm9yIHN0YXJ0aW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgKiByb3V0ZS4gVGhlIGFjdGl2aXR5IG1heSBoYXZlIHNwZWNpZmljIHJvdXRlIHNldHRpbmdzIG9yIGdlbmVyYWwgc2V0dGluZ3MKLSAgICAgKiBmb3IgdGhlIGNvbm5lY3RlZCBkZXZpY2Ugb3Igcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IHRvIHN0YXJ0IGEgc2V0dGluZ3MgYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3Mge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xGaWx0ZXJzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbUJ1bmRsZS48SW50ZW50RmlsdGVyPmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBDb2xsZWN0aW9ucy48SW50ZW50RmlsdGVyPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX0xPQ0FMfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGV2aWNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9ERVZJQ0VfVFlQRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyBjdXJyZW50IHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lTWF4KCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9NQVgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gSG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfSEFORExJTkcsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9GSVhFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KAotICAgICAgICAgICAgICAgIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbmltdW0gY2xpZW50IHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoaXMgcm91dGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBpbnQgZ2V0TWluQ2xpZW50VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fU1RBUlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gY2xpZW50IHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoaXMgcm91dGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q2xpZW50VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGRlc2NyaXB0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShnZXRJZCgpKQotICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICB8fCBtQ29udHJvbEZpbHRlcnMuY29udGFpbnMobnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiaWQ9IikuYXBwZW5kKGdldElkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdyb3VwTWVtYmVySWRzPSIpLmFwcGVuZChnZXRHcm91cE1lbWJlcklkcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBuYW1lPSIpLmFwcGVuZChnZXROYW1lKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpLmFwcGVuZChnZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpY29uVXJpPSIpLmFwcGVuZChnZXRJY29uVXJpKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzRW5hYmxlZD0iKS5hcHBlbmQoaXNFbmFibGVkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzQ29ubmVjdGluZz0iKS5hcHBlbmQoaXNDb25uZWN0aW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25TdGF0ZT0iKS5hcHBlbmQoZ2V0Q29ubmVjdGlvblN0YXRlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRyb2xGaWx0ZXJzPSIpLmFwcGVuZChBcnJheXMudG9TdHJpbmcoZ2V0Q29udHJvbEZpbHRlcnMoKS50b0FycmF5KCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1R5cGU9IikuYXBwZW5kKGdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0cmVhbT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGV2aWNlVHlwZT0iKS5hcHBlbmQoZ2V0RGV2aWNlVHlwZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWU9IikuYXBwZW5kKGdldFZvbHVtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWVNYXg9IikuYXBwZW5kKGdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWVIYW5kbGluZz0iKS5hcHBlbmQoZ2V0Vm9sdW1lSGFuZGxpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJlc2VudGF0aW9uRGlzcGxheUlkPSIpLmFwcGVuZChnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtaW5DbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNaW5DbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1heENsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1heENsaWVudFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtR3JvdXBNZW1iZXJJZHM7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGVzY3JpcHRvciBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgICAgIGlmICghZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KGRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGlkIGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlIGRlc2NyaXB0b3IgZnVuY3Rpb25zIGFzIGEgc3RhYmxlCi0gICAgICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICAgICAqIGJ5IHRoZSBwcm92aWRlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIGlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBncm91cCBtZW1iZXIgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWQoU3RyaW5nIGdyb3VwTWVtYmVySWQpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShncm91cE1lbWJlcklkKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWQgbXVzdCBub3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlcklkcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Hcm91cE1lbWJlcklkcy5jb250YWlucyhncm91cE1lbWJlcklkKSkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcy5hZGQoZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkcyhDb2xsZWN0aW9uPFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgIGlmIChncm91cE1lbWJlcklkcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZHMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVySWRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwTWVtYmVySWQgOiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgICAgICAgICBhZGRHcm91cE1lbWJlcklkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9OQU1FLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICAgICAqIDwvcD48cD4KLSAgICAgICAgICogVGhlIFVSSSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPmNvbnRlbnQgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9DT05URU5UfSk8L2xpPgotICAgICAgICAgKiA8bGk+YW5kcm9pZC5yZXNvdXJjZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0FORFJPSURfUkVTT1VSQ0V9KQotICAgICAgICAgKiA8L2xpPgotICAgICAgICAgKiA8bGk+ZmlsZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0ZJTEV9KTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEljb25VcmkoVXJpIGljb25VcmkpIHsKLSAgICAgICAgICAgIGlmIChpY29uVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpY29uVXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JQ09OX1VSSSwgaWNvblVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIERpc2FibGVkIHJvdXRlcyByZXByZXNlbnQgcm91dGVzIHRoYXQgYSByb3V0ZSBwcm92aWRlciBrbm93cyBhYm91dCwgc3VjaCBhcyBwYWlyZWQKLSAgICAgICAgICogV2lmaSBEaXNwbGF5IHJlY2VpdmVycywgYnV0IHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0VOQUJMRUQsIGVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldENvbm5lY3Rpb25TdGF0ZX0gaW5zdGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIEBEZXByZWNhdGVkCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3RpbmcoYm9vbGVhbiBjb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGNvbm5lY3RpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBjb25uZWN0aW9uIHN0YXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvblN0YXRlIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW9uU3RhdGUoaW50IGNvbm5lY3Rpb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0NPTk5FQ1RJT05fU1RBVEUsIGNvbm5lY3Rpb25TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENhbkRpc2Nvbm5lY3QoYm9vbGVhbiBjYW5EaXNjb25uZWN0KSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBjYW5EaXNjb25uZWN0KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIHRoZSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAgICAgKiByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNldHRpbmdzQWN0aXZpdHkoSW50ZW50U2VuZGVyIGlzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCwgaXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlciBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcihJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXIgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKGZpbHRlcikpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkKGZpbHRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVycyhDb2xsZWN0aW9uPEludGVudEZpbHRlcj4gZmlsdGVycykgewotICAgICAgICAgICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlcnMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWZpbHRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogZmlsdGVycykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayB0eXBlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tUeXBlIFRoZSBwbGF5YmFjayB0eXBlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX0xPQ0FMfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrVHlwZShpbnQgcGxheWJhY2tUeXBlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgcGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tTdHJlYW0oaW50IHBsYXliYWNrU3RyZWFtKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCBwbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHJlY2VpdmVyIGRldmljZSB0eXBlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGV2aWNlVHlwZSBUaGUgcmVjZWl2ZSBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXZpY2VUeXBlKGludCBkZXZpY2VUeXBlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfREVWSUNFX1RZUEUsIGRldmljZVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBjdXJyZW50IHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUUsIHZvbHVtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWVNYXgoaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9NQVgsIHZvbHVtZU1heCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHZvbHVtZSBoYW5kbGluZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZUhhbmRsaW5nIGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWVIYW5kbGluZyhpbnQgdm9sdW1lSGFuZGxpbmcpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfSEFORExJTkcsIHZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoaW50IHByZXNlbnRhdGlvbkRpc3BsYXlJZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBwcmVzZW50YXRpb25EaXNwbGF5SWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWluaW11bSBjbGllbnQgdmVyc2lvbi4KLSAgICAgICAgICogQSByb3V0ZXIgd2hvc2UgdmVyc2lvbiBpcyBsb3dlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNaW5DbGllbnRWZXJzaW9uKGludCBtaW5WZXJzaW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLCBtaW5WZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSBjbGllbnQgdmVyc2lvbi4KLSAgICAgICAgICogQSByb3V0ZXIgd2hvc2UgdmVyc2lvbiBpcyBoaWdoZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWF4Q2xpZW50VmVyc2lvbihpbnQgbWF4VmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgbWF4VmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlcklkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0dST1VQX01FTUJFUl9JRFMsIG1Hcm91cE1lbWJlcklkcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yKG1CdW5kbGUsIG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzk2MjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgd291bGQgbGlrZSB0byBkaXNjb3ZlcgotICogYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RPUiA9ICJzZWxlY3RvciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ1RJVkVfU0NBTiA9ICJhY3RpdmVTY2FuIjsKLQotICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBhY3RpdmVTY2FuIFRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgYm9vbGVhbiBhY3RpdmVTY2FuKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9BQ1RJVkVfU0NBTiwgYWN0aXZlU2Nhbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShLRVlfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVTY2FuKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9BQ1RJVkVfU0NBTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3Rvci5pc1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG90aGVyID0gKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KW87Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5lcXVhbHMob3RoZXIuZ2V0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNBY3RpdmVTY2FuKCkgPT0gb3RoZXIuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmhhc2hDb2RlKCkgXiAoaXNBY3RpdmVTY2FuKCkgPyAxIDogMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJEaXNjb3ZlcnlSZXF1ZXN0eyBzZWxlY3Rvcj0iKS5hcHBlbmQoZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlU2Nhbj0iKS5hcHBlbmQoaXNBY3RpdmVTY2FuKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgdXNlZCB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIGZvcgotICogdXNlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbi4gIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgYWxzbyBiZSBkZWNsYXJlZAotICogYXMgYSBzZXJ2aWNlIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgdG8gYWxsIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIHN5c3RlbS4KLSAqIDxwPgotICogVGhlIHB1cnBvc2Ugb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyB0byBkaXNjb3ZlciBtZWRpYSByb3V0ZXMgdGhhdCBzYXRpc2Z5Ci0gKiB0aGUgY3JpdGVyaWEgc3BlY2lmaWVkIGJ5IHRoZSBjdXJyZW50IHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIHB1Ymxpc2ggYQotICoge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3J9IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgZWFjaCByb3V0ZSBieSBjYWxsaW5nCi0gKiB7QGxpbmsgI3NldERlc2NyaXB0b3J9IHRvIG5vdGlmeSB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQge0BsaW5rIENhbGxiYWNrfS4KLSAqIDwvcD48cD4KLSAqIFRoZSBwcm92aWRlciBzaG91bGQgd2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGJ5IGltcGxlbWVudGluZwotICoge0BsaW5rICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkfSBhbmQgdXBkYXRpbmcgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBpdCBpcwotICogYXR0ZW1wdGluZyB0byBkaXNjb3Zlci4gIEl0IHNob3VsZCBhbHNvIGhhbmRsZSByb3V0ZSBjb250cm9sIHJlcXVlc3RzIHN1Y2gKLSAqIGFzIHZvbHVtZSBjaGFuZ2VzIG9yIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnRzfQotICogYnkgaW1wbGVtZW50aW5nIHtAbGluayAjb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXJ9IHRvIHJldHVybiBhIHtAbGluayBSb3V0ZUNvbnRyb2xsZXJ9Ci0gKiBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICogPC9wPjxwPgotICogQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYmUgdXNlZCBwcml2YXRlbHkgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNpbmdsZQotICogYXBwbGljYXRpb24gcHJvY2VzcyBieSBjYWxsaW5nIHtAbGluayBNZWRpYVJvdXRlciNhZGRQcm92aWRlciBNZWRpYVJvdXRlci5hZGRQcm92aWRlcn0KLSAqIHRvIGFkZCBpdCB0byB0aGUgbG9jYWwge0BsaW5rIE1lZGlhUm91dGVyfS4gIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGFsc28gYmUgbWFkZQotICogYXZhaWxhYmxlIGdsb2JhbGx5IHRvIGFsbCBhcHBsaWNhdGlvbnMgYnkgcmVnaXN0ZXJpbmcgYSB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZX0KLSAqIGluIHRoZSBwcm92aWRlcidzIG1hbmlmZXN0LiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZAotICogYXMgYSBzZXJ2aWNlLCBhbGwgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBtZWRpYSByb3V0ZXIgQVBJIHdpbGwgYmUgYWJsZSB0bwotICogZGlzY292ZXIgYW5kIHVzZWQgdGhlIHByb3ZpZGVyJ3Mgcm91dGVzIHdpdGhvdXQgaGF2aW5nIHRvIGluc3RhbGwgYW55dGhpbmcgZWxzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IG11c3Qgb25seSBiZSBhY2Nlc3NlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXIgewotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQgPSAyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgUHJvdmlkZXJIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEZXNjcmlwdG9yQ2hhbmdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlcihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBNZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBQcm92aWRlck1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBpZiAobWV0YWRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgZ2V0Q2xhc3MoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZXh0IG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBoYW5kbGVyIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiB0aHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIG1IYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgc29tZSBtZXRhZGF0YSBhYm91dCB0aGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgUHJvdmlkZXJNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvciBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byB1c2UsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3Qgd2hpY2ggaW5mb3JtcyB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlCi0gICAgICoga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZ2V0RGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBkaXNjb3ZlcnkgcmVxdWVzdCB0byBpbmZvcm0gdGhlIHByb3ZpZGVyIGFib3V0IHRoZSBraW5kcyBvZgotICAgICAqIHJvdXRlcyB0aGF0IGl0cyBjbGllbnRzIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICAgICAgaWYgKCFtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSA9IGZhbHNlOwotICAgICAgICBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZGlzY292ZXJ5IHJlcXVlc3R9Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbmV2ZXIgYW4gYXBwbGljYXRpb25zIGNhbGxzIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFja30gdG8gcmVnaXN0ZXIKLSAgICAgKiBhIGNhbGxiYWNrLCBpdCBhbHNvIHByb3ZpZGVzIGEgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQKLSAgICAgKiBpdCBpcyBpbnRlcmVzdGVkIGluLiAgVGhlIG1lZGlhIHJvdXRlciBjb21iaW5lcyBhbGwgb2YgdGhlc2Ugc2VsZWN0b3JzIHRvZ2V0aGVyCi0gICAgICogdG8gZ2VuZXJhdGUgYSB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBub3RpZmllcyBlYWNoIHByb3ZpZGVyIHdoZW4gYSBjaGFuZ2UKLSAgICAgKiBvY2N1cnMgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpc2NvdmVyeVJlcXVlc3R9IHdoaWNoIHBvc3RzIGEgbWVzc2FnZSB0byBpbnZva2UKLSAgICAgKiB0aGlzIG1ldGhvZCBhc3luY2hyb25vdXNseS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHNob3VsZCBleGFtaW5lIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllc30KLSAgICAgKiBpbiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QncyB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSB0byBkZXRlcm1pbmUgd2hhdAotICAgICAqIGtpbmRzIG9mIHJvdXRlcyBpdCBzaG91bGQgdHJ5IHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIGl0IHNob3VsZCBwZXJmb3JtIGFjdGl2ZQotICAgICAqIG9yIHBhc3NpdmUgc2NhbnMuICBJbiBtYW55IGNhc2VzLCB0aGUgcHJvdmlkZXIgbWF5IGJlIGFibGUgdG8gc2F2ZSBwb3dlciBieQotICAgICAqIGRldGVybWluaW5nIHRoYXQgdGhlIHNlbGVjdG9yIGRvZXMgbm90IGNvbnRhaW4gYW55IGNhdGVnb3JpZXMgdGhhdCBpdCBzdXBwb3J0cwotICAgICAqIGFuZCBpdCBjYW4gdGhlcmVmb3JlIGF2b2lkIHBlcmZvcm1pbmcgYW55IHNjYW5zIGF0IGFsbC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoQE51bGxhYmxlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgYW5kCi0gICAgICogdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4gIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkZXNjcmlwdG9yCi0gICAgICogYnkgcmVnaXN0ZXJpbmcgYSB7QGxpbmsgQ2FsbGJhY2sgY2FsbGJhY2t9IHdpdGgge0BsaW5rICNzZXRDYWxsYmFja30uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIHRvIG5vdGlmeSB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQKLSAgICAgKiB7QGxpbmsgQ2FsbGJhY2sgY2FsbGJhY2t9IGFib3V0IHRoZSBjaGFuZ2UgdG8gdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgdXBkYXRlZCByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREZXNjcmlwdG9yKEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmICghbVBlbmRpbmdEZXNjcmlwdG9yQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdEZXNjcmlwdG9yQ2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpIHsKLSAgICAgICAgbVBlbmRpbmdEZXNjcmlwdG9yQ2hhbmdlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLCBtRGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB0byBvYnRhaW4gYSByb3V0ZSBjb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciB3aWxsIGludm9rZSB0aGUge0BsaW5rIFJvdXRlQ29udHJvbGxlciNvblJlbGVhc2V9IG1ldGhvZCBvZiB0aGUgcm91dGUKLSAgICAgKiBjb250cm9sbGVyIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCB0byBhbGxvdyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlSWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICogQHJldHVybiBUaGUgcm91dGUgY29udHJvbGxlci4gIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHJvdXRlIG9yIGlmIHRoZSByb3V0ZQotICAgICAqIGNhbm5vdCBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByb3V0ZSBjb250cm9sbGVyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB0byBvYnRhaW4gYSByb3V0ZSBjb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgcm91dGUgd2hpY2ggaXMgYQotICAgICAqIG1lbWJlciBvZiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVHcm91cH0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciB3aWxsIGludm9rZSB0aGUge0BsaW5rIFJvdXRlQ29udHJvbGxlciNvblJlbGVhc2V9IG1ldGhvZCBvZiB0aGUgcm91dGUKLSAgICAgKiBjb250cm9sbGVyIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCB0byBhbGxvdyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlSWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgbWVtYmVyIHJvdXRlLgotICAgICAqIEBwYXJhbSByb3V0ZUdyb3VwSWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUgZ3JvdXAuCi0gICAgICogQHJldHVybiBUaGUgcm91dGUgY29udHJvbGxlci4gIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHJvdXRlIG9yIGlmIHRoZSByb3V0ZQotICAgICAqIGNhbm5vdCBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByb3V0ZSBjb250cm9sbGVyIGludGVyZmFjZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwKLSAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZUdyb3VwSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVHcm91cElkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2NyaWJlcyBwcm9wZXJ0aWVzIG9mIHRoZSByb3V0ZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJNZXRhZGF0YSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKLQotICAgICAgICBQcm92aWRlck1ldGFkYXRhKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbXBvbmVudE5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgcGFja2FnZSBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgY29tcG9uZW50IG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVyTWV0YWRhdGF7IGNvbXBvbmVudE5hbWU9IgotICAgICAgICAgICAgICAgICAgICArIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkgKyAiIH0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgY29udHJvbCBvdmVyIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIG9idGFpbnMgYSByb3V0ZSBjb250cm9sbGVyIGZvciBhIHJvdXRlIHdoZW5ldmVyIGl0IG5lZWRzCi0gICAgICogdG8gY29udHJvbCBhIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMKLSAgICAgKiB0aGUge0BsaW5rICNvblNlbGVjdH0gbWV0aG9kIG9mIGl0cyByb3V0ZSBjb250cm9sbGVyLiAgV2hpbGUgc2VsZWN0ZWQsCi0gICAgICogdGhlIG1lZGlhIHJvdXRlciBtYXkgY2FsbCBvdGhlciBtZXRob2RzIG9mIHRoZSByb3V0ZSBjb250cm9sbGVyIHRvCi0gICAgICogcmVxdWVzdCB0aGF0IGl0IHBlcmZvcm0gY2VydGFpbiBhY3Rpb25zIHRvIHRoZSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcwotICAgICAqIHVuc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcyB0aGUge0BsaW5rICNvblVuc2VsZWN0fSBtZXRob2Qgb2YgaXRzCi0gICAgICogcm91dGUgY29udHJvbGxlci4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIG5vIGxvbmdlciBuZWVkcyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIGl0IHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgI29uUmVsZWFzZX0gbWV0aG9kIHRvIGFsbG93IHRoZSByb3V0ZSBjb250cm9sbGVyCi0gICAgICogdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgcm91dGUgY29udHJvbGxlcnMgc2ltdWx0YW5lb3VzbHkgYWN0aXZlIGZvciB0aGUKLSAgICAgKiBzYW1lIHJvdXRlLiAgRWFjaCByb3V0ZSBjb250cm9sbGVyIHdpbGwgYmUgcmVsZWFzZWQgc2VwYXJhdGVseS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWxsIG9wZXJhdGlvbnMgb24gdGhlIHJvdXRlIGNvbnRyb2xsZXIgYXJlIGFzeW5jaHJvbm91cyBhbmQKLSAgICAgKiByZXN1bHRzIGFyZSBjb21tdW5pY2F0ZWQgdmlhIGNhbGxiYWNrcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogUmVsZWFzZXMgdGhlIHJvdXRlIGNvbnRyb2xsZXIsIGFsbG93aW5nIGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZWxlY3RzIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVuc2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVuc2VsZWN0cyB0aGUgcm91dGUgYW5kIHByb3ZpZGVzIGEgcmVhc29uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiBjYWxscyB7QGxpbmsgI29uVW5zZWxlY3QoKX0uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgdW5zZWxlY3RpbmcgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblVuc2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgdG8gc2V0IHRoZSB2b2x1bWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSBuZXcgdm9sdW1lIHZhbHVlIGJldHdlZW4gMCBhbmQge0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yI2dldFZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYW4gaW5jcmVtZW50YWwgdm9sdW1lIHVwZGF0ZSBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGEgVGhlIGRlbHRhIHRvIGFkZCB0byB0aGUgY3VycmVudCB2b2x1bWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gcmVxdWVzdAotICAgICAgICAgKiBhc3luY2hyb25vdXNseSBvbiBiZWhhbGYgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0Ci0gICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250cm9sbGVyIGludGVuZHMgdG8gaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsCi0gICAgICAgICAqIGludm9rZSB0aGUgY2FsbGJhY2sgd2hlbiBmaW5pc2hlZC4gIEZhbHNlIGlmIHRoZSBjb250cm9sbGVyIHdpbGwgbm90Ci0gICAgICAgICAqIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbCBub3QgaW52b2tlIHRoZSBjYWxsYmFjay4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2hlbiByb3V0ZSBpbmZvcm1hdGlvbiBiZWNvbWVzIGF2YWlsYWJsZSBvciBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gaW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSBwcm92aWRlciBhbmQgaXRzIHJvdXRlcyBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHRoYXQgY2hhbmdlZCwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIG5ldyBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVySGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcm92aWRlckhhbmRsZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBkZWxpdmVyRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxY2UwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZCB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ST1VURVMgPSAicm91dGVzIjsKLQotICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBtUm91dGVzOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtUm91dGVzID0gcm91dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIHJvdXRlcyB0aGF0IHRoaXMgcHJvdmlkZXIgaGFzIHB1Ymxpc2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gZ2V0Um91dGVzKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlcygpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbUJ1bmRsZS48QnVuZGxlPmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX1JPVVRFUyk7Ci0gICAgICAgICAgICBpZiAocm91dGVCdW5kbGVzID09IG51bGwgfHwgcm91dGVCdW5kbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBDb2xsZWN0aW9ucy48TWVkaWFSb3V0ZURlc2NyaXB0b3I+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlQnVuZGxlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQoTWVkaWFSb3V0ZURlc2NyaXB0b3IuZnJvbUJ1bmRsZShyb3V0ZUJ1bmRsZXMuZ2V0KGkpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGFuZCBhbGwgb2YgdGhlIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgY29udGFpbnMgaGF2ZSBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHZlcmlmaWNhdGlvbiBpcyBkZWVwLiAgSWYgdGhlIHByb3ZpZGVyIGRlc2NyaXB0b3IgaXMga25vd24gdG8gYmUKLSAgICAgKiB2YWxpZCB0aGVuIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCB7QGxpbmsgI2lzVmFsaWR9IG9uIGVhY2ggb2YgaXRzIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwgfHwgIXJvdXRlLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJyb3V0ZXM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRSb3V0ZXMoKS50b0FycmF5KCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBtUm91dGVzOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKLQotICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgICAgIGlmICghZGVzY3JpcHRvci5tUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihkZXNjcmlwdG9yLm1Sb3V0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUm91dGVzLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIGRlc2NyaXB0b3IgYWxyZWFkeSBhZGRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFyb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBhZGRSb3V0ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbGlzdCBvZiByb3V0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBCdWlsZGVyIHNldFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCB8fCByb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5yZW1vdmUoS0VZX1JPVVRFUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4ocm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtUm91dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oY291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByb3V0ZUJ1bmRsZXMuYWRkKG1Sb3V0ZXMuZ2V0KGkpLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX1JPVVRFUywgcm91dGVCdW5kbGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihtQnVuZGxlLCBtUm91dGVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmU5MzQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sIHsKLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIEludGVudH0gdGhhdCBtdXN0IGJlIGRlY2xhcmVkIGFzIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UuCi0gICAgICogUHV0IHRoaXMgaW4geW91ciBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIjsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZpY2UuCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUmVnaXN0ZXIgY2xpZW50LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogY2xpZW50IHZlcnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JFR0lTVEVSID0gMTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVucmVnaXN0ZXIgY2xpZW50LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VTlJFR0lTVEVSID0gMjsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIENyZWF0ZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfUk9VVEVfSUQgOiByb3V0ZSBpZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSID0gMzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlbGVhc2Ugcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUiA9IDQ7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZWxlY3Qgcm91dGUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUgPSA1OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVW5zZWxlY3Qgcm91dGUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSA9IDY7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXQgcm91dGUgdm9sdW1lLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUUgPSA3OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVXBkYXRlIHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBkZWx0YSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FID0gODsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIG9iaiAgICAgOiBtZWRpYSBjb250cm9sIGludGVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUID0gOTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNldHMgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogZGlzY292ZXJ5IHJlcXVlc3QgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCA9IDEwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfUk9VVEVfSUQgPSAicm91dGVJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCA9ICJyb3V0ZUdyb3VwSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiA9ICJ1bnNlbGVjdFJlYXNvbiI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgc2VydmljZSB0byB0aGUgY2xpZW50LgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhbnkgdW5yZWNvZ25pemVkIG9yIG1hbGZvcm1lZCByZXF1ZXN0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkUgPSAwOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGEgc3VjY2Vzc2Z1bCBtZXNzYWdlLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MgPSAxOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHNlcnZlciB2ZXJzaW9uCi0gICAgICogLSBvYmogICAgIDogcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19SRUdJU1RFUkVEID0gMjsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3Qgc3VjY2VzcyByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQgPSAzOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsdXJlIHJlc3VsdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCi0gICAgICogLSBTRVJWSUNFX0RBVEFfRVJST1I6IGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEID0gNDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGNoYW5nZWQuICAodW5zb2xpY2l0ZWQgZXZlbnQpCi0gICAgICogLSBhcmcxICAgIDogcmVzZXJ2ZWQgKDApCi0gICAgICogLSBvYmogICAgIDogcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQgPSA1OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9EQVRBX0VSUk9SID0gImVycm9yIjsKLQotICAgIC8qCi0gICAgICogUmVjb2duaXplZCBjbGllbnQgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgY2xpZW50IHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2xpZW50IHZlcnNpb24gdXNlZCBmcm9tIHN1cHBvcnQgbGlicmFyeSB2MjQuMS4wLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzIgPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCA9IENMSUVOVF9WRVJTSU9OXzI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgc2VydmVyIHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIHNlcnZpY2UgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fMSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBzZXJ2aWNlIHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OX0NVUlJFTlQgPSBTRVJWSUNFX1ZFUlNJT05fMTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fU1RBUlQgPSBDTElFTlRfVkVSU0lPTl8xOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzZW5nZXIgb2JqZWN0IGlzIHZhbGlkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IgYW5kIHVucGFyY2VsaW5nIGNvZGUgZG9lcyBub3QgY2hlY2sgd2hldGhlciB0aGUKLSAgICAgKiBwcm92aWRlZCBJQmluZGVyIGlzIGEgdmFsaWQgSU1lc3NlbmdlciBvYmplY3QuICBBcyBhIHJlc3VsdCwgaXQncyBwb3NzaWJsZQotICAgICAqIGZvciBhIHBlZXIgdG8gc2VuZCBhbiBpbnZhbGlkIElCaW5kZXIgdGhhdCB3aWxsIHJlc3VsdCBpbiBjcmFzaGVzIGRvd25zdHJlYW0uCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgdGhlIG1lc3NlbmdlciBpcyBpbiBhIHZhbGlkIHN0YXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbWVzc2VuZ2VyICE9IG51bGwgJiYgbWVzc2VuZ2VyLmdldEJpbmRlcigpICE9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVzc2VuZ2VyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGEgYmluZGVyIGludGVyZmFjZSBvdGhlciB0aGFuCi0gICAgICAgICAgICAvLyBJTWVzc2VuZ2VyIHRoZW4gdGhlIGNhbGwgdG8gZ2V0QmluZGVyKCkgd2lsbCBjcmFzaCB3aXRoIGFuIE5QRS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NkZTEwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfUk9VVEVfSUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfVU5SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9EQVRBX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9WRVJTSU9OX0NVUlJFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuaXNWYWxpZFJlbW90ZU1lc3NlbmdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXIuRGVhdGhSZWNpcGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KLSAqIDxwPgotICogQSBtZWRpYSByb3V0ZXIgd2lsbCBiaW5kIHRvIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzIHdoZW4gYSBjYWxsYmFjayBpcyBhZGRlZCB2aWEKLSAqIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIE1lZGlhUm91dGVyLkNhbGxiYWNrLCBpbnQpfSB3aXRoIGEgZGlzY292ZXJ5Ci0gKiBmbGFnOiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0sCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9LCBvcgotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0sIGFuZCB3aWxsIHVuYmluZCB3aGVuIHRoZSBjYWxsYmFjawotICogaXMgcmVtb3ZlZCB2aWEge0BsaW5rIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKE1lZGlhUm91dGVyLkNhbGxiYWNrKX0uCi0gKiA8L3A+PHA+Ci0gKiBUbyBpbXBsZW1lbnQgeW91ciBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSwgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kCi0gKiBvdmVycmlkZSB0aGUge0BsaW5rICNvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcn0gbWV0aG9kIHRvIHJldHVybiBhbgotICogaW5zdGFuY2Ugb2YgeW91ciB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfS4KLSAqIDwvcD48cD4KLSAqIERlY2xhcmUgeW91ciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGluIHlvdXIgYXBwbGljYXRpb24gbWFuaWZlc3QKLSAqIGxpa2UgdGhpczoKLSAqIDwvcD4KLSAqIDxwcmU+Ci0gKiAgICZsdDtzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLk15TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSIKLSAqICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL215X21lZGlhX3JvdXRlX3Byb3ZpZGVyX3NlcnZpY2UiPgotICogICAgICAgJmx0O2ludGVudC1maWx0ZXI+Ci0gKiAgICAgICAgICAgJmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSIgLz4KLSAqICAgICAgICZsdDsvaW50ZW50LWZpbHRlcj4KLSAqICAgJmx0Oy9zZXJ2aWNlPgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyU3J2IjsgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2xpZW50UmVjb3JkPiBtQ2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8Q2xpZW50UmVjb3JkPigpOwotICAgIHByaXZhdGUgZmluYWwgUmVjZWl2ZUhhbmRsZXIgbVJlY2VpdmVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2s7Ci0KLSAgICBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIEludGVudH0gdGhhdCBtdXN0IGJlIGRlY2xhcmVkIGFzIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UuCi0gICAgICogUHV0IHRoaXMgaW4geW91ciBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9IE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFOwotCi0gICAgLyoKLSAgICAgKiBQcml2YXRlIG1lc3NhZ2VzIHVzZWQgaW50ZXJuYWxseS4gIChZZXMsIHlvdSBjYW4gcmVudW1iZXIgdGhlc2UuKQotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX01TR19DTElFTlRfRElFRCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSgpIHsKLSAgICAgICAgbVJlY2VpdmVIYW5kbGVyID0gbmV3IFJlY2VpdmVIYW5kbGVyKHRoaXMpOwotICAgICAgICBtUmVjZWl2ZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobVJlY2VpdmVIYW5kbGVyKTsKLSAgICAgICAgbVByaXZhdGVIYW5kbGVyID0gbmV3IFByaXZhdGVIYW5kbGVyKCk7Ci0gICAgICAgIG1Qcm92aWRlckNhbGxiYWNrID0gbmV3IFByb3ZpZGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHN5c3RlbSB3aGVuIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogdGhpcyBzZXJ2aWNlIGhhcyBkZWNpZGVkIG5vdCB0byBvZmZlciBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBNZWRpYVJvdXRlUHJvdmlkZXIgb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKLSAgICAgKiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRNZWRpYVJvdXRlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoU0VSVklDRV9JTlRFUkZBQ0UpKSB7Ci0gICAgICAgICAgICBpZiAobVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlclBhY2thZ2UgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcHJvdmlkZXJQYWNrYWdlLmVxdWFscyhnZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKSByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImEgcHJvdmlkZXIgd2hvc2UgcGFja2FnZSBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBwYWNrYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmFtZSBvZiB0aGUgc2VydmljZS4gIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBjYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvbmx5IGV4cG9ydCBpdHMgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVycy4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiUHJvdmlkZXIgcGFja2FnZSBuYW1lOiAiICsgcHJvdmlkZXJQYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gIFNlcnZpY2UgcGFja2FnZSBuYW1lOiAiICsgZ2V0UGFja2FnZU5hbWUoKSArICIuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SZWNlaXZlTWVzc2VuZ2VyLmdldEJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKG1Qcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIGlmICh2ZXJzaW9uID49IENMSUVOVF9WRVJTSU9OXzEpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbmV3IENsaWVudFJlY29yZChtZXNzZW5nZXIsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIGlmIChjbGllbnQucmVnaXN0ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJlZ2lzdGVyZWQsIHZlcnNpb249IiArIHZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbVByb3ZpZGVyLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgU0VSVklDRV9WRVJTSU9OX0NVUlJFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVW5yZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBVbnJlZ2lzdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgb25CaW5kZXJEaWVkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IEJpbmRlciBkaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQuY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCwgY29udHJvbGxlcklkKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2xsZXIgY3JlYXRlZCwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJvdXRlSWQ9IiArIHJvdXRlSWQgKyAiLCByb3V0ZUdyb3VwSWQ9IiArIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWxlYXNlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LnJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2xsZXIgcmVsZWFzZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBzZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVuc2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCByZWFzb24pIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QocmVhc29uKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB1bnNlbGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2V0Um91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIGNoYW5nZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIHZvbHVtZT0iICsgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVwZGF0ZVJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVXBkYXRlVm9sdW1lKGRlbHRhKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgdXBkYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgZGVsdGE9IiArIGRlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJvdXRlQ29udHJvbFJlcXVlc3QoZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciwgZmluYWwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBjb250cm9sbGVySWQsIGZpbmFsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgZmluYWwgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWxlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZXJyb3I9IiArIGVycm9yICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoU0VSVklDRV9EQVRBX0VSUk9SLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5vbkNvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZGVsaXZlcmVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgaW50ZW50PSIgKyBpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldERpc2NvdmVyeVJlcXVlc3QoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0dWFsbHlDaGFuZ2VkID0gY2xpZW50LnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNldCBkaXNjb3ZlcnkgcmVxdWVzdCwgcmVxdWVzdD0iICsgcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBhY3R1YWxseUNoYW5nZWQ9IiArIGFjdHVhbGx5Q2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0PSIgKyBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgIHNlbmRSZXBseShjbGllbnQubU1lc3NlbmdlciwgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VELCAwLCAwLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLCBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2VudCBkZXNjcmlwdG9yIGNoYW5nZSBldmVudCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgQnVuZGxlIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgIGludCBjbGllbnRWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKGRlc2NyaXB0b3IpOwotICAgICAgICBidWlsZGVyLnNldFJvdXRlcyhudWxsKTsKLSAgICAgICAgZm9yIChNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA6IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnRWZXJzaW9uID49IHJvdXRlLmdldE1pbkNsaWVudFZlcnNpb24oKQotICAgICAgICAgICAgICAgICAgICAmJiBjbGllbnRWZXJzaW9uIDw9IHJvdXRlLmdldE1heENsaWVudFZlcnNpb24oKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCkuYXNCdW5kbGUoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIHNlbGVjdG9yQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9IG1DbGllbnRzLmdldChpKS5tRGlzY292ZXJ5UmVxdWVzdDsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKCFyZXF1ZXN0LmdldFNlbGVjdG9yKCkuaXNFbXB0eSgpIHx8IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlU2NhbiB8PSByZXF1ZXN0LmlzQWN0aXZlU2NhbigpOwotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgPSByZXF1ZXN0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKGNvbXBvc2l0ZS5nZXRTZWxlY3RvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIuYWRkU2VsZWN0b3IocmVxdWVzdC5nZXRTZWxlY3RvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wb3NpdGUgPSBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qoc2VsZWN0b3JCdWlsZGVyLmJ1aWxkKCksIGFjdGl2ZVNjYW4pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QsIGNvbXBvc2l0ZSkpIHsKLSAgICAgICAgICAgIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0ID0gY29tcG9zaXRlOwotICAgICAgICAgICAgbVByb3ZpZGVyLnNldERpc2NvdmVyeVJlcXVlc3QoY29tcG9zaXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsaWVudFJlY29yZCBnZXRDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gbUNsaWVudHMuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgfQotCi0gICAgaW50IGZpbmRDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQuaGFzTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNGYWlsdXJlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkUsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljU3VjY2VzcyhNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2VuZFJlcGx5KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB3aGF0LAotICAgICAgICAgICAgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigpOwotICAgICAgICBtc2cud2hhdCA9IHdoYXQ7Ci0gICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICBtc2cuYXJnMiA9IGFyZzsKLSAgICAgICAgbXNnLm9iaiA9IG9iajsKLSAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXNzZW5nZXIuc2VuZChtc2cpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUaGUgY2xpZW50IGRpZWQuCi0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byAiICsgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSwgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRDbGllbnRJZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIHJldHVybiAiQ2xpZW50IGNvbm5lY3Rpb24gIiArIG1lc3Nlbmdlci5nZXRCaW5kZXIoKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJpdmF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJpdmF0ZUhhbmRsZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQ6Ci0gICAgICAgICAgICAgICAgICAgIG9uQmluZGVyRGllZCgoTWVzc2VuZ2VyKW1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7Ci0gICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBzZW5kRGVzY3JpcHRvckNoYW5nZWQoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENsaWVudFJlY29yZCBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lc3NlbmdlciBtTWVzc2VuZ2VyOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1WZXJzaW9uOwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPQotICAgICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyPigpOwotCi0gICAgICAgIHB1YmxpYyBDbGllbnRSZWNvcmQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgICAgIG1NZXNzZW5nZXIgPSBtZXNzZW5nZXI7Ci0gICAgICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbU1lc3Nlbmdlci5nZXRCaW5kZXIoKS5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGJpbmRlckRpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnZhbHVlQXQoaSkub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuY2xlYXIoKTsKLQotICAgICAgICAgICAgbU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBzZXREaXNjb3ZlcnlSZXF1ZXN0KG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTWVzc2VuZ2VyKE1lc3NlbmdlciBvdGhlcikgewotICAgICAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkgPT0gb3RoZXIuZ2V0QmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQsCi0gICAgICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sbGVycy5pbmRleE9mS2V5KGNvbnRyb2xsZXJJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGVHcm91cElkID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySWQsIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWxlYXNlUm91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucmVtb3ZlKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGdldFJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgewotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVucyBvbiBhIGJpbmRlciB0aHJlYWQuCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQsIG1NZXNzZW5nZXIpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2xpZW50SWQobU1lc3Nlbmdlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgc3RhdGljIGFuZCBvbmx5IHJldGFpbnMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc2VydmljZQotICAgICAqIHRvIHByZXZlbnQgdGhlIHNlcnZpY2UgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSBvbmUgb2YgdGhlIGNsaWVudHMgaXMgaG9sZGluZyBhbgotICAgICAqIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhlIHNlcnZlcidzIG1lc3Nlbmdlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBoYW5kbGVyIHNob3VsZCBub3QgYmUgdXNlZCB0byBoYW5kbGUgYW55IG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhvc2UKLSAgICAgKiB0aGF0IGNvbWUgZnJvbSB0aGUgY2xpZW50LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4gbVNlcnZpY2VSZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAgICAgbVNlcnZpY2VSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPihzZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyID0gbXNnLnJlcGx5VG87Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcyOwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBkYXRhID0gbXNnLnBlZWtEYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzTWVzc2FnZSh3aGF0LCBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCBvYmosIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBnZXRDbGllbnRJZChtZXNzZW5nZXIpICsgIjogTWVzc2FnZSBmYWlsZWQsIHdoYXQ9IiArIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZXF1ZXN0SWQ9IiArIHJlcXVlc3RJZCArICIsIGFyZz0iICsgYXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgb2JqPSIgKyBvYmogKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY0ZhaWx1cmUobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIklnbm9yaW5nIG1lc3NhZ2Ugd2l0aG91dCB2YWxpZCByZXBseSBtZXNzZW5nZXIuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlKGludCB3aGF0LAotICAgICAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UgPSBtU2VydmljZVJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFR0lTVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWdpc3RlckNsaWVudChtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uVW5yZWdpc3RlckNsaWVudChtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUdyb3VwSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYXNvbiA9IGRhdGEgPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uVW5zZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByZWFzb24pOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldFJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uVXBkYXRlUm91dGVWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgKEludGVudClvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuZnJvbUJ1bmRsZSgoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXREaXNjb3ZlcnlSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ICE9IG51bGwgJiYgcmVxdWVzdC5pc1ZhbGlkKCkgPyByZXF1ZXN0IDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjliMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHJvdXRlcyB0aGF0IGFwcGxpY2F0aW9ucyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB1c2UuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHByZT4KLSAqIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICogICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKQotICogICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gKiAgICAgICAgIC5idWlsZCgpOwotICoKLSAqIE1lZGlhUm91dGVyIHJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICogcm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVTZWxlY3RvciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9DQVRFR09SSUVTID0gImNvbnRyb2xDYXRlZ29yaWVzIjsKLQotICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRoYXQgd2lsbCBub3QgbWF0Y2ggYW55IHJvdXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBFTVBUWSA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IobmV3IEJ1bmRsZSgpLCBudWxsKTsKLQotICAgIE1lZGlhUm91dGVTZWxlY3RvcihCdW5kbGUgYnVuZGxlLCBMaXN0PFN0cmluZz4gY29udHJvbENhdGVnb3JpZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gY29udHJvbENhdGVnb3JpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllc30gaW4gdGhlIHNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjYXRlZ29yaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXM7Ci0gICAgfQotCi0gICAgdm9pZCBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfQ09OVFJPTF9DQVRFR09SSUVTKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCB8fCBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gY2hlY2suCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjYXRlZ29yeSBpcyBwcmVzZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2xDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGkpLmVxdWFscyhjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGxpc3Qgb2YgY29udHJvbCBmaWx0ZXJzIHRvIGNvbnNpZGVyLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoIGlzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNDb250cm9sRmlsdGVycyhMaXN0PEludGVudEZpbHRlcj4gZmlsdGVycykgewotICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKGNhdGVnb3J5Q291bnQgIT0gMCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWx0ZXJDb3VudCA9IGZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gZmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjYXRlZ29yeUNvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VsZWN0b3IgY29udGFpbnMgYWxsIG9mIHRoZSBjYXBhYmlsaXRpZXMgZGVzY3JpYmVkCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gYmUgZXhhbWluZWQuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgc2VsZWN0b3IgY29udGFpbnMgYWxsIG9mIHRoZSBjYXBhYmlsaXRpZXMgZGVzY3JpYmVkCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWluc0FsbChzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGRvZXMgbm90IHNwZWNpZnkgYW55IGNhcGFiaWxpdGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWVkaWFSb3V0ZVNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igb3RoZXIgPSAoTWVkaWFSb3V0ZVNlbGVjdG9yKW87Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgb3RoZXIuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuZXF1YWxzKG90aGVyLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVTZWxlY3RvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImNvbnRyb2xDYXRlZ29yaWVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Q29udHJvbENhdGVnb3JpZXMoKS50b0FycmF5KCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVTZWxlY3RvciBmcm9tQnVuZGxlKEBOdWxsYWJsZSBCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IG1lZGlhIHJvdXRlIHNlbGVjdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgc2VsZWN0b3IgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHNlbGVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGlmICghc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnl9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLCBzdWNoIGFzCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3J5KEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllc30gdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzIFRoZSBsaXN0IGNhdGVnb3JpZXMgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcmllcyhATm9uTnVsbCBDb2xsZWN0aW9uPFN0cmluZz4gY2F0ZWdvcmllcykgewotICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3JpZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY2F0ZWdvcnkgOiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xDYXRlZ29yeShjYXRlZ29yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgbWVkaWEgcm91dGUgc2VsZWN0b3IgdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgbWVkaWEgcm91dGUgc2VsZWN0b3Igd2hvc2UgY29udGVudHMgYXJlIHRvIGJlIGFkZGVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFNlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZENvbnRyb2xDYXRlZ29yaWVzKHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfQ09OVFJPTF9DQVRFR09SSUVTLCBtQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IoYnVuZGxlLCBtQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDA1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5BY3Rpdml0eU1hbmFnZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLlZvbHVtZVByb3ZpZGVyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlByb3ZpZGVyTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIE1lZGlhUm91dGVyIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscwotICogYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuCi0gKiA8cD4KLSAqIEEgTWVkaWFSb3V0ZXIgaW5zdGFuY2UgaXMgcmV0cmlldmVkIHRocm91Z2gge0BsaW5rICNnZXRJbnN0YW5jZX0uICBBcHBsaWNhdGlvbnMKLSAqIGNhbiBxdWVyeSB0aGUgbWVkaWEgcm91dGVyIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgYW5kIGl0cyBjYXBhYmlsaXRpZXMKLSAqIHRvIGRldGVybWluZSBob3cgdG8gc2VuZCBjb250ZW50IHRvIHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLiAgQXBwbGljYXRpb25zIGNhbgotICogYWxzbyB7QGxpbmsgUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdCBzZW5kIGNvbnRyb2wgcmVxdWVzdHN9IHRvIHRoZSByb3V0ZQotICogdG8gYXNrIHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZW1vdGUgY29udHJvbCBmdW5jdGlvbnMKLSAqIHN1Y2ggYXMgcGxheWluZyBtZWRpYS4KLSAqIDwvcD48cD4KLSAqIFNlZSBhbHNvIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgYW4gYXBwbGljYXRpb24KLSAqIGNhbiBwdWJsaXNoIG5ldyBtZWRpYSByb3V0ZXMgdG8gdGhlIG1lZGlhIHJvdXRlci4KLSAqIDwvcD48cD4KLSAqIFRoZSBtZWRpYSByb3V0ZXIgQVBJIGlzIG5vdCB0aHJlYWQtc2FmZTsgYWxsIGludGVyYWN0aW9ucyB3aXRoIGl0IG11c3QgYmUKLSAqIGRvbmUgZnJvbSB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3MuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXIiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSByZWFzb24gdGhlIHJvdXRlCi0gICAgICogd2FzIHVuc2VsZWN0ZWQgaXMgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fVU5LTk9XTiA9IDA7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKLSAgICAgKiB0aGUgZGlzY29ubmVjdCBidXR0b24gdG8gZGlzY29ubmVjdCBhbmQga2VlcCBwbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlRGVzY3JpcHRvciNjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQgPSAxOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIHN0b3AgY2FzdGluZyBidXR0b24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgPSAyOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBzZWxlY3RlZAotICAgICAqIGEgZGlmZmVyZW50IHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEID0gMzsKLQotICAgIC8vIE1haW50YWlucyBnbG9iYWwgbWVkaWEgcm91dGVyIHN0YXRlIGZvciB0aGUgcHJvY2Vzcy4KLSAgICAvLyBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIGluIE1lZGlhUm91dGVyLmdldEluc3RhbmNlKCkgYmVmb3JlIGFueQotICAgIC8vIE1lZGlhUm91dGVyIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBzbyBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCi0gICAgLy8gdmFsaWQgd2hlbmV2ZXIgYW55IGluc3RhbmNlIG1ldGhvZCBpcyBpbnZva2VkLgotICAgIHN0YXRpYyBHbG9iYWxNZWRpYVJvdXRlciBzR2xvYmFsOwotCi0gICAgLy8gQ29udGV4dC1ib3VuZCBzdGF0ZSBvZiB0aGUgbWVkaWEgcm91dGVyLgotICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtQ2FsbGJhY2tSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4oKTsKLQotICAgIEBJbnREZWYoZmxhZyA9IHRydWUsCi0gICAgICAgICAgICB2YWx1ZSA9IHsKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOLAotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZLAotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCi0gICAgICAgICAgICB9Ci0gICAgKQotICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ2FsbGJhY2tGbGFncyB7fQotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IEFjdGl2ZWx5IHNjYW4gZm9yIHJvdXRlcyB3aGlsZSB0aGlzIGNhbGxiYWNrCi0gICAgICogaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCBhY3RpdmVseSBzY2FuIGZvciBuZXcKLSAgICAgKiByb3V0ZXMuICBDZXJ0YWluIHJvdXRlcywgc3VjaCBhcyB3aWZpIGRpc3BsYXkgcm91dGVzLCBtYXkgbm90IGJlIGRpc2NvdmVyYWJsZQotICAgICAqIGV4Y2VwdCB3aGVuIGFjdGl2ZWx5IHNjYW5uaW5nLiAgVGhpcyBmbGFnIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIHJvdXRlIHBpY2tlcgotICAgICAqIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQgYnkgdGhlIHVzZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHJvdXRlIGluZm9ybWF0aW9uIGlzCi0gICAgICogdXAgdG8gZGF0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWN0aXZlIHNjYW5uaW5nIG1heSBjb25zdW1lIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHBvd2VyIGFuZCBtYXkgaGF2ZSBpbnRydXNpdmUKLSAgICAgKiBlZmZlY3RzIG9uIHdpcmVsZXNzIGNvbm5lY3Rpdml0eS4gIFRoZXJlZm9yZSBpdCBpcyBpbXBvcnRhbnQgdGhhdCBhY3RpdmUgc2Nhbm5pbmcKLSAgICAgKiBvbmx5IGJlIHJlcXVlc3RlZCB3aGVuIGl0IGlzIGFjdHVhbGx5IG5lZWRlZCB0byBzYXRpc2Z5IGEgdXNlciByZXF1ZXN0IHRvCi0gICAgICogZGlzY292ZXIgYW5kIHNlbGVjdCBhIG5ldyByb3V0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBmbGFnIGltcGxpZXMge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBidXQgcGVyZm9ybWluZwotICAgICAqIGFjdGl2ZSBzY2FucyBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIHRoYW4gYSBub3JtYWwgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBEbyBub3QgZmlsdGVyIHJvdXRlIGV2ZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCBhbnkKLSAgICAgKiByb3V0ZSBldmVuIGlmIHRoZXkgZG8gbm90IG1hdGNoIHRoZSBjYWxsYmFjaydzIGZpbHRlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyA9IDEgPDwgMTsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBSZXF1ZXN0IHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IHdoaWxlIHRoaXMKLSAgICAgKiBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCBleGNlcHQgb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIHRyeSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogQWx0aG91Z2ggcm91dGUgZGlzY292ZXJ5IGlzIGludGVuZGVkIHRvIGJlIGVmZmljaWVudCwgY2hlY2tpbmcgZm9yIG5ldyByb3V0ZXMgbWF5Ci0gICAgICogcmVzdWx0IGluIHNvbWUgbmV0d29yayBhY3Rpdml0eSBhbmQgY291bGQgc2xvd2x5IGRyYWluIHRoZSBiYXR0ZXJ5LiAgVGhlcmVmb3JlCi0gICAgICogYXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHNwZWNpZnkge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSB3aGVuCi0gICAgICogdGhleSBhcmUgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgd291bGQgbGlrZSB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggdGhlCi0gICAgICogb3B0aW9uIG9mIGNvbm5lY3RpbmcgdG8gbmV3IHJvdXRlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQXBwbGljYXRpb25zIHNob3VsZCB0eXBpY2FsbHkgYWRkIGEgY2FsbGJhY2sgdXNpbmcgdGhpcyBmbGFnIGluIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eSdzfSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0fQotICAgICAqIG1ldGhvZCBhbmQgcmVtb3ZlIGl0IGluIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcH0gbWV0aG9kLgotICAgICAqIFRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnR9IGZyYWdtZW50IG1heQotICAgICAqIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAqIDwvcD48cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgZmxhZwotICAgICAqIHdpbGwgYmUgaWdub3JlZC4gIFJlZmVyIHRvCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSA9IDEgPDwgMjsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBSZXF1ZXN0IHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IHdoaWxlIHRoaXMKLSAgICAgKiBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCBldmVuIG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZID0gMSA8PCAzOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfTogSWdub3JlIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbWF0Y2hpbmcgbm9uLWRlZmF1bHQgcm91dGUgaXMgYXZhaWxhYmxlLgotICAgICAqIFRoaXMgY29uc3RyYWludCBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBvZmZlciB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cKLSAgICAgKiB0byB0aGUgdXNlci4gIFRoZXJlIGlzIG5vIHBvaW50IG9mZmVyaW5nIHRoZSBjaG9vc2VyIGlmIHRoZXJlIGFyZSBubwotICAgICAqIG5vbi1kZWZhdWx0IGNob2ljZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFID0gMSA8PCAwOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfTogUmVxdWlyZSBhbiBhY3R1YWwgcm91dGUgdG8gYmUgbWF0Y2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlbiB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IHdpbGwgcmV0dXJuIHRydWUKLSAgICAgKiBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYgZGlzY292ZXJ5IGlzIG5vdCBpbgotICAgICAqIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4gIFRoaXMgZmVhdHVyZSBpcyB1c2VkIHRvCi0gICAgICogc2F2ZSByZXNvdXJjZXMgYnkgcmVtb3ZpbmcgdGhlIG5lZWQgdG8gcGVyZm9ybSBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSBvbgotICAgICAqIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbiB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZgotICAgICAqIGEgbWF0Y2hpbmcgcm91dGUgaGFzIGFjdHVhbGx5IGJlZW4gZGlzY292ZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCA9IDEgPDwgMTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBob2xkaW5nIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuZWQKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGluc3RhbmNlLCBzdWNoIGFzIGJ5IHN0b3JpbmcgdGhlIGluc3RhbmNlIGluIGEgZmllbGQgb2YKLSAgICAgKiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwgdG8gZW5zdXJlIHRoYXQgdGhlIG1lZGlhIHJvdXRlciByZW1haW5zIGFsaXZlCi0gICAgICogYXMgbG9uZyBhcyB0aGUgYXBwbGljYXRpb24gaXMgdXNpbmcgaXRzIGZlYXR1cmVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHN1cHBvcnQgbGlicmFyeSBvbmx5IGhvbGRzIGEge0BsaW5rIFdlYWtSZWZlcmVuY2Ugd2VhayByZWZlcmVuY2V9Ci0gICAgICogdG8gZWFjaCBtZWRpYSByb3V0ZXIgaW5zdGFuY2UuICBXaGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgc3Ryb25nIHJlZmVyZW5jZXMgdG8gdGhlCi0gICAgICogbWVkaWEgcm91dGVyIGluc3RhbmNlLCBhbGwgb2YgaXRzIGNhbGxiYWNrcyB3aWxsIGJlIHJlbW92ZWQgYW5kIHJvdXRlIGRpc2NvdmVyeQotICAgICAqIHdpbGwgbm8gbG9uZ2VyIGJlIHBlcmZvcm1lZCBvbiBpdHMgYmVoYWxmLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZSBmb3IgdGhlIGNvbnRleHQuICBUaGUgYXBwbGljYXRpb24gbXVzdCBob2xkCi0gICAgICogYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0IGFzIGxvbmcgYXMgaXQgaXMgaW4gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZXIgZ2V0SW5zdGFuY2UoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHNHbG9iYWwgPSBuZXcgR2xvYmFsTWVkaWFSb3V0ZXIoY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgICAgICBzR2xvYmFsLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGVzfSBjdXJyZW50bHkga25vd24gdG8KLSAgICAgKiB0aGlzIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcm91dGUgcHJvdmlkZXJzfQotICAgICAqIGN1cnJlbnRseSBrbm93biB0byB0aGlzIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFByb3ZpZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHBsYXlpbmcgbWVkaWEgY29udGVudCBvbiB0aGUgc3lzdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzeXN0ZW0gYWx3YXlzIHByb3ZpZGVzIGEgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHJvdXRlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBibHVldG9vdGggcm91dGUgZm9yIHBsYXlpbmcgbWVkaWEgY29udGVudCBvbiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGJsdWV0b290aCByb3V0ZSwgaWYgZXhpc3QsIG90aGVyd2lzZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRCbHVldG9vdGhSb3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGV4YW1pbmUgdGhlIHJvdXRlJ3MKLSAgICAgKiB7QGxpbmsgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIG1lZGlhIGNvbnRyb2wgaW50ZW50IGZpbHRlcnN9IHRvIGFzc2VzcyB0aGUKLSAgICAgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIHJvdXRlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVzZSBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgYm9vbGVhbiBwbGF5TW92aWUoKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgKgotICAgICAqICAgICAvLyBGaXJzdCB0cnkgdXNpbmcgdGhlIHJlbW90ZSBwbGF5YmFjayBpbnRlcmZhY2UsIGlmIHN1cHBvcnRlZC4KLSAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrLgotICAgICAqICAgICAgICAgLy8gVHJ5IHRvIHNlbmQgaXQgdGhlIFVyaSBvZiB0aGUgbW92aWUgdG8gcGxheS4KLSAgICAgKiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgICogICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoImh0dHA6Ly9leGFtcGxlLmNvbS92aWRlb3MvbW92aWUubXA0IiwgInZpZGVvL21wNCIpOwotICAgICAqICAgICAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgewotICAgICAqICAgICAgICAgICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG51bGwpOwotICAgICAqICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBzZW50IHRoZSByZXF1ZXN0IHRvIHBsYXkgdGhlIG1vdmllCi0gICAgICogICAgICAgICB9Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBJZiByZW1vdGUgcGxheWJhY2sgd2FzIG5vdCBwb3NzaWJsZSwgdGhlbiBwbGF5IGxvY2FsbHkuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKLSAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyBsaXZlIHZpZGVvIHN0cmVhbWluZy4KLSAgICAgKiAgICAgICAgIC8vIFByZXBhcmUgdG8gcGxheSBjb250ZW50IGxvY2FsbHkgaW4gYSB3aW5kb3cgb3IgaW4gYSBwcmVzZW50YXRpb24uCi0gICAgICogICAgICAgICByZXR1cm4gcGxheU1vdmllSW5XaW5kb3coKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIE5laXRoZXIgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCwgc28gd2UgY2FuJ3QgcGxheSB0aGUgbW92aWUgdG8gdGhpcyByb3V0ZS4KLSAgICAgKiAgICAgcmV0dXJuIGZhbHNlOwotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIHJvdXRlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycwotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5Ci0gICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvciwgb3RoZXJ3aXNlCi0gICAgICogc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgcmV0dXJucyBpdC4gSWYgdGhlcmUgaXMgb25lIGxpdmUgYXVkaW8gcm91dGUKLSAgICAgKiAodXN1YWxseSBCbHVldG9vdGggQTJEUCksIGl0IHdpbGwgYmUgc2VsZWN0ZWQgaW5zdGVhZCBvZiBkZWZhdWx0IHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaC4KLSAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvdXRlIGlmIGl0IG1hdGNoZWQgdGhlIHNlbGVjdG9yLCBvdGhlcndpc2UgdGhlCi0gICAgICogbmV3bHkgc2VsZWN0ZWQgZGVmYXVsdCByb3V0ZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVTZWxlY3RvcgotICAgICAqIEBzZWUgUm91dGVJbmZvI21hdGNoZXNTZWxlY3RvcgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyB1cGRhdGVTZWxlY3RlZFJvdXRlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlU2VsZWN0ZWRSb3V0ZTogIiArIHNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgaWYgKCFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmICFyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICByb3V0ZSA9IHNHbG9iYWwuY2hvb3NlRmFsbGJhY2tSb3V0ZSgpOwotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvdXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gc2VsZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VsZWN0Um91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShyb3V0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5zZWxlY3RzIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGluc3RlYWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlYXNvbiBnaXZlbiBtdXN0IGJlIG9uZSBvZjoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZyB0aGUgY3VycmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgIGlmIChyZWFzb24gPCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTiB8fAotICAgICAgICAgICAgICAgIHJlYXNvbiA+IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCByZWFzb24gdG8gdW5zZWxlY3Qgcm91dGUiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAvLyBDaG9vc2UgdGhlIGZhbGxiYWNrIHJvdXRlIGlmIGl0J3Mgbm90IGFscmVhZHkgc2VsZWN0ZWQuCi0gICAgICAgIC8vIE90aGVyd2lzZSwgc2VsZWN0IHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICBSb3V0ZUluZm8gZmFsbGJhY2tSb3V0ZSA9IHNHbG9iYWwuY2hvb3NlRmFsbGJhY2tSb3V0ZSgpOwotICAgICAgICBpZiAoc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgIT0gZmFsbGJhY2tSb3V0ZSkgewotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShmYWxsYmFja1JvdXRlLCByZWFzb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgcm91dGUgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgYXZhaWxhYmxlIHJvdXRlcyB0aGF0IG1hdGNoIHRoZQotICAgICAqIHNlbGVjdG9yIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLiBJZiB0aGUKLSAgICAgKiB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBmbGFnIGlzIHNwZWNpZmllZCwgdGhlbgotICAgICAqIHRoZSBtZXRob2Qgd2lsbCBvbmx5IGNvbnNpZGVyIG5vbi1kZWZhdWx0IHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIG1ldGhvZAotICAgICAqIHdpbGwgcmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmCi0gICAgICogZGlzY292ZXJ5IGlzIG5vdCBpbiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuCi0gICAgICogVXNlIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0gdG8gcmVxdWlyZSBhbiBhY3R1YWwgbWF0Y2guCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIGEgcm91dGUgbWF5IGJlCi0gICAgICogICAgICAgICAgICBhdmFpbGFibGUuIE1heSBiZSB6ZXJvIG9yIHNvbWUgY29tYmluYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGFuZAotICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaGluZyByb3V0ZSBtYXkgYmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICByZXR1cm4gc0dsb2JhbC5pc1JvdXRlQXZhaWxhYmxlKHNlbGVjdG9yLCBmbGFncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KX0gd2l0aG91dCBmbGFncy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCi0gICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKLSAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2VsZWN0b3IgZGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8KLSAgICAgKiBkaXNjb3Zlci4gIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlCi0gICAgICogbGl2ZSBhdWRpbyByb3V0ZXMgdGhlbiBpdCBzaG91bGQgaW5jbHVkZSB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU8gbGl2ZSBhdWRpbyBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yeX0KLSAgICAgKiBpbiBpdHMgc2VsZWN0b3Igd2hlbiBpdCBhZGRzIGEgY2FsbGJhY2sgdG8gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiBUaGUgc2VsZWN0b3IgbWF5IGluY2x1ZGUgYW55IG51bWJlciBvZiBjYXRlZ29yaWVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCB0aGVuIHRoZSBzZWxlY3RvciBpcyBhZGRlZCB0bwotICAgICAqIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGJlaW5nIG1vbml0b3JlZCBieSB0aGUgY2FsbGJhY2suCi0gICAgICogPC9wPjxwPgotICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBjYWxsYmFjayB3aWxsIG9ubHkgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IHJvdXRlcwotICAgICAqIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4gIEV2ZW50IGZpbHRlcmluZyBtYXkgYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZwotICAgICAqIHRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9IGZsYWcgd2hlbiB0aGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gbWV0aG9kIHRvIGRldGVybWluZQotICAgICAqIHdoZXRoZXIgaXMgaXQgcG9zc2libGUgdG8gZGlzY292ZXIgYSByb3V0ZSB3aXRoIHRoZSBkZXNpcmVkIGNhcGFiaWxpdGllcwotICAgICAqIGFuZCB0aGVyZWZvcmUgd2hldGhlciB0aGUgbWVkaWEgcm91dGUgYnV0dG9uIHNob3VsZCBiZSBzaG93biB0byB0aGUgdXNlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBpcyBpbiB0aGUgZm9yZWdyb3VuZCB0byByZXF1ZXN0IHRoYXQgcGFzc2l2ZSBkaXNjb3ZlcnkgYmUgcGVyZm9ybWVkIGlmIHRoZXJlIGFyZQotICAgICAqIHN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIGFsbG93IGNvbnRpbnVvdXMgcGFzc2l2ZSBkaXNjb3ZlcnkuCi0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgZmxhZyB3aWxsIGJlCi0gICAgICogaWdub3JlZCB0byBjb25zZXJ2ZSByZXNvdXJjZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoZW4KLSAgICAgKiBwYXNzaXZlIGRpc2NvdmVyeSBhYnNvbHV0ZWx5IG11c3QgYmUgcGVyZm9ybWVkLCBldmVuIG9uIGxvdy1SQU0gZGV2aWNlcy4KLSAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcwotICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgotICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKLSAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICogbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgaXMgc2hvd2luZyB0byBjb25maXJtIHRoZSBwcmVzZW5jZSBvZiBhdmFpbGFibGUKLSAgICAgKiByb3V0ZXMgdGhhdCB0aGUgdXNlciBtYXkgY29ubmVjdCB0by4gIFRoaXMgZmxhZyBtYXkgdXNlIHN1YnN0YW50aWFsbHkgbW9yZQotICAgICAqIHBvd2VyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgICoKLSAgICAgKiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbVJvdXRlciA9IE1lZGlhcm91dGVyLmdldEluc3RhbmNlKHRoaXMpOwotICAgICAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAgICAgKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gICAgICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAgICAgKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcwotICAgICAqICAgICAvLyB0aGUgYXBwbGljYXRpb24gaXMgaW50ZXJlc3RlZCBpbiBzbyB0aGF0IGl0IGNhbiB0cnkgdG8gZGlzY292ZXIgc3VpdGFibGUgb25lcy4KLSAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gICAgICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICAgICAqCi0gICAgICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKLSAgICAgKiAgICAgLy8gbmVlZHMgdG8gaW52ZXN0IGVmZm9ydCB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIG9mIHRoZXNlIGtpbmRzIGZvciBub3cuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAqCi0gICAgICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNeUNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4KLSAgICAgKiBNYXkgYmUgemVybyBvciBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBhbmQKLSAgICAgKiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIEBDYWxsYmFja0ZsYWdzIGludCBmbGFncykgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRDYWxsYmFjazogc2VsZWN0b3I9IiArIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY2FsbGJhY2s9IiArIGNhbGxiYWNrICsgIiwgZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcoZmxhZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIENhbGxiYWNrUmVjb3JkIHJlY29yZDsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENhbGxiYWNrUmVjb3JkKGNhbGxiYWNrKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgcmVjb3JkID0gbmV3IENhbGxiYWNrUmVjb3JkKHRoaXMsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFja1JlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBtQ2FsbGJhY2tSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKChmbGFncyAmIH5yZWNvcmQubUZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICByZWNvcmQubUZsYWdzIHw9IGZsYWdzOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXJlY29yZC5tU2VsZWN0b3IuY29udGFpbnMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICByZWNvcmQubVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKHJlY29yZC5tU2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRTZWxlY3RvcihzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cGRhdGVOZWVkZWQpIHsKLSAgICAgICAgICAgIHNHbG9iYWwudXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLiAgSXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBldmVudHMgYWJvdXQKLSAgICAgKiBjaGFuZ2VzIHRvIG1lZGlhIHJvdXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLgotICAgICAqIEBzZWUgI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2FsbGJhY2soQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZUNhbGxiYWNrOiBjYWxsYmFjaz0iICsgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gZmluZENhbGxiYWNrUmVjb3JkKGNhbGxiYWNrKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIG1DYWxsYmFja1JlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIHNHbG9iYWwudXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZENhbGxiYWNrUmVjb3JkKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWNvcmRzLmdldChpKS5tQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhbGwge0BsaW5rIE1lZGlhUm91dGVyfQotICAgICAqIGluc3RhbmNlcyB3aXRoaW4gdGhpcyBwcm9jZXNzIGNhbiB1c2UgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm92aWRlckluc3RhbmNlIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpbnN0YW5jZSB0byBhZGQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVQcm92aWRlcgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKHByb3ZpZGVySW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicHJvdmlkZXJJbnN0YW5jZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRQcm92aWRlcjogIiArIHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUHJvdmlkZXIocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5yZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhbGwge0BsaW5rIE1lZGlhUm91dGVyfQotICAgICAqIGluc3RhbmNlcyB3aXRoaW4gdGhpcyBwcm9jZXNzIGNhbiB1c2UgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm92aWRlckluc3RhbmNlIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpbnN0YW5jZSB0byByZW1vdmUuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVQcm92aWRlcgotICAgICAqIEBzZWUgI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKHByb3ZpZGVySW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicHJvdmlkZXJJbnN0YW5jZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVQcm92aWRlcjogIiArIHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudCB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZQotICAgICAqIG9mIHRoZSBzZWxlY3RlZCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50IG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoCi0gICAgICogdGhlIGF1ZGlvIG1hbmFnZXIgdXNpbmcgdGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNyZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnQKLSAgICAgKiBBdWRpb01hbmFnZXIucmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50fSBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9IHRvIHJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5hZGRSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0KLSAgICAgKiAgICAgICAgICAgIHRvIHVucmVnaXN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgewotICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwucmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcgbWVkaWEgc2Vzc2lvbnMuIFNldCB0aGUKLSAgICAgKiBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uIFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbn0gdG8KLSAgICAgKiAgICAgICAgICAgIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb24oT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZE1lZGlhU2Vzc2lvbjogIiArIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5zZXRNZWRpYVNlc3Npb24obWVkaWFTZXNzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY29tcGF0IG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCi0gICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyB7QGxpbmsgTWVkaWFTZXNzaW9uQ29tcGF0fS4KLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Db21wYXQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZE1lZGlhU2Vzc2lvbkNvbXBhdDogIiArIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5zZXRNZWRpYVNlc3Npb25Db21wYXQobWVkaWFTZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgewotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRNZWRpYVNlc3Npb25Ub2tlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZXMgdGhhdCBjYWxscyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgYXJlIG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAgICAgKiBJdCBwYXlzIHRvIGJlIGEgbGl0dGxlIHBhcmFub2lkIHdoZW4gZ2xvYmFsIHN0YXRlIGludmFyaWFudHMgYXJlIGF0IHJpc2suCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgY2hlY2tDYWxsaW5nVGhyZWFkKCkgewotICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgIT0gTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIG11c3Qgb25seSBiZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImFjY2Vzc2VkIG9uIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gdGhyZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIDxUPiBib29sZWFuIGVxdWFsKFQgYSwgVCBiKSB7Ci0gICAgICAgIHJldHVybiBhID09IGIgfHwgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBtZWRpYSByb3V0ZSBoYXMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0KLSAgICAgKiB7QGxpbmsgI2dldENvbnRyb2xGaWx0ZXJzIGludGVudCBmaWx0ZXJzfSB0aGF0IGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlCi0gICAgICogcm91dGUgYW5kIHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZCBhbmQgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySW5mbyBtUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBVcmkgbUljb25Vcmk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW5nOwotICAgICAgICBwcml2YXRlIGludCBtQ29ubmVjdGlvblN0YXRlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbkRpc2Nvbm5lY3Q7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QbGF5YmFja1N0cmVhbTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURldmljZVR5cGU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVIYW5kbGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZU1heDsKLSAgICAgICAgcHJpdmF0ZSBEaXNwbGF5IG1QcmVzZW50YXRpb25EaXNwbGF5OwotICAgICAgICBwcml2YXRlIGludCBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBJbnRlbnRTZW5kZXIgbVNldHRpbmdzSW50ZW50OwotICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLQotICAgICAgICBASW50RGVmKHtDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HLAotICAgICAgICAgICAgICAgIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ29ubmVjdGlvblN0YXRlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgZGlzY29ubmVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKLSAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgY29ubmVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEID0gMjsKLQotICAgICAgICBASW50RGVmKHtQTEFZQkFDS19UWVBFX0xPQ0FMLFBMQVlCQUNLX1RZUEVfUkVNT1RFfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgUGxheWJhY2tUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHBsYXliYWNrIHR5cGUsICJsb2NhbCIsIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEKLSAgICAgICAgICogaXMgaGFwcGVuaW5nIG9uIHRoZSBzYW1lIGRldmljZSAoZS5nLiBhIHBob25lLCBhIHRhYmxldCkgYXMgd2hlcmUgaXQgaXMKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfTE9DQUwgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHBsYXliYWNrIHR5cGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcgb24KLSAgICAgICAgICogYSBkaWZmZXJlbnQgZGV2aWNlIChpLmUuIHRoZSByZW1vdGUgZGV2aWNlKSB0aGFuIHdoZXJlIGl0IGlzIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX1JFTU9URSA9IDE7Ci0KLSAgICAgICAgQEludERlZih7REVWSUNFX1RZUEVfVU5LTk9XTiwgREVWSUNFX1RZUEVfVFYsIERFVklDRV9UWVBFX1NQRUFLRVIsIERFVklDRV9UWVBFX0JMVUVUT09USH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIERldmljZVR5cGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHR5cGUgaXMgdW5rbm93bi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgVFYuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1RWID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9TUEVBS0VSID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBibHVldG9vdGggZGV2aWNlIHN1Y2ggYXMgYSBibHVldG9vdGggc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfQkxVRVRPT1RIID0gMzsKLQotICAgICAgICBASW50RGVmKHtQTEFZQkFDS19WT0xVTUVfRklYRUQsUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgUGxheWJhY2tWb2x1bWUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIGZpeGVkLCBpLmUuIGl0IGNhbm5vdCBiZQotICAgICAgICAgKiBjb250cm9sbGVkIGZyb20gdGhpcyBvYmplY3QuIEFuIGV4YW1wbGUgb2YgZml4ZWQgcGxheWJhY2sgdm9sdW1lIGlzIGEgcmVtb3RlIHBsYXllciwKLSAgICAgICAgICogcGxheWluZyBvdmVyIEhETUkgd2hlcmUgdGhlIHVzZXIgcHJlZmVycyB0byBjb250cm9sIHRoZSB2b2x1bWUgb24gdGhlIEhETUkgc2luaywgcmF0aGVyCi0gICAgICAgICAqIHRoYW4gYXR0ZW51YXRlIGF0IHRoZSBzb3VyY2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19WT0xVTUVfRklYRUQgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgdmFyaWFibGUgYW5kIGNhbiBiZSBjb250cm9sbGVkCi0gICAgICAgICAqIGZyb20gdGhpcyBvYmplY3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwcmVzZW50YXRpb24gZGlzcGxheSBpZCBpbmRpY2F0aW5nIG5vIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlzIGFzc29jaWF0ZWQKLSAgICAgICAgICogd2l0aCB0aGUgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FID0gLTE7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfR0VORVJBTCA9IDEgPDwgMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfVk9MVU1FID0gMSA8PCAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSA9IDEgPDwgMjsKLQotICAgICAgICAvLyBTaG91bGQgbWF0Y2ggdG8gU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRS4KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fTUVESUFfUk9VVEVfUFJPVklERVJfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotCi0gICAgICAgIFJvdXRlSW5mbyhQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvcklkID0gZGVzY3JpcHRvcklkOwotICAgICAgICAgICAgbVVuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvdmlkZXIgb2YgdGhpcyBtZWRpYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm92aWRlckluZm8gZ2V0UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgdW5pcXVlIGlkIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZSBpZGVudGlmaWVyIGJ5IHdoaWNoIHRoZSByb3V0ZSBpcyBrbm93bi4KLSAgICAgICAgICogRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBpZCBhcyBhIHRva2VuIHRvIHJlbWVtYmVyIHRoZQotICAgICAgICAgKiBzZWxlY3RlZCByb3V0ZSBhY3Jvc3MgcmVzdGFydHMgb3IgdG8gY29tbXVuaWNhdGUgaXRzIGlkZW50aXR5IHRvIGEgc2VydmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLCBuZXZlciBudWxsLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiBhIG1lZGlhIHJvdXRlLiAgVGhpcyBpcyB0aGUgc3RyaW5nIHByZXNlbnRlZAotICAgICAgICAgKiB0byB1c2VycyB3aG8gbWF5IHNlbGVjdCB0aGlzIGFzIHRoZSBhY3RpdmUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25Vcmk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZCBhbmQgbWF5IGJlIHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90Ci0gICAgICAgICAqIHlldCByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoaXMgcm91dGU6IHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgQENvbm5lY3Rpb25TdGF0ZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvblN0YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldFNlbGVjdGVkUm91dGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXREZWZhdWx0Um91dGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0Qmx1ZXRvb3RoUm91dGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmx1ZXRvb3RoKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRCbHVldG9vdGhSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHRoZSBkZXZpY2Ugc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHRoZSBkZXZpY2Ugc3BlYWtlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGV2aWNlU3BlYWtlcigpIHsKLSAgICAgICAgICAgIGludCBkZWZhdWx0QXVkaW9Sb3V0ZU5hbWVSZXNvdXJjZUlkID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldElkZW50aWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2F1ZGlvX3JvdXRlX25hbWUiLCAic3RyaW5nIiwgImFuZHJvaWQiKTsKLSAgICAgICAgICAgIHJldHVybiBpc0RlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAmJiBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0VGV4dChkZWZhdWx0QXVkaW9Sb3V0ZU5hbWVSZXNvdXJjZUlkKS5lcXVhbHMobU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgdGhhdAotICAgICAgICAgKiBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgcm91dGUgYW5kIHRoZSBtZWRpYSBjb250cm9sIGFjdGlvbnMgdGhhdAotICAgICAgICAgKiBpdCBzdXBwb3J0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBBIGxpc3Qgb2YgaW50ZW50IGZpbHRlcnMgdGhhdCBzcGVjaWZpZXMgdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0aGF0Ci0gICAgICAgICAqIHRoaXMgcm91dGUgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5Ci0gICAgICAgICAqIEBzZWUgI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xGaWx0ZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGJ5IGEgbWVkaWEgcm91dGUgc2VsZWN0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGNhcGFiaWxpdGllcyB0byBjaGVjay4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKiBkZXNjcmliZWQgaW4gdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc1NlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5tYXRjaGVzQ29udHJvbEZpbHRlcnMobUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllcyBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgcm91dGUKLSAgICAgICAgICogc3VjaCBhcyB3aGV0aGVyIGl0IHN1cHBvcnRzIGxpdmUgYXVkaW8gc3RyZWFtaW5nIG9yIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGludGVudCBjYXRlZ29yeS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkgYW5kIGFjdGlvbi4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgYWN0aW9ucyBkZXNjcmliZSBzcGVjaWZpYyByZXF1ZXN0cyB0aGF0IGFuIGFwcGxpY2F0aW9uCi0gICAgICAgICAqIGNhbiBhc2sgYSByb3V0ZSB0byBwZXJmb3JtLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAotICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgotICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBhY3Rpb24KLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGludGVudCBhY3Rpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xBY3Rpb24oQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5LCBATm9uTnVsbCBTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBtQ29udHJvbEZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpICYmIGZpbHRlci5oYXNBY3Rpb24oYWN0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gcmVxdWVzdC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQotICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgY2FuIGhhbmRsZSB0aGUgc3BlY2lmaWVkIGludGVudC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbFJlcXVlc3QoQE5vbk51bGwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW50ZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gc0dsb2JhbC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5tYXRjaChjb250ZW50UmVzb2x2ZXIsIGludGVudCwgdHJ1ZSwgVEFHKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW5kcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gcmVxdWVzdCB0byBiZSBwZXJmb3JtZWQKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgYnkgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD48cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIENvbnRyb2wgcmVxdWVzdHMKLSAgICAgICAgICogc2VudCB0byB1bnNlbGVjdGVkIHJvdXRlcyB3aWxsIGZhaWwuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoQE5vbk51bGwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW50ZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBzR2xvYmFsLnNlbmRDb250cm9sUmVxdWVzdCh0aGlzLCBpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfTE9DQUx9Ci0gICAgICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAgICAgKi8KLSAgICAgICAgQFBsYXliYWNrVHlwZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGF1ZGlvIHN0cmVhbSBvdmVyIHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHN0cmVhbSBvdmVyIHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1N0cmVhbTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgICAgICoge0BsaW5rICNERVZJQ0VfVFlQRV9UVn0gb3Ige0BsaW5rICNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGV2aWNlVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGV2aWNlVHlwZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPckJsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGlmIChpc0RlZmF1bHQoKSB8fCBtRGV2aWNlVHlwZSA9PSBERVZJQ0VfVFlQRV9CTFVFVE9PVEgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwbGF0Zm9ybSB2ZXJzaW9uIDIzIG9yIGJlbG93IHdoZXJlIHRoZSBzeXN0ZW0gcm91dGUKLSAgICAgICAgICAgIC8vIHByb3ZpZGVyIGRvZXNuJ3Qgc3BlY2lmeSBkZXZpY2UgdHlwZSBmb3IgYmx1ZXRvb3RoIG1lZGlhIHJvdXRlcy4KLSAgICAgICAgICAgIHJldHVybiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcih0aGlzKQotICAgICAgICAgICAgICAgICAgICAmJiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgcm91dGUgaXMgc2VsZWN0YWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkgewotICAgICAgICAgICAgLy8gVGhpcyB0ZXN0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBzdGlsbCB2YWxpZCBhbmQgZW5hYmxlZC4KLSAgICAgICAgICAgIC8vIFRoZSByb3V0ZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHJvdXRlIGlzIHJlbW92ZWQuCi0gICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0b3IgIT0gbnVsbCAmJiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmVxdWFscyhyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBTWVNURU1fTUVESUFfUk9VVEVfUFJPVklERVJfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gSG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToge0BsaW5rICNQTEFZQkFDS19WT0xVTUVfRklYRUR9Ci0gICAgICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1ZvbHVtZQotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVIYW5kbGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZSBmb3IgdGhpcyByb3V0ZS4gRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSwgdGhpcyBtYXkgb25seQotICAgICAgICAgKiBiZSB2YWxpZCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgbWF4aW11bSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbWF4aW11bSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lTWF4KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYXg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgcm91dGUgc3VwcG9ydHMgZGlzY29ubmVjdGluZyB3aXRob3V0IGludGVycnVwdGluZwotICAgICAgICAgKiBwbGF5YmFjay4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgY2FuIGRpc2Nvbm5lY3Qgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjaywKLSAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGEgdm9sdW1lIGNoYW5nZSBmb3IgdGhpcyByb3V0ZSBhc3luY2hyb25vdXNseS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBJdCB3aWxsIGhhdmUKLSAgICAgICAgICogbm8gZWZmZWN0IGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgdW5zZWxlY3RlZC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSBuZXcgdm9sdW1lIHZhbHVlIGJldHdlZW4gMCBhbmQge0BsaW5rICNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHNHbG9iYWwucmVxdWVzdFNldFZvbHVtZSh0aGlzLCBNYXRoLm1pbihtVm9sdW1lTWF4LCBNYXRoLm1heCgwLCB2b2x1bWUpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYW4gaW5jcmVtZW50YWwgdm9sdW1lIHVwZGF0ZSBmb3IgdGhpcyByb3V0ZSBhc3luY2hyb25vdXNseS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBJdCB3aWxsIGhhdmUKLSAgICAgICAgICogbm8gZWZmZWN0IGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgdW5zZWxlY3RlZC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGEgVGhlIGRlbHRhIHRvIGFkZCB0byB0aGUgY3VycmVudCB2b2x1bWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoZGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgIHNHbG9iYWwucmVxdWVzdFVwZGF0ZVZvbHVtZSh0aGlzLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIERpc3BsYXl9IHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cKLSAgICAgICAgICogYSB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9ufSBvbiBhbiBleHRlcm5hbCBkaXNwbGF5IHdoZW4gdGhpcyByb3V0ZSBpcyBzZWxlY3RlZC4KLSAgICAgICAgICogRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSwgdGhpcyBtYXkgb25seSBiZSB2YWxpZCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5Ci0gICAgICAgICAqIHNlbGVjdGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSBtYXkgY2hhbmdlIGluZGVwZW5kZW50bHkgb2YgdGhlIHJvdXRlCi0gICAgICAgICAqIGJlaW5nIHNlbGVjdGVkIG9yIHVuc2VsZWN0ZWQuICBGb3IgZXhhbXBsZSwgdGhlIHByZXNlbnRhdGlvbiBkaXNwbGF5Ci0gICAgICAgICAqIG9mIHRoZSBkZWZhdWx0IHN5c3RlbSByb3V0ZSBtYXkgY2hhbmdlIHdoZW4gYW4gZXh0ZXJuYWwgSERNSSBkaXNwbGF5IGlzIGNvbm5lY3RlZAotICAgICAgICAgKiBvciBkaXNjb25uZWN0ZWQgZXZlbiB0aG91Z2ggdGhlIHJvdXRlIGl0c2VsZiBoYXMgbm90IGNoYW5nZWQuCi0gICAgICAgICAqIDwvcD48cD4KLSAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGV4dGVybmFsIGRpc3BsYXkgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAqIHRoZSByb3V0ZSBvciBpZiB0aGUgZGlzcGxheSBpcyBub3QgcmVhZHkgdG8gc2hvdyBVSSB5ZXQuCi0gICAgICAgICAqIDwvcD48cD4KLSAgICAgICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHByZXNlbnRhdGlvbiBkaXNwbGF5Ci0gICAgICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkfSBjYWxsYmFjayBhbmQKLSAgICAgICAgICogc2hvdyBvciBkaXNtaXNzIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9ufSBhY2NvcmRpbmdseSB3aGVuIHRoZSBkaXNwbGF5Ci0gICAgICAgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9yIGlzIHJlbW92ZWQuCi0gICAgICAgICAqIDwvcD48cD4KLSAgICAgICAgICogVGhpcyBtZXRob2Qgb25seSBtYWtlcyBzZW5zZSBmb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99IHJvdXRlcy4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgdG8gdXNlIHdoZW4gdGhpcyByb3V0ZSBpcwotICAgICAgICAgKiBzZWxlY3RlZCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8KLSAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAobVByZXNlbnRhdGlvbkRpc3BsYXlJZCA+PSAwICYmIG1QcmVzZW50YXRpb25EaXNwbGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheSA9IHNHbG9iYWwuZ2V0RGlzcGxheShtUHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXlJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgY29sbGVjdGlvbiBvZiBleHRyYSBwcm9wZXJ0aWVzIGFib3V0IHRoaXMgcm91dGUgdGhhdCB3ZXJlIHN1cHBsaWVkCi0gICAgICAgICAqIGJ5IGl0cyBtZWRpYSByb3V0ZSBwcm92aWRlciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAgICAgKiByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzSW50ZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZWxlY3RzIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3QoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVJbmZveyB1bmlxdWVJZD0iICsgbVVuaXF1ZUlkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbmFtZT0iICsgbU5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXNjcmlwdGlvbj0iICsgbURlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiwgaWNvblVyaT0iICsgbUljb25VcmkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBlbmFibGVkPSIgKyBtRW5hYmxlZAotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpbmc9IiArIG1Db25uZWN0aW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGlvblN0YXRlPSIgKyBtQ29ubmVjdGlvblN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY2FuRGlzY29ubmVjdD0iICsgbUNhbkRpc2Nvbm5lY3QKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwbGF5YmFja1R5cGU9IiArIG1QbGF5YmFja1R5cGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwbGF5YmFja1N0cmVhbT0iICsgbVBsYXliYWNrU3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGV2aWNlVHlwZT0iICsgbURldmljZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVIYW5kbGluZz0iICsgbVZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lPSIgKyBtVm9sdW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lTWF4PSIgKyBtVm9sdW1lTWF4Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcHJlc2VudGF0aW9uRGlzcGxheUlkPSIgKyBtUHJlc2VudGF0aW9uRGlzcGxheUlkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZXh0cmFzPSIgKyBtRXh0cmFzCi0gICAgICAgICAgICAgICAgICAgICsgIiwgc2V0dGluZ3NJbnRlbnQ9IiArIG1TZXR0aW5nc0ludGVudAotICAgICAgICAgICAgICAgICAgICArICIsIHByb3ZpZGVyUGFja2FnZU5hbWU9IiArIG1Qcm92aWRlci5nZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGNoYW5nZXMgPSAwOwotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VzID0gdXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGNoYW5nZXMgPSAwOwotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobU5hbWUsIGRlc2NyaXB0b3IuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtTmFtZSA9IGRlc2NyaXB0b3IuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1EZXNjcmlwdGlvbiwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobUljb25VcmksIGRlc2NyaXB0b3IuZ2V0SWNvblVyaSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtSWNvblVyaSA9IGRlc2NyaXB0b3IuZ2V0SWNvblVyaSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgIT0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGluZyAhPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nID0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uU3RhdGUgIT0gZGVzY3JpcHRvci5nZXRDb25uZWN0aW9uU3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblN0YXRlID0gZGVzY3JpcHRvci5nZXRDb25uZWN0aW9uU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGRBbGwoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1R5cGUgIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1R5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUeXBlID0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0cmVhbSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU3RyZWFtID0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobURldmljZVR5cGUgIT0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUgPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVIYW5kbGluZyAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUhhbmRsaW5nID0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWUgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lID0gZGVzY3JpcHRvci5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lTWF4ICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lTWF4KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZU1heCA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVByZXNlbnRhdGlvbkRpc3BsYXlJZCAhPSBkZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBkZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobUV4dHJhcywgZGVzY3JpcHRvci5nZXRFeHRyYXMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobVNldHRpbmdzSW50ZW50LCBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzSW50ZW50ID0gZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ2FuRGlzY29ubmVjdCAhPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYW5EaXNjb25uZWN0ID0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREZXNjcmlwdG9ySWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0b3JJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBAaGlkZSAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyLmdldFByb3ZpZGVySW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgdGhhdCBjb25zaXN0cyBvZiBtdWx0aXBsZSBvdGhlciByb3V0ZXMgaW4gYSBncm91cC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUdyb3VwIGV4dGVuZHMgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIFJvdXRlR3JvdXAoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIHN1cGVyKHByb3ZpZGVyLCBkZXNjcmlwdG9ySWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Um91dGVDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZSBpbiB0aGlzIGdyb3VwIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEluZGV4IHRvIGZldGNoCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGF0IGluZGV4Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlQXQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdGhlIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1Sb3V0ZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXScpOwotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGdyb3VwTWVtYmVySWRzID0gZGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBncm91cE1lbWJlcklkcy5zaXplKCkgIT0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwTWVtYmVySWQgOiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gc0dsb2JhbC5nZXRVbmlxdWVJZChnZXRQcm92aWRlcigpLCBncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyBncm91cE1lbWJlciA9IHNHbG9iYWwuZ2V0Um91dGUodW5pcXVlSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXMuYWRkKGdyb3VwTWVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIW1Sb3V0ZXMuY29udGFpbnMoZ3JvdXBNZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoY2hhbmdlZCA/IENIQU5HRV9HRU5FUkFMIDogMCkgfCBzdXBlci51cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzCi0gICAgICogcHVibGlzaGVkIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlckluZm8gewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXJJbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLSAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNvdXJjZXNOb3RBdmFpbGFibGU7Ci0KLSAgICAgICAgUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVySW5zdGFuY2UgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyB1bmRlcmx5aW5nIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9IGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY29tcG9uZW50IG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0Q29tcG9uZW50TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGVzfSBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlcyBnZXRSZXNvdXJjZXMoKSB7Ci0gICAgICAgICAgICBpZiAobVJlc291cmNlcyA9PSBudWxsICYmICFtUmVzb3VyY2VzTm90QXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBzR2xvYmFsLmdldFByb3ZpZGVyQ29udGV4dChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb2J0YWluIHJlc291cmNlcyBmb3Igcm91dGUgcHJvdmlkZXIgcGFja2FnZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzTm90QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVJlc291cmNlczsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubURlc2NyaXB0b3JJZC5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZVByb3ZpZGVySW5mb3sgcGFja2FnZU5hbWU9IiArIGdldFBhY2thZ2VOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIH0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciByZWNlaXZpbmcgZXZlbnRzIGFib3V0IG1lZGlhIHJvdXRpbmcgY2hhbmdlcy4KLSAgICAgKiBBbGwgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gdGhyZWFkLgotICAgICAqIDxwPgotICAgICAqIEEgQ2FsbGJhY2sgd2lsbCBvbmx5IHJlY2VpdmUgZXZlbnRzIHJlbGV2YW50IHRvIHJvdXRlcyB0aGF0IHRoZSBjYWxsYmFjawotICAgICAqIHdhcyByZWdpc3RlcmVkIGZvciB1bmxlc3MgdGhlIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfQotICAgICAqIGZsYWcgd2FzIHNwZWNpZmllZCBpbiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhDYWxsYmFjaykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyB1bnNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCi0gICAgICAgICAqIEZvciBkZXRhaWxlZCByZWFzb24sIG92ZXJyaWRlIHtAbGluayAjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0KLSAgICAgICAgICogaW5zdGVhZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyB1bnNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHtAbGluayAjb25Sb3V0ZVVuc2VsZWN0ZWR9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgdW5zZWxlY3RpbmcgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG9uUm91dGVVbnNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUncyB2b2x1bWUgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2Ugdm9sdW1lIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VzLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGJlY29tZXMKLSAgICAgICAgICogYXZhaWxhYmxlLCBpcyByZW1vdmVkIG9yIGhhcyBjaGFuZ2VzIHRvIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMgKHN1Y2ggYXMgaXRzIHNpemUpLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgUm91dGVJbmZvI2dldFByZXNlbnRhdGlvbkRpc3BsYXkoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIHJlc3VsdCBvZiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBzZWUgUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29udHJvbFJlcXVlc3RDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgUmVzdWx0IGRhdGEsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICogQ29udGVudHMgZGVwZW5kIG9uIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgYWN0aW9ufS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3QgZmFpbHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBlcnJvciBBIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHdoaWNoIG1heSBiZSBzaG93biB0byB0aGUgdXNlciwgb3IgbnVsbAotICAgICAgICAgKiBpZiB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzIHVuY2xlYXIuCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIEVycm9yIGRhdGEsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICogQ29udGVudHMgZGVwZW5kIG9uIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgYWN0aW9ufS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsbGJhY2tSZWNvcmQgewotICAgICAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgICAgIHB1YmxpYyBpbnQgbUZsYWdzOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1JlY29yZChNZWRpYVJvdXRlciByb3V0ZXIsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtUm91dGVyID0gcm91dGVyOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJSb3V0ZUV2ZW50KFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2xvYmFsIHN0YXRlIGZvciB0aGUgbWVkaWEgcm91dGVyLgotICAgICAqIDxwPgotICAgICAqIE1lZGlhIHJvdXRlcyBhbmQgbWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSBnbG9iYWwgdG8gdGhlIHByb2Nlc3M7IHRoZWlyCi0gICAgICogc3RhdGUgYW5kIHRoZSBidWxrIG9mIHRoZSBtZWRpYSByb3V0ZXIgaW1wbGVtZW50YXRpb24gbGl2ZXMgaGVyZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgR2xvYmFsTWVkaWFSb3V0ZXIKLSAgICAgICAgICAgIGltcGxlbWVudHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlN5bmNDYWxsYmFjaywKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLkNhbGxiYWNrIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4+IG1Sb3V0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nPiBtVW5pcXVlSWRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3ZpZGVySW5mbz4gbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkPiBtUmVtb3RlQ29udHJvbENsaWVudHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvID0KLSAgICAgICAgICAgICAgICBuZXcgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrID0gbmV3IFByb3ZpZGVyQ2FsbGJhY2soKTsKLSAgICAgICAgZmluYWwgQ2FsbGJhY2tIYW5kbGVyIG1DYWxsYmFja0hhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXJDb21wYXQgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBmaW5hbCBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgbVN5c3RlbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUxvd1JhbTsKLQotICAgICAgICBwcml2YXRlIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyOwotICAgICAgICBwcml2YXRlIFJvdXRlSW5mbyBtRGVmYXVsdFJvdXRlOwotICAgICAgICBwcml2YXRlIFJvdXRlSW5mbyBtQmx1ZXRvb3RoUm91dGU7Ci0gICAgICAgIFJvdXRlSW5mbyBtU2VsZWN0ZWRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUNvbnRyb2xsZXIgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyOwotICAgICAgICAvLyBBIG1hcCBmcm9tIHJvdXRlIGRlc2NyaXB0b3IgSUQgdG8gUm91dGVDb250cm9sbGVyIGZvciB0aGUgbWVtYmVyIHJvdXRlcyBpbiB0aGUgY3VycmVudGx5Ci0gICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIGdyb3VwLgotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gbVJvdXRlQ29udHJvbGxlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25SZWNvcmQgbU1lZGlhU2Vzc2lvbjsKLSAgICAgICAgTWVkaWFTZXNzaW9uQ29tcGF0IG1SY2NNZWRpYVNlc3Npb247Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0IG1Db21wYXRTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyIG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY3RpdmVDaGFuZ2VkKCkgewotICAgICAgICAgICAgICAgIGlmKG1SY2NNZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbi5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEdsb2JhbE1lZGlhUm91dGVyKENvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KSB7Ci0gICAgICAgICAgICBtQXBwbGljYXRpb25Db250ZXh0ID0gYXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gRGlzcGxheU1hbmFnZXJDb21wYXQuZ2V0SW5zdGFuY2UoYXBwbGljYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgIG1Mb3dSYW0gPSBBY3Rpdml0eU1hbmFnZXJDb21wYXQuaXNMb3dSYW1EZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgIChBY3Rpdml0eU1hbmFnZXIpYXBwbGljYXRpb25Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGZvciBpbnRlcm9wZXJhdGluZyB3aXRoCi0gICAgICAgICAgICAvLyB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4gIFRoaXMgb25lIGlzIHNwZWNpYWwgYW5kIHJlY2VpdmVzCi0gICAgICAgICAgICAvLyBzeW5jaHJvbml6YXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyID0gU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLm9idGFpbihhcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgICAgICBhZGRQcm92aWRlcihtU3lzdGVtUHJvdmlkZXIpOwotCi0gICAgICAgICAgICAvLyBTdGFydCB3YXRjaGluZyBmb3Igcm91dGVzIHB1Ymxpc2hlZCBieSByZWdpc3RlcmVkIG1lZGlhIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBzZXJ2aWNlcy4KLSAgICAgICAgICAgIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyID0gbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKAotICAgICAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgICAgIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0Um91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm91dGVyLm1Db250ZXh0ID09IGNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3V0ZXIgPSBuZXcgTWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtUm91dGVycy5hZGQobmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+KHJvdXRlcikpOwotICAgICAgICAgICAgcmV0dXJuIHJvdXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb250ZW50UmVzb2x2ZXIgZ2V0Q29udGVudFJlc29sdmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGV4dCBnZXRQcm92aWRlckNvbnRleHQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmNyZWF0ZVBhY2thZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIENvbnRleHQuQ09OVEVYVF9SRVNUUklDVEVEKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheShpbnQgZGlzcGxheUlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlNYW5hZ2VyLmdldERpc3BsYXkoZGlzcGxheUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChSb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vbkNvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbVJvdXRlQ29udHJvbGxlck1hcC5nZXQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uVXBkYXRlVm9sdW1lKGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGUoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyBpbmZvIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChpbmZvLm1VbmlxdWVJZC5lcXVhbHModW5pcXVlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIG9uY2UgdGhlIG1lZGlhIHJvdXRlciBoYXMgYmVlbiBmdWxseQotICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGJ1dCBpdCBpcyBnb29kIHRvIGNoZWNrIGZvciB0aGUgZXJyb3IgaW4gY2FzZSB0aGVyZQotICAgICAgICAgICAgICAgIC8vIGlzIGEgYnVnIGluIHByb3ZpZGVyIGluaXRpYWxpemF0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGRlZmF1bHQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIG9uY2UgdGhlIG1lZGlhIHJvdXRlciBoYXMgYmVlbiBmdWxseQotICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGJ1dCBpdCBpcyBnb29kIHRvIGNoZWNrIGZvciB0aGUgZXJyb3IgaW4gY2FzZSB0aGVyZQotICAgICAgICAgICAgICAgIC8vIGlzIGEgYnVnIGluIHByb3ZpZGVyIGluaXRpYWxpemF0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtU2VsZWN0ZWRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBzZWxlY3RSb3V0ZShyb3V0ZSwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgaWYgKCFtUm91dGVzLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2VsZWN0IHJlbW92ZWQgcm91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFyb3V0ZS5tRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2VsZWN0IGRpc2FibGVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChyb3V0ZSwgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT24gbG93LVJBTSBkZXZpY2VzLCBkbyBub3QgcmVseSBvbiBhY3R1YWwgZGlzY292ZXJ5IHJlc3VsdHMgdW5sZXNzIGFza2VkIHRvLgotICAgICAgICAgICAgaWYgKChmbGFncyAmIEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0gpID09IDAgJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBleGlzdGluZyByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yLgotICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3QgbG9vayBsaWtlIHdlIGNhbiBmaW5kIGEgbWF0Y2hpbmcgcm91dGUgcmlnaHQgbm93LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgICAgIC8vIENvbWJpbmUgYWxsIG9mIHRoZSBjYWxsYmFjayBzZWxlY3RvcnMgYW5kIGFjdGl2ZSBzY2FuIGZsYWdzLgotICAgICAgICAgICAgYm9vbGVhbiBkaXNjb3ZlciA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLm1DYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrUmVjb3JkIGNhbGxiYWNrID0gcm91dGVyLm1DYWxsYmFja1JlY29yZHMuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTZWxlY3RvcihjYWxsYmFjay5tU2VsZWN0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTY2FuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7IC8vIHBlcmZvcm0gYWN0aXZlIHNjYW4gaW1wbGllcyByZXF1ZXN0IGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yID0gZGlzY292ZXIgPyBidWlsZGVyLmJ1aWxkKCkgOiBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmdldFNlbGVjdG9yKCkuZXF1YWxzKHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSA9PSBhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkgJiYgIWFjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbm90IG5lZWRlZC4KLSAgICAgICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBuZWVkZWQuCi0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qoc2VsZWN0b3IsIGFjdGl2ZVNjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVXBkYXRlZCBkaXNjb3ZlcnkgcmVxdWVzdDogIiArIG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkaXNjb3ZlciAmJiAhYWN0aXZlU2NhbiAmJiBtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm9yY2luZyBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSBvbiBhIGxvdy1SQU0gZGV2aWNlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJzeXN0ZW0gcGVyZm9ybWFuY2UgbWF5IGJlIGFmZmVjdGVkLiAgUGxlYXNlIGNvbnNpZGVyIHVzaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgaW5zdGVhZCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWS4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZpbmFsIGludCBwcm92aWRlckNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIEFkZCB0aGUgcHJvdmlkZXIgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZChwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGFkZGVkOiAiICsgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9BRERFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBwcm92aWRlckluc3RhbmNlLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICAgICAgLy8gMy4gUmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIC8vIDQuIFNldCB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMS4gVW5yZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDbGVhciB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDMuIERlbGV0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gNC4gUmVtb3ZlIHRoZSBwcm92aWRlciBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciByZW1vdmVkOiAiICsgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9SRU1PVkVELCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2UgPT0gcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhQcm92aWRlckluZm8gcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBwcm92aWRlckRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci51cGRhdGVEZXNjcmlwdG9yKHByb3ZpZGVyRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYWxsIGV4aXN0aW5nIHJvdXRlcyBhbmQgcmVvcmRlciB0aGVtIHRvIG1hdGNoCi0gICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIG9mIHRoZWlyIGRlc2NyaXB0b3JzLgotICAgICAgICAgICAgICAgIGludCB0YXJnZXRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlRGVzY3JpcHRvcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlckRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IHJvdXRlRGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRpbmcgcm91dGUgZ3JvdXAncyBjb250ZW50cyByZXF1aXJlcyBhbGwgbWVtYmVyIHJvdXRlcycgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGdyb3VwcyB0byB0aGUgbGlzdHMgYW5kIHVwZGF0ZSB0aGVtIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+PiBhZGRlZEdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+PiB1cGRhdGVkR3JvdXBzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlRGVzY3JpcHRvciA9IHJvdXRlRGVzY3JpcHRvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHJvdXRlRGVzY3JpcHRvci5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzb3VyY2VJbmRleCA9IHByb3ZpZGVyLmZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIEFkZCB0aGUgcm91dGUgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IGFzc2lnblJvdXRlVW5pcXVlSWQocHJvdmlkZXIsIGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwID0gcm91dGVEZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gaXNHcm91cCA/IG5ldyBSb3V0ZUdyb3VwKHByb3ZpZGVyLCBpZCwgdW5pcXVlSWQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm91dGVJbmZvKHByb3ZpZGVyLCBpZCwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmFkZCh0YXJnZXRJbmRleCsrLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHcm91cCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBOb3RpZnkgY2xpZW50cyBhYm91dCBhZGRpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGFkZGVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIHJvdXRlIGRlc2NyaXB0b3Igd2l0aCBkdXBsaWNhdGUgaWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gUmVvcmRlciB0aGUgcm91dGUgd2l0aGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChzb3VyY2VJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAocHJvdmlkZXIubVJvdXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIFVwZGF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBOb3RpZnkgY2xpZW50cyBhYm91dCBjaGFuZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuZXcgYW5kL29yIGV4aXN0aW5nIGdyb3Vwcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogYWRkZWRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihwYWlyLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGFkZGVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiB1cGRhdGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCBwYWlyLnNlY29uZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBpbnZhbGlkIHByb3ZpZGVyIGRlc2NyaXB0b3I6ICIgKyBwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRGlzcG9zZSBhbGwgcmVtYWluaW5nIHJvdXRlcyB0aGF0IGRvIG5vdCBoYXZlIG1hdGNoaW5nIGRlc2NyaXB0b3JzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICAvLyAxLiBEZWxldGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDIuIFJlbW92ZSB0aGUgcm91dGUgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgbmVlZGVkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IG5vdGlmeSBjbGllbnRzIGFib3V0IHJvdXRlcyB0aGF0IHdlcmUgcmVtb3ZlZC4KLSAgICAgICAgICAgICAgICAvLyBXZSBkbyB0aGlzIGFmdGVyIHVwZGF0aW5nIHRoZSBzZWxlY3RlZCByb3V0ZSB0byBlbnN1cmUKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIG9ic2VydmVzIHRoZSBuZXcgcm91dGUKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gYmVmb3JlIHRoZSByZW1vdmFsIHNpbmNlIHJlbW92aW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBtYXkgaGF2ZSBzaWRlLWVmZmVjdHMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHJlbW92ZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfUkVNT1ZFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlciBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBjaGFuZ2VkOiAiICsgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9DSEFOR0VELCBwcm92aWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCB1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGNoYW5nZXMgPSByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VzICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX0dFTkVSQUwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBjaGFuZ2VkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9WT0xVTUUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSB2b2x1bWUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIHJvdXRlRGVzY3JpcHRvcklkKSB7Ci0gICAgICAgICAgICAvLyBBbHRob3VnaCByb3V0ZSBkZXNjcmlwdG9yIGlkcyBhcmUgdW5pcXVlIHdpdGhpbiBhIHByb3ZpZGVyLCBpdCdzCi0gICAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgdHdvIHByb3ZpZGVycyB3aXRoIHRoZSBzYW1lIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBtdXN0IGRlZHVwZSB0aGUgY29tcG9zaXRlIGlkLgotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IGNvbXBvbmVudE5hbWUgKyAiOiIgKyByb3V0ZURlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIGlmIChmaW5kUm91dGVCeVVuaXF1ZUlkKHVuaXF1ZUlkKSA8IDApIHsKLSAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCB1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRWl0aGVyICIgKyByb3V0ZURlc2NyaXB0b3JJZCArICIgaXNuJ3QgdW5pcXVlIGluICIgKyBjb21wb25lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBvciB3ZSdyZSB0cnlpbmcgdG8gYXNzaWduIGEgdW5pcXVlIElEIGZvciBhbiBhbHJlYWR5IGFkZGVkIHJvdXRlIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMjsgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VW5pcXVlSWQgPSBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIiVzXyVkIiwgdW5pcXVlSWQsIGkpOwotICAgICAgICAgICAgICAgIGlmIChmaW5kUm91dGVCeVVuaXF1ZUlkKG5ld1VuaXF1ZUlkKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgbmV3VW5pcXVlSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VW5pcXVlSWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJvdXRlQnlVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1VbmlxdWVJZC5lcXVhbHModW5pcXVlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZUlkKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIHJvdXRlRGVzY3JpcHRvcklkKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZE1hcC5nZXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZChib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgLy8gVXBkYXRlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSAhPSBudWxsICYmICFtRGVmYXVsdFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGRlZmF1bHQgcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1EZWZhdWx0Um91dGUpOwotICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCAmJiAhbVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtRGVmYXVsdFJvdXRlKHJvdXRlKSAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgZGVmYXVsdCByb3V0ZTogIiArIG1EZWZhdWx0Um91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgIW1CbHVldG9vdGhSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBibHVldG9vdGggcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbUJsdWV0b290aFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgPT0gbnVsbCAmJiAhbVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKHJvdXRlKSAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBibHVldG9vdGggcm91dGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBudWxsIHx8ICFtU2VsZWN0ZWRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlVuc2VsZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtU2VsZWN0ZWRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKGNob29zZUZhbGxiYWNrUm91dGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgc2VsZWN0ZWQgcm91dGUgaXMgYSByb3V0ZSBncm91cCwgc2VsZWN0L3Vuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzCi0gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBhZGRlZC9yZW1vdmVkIHJvdXRlIG1lbWJlcnMuCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIGRlc2NyaXB0b3IgSURzIGZvciB0aGUgbmV3IHJvdXRlIGdyb3VwLgotICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpZFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkU2V0LmFkZChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBVbnNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIHJlbW92ZWQgcm91dGVzLgotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+PiBpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlkU2V0LmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgYWRkZWQgcm91dGVzLgotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmNvbnRhaW5zS2V5KHJvdXRlLm1EZXNjcmlwdG9ySWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubURlc2NyaXB0b3JJZCwgbVNlbGVjdGVkUm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHJvdXRlLm1EZXNjcmlwdG9ySWQsIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWJhY2sgaW5mbyBiZWNhdXNlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByb3V0ZSBoYXZlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFJvdXRlSW5mbyBjaG9vc2VGYWxsYmFja1JvdXRlKCkgewotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY3VycmVudCByb3V0ZSBpcyByZW1vdmVkIG9yIG5vIGxvbmdlciBzZWxlY3RhYmxlLAotICAgICAgICAgICAgLy8gd2Ugd2FudCB0byByZXZlcnQgdG8gYSBsaXZlIGF1ZGlvIHJvdXRlIGlmIHRoZXJlIGlzCi0gICAgICAgICAgICAvLyBvbmUgKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLiAgRmFpbGluZyB0aGF0LCB1c2UKLSAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlICE9IG1EZWZhdWx0Um91dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1EZWZhdWx0Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5tRGVzY3JpcHRvcklkLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuREVGQVVMVF9ST1VURV9JRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsb2dnaW5nIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwgfHwgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmIHJvdXRlLmlzRGVmYXVsdCgpKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0YWNrVHJhY2VFbGVtZW50W10gY2FsbFN0YWNrID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbFN0YWNrWzNdIGlzIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCBjYWxsU3RhY2subGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgY2FsbGVyID0gY2FsbFN0YWNrW2ldOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2FsbGVyLmdldENsYXNzTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldE1ldGhvZE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRMaW5lTnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwgaXMgY2FsbGVkIHdoaWxlIHNHbG9iYWwgaXMgbnVsbDogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHdoaWxlIGEgQlQgcm91dGUgaXMgYXZhaWxhYmxlOiBwa2dOYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSB1bnNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUgKyAiIHJlYXNvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9VTlNFTEVDVEVELCBtU2VsZWN0ZWRSb3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyIDogbVJvdXRlQ29udHJvbGxlck1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVELCBtU2VsZWN0ZWRSb3V0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubURlc2NyaXB0b3JJZCwgbVNlbGVjdGVkUm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyLm1EZXNjcmlwdG9ySWQsIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbSByb3V0ZSBpcyBzZWxlY3RlZCwgZG8gbm90IHN5bmMgdGhlIHJvdXRlIHdlIHNlbGVjdGVkIGJlZm9yZS4KLSAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCk7Ci0gICAgICAgICAgICBpbnQgcHJvdmlkZXJJbmRleCA9IGZpbmRQcm92aWRlckluZm8obVN5c3RlbVByb3ZpZGVyKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlckluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChwcm92aWRlckluZGV4KTsKLSAgICAgICAgICAgICAgICBpbnQgcm91dGVJbmRleCA9IHByb3ZpZGVyLmZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKGlkKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHJvdXRlSW5kZXgpLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG5ldyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUNvbnRyb2xDbGllbnRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgIHJlY29yZC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb24oT2JqZWN0IHNlc3Npb24pIHsKLSAgICAgICAgICAgIHNldE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uICE9IG51bGwgPyBuZXcgTWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24pIDogbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Db21wYXQoZmluYWwgTWVkaWFTZXNzaW9uQ29tcGF0IHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1Db21wYXRTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgICAgIHNldE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uICE9IG51bGwgPyBuZXcgTWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24pIDogbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbi5yZW1vdmVPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWRkT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChzZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvblJlY29yZCBtZWRpYVNlc3Npb25SZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24gPSBtZWRpYVNlc3Npb25SZWNvcmQ7Ci0gICAgICAgICAgICBpZiAobWVkaWFTZXNzaW9uUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhU2Vzc2lvbi5nZXRUb2tlbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29tcGF0U2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db21wYXRTZXNzaW9uLmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpID09IHJjYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVNYXggPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnBsYXliYWNrU3RyZWFtID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnBsYXliYWNrVHlwZSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrVHlwZSgpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICByZWNvcmQudXBkYXRlUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IGdldERlZmF1bHRSb3V0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVNlbGVjdGVkUm91dGUgPT0gZ2V0Qmx1ZXRvb3RoUm91dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWwgcm91dGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0ZJWEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlID0gVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNvbmZpZ3VyZVZvbHVtZShjb250cm9sVHlwZSwgbVBsYXliYWNrSW5mby52b2x1bWVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFTZXNzaW9uUmVjb3JkIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uQ29tcGF0IG1Nc0NvbXBhdDsKLQotICAgICAgICAgICAgcHJpdmF0ZSBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1NYXhWb2x1bWU7Ci0gICAgICAgICAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyQ29tcGF0IG1WcENvbXBhdDsKLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblJlY29yZChPYmplY3QgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgbU1zQ29tcGF0ID0gTWVkaWFTZXNzaW9uQ29tcGF0LmZyb21NZWRpYVNlc3Npb24obUFwcGxpY2F0aW9uQ29udGV4dCwgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uQ29tcGF0KSB7Ci0gICAgICAgICAgICAgICAgbU1zQ29tcGF0ID0gbWVkaWFTZXNzaW9uQ29tcGF0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVWb2x1bWUoQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVZwQ29tcGF0ICE9IG51bGwgJiYgY29udHJvbFR5cGUgPT0gbUNvbnRyb2xUeXBlICYmIG1heCA9PSBtTWF4Vm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgY2hhbmdlZCBjb250cm9sIHR5cGUgb3IgbWF4IGp1c3Qgc2V0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBuZXcgY3VycmVudCB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0LnNldEN1cnJlbnRWb2x1bWUoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm92aWRlciBhbmQgdXBkYXRlCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG5ldyBWb2x1bWVQcm92aWRlckNvbXBhdChjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lVG8oZmluYWwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWRqdXN0Vm9sdW1lKGZpbmFsIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgbU1zQ29tcGF0LnNldFBsYXliYWNrVG9SZW1vdGUobVZwQ29tcGF0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyVm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgICAgICAgICAgbU1zQ29tcGF0LnNldFBsYXliYWNrVG9Mb2NhbChtUGxheWJhY2tJbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldFRva2VuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtTXNDb21wYXQuZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IG1SY2NDb21wYXQ7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RlZDsKLQotICAgICAgICAgICAgcHVibGljIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQgPSBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0Lm9idGFpbihtQXBwbGljYXRpb25Db250ZXh0LCByY2MpOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJjY0NvbXBhdC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWJhY2tJbmZvKCkgewotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0UGxheWJhY2tJbmZvKG1QbGF5YmFja0luZm8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENhbGxiYWNrSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1UZW1wQ2FsbGJhY2tSZWNvcmRzID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4oKTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX01BU0sgPSAweGZmMDA7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfUk9VVEUgPSAweDAxMDA7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfUFJPVklERVIgPSAweDAyMDA7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9BRERFRCA9IE1TR19UWVBFX1JPVVRFIHwgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9SRU1PVkVEID0gTVNHX1RZUEVfUk9VVEUgfCAyOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDM7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDQ7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9VTlNFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA3OwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQURERUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfUkVNT1ZFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9DSEFOR0VEID0gTVNHX1RZUEVfUFJPVklERVIgfCAzOwotCi0gICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UobXNnLCBvYmopLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEgPSBhcmc7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzE7Ci0KLSAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNU0dfUk9VVEVfQ0hBTkdFRAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0U2VsZWN0ZWRSb3V0ZSgpLmdldElkKCkuZXF1YWxzKCgoUm91dGVJbmZvKSBvYmopLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBzdGF0ZSB3aXRoIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIod2hhdCwgb2JqKTsKLQotICAgICAgICAgICAgICAgIC8vIEludm9rZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCi0gICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBsaXN0IG9mIGNhbGxiYWNrcyBiZWZvcmUgaW52b2tpbmcgdGhlbSBpbiBjYXNlIGNhbGxiYWNrcwotICAgICAgICAgICAgICAgIC8vIGFyZSBhZGRlZCBvciByZW1vdmVkIGR1cmluZyBkaXNwYXRjaC4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmFkZEFsbChyb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2FsbGJhY2tDb3VudCA9IG1UZW1wQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmdldChpKSwgd2hhdCwgb2JqLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKGludCB3aGF0LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQWRkZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlUmVtb3ZlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVDaGFuZ2VkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVTZWxlY3RlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgaW52b2tlQ2FsbGJhY2soQ2FsbGJhY2tSZWNvcmQgcmVjb3JkLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgaW50IGFyZykgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyIHJvdXRlciA9IHJlY29yZC5tUm91dGVyOwotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrID0gcmVjb3JkLm1DYWxsYmFjazsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQgJiBNU0dfVFlQRV9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUk9VVEU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJvdXRlSW5mbyByb3V0ZSA9IChSb3V0ZUluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmQuZmlsdGVyUm91dGVFdmVudChyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVWb2x1bWVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1VOU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHJvdXRlciwgcm91dGUsIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9QUk9WSURFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gKFByb3ZpZGVySW5mbylvYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlckFkZGVkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyUmVtb3ZlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlckNoYW5nZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA2NTk2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgc2Vzc2lvbi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogV2hlbiBhIG1lZGlhIHNlc3Npb24gaXMgY3JlYXRlZCwgaXQgaXMgaW5pdGlhbGx5IGluIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRSBhY3RpdmV9IHN0YXRlLiAgV2hlbiB0aGUgbWVkaWEgc2Vzc2lvbiBlbmRzCi0gKiBub3JtYWxseSwgaXQgdHJhbnNpdGlvbnMgdG8gdGhlIHtAbGluayAjU0VTU0lPTl9TVEFURV9FTkRFRCBlbmRlZH0gc3RhdGUuCi0gKiBJZiB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBkdWUgdG8gYW5vdGhlciBzZXNzaW9uIGZvcmNpYmx5IHRha2luZwotICogY29udHJvbCBvZiB0aGUgcm91dGUsIHRoZW4gaXQgdHJhbnNpdGlvbnMgdG8gdGhlCi0gKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9IHN0YXRlLgotICogUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaXRzIG1lYW5pbmcuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHNlc3Npb24gc3RhdHVzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHN1cHBseSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byB1c2UgYXMgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gKiBmb3IgYSBnaXZlbiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHNlc3Npb24gc3RhcnQgcmVxdWVzdH0uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFTZXNzaW9uU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVNTSU9OX1NUQVRFID0gInNlc3Npb25TdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUVVFVUVfUEFVU0VEID0gInF1ZXVlUGF1c2VkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogQWN0aXZlLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIGlzIGFjdGl2ZSBhbmQgaW4gY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fU1RBVEVfQUNUSVZFID0gMDsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEVuZGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBlbmRlZCBub3JtYWxseSB1c2luZyB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0gYWN0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIHRlcm1pbmF0ZWQgbWVkaWEgc2Vzc2lvbiBjYW5ub3QgYmUgdXNlZCBhbnltb3JlLiAgVG8gcGxheSBtb3JlIG1lZGlhLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHN0YXJ0IGEgbmV3IHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fU1RBVEVfRU5ERUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGludmFsaWRhdGVkIGludm9sdW50YXJpbHkgZHVlIHRvCi0gICAgICogYW5vdGhlciBzZXNzaW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQW4gaW52YWxpZGF0ZWQgbWVkaWEgc2Vzc2lvbiBjYW5ub3QgYmUgdXNlZCBhbnltb3JlLiAgVG8gcGxheSBtb3JlIG1lZGlhLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHN0YXJ0IGEgbmV3IHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQgPSAyOwotCi0gICAgTWVkaWFTZXNzaW9uU3RhdHVzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgYm9vdCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0gdGltZSBiYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc3RhdHVzIHRpbWVzdGFtcCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZSgpfSB0aW1lIGJhc2UuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9USU1FU1RBTVApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uIHN0YXRlLiAgT25lIG9mIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkV9LAotICAgICAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9FTkRFRH0sIG9yIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRH0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZXNzaW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfU0VTU0lPTl9TVEFURSwgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXNzaW9uJ3MgcXVldWUgaXMgcGF1c2VkLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzZXNzaW9uJ3MgcXVldWUgaXMgcGF1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWVQYXVzZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVNlc3Npb25TdGF0dXN7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7Ci0gICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc2Vzc2lvblN0YXRlPSIpLmFwcGVuZChzZXNzaW9uU3RhdGVUb1N0cmluZyhnZXRTZXNzaW9uU3RhdGUoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHF1ZXVlUGF1c2VkPSIpLmFwcGVuZChpc1F1ZXVlUGF1c2VkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlc3Npb25TdGF0ZVRvU3RyaW5nKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJhY3RpdmUiOwotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0VOREVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZW5kZWQiOwotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZGF0ZWQiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHNlc3Npb25TdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFTZXNzaW9uU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHNlc3Npb24gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSBUaGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICAgICAgc2V0U2Vzc2lvblN0YXRlKHNlc3Npb25TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHNlc3Npb24gc3RhdHVzIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFTZXNzaW9uU3RhdHVzIHN0YXR1cykgewotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhdHVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc3RhdHVzLm1CdW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgYm9vdCBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0gdGltZSBiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGltZXN0YW1wKGxvbmcgZWxhcHNlZFJlYWx0aW1lVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX1RJTUVTVEFNUCwgZWxhcHNlZFJlYWx0aW1lVGltZXN0YW1wKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXNzaW9uU3RhdGUoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIHNlc3Npb25TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFF1ZXVlUGF1c2VkKGJvb2xlYW4gcXVldWVQYXVzZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VELCBxdWV1ZVBhdXNlZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlNGUyOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXIuRGVhdGhSZWNpcGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTWFpbnRhaW5zIGEgY29ubmVjdGlvbiB0byBhIHBhcnRpY3VsYXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZS4KLSAqLwotZmluYWwgY2xhc3MgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJQcm94eSI7ICAvLyBtYXguIDIzIGNoYXJzCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0gICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbGxlcj4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUJvdW5kOwotICAgIHByaXZhdGUgQ29ubmVjdGlvbiBtQWN0aXZlQ29ubmVjdGlvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpb25SZWFkeTsKLQotICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIG5ldyBQcm92aWRlck1ldGFkYXRhKGNvbXBvbmVudE5hbWUpKTsKLQotICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLCBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IENvbm5lY3RlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Cb3VuZCkgewotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyID0gKHNlcnZpY2UgIT0gbnVsbCA/IG5ldyBNZXNzZW5nZXIoc2VydmljZSkgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihtZXNzZW5nZXIpOwotICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogUmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIHJldHVybmVkIGludmFsaWQgbWVzc2VuZ2VyIGJpbmRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiU2VydmljZSBjb25uZWN0aW9uICIgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvbmVudE5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZS5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5nZXRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RhcnRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdG9wcGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmViaW5kSWZEaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBudWxsICYmIHNob3VsZEJpbmQoKSkgewotICAgICAgICAgICAgdW5iaW5kKCk7Ci0gICAgICAgICAgICBiaW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQmluZGluZygpIHsKLSAgICAgICAgaWYgKHNob3VsZEJpbmQoKSkgewotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5iaW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQmluZCgpIHsKLSAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZXJlIGlzIGEgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAoZ2V0RGlzY292ZXJ5UmVxdWVzdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGUgYXBwbGljYXRpb24gaGFzIGFuIGFjdGl2ZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IG9uZSBvZiB0aGlzIHByb3ZpZGVyJ3Mgcm91dGVzIGlzIHNlbGVjdGVkLgotICAgICAgICAgICAgaWYgKCFtQ29udHJvbGxlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBiaW5kKCkgewotICAgICAgICBpZiAoIW1Cb3VuZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnRlbnQgc2VydmljZSA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgc2VydmljZS5zZXRDb21wb25lbnQobUNvbXBvbmVudE5hbWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQm91bmQgPSBnZXRDb250ZXh0KCkuYmluZFNlcnZpY2Uoc2VydmljZSwgdGhpcywgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1Cb3VuZCAmJiBERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1bmJpbmQoKSB7Ci0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFVuYmluZGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIGdldENvbnRleHQoKS51bmJpbmRTZXJ2aWNlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSb3V0ZUNvbnRyb2xsZXIgY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzID0gZGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA9IHJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLmdldElkKCkuZXF1YWxzKHJvdXRlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5hZGQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmF0dGFjaENvbm5lY3Rpb24obUFjdGl2ZUNvbm5lY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uUmVhZHkoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBnZXREaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBkaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkVycm9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIGVycm9yKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZXJyb3IgLSAiICsgZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5iaW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogRGVzY3JpcHRvciBjaGFuZ2VkLCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IobnVsbCk7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29udHJvbGxlclJlbGVhc2VkKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBtQ29udHJvbGxlcnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICBjb250cm9sbGVyLmRldGFjaENvbm5lY3Rpb24oKTsKLSAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmF0dGFjaENvbm5lY3Rpb24obUFjdGl2ZUNvbm5lY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlR3JvdXBJZDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGVkOwotICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1NldFZvbHVtZSA9IC0xOwotICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhOwotCi0gICAgICAgIHByaXZhdGUgQ29ubmVjdGlvbiBtQ29ubmVjdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbnRyb2xsZXJJZDsKLQotICAgICAgICBwdWJsaWMgQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgbVJvdXRlSWQgPSByb3V0ZUlkOwotICAgICAgICAgICAgbVJvdXRlR3JvdXBJZCA9IHJvdXRlR3JvdXBJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaENvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgICAgICBtQ29udHJvbGxlcklkID0gY29ubmVjdGlvbi5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIobVJvdXRlSWQsIG1Sb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nU2V0Vm9sdW1lID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdTZXRWb2x1bWUpOwotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXRhY2hDb25uZWN0aW9uKCkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5yZWxlYXNlUm91dGVDb250cm9sbGVyKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcklkID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJSZWxlYXNlZCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7Ci0gICAgICAgICAgICBvblVuc2VsZWN0KE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51bnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQsIHJlYXNvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZXRWb2x1bWUobUNvbnRyb2xsZXJJZCwgdm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSB2b2x1bWU7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBkZWx0YSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgKz0gZGVsdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5zZW5kQ29udHJvbFJlcXVlc3QobUNvbnRyb2xsZXJJZCwgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbm5lY3Rpb24gaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1TZXJ2aWNlTWVzc2VuZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRSZXF1ZXN0SWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtTmV4dENvbnRyb2xsZXJJZCA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TZXJ2aWNlVmVyc2lvbjsgLy8gbm9uLXplcm8gd2hlbiByZWdpc3RyYXRpb24gY29tcGxldGUKLQotICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+IG1QZW5kaW5nQ2FsbGJhY2tzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4oKTsKLQotICAgICAgICBwdWJsaWMgQ29ubmVjdGlvbihNZXNzZW5nZXIgc2VydmljZU1lc3NlbmdlcikgewotICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIgPSBzZXJ2aWNlTWVzc2VuZ2VyOwotICAgICAgICAgICAgbVJlY2VpdmVIYW5kbGVyID0gbmV3IFJlY2VpdmVIYW5kbGVyKHRoaXMpOwotICAgICAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKCFzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JFR0lTVEVSLAotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICBDTElFTlRfVkVSU0lPTl9DVVJSRU5ULCBudWxsLCBudWxsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGJpbmRlckRpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VOUkVHSVNURVIsIDAsIDAsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgbVJlY2VpdmVIYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7Ci0KLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxQZW5kaW5nQ2FsbGJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZhaWxQZW5kaW5nQ2FsbGJhY2tzKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBlbmRpbmdDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy52YWx1ZUF0KGkpLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljRmFpbHVyZShpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25FcnJvcih0aGlzLCAiUmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNTdWNjZXNzKGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25SZWdpc3RlcmVkKGludCByZXF1ZXN0SWQsIGludCBzZXJ2aWNlVmVyc2lvbiwKLSAgICAgICAgICAgICAgICBCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkCi0gICAgICAgICAgICAgICAgICAgICYmIHNlcnZpY2VWZXJzaW9uID49IFNFUlZJQ0VfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VWZXJzaW9uID0gc2VydmljZVZlcnNpb247Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uUmVhZHkodGhpcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkRlc2NyaXB0b3JDaGFuZ2VkKEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RTdWNjZWVkZWQoaW50IHJlcXVlc3RJZCwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKGludCByZXF1ZXN0SWQsIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbi50aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkID0gbU5leHRDb250cm9sbGVySWQrKzsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQsIHJvdXRlSWQpOwotICAgICAgICAgICAgZGF0YS5wdXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUiwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdW5zZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZXh0cmFzLnB1dEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sIHJlYXNvbik7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIHZvbHVtZSk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVWb2x1bWUoaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgZGVsdGEpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VuZENvbnRyb2xSZXF1ZXN0KGludCBjb250cm9sbGVySWQsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBpZiAoc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgY29udHJvbGxlcklkLCBpbnRlbnQsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucHV0KHJlcXVlc3RJZCwgY2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIDAsIHJlcXVlc3QgIT0gbnVsbCA/IHJlcXVlc3QuYXNCdW5kbGUoKSA6IG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRSZXF1ZXN0KGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigpOwotICAgICAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7Ci0gICAgICAgICAgICBtc2cuYXJnMiA9IGFyZzsKLSAgICAgICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgICAgIG1zZy5yZXBseVRvID0gbVJlY2VpdmVNZXNzZW5nZXI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgc2VydmljZSBkaWVkLgotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdoYXQgIT0gQ0xJRU5UX01TR19VTlJFR0lTVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gc2VydmljZS4iLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpdmF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJpdmF0ZUhhbmRsZXIoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgc3RhdGljIGFuZCBvbmx5IHJldGFpbnMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgY29ubmVjdGlvbgotICAgICAqIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIHRoZSBzZXJ2aWNlIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBjbGllbnQncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIHNlcnZpY2UuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPiBtQ29ubmVjdGlvblJlZjsKLQotICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+KGNvbm5lY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25SZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcyOwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBkYXRhID0gbXNnLnBlZWtEYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzTWVzc2FnZShjb25uZWN0aW9uLCB3aGF0LCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVuaGFuZGxlZCBtZXNzYWdlIGZyb20gc2VydmVyOiAiICsgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRToKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNGYWlsdXJlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljU3VjY2VzcyhyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfUkVHSVNURVJFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25SZWdpc3RlcmVkKHJlcXVlc3RJZCwgYXJnLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25EZXNjcmlwdG9yQ2hhbmdlZCgoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RTdWNjZWVkZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAoZGF0YSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdEZhaWxlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBlcnJvciwgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZjY0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKioKLSAqIFdhdGNoZXMgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzIHRvIGJlIGluc3RhbGxlZC4KLSAqIEFkZHMgYSBwcm92aWRlciB0byB0aGUgbWVkaWEgcm91dGVyIGZvciBlYWNoIHJlZ2lzdGVyZWQgc2VydmljZS4KLSAqCi0gKiBAc2VlIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIKLSAqLwotZmluYWwgY2xhc3MgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPiBtUHJvdmlkZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmc7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoQ29udGV4dCBjb250ZXh0LCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0gICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgaWYgKCFtUnVubmluZykgewotICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOwotCi0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9DSEFOR0VEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFUExBQ0VEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFU1RBUlRFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOwotICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIsIGZpbHRlciwgbnVsbCwgbUhhbmRsZXIpOwotCi0gICAgICAgICAgICAvLyBTY2FuIHBhY2thZ2VzLgotICAgICAgICAgICAgLy8gQWxzbyBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIHJlc3RhcnRpbmcgcHJvdmlkZXJzIGlmIG5lZWRlZC4KLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobVNjYW5QYWNrYWdlc1J1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtUnVubmluZykgewotICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlcik7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVNjYW5QYWNrYWdlc1J1bm5hYmxlKTsKLQotICAgICAgICAgICAgLy8gU3RvcCBhbGwgcHJvdmlkZXJzLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qcm92aWRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNjYW5QYWNrYWdlcygpIHsKLSAgICAgICAgaWYgKCFtUnVubmluZykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHByb3ZpZGVycyBmb3IgYWxsIG5ldyBzZXJ2aWNlcy4KLSAgICAgICAgLy8gUmVvcmRlciB0aGUgbGlzdCBzbyB0aGF0IHByb3ZpZGVycyBsZWZ0IGF0IHRoZSBlbmQgd2lsbCBiZSB0aGUgb25lcyB0byByZW1vdmUuCi0gICAgICAgIGludCB0YXJnZXRJbmRleCA9IDA7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBmb3IgKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvIDogbVBhY2thZ2VNYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoaW50ZW50LCAwKSkgewotICAgICAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbzsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNvdXJjZUluZGV4ID0gZmluZFByb3ZpZGVyKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLCBzZXJ2aWNlSW5mby5uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyKG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLCBzZXJ2aWNlSW5mby5uYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHRhcmdldEluZGV4KyssIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmFkZFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4ID49IHRhcmdldEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChzb3VyY2VJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0YXJ0KCk7IC8vIHJlc3RhcnQgdGhlIHByb3ZpZGVyIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5yZWJpbmRJZkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKG1Qcm92aWRlcnMsIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgcHJvdmlkZXJzIGZvciBtaXNzaW5nIHNlcnZpY2VzLgotICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCBtUHJvdmlkZXJzLnNpemUoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qcm92aWRlcnMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZW1vdmVQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5yZW1vdmUocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlcihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmhhc0NvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtU2NhblBhY2thZ2VzUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TY2FuUGFja2FnZXNSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewotICAgICAgICB2b2lkIGFkZFByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgICAgIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2NDQ5Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBmZWF0dXJlcyBvZiB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICoKLSAqIEhpZGRlbiBmb3Igbm93IGJ1dCB3ZSBtaWdodCB3YW50IHRvIG1ha2UgdGhpcyBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zCi0gKiBpbiB0aGUgZnV0dXJlLgotICovCi1hYnN0cmFjdCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1SY2M7Ci0gICAgcHJvdGVjdGVkIFZvbHVtZUNhbGxiYWNrIG1Wb2x1bWVDYWxsYmFjazsKLQotICAgIHByb3RlY3RlZCBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0KENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1SY2MgPSByY2M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IG9idGFpbihDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQsIHJjYyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gbVJjYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHBsYXliYWNrIGluZm9ybWF0aW9uLgotICAgICAqIE11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgdG8gYXR0YWNoIHRvIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5mbyBUaGUgcGxheWJhY2sgaW5mb3JtYXRpb24uICBNdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrSW5mbyhQbGF5YmFja0luZm8gaW5mbykgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2UgcmVxdWVzdHMgZnJvbSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSB2b2x1bWUgY2FsbGJhY2sgdG8gdXNlIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtVm9sdW1lQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYXliYWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGxheWJhY2tJbmZvIHsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWU7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lTWF4OwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZUhhbmRsaW5nID0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9GSVhFRDsKLSAgICAgICAgcHVibGljIGludCBwbGF5YmFja1N0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tUeXBlID0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZvbHVtZSB1cGRhdGVzIGFyZSByZXF1ZXN0ZWQgYnkgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGluY3JlYXNlZCBvciBkZWNyZWFzZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gQW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZvbHVtZSBpcyB0byBiZSBpbmNyZWFzZWQKLSAgICAgICAgICogKHBvc2l0aXZlIHZhbHVlKSBvciBkZWNyZWFzZWQgKG5lZ2F0aXZlIHZhbHVlKS4KLSAgICAgICAgICogRm9yIGJ1bmRsZWQgY2hhbmdlcywgdGhlIGFic29sdXRlIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNoYW5nZXMKLSAgICAgICAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uLCBlLmcuICszIGNvcnJlc3BvbmRzIHRvIHRocmVlICJ2b2x1bWUgdXAiIGNoYW5nZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoaW50IGRpcmVjdGlvbik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB2b2x1bWUgZm9yIHRoZSByb3V0ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG5ldyB2b2x1bWUgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCwKLSAgICAgICAgICogYWx3YXlzIGJldHdlZW4gMCBhbmQgdGhlIHZhbHVlIHNldCBieSB7QGxpbmsgUGxheWJhY2tJbmZvI3ZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICogRG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIGZvciBKZWxseWJlYW4uCi0gICAgICoKLSAgICAgKiBUaGUgYmFzaWMgaWRlYSBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvIGF0dGFjaCB0aGUgUkNDIHRvIGEgVXNlclJvdXRlSW5mbwotICAgICAqIGluIG9yZGVyIHRvIGhvb2sgdXAgc3RyZWFtIG1ldGFkYXRhIGFuZCB2b2x1bWUgY2FsbGJhY2tzIGJlY2F1c2UgdGhlcmUgaXMgbm8KLSAgICAgKiBvdGhlciBBUEkgYXZhaWxhYmxlIHRvIGRvIHNvIGluIHRoaXMgcGxhdGZvcm0gdmVyc2lvbi4gIFRoZSBVc2VyUm91dGVJbmZvIGl0c2VsZgotICAgICAqIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgTWVkaWFSb3V0ZXIgc28gaXQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIuCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKLSAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmo7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVPYmo7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVnaXN0ZXJlZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0KLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVDYXRlZ29yeU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosICIiLCBmYWxzZSk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrSW5mbyhQbGF5YmFja0luZm8gaW5mbykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lTWF4KAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZU1heCk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8ucGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1R5cGUoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8ucGxheWJhY2tUeXBlKTsKLQotICAgICAgICAgICAgaWYgKCFtUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKG1Vc2VyUm91dGVPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVWb2x1bWVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZvbHVtZUNhbGxiYWNrV3JhcHBlcih0aGlzKSkpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UmVtb3RlQ29udHJvbENsaWVudChtVXNlclJvdXRlT2JqLCBtUmNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFZvbHVtZUNhbGxiYWNrV3JhcHBlcgotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlIGZyYW1ld29yayBuZXZlciB1bnJlZ2lzdGVycyBpdHMgdm9sdW1lIG9ic2VydmVyIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzZXJ2aWNlIHNvIHRoZSBVc2VyUm91dGVJbmZvIG9iamVjdCBtYXkgbGVhayBhbG9uZyB3aXRoCi0gICAgICAgICAgICAvLyBhbnkgY2FsbGJhY2tzIHRoYXQgd2UgYXR0YWNoIHRvIGl0LiAgVXNlIGEgd2VhayByZWZlcmVuY2UgdG8gcHJldmVudAotICAgICAgICAgICAgLy8gdGhlIHZvbHVtZSBjYWxsYmFjayBmcm9tIGhvbGRpbmcgc3Ryb25nIHJlZmVyZW5jZXMgdG8gYW55dGhpbmcgaW1wb3J0YW50LgotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+IG1JbXBsV2VhazsKLQotICAgICAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrV3JhcHBlcihKZWxseWJlYW5JbXBsIGltcGwpIHsKLSAgICAgICAgICAgICAgICBtSW1wbFdlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPihpbXBsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3QoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlMTQ5Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBwbGF5aW5nIG1lZGlhIG9uIHJlbW90ZSByb3V0ZXMgdXNpbmcgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAotICogZGVmaW5lZCBieSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50fS4KLSAqIDxwPgotICogVGhlIGNsaWVudCBtYWludGFpbnMgc2Vzc2lvbiBzdGF0ZSBhbmQgb2ZmZXJzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgZm9yIGlzc3VpbmcKLSAqIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGludGVudHMgdG8gYSBzaW5nbGUgcm91dGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVQbGF5YmFja0NsaWVudCB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlUGxheWJhY2tDbGllbnQiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjdGlvblJlY2VpdmVyIG1BY3Rpb25SZWNlaXZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1NZXNzYWdlUGVuZGluZ0ludGVudDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1F1ZXVpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotCi0gICAgU3RyaW5nIG1TZXNzaW9uSWQ7Ci0gICAgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrOwotICAgIE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBmb3IgYSByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgbWVkaWEgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIFJlbW90ZVBsYXliYWNrQ2xpZW50KENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotCi0gICAgICAgIEludGVudEZpbHRlciBhY3Rpb25GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1BY3Rpb25SZWNlaXZlciA9IG5ldyBBY3Rpb25SZWNlaXZlcigpOwotICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyLCBhY3Rpb25GaWx0ZXIpOwotCi0gICAgICAgIEludGVudCBpdGVtU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGl0ZW1TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBpdGVtU3RhdHVzSW50ZW50LCAwKTsKLQotICAgICAgICBJbnRlbnQgc2Vzc2lvblN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBzZXNzaW9uU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgc2Vzc2lvblN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IG1lc3NhZ2VJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKLSAgICAgICAgbWVzc2FnZUludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1NZXNzYWdlUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIG1lc3NhZ2VJbnRlbnQsIDApOwotICAgICAgICBkZXRlY3RGZWF0dXJlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBvd25lZCBieSB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjaywgdGhlbiBub25lIG9mIHRoZSBmdW5jdGlvbmFsaXR5Ci0gICAgICogb2ZmZXJlZCBieSB0aGUgY2xpZW50IHdpbGwgYmUgYXZhaWxhYmxlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgZm9sbG93aW5nCi0gICAgICogYWN0aW9uczoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIHNlZWt9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1c30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UgcGF1c2V9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHJlbW90ZSBwbGF5YmFjayBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBxdWV1aW5nIGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcsIHRoZW4gYXQgbW9zdCBvbmUgbWVkaWEgaXRlbSBjYW4gYmUgcGxheWVkCi0gICAgICogYXQgYSB0aW1lIGFuZCB0aGUge0BsaW5rICNlbnF1ZXVlfSBtZXRob2Qgd2lsbCBub3QgYmUgYXZhaWxhYmxlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBxdWV1aW5nIGlzIHN1cHBvcnRlZC4gIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfQotICAgICAqIGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1F1ZXVpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LCB0aGVuIHRoZSBzZXNzaW9uIHdpbGwKLSAgICAgKiBub3QgYmUgY3JlYXRlZCB1bnRpbCB0aGUgZmlyc3QgbWVkaWEgaXRlbSBpcyBwbGF5ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIGdldCBzZXNzaW9uIHN0YXR1c30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgotICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBtZXNzYWdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRSBzZW5kIG1lc3NhZ2V9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnaW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogSXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHNldCB0aGUgc2Vzc2lvbiBpZCBleHBsaWNpdGx5IHNpbmNlCi0gICAgICogaXQgaXMgY3JlYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIG90aGVyIHJlcXVlc3RzIHN1Y2ggYXMKLSAgICAgKiB7QGxpbmsgI3BsYXl9LCB7QGxpbmsgI2VucXVldWV9LCBhbmQge0BsaW5rICNzdGFydFNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkKFN0cmluZyBzZXNzaW9uSWQpIHsKLSAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtU2Vzc2lvbklkLCBzZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlkIGlzIG5vdzogIiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvbkNoYW5nZWQoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpZW50IGN1cnJlbnRseSBoYXMgYSBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIEVxdWl2YWxlbnQgdG8gY2hlY2tpbmcgd2hldGhlciB7QGxpbmsgI2dldFNlc3Npb25JZH0gcmV0dXJucyBhIG5vbi1udWxsIHJlc3VsdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzU2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCBzaG91bGQgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyB3aGVuIHRoZSBzdGF0ZSBvZgotICAgICAqIG1lZGlhIHNlc3Npb25zIG9yIG1lZGlhIGl0ZW1zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlCi0gICAgICogcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgb3IgYW55IHBsYXkKLSAgICAgKiBjb21tYW5kcyBhcmUgaXNzdWVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNDYWxsYmFjayhTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtU3RhdHVzQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCBzaG91bGQgcmVjZWl2ZSBtZXNzYWdlcyB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IGZyb20KLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcihPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBsYXkgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIENsZWFycyB0aGUgcXVldWUgYW5kIHN0YXJ0cyBwbGF5aW5nIHRoZSBuZXcgaXRlbSBpbW1lZGlhdGVseS4gIElmIHRoZSBxdWV1ZQotICAgICAqIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiBpdCBpcyByZXN1bWVkIGFzIGEgc2lkZS1lZmZlY3Qgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIG5vIHNlc3Npb24gaXMgYXZhaWxhYmxlLCB0aGVuCi0gICAgICogb25lIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgQUNUSU9OX1BMQVl9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRVcmkgVGhlIGNvbnRlbnQgVXJpIHRvIHBsYXkuCi0gICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZWRpYSBpdGVtIG1ldGFkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBsYXkoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbnF1ZXVlIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBFbnF1ZXVlcyBhIG5ldyBpdGVtIHRvIHBsYXkuICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIHdpbGwKLSAgICAgKiByZW1haW4gcGF1c2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIG5vIHNlc3Npb24gaXMgYXZhaWxhYmxlLCB0aGVuCi0gICAgICogb25lIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgQUNUSU9OX0VOUVVFVUV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRVcmkgVGhlIGNvbnRlbnQgVXJpIHRvIGVucXVldWUuCi0gICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZWRpYSBpdGVtIG1ldGFkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1F1ZXVpbmdTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheU9yRW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRlbnRVcmkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZSZW1vdGVQbGF5YmFja05vdFN1cHBvcnRlZCgpOwotICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpKSB7Ci0gICAgICAgICAgICB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKLSAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGNvbnRlbnRVcmksIG1pbWVUeXBlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIsCi0gICAgICAgICAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9NRVRBREFUQSwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3NpdGlvbk1pbGxpcyAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHNlZWsgdG8gYSBuZXcgcG9zaXRpb24gaW4gYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFNlZWtzIHRvIGEgbmV3IHBvc2l0aW9uLiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCB0aGVuIGl0Ci0gICAgICogcmVtYWlucyBwYXVzZWQgYnV0IHRoZSBpdGVtJ3MgbmV3IHBvc2l0aW9uIGlzIHN0aWxsIHJlbWVtYmVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBBQ1RJT05fU0VFS30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgbmV3IGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUt9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWVrKFN0cmluZyBpdGVtSWQsIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIEFDVElPTl9HRVRfU1RBVFVTfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFN0YXR1cyhTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKTsKLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byByZW1vdmUgYSBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIEFDVElPTl9SRU1PVkV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1F1ZXVpbmdTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwYXVzZSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIGFscmVhZHkgcGF1c2VkCi0gICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UgQUNUSU9OX1BBVVNFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhdXNlKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byByZXN1bWUgKHVucGF1c2UpIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgbm90IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSBBQ1RJT05fUkVTVU1FfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzdW1lKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RvcCBtZWRpYSBwbGF5YmFjayBhbmQgY2xlYXIgdGhlIG1lZGlhIHBsYXliYWNrIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkKLSAgICAgKiBlbXB0eSB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIEFDVElPTl9TVE9QfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1B9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0YXJ0IGEgbmV3IG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgdGhpcyByZXF1ZXN0Ci0gICAgICogaXMgY29tcGxldGUgYmVmb3JlIGlzc3Vpbmcgb3RoZXIgcmVxdWVzdHMgdGhhdCBhZmZlY3QgdGhlIHNlc3Npb24uICBJZiB0aGlzCi0gICAgICogcmVxdWVzdCBpcyBzdWNjZXNzZnVsIHRoZW4gdGhlIHByZXZpb3VzIHNlc3Npb24gd2lsbCBiZSBpbnZhbGlkYXRlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gQUNUSU9OX1NUQVJUX1NFU1NJT059Ci0gICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgaWYgKG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0VfUkVDRUlWRVIsIG1NZXNzYWdlUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIG1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0V9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFCi0gICAgICogQHNlZSAjaXNNZXNzYWdpbmdTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShCdW5kbGUgbWVzc2FnZSwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0gICAgICAgIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG1lc3NhZ2UsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTZXNzaW9uU3RhdHVzKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVuZCB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoaXMgcmVxdWVzdCBpcyBzdWNjZXNzZnVsLAotICAgICAqIHRoZSB7QGxpbmsgI2dldFNlc3Npb25JZCBzZXNzaW9uIGlkIHByb3BlcnR5fSB3aWxsIGJlIHNldCB0byBudWxsIGFmdGVyCi0gICAgICogdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBBQ1RJT05fRU5EX1NFU1NJT059Ci0gICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtSXRlbUFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwgZmluYWwgU3RyaW5nIGl0ZW1JZCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lELCBpdGVtSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKLSAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChpdGVtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCAmJiBpdGVtSWRSZXN1bHQgIT0gbnVsbCAmJiBpdGVtU3RhdHVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHJlc3VsdCBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEsIHNlc3Npb25JZFJlc3VsdCwgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkUmVzdWx0LCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHJlc3VsdCBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEsIHNlc3Npb25JZFJlc3VsdCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXNzaW9uSWRSZXN1bHQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb25JZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgYWRvcHRTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgaGFuZGxlSW52YWxpZFJlc3VsdChJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIExvZy53KFRBRywgIlJlY2VpdmVkIGludmFsaWQgcmVzdWx0IGRhdGEgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKSk7Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04sIGRhdGEpOwotICAgIH0KLQotICAgIHZvaWQgaGFuZGxlRXJyb3IoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb2RlOwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb2RlID0gZGF0YS5nZXRJbnQoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0VSUk9SX0NPREUsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvZGUgPSBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlJlY2VpdmVkIGVycm9yIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICArICI6IGVycm9yPSIgKyBlcnJvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNvZGU9IiArIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FsbGJhY2sub25FcnJvcihlcnJvciwgY29kZSwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRldGVjdEZlYXR1cmVzKCkgewotICAgICAgICBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrID0gcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBtUm91dGVTdXBwb3J0c1F1ZXVpbmcgPSBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQgPSBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pOwotICAgICAgICBtUm91dGVTdXBwb3J0c01lc3NhZ2luZyA9IGRvZXNSb3V0ZVN1cHBvcnRNZXNzYWdpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcm91dGVTdXBwb3J0c0FjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGUuc3VwcG9ydHNDb250cm9sQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0ssIGFjdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRvZXNSb3V0ZVN1cHBvcnRNZXNzYWdpbmcoKSB7Ci0gICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IG1Sb3V0ZS5nZXRDb250cm9sRmlsdGVycygpKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZSZW1vdGVQbGF5YmFja05vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjay4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1F1ZXVpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICsgInNlc3Npb24gbWFuYWdlbWVudC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCkgewotICAgICAgICBpZiAobVNlc3Npb25JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGluZmVyTWlzc2luZ1Jlc3VsdChTdHJpbmcgcmVxdWVzdCwgU3RyaW5nIHJlc3VsdCkgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFJlc3VsdCBpcyBtaXNzaW5nLgotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0LmVxdWFscyhyZXN1bHQpKSB7Ci0gICAgICAgICAgICAvLyBSZXF1ZXN0IGRpZG4ndCBzcGVjaWZ5IGEgdmFsdWUgb3IgcmVzdWx0IG1hdGNoZXMgcmVxdWVzdC4KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVzdWx0IGNvbmZsaWN0cyB3aXRoIHJlcXVlc3QuCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nUmVxdWVzdChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2VuZGluZyByZXF1ZXN0OiAiICsgaW50ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgYnVuZGxlVG9TdHJpbmcoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZS5zaXplKCk7IC8vIGZvcmNlIGJ1bmRsZSB0byBiZSB1bnBhcmNlbGxlZAotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBY3Rpb25SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEIjsKLQotICAgICAgICBBY3Rpb25SZWNlaXZlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gbnVsbCB8fCAhc2Vzc2lvbklkLmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIndpdGggbWlzc2luZyBvciBpbnZhbGlkIHNlc3Npb24gaWQ6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgd2l0aCBtaXNzaW5nIGl0ZW0gaWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgd2l0aCBtaXNzaW5nIGl0ZW0gc3RhdHVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIGl0ZW0gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25JdGVtU3RhdHVzQ2hhbmdlZChpbnRlbnQuZ2V0RXh0cmFzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzLCBpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgbWVkaWEgc3RhdHVzIGNhbGxiYWNrIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsibWlzc2luZyBzZXNzaW9uIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBzZXNzaW9uIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uU3RhdHVzQ2hhbmdlZChpbnRlbnQuZ2V0RXh0cmFzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIG1lc3NhZ2UgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lci5vbk1lc3NhZ2VSZWNlaXZlZChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZWRpYSBzdGF0dXMgdXBkYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c0NhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24gY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25DaGFuZ2VkKFN0cmluZyBzZXNzaW9uSWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2UgY2FsbGJhY2sgdHlwZSBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3QgZmFpbHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBlcnJvciBBIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHdoaWNoIG1heSBiZSBzaG93biB0byB0aGUgdXNlciwgb3IgbnVsbAotICAgICAgICAgKiBpZiB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzIHVuY2xlYXIuCi0gICAgICAgICAqIEBwYXJhbSBjb2RlIFRoZSBlcnJvciBjb2RlLCBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VSUk9SX1VOS05PV059IGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBlcnJvciBkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIGludCBjb2RlLCBCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyB0aGF0IG9wZXJhdGUgb24gaXRlbXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQWN0aW9uQ2FsbGJhY2sgZXh0ZW5kcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyB0aGF0IG9wZXJhdGUgb24gc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgZXh0ZW5kcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtZWRpYSBzZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIHJlY2VpdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKFN0cmluZyBzZXNzaW9uSWQsIEJ1bmRsZSBtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODQ5MWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgcm91dGVzIGZvciBidWlsdC1pbiBzeXN0ZW0gZGVzdGluYXRpb25zIHN1Y2ggYXMgdGhlIGxvY2FsIGRpc3BsYXkKLSAqIGFuZCBzcGVha2VyLiAgT24gSmVsbHliZWFuIGFuZCBuZXdlciBwbGF0Zm9ybSByZWxlYXNlcywgcXVlcmllcyB0aGUgZnJhbWV3b3JrCi0gKiBNZWRpYVJvdXRlciBmb3IgZnJhbWV3b3JrLXByb3ZpZGVkIHJvdXRlcyBhbmQgcmVnaXN0ZXJzIG5vbi1mcmFtZXdvcmstcHJvdmlkZWQKLSAqIHJvdXRlcyBhcyB1c2VyIHJvdXRlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbU1lZGlhUm91dGVQcm92aWRlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ST1VURV9JRCA9ICJERUZBVUxUX1JPVVRFIjsKLQotICAgIHByb3RlY3RlZCBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0VfTkFNRSwKLSAgICAgICAgICAgICAgICBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG9idGFpbihDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyNCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcGkyNEltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbk1yMkltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE3KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbk1yMUltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIGFkZGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUFkZGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyByZW1vdmVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIGNoYW5nZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2tzIGludG8gdGhlIG1lZGlhIHJvdXRlciB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBvblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RSRUFNID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBDT05UUk9MX0ZJTFRFUlM7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0KLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFZvbHVtZUNoYW5nZVJlY2VpdmVyIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlcjsKLSAgICAgICAgaW50IG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSAtMTsKLQotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgPSBuZXcgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIoKTsKLQotICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihWb2x1bWVDaGFuZ2VSZWNlaXZlci5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04pKTsKLSAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKLSAgICAgICAgICAgIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBtTGFzdFJlcG9ydGVkVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlZmF1bHRSb3V0ZSA9IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JPVVRFX0lELCByLmdldFN0cmluZyhSLnN0cmluZy5tcl9zeXN0ZW1fcm91dGVfbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRDb250cm9sRmlsdGVycyhDT05UUk9MX0ZJTFRFUlMpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQbGF5YmFja1N0cmVhbShQTEFZQkFDS19TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQbGF5YmFja1R5cGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVIYW5kbGluZyhNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lTWF4KG1heFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShtTGFzdFJlcG9ydGVkVm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBwcm92aWRlckRlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFJvdXRlKGRlZmF1bHRSb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKHByb3ZpZGVyRGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCkgewotICAgICAgICAgICAgaWYgKHJvdXRlSWQuZXF1YWxzKERFRkFVTFRfUk9VVEVfSUQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Um91dGVDb250cm9sbGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOwotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3Vm9sdW1lID0gTWF0aC5taW4obWF4Vm9sdW1lLCBNYXRoLm1heCgwLCB2b2x1bWUgKyBkZWx0YSkpOwotICAgICAgICAgICAgICAgIGlmIChuZXdWb2x1bWUgIT0gdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgY2xhc3MgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgICAgICAvLyBUaGVzZSBjb25zdGFudHMgY29tZSBmcm9tIEF1ZGlvTWFuYWdlci4KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPTFVNRV9DSEFOR0VEX0FDVElPTiA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLlZPTFVNRV9DSEFOR0VEX0FDVElPTiI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUiOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUiOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhWT0xVTUVfQ0hBTkdFRF9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdHJlYW1UeXBlID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBQTEFZQkFDS19TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwICYmIHZvbHVtZSAhPSBtTGFzdFJlcG9ydGVkVm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2ssIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlM7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotCi0gICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlM7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jQ2FsbGJhY2sgbVN5bmNDYWxsYmFjazsKLQotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbUNhbGxiYWNrT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Wb2x1bWVDYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbVJvdXRlVHlwZXM7Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1BY3RpdmVTY2FuOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FsbGJhY2tSZWdpc3RlcmVkOwotCi0gICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIGZyYW1ld29yayByb3V0ZXMgdG8gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcy4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgdGhlIHRhZyBmaWVsZCBmb3IgdGhpcyBiZWNhdXNlIGFuIGFwcGxpY2F0aW9uIG1heQotICAgICAgICAvLyBoYXZlIHB1Ymxpc2hlZCBpdHMgb3duIHVzZXIgcm91dGVzIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIGFuZCBhbHJlYWR5Ci0gICAgICAgIC8vIHVzZWQgdGhlIHRhZyBmb3IgaXRzIG93biBwdXJwb3Nlcy4KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxTeXN0ZW1Sb3V0ZVJlY29yZD4gbVN5c3RlbVJvdXRlUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTeXN0ZW1Sb3V0ZVJlY29yZD4oKTsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBzdXBwb3J0IGxpYnJhcnkgcm91dGVzIHRvIGZyYW1ld29yayByb3V0ZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPiBtVXNlclJvdXRlUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbi5HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtU3luY0NhbGxiYWNrID0gc3luY0NhbGxiYWNrOwotICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbUNhbGxiYWNrT2JqID0gY3JlYXRlQ2FsbGJhY2tPYmooKTsKLSAgICAgICAgICAgIG1Wb2x1bWVDYWxsYmFja09iaiA9IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCk7Ci0KLSAgICAgICAgICAgIFJlc291cmNlcyByID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVDYXRlZ29yeU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSksIGZhbHNlKTsKLQotICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGVJZCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5c3RlbVJvdXRlQ29udHJvbGxlcihyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaW50IG5ld1JvdXRlVHlwZXMgPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBuZXdBY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yID0gcmVxdWVzdC5nZXRTZWxlY3RvcigpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBjYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5ID0gY2F0ZWdvcmllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld0FjdGl2ZVNjYW4gPSByZXF1ZXN0LmlzQWN0aXZlU2NhbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gbmV3Um91dGVUeXBlcyB8fCBtQWN0aXZlU2NhbiAhPSBuZXdBY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlVHlwZXMgPSBuZXdSb3V0ZVR5cGVzOwotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuID0gbmV3QWN0aXZlU2NhbjsKLSAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbVJvdXRlcygpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHJvdXRlT2JqIDogTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0Um91dGVzKG1Sb3V0ZXJPYmopKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKSA8IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBhc3NpZ25Sb3V0ZUlkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmosIGlkKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBtU3lzdGVtUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVJZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHNob3VsZCBzdXBwbHkgYSB1bmlxdWUgcm91dGUgaWQgdGhhdAotICAgICAgICAgICAgLy8gd2UgY2FuIHVzZSBoZXJlLiAgRm9yIG5vdyB3ZSB1c2UgYSBoYXNoIG9mIHRoZSByb3V0ZSBuYW1lIGFuZCB0YWtlIGNhcmUKLSAgICAgICAgICAgIC8vIHRvIGRlZHVwZSBpdC4KLSAgICAgICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0ID0gKGdldERlZmF1bHRSb3V0ZSgpID09IHJvdXRlT2JqKTsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGlzRGVmYXVsdCA/IERFRkFVTFRfUk9VVEVfSUQgOgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIlJPVVRFXyUwOHgiLCBnZXRSb3V0ZU5hbWUocm91dGVPYmopLmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKGlkKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMjsgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3SWQgPSBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIiVzXyVkIiwgaWQsIGkpOwotICAgICAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChuZXdJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUm91dGVSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbmV3Vm9sdW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWb2x1bWUgIT0gcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobmV3Vm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKHJvdXRlT2JqICE9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgdXNlclJvdXRlUmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmICh1c2VyUm91dGVSZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVzZXJSb3V0ZVJlY29yZC5tUm91dGUuc2VsZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgcm91dGUgaWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbm90LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbnN0ZWFkIHdoZW4gdGhlIHJvdXRlIGlzIGFkZGVkLgotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtU3luY0NhbGxiYWNrLm9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIHdoZW4gYSByb3V0ZSBpcyB1bnNlbGVjdGVkLgotICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB3aGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCkgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5ncm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUFkZGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFVzZXJSb3V0ZVJlY29yZChyb3V0ZSwgcm91dGVPYmopOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5zZXRUYWcocm91dGVPYmosIHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyb3V0ZU9iaiwgbVZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVVzZXJSb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uYWRkVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ld2x5IGFkZGVkIHJvdXRlIGlzIHRoZSBjb3VudGVycGFydCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgLy8gcm91dGUgaW4gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgdGhlbiBlbnN1cmUgaXQgaXMgc2VsZWN0ZWQgaW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTKTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5zZXRUYWcocmVjb3JkLm1Sb3V0ZU9iaiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socmVjb3JkLm1Sb3V0ZU9iaiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZVVzZXJSb3V0ZShtUm91dGVyT2JqLCByZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmICghcm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kU3lzdGVtUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVPYmogPT0gcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Vc2VyUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVc2VyUm91dGVSZWNvcmQgZ2V0VXNlclJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgT2JqZWN0IHRhZyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRUYWcocm91dGVPYmopOwotICAgICAgICAgICAgcmV0dXJuIHRhZyBpbnN0YW5jZW9mIFVzZXJSb3V0ZVJlY29yZCA/IChVc2VyUm91dGVSZWNvcmQpdGFnIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIHJlY3JlYXRlIHRoZSByb3V0ZSBkZXNjcmlwdG9yIHdoZW4gbWFraW5nIGFueSBjaGFuZ2VzCi0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGltbXV0YWJsZSBvbmNlIHB1Ymxpc2hlZC4KLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLCBnZXRSb3V0ZU5hbWUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOwotICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJvdXRlTmFtZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIFJvdXRlcyBzaG91bGQgbm90IGhhdmUgbnVsbCBuYW1lcyBidXQgaXQgbWF5IGhhcHBlbiBmb3IgYmFkbHkgY29uZmlndXJlZAotICAgICAgICAgICAgLy8gdXNlciByb3V0ZXMuICBXZSB0b2xlcmF0ZSB0aGlzIGJ5IHVzaW5nIGFuIGVtcHR5IG5hbWUgc3RyaW5nIGhlcmUgYnV0Ci0gICAgICAgICAgICAvLyBzdWNoIHVubmFtZWQgcm91dGVzIHdpbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdXBzdHJlYW0KLSAgICAgICAgICAgIC8vICh3aXRoIGEgbG9nIG1lc3NhZ2Ugc28gd2UgY2FuIHRyYWNrIGRvd24gdGhlIHByb2JsZW0pLgotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG5hbWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0TmFtZShyb3V0ZU9iaiwgZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lLnRvU3RyaW5nKCkgOiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgaW50IHN1cHBvcnRlZFR5cGVzID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFN1cHBvcnRlZFR5cGVzKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmICgoc3VwcG9ydGVkVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU8pICE9IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xGaWx0ZXJzKExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc3VwcG9ydGVkVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8pICE9IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xGaWx0ZXJzKExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVpbGRlci5zZXRQbGF5YmFja1R5cGUoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1R5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrU3RyZWFtKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lTWF4KAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lTWF4KHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVIYW5kbGluZyhyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1R5cGUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lTWF4KAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZUNhbGxiYWNrKG1Sb3V0ZXJPYmosIG1DYWxsYmFja09iaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uYWRkQ2FsbGJhY2sobVJvdXRlck9iaiwgbVJvdXRlVHlwZXMsIG1DYWxsYmFja09iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVWb2x1bWVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpLm1Sb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyCi0gICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgc3VwcG9ydCBsaWJyYXJ5IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Sb3V0ZURlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBtUm91dGVEZXNjcmlwdG9yOyAvLyBhc3NpZ25lZCBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbgotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgICAgICBtUm91dGVEZXNjcmlwdG9ySWQgPSBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgc3VwcG9ydCBsaWJyYXJ5IG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZVJlY29yZCB7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0U2V0Vm9sdW1lKG1Sb3V0ZU9iaiwgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFVwZGF0ZVZvbHVtZShtUm91dGVPYmosIGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjEgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNykKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjFJbXBsIGV4dGVuZHMgSmVsbHliZWFuSW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5DYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbk1yMUltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGludCBuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQgPSAobmV3UHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkuZ2V0RGlzcGxheUlkKCkgOiAtMSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOwotCi0gICAgICAgICAgICBpZiAoIU1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5pc0VuYWJsZWQocmVjb3JkLm1Sb3V0ZU9iaikpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNDb25uZWN0aW5nKHJlY29yZCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvbm5lY3RpbmcodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpc3BsYXkgcHJlc2VudGF0aW9uRGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKHByZXNlbnRhdGlvbkRpc3BsYXkuZ2V0RGlzcGxheUlkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlQ2FsbGJhY2soKTsKLQotICAgICAgICAgICAgaWYgKG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLCBnZXRIYW5kbGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kLnNldEFjdGl2ZVNjYW5Sb3V0ZVR5cGVzKG1BY3RpdmVTY2FuID8gbVJvdXRlVHlwZXMgOiAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLmNyZWF0ZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUlzQ29ubmVjdGluZ1dvcmthcm91bmQuaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIE1SMiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE4KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMkltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjFJbXBsIHsKLSAgICAgICAgcHVibGljIEplbGx5YmVhbk1yMkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uZ2V0RGVzY3JpcHRpb24ocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlVzZXJSb3V0ZUluZm8uc2V0RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZUNhbGxiYWNrKG1Sb3V0ZXJPYmosIG1DYWxsYmFja09iaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuYWRkQ2FsbGJhY2sobVJvdXRlck9iaiwgbVJvdXRlVHlwZXMsIG1DYWxsYmFja09iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgICAgICAgICB8IChtQWN0aXZlU2NhbiA/IE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiA6IDApKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwaTI0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMjQpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXBpMjRJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIySW1wbCB7Ci0gICAgICAgIHB1YmxpYyBBcGkyNEltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOwotCi0gICAgICAgICAgICBidWlsZGVyLnNldERldmljZVR5cGUoTWVkaWFSb3V0ZXJBcGkyNC5Sb3V0ZUluZm8uZ2V0RGV2aWNlVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyYWFmMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLQotPGJvZHk+Ci0KLTxwPkNvbnRhaW5zIEFQSXMgdGhhdCBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlCi0gIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY0NzFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTWFyZ2luTGF5b3V0UGFyYW1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEJhc2VMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXBJbXBsIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cCBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1Qcml2YXRlUHJvdmlkZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBtTWF0Y2hQYXJlbnRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PigxKTsKLQotICAgIHB1YmxpYyBCYXNlTGF5b3V0KFZpZXdHcm91cCBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICAgICAgbVByaXZhdGVQcm92aWRlciA9IHByaXZhdGVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBwKSB7Ci0gICAgICAgIHJldHVybiBwIGluc3RhbmNlb2YgTWFyZ2luTGF5b3V0UGFyYW1zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMobUluc3RhbmNlLmdldENvbnRleHQoKSwgYXR0cnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgaWYgKGxwIGluc3RhbmNlb2YgTWFyZ2luTGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUluc3RhbmNlLmdldENoaWxkQ291bnQoKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuID0KLSAgICAgICAgICAgICAgICBWaWV3Lk1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3Lk1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWTsKLSAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uY2xlYXIoKTsKLQotICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gMDsKLSAgICAgICAgaW50IG1heFdpZHRoID0gMDsKLSAgICAgICAgaW50IGNoaWxkU3RhdGUgPSAwOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCwgd2lkdGhNZWFzdXJlU3BlYywgMCwgaGVpZ2h0TWVhc3VyZVNwZWMsIDApOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCkgKyBscC5sZWZ0TWFyZ2luICsgbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPSBjaGlsZFN0YXRlIHwgY2hpbGQuZ2V0TWVhc3VyZWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWNjb3VudCBmb3IgcGFkZGluZyB0b28KLSAgICAgICAgbWF4V2lkdGggKz0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgbWF4SGVpZ2h0ICs9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCBvdXIgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCi0gICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKSk7Ci0gICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCBvdXIgZm9yZWdyb3VuZCdzIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBmaW5hbCBEcmF3YWJsZSBkcmF3YWJsZSA9IG1JbnN0YW5jZS5nZXRGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIGRyYXdhYmxlLmdldE1pbmltdW1IZWlnaHQoKSk7Ci0gICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBkcmF3YWJsZS5nZXRNaW5pbXVtV2lkdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4V2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkU3RhdGUpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heEhlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFN0YXRlIDw8IFZpZXcuTUVBU1VSRURfSEVJR0hUX1NUQVRFX1NISUZUKSk7Ci0KLSAgICAgICAgY291bnQgPSBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIGlmIChjb3VudCA+IDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aE1lYXN1cmVTcGVjOwotICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IG1JbnN0YW5jZS5nZXRDaGlsZE1lYXN1cmVTcGVjKHdpZHRoTWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5sZWZ0TWFyZ2luICsgbHAucmlnaHRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAud2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjOwotICAgICAgICAgICAgICAgIGlmIChscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbik7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IG1JbnN0YW5jZS5nZXRDaGlsZE1lYXN1cmVTcGVjKGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjaGlsZFdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUluc3RhbmNlLmdldENoaWxkQ291bnQoKTsKLQotICAgICAgICBmaW5hbCBpbnQgcGFyZW50TGVmdCA9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgZmluYWwgaW50IHBhcmVudFJpZ2h0ID0gcmlnaHQgLSBsZWZ0IC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICBmaW5hbCBpbnQgcGFyZW50VG9wID0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRCb3R0b20gPSBib3R0b20gLSB0b3AgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRMZWZ0OwotICAgICAgICAgICAgICAgIGludCBjaGlsZFRvcDsKLQotICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IHBhcmVudExlZnQgKyAocGFyZW50UmlnaHQgLSBwYXJlbnRMZWZ0IC0gd2lkdGgpIC8gMiArCi0gICAgICAgICAgICAgICAgICAgICAgICBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW47Ci0KLSAgICAgICAgICAgICAgICBjaGlsZFRvcCA9IHBhcmVudFRvcCArIChwYXJlbnRCb3R0b20gLSBwYXJlbnRUb3AgLSBoZWlnaHQpIC8gMiArCi0gICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW47Ci0KLSAgICAgICAgICAgICAgICBjaGlsZC5sYXlvdXQoY2hpbGRMZWZ0LCBjaGlsZFRvcCwgY2hpbGRMZWZ0ICsgd2lkdGgsIGNoaWxkVG9wICsgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdSaWdodCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdSaWdodCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSArIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmZjE1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xWaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0IGltcGxlbWVudHMgTWVkaWFDb250cm9sVmlldzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xWaWV3MiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbFZpZXcyIG1JbnN0YW5jZTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4gPSAiZnVsbFNjcmVlbiI7Ci0KLSAgICAvLyBUT0RPOiBNb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBwdWJsaWMgYXBpIHRvIHN1cHBvcnQgY3VzdG9tIHZpZGVvIHZpZXcuCi0gICAgLy8gVE9ETzogQ29tYmluZSB0aGVzZSBjb25zdGFudHMgaW50byBvbmUgcmVnYXJkaW5nIFRyYWNrSW5mby4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WSURFT19UUkFDS19DT1VOVCA9ICJWaWRlb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVRElPX1RSQUNLX0NPVU5UID0gIkF1ZGlvVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQgPSAiU3VidGl0bGVUcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TUEVFRCA9ICJQbGF5YmFja1NwZWVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCA9ICJTZWxlY3RlZEF1ZGlvSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX1NVQlRJVExFX0lOREVYID0gIlNlbGVjdGVkU3VidGl0bGVJbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTID0gIlVwZGF0ZVRyYWNrU3RhdHVzIjsKLQotICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9uY2UgaW50ZWdyYXRpbmcgd2l0aCBNZWRpYVNlc3Npb24yICYgTWVkaWFNZXRhZGF0YTIKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UID0gIk1lZGlhVHlwZUFkdmVydGlzZW1lbnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTID0gIlVwZGF0ZU1lZGlhVHlwZVN0YXR1cyI7Ci0KLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzaG93IHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0hPV19TVUJUSVRMRSA9ICJzaG93U3VidGl0bGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIGhpZGUgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9ISURFX1NVQlRJVExFID0gImhpZGVTdWJ0aXRsZSI7Ci0gICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgdGhlIGltcGxlbWVudGF0aW9uIGlzIHJldmlzZWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9GVUxMU0NSRUVOID0gInNldEZ1bGxzY3JlZW4iOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNlbGVjdCBhdWRpbyB0cmFjayB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSyA9ICJTZWxlY3RUcmFjayI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2V0IHBsYXliYWNrIHNwZWVkIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVEID0gIlNldFBsYXliYWNrU3BlZWQiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIG11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9NVVRFPSAiTXV0ZSI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gdW5tdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfVU5NVVRFID0gIlVubXV0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0hFTFAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9NQUlOID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1BFRURfMXhfSU5ERVggPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfREVGQVVMVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfTVVTSUMgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0FEVkVSVElTRU1FTlQgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKLSAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUFJPR1JFU1MgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVXSU5EX1RJTUVfTVMgPSAxMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRF9USU1FX01TID0gMzAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEX1NLSVBfV0FJVF9USU1FX01TID0gNTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfTk9OX0VYSVNURU5UID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VNUFRZID0gIiI7Ci0KLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1Db250cm9sbGVyOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyLlRyYW5zcG9ydENvbnRyb2xzIG1Db250cm9sczsKLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUgbVBsYXliYWNrU3RhdGU7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIGludCBtRHVyYXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZTdGF0ZTsKLSAgICBwcml2YXRlIGludCBtUHJldldpZHRoOwotICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKLSAgICBwcml2YXRlIGludCBtVmlkZW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1BdWRpb1RyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVN1YnRpdGxlVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtU2V0dGluZ3NNb2RlOwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3BlZWRJbmRleDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICBwcml2YXRlIGludCBtU2V0dGluZ3NXaW5kb3dNYXJnaW47Ci0gICAgcHJpdmF0ZSBpbnQgbU1lZGlhVHlwZTsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0gICAgcHJpdmF0ZSBsb25nIG1QbGF5YmFja0FjdGlvbnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EcmFnZ2luZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzRnVsbFNjcmVlbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJmbG93RXhwYW5kZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0b3BwZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TdWJ0aXRsZUlzRW5hYmxlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNlZWtBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FkdmVydGlzZW1lbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc011dGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVVhVcGRhdGU7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Sb290OwotICAgIHByaXZhdGUgVmlldyBtVGl0bGVCYXI7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWRFeHRlcm5hbExpbms7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQmFja0J1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbVJvdXRlQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQ2VudGVyVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbVRyYW5zcG9ydENvbnRyb2xzOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVBsYXlQYXVzZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1GZndkQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVJld0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1OZXh0QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVByZXZCdXR0b247Ci0KLSAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtTWluaW1hbEV4dHJhVmlldzsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBQcm9ncmVzc0JhciBtUHJvZ3Jlc3M7Ci0gICAgcHJpdmF0ZSBWaWV3IG1Qcm9ncmVzc0J1ZmZlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJMZWZ0VmlldzsKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtVGltZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRW5kVGltZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1DdXJyZW50VGltZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFNraXBWaWV3OwotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtRm9ybWF0QnVpbGRlcjsKLSAgICBwcml2YXRlIEZvcm1hdHRlciBtRm9ybWF0dGVyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhclJpZ2h0VmlldzsKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQmFzaWNDb250cm9sczsKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtRXh0cmFDb250cm9sczsKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQ3VzdG9tQnV0dG9uczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TdWJ0aXRsZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1GdWxsU2NyZWVuQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uUmlnaHQ7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25MZWZ0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU11dGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtVmlkZW9RdWFsaXR5QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVNldHRpbmdzQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkUmVtYWluaW5nVmlldzsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgIHByaXZhdGUgTGlzdFZpZXcgbVNldHRpbmdzTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtU2V0dGluZ3NXaW5kb3c7Ci0gICAgcHJpdmF0ZSBTZXR0aW5nc0FkYXB0ZXIgbVNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIFN1YlNldHRpbmdzQWRhcHRlciBtU3ViU2V0dGluZ3NBZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc01haW5UZXh0c0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzU3ViVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtU2V0dGluZ3NJY29uSWRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1BdWRpb1RyYWNrTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVmlkZW9RdWFsaXR5TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUGxheWJhY2tTcGVlZFRleHRMaXN0OwotICAgIHByaXZhdGUgTGlzdDxGbG9hdD4gbVBsYXliYWNrU3BlZWRMaXN0OwotCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcySW1wbChNZWRpYUNvbnRyb2xWaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIC8vIEluZmxhdGUgTWVkaWFDb250cm9sVmlldzIgZnJvbSBYTUwKLSAgICAgICAgbVJvb3QgPSBtYWtlQ29udHJvbGxlclZpZXcoKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVJvb3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoU2Vzc2lvblRva2VuMiB0b2tlbikgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uRnVsbFNjcmVlbkxpc3RlbmVyX2ltcGwoTWVkaWFDb250cm9sVmlldzIuT25GdWxsU2NyZWVuTGlzdGVuZXIgbCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXJfaW1wbChNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9scyA9IGNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKTsKLSAgICAgICAgICAgIC8vIFNldCBtTWV0YWRhdGEgYW5kIG1QbGF5YmFja1N0YXRlIHRvIGV4aXN0aW5nIE1lZGlhU2Vzc2lvbiB2YXJpYWJsZXMgc2luY2UgdGhleSBtYXkKLSAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtQ29udHJvbGxlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0KLSAgICAgICAgICAgIG1Db250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnV0dG9uVmlzaWJpbGl0eV9pbXBsKGludCBidXR0b24sIGludCB2aXNpYmlsaXR5KSB7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBtZW1iZXIgdmFyaWFibGVzIGZvciBGYXN0LUZvcndhcmQvUHJ2aW91cy9SZXdpbmQgYnV0dG9ucyB0byBzYXZlIHZpc2liaWxpdHkgaW4KLSAgICAgICAgLy8gb3JkZXIgdG8gcHJldmVudCBiZWluZyBvdmVycmlkZW4gaW5zaWRlIHVwZGF0ZUxheW91dCgpLgotICAgICAgICBzd2l0Y2ggKGJ1dHRvbikgewotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUExBWV9QQVVTRToKLSAgICAgICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmIGNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZGV0Q6Ci0gICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0ZvcndhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1JFVzoKLSAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsICYmIGNhblNlZWtCYWNrd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9ORVhUOgotICAgICAgICAgICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUFJFVjoKLSAgICAgICAgICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1NVQlRJVExFOgotICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCAmJiBtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GVUxMX1NDUkVFTjoKLSAgICAgICAgICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX09WRVJGTE9XOgotICAgICAgICAgICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25SaWdodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTVVURToKLSAgICAgICAgICAgICAgICBpZiAobU11dGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1NFVFRJTkdTOgotICAgICAgICAgICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFBsYXlCdXR0b25Gb2N1c19pbXBsKCkgewotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYUNvbnRyb2xWaWV3Mi5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGZ1bmN0aW9uIGJlIHJlbW92ZWQ/Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAvLyBVcGRhdGUgbGF5b3V0IHdoZW4gdGhpcyB2aWV3J3Mgd2lkdGggY2hhbmdlcyBpbiBvcmRlciB0byBhdm9pZCBhbnkgVUkgb3ZlcmxhcCBiZXR3ZWVuCi0gICAgICAgIC8vIHRyYW5zcG9ydCBjb250cm9scy4KLSAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgIHx8IG1QcmV2SGVpZ2h0ICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpIHx8IG1OZWVkVVhVcGRhdGUpIHsKLSAgICAgICAgICAgIC8vIERpc21pc3MgU2V0dGluZ3NXaW5kb3cgaWYgaXQgaXMgc2hvd2luZy4KLSAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZXNlIHZpZXdzIG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHlldC4KLSAgICAgICAgICAgIGlmIChtVHJhbnNwb3J0Q29udHJvbHMuZ2V0V2lkdGgoKSA9PSAwIHx8IG1UaW1lVmlldy5nZXRXaWR0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgaW50IGN1cnJIZWlnaHQgPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgbWFuYWdlciA9IChXaW5kb3dNYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgbWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7Ci0gICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICBpbnQgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuU2l6ZS55OwotICAgICAgICAgICAgaW50IGZ1bGxJY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgZW1iZWRkZWRJY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKLSAgICAgICAgICAgIGludCBtYXJnaW5TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2ljb25fbWFyZ2luKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIEFkdmVydGlzZW1lbnQgTW9kZS4KLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgaWNvbnMgaW5zaWRlIEJvdHRvbUJhclJpZ2h0VmlldyBmb3IgTXVzaWMgbW9kZSBpcyA0LgotICAgICAgICAgICAgICAgIGludCBtYXhJY29uQ291bnQgPSA0OwotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dChtYXhJY29uQ291bnQsIGZ1bGxJY29uU2l6ZSwgZW1iZWRkZWRJY29uU2l6ZSwgbWFyZ2luU2l6ZSwgY3VycldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VyckhlaWdodCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgIGlmIChtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9uZS10aW1lIG9wZXJhdGlvbiBmb3IgTXVzaWMgbWVkaWEgdHlwZQotICAgICAgICAgICAgICAgICAgICBtQmFzaWNDb250cm9scy5yZW1vdmVWaWV3KG1NdXRlQnV0dG9uKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuYWRkVmlldyhtTXV0ZUJ1dHRvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgaWNvbnMgaW5zaWRlIEJvdHRvbUJhclJpZ2h0VmlldyBmb3IgTXVzaWMgbW9kZSBpcyAzLgotICAgICAgICAgICAgICAgIGludCBtYXhJY29uQ291bnQgPSAzOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dChtYXhJY29uQ291bnQsIGZ1bGxJY29uU2l6ZSwgZW1iZWRkZWRJY29uU2l6ZSwgbWFyZ2luU2l6ZSwgY3VycldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VyckhlaWdodCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOwotICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLSAgICAgICAgLy8gVXBkYXRlIHRpdGxlIGJhciBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJsYXAgYmV0d2VlbiB0aXRsZSB2aWV3IGFuZCB0aGUgcmlnaHQKLSAgICAgICAgLy8gc2lkZSBvZiB0aGUgdGl0bGUgYmFyLgotICAgICAgICB1cGRhdGVUaXRsZUJhckxheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgc3VwZXIuc2V0RW5hYmxlZF9pbXBsKGVuYWJsZWQpOwotCi0gICAgICAgIC8vIFRPRE86IE1lcmdlIHRoZSBiZWxvdyBjb2RlIHdpdGggZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpLgotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChib29sZWFuIGlzVmlzaWJsZSkgewotICAgICAgICBzdXBlci5vblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoaXNWaXNpYmxlKTsKLQotICAgICAgICBpZiAoaXNWaXNpYmxlKSB7Ci0gICAgICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgaWYgKG1Sb3V0ZVNlbGVjdG9yICE9IG51bGwgJiYgIW1Sb3V0ZVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZKTsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5aW5nKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDdXJyZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIG1QbGF5YmFja1N0YXRlLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QnVmZmVyUGVyY2VudGFnZSgpIHsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3MgPSBtUGxheWJhY2tTdGF0ZS5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gKGJ1ZmZlcmVkUG9zID09IC0xKSA/IC0xIDogKGludCkgKGJ1ZmZlcmVkUG9zICogMTAwIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuUGF1c2UoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrQmFja3dhcmQoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0ZvcndhcmQoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHZpZXcgdGhhdCBob2xkcyB0aGUgd2lkZ2V0cyB0aGF0IGNvbnRyb2wgcGxheWJhY2suCi0gICAgICogRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGNyZWF0ZSB0aGVpciBvd24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIHZpZXcuCi0gICAgICogQGhpZGUgVGhpcyBkb2Vzbid0IHdvcmsgYXMgYWR2ZXJ0aXNlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3R3JvdXAgbWFrZUNvbnRyb2xsZXJWaWV3KCkgewotICAgICAgICBWaWV3R3JvdXAgcm9vdCA9IChWaWV3R3JvdXApIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQubWVkaWFfY29udHJvbGxlcik7Ci0gICAgICAgIGluaXRDb250cm9sbGVyVmlldyhyb290KTsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDb250cm9sbGVyVmlldyhWaWV3R3JvdXAgdikgewotICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIgVmlldwotICAgICAgICBtVGl0bGVCYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcik7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX3RleHQpOwotICAgICAgICBtQWRFeHRlcm5hbExpbmsgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX2V4dGVybmFsX2xpbmspOwotICAgICAgICBtQmFja0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFjayk7Ci0gICAgICAgIGlmIChtQmFja0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUJhY2tMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJvdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5jYXN0KTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgICAgICBtQ2VudGVyVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2VudGVyX3ZpZXcpOwotICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldyA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQubWluaW1hbF9leHRyYV92aWV3KTsKLSAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSBtTWluaW1hbEV4dHJhVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgaW50IGljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgIGludCBtYXJnaW5TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2ljb25fbWFyZ2luKTsKLSAgICAgICAgcGFyYW1zLnNldE1hcmdpbnMoMCwgKGljb25TaXplICsgbWFyZ2luU2l6ZSAqIDIpICogKC0xKSwgMCwgMCk7Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKLSAgICAgICAgbVByb2dyZXNzID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzcyk7Ci0gICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Qcm9ncmVzcyBpbnN0YW5jZW9mIFNlZWtCYXIpIHsKLSAgICAgICAgICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1TZWVrTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRQcm9ncmVzc0RyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3MpKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByb2dyZXNzLnNldE1heChNQVhfUFJPR1JFU1MpOwotICAgICAgICB9Ci0gICAgICAgIG1Qcm9ncmVzc0J1ZmZlciA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3NfYnVmZmVyKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICAgICAgbUJvdHRvbUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX2xlZnQpOwotICAgICAgICBtVGltZVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWUpOwotICAgICAgICBtRW5kVGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9lbmQpOwotICAgICAgICBtQ3VycmVudFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfY3VycmVudCk7Ci0gICAgICAgIG1BZFNraXBWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9za2lwX3RpbWUpOwotICAgICAgICBtRm9ybWF0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG1Gb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKG1Gb3JtYXRCdWlsZGVyLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKLSAgICAgICAgbUJvdHRvbUJhclJpZ2h0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7Ci0gICAgICAgIG1CYXNpY0NvbnRyb2xzID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYXNpY19jb250cm9scyk7Ci0gICAgICAgIG1FeHRyYUNvbnRyb2xzID0gdi5maW5kVmlld0J5SWQoUi5pZC5leHRyYV9jb250cm9scyk7Ci0gICAgICAgIG1DdXN0b21CdXR0b25zID0gdi5maW5kVmlld0J5SWQoUi5pZC5jdXN0b21fYnV0dG9ucyk7Ci0gICAgICAgIG1TdWJ0aXRsZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuc3VidGl0bGUpOwotICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKLSAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLSAgICAgICAgICAgIC8vIFRPRE86IFNob3cgRnVsbHNjcmVlbiBidXR0b24gd2hlbiBvbmx5IGl0IGlzIHBvc3NpYmxlLgotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19yaWdodCk7Ci0gICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25SaWdodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93UmlnaHRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfbGVmdCk7Ci0gICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25MZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd0xlZnRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbU11dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm11dGUpOwotICAgICAgICBpZiAobU11dGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1NdXRlQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXR0aW5nc0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuc2V0dGluZ3MpOwotICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVNldHRpbmdzQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnZpZGVvX3F1YWxpdHkpOwotICAgICAgICBpZiAobVZpZGVvUXVhbGl0eUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtVmlkZW9RdWFsaXR5TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3JlbWFpbmluZyk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3Ci0gICAgICAgIGluaXRpYWxpemVTZXR0aW5nc0xpc3RzKCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3ID0gKExpc3RWaWV3KSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0LnNldHRpbmdzX2xpc3QpOwotICAgICAgICBtU2V0dGluZ3NBZGFwdGVyID0gbmV3IFNldHRpbmdzQWRhcHRlcihtU2V0dGluZ3NNYWluVGV4dHNMaXN0LCBtU2V0dGluZ3NTdWJUZXh0c0xpc3QsCi0gICAgICAgICAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QpOwotICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyID0gbmV3IFN1YlNldHRpbmdzQWRhcHRlcihudWxsLCAwKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0QWRhcHRlcihtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCk7Ci0gICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc193aWR0aCk7Ci0gICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbUhlaWdodCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiA9ICgtMSkgKiBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfc2V0dGluZ3Nfb2Zmc2V0KTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93ID0gbmV3IFBvcHVwV2luZG93KG1TZXR0aW5nc0xpc3RWaWV3LCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBwYXVzZSBvciBzZWVrIGJ1dHRvbnMgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgcGF1c2VkIG9yIHNlZWtlZC4KLSAgICAgKiBUaGlzIHJlcXVpcmVzIHRoZSBjb250cm9sIGludGVyZmFjZSB0byBiZSBhIE1lZGlhUGxheWVyQ29udHJvbEV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiAhY2FuUGF1c2UoKSkgewotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0ZvcndhcmQoKSkgewotICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyBXaGF0IHdlIHJlYWxseSBzaG91bGQgZG8gaXMgYWRkIGEgY2FuU2VlayB0byB0aGUgTWVkaWFQbGF5ZXJDb250cm9sIGludGVyZmFjZTsKLSAgICAgICAgICAgIC8vIHRoaXMgc2NoZW1lIGNhbiBicmVhayB0aGUgY2FzZSB3aGVuIGFwcGxpY2F0aW9ucyB3YW50IHRvIGFsbG93IHNlZWsgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgIC8vIHByb2dyZXNzIGJhciBidXQgZGlzYWJsZSBmb3J3YXJkL2JhY2t3YXJkIGJ1dHRvbnMuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSG93ZXZlciwgY3VycmVudGx5IHRoZSBmbGFncyBTRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSwgU0VFS19GT1JXQVJEX0FWQUlMQUJMRSwKLSAgICAgICAgICAgIC8vIGFuZCBTRUVLX0FWQUlMQUJMRSBhcmUgYWxsICh1bilzZXQgdG9nZXRoZXI7IGFzIHN1Y2ggdGhlIGFmb3JlbWVudGlvbmVkIGlzc3VlCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgYXJpc2UgaW4gZXhpc3RpbmcgYXBwbGljYXRpb25zLgotICAgICAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmICFjYW5TZWVrQmFja3dhcmQoKSAmJiAhY2FuU2Vla0ZvcndhcmQoKSkgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciBleCkgewotICAgICAgICAgICAgLy8gV2Ugd2VyZSBnaXZlbiBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlLCB0aGF0IGRvZXNuJ3QgaGF2ZQotICAgICAgICAgICAgLy8gdGhlIGNhblBhdXNlL2NhblNlZWtYWVogbWV0aG9kcy4gVGhpcyBpcyBPSywgaXQganVzdCBtZWFucyB3ZQotICAgICAgICAgICAgLy8gYXNzdW1lIHRoZSBtZWRpYSBjYW4gYmUgcGF1c2VkIGFuZCBzZWVrZWQsIGFuZCBzbyB3ZSBkb24ndCBkaXNhYmxlCi0gICAgICAgICAgICAvLyB0aGUgYnV0dG9ucy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVVwZGF0ZVByb2dyZXNzID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaW50IHBvcyA9IHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzU2hvd2luZyA9IG1JbnN0YW5jZS5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOwotICAgICAgICAgICAgaWYgKCFtRHJhZ2dpbmcgJiYgaXNTaG93aW5nICYmIGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3REZWxheWVkKG1VcGRhdGVQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgLSAocG9zICUgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ0ZvclRpbWUoaW50IHRpbWVNcykgewotICAgICAgICBpbnQgdG90YWxTZWNvbmRzID0gdGltZU1zIC8gMTAwMDsKLQotICAgICAgICBpbnQgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwOwotICAgICAgICBpbnQgbWludXRlcyA9ICh0b3RhbFNlY29uZHMgLyA2MCkgJSA2MDsKLSAgICAgICAgaW50IGhvdXJzID0gdG90YWxTZWNvbmRzIC8gMzYwMDsKLQotICAgICAgICBtRm9ybWF0QnVpbGRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIGlmIChob3VycyA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJWQ6JTAyZDolMDJkIiwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiUwMmQ6JTAyZCIsIG1pbnV0ZXMsIHNlY29uZHMpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBzZXRQcm9ncmVzcygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sbGVyID09IG51bGwgfHwgbURyYWdnaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcG9zaXRpb25PblByb2dyZXNzQmFyID0gMDsKLSAgICAgICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IGdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgcG9zaXRpb25PblByb2dyZXNzQmFyID0gKGludCkgKE1BWF9QUk9HUkVTUyAqIChsb25nKSBjdXJyZW50UG9zaXRpb24gLyBtRHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiBjdXJyZW50UG9zaXRpb24gIT0gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0UHJvZ3Jlc3MocG9zaXRpb25PblByb2dyZXNzQmFyKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBtZWRpYSBpcyBhIGxvY2FsIGZpbGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgYnVmZmVyLCBzbyBzZXQgc2Vjb25kYXJ5Ci0gICAgICAgICAgICAvLyBwcm9ncmVzcyB0byBtYXhpbXVtLgotICAgICAgICAgICAgaWYgKGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSA8IDApIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSAqIDEwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRW5kVGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRW5kVGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUobUR1cmF0aW9uKSk7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUoY3VycmVudFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgdW50aWwgdGhlIGZpcnN0IDUgc2Vjb25kcyBvZiB0aGUKLSAgICAgICAgICAgIC8vIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24gPD0gQURfU0tJUF9XQUlUX1RJTUVfTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2tpcFRpbWVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRF9TS0lQX1dBSVRfVElNRV9NUyAtIGN1cnJlbnRQb3NpdGlvbikgLyAxMDAwICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRUZXh0KHNraXBUaW1lVGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5jbGVhckNvbG9yRmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGUgYWR2ZXJ0aXNlbWVudC4KLSAgICAgICAgICAgIGlmIChtQWRSZW1haW5pbmdWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uIDwgMCkgPyAwIDogKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbWFpbmluZ1RpbWVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9yZW1haW5pbmdfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0ZvclRpbWUocmVtYWluaW5nVGltZSkpOwotICAgICAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VGV4dChyZW1haW5pbmdUaW1lVGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKSB7Ci0gICAgICAgIGlmIChpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgbUNvbnRyb2xzLnBhdXNlKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wbGF5KCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgYXJlIHR3byBzY2VuYXJpb3MgdGhhdCBjYW4gdHJpZ2dlciB0aGUgc2Vla2JhciBsaXN0ZW5lciB0byB0cmlnZ2VyOgotICAgIC8vCi0gICAgLy8gVGhlIGZpcnN0IGlzIHRoZSB1c2VyIHVzaW5nIHRoZSB0b3VjaHBhZCB0byBhZGp1c3QgdGhlIHBvc2l0aXRvbiBvZiB0aGUKLSAgICAvLyBzZWVrYmFyJ3MgdGh1bWIuIEluIHRoaXMgY2FzZSBvblN0YXJ0VHJhY2tpbmdUb3VjaCBpcyBjYWxsZWQgZm9sbG93ZWQgYnkKLSAgICAvLyBhIG51bWJlciBvZiBvblByb2dyZXNzQ2hhbmdlZCBub3RpZmljYXRpb25zLCBjb25jbHVkZWQgYnkgb25TdG9wVHJhY2tpbmdUb3VjaC4KLSAgICAvLyBXZSdyZSBzZXR0aW5nIHRoZSBmaWVsZCAibURyYWdnaW5nIiB0byB0cnVlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGRyYWdnaW5nCi0gICAgLy8gc2Vzc2lvbiB0byBhdm9pZCBqdW1wcyBpbiB0aGUgcG9zaXRpb24gaW4gY2FzZSBvZiBvbmdvaW5nIHBsYXliYWNrLgotICAgIC8vCi0gICAgLy8gVGhlIHNlY29uZCBzY2VuYXJpbyBpbnZvbHZlcyB0aGUgdXNlciBvcGVyYXRpbmcgdGhlIHNjcm9sbCBiYWxsLCBpbiB0aGlzCi0gICAgLy8gY2FzZSB0aGVyZSBXT04nVCBCRSBvblN0YXJ0VHJhY2tpbmdUb3VjaC9vblN0b3BUcmFja2luZ1RvdWNoIG5vdGlmaWNhdGlvbnMsCi0gICAgLy8gd2Ugd2lsbCBzaW1wbHkgYXBwbHkgdGhlIHVwZGF0ZWQgcG9zaXRpb24gd2l0aG91dCBzdXNwZW5kaW5nIHJlZ3VsYXIgdXBkYXRlcy4KLSAgICBwcml2YXRlIGZpbmFsIE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIG1TZWVrTGlzdGVuZXIgPSBuZXcgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIGJhcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyYWdnaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gQnkgcmVtb3ZpbmcgdGhlc2UgcGVuZGluZyBwcm9ncmVzcyBtZXNzYWdlcyB3ZSBtYWtlIHN1cmUKLSAgICAgICAgICAgIC8vIHRoYXQgYSkgd2Ugd29uJ3QgdXBkYXRlIHRoZSBwcm9ncmVzcyB3aGlsZSB0aGUgdXNlciBhZGp1c3RzCi0gICAgICAgICAgICAvLyB0aGUgc2Vla2JhciBhbmQgYikgb25jZSB0aGUgdXNlciBpcyBkb25lIGRyYWdnaW5nIHRoZSB0aHVtYgotICAgICAgICAgICAgLy8gd2Ugd2lsbCBwb3N0IG9uZSBvZiB0aGVzZSBtZXNzYWdlcyB0byB0aGUgcXVldWUgYWdhaW4gYW5kCi0gICAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGVyZSB3aWxsIGJlIGV4YWN0bHkgb25lIG1lc3NhZ2UgcXVldWVkIHVwLgotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBpZiBwbGF5YmFjayBpcyBjdXJyZW50bHkgc3RvcHBlZC4gSW4gdGhpcyBjYXNlLCB1cGRhdGUgdGhlIHBhdXNlIGJ1dHRvbiB0bwotICAgICAgICAgICAgLy8gc2hvdyB0aGUgcGxheSBpbWFnZSBpbnN0ZWFkIG9mIHRoZSByZXBsYXkgaW1hZ2UuCi0gICAgICAgICAgICBpZiAobUlzU3RvcHBlZCkgewotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIGJhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmcm9tVXNlcikgewotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHByb2dyYW1tYXRpY2FsbHkgZ2VuZXJhdGVkIGNoYW5nZXMgdG8KLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAoaW50KSAoKChsb25nKSBtRHVyYXRpb24gKiBwcm9ncmVzcykgLyBNQVhfUFJPR1JFU1MpOwotICAgICAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zaXRpb24pOwotCi0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIGJhcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBwcm9ncmVzcyBpcyBwcm9wZXJseSB1cGRhdGVkIGluIHRoZSBmdXR1cmUsCi0gICAgICAgICAgICAvLyB0aGUgY2FsbCB0byBzaG93KCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoaXMgYmVjYXVzZSBpdCBpcyBhCi0gICAgICAgICAgICAvLyBuby1vcCBpZiB3ZSBhcmUgYWxyZWFkeSBzaG93aW5nLgotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1QbGF5UGF1c2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVJld0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSAtIFJFV0lORF9USU1FX01TOwotICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3MpOwotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1GZndkTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpICsgRk9SV0FSRF9USU1FX01TOwotICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3MpOwotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1OZXh0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUNvbnRyb2xzLnNraXBUb05leHQoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1QcmV2TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUNvbnRyb2xzLnNraXBUb1ByZXZpb3VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQmFja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudAotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN1YnRpdGxlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0s7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QpOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtVmlkZW9RdWFsaXR5TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVZpZGVvUXVhbGl0eUxpc3QpOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1GdWxsU2NyZWVuTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0VudGVyaW5nRnVsbFNjcmVlbiA9ICFtSXNGdWxsU2NyZWVuOwotICAgICAgICAgICAgLy8gVE9ETzogUmUtYXJyYW5nZSB0aGUgYnV0dG9uIGxheW91dHMgYWNjb3JkaW5nIHRvIHRoZSBVWC4KLSAgICAgICAgICAgIGlmIChpc0VudGVyaW5nRnVsbFNjcmVlbikgewotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBhcmdzLnB1dEJvb2xlYW4oQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4sIGlzRW50ZXJpbmdGdWxsU2NyZWVuKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4sIGFyZ3MsIG51bGwpOwotCi0gICAgICAgICAgICBtSXNGdWxsU2NyZWVuID0gaXNFbnRlcmluZ0Z1bGxTY3JlZW47Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dSaWdodExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd0xlZnRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTXV0ZUJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXV0ZSkgewotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfbXV0ZSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX01VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3VubXV0ZSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfdW5tdXRlZF9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc011dGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1VOTVVURSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU2V0dGluZ3NCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9NQUlOOwotICAgICAgICAgICAgbVNldHRpbmdzQWRhcHRlci5zZXRTdWJUZXh0cyhtU2V0dGluZ3NTdWJUZXh0c0xpc3QpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcgotICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVNldHRpbmdzTW9kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9NQUlOOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtQXVkaW9UcmFja0xpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1QbGF5YmFja1NwZWVkVGV4dExpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFNwZWVkSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9IRUxQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfQVVESU9fSU5ERVgsIHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSywgZXh0cmEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLmdldE1haW5UZXh0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3BlZWRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3BlZWRJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0RmxvYXQoS0VZX1BMQVlCQUNLX1NQRUVELCBtUGxheWJhY2tTcGVlZExpc3QuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCwgZXh0cmEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLmdldE1haW5UZXh0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0hFTFA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX1NVQlRJVExFX0lOREVYLCBwb3NpdGlvbiAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRSwgZXh0cmEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3N1YnRpdGxlX29uLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3N1YnRpdGxlX29mZiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29mZikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB2aWRlbyBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEdXJhdGlvbigpIHsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKSkgewotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpIG1NZXRhZGF0YS5nZXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgpIHsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGUgdGl0bGUgYmFyIGlzIG1hZGUgdXAgb2YgdHdvIHNlcGFyYXRlIExpbmVhckxheW91dHMuIElmIHRoZSBzdW0gb2YgdGhlIHR3byBiYXJzIGFyZQotICAgIC8vIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSB0aXRsZSBiYXIsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbGVmdCBiYXIgKHdoaWNoIG1ha2VzIHRoZQotICAgIC8vIFRleHRWaWV3IHRoYXQgY29udGFpbnMgdGhlIHRpdGxlIG9mIHRoZSBtZWRpYSBmaWxlIHNocmluaykuCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCkgewotICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB0aXRsZUJhcldpZHRoID0gbVRpdGxlQmFyLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgIFZpZXcgbGVmdEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICBWaWV3IHJpZ2h0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9yaWdodCk7Ci0gICAgICAgICAgICBpbnQgbGVmdEJhcldpZHRoID0gbGVmdEJhci5nZXRXaWR0aCgpOwotICAgICAgICAgICAgaW50IHJpZ2h0QmFyV2lkdGggPSByaWdodEJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbGVmdEJhci5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoID4gdGl0bGVCYXJXaWR0aCkgewotICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IHRpdGxlQmFyV2lkdGggLSByaWdodEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IGxlZnRCYXJXaWR0aDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA8IHRpdGxlQmFyV2lkdGggJiYgbU9yaWdpbmFsTGVmdEJhcldpZHRoICE9IDApIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZnRCYXIuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQXVkaW9NZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGVUZXh0ID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgYXJ0aXN0VGV4dCA9ICIiOwotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCkpIHsKLSAgICAgICAgICAgICAgICBhcnRpc3RUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcnRpc3RUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHRpdGxlIGZvciBFbWJlZGRlZCBzaXplIHR5cGUKLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZVRleHQgKyAiIC0gIiArIGFydGlzdFRleHQpOwotCi0gICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB0byB1cGRhdGUgbGF5b3V0IGluc2lkZSBvbk1lYXN1cmUoKQotICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpZiAobUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0Q29sb3JGaWx0ZXIoUi5jb2xvci5ncmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5jbGVhckNvbG9yRmlsdGVyKCk7Ci0gICAgICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0KGludCBtYXhJY29uQ291bnQsIGludCBmdWxsSWNvblNpemUsIGludCBlbWJlZGRlZEljb25TaXplLAotICAgICAgICAgICAgIGludCBtYXJnaW5TaXplLCBpbnQgY3VycldpZHRoLCBpbnQgY3VyckhlaWdodCwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0KSB7Ci0gICAgICAgIGludCBmdWxsQm90dG9tQmFyUmlnaHRXaWR0aE1heCA9IGZ1bGxJY29uU2l6ZSAqIG1heEljb25Db3VudAotICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKLSAgICAgICAgaW50IGVtYmVkZGVkQm90dG9tQmFyUmlnaHRXaWR0aE1heCA9IGVtYmVkZGVkSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBmdWxsV2lkdGggPSBtVHJhbnNwb3J0Q29udHJvbHMuZ2V0V2lkdGgoKSArIG1UaW1lVmlldy5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgKyBmdWxsQm90dG9tQmFyUmlnaHRXaWR0aE1heDsKLSAgICAgICAgaW50IGVtYmVkZGVkV2lkdGggPSBtVGltZVZpZXcuZ2V0V2lkdGgoKSArIGVtYmVkZGVkQm90dG9tQmFyUmlnaHRXaWR0aE1heDsKLSAgICAgICAgaW50IHNjcmVlbk1heExlbmd0aCA9IE1hdGgubWF4KHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotCi0gICAgICAgIGlmIChmdWxsV2lkdGggPiBzY3JlZW5NYXhMZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHNjcmVlbiBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggbmVlZGVkIGZvciBGdWxsIHNpemUuCi0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRnVsbFNpemUgPSAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpID8gKGN1cnJXaWR0aCA9PSBzY3JlZW5NYXhMZW5ndGgpIDoKLSAgICAgICAgICAgICAgICAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoaXNGdWxsU2l6ZSkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX0ZVTEwpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVtYmVkZGVkV2lkdGggPD0gY3VycldpZHRoKSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9FTUJFRERFRCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX0VNQkVEREVEKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX01JTklNQUwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9NSU5JTUFMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKGludCBzaXplVHlwZSkgewotICAgICAgICBtU2l6ZVR5cGUgPSBzaXplVHlwZTsKLSAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHRpbWVWaWV3UGFyYW1zID0KLSAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBtVGltZVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKLSAgICAgICAgc3dpdGNoIChtU2l6ZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0VNQkVEREVEOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbUJvdHRvbUJhclJpZ2h0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBpZiAodGltZVZpZXdQYXJhbXMuZ2V0UnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YsIFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9GVUxMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbUJvdHRvbUJhclJpZ2h0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZnVsbF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scywgMCk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBpZiAodGltZVZpZXdQYXJhbXMuZ2V0UnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GLCBSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX01JTklNQUw6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtTWluaW1hbEV4dHJhVmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQubWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihudWxsKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lVmlldy5zZXRMYXlvdXRQYXJhbXModGltZVZpZXdQYXJhbXMpOwotCi0gICAgICAgIGlmIChpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcgaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKGludCBsYXlvdXRJZCkgewotICAgICAgICBWaWV3IHYgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBsYXlvdXRJZCk7Ci0gICAgICAgIG1QbGF5UGF1c2VCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnBhdXNlKTsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QbGF5UGF1c2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUZmd2RCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZmd2QpOwotICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GZndkTGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtUmV3QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5yZXcpOwotICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUmV3TGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBOZXh0IGFuZCBQcmV2aW91cyBidXR0b25zCi0gICAgICAgIG1OZXh0QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5uZXh0KTsKLSAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTmV4dExpc3RlbmVyKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICBtUHJldkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJldik7Ci0gICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVByZXZMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXR0aW5nc0xpc3RzKCkgewotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9oZWxwX3RleHQpKTsKLQotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZHMpW1BMQVlCQUNLX1NQRUVEXzF4X0lOREVYXSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoUkVTT1VSQ0VfRU1QVFkpOwotCi0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19hdWRpb3RyYWNrKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfaGVscCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0KLSAgICAgICAgbVZpZGVvUXVhbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVZpZGVvUXVhbGl0eUxpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfYXV0b190ZXh0KSk7Ci0KLSAgICAgICAgbVBsYXliYWNrU3BlZWRUZXh0TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoUi5hcnJheS5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZHMpKSk7Ci0gICAgICAgIC8vIFNlbGVjdCB0aGUgIjF4IiBzcGVlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgICAgbVNlbGVjdGVkU3BlZWRJbmRleCA9IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0gICAgICAgIGludFtdIHNwZWVkcyA9IG1SZXNvdXJjZXMuZ2V0SW50QXJyYXkoUi5hcnJheS5zcGVlZF9tdWx0aXBsaWVkX2J5XzEwMCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlZWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzcGVlZCA9IChmbG9hdCkgc3BlZWRzW2ldIC8gMTAwLjBmOwotICAgICAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0LmFkZChzcGVlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheVNldHRpbmdzV2luZG93KEJhc2VBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgLy8gU2V0IEFkYXB0ZXIKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKLQotICAgICAgICAvLyBTZXQgd2lkdGggb2Ygd2luZG93Ci0gICAgICAgIGludCBpdGVtV2lkdGggPSAobVNpemVUeXBlID09IFNJWkVfVFlQRV9FTUJFRERFRCkKLSAgICAgICAgICAgICAgICA/IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoIDogbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNldFdpZHRoKGl0ZW1XaWR0aCk7Ci0KLSAgICAgICAgLy8gQ2FsY3VsYXRlIGhlaWdodCBvZiB3aW5kb3cgYW5kIHNob3cKLSAgICAgICAgaW50IGl0ZW1IZWlnaHQgPSAobVNpemVUeXBlID09IFNJWkVfVFlQRV9FTUJFRERFRCkKLSAgICAgICAgICAgICAgICA/IG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodCA6IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgICAgICBpbnQgdG90YWxIZWlnaHQgPSBhZGFwdGVyLmdldENvdW50KCkgKiBpdGVtSGVpZ2h0OwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2hvd0FzRHJvcERvd24obUluc3RhbmNlLCBtU2V0dGluZ3NXaW5kb3dNYXJnaW4sCi0gICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luIC0gdG90YWxIZWlnaHQsIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5SSUdIVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhQ29udHJvbGxlci5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gc3RhdGU7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBwYXVzZSBidXR0b24gZGVwZW5kaW5nIG9uIHBsYXliYWNrIHN0YXRlIGZvciB0aGUgZm9sbG93aW5nIHR3byByZWFzb25zOgotICAgICAgICAgICAgLy8gICAxKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIGFwcCBjdXN0b21pemVzIHBsYXliYWNrIHN0YXRlIGJlaGF2aW9yIHdoZW4gYXBwCi0gICAgICAgICAgICAvLyAgICAgIGFjdGl2aXR5IGlzIHJlc3VtZWQuCi0gICAgICAgICAgICAvLyAgIDIpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgdGhlIG1lZGlhIGZpbGUgcmVhY2hlcyBlbmQgb2YgZHVyYXRpb24uCi0gICAgICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSAhPSBtUHJldlN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3JlcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJldlN0YXRlID0gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1QbGF5YmFja0FjdGlvbnMgIT0gbVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBuZXdBY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpOwotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QbGF5YmFja0FjdGlvbnMgPSBuZXdBY3Rpb25zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgYnV0dG9ucyBpZiBjdXN0b20gYWN0aW9ucyBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGN1c3RvbUFjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRDdXN0b21BY3Rpb25zKCk7Ci0gICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgaWYgKGN1c3RvbUFjdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogY3VzdG9tQWN0aW9ucykgewotICAgICAgICAgICAgICAgICAgICBJbWFnZUJ1dHRvbiBidXR0b24gPSBuZXcgSW1hZ2VCdXR0b24obUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIEF0dHJpYnV0ZVNldCAqLywgMCAvKiBTdHlsZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFwcGx5IFIuc3R5bGUuQm90dG9tQmFyQnV0dG9uIHRvIHRoaXMgYnV0dG9uIHVzaW5nIGxpYnJhcnkgY29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVmZXIgQ29uc3RydWN0b3Igd2l0aCBhcmd1bWVudCAoaW50IGRlZlN0eWxlUmVzKSBvZiBWaWV3LmphdmEKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEltYWdlUmVzb3VyY2UoYWN0aW9uLmdldEljb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRUb29sdGlwVGV4dChhY3Rpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvblN0cmluZyA9IGFjdGlvbi5nZXRBY3Rpb24oKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHdlIGFyZSBqdXN0IHNlbmRpbmcgZXh0cmFzIHRoYXQgY2FtZSBmcm9tIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgaXQgdGhlIHJpZ2h0IGJlaGF2aW9yPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9scy5zZW5kQ3VzdG9tQWN0aW9uKGFjdGlvblN0cmluZywgYWN0aW9uLmdldEV4dHJhcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMuYWRkVmlldyhidXR0b24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgICAgICAgICAgdXBkYXRlQXVkaW9NZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkV2ZW50KFN0cmluZyBldmVudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1ZJREVPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25lIG9yIG1vcmUgYXVkaW8gdHJhY2tzLCBhbmQgdGhpcyBpbmZvcm1hdGlvbiBoYXMgbm90IGJlZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVmbGVjdGVkIGludG8gdGhlIFNldHRpbmdzIHdpbmRvdyB5ZXQsIGF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIGZpcnN0IHRyYWNrLgotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBBdWRpbyBUcmFjayBzZWxlY3Rpb24gd2lsbCBiZSBkZWZhdWx0ZWQgdG8gIk5vbmUiLgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfQVVESU9fVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgbW9yZSB0ZXh0IGFib3V0IHRyYWNrIGluZm8uCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BdWRpb1RyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYW5nZSBzdWIgdGV4dCBpbnNpZGUgdGhlIFNldHRpbmdzIHdpbmRvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvVHJhY2tDb3VudCA9PSAwICYmIG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFUeXBlID0gTUVESUFfVFlQRV9NVVNJQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVRyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN1YnRpdGxlVHJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3U3RhdHVzID0gZXh0cmFzLmdldEJvb2xlYW4oS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdHVzICE9IG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0FkdmVydGlzZW1lbnQgPSBuZXdTdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbUljb25JZHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1NYWluVGV4dHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJUZXh0czsKLQotICAgICAgICBwdWJsaWMgU2V0dGluZ3NBZGFwdGVyKExpc3Q8U3RyaW5nPiBtYWluVGV4dHMsIEBOdWxsYWJsZSBMaXN0PFN0cmluZz4gc3ViVGV4dHMsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIExpc3Q8SW50ZWdlcj4gaWNvbklkcykgewotICAgICAgICAgICAgbU1haW5UZXh0cyA9IG1haW5UZXh0czsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICAgICAgbUljb25JZHMgPSBpY29uSWRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlU3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKG1NYWluVGV4dHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1NYWluVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWFpblRleHRzLmdldChwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1NYWluVGV4dHMgPT0gbnVsbCkgPyAwIDogbU1haW5UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRleHRWaWV3IG1haW5UZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLm1haW5fdGV4dCk7Ci0gICAgICAgICAgICBUZXh0VmlldyBzdWJUZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLnN1Yl90ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IChJbWFnZVZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5pY29uKTsKLQotICAgICAgICAgICAgLy8gU2V0IG1haW4gdGV4dAotICAgICAgICAgICAgbWFpblRleHRWaWV3LnNldFRleHQobU1haW5UZXh0cy5nZXQocG9zaXRpb24pKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHN1YiB0ZXh0IGFuZCBjZW50ZXIgdGhlIG1haW4gdGV4dCBpZiBzdWIgdGV4dHMgZG8gbm90IGV4aXN0IGF0IGFsbCBvciB0aGUgc3ViCi0gICAgICAgICAgICAvLyB0ZXh0IGF0IHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBlbXB0eS4KLSAgICAgICAgICAgIGlmIChtU3ViVGV4dHMgPT0gbnVsbCB8fCBtU3ViVGV4dHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9FTVBUWSkgewotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgc3ViIHRleHQuCi0gICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VGV4dChtU3ViVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBtYWluIGljb24gYW5kIHNldCB2aXNpYmlsaXR5IHRvIGdvbmUgaWYgaWNvbnMgYXJlIHNldCB0byBudWxsIG9yIHRoZSBpY29uIGF0Ci0gICAgICAgICAgICAvLyB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgc2V0IHRvIFJFU09VUkNFX05PTl9FWElTVEVOVC4KLSAgICAgICAgICAgIGlmIChtSWNvbklkcyA9PSBudWxsIHx8IG1JY29uSWRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfTk9OX0VYSVNURU5UKSB7Ci0gICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBtYWluIGljb24uCi0gICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKG1JY29uSWRzLmdldChwb3NpdGlvbiksIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogZXh0ZW5kIHRoaXMgY2xhc3MgZnJvbSBTZXR0aW5nc0FkYXB0ZXIKLSAgICBwcml2YXRlIGNsYXNzIFN1YlNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRleHRzOwotICAgICAgICBwcml2YXRlIGludCBtQ2hlY2tQb3NpdGlvbjsKLQotICAgICAgICBwdWJsaWMgU3ViU2V0dGluZ3NBZGFwdGVyKExpc3Q8U3RyaW5nPiB0ZXh0cywgaW50IGNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtVGV4dHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1UZXh0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtVGV4dHMgPT0gbnVsbCkgPyAwIDogbVRleHRzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKLSAgICAgICAgICAgIFZpZXcgcm93OwotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOwotICAgICAgICAgICAgSW1hZ2VWaWV3IGNoZWNrVmlldyA9IChJbWFnZVZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5jaGVjayk7Ci0KLSAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQobVRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1DaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tWaWV3LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHRzKExpc3Q8U3RyaW5nPiB0ZXh0cykgewotICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGVja1Bvc2l0aW9uKGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2IyY2QxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlQ29udHJvbGxlci5BbmNob3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLWNsYXNzIFN1YnRpdGxlVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IGltcGxlbWVudHMgQW5jaG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVmlldyI7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldCBtU3VidGl0bGVXaWRnZXQ7Ci0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ID09IHN1YnRpdGxlV2lkZ2V0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBib29sZWFuIGF0dGFjaGVkVG9XaW5kb3cgPSBpc0F0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1YnRpdGxlV2lkZ2V0ID0gc3VidGl0bGVXaWRnZXQ7Ci0KLSAgICAgICAgaWYgKHN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyID0gbmV3IFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRXaWxsTm90RHJhdyhmYWxzZSk7Ci0gICAgICAgICAgICBzdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyKTsKLQotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBzdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRXaWxsTm90RHJhdyh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTG9vcGVyIGdldFN1YnRpdGxlTG9vcGVyKCkgewotICAgICAgICByZXR1cm4gTG9vcGVyLmdldE1haW5Mb29wZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBzdXBlci5vbkxheW91dChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdUb3AoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGdldFBhZGRpbmdMZWZ0KCksIGdldFBhZGRpbmdUb3AoKSk7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBTdWJ0aXRsZVZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5MmU4NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXOwotCi1jbGFzcyBWaWRlb1N1cmZhY2VWaWV3IGV4dGVuZHMgU3VyZmFjZVZpZXcgaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UsIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9TdXJmYWNlVmlldyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlSG9sZGVyIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyID0gbnVsbDsKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgLy8gQSBmbGFnIHRvIGluZGljYXRlIHRha2luZyBvdmVyIG90aGVyIHZpZXcgc2hvdWxkIGJlIHByb2NlZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Rha2luZ092ZXJPbGRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1PbGRWaWV3OwotCi0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgICAgIGdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBMb2cuZChUQUcsICJhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcigpOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1wLnNldERpc3BsYXkobVN1cmZhY2VIb2xkZXIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKLSAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKLSAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKLSAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKG1TdXJmYWNlSG9sZGVyICE9IG51bGwgJiYgbVN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZSgpICE9IG51bGwpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ3JlYXRlZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewotICAgICAgICBMb2cuZChUQUcsICJzdXJmYWNlQ3JlYXRlZDogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlciArICIsIG5ldyBob2xkZXI6ICIgKyBob2xkZXIpOwotICAgICAgICBtU3VyZmFjZUhvbGRlciA9IGhvbGRlcjsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVjdCByZWN0ID0gbVN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZUZyYW1lKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNyZWF0ZWQodGhpcywgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewotICAgICAgICAvLyBBZnRlciB3ZSByZXR1cm4gZnJvbSB0aGlzIHdlIGNhbid0IHVzZSB0aGUgc3VyZmFjZSBhbnkgbW9yZQotICAgICAgICBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgdGhlIHdheSB0byBtb3ZlIG9uTWVhc3VyZSgpIGNvZGUgaW50byBGcmFtZUxheW91dC4KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbk1lYXN1cmUoIiArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKHdpZHRoTWVhc3VyZVNwZWMpICsgIiwgIgotICAgICAgICAgICAgICAgICAgICArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKGhlaWdodE1lYXN1cmVTcGVjKSArICIpIik7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBnZXRXaWR0aCgpICsgIi8iICsgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1WaWRlb1dpZHRoL2hlaWdodDogIiArIHZpZGVvV2lkdGggKyAiLCAiICsgdmlkZW9IZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHdpZHRoID0gZ2V0RGVmYXVsdFNpemUodmlkZW9XaWR0aCwgd2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBnZXREZWZhdWx0U2l6ZSh2aWRlb0hlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmICh2aWRlb1dpZHRoID4gMCAmJiB2aWRlb0hlaWdodCA+IDApIHsKLSAgICAgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgICAgICB3aWR0aCA9IHdpZHRoU3BlY1NpemU7Ci0gICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZTsKLQotICAgICAgICAgICAgLy8gZm9yIGNvbXBhdGliaWxpdHksIHdlIGFkanVzdCBzaXplIGJhc2VkIG9uIGFzcGVjdCByYXRpbwotICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPCB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB3aWRlLCBjb3JyZWN0aW5nLiB3aWR0aDogIiArIHdpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPiB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiB2aWRlb0hlaWdodCAvIHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB0YWxsLCBjb3JyZWN0aW5nLiBoZWlnaHQ6ICIgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vIHNpemUgeWV0LCBqdXN0IGFkb3B0IHRoZSBnaXZlbiBzcGVjIHNpemVzCi0gICAgICAgIH0KLSAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiZW5kIG9mIG9uTWVhc3VyZSgpIik7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlZpZXdUeXBlOiBTdXJmYWNlVmlldyAvIFZpc2liaWxpdHk6ICIgKyBnZXRWaXNpYmlsaXR5KCkKLSAgICAgICAgICAgICAgICArICIgLyBzdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRhM2FhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzIuVklFV19UWVBFX1RFWFRVUkVWSUVXOwotCi1AUmVxdWlyZXNBcGkoMjYpCi1jbGFzcyBWaWRlb1RleHR1cmVWaWV3IGV4dGVuZHMgVGV4dHVyZVZpZXcKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UsIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9UZXh0dXJlVmlldyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIG1TdXJmYWNlVGV4dHVyZTsKLSAgICBwcml2YXRlIFN1cmZhY2UgbVN1cmZhY2U7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lcjsKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgLy8gQSBmbGFnIHRvIGluZGljYXRlIHRha2luZyBvdmVyIG90aGVyIHZpZXcgc2hvdWxkIGJlIHByb2NlZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Rha2luZ092ZXJPbGRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1PbGRWaWV3OwotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBzZXRTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBMb2cuZChUQUcsICJhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcigpOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICAvLyBTdXJmYWNlIGlzIG5vdCByZWFkeS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXRTdXJmYWNlKG1TdXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfVEVYVFVSRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZVRleHR1cmUgIT0gbnVsbCAmJiAhbVN1cmZhY2VUZXh0dXJlLmlzUmVsZWFzZWQoKSAmJiBtU3VyZmFjZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGU6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZQotICAgICAgICAgICAgICAgICsgIiwgbmV3IHN1cmZhY2U6ICIgKyBzdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IHN1cmZhY2VUZXh0dXJlOwotICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1TdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNyZWF0ZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlU2l6ZUNoYW5nZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVxdWVzdExheW91dCgpOyAgLy8gVE9ETzogZmlndXJlIG91dCBpZiBpdCBzaG91bGQgYmUgY2FsbGVkIGhlcmU/Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVVwZGF0ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgewotICAgICAgICAvLyBuby1vcAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uU3VyZmFjZVRleHR1cmVEZXN0cm95ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbnVsbDsKLSAgICAgICAgbVN1cmZhY2UgPSBudWxsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbk1lYXN1cmUoIiArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKHdpZHRoTWVhc3VyZVNwZWMpICsgIiwgIgotICAgICAgICAgICAgICAgICAgICArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKGhlaWdodE1lYXN1cmVTcGVjKSArICIpIik7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBnZXRXaWR0aCgpICsgIi8iICsgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1WaWRlb1dpZHRoL2hlaWdodDogIiArIHZpZGVvV2lkdGggKyAiLCAiICsgdmlkZW9IZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHdpZHRoID0gZ2V0RGVmYXVsdFNpemUodmlkZW9XaWR0aCwgd2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBnZXREZWZhdWx0U2l6ZSh2aWRlb0hlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmICh2aWRlb1dpZHRoID4gMCAmJiB2aWRlb0hlaWdodCA+IDApIHsKLSAgICAgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgICAgICB3aWR0aCA9IHdpZHRoU3BlY1NpemU7Ci0gICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZTsKLQotICAgICAgICAgICAgLy8gZm9yIGNvbXBhdGliaWxpdHksIHdlIGFkanVzdCBzaXplIGJhc2VkIG9uIGFzcGVjdCByYXRpbwotICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPCB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB3aWRlLCBjb3JyZWN0aW5nLiB3aWR0aDogIiArIHdpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPiB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiB2aWRlb0hlaWdodCAvIHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB0YWxsLCBjb3JyZWN0aW5nLiBoZWlnaHQ6ICIgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vIHNpemUgeWV0LCBqdXN0IGFkb3B0IHRoZSBnaXZlbiBzcGVjIHNpemVzCi0gICAgICAgIH0KLSAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiZW5kIG9mIG9uTWVhc3VyZSgpIik7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlZpZXdUeXBlOiBUZXh0dXJlVmlldyAvIFZpc2liaWxpdHk6ICIgKyBnZXRWaXNpYmlsaXR5KCkKLSAgICAgICAgICAgICAgICArICIgLyBzdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI3OWQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk9uU3VidGl0bGVEYXRhTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjJJbXBsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUGxheWJhY2tQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UaW1lZFRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyLlBsYXliYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5ncmFwaGljcy5wYWxldHRlLlBhbGV0dGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUm91dGVQbGF5ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUl0ZW1TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUNvbnRyb2xJbnRlbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIFZpZGVvVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dAotICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlldzJQcm92aWRlciwgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1ZpZXcyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TID0gMjAwMDsKLQotICAgIHByaXZhdGUgZmluYWwgVmlkZW9WaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRVJST1IgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSURMRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BSRVBBUklORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BSRVBBUkVEID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BBVVNFRCA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRCA9IDU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9UUkFDS19JTkRFWCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IElOVkFMSURfU1BFRUQgPSAwZjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvRm9jdXNUeXBlID0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTjsgLy8gbGVnYWN5IGZvY3VzIGdhaW4KLQotICAgIHByaXZhdGUgUGFpcjxFeGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyPiBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtQ3VycmVudFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1RleHR1cmVWaWV3IG1UZXh0dXJlVmlldzsKLSAgICBwcml2YXRlIFZpZGVvU3VyZmFjZVZpZXcgbVN1cmZhY2VWaWV3OwotCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURzZDsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbFZpZXcyIG1NZWRpYUNvbnRyb2xWaWV3OwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uIG1NZWRpYVNlc3Npb247Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbU1lZGlhQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZWRpYU1ldGFkYXRhOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YVJldHJpZXZlciBtUmV0cmlldmVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVwZGF0ZU1lZGlhVHlwZTsKLSAgICBwcml2YXRlIEJ1bmRsZSBtTWVkaWFUeXBlRGF0YTsKLSAgICBwcml2YXRlIFN0cmluZyBtVGl0bGU7Ci0KLSAgICAvLyBUT0RPOiBtb3ZlIG11c2ljIHZpZXcgaW5zaWRlIFN1cmZhY2VWaWV3L1RleHR1cmVWaWV3IG9yIGltcGxlbWVudCBWaWRlb1ZpZXdJbnRlcmZhY2UuCi0gICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIG1NYW5hZ2VyOwotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBWaWV3IG1NdXNpY1ZpZXc7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtTXVzaWNBbGJ1bURyYXdhYmxlOwotICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY1RpdGxlVGV4dDsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNBcnRpc3RUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXNpY01lZGlhVHlwZTsKLSAgICBwcml2YXRlIGludCBtUHJldldpZHRoOwotICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1Eb21pbmFudENvbG9yOwotICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKLQotICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIG1TdGF0ZUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBtQ3VzdG9tQWN0aW9uTGlzdDsKLSAgICBwcml2YXRlIGludCBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOwotICAgIHByaXZhdGUgaW50IG1DdXJyZW50U3RhdGUgPSBTVEFURV9JRExFOwotICAgIHByaXZhdGUgaW50IG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZTsKLSAgICBwcml2YXRlIGxvbmcgbVNlZWtXaGVuUHJlcGFyZWQ7ICAvLyByZWNvcmRpbmcgdGhlIHNlZWsgcG9zaXRpb24gd2hpbGUgcHJlcGFyaW5nCi0KLSAgICBwcml2YXRlIGludCBtVmlkZW9XaWR0aDsKLSAgICBwcml2YXRlIGludCBtVmlkZW9IZWlnaHQ7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtVmlkZW9UcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbUF1ZGlvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4+IG1TdWJ0aXRsZVRyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIFN1YnRpdGxlQ29udHJvbGxlciBtU3VidGl0bGVDb250cm9sbGVyOwotCi0gICAgLy8gc2VsZWN0ZWQgdmlkZW8vYXVkaW8vc3VidGl0bGUgdHJhY2sgaW5kZXggYXMgTWVkaWFQbGF5ZXIyIHJldHVybnMKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleDsKLQotICAgIHByaXZhdGUgU3VidGl0bGVWaWV3IG1TdWJ0aXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TdWJ0aXRsZUVuYWJsZWQ7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1TcGVlZDsKLSAgICAvLyBUT0RPOiBSZW1vdmUgbUZhbGxiYWNrU3BlZWQgd2hlbiBpbnRlZ3JhdGlvbiB3aXRoIE1lZGlhUGxheWVyMidzIG5ldyBzZXRQbGF5YmFja1BhcmFtcygpLgotICAgIC8vIFJlZmVyOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFuekFmbnM2aTJoSjNSa2FVcmUzUU1UNndzRGVkSjVPTkxpQV9PT0JGRlg4L2VkaXQKLSAgICBwcml2YXRlIGZsb2F0IG1GYWxsYmFja1NwZWVkOyAgLy8ga2VlcCB0aGUgb3JpZ2luYWwgc3BlZWQgYmVmb3JlICdwYXVzZScgaXMgY2FsbGVkLgotICAgIHByaXZhdGUgZmxvYXQgbVZvbHVtZUxldmVsRmxvYXQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUxldmVsOwotCi0gICAgcHJpdmF0ZSBsb25nIG1TaG93Q29udHJvbGxlckludGVydmFsTXM7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1NZWRpYVJvdXRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBSb3V0ZVBsYXllciBtUm91dGVQbGF5ZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1Sb3V0ZXJDYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcCBsb2NhbCBwbGF5YmFjayAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyID0gbmV3IFJvdXRlUGxheWVyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHJvdXRlKTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIuc2V0UGxheWVyRXZlbnRDYWxsYmFjayhuZXcgUm91dGVQbGF5ZXIuUGxheWVyRXZlbnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgcHNCdWlsZGVyID0gbmV3IFBsYXliYWNrU3RhdGUuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldEFjdGlvbnMoUm91dGVQbGF5ZXIuUExBWUJBQ0tfQUNUSU9OUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaXRlbVN0YXR1cy5nZXRDb250ZW50UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbVN0YXR1cy5nZXRQbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhSXRlbVN0YXR1cy5QTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhSXRlbVN0YXR1cy5QTEFZQkFDS19TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HLCBwb3NpdGlvbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhSXRlbVN0YXR1cy5QTEFZQkFDS19TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRCwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhSXRlbVN0YXR1cy5QTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX0JVRkZFUklORywgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhSXRlbVN0YXR1cy5QTEFZQkFDS19TVEFURV9GSU5JU0hFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRCwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBwYlN0YXRlID0gcHNCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUocGJTdGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBtbUJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtbUJ1aWxkZXIucHV0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVN0YXR1cy5nZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldE1ldGFkYXRhKG1tQnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHJlbW90ZSBwbGF5YmFjayAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vcGVuVmlkZW8obURzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIGlmIChtUm91dGUgIT0gbnVsbCAmJiBtUm91dGVQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUm91dGUgPT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYXNvbiAhPSBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlc3VtZSBsb2NhbCBwbGF5YmFjayAgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBvcGVuVmlkZW8obURzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIFZpZGVvVmlldzJJbXBsKFZpZGVvVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICAgICAgbVNwZWVkID0gMS4wZjsKLSAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7Ci0gICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBhdHRyaWJ1dGVzIHRvIGdldCB0aGlzIHZhbHVlLgotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVM7Ci0KLSAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0KLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkuc2V0VXNhZ2UoQXVkaW9BdHRyaWJ1dGVzLlVTQUdFX01FRElBKQotICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VHlwZShBdWRpb0F0dHJpYnV0ZXMuQ09OVEVOVF9UWVBFX01PVklFKS5idWlsZCgpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0Rm9jdXMoKTsKLQotICAgICAgICAvLyBUT0RPOiB0cnkgdG8ga2VlcCBhIHNpbmdsZSBjaGlsZCBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWx3YXlzIGhhdmluZyBib3RoLgotICAgICAgICBtVGV4dHVyZVZpZXcgPSBuZXcgVmlkZW9UZXh0dXJlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3ID0gbmV3IFZpZGVvU3VyZmFjZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1UZXh0dXJlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0U3VyZmFjZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBtU3VyZmFjZVZpZXcuc2V0U3VyZmFjZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtVGV4dHVyZVZpZXcpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VyZmFjZVZpZXcpOwotCi0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBuZXcgU3VidGl0bGVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtU3VidGl0bGVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtU3VidGl0bGVWaWV3LnNldEJhY2tncm91bmRDb2xvcigwKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1YnRpdGxlVmlldyk7Ci0KLSAgICAgICAgYm9vbGVhbiBlbmFibGVDb250cm9sVmlldyA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZUNvbnRyb2xWaWV3IiwgdHJ1ZSk7Ci0gICAgICAgIGlmIChlbmFibGVDb250cm9sVmlldykgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBuZXcgTWVkaWFDb250cm9sVmlldzIobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiZW5hYmxlU3VidGl0bGUiLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVE9ETzogQ2hvb3NlIFRleHR1cmVWaWV3IHdoZW4gU3VyZmFjZVZpZXcgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAgICAgIC8vIENob29zZSBzdXJmYWNlIHZpZXcgYnkgZGVmYXVsdAotICAgICAgICBpbnQgdmlld1R5cGUgPSAoYXR0cnMgPT0gbnVsbCkgPyBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVwotICAgICAgICAgICAgICAgIDogYXR0cnMuZ2V0QXR0cmlidXRlSW50VmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgInZpZXdUeXBlIiwgVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcpOwotICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyBzdXJmYWNlVmlldy4iKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVN1cmZhY2VWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1RFWFRVUkVWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgdGV4dHVyZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1UZXh0dXJlVmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICBtUm91dGVTZWxlY3RvciA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKE1lZGlhQ29udHJvbFZpZXcyIG1lZGlhQ29udHJvbFZpZXcsIGxvbmcgaW50ZXJ2YWxNcykgewotICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG1lZGlhQ29udHJvbFZpZXc7Ci0gICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBpbnRlcnZhbE1zOwotICAgICAgICAvLyBUT0RPOiBDYWxsIE1lZGlhQ29udHJvbFZpZXcyLnNldFJvdXRlU2VsZWN0b3Igb25seSB3aGVuIGNhc3QgYXZhaWxhbGJlLgotICAgICAgICAoKE1lZGlhQ29udHJvbFZpZXcySW1wbCkgbU1lZGlhQ29udHJvbFZpZXcuZ2V0UHJvdmlkZXIoKSkuc2V0Um91dGVTZWxlY3RvcihtUm91dGVTZWxlY3Rvcik7Ci0KLSAgICAgICAgaWYgKG1JbnN0YW5jZS5pc0F0dGFjaGVkVG9XaW5kb3coKSkgewotICAgICAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlciBnZXRNZWRpYUNvbnRyb2xsZXJfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWVkaWFTZXNzaW9uIGluc3RhbmNlIGlzIG5vdCBhdmFpbGFibGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyIGdldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sVmlldzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0TWVkaWFNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIFRPRE86IGludGVncmF0ZSB0aGlzIHdpdGggTWVkaWFTZXNzaW9uMiNNZWRpYUl0ZW0yCi0gICAgICAgIG1NZWRpYU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0KLSAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIHdlYnNpdGUgbGluawotICAgICAgICBtTWVkaWFUeXBlRGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYm9vbGVhbiBpc0FkID0gbWV0YWRhdGEgPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgZmFsc2UgOiBtZXRhZGF0YS5nZXRMb25nKE1lZGlhTWV0YWRhdGEyLk1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5UKSAhPSAwOwotICAgICAgICBtTWVkaWFUeXBlRGF0YS5wdXRCb29sZWFuKAotICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCwgaXNBZCk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLCBtTWVkaWFUeXBlRGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgbGF0ZXIgaW5zaWRlIE9uUHJlcGFyZWRMaXN0ZW5lciBhZnRlciBNZWRpYVNlc3Npb24gaXMgaW5pdGlhbGl6ZWQuCi0gICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZUVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAoZW5hYmxlICE9IG1TdWJ0aXRsZUVuYWJsZWQpIHsKLSAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShlbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSBlbmFibGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWJ0aXRsZUVuYWJsZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZUVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogcmVtb3ZlIHNldFNwZWVkX2ltcGwgb25jZSBNZWRpYUNvbnRyb2xsZXIyIGlzIHJlYWR5LgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNwZWVkX2ltcGwoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgaWYgKHNwZWVkIDw9IDAuMGYpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlVuc3VwcG9ydGVkIHNwZWVkICgiICsgc3BlZWQgKyAiKSBpcyBpZ25vcmVkLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwgJiYgbU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBhcHBseVNwZWVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvRm9jdXNSZXF1ZXN0X2ltcGwoaW50IGZvY3VzR2FpbikgewotICAgICAgICBpZiAoZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTgotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOX1RSQU5TSUVOVAotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOX1RSQU5TSUVOVF9NQVlfRFVDSwotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOX1RSQU5TSUVOVF9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYXVkaW8gZm9jdXMgdHlwZSAiICsgZm9jdXNHYWluKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9Gb2N1c1R5cGUgPSBmb2N1c0dhaW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzX2ltcGwoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBudWxsIEF1ZGlvQXR0cmlidXRlcyIpOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvUGF0aF9pbXBsKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaShVcmkucGFyc2UocGF0aCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkodXJpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgewotICAgICAgICBEYXRhU291cmNlRGVzYy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnNldERhdGFTb3VyY2UobUluc3RhbmNlLmdldENvbnRleHQoKSwgdXJpLCBoZWFkZXJzLCBudWxsKTsKLSAgICAgICAgbUluc3RhbmNlLnNldERhdGFTb3VyY2UoYnVpbGRlci5idWlsZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYUl0ZW1faW1wbChNZWRpYUl0ZW0yIG1lZGlhSXRlbSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2VfaW1wbChEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbURzZCA9IGRzZDsKLSAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICBvcGVuVmlkZW8oZHNkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3VHlwZV9pbXBsKGludCB2aWV3VHlwZSkgewotICAgICAgICBpZiAodmlld1R5cGUgPT0gbUN1cnJlbnRWaWV3LmdldFZpZXdUeXBlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBWaWRlb1ZpZXdJbnRlcmZhY2UgdGFyZ2V0VmlldzsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1RFWFRVUkVWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gVGV4dHVyZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBTdXJmYWNlVmlldyIpOwotICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdmlldyB0eXBlOiAiICsgdmlld1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgICgoVmlldykgdGFyZ2V0Vmlldykuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB0YXJnZXRWaWV3LnRha2VPdmVyKG1DdXJyZW50Vmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRWaWV3LmdldFZpZXdUeXBlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tQWN0aW9uc19pbXBsKAotICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gYWN0aW9uTGlzdCwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQgPSBuZXcgUGFpcjw+KGV4ZWN1dG9yLCBsaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBsYXliYWNrIGJ1aWxkZXIgaW4gb3JkZXIgdG8gY2xlYXIgZXhpc3RpbmcgdGhlIGN1c3RvbSBhY3Rpb25zLgotICAgICAgICBtU3RhdGVCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXJfaW1wbChWaWRlb1ZpZXcyLk9uVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgbCkgewotICAgICAgICBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXJfaW1wbChWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLQotICAgICAgICAvLyBDcmVhdGUgTWVkaWFTZXNzaW9uCi0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBuZXcgTWVkaWFTZXNzaW9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksICJWaWRlb1ZpZXcyTWVkaWFTZXNzaW9uIik7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0Q2FsbGJhY2sobmV3IE1lZGlhU2Vzc2lvbkNhbGxiYWNrKCkpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldEFjdGl2ZSh0cnVlKTsKLSAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG1NZWRpYVNlc3Npb24uZ2V0Q29udHJvbGxlcigpOwotICAgICAgICBtTWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1lZGlhUm91dGVyLnNldE1lZGlhU2Vzc2lvbihtTWVkaWFTZXNzaW9uKTsKLSAgICAgICAgbU1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1Sb3V0ZVNlbGVjdG9yLCBtUm91dGVyQ2FsbGJhY2spOwotICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7Ci0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGFmdGVyIG1vdmluZyBNZWRpYVNlc3Npb24gY3JlYXRpbmcgY29kZSBpbnNpZGUgaW5pdGlhbGl6aW5nIFZpZGVvVmlldzIKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpIHsKLSAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGlmIChtTmVlZFVwZGF0ZU1lZGlhVHlwZSkgewotICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFUeXBlRGF0YSk7Ci0gICAgICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKTsKLQotICAgICAgICBtTWVkaWFTZXNzaW9uLnJlbGVhc2UoKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gVmlkZW9WaWV3Mi5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblRvdWNoRXZlbnQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgLy8gVE9ETzogVGVzdCB0b3VjaCBldmVudCBoYW5kbGluZyBsb2dpYyB0aG9yb3VnaGx5IGFuZCBzaW1wbGlmeSB0aGUgbG9naWMuCi0gICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKG1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1QcmV2SGVpZ2h0ICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnJIZWlnaHQgPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuU2l6ZS55OwotCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24gPSByZXRyaWV2ZU9yaWVudGF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX2xhbmRzY2FwZV9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfcG9ydHJhaXRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNpemVUeXBlID0gU0laRV9UWVBFX0ZVTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbUZhZGVPdXQgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9FTUJFRERFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNpemVUeXBlID0gU0laRV9UWVBFX0VNQkVEREVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5lbWJlZGRlZF9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgbmV3IG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBJbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDcmVhdGVkKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSArICIsIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlRGVzdHJveWVkKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIGNhbGwgcmVxdWVzdExheW91dCBoZXJlPwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNoYW5nZWQoKS4gd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRha2VPdmVyRG9uZShWaWRlb1ZpZXdJbnRlcmZhY2UgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZVRha2VPdmVyRG9uZSgpLiBOb3cgY3VycmVudCB2aWV3IGlzOiAiICsgdmlldyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWaWV3ID0gdmlldzsKLSAgICAgICAgaWYgKG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIub25WaWV3VHlwZUNoYW5nZWQobUluc3RhbmNlLCB2aWV3LmdldFZpZXdUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKSB7Ci0gICAgICAgIC8vIEdldCBNZWRpYUNvbnRyb2xsZXIgZnJvbSBNZWRpYVNlc3Npb24gYW5kIHNldCBpdCBpbnNpZGUgTWVkaWFDb250cm9sVmlldwotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRDb250cm9sbGVyKG1NZWRpYVNlc3Npb24uZ2V0Q29udHJvbGxlcigpKTsKLQotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTWVkaWFDb250cm9sVmlldywgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJblBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9FUlJPUgotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BMQVlJTkcKLSAgICAgICAgICAgICAgICAmJiBtVGFyZ2V0U3RhdGUgPT0gU1RBVEVfUExBWUlORzsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGVzIGEgTWVkaWFQbGF5ZXIyIGluc3RhbmNlIGFuZCBwcmVwYXJlIHBsYXliYWNrLgotICAgIHByaXZhdGUgdm9pZCBvcGVuVmlkZW8oRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIFVyaSB1cmkgPSBkc2QuZ2V0VXJpKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IGRzZC5nZXRVcmlIZWFkZXJzKCk7Ci0gICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vcGVuVmlkZW8oZHNkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBzaG91bGQgaGF2ZSBhIGZvY3VzIGxpc3RlbmVyCi0gICAgICAgICAgICBBdWRpb0ZvY3VzUmVxdWVzdCBmb2N1c1JlcXVlc3Q7Ci0gICAgICAgICAgICBmb2N1c1JlcXVlc3QgPSBuZXcgQXVkaW9Gb2N1c1JlcXVlc3QuQnVpbGRlcihtQXVkaW9Gb2N1c1R5cGUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnJlcXVlc3RBdWRpb0ZvY3VzKGZvY3VzUmVxdWVzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib3BlblZpZGVvKCk6IGNyZWF0aW5nIG5ldyBNZWRpYVBsYXllcjIgaW5zdGFuY2UuIik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIySW1wbCgpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgICAgIG1DdXJyZW50Vmlldy5hc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotCi0gICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgLy8gVE9ETzogQWRkIHRpbWVseSBmaXJpbmcgbG9naWMgZm9yIG1vcmUgYWNjdXJhdGUgc3luYyBiZXR3ZWVuIENDIGFuZCB2aWRlbyBmcmFtZQotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlciA9IG5ldyBTdWJ0aXRsZUNvbnRyb2xsZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlZ2lzdGVyUmVuZGVyZXIobmV3IENsb3NlZENhcHRpb25SZW5kZXJlcihjb250ZXh0KSk7Ci0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnNldEFuY2hvcigoU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcikgbVN1YnRpdGxlVmlldyk7Ci0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IG5ldyBFeGVjdXRvcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhleGVjdXRvciwgbU1lZGlhUGxheWVyMkNhbGxiYWNrKTsKLQotICAgICAgICAgICAgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID0gLTE7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0RGF0YVNvdXJjZShkc2QpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblN1YnRpdGxlRGF0YUxpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIC8vIHdlIGRvbid0IHNldCB0aGUgdGFyZ2V0IHN0YXRlIGhlcmUgZWl0aGVyLCBidXQgcHJlc2VydmUgdGhlCi0gICAgICAgICAgICAvLyB0YXJnZXQgc3RhdGUgdGhhdCB3YXMgdGhlcmUgYmVmb3JlLgotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlKCk7Ci0KLSAgICAgICAgICAgIC8vIFNhdmUgZmlsZSBuYW1lIGFzIHRpdGxlIHNpbmNlIHRoZSBmaWxlIG1heSBub3QgaGF2ZSBhIHRpdGxlIE1ldGFkYXRhLgotICAgICAgICAgICAgbVRpdGxlID0gdXJpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgc2NoZW1lLmVxdWFscygiZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJldHJpZXZlciA9IG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgICAgICAgICBtUmV0cmlldmVyLnNldERhdGFTb3VyY2UobUluc3RhbmNlLmdldENvbnRleHQoKSwgdXJpKTsKLQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib3BlblZpZGVvKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuIGNvbnRlbnQ6ICIgKyB1cmksIGV4KTsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyMkNhbGxiYWNrLm9uRXJyb3IobU1lZGlhUGxheWVyLCBkc2QsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9VTktOT1dOLCBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfSU8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXNldCB0aGUgbWVkaWEgcGxheWVyIGluIGFueSBzdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldFBsYXllcigpIHsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVBsYXllcjIgcGxheWVyID0gbU1lZGlhUGxheWVyOwotICAgICAgICAgICAgbmV3IEFzeW5jVGFzazxNZWRpYVBsYXllcjIsIFZvaWQsIFZvaWQ+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKE1lZGlhUGxheWVyMi4uLiBwbGF5ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpeCBOUEUgd2hpbGUgTWVkaWFQbGF5ZXIyLmNsb3NlKCkKLSAgICAgICAgICAgICAgICAgICAgLy9wbGF5ZXJzWzBdLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0uZXhlY3V0ZU9uRXhlY3V0b3IoQXN5bmNUYXNrLlNFUklBTF9FWEVDVVRPUiwgcGxheWVyKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TWVkaWFQbGF5ZXIobnVsbCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobnVsbCk7Ci0gICAgICAgICAgICAvL21QZW5kaW5nU3VidGl0bGVUcmFja3MuY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvV2lkdGggPSAwOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja1N0YXRlKCkgewotICAgICAgICBpZiAobVN0YXRlQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcGxheWVyIGZvciB0aGlzIHN0cmVhbQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbU1lZGlhUGxheWVyLmdldE1ldGFkYXRhKE1lZGlhUGxheWVyMi5NRVRBREFUQV9BTEwsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMi5CWVBBU1NfTUVUQURBVEFfRklMVEVSKTsKLQotICAgICAgICAgICAgLy8gQWRkIFBsYXkgYWN0aW9uIGFzIGRlZmF1bHQKLSAgICAgICAgICAgIGxvbmcgcGxheWJhY2tBY3Rpb25zID0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWTsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5QQVVTRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5QQVVTRV9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IChQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdGVCdWlsZGVyID0gbmV3IFBsYXliYWNrU3RhdGUuQnVpbGRlcigpOwotICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRBY3Rpb25zKHBsYXliYWNrQWN0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChtQ3VzdG9tQWN0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBtQ3VzdG9tQWN0aW9uTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLmFkZEN1c3RvbUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU3RhdGVCdWlsZGVyLnNldFN0YXRlKGdldENvcnJlc3BvbmRpbmdQbGF5YmFja1N0YXRlKCksCi0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpLCBtU3BlZWQpOwotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9FUlJPUgotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCi0gICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgewotICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBNZWRpYVBsYXllcjIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpIG9uY2UgaXQgaXMKLSAgICAgICAgICAgIC8vIGltcGxlbWVudGVkLgotICAgICAgICAgICAgaWYgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QnVmZmVyZWRQb3NpdGlvbigtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QnVmZmVyZWRQb3NpdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlIC8gMTAwLjAgKiBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IFBsYXliYWNrU3RhdGUgZm9yIE1lZGlhU2Vzc2lvbgotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQbGF5YmFja1N0YXRlIHN0YXRlID0gbVN0YXRlQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldENvcnJlc3BvbmRpbmdQbGF5YmFja1N0YXRlKCkgewotICAgICAgICBzd2l0Y2ggKG1DdXJyZW50U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORTsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtRmFkZU91dCA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BMQVlJTkcpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dDb250cm9sbGVyKCkgewotICAgICAgICAvLyBUT0RPOiBEZWNpZGUgd2hhdCB0byBzaG93IHdoZW4gdGhlIHN0YXRlIGlzIG5vdCBpbiBwbGF5YmFjayBzdGF0ZQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgPT0gbnVsbCB8fCAhaXNJblBsYXliYWNrU3RhdGUoKQotICAgICAgICAgICAgICAgIHx8IChtSXNNdXNpY01lZGlhVHlwZSAmJiBtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICBpZiAobVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyAhPSAwCi0gICAgICAgICAgICAmJiAhbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzVG91Y2hFeHBsb3JhdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCkgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTcGVlZCgpIHsKLSAgICAgICAgUGxheWJhY2tQYXJhbXMgcGFyYW1zID0gbU1lZGlhUGxheWVyLmdldFBsYXliYWNrUGFyYW1zKCkuYWxsb3dEZWZhdWx0cygpOwotICAgICAgICBpZiAobVNwZWVkICE9IHBhcmFtcy5nZXRTcGVlZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcmFtcy5zZXRTcGVlZChtU3BlZWQpOwotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRQbGF5YmFja1BhcmFtcyhwYXJhbXMpOwotICAgICAgICAgICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQbGF5YmFja1BhcmFtcyBoYXMgdW5zdXBwb3J0ZWQgdmFsdWU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgcmV2aXNlIHRoaXMgcGFydCBhZnRlciBpbnRlZ3JhdGluZyB3aXRoIE1QMi4KLSAgICAgICAgICAgICAgICAvLyBJZiBtU3BlZWQgaGFkIGFuIGlsbGVnYWwgdmFsdWUgZm9yIHNwZWVkIHJhdGUsIHN5c3RlbSB3aWxsIGRldGVybWluZSBiZXN0Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxpbmcgKHNlZSBQbGF5YmFja1BhcmFtcy5BVURJT19GQUxMQkFDS19NT0RFX0RFRkFVTFQpLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBwcmUtTVAyIHJldHVybnMgMC4wZiB3aGVuIGl0IGlzIHBhdXNlZC4gSW4gdGhpcyBjYXNlLCBWaWRlb1ZpZXcyIHdpbGwKLSAgICAgICAgICAgICAgICAvLyB1c2UgbUZhbGxiYWNrU3BlZWQgaW5zdGVhZC4KLSAgICAgICAgICAgICAgICBmbG9hdCBmYWxsYmFja1NwZWVkID0gbU1lZGlhUGxheWVyLmdldFBsYXliYWNrUGFyYW1zKCkuYWxsb3dEZWZhdWx0cygpLmdldFNwZWVkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhbGxiYWNrU3BlZWQgPiAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GYWxsYmFja1NwZWVkID0gZmFsbGJhY2tTcGVlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNwZWVkID0gbUZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW1vdGVQbGF5YmFjaygpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8gPSBtTWVkaWFDb250cm9sbGVyLmdldFBsYXliYWNrSW5mbygpOwotICAgICAgICByZXR1cm4gcGxheWJhY2tJbmZvICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBwbGF5YmFja0luZm8uZ2V0UGxheWJhY2tUeXBlKCkgPT0gUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoYm9vbGVhbiBzZWxlY3QpIHsKLSAgICAgICAgaWYgKCFpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdCkgewotICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIHNlbGVjdGlvbiBkeW5hbWljCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5maXJzdDsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnNlbGVjdFRyYWNrKG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5kZXNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0VHJhY2tzKCkgewotICAgICAgICBMaXN0PE1lZGlhUGxheWVyMi5UcmFja0luZm8+IHRyYWNrSW5mb3MgPSBtTWVkaWFQbGF5ZXIuZ2V0VHJhY2tJbmZvKCk7Ci0gICAgICAgIG1WaWRlb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQXVkaW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVzZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tUeXBlID0gdHJhY2tJbmZvcy5nZXQoaSkuZ2V0VHJhY2tUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgewotICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrSW5kaWNlcy5hZGQoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFCi0gICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7Ci0gICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IG1TdWJ0aXRsZUNvbnRyb2xsZXIuYWRkVHJhY2sodHJhY2tJbmZvcy5nZXQoaSkuZ2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5hZGQobmV3IFBhaXI8PihpLCB0cmFjaykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBTZWxlY3QgZmlyc3QgdHJhY2tzIGFzIGRlZmF1bHQKLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1RyYWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA9PSAwICYmIG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtSXNNdXNpY01lZGlhVHlwZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9WSURFT19UUkFDS19DT1VOVCwgbVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfQVVESU9fVFJBQ0tfQ09VTlQsIG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5ULCBtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUobVN1YnRpdGxlRW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdE1ldGFkYXRhKCkgewotICAgICAgICAvLyBHZXQgYW5kIHNldCBkdXJhdGlvbiBhbmQgdGl0bGUgdmFsdWVzIGFzIE1lZGlhTWV0YWRhdGEgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwgJiYgbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5USVRMRSkpIHsKLSAgICAgICAgICAgIG1UaXRsZSA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWV0YWRhdGEuVElUTEUpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFLCBtVGl0bGUpOwotICAgICAgICBidWlsZGVyLnB1dExvbmcoCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKTsKLQotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldE1ldGFkYXRhKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtTWFuYWdlciA9IChXaW5kb3dNYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7Ci0KLSAgICAgICAgYnl0ZVtdIGFsYnVtID0gbVJldHJpZXZlci5nZXRFbWJlZGRlZFBpY3R1cmUoKTsKLSAgICAgICAgaWYgKGFsYnVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShhbGJ1bSwgMCwgYWxidW0ubGVuZ3RoKTsKLSAgICAgICAgICAgIG1NdXNpY0FsYnVtRHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoYml0bWFwKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB3aXRoIHZpc3VhbGl6ZXIKLSAgICAgICAgICAgIFBhbGV0dGUuZ2VuZXJhdGVBc3luYyhiaXRtYXAsIG5ldyBQYWxldHRlLlBhbGV0dGVBc3luY0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VuZXJhdGVkKFBhbGV0dGUgcGFsZXR0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgZG9taW5hbnQgY29sb3IgZm9yIGRlZmF1bHQgYWxidW0gaW1hZ2UuCi0gICAgICAgICAgICAgICAgICAgIG1Eb21pbmFudENvbG9yID0gcGFsZXR0ZS5nZXREb21pbmFudENvbG9yKDApOwotICAgICAgICAgICAgICAgICAgICBpZiAobU11c2ljVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXVzaWNWaWV3LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY0FsYnVtRHJhd2FibGUgPSBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBtUmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSB0aXRsZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBhcnRpc3QgPSBtUmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9BUlRJU1QpOwotICAgICAgICBpZiAoYXJ0aXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBhcnRpc3Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbmQgdGl0bGUgYW5kIGFydGlzdCBzdHJpbmcgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFLCBtTXVzaWNUaXRsZVRleHQpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QsIG1NdXNpY0FydGlzdFRleHQpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldE1ldGFkYXRhKGJ1aWxkZXIuYnVpbGQoKSk7Ci0KLSAgICAgICAgLy8gRGlzcGxheSBFbWJlZGRlZCBtb2RlIGFzIGRlZmF1bHQKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobVN1cmZhY2VWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5lbWJlZGRlZF9tdXNpYyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcmV0cmlldmVPcmllbnRhdGlvbigpIHsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgZG0gPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgaW50IHdpZHRoID0gZG0ud2lkdGhQaXhlbHM7Ci0gICAgICAgIGludCBoZWlnaHQgPSBkbS5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgcmV0dXJuIChoZWlnaHQgPiB3aWR0aCkgPwotICAgICAgICAgICAgICAgIEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQgOgotICAgICAgICAgICAgICAgIEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbmZsYXRlTXVzaWNWaWV3KGludCBsYXlvdXRJZCkgewotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtTXVzaWNWaWV3KTsKLQotICAgICAgICBWaWV3IHYgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBsYXlvdXRJZCk7Ci0gICAgICAgIHYuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKLQotICAgICAgICBJbWFnZVZpZXcgYWxidW1WaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hbGJ1bSk7Ci0gICAgICAgIGlmIChhbGJ1bVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgYWxidW1WaWV3LnNldEltYWdlRHJhd2FibGUobU11c2ljQWxidW1EcmF3YWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXh0VmlldyB0aXRsZVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlKTsKLSAgICAgICAgaWYgKHRpdGxlVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aXRsZVZpZXcuc2V0VGV4dChtTXVzaWNUaXRsZVRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgYXJ0aXN0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYXJ0aXN0KTsKLSAgICAgICAgaWYgKGFydGlzdFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgYXJ0aXN0Vmlldy5zZXRUZXh0KG1NdXNpY0FydGlzdFRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU11c2ljVmlldyA9IHY7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NdXNpY1ZpZXcsIDApOwotICAgIH0KLQotICAgIE9uU3VidGl0bGVEYXRhTGlzdGVuZXIgbVN1YnRpdGxlTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IE9uU3VidGl0bGVEYXRhTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZURhdGEoTWVkaWFQbGF5ZXIyIG1wLCBTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldEN1cnJlbnRQb3NpdGlvbjogIiArIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0U3RhcnRUaW1lVXMoKTogIiArIGRhdGEuZ2V0U3RhcnRUaW1lVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRpZmY6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YS5nZXRTdGFydFRpbWVVcygpLzEwMDAgLSBtcC5nZXRDdXJyZW50UG9zaXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXMsIGdldER1cmF0aW9uVXMoKTogIiArIGRhdGEuZ2V0RHVyYXRpb25VcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBkYXRhLmdldFRyYWNrSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2VsZWN0ZWQgdHJhY2sgaW5kZXg6ICIgKyBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPiBwIDogbVN1YnRpdGxlVHJhY2tJbmRpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5maXJzdCA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBwLnNlY29uZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5vbkRhdGEoZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sgPQotICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25WaWRlb1NpemVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVmlkZW9TaXplQ2hhbmdlZCgpOiBzaXplOiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVmlkZW9TaXplQ2hhbmdlZCgpOiBtVmlkZW9TaXplOiIgKyBtVmlkZW9XaWR0aCArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1dpZHRoICE9IDAgJiYgbVZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGltZWQgdGV4dCByZWxhdGVkIGNvZGUgbGF0ZXIgb25jZSByZWxldmFudCBSZW5kZXJlciBpcyBkZWZpbmVkLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMganVzdCBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaW1lZFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgVGltZWRUZXh0IHRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRpbWVkVGV4dDogIiArIHRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJlcGFyZWQobXAsIGRzZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QTEFZQkFDS19DT01QTEVURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNvbXBsZXRpb24obXAsIGRzZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19CVUZGRVJJTkdfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQnVmZmVyaW5nVXBkYXRlKG1wLCBkc2QsIGV4dHJhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IGZyYW1ld29ya0VyciwgaW50IGltcGxFcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvcjogIiArIGZyYW1ld29ya0VyciArICIsIiArIGltcGxFcnIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1NFRUtfVE8gJiYgc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBvblByZXBhcmVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BSRVBBUkVEOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHNldCBwbGF5YmFjayBzdGF0ZSBmb3IgTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHRvIHNlbmQgVHJhY2tJbmZvcyB0byBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjcmVhdGUgTWVkaWFTZXNzaW9uIHdoZW4gaW5pdGlhbGl6aW5nIFZpZGVvVmlldzIKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbVNlZWtXaGVuUHJlcGFyZWQgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgc2Vla1RvKCkgY2FsbAotICAgICAgICAgICAgICAgICAgICBsb25nIHNlZWtUb1Bvc2l0aW9uID0gbVNlZWtXaGVuUHJlcGFyZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWVrVG9Qb3NpdGlvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkuc2Vla1RvKHNlZWtUb1Bvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IDAgJiYgdmlkZW9IZWlnaHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gbVZpZGVvV2lkdGggfHwgdmlkZW9IZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpIDogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWRlbyBzaXplOiAiICsgdmlkZW9XaWR0aCArICIvIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgbUluc3RhbmNlLmdldFdpZHRoKCkgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1JbnN0YW5jZS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSB2aWRlbyBzaXplIHlldCwgYnV0IHNob3VsZCBzdGFydCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmlkZW8gc2l6ZSBtaWdodCBiZSByZXBvcnRlZCB0byB1cyBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBvbkNvbXBsZXRpb24oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBvbkJ1ZmZlcmluZ1VwZGF0ZShNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHBlcmNlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID0gcGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhU2Vzc2lvbkNhbGxiYWNrIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VidGl0bGVJbmRleCA9IGFyZ3MuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX1NVQlRJVExFX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZUluZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VidGl0bGVUcmFja0luZGV4ID0gbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldChzdWJ0aXRsZUluZGV4KS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVUcmFja0luZGV4ICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBzdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRTdWJ0aXRsZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRTdWJ0aXRsZUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VUX0ZVTExTQ1JFRU46Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyLm9uRnVsbFNjcmVlblJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldEJvb2xlYW4oTWVkaWFDb250cm9sVmlldzJJbXBsLkFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9JbmRleCA9IGFyZ3MuZ2V0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfQVVESU9fSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1RyYWNrSW5kZXggPSBtQXVkaW9UcmFja0luZGljZXMuZ2V0KGF1ZGlvSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb1RyYWNrSW5kZXggIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IGF1ZGlvVHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVEOgotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSBhcmdzLmdldEZsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1BMQVlCQUNLX1NQRUVELCBJTlZBTElEX1NQRUVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZCAhPSBJTlZBTElEX1NQRUVEICYmIHNwZWVkICE9IG1TcGVlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRTcGVlZChzcGVlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNwZWVkID0gc3BlZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9NVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUxldmVsID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1VOTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIG1Wb2x1bWVMZXZlbCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQWN0aW9uKFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZC5maXJzdC5leGVjdXRlKCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZC5zZWNvbmQub25DdXN0b21BY3Rpb24oYWN0aW9uLCBleHRyYXMpKTsKLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5KCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkgJiYgKG1DdXJyZW50Vmlldy5oYXNBdmFpbGFibGVTdXJmYWNlKCkgfHwgbUlzTXVzaWNNZWRpYVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QbGF5KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucGxheSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBsYXkoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGF1c2UoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlZWtUbyhwb3MsIE1lZGlhUGxheWVyMi5TRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgICAgICAgICAgICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IHBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblN0b3AoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTRkNDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW50ZXJmYWNlIFZpZGVvVmlld0ludGVyZmFjZSB7Ci0gICAgLyoqCi0gICAgICogQXNzaWducyB0aGUgdmlldydzIHN1cmZhY2UgdG8gdGhlIGdpdmVuIE1lZGlhUGxheWVyMiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtcCBNZWRpYVBsYXllcjIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1cmZhY2UgaXMgc3VjY2Vzc2Z1bGx5IGFzc2lnbmVkLCBmYWxzZSBpZiBub3QuIEl0IHdpbGwgZmFpbCB0byBhc3NpZ24KLSAgICAgKiAgICAgICAgIGlmIGFueSBvZiBNZWRpYVBsYXllcjIgb3Igc3VyZmFjZSBpcyB1bmF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0gICAgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpOwotICAgIGludCBnZXRWaWV3VHlwZSgpOwotICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKLQotICAgIC8qKgotICAgICAqIFRha2VzIG92ZXIgb2xkVmlldy4gSXQgbWVhbnMgdGhhdCB0aGUgTWVkaWFQbGF5ZXIyIHdpbGwgc3RhcnQgcmVuZGVyaW5nIG9uIHRoaXMgdmlldy4KLSAgICAgKiBUaGUgdmlzaWJpbGl0eSBvZiBvbGRWaWV3IHdpbGwgYmUgc2V0IGFzIHtAbGluayBWaWV3LkdPTkV9LiBJZiB0aGUgdmlldyBkb2Vzbid0IGhhdmUgYQotICAgICAqIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBvciBpdHMgc3VyZmFjZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBpcyBkZWZlcnJlZCB1bnRpbAotICAgICAqIGEgTWVkaWFQbGF5ZXIyIGluc3RhbmNlIGlzIHNldCBieSB7QGxpbmsgI3NldE1lZGlhUGxheWVyfSBvciBpdHMgc3VyZmFjZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICAgKiB7QGxpbmsgU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBpcwotICAgICAqIGRvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2xkVmlldyBUaGUgdmlldyB0aGF0IE1lZGlhUGxheWVyMiBpcyBjdXJyZW50bHkgcmVuZGVyaW5nIG9uLgotICAgICAqLwotICAgIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSB2aWV3J3Mgc3VyZmFjZSBpcyBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpOwotCi0gICAgLyoqCi0gICAgICogQW4gaW5zdGFuY2Ugb2YgVmlkZW9WaWV3SW50ZXJmYWNlIGNhbGxzIHRoZXNlIHN1cmZhY2Ugbm90aWZpY2F0aW9uIG1ldGhvZHMgYWNjb3JkaW5nbHkgaWYKLSAgICAgKiBhIGxpc3RlbmVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhIHtAbGluayAjc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lcil9LgotICAgICAqLwotICAgIGludGVyZmFjZSBTdXJmYWNlTGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgICAgICB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpOwotICAgICAgICB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgICAgICB2b2lkIG9uU3VyZmFjZVRha2VPdmVyRG9uZShWaWRlb1ZpZXdJbnRlcmZhY2Ugdmlldyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA2ODI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXBJbXBsIGltcGxlbWVudHMgVmlld0dyb3VwUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgVmlld0dyb3VwSW1wbChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5vblRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZV9pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkZpbmlzaEluZmxhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIuc2V0RW5hYmxlZF9pbXBsKGVuYWJsZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChib29sZWFuIGlzVmlzaWJsZSkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoaXNWaXNpYmxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkxheW91dF9pbXBsKGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKGludCBtZWFzdXJlZFdpZHRoLCBpbnQgbWVhc3VyZWRIZWlnaHQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoYXR0cnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChscCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChWaWV3IGNoaWxkLAotICAgICAgICBpbnQgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgaW50IHdpZHRoVXNlZCwgaW50IHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0VXNlZCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKGNoaWxkLAotICAgICAgICAgICAgICAgIHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIHdpZHRoVXNlZCwgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGhlaWdodFVzZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZGZkMmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBcCi0gICAgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMgXAotICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAganVuaXQKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gTWVkaWFDb21wb25lbnRzVGVzdAotCi1MT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9IE1lZGlhQ29tcG9uZW50cwotCi1MT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotCi1MT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTUyNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnRlc3RzIj4KLQotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgVGVzdCI+Ci0gICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8IS0tCi0gICAgVG8gcnVuIHRoZSB0ZXN0cyB1c2UgdGhlIGNvbW1hbmQ6Ci0gICAgImFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLm1lZGlhLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUiCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSB0ZXN0IiAvPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjA4NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5tb2NraXRvLk1hdGNoZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotLyoqCi0gKiBUZXN0cyB7QGxpbmsgU2Vzc2lvblBsYXlsaXN0QWdlbnR9LgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUkVQRUFUX01PREUgPSAtMTAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1NIVUZGTEVfTU9ERSA9IC0xMDA7Ci0KLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvciBtSGFuZGxlckV4ZWN1dG9yOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKLSAgICBwcml2YXRlIFNlc3Npb25QbGF5bGlzdEFnZW50IG1BZ2VudDsKLSAgICBwcml2YXRlIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgbURhdGFTb3VyY2VIZWxwZXI7Ci0gICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBtRXZlbnRDYWxsYmFjazsKLQotICAgIHB1YmxpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgewotICAgICAgICBib29sZWFuIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZDsKLQotICAgICAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2s7Ci0KLSAgICAgICAgcHVibGljIE15UGxheWxpc3RFdmVudENhbGxiYWNrKE9iamVjdCB3YWl0TG9jaykgewotICAgICAgICAgICAgbVdhaXRMb2NrID0gd2FpdExvY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlEYXRhU291cmNlSGVscGVyIGltcGxlbWVudHMgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2Mgb25EYXRhU291cmNlTWlzc2luZyhNZWRpYVNlc3Npb24yIHNlc3Npb24sIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0TWVkaWFJZCgpLmNvbnRhaW5zKCJXSVRIT1VUX0RTRCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShnZXRDb250ZXh0KCksIFVyaS5wYXJzZSgiZHNkOi8vdGVzdCIpKQotICAgICAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZChpdGVtLmdldE1lZGlhSWQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTW9ja1BsYXllciBleHRlbmRzIE1lZGlhUGxheWVyQmFzZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwbGF5KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGF1c2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRCdWZmZXJpbmdTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlcyhBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdWRpb0F0dHJpYnV0ZXMgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZShEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RGF0YVNvdXJjZShEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RGF0YVNvdXJjZXMoTGlzdDxEYXRhU291cmNlRGVzYz4gZHNkcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBnZXRDdXJyZW50RGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGxvb3BDdXJyZW50KGJvb2xlYW4gbG9vcCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrU3BlZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZsb2F0IGdldFBsYXllclZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhFeGVjdXRvciBlLCBQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGRleG1ha2VyIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9kZXhtYWtlci9pc3N1ZXMvZGV0YWlsP2lkPTIKLSAgICAgICAgLy8gRGV4bWFrZXIgaXMgdXNlZCBieSBtb2NraXRvLgotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImRleG1ha2VyLmRleGNhY2hlIiwgbUNvbnRleHQuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIEhhbmRsZXJUaHJlYWQgaGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZXNzaW9uUGxheWxpc3RBZ2VudCIpOwotICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSAocnVubmFibGUpIC0+IHsKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QocnVubmFibGUpOwotICAgICAgICB9OwotCi0gICAgICAgIG1QbGF5ZXIgPSBtb2NrKE1vY2tQbGF5ZXIuY2xhc3MpOwotICAgICAgICBkb0Fuc3dlcihpbnZvY2F0aW9uIC0+IHsKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSAoUGxheWVyRXZlbnRDYWxsYmFjaykgYXJnc1sxXTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9KS53aGVuKG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOwotCi0gICAgICAgIG1TZXNzaW9uSW1wbCA9IG1vY2soTWVkaWFTZXNzaW9uMkltcGwuY2xhc3MpOwotICAgICAgICBtRGF0YVNvdXJjZUhlbHBlciA9IG5ldyBNeURhdGFTb3VyY2VIZWxwZXIoKTsKLSAgICAgICAgbUFnZW50ID0gbmV3IFNlc3Npb25QbGF5bGlzdEFnZW50KG1TZXNzaW9uSW1wbCwgbVBsYXllcik7Ci0gICAgICAgIG1BZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1EYXRhU291cmNlSGVscGVyKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVdhaXRMb2NrKTsKLSAgICAgICAgbUFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1IYW5kbGVyRXhlY3V0b3IsIG1FdmVudENhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0U2FmZWx5KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IG51bGw7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0U2h1ZmxsZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHNodWZmbGVNb2RlID0gbUFnZW50LmdldFNodWZmbGVNb2RlKCk7Ci0gICAgICAgIGlmIChzaHVmZmxlTW9kZSAhPSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgLy8gSU5WQUxJRF9TSFVGRkxFX01PREUgd2lsbCBub3QgY2hhbmdlIHRoZSBzaHVmZmxlIG1vZGUuCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoSU5WQUxJRF9TSFVGRkxFX01PREUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFJlcGVhdE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlcGVhdE1vZGUgPSBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICBpZiAocmVwZWF0TW9kZSAhPSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVApOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgLy8gSU5WQUxJRF9TSFVGRkxFX01PREUgd2lsbCBub3QgY2hhbmdlIHRoZSBzaHVmZmxlIG1vZGUuCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShJTlZBTElEX1JFUEVBVF9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAxMDsKLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QoMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUsIG1BZ2VudC5nZXRQbGF5bGlzdCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwSXRlbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gNTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUGxheWxpc3RJdGVtCi0gICAgICAgIGZvciAoaW50IGkgPSBsaXN0U2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKHBsYXlsaXN0LmdldChpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IHNraXBUb05leHRJdGVtCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIGZvciAoaW50IGN1clBsYXlQb3MgPSAwOyBjdXJQbGF5UG9zIDwgbGlzdFNpemUgLSAxOyArK2N1clBsYXlQb3MpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgKyAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cwotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCi0gICAgICAgIGZvciAoaW50IGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDE7IGN1clBsYXlQb3MgPiAwOyAtLWN1clBsYXlQb3MpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMgd2l0aCByZXBlYXQgbW9kZSBhbGwKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXBUb05leHQgd2l0aCByZXBlYXQgbW9kZSBhbGwKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMSwgbmV4dFBsYXlQb3MgPSAwCi0gICAgICAgIC8vIFRlc3QgbmV4dCBwbGF5IHBvcyBhZnRlciBzZXR0aW5nIHJlcGVhdCBtb2RlIG5vbmUuCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCBhZGQgaXRlbTogWzAgKGN1ciksIDEsIDIsIDMsIDRdIC0+IFswIChjdXIpLCAxLCA1LCAyLCAzLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGl0ZW1fNSA9IGdlbmVyYXRlTWVkaWFJdGVtKDUpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAvLyBNb3ZlIGN1cnJlbnQ6IFswIChjdXIpLCAxLCA1LCAyLCAzLCA0XSAtPiBbMCwgMSwgNSAoY3VyKSwgMiwgMywgNF0KLSAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtXzUpOwotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCwgMSwgNSAoY3VyKSwgMiwgMywgNF0gLT4gWzAsIDEsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGl0ZW06IFswLCAxLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBwcmV2aW91c0l0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUocHJldmlvdXNJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0ocHJldmlvdXNJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIG5leHQgaXRlbTogWzAsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIG5leHRJdGVtID0gcGxheWxpc3QuZ2V0KDIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obmV4dEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZXBsYWNlIGl0ZW06IFswLCAyIChjdXIpLCA0XSAtPiBbMCwgMiAoY3VyKSwgNV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnNldCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gTW92ZSBsYXN0IGFuZCByZW1vdmUgdGhlIGxhc3QgaXRlbTogWzAsIDIgKGN1ciksIDVdIC0+IFswLCAyLCA1IChjdXIpXSAtPiBbMCwgMiAoY3VyKV0KLSAgICAgICAgTWVkaWFJdGVtMiBsYXN0SXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShsYXN0SXRlbSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobGFzdEl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShsYXN0SXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgaXRlbXMKLSAgICAgICAgZm9yIChpbnQgaSA9IHBsYXlsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0V2l0aEludmFsaWRJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDI7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgLy8gQWRkIGl0ZW06IFswIChjdXIpLCAxXSAtPiBbMCAoY3VyKSwgMyAobm9fZHNkKSwgMV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTIgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgxLCBpbnZhbGlkSXRlbTIpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTIpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gbmV4dCBpdGVtOiAgWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFswLCAyIChub19kc2QpLCAxIChjdXIpXQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcCB0byBwcmV2aW91cyBpdGVtOiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KDApOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzIgKG5vX2RzZCksIDEgKGN1cildIC0+IFsyIChub19kc2QpXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBpdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCBpbnZhbGlkIGl0ZW06IFsyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTAgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygwKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgwLCBpbnZhbGlkSXRlbTApOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgwLCBpbnZhbGlkSXRlbTApOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gQWRkIHZhbGlkIGl0ZW06IFswIChub19kc2QpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTEgPSBnZW5lcmF0ZU1lZGlhSXRlbSgxKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgxLCBpbnZhbGlkSXRlbTEpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTEpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZXBsYWNlIHRoZSB2YWxpZCBpdGVtIHdpdGggYW4gaW52YWxpZCBpdGVtOgotICAgICAgICAvLyBbMCAobm9fZHNkKSwgMSAoY3VyKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDMgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0zID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMyk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMSwgaW52YWxpZEl0ZW0zKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RBZnRlck9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDI7Ci0gICAgICAgIHZlcmlmeShtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxNZWRpYUl0ZW0yPiBjcmVhdGVBbmRTZXRQbGF5bGlzdChpbnQgbGlzdFNpemUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7ICsraSkgewotICAgICAgICAgICAgaXRlbXMuYWRkKGdlbmVyYXRlTWVkaWFJdGVtKGkpKTsKLSAgICAgICAgfQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFBsYXlsaXN0KGl0ZW1zLCBudWxsKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBsYXlsaXN0RXF1YWxzKExpc3Q8TWVkaWFJdGVtMj4gZXhwZWN0ZWQsIExpc3Q8TWVkaWFJdGVtMj4gYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuc2l6ZSgpLCBhY3R1YWwuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZC5nZXQoaSkuZXF1YWxzKGFjdHVhbC5nZXQoaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYyhpbnQga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfV0lUSE9VVF9EU0RfIiArIGtleSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW0oaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvT1dORVJTIGIvcGFja2FnZXMvT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmM0Y2VmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYWtlcnN0ZW5AZ29vZ2xlLmNvbQotZHdrYW5nQGdvb2dsZS5jb20KLWphZXdhbkBnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KLXN1bmdzb29AZ29vZ2xlLmNvbQotd2ppYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDc0MTllNjQuLjkxYjc1ODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yLDI0ICsyLDYgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTMxLDcgKzEzLDggQEAKICAgICBQYXRjaFBhbmVsLmNwcCAgICAgICAgICAgICAgXAogICAgIFN0YXRlUXVldWUuY3BwICAgICAgICAgICAgICBcCiAgICAgQnVmTG9nLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICBUeXBlZExvZ2dlci5jcHAKKyAgICBUeXBlZExvZ2dlci5jcHAgICAgICAgICAgICAgXAorICAgIE5CQUlPX1RlZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXApAQCAtNTMsMTMgKzM2LDE0IEBACiAgICAgbGlibmJhaW8gXAogICAgIGxpYm5ibG9nIFwKICAgICBsaWJwb3dlcm1hbmFnZXIgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJtZWRpYXV0aWxzIFwKICAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJ2aWJyYXRvcgogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjcHVzdGF0cyBcCisgICAgbGlic25kZmlsZSBcCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTgyLDYgKzY2LDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9TQU5JVElaRSA6PSBpbnRlZ2VyX292ZXJmbG93CiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCA2ODdiNWE2Li40MDMzMjQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMjMsMTIgKzIzLDEzIEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtNDcsNyArNDgsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNTYsNyArNTcsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIApAQCAtNjQsOCArNjQsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogLy8jZGVmaW5lIEJVRkxPR19OREVCVUcgMApAQCAtMTAwLDE3ICsxMDAsNiBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZTsKIAotCi0jaWZkZWYgVEVFX1NJTksKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua0lucHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rVHJhY2tFbmFibGVkID0gZmFsc2U7Ci0KLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRGcmFtZXMgPSBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdDsKLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RnJhbWVzID0ga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0ZyYW1lcyA9IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0OwotI2VuZGlmCi0KIC8vIEluIG9yZGVyIHRvIGF2b2lkIGludmFsaWRhdGluZyBvZmZsb2FkZWQgdHJhY2tzIGVhY2ggdGltZSBhIFZpc3VhbGl6ZXIgaXMgdHVybmVkIG9uIGFuZCBvZmYKIC8vIHdlIGRlZmluZSBhIG1pbmltdW0gdGltZSBkdXJpbmcgd2hpY2ggYSBnbG9iYWwgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZW5hYmxlZC4KIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5HbG9iYWxFZmZlY3RFbmFibGV0aW1lTnMgPSBzZWNvbmRzKDcyMDApOwpAQCAtMTM0LDYgKzEyMywyMSBAQAogICAgIH0KIH0KIAorLy8gS2VlcCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gZXh0ZXJuYWwgdmlicmF0b3Igc2VydmljZQorc3RhdGljIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZTsKKworc3RhdGljIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IGdldEV4dGVybmFsVmlicmF0b3JTZXJ2aWNlKCkgeworICAgIGlmIChzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UgPT0gMCkgeworICAgICAgICBzcCA8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoCisgICAgICAgICAgICBTdHJpbmcxNigiZXh0ZXJuYWxfdmlicmF0b3Jfc2VydmljZSIpKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGQ6OnN0cmluZyBmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKQEAgLTE2MCw2ICsxNjQsNyBAQAogICAgICAgbVRvdGFsTWVtb3J5KDApLAogICAgICAgbUNsaWVudFNoYXJlZEhlYXBTaXplKGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcyksCiAgICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKSwKKyAgICAgIG1QYXRjaFBhbmVsKHRoaXMpLAogICAgICAgbVN5c3RlbVJlYWR5KGZhbHNlKQogewogICAgIC8vIHVuc2lnbmVkIGluc3RlYWQgb2YgYXVkaW9fdW5pcXVlX2lkX3VzZV90LCBiZWNhdXNlICsrIG9wZXJhdG9yIGlzIHVuYXZhaWxhYmxlIGZvciBlbnVtCkBAIC0xNjgsNyArMTczLDYgQEAKICAgICAgICAgbU5leHRVbmlxdWVJZHNbdXNlXSA9IEFVRElPX1VOSVFVRV9JRF9VU0VfTUFYOwogICAgIH0KIAotICAgIGdldHBpZF9jYWNoZWQgPSBnZXRwaWQoKTsKICAgICBjb25zdCBib29sIGRvTG9nID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLnRlc3RfaGFybmVzcyIsIGZhbHNlKTsKICAgICBpZiAoZG9Mb2cpIHsKICAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwKQEAgLTE4NSwyNyArMTg5LDYgQEAKICAgICBtRWZmZWN0c0ZhY3RvcnlIYWwgPSBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCk7CiAKICAgICBtTWVkaWFMb2dOb3RpZmllci0+cnVuKCJNZWRpYUxvZ05vdGlmaWVyIik7Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIwIik7Ci0gICAgaW50IGRlYnVnZ2FibGUgPSBhdG9pKHZhbHVlKTsKLSAgICBpbnQgdGVlRW5hYmxlZCA9IDA7Ci0gICAgaWYgKGRlYnVnZ2FibGUpIHsKLSAgICAgICAgKHZvaWQpIHByb3BlcnR5X2dldCgiYWYudGVlIiwgdmFsdWUsICIwIik7Ci0gICAgICAgIHRlZUVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKLSAgICB9Ci0gICAgLy8gRklYTUUgc3ltYm9saWMgY29uc3RhbnRzIGhlcmUKLSAgICBpZiAodGVlRW5hYmxlZCAmIDEpIHsKLSAgICAgICAgbVRlZVNpbmtJbnB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDIpIHsKLSAgICAgICAgbVRlZVNpbmtPdXRwdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiA0KSB7Ci0gICAgICAgIG1UZWVTaW5rVHJhY2tFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Om9uRmlyc3RSZWYoKQpAQCAtMjI2LDggKzIwOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtUGF0Y2hQYW5lbCA9IG5ldyBQYXRjaFBhbmVsKHRoaXMpOwotCiAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKIAogICAgIGdBdWRpb0ZsaW5nZXIgPSB0aGlzOwpAQCAtMzExLDEzICsyOTIsMTYgQEAKICAgICAgICAgZnVsbENvbmZpZy5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CiAgICAgICAgIGZ1bGxDb25maWcuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgICAgIGZ1bGxDb25maWcuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbVR5cGUsIGNsaWVudC5jbGllbnRQaWQsIGNsaWVudC5jbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgQUxPR1dfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iLCBfX2Z1bmNfXyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cihhdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLApAQCAtMzQxLDcgKzMyNSw3IEBACiAgICAgICAgICpzZXNzaW9uSWQgPSBhY3R1YWxTZXNzaW9uSWQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChpbywgc3RyZWFtVHlwZSwgYWN0dWFsU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgIH0KQEAgLTM1Myw2ICszMzcsMjcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCisvKiBzdGF0aWMgKi8KK2ludCBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbikgeworICAgIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IGV2cyA9IGdldEV4dGVybmFsVmlicmF0b3JTZXJ2aWNlKCk7CisgICAgaWYgKGV2cyAhPSAwKSB7CisgICAgICAgIGludDMyX3QgcmV0OworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBldnMtPm9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydCgqZXh0ZXJuYWxWaWJyYXRpb24sICZyZXQpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7Cit9CisKKy8qIHN0YXRpYyAqLwordm9pZCBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKSB7CisgICAgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZXZzID0gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKTsKKyAgICBpZiAoZXZzICE9IDApIHsKKyAgICAgICAgZXZzLT5vbkV4dGVybmFsVmlicmF0aW9uU3RvcCgqZXh0ZXJuYWxWaWJyYXRpb24pOworICAgIH0KK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19pbnRlcmZhY2VzW10gPSB7CiAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlksCiAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsCkBAIC00NzgsNyArNDgzLDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAotICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAogICAgICAgICBpZiAoIWxvY2tlZCkgewpAQCAtNTM0LDEyICs1MzksMjIgQEAKICAgICAgICAgICAgIGRldi0+ZHVtcChmZCk7CiAgICAgICAgIH0KIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIC8vIGR1bXAgdGhlIHNlcmlhbGx5IHNoYXJlZCByZWNvcmQgdGVlIHNpbmsKLSAgICAgICAgaWYgKG1SZWNvcmRUZWVTb3VyY2UgIT0gMCkgewotICAgICAgICAgICAgZHVtcFRlZShmZCwgbVJlY29yZFRlZVNvdXJjZSwgQVVESU9fSU9fSEFORExFX05PTkUsICdDJyk7Ci0gICAgICAgIH0KLSNlbmRpZgorICAgICAgICBtUGF0Y2hQYW5lbC5kdW1wKGZkKTsKKworICAgICAgICAvLyBkdW1wIGV4dGVybmFsIHNldFBhcmFtZXRlcnMKKyAgICAgICAgYXV0byBkdW1wTG9nZ2VyID0gW2ZkXShTaW1wbGVMb2cmIGxvZ2dlciwgY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXMgc2V0UGFyYW1ldGVyczpcbiIsIG5hbWUpOworICAgICAgICAgICAgbG9nZ2VyLmR1bXAoZmQsICIgICAgIiAvKiBwcmVmaXggKi8pOworICAgICAgICB9OworICAgICAgICBkdW1wTG9nZ2VyKG1SZWplY3RlZFNldFBhcmFtZXRlckxvZywgIlJlamVjdGVkIik7CisgICAgICAgIGR1bXBMb2dnZXIobUFwcFNldFBhcmFtZXRlckxvZywgIkFwcCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2csICJTeXN0ZW0iKTsKKworICAgICAgICAvLyBkdW1wIGhpc3RvcmljYWwgdGhyZWFkcyBpbiB0aGUgbGFzdCAxMCBzZWNvbmRzCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRocmVhZExvZyA9IG1UaHJlYWRMb2cuZHVtcFRvU3RyaW5nKAorICAgICAgICAgICAgICAgICJIaXN0b3JpY2FsIFRocmVhZCBMb2cgIiwgMCAvKiBsaW5lcyAqLywKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkgLSAxMCAqIDYwICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHdyaXRlKGZkLCB0aHJlYWRMb2cuY19zdHIoKSwgdGhyZWFkTG9nLnNpemUoKSk7CiAKICAgICAgICAgQlVGTE9HX1JFU0VUOwogCkBAIC01NDcsNiArNTYyLDEwIEBACiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gTkJBSU9fVGVlIGR1bXAgaXMgc2FmZSB0byBjYWxsIG91dHNpZGUgb2YgQUYgbG9jay4KKyAgICAgICAgTkJBSU9fVGVlOjpkdW1wQWxsKGZkLCAiX0RVTVAiKTsKKyNlbmRpZgogICAgICAgICAvLyBhcHBlbmQgYSBjb3B5IG9mIG1lZGlhLmxvZyBoZXJlIGJ5IGZvcndhcmRpbmcgZmQgdG8gaXQsIGJ1dCBkb24ndCBhdHRlbXB0CiAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgc2VydmljZSBpZiBpdCdzIG5vdCBydW5uaW5nLCBhcyBpdCB3aWxsIGJsb2NrIGZvciBhIHNlY29uZAogICAgICAgICBpZiAoc01lZGlhTG9nU2VydmljZUFzQmluZGVyICE9IDApIHsKQEAgLTY2MiwxMSArNjgxLDEyIEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwpAQCAtNjk2LDcgKzcxNiw3IEBACiAKICAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmlucHV0LmF0dHIsICZvdXRwdXQub3V0cHV0SWQsIHNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCAmaW5wdXQuY29uZmlnLCBpbnB1dC5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybiBlcnJvciAlZCBvciBpbnZhbGlkIG91dHB1dCBoYW5kbGUiLCBsU3RhdHVzKTsKQEAgLTc2Nyw2ICs3ODcsNjAgQEAKICAgICAgICAgb3V0cHV0LmFmRnJhbWVDb3VudCA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOwogICAgICAgICBvdXRwdXQuYWZTYW1wbGVSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiAgICAgICAgIG91dHB1dC5hZkxhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOworICAgICAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOworCisgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBDb25uZWN0IHNlY29uZGFyeSBvdXRwdXRzLiBGYWlsdXJlIG9uIGEgc2Vjb25kYXJ5IG91dHB1dCBtdXN0IG5vdCBpbXBlZCB0aGUgcHJpbWFyeQorICAgICAgICAgICAgLy8gQW55IHNlY29uZGFyeSBvdXRwdXQgc2V0dXAgZmFpbHVyZSB3aWxsIGxlYWQgdG8gYSBkZXN5bmMgYmV0d2VlbiB0aGUgQVAgYW5kIEFGIHVudGlsCisgICAgICAgICAgICAvLyB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgVGVlUGF0Y2hlcyB0ZWVQYXRjaGVzOworICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzZWNvbmRhcnlPdXRwdXQgOiBzZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnNlY29uZGFyeVRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzZWNvbmRhcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBzZWNvbmRhcnkgb3V0cHV0ICVkIiwgb3V0cHV0Lm91dHB1dElkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBzdGQ6OmxjbSh0aHJlYWQtPmZyYW1lQ291bnQoKSwgc2Vjb25kYXJ5VGhyZWFkLT5mcmFtZUNvdW50KCkpOworCisgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgICAgICAgICAgICAgIGF1dG8gaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgICAgICAgICAgICAgc3AgcGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZChudWxscHRyIC8qIHRocmVhZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBidWZmZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8pOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoUmVjb3JkIGluaXQgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcCBwYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKHNlY29uZGFyeVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLyk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2Vjb25kYXJ5IG91dHB1dCBwYXRjaFRyYWNrIGluaXQgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZWVQYXRjaGVzLnB1c2hfYmFjayh7cGF0Y2hSZWNvcmQsIHBhdGNoVHJhY2t9KTsKKyAgICAgICAgICAgICAgICBzZWNvbmRhcnlUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2hUcmFjayk7CisgICAgICAgICAgICAgICAgcGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoUmVjb3JkLmdldCgpKTsKKyAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoVHJhY2suZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2stPnNldFRlZVBhdGNoZXMoc3RkOjptb3ZlKHRlZVBhdGNoZXMpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKQEAgLTgxMyw3ICs4ODcsNyBAQAogCiBFeGl0OgogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIG91dHB1dC5vdXRwdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQub3V0cHV0SWQsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKQEAgLTkxNyw2ICs5OTEsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIHN0YXR1c190IHJldCA9IGluaXRDaGVjaygpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgcmFuZ2UKKyAgICBpZiAoaXNuYW4oYmFsYW5jZSkgfHwgZmFicyhiYWxhbmNlKSA+IDEuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBzaG9ydCBjdXQuCisgICAgaWYgKG1NYXN0ZXJCYWxhbmNlID09IGJhbGFuY2UpIHJldHVybiBOT19FUlJPUjsKKworICAgIG1NYXN0ZXJCYWxhbmNlID0gYmFsYW5jZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKICAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKQEAgLTEwNTYsNiArMTE2NCwxMyBAQAogICAgIHJldHVybiBtYXN0ZXJWb2x1bWVfbCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqYmFsYW5jZSA9IGdldE1hc3RlckJhbGFuY2VfbCgpOworICAgIHJldHVybiBOT19FUlJPUjsgLy8gaWYgY2FsbGVkIHRocm91Z2ggYmluZGVyLCBtYXkgcmV0dXJuIGEgdHJhbnNhY3Rpb25hbCBlcnJvcgorfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZSgpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEwNjcsNiArMTE4MiwxMSBAQAogICAgIHJldHVybiBtTWFzdGVyVm9sdW1lOwogfQogCitmbG9hdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1NYXN0ZXJCYWxhbmNlOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZV9sKCkgY29uc3QKIHsKICAgICByZXR1cm4gbU1hc3Rlck11dGU7CkBAIC0xMDc4LDkgKzExOTgsOSBAQAogICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgaW52YWxpZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgY2FsbGVyICE9IGdldHBpZF9jYWNoZWQpIHsKLSAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHBpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyLCBzdHJlYW0pOworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiAhaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7CisgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSB1aWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlclVpZCwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTE4MCw2ICsxMzAwLDIzIEBACiAgICAgfQogfQogCisvLyBmb3J3YXJkQXVkaW9Id1N5bmNUb0Rvd25zdHJlYW1QYXRjaGVzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OmZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCB1cFN0cmVhbSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYpPiB1c2VUaHJlYWQpCit7CisgICAgc3RkOjp2ZWN0b3I8UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gc3dQYXRjaGVzOworICAgIGlmIChtUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKHVwU3RyZWFtLCAmc3dQYXRjaGVzKSAhPSBPSykgcmV0dXJuOworICAgIEFMT0dWX0lGKCFzd1BhdGNoZXMuZW1wdHkoKSwgIiVzIGZvdW5kICV6dSBkb3duc3RyZWFtIHBhdGNoZXMgZm9yIHN0cmVhbSBJRCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc3dQYXRjaGVzLnNpemUoKSwgdXBTdHJlYW0pOworICAgIGZvciAoY29uc3QgYXV0byYgc3dQYXRjaCA6IHN3UGF0Y2hlcykgeworICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gZG93blN0cmVhbSA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzd1BhdGNoLmdldFBsYXliYWNrVGhyZWFkSGFuZGxlKCkpOworICAgICAgICBpZiAoZG93blN0cmVhbSAhPSBOVUxMICYmICh1c2VUaHJlYWQgPT0gbnVsbHB0ciB8fCB1c2VUaHJlYWQoZG93blN0cmVhbSkpKSB7CisgICAgICAgICAgICBkb3duU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICB9CisgICAgfQorfQorCiAvLyBGaWx0ZXIgcmVzZXJ2ZWQga2V5cyBmcm9tIHNldFBhcmFtZXRlcnMoKSBiZWZvcmUgZm9yd2FyZGluZyB0byBhdWRpbyBIQUwgb3IgYWN0aW5nIHVwb24uCiAvLyBTb21lIGtleXMgYXJlIHVzZWQgZm9yIGF1ZGlvIHJvdXRpbmcgYW5kIGF1ZGlvIHBhdGggY29uZmlndXJhdGlvbiBhbmQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB1c2UKIC8vIGJ5IGF1ZGlvIHBvbGljeSBhbmQgYXVkaW8gZmxpbmdlciBmb3IgZnVuY3Rpb25hbCwgcHJpdmFjeSBhbmQgc2VjdXJpdHkgcmVhc29ucy4KQEAgLTEyMDAsMjMgKzEzMzcsMzkgQEAKICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksCiAgICAgfTsKIAotICAgIC8vIG11bHRpdXNlciBmcmllbmRseSBhcHAgSUQgY2hlY2sgZm9yIHJlcXVlc3RzIGNvbWluZyBmcm9tIGF1ZGlvc2VydmVyCi0gICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKGNhbGxpbmdVaWQpID09IEFJRF9BVURJT1NFUlZFUikgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIGZpbHRlciBpZiBhdWRpb3NlcnZlci4KICAgICB9CiAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwogICAgIFN0cmluZzggdmFsdWU7CisgICAgQXVkaW9QYXJhbWV0ZXIgcmVqZWN0ZWRQYXJhbTsKICAgICBmb3IgKGF1dG8mIGtleSA6IGtSZXNlcnZlZFBhcmFtZXRlcnMpIHsKICAgICAgICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIiVzOiBmaWx0ZXJpbmcga2V5ICVzIHZhbHVlICVzIGZyb20gdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uYWRkKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7CiAgICAgICAgIH0KICAgICB9CisgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHBhcmFtLnNpemUoKSArIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZFBhcmFtLnNpemUoKSwgcmVqZWN0ZWRQYXJhbS50b1N0cmluZygpLCBjYWxsaW5nVWlkKTsKICAgICBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OmxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhzaXplX3Qgb3JpZ2luYWxLVlBTaXplLCBjb25zdCBTdHJpbmc4JiBvcmlnaW5hbEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWplY3RlZEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIHJlamVjdGVkS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCkgeworICAgIGF1dG8gcHJlZml4ID0gU3RyaW5nODo6Zm9ybWF0KCJVSUQgJTVkIiwgY2FsbGluZ1VpZCk7CisgICAgYXV0byBzdWZmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIiV6dSBLVlAgcmVjZWl2ZWQ6ICVzIiwgb3JpZ2luYWxLVlBTaXplLCBvcmlnaW5hbEtWUHMuY19zdHIoKSk7CisgICAgaWYgKHJlamVjdGVkS1ZQU2l6ZSAhPSAwKSB7CisgICAgICAgIGF1dG8gZXJyb3IgPSBTdHJpbmc4Ojpmb3JtYXQoIiV6dSBLVlAgcmVqZWN0ZWQ6ICVzIiwgcmVqZWN0ZWRLVlBTaXplLCByZWplY3RlZEtWUHMuY19zdHIoKSk7CisgICAgICAgIEFMT0dXKCIlczogJXMsICVzLCAlcyIsIF9fZnVuY19fLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgICAgICBtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2cubG9nKCIlcywgJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvJiBsb2dnZXIgPSAoaXNTZXJ2aWNlVWlkKGNhbGxpbmdVaWQpID8gbVN5c3RlbVNldFBhcmFtZXRlckxvZyA6IG1BcHBTZXRQYXJhbWV0ZXJMb2cpOworICAgICAgICBsb2dnZXIubG9nKCIlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewogICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzKCk6IGlvICVkLCBrZXl2YWx1ZSAlcywgY2FsbGluZyBwaWQgJWQgY2FsbGluZyB1aWQgJWQiLApAQCAtMTI5Niw3ICsxNDQ5LDkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQpAQCAtMTYzNiw3ICsxNzkxLDcgQEAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC0xNzUxLDYgKzE5MDYsNyBAQAogCiAgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwogICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKyAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOwogCiAgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKQEAgLTE4NTQsNiArMjAxMCwxMCBAQAogCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQorICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAvLyBBbiBNU0QgbW9kdWxlIGlzIGluc2VydGVkIGJlZm9yZSBoYXJkd2FyZSBtb2R1bGVzIGluIG9yZGVyIHRvIG1peCBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8QXVkaW9Id0RldmljZTo6RmxhZ3M+KGZsYWdzIHwgQXVkaW9Id0RldmljZTo6QUhXRF9JU19JTlNFUlQpOworICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KSBuZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEUpOwogICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKQEAgLTE4ODUsNyArMjA0NSw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KQogewogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAodWlkICE9IEFJRF9TWVNURU0pIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MzAsNiArMjA5MCwyOCBAQAogICAgIHJldHVybiBtQ2xpZW50U2hhcmVkSGVhcFNpemU7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKF9fZnVuY19fKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCiBhdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTk3NSw3ICsyMTU3LDEwIEBACiAgICAgICAgIGlmIChzZXNzaW9ucyAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHZhbHVlKTsKLSAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAyMSw3ICsyMjA2LDEwIEBACiAgICAgICAgIEFMT0dWKCJzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCBmb3VuZCBJRCAlZCBmb3Igc2Vzc2lvbiAlZCIsIHN5bmNJZCwgc2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCBzeW5jSWQpOwotICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICB9CiB9CiAKQEAgLTIxMTEsNiArMjI5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKCpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1PcGVuZWQob3V0SHdEZXYsICpvdXRwdXQpOwogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMDksNiArMjM5OCw4IEBACiAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHBsYXliYWNrVGhyZWFkKTsKKwogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIpIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMjQwLDEyICsyNDMxLDE0IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICAgICAgICAgIEFMT0dEKCJjbG9zaW5nIG1tYXBUaHJlYWQgJXAiLCBtbWFwVGhyZWFkLmdldCgpKTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwogICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtQ2xvc2VkKG91dHB1dCk7CiAgICAgfQogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCiAgICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCkBAIC0yMjc0LDcgKzI0NjcsNyBAQAogICAgIGRlbGV0ZSBvdXQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgdGhyZWFkLT5leGl0KCk7CkBAIC0yMzI2LDcgKzI1MTksOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKAorICAgICAgICAgICAgbW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncywgQVVESU9fREVWSUNFX05PTkUsIFN0cmluZzh7fSk7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgpAQCAtMjM0Miw3ICsyNTM2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG91dHB1dERldmljZUFkZHJlc3MpCiB7CiAgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2VzKTsKICAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CkBAIC0yMzUwLDYgKzI1NDYsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvLyBTb21lIGZsYWdzIGFyZSBzcGVjaWZpYyB0byBmcmFtZXdvcmsgYW5kIG11c3Qgbm90IGxlYWsgdG8gdGhlIEhBTC4KKyAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGZsYWdzICYgfkFVRElPX0lOUFVUX0ZSQU1FV09SS19GTEFHUyk7CisKICAgICAvLyBBdWRpbyBQb2xpY3kgY2FuIHJlcXVlc3QgYSBzcGVjaWZpYyBoYW5kbGUgZm9yIGhhcmR3YXJlIGhvdHdvcmQuCiAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyBub3QgdG8gcmUtb3BlbiBhbiBhbHJlYWR5IG9wZW5lZCBpbnB1dC4KICAgICAvLyBJdCBpcyB0byB1c2UgYSBwcmUtYXNzaWduZWQgSS9PIGhhbmRsZS4KQEAgLTIzNjgsNyArMjU2Nyw4IEBACiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBpbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOworICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAlI3gsIFNhbXBsaW5nUmF0ZSAlZCIKICAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCBhZGRyICVzIiwKICAgICAgICAgICAgIGluU3RyZWFtLmdldCgpLApAQCAtMjM5MSw3ICsyNTkxLDggQEAKICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmluU3RyZWFtKTsKICAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQogCkBAIC0yNDA3LDU1ICsyNjA4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwpAQCAtMjQ2NSw5ICsyNjE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CkBAIC0yNDk2LDYgKzI2NDUsOCBAQAogICAgICAgICBpZiAocmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHJlY29yZFRocmVhZCk7CisKICAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQogICAgICAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCiAgICAgICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKQEAgLTI1MzgsNiArMjY4OSw3IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKQEAgLTI1NjcsNyArMjcxOSw3IEBACiAgICAgZGVsZXRlIGluOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOwpAQCAtMjYwNSw3ICsyNzU3LDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAKQEAgLTI2MzksNyArMjc5Miw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIGFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTI2NTYsOSArMjgxMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgbWVkaWFzZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCisgICAgLy8gSWYgdGhlIGNhbGxlciBpcyBhdWRpb3NlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgInNlc3Npb24gaWQgJWQgbm90IGZvdW5kIGZvciBwaWQgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNzMzLDYgKzI4ODgsMTcgQEAKICAgICByZXR1cm47CiB9CiAKKy8vIGR1bXBUb1RocmVhZExvZ19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKQoreworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmc7CisgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CisgICAgICAgIG1UaHJlYWRMb2cubG9ncygtMSAvKiB0aW1lICovLCBmZFRvU3RyaW5nLmdldFN0cmluZ0FuZENsb3NlKCkpOworICAgIH0KK30KKwogLy8gY2hlY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2UgKkF1ZGlvRmxpbmdlcjo6Y2hlY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKIHsKQEAgLTI5MzgsMTYgKzMxMDQsNzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAogeworICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlVXVpZCA9PSBOVUxMIHx8IGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewotICAgICAgICByZXR1cm4gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgeworCisgICAgaWYgKCFtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQotfQogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGF0LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBUeXBlVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW5zdGVhZC4KKworICAgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgZGVzY3JpcHRvciB0byBhdm9pZCBtb2RpZnlpbmcgfGRlc2NyaXB0b3J8IGluIHRoZSBmYWlsdXJlIGNhc2UuCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZworCisgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsIHBUeXBlVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqZGVzY3JpcHRvciA9IGRlc2M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZWZlcnJlZCBmbGFnIG9yIHRoaXMgZGVzY3JpcHRvciBtYXRjaGVzIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBzdWNjZXNzISBJZiB0aGlzIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZSBhIGJldHRlciBtYXRjaGluZyB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGlmIG5vIGVmZmVjdCB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGZsYWcgaXMgZm91bmQsIHRoZSBkZXNjcmlwdG9yIHJldHVybmVkIHdpbGwgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGVmZmVjdCB0aGF0IGF0IGxlYXN0IGhhZCBhIG1hdGNoaW5nIHR5cGUgdXVpZCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkVHlwZUZsYWcgPT0gRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBwcmVmZXJyZWRUeXBlRmxhZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVmZmVjdCBub3QgZm91bmQgYnkgdHlwZS4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWl0aGVyIHV1aWQgb3IgdHlwZSB1dWlkIG11c3QgYmUgbm9uLW51bGwgVVVJRHMuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CiAKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTI5NjYsNyArMzE5MCw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKQEAgLTI5ODksOCArMzIxMyw4IEBACiAgICAgfQogCiAgICAgLy8gU2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkX2NhY2hlZCAhPSBwaWQpIHsKKyAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTMwMDEsNjUgKzMyMjUsMTYgQEAKICAgICB9CiAKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnV1aWQpKSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvcgotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZkZXNjKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdEdldERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW4gZWZmZWN0IGZhY3RvcnkKLSAgICAgICAgICAgIGlmIChFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIG5vIGVmZmVjdCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZDsKLSAgICAgICAgICAgIGQuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKLSAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+cXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlFZmZlY3QiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MudHlwZSwgJnBEZXNjLT50eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLiBJZiB0aGUgc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgICAgICAvLyAwIGFuZCB0aGUgZWZmZWN0IGlzIG5vdCBhdXhpbGlhcnksIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gYXV4aWxpYXJ5IHZlcnNpb24gb2YgdGhpcyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBkID0gZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGb3Igc2FtZSBlZmZlY3QgdHlwZSwgY2hvc2UgYXV4aWxpYXJ5IHZlcnNpb24gb3ZlciBpbnNlcnQgdmVyc2lvbiBpZgotICAgICAgICAgICAgLy8gY29ubmVjdCB0byBvdXRwdXQgbWl4IChDb21wbGlhbmNlIHRvIE9wZW5TTCBFUykKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCi0gICAgICAgICAgICAgICAgICAgIChkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBkOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGUgdXVpZC90eXBlLgorICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBpcyB0aGUgb3V0cHV0IG1peCwgcHJlZmVyIGFuIGF1eGlsaWFyeSBlZmZlY3QsCisgICAgICAgIC8vIG90aGVyd2lzZSBubyBwcmVmZXJlbmNlLgorICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlID0gKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIDogRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKTsKKyAgICAgICAgbFN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmcERlc2MtPnR5cGUsIHByZWZlcnJlZFR5cGUsICZkZXNjKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBnZXRFZmZlY3REZXNjcmlwdG9yIiwgbFN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgewogCiAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0cyBvbiBhIHNlc3Npb24gZGlmZmVyZW50IGZyb20gMCAob3V0cHV0IG1peCkKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKQEAgLTMxMDIsOSArMzI3NywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHRocmVhZCB3aGVyZSB0aGUgc3BlY2lmaWVkIGF1ZGlvIHNlc3Npb24gaXMgcHJlc2VudAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25UeXBlID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblR5cGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQgd2l0aCBzYW1lIGVmZmVjdCBzZXNzaW9uIGlzIHByZWZlcmFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzZXNzaW9uVHlwZSAmIFRocmVhZEJhc2U6OkVGRkVDVF9TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMzM3NCwxMzYgKzM1NTMsNiBAQAogfQogCiAKLXN0cnVjdCBFbnRyeSB7Ci0jZGVmaW5lIFRFRV9NQVhfRklMRU5BTUUgMzIgLy8gJVklbSVkJUglTSVTXyVkLndhdiA9IDQrMisyKzIrMisyKzErMSs0KzEgPSAyMQotICAgIGNoYXIgbUZpbGVOYW1lW1RFRV9NQVhfRklMRU5BTUVdOwotfTsKLQotaW50IGNvbXBhckVudHJ5KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgICByZXR1cm4gc3RyY21wKCgoY29uc3QgRW50cnkgKikgcDEpLT5tRmlsZU5hbWUsICgoY29uc3QgRW50cnkgKikgcDIpLT5tRmlsZU5hbWUpOwotfQotCi0jaWZkZWYgVEVFX1NJTksKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVGVlKGludCBmZCwgY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgY2hhciBzdWZmaXgpCi17Ci0gICAgTkJBSU9fU291cmNlICp0ZWVTb3VyY2UgPSBzb3VyY2UuZ2V0KCk7Ci0gICAgaWYgKHRlZVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIC53YXYgcm90YXRpb24KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBiZW5pZ24gcmFjZSBjb25kaXRpb24gaWYgMiB0aHJlYWRzIGNhbGwgdGhpcyBzaW11bHRhbmVvdXNseS4KLSAgICAgICAgLy8gVGhleSB3b3VsZCBib3RoIHRyYXZlcnNlIHRoZSBkaXJlY3RvcnksIGJ1dCB0aGUgcmVzdWx0IHdvdWxkIHNpbXBseSBiZQotICAgICAgICAvLyBmYWlsdXJlcyBhdCB1bmxpbmsoKSB3aGljaCBhcmUgaWdub3JlZC4gIEl0J3MgYWxzbyB1bmxpa2VseSBzaW5jZQotICAgICAgICAvLyBub3JtYWxseSBkdW1wc3lzIGlzIG9ubHkgZG9uZSBieSBidWdyZXBvcnQgb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAgICBjaGFyIHRlZVBhdGhbUEFUSF9NQVhdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOwotICAgICAgICBzaXplX3QgdGVlUGF0aExlbiA9IHN0cmxlbih0ZWVQYXRoKTsKLSAgICAgICAgRElSICpkaXIgPSBvcGVuZGlyKHRlZVBhdGgpOwotICAgICAgICB0ZWVQYXRoW3RlZVBhdGhMZW4rK10gPSAnLyc7Ci0gICAgICAgIGlmIChkaXIgIT0gTlVMTCkgewotI2RlZmluZSBURUVfTUFYX1NPUlQgMjAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gc29ydAotI2RlZmluZSBURUVfTUFYX0tFRVAgMTAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcAotICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKLSAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAwOyAvLyBjbGVhciBlcnJubyBiZWZvcmUgcmVhZGRpcigpIHRvIHRyYWNrIHBvdGVudGlhbCBlcnJvcnMuCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAidGVlIHJlYWRkaXIoKSBmYWlsdXJlICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihyZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVMZW4gPD0gNCB8fCBuYW1lTGVuID49IFRFRV9NQVhfRklMRU5BTUUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgmcmVzdWx0LT5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKSBjbG9zZWRpcihkaXIpOwotICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPiBURUVfTUFYX0tFRVApIHsKLSAgICAgICAgICAgICAgICBxc29ydChlbnRyaWVzLCBlbnRyeUNvdW50LCBzaXplb2YoRW50cnkpLCBjb21wYXJFbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50IC0gVEVFX01BWF9LRUVQOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBlbnRyaWVzW2ldLm1GaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICUuKnM6ICVzXG4iLCAoaW50KSB0ZWVQYXRoTGVuLCB0ZWVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFyIHRlZVRpbWVbMTZdOwotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0gICAgICAgIHN0cnVjdCB0bSB0bTsKLSAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKLSAgICAgICAgc3RyZnRpbWUodGVlVGltZSwgc2l6ZW9mKHRlZVRpbWUpLCAiJVklbSVkJUglTSVTIiwgJnRtKTsKLSAgICAgICAgc25wcmludGYoJnRlZVBhdGhbdGVlUGF0aExlbl0sIHNpemVvZih0ZWVQYXRoKSAtIHRlZVBhdGhMZW4sICIlc18lZF8lYy53YXYiLCB0ZWVUaW1lLCBpZCwKLSAgICAgICAgICAgICAgICBzdWZmaXgpOwotICAgICAgICAvLyBpZiAyIGR1bXBzeXMgYXJlIGRvbmUgd2l0aGluIDEgc2Vjb25kLCBhbmQgcm90YXRpb24gZGlkbid0IHdvcmssIHRoZW4gZGlzY2FyZCAybmQKLSAgICAgICAgaW50IHRlZUZkID0gb3Blbih0ZWVQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PRk9MTE9XLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgICAgIGlmICh0ZWVGZCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSB1c2UgbGlic25kZmlsZQotICAgICAgICAgICAgY2hhciB3YXZIZWFkZXJbNDRdOwotICAgICAgICAgICAgbWVtY3B5KHdhdkhlYWRlciwKLSAgICAgICAgICAgICAgICAiUklGRlwwXDBcMFwwV0FWRWZtdCBcMjBcMFwwXDBcMVwwXDJcMFwxMDRcMjU0XDBcMFwwXDBcMFwwXDRcMFwyMFwwZGF0YVwwXDBcMFwwIiwKLSAgICAgICAgICAgICAgICBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gdGVlU291cmNlLT5mb3JtYXQoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKLSAgICAgICAgICAgIHdhdkhlYWRlclsyMl0gPSBjaGFubmVsQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgd2F2SGVhZGVyWzI0XSA9IHNhbXBsZVJhdGU7ICAgICAgICAgLy8gc2FtcGxlIHJhdGUKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNV0gPSBzYW1wbGVSYXRlID4+IDg7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gZnJhbWVTaXplOyAgICAgICAgICAvLyBibG9jayBhbGlnbm1lbnQKLSAgICAgICAgICAgIHdhdkhlYWRlclszM10gPSBmcmFtZVNpemUgPj4gODsKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCB3YXZIZWFkZXIsIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgICAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7Ci0jZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNCAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgcGVyIEkvTyBvcGVyYXRpb24KLSAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhURUVfU0lOS19SRUFEICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBURUVfU0lOS19SRUFEOwotICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsID0gdGVlU291cmNlLT5yZWFkKGJ1ZmZlciwgY291bnQpOwotICAgICAgICAgICAgICAgIGJvb2wgd2FzRmlyc3RSZWFkID0gZmlyc3RSZWFkOwotICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsID09IChzc2l6ZV90KSBPVkVSUlVOICYmIHdhc0ZpcnN0UmVhZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjdHVhbCA8PSAoc3NpemVfdCljb3VudCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSBhY3R1YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGZyYW1lU2l6ZSAtIDg7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0MCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIGNyZWF0ZSBmaWxlIHdpdGggdGVtcG9yYXJ5IG5hbWUgYW5kIHRoZW4gcmVuYW1lIHRvIGZpbmFsIGlmIG5vbi1lbXB0eS4KLSAgICAgICAgICAgIGlmICh0b3RhbCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidGVlIGNvcGllZCB0byAlc1xuIiwgdGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOTYzYTg3ZC4uMTQ0MWUxNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMjEsMTMgKzIxLDE5IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0JuRXh0ZXJuYWxWaWJyYXRpb25Db250cm9sbGVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgpAQCAtNjIsNyArNjgsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9MaW5lYXJNYXAuaD4KICNpbmNsdWRlIDxtZWRpYS9Wb2x1bWVTaGFwZXIuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvRmRUb1N0cmluZy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1NpbXBsZUxvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgpAQCAtNzEsNiArODAsNyBAQAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiU3BkaWZTdHJlYW1PdXQuaCIKICNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgogCkBAIC03OCw2ICs4OCw4IEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCisjaW5jbHVkZSA8dmlicmF0b3IvRXh0ZXJuYWxWaWJyYXRpb24uaD4KKwogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5BdWRpb1JlY29yZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMzEsNiArMTQzLDEwIEBACiAgICAgdmlydHVhbCAgICAgZmxvYXQgICAgICAgbWFzdGVyVm9sdW1lKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgbWFzdGVyTXV0ZSgpIGNvbnN0OwogCisgICAgLy8gQmFsYW5jZSB2YWx1ZSBtdXN0IGJlIHdpdGhpbiAtMS5mIChsZWZ0IG9ubHkpIHRvIDEuZiAocmlnaHQgb25seSkgaW5jbHVzaXZlLgorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3Qgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpOwpAQCAtMjAyLDYgKzIxOCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCkBAIC0yNzYsNiArMjk0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNbWFwU3RyZWFtSW50ZXJmYWNlPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICBzdGF0aWMgaW50IG9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbik7CisgICAgc3RhdGljIHZvaWQgb25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pOwogcHJpdmF0ZToKICAgICAvLyBGSVhNRSBUaGUgNDAwIGlzIHRlbXBvcmFyaWx5IHRvbyBoaWdoIHVudGlsIGEgbGVhayBvZiB3cml0ZXJzIGluIG1lZGlhLmxvZyBpcyBmaXhlZC4KICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAwICogMTAyNDsKQEAgLTM1NywxNiArMzc4LDE3IEBACiAgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKICAgICAgICAgc3dpdGNoIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKSkgewogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKLSAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IEZDQ18yOyAvLyBzdGVyZW8gaXMgZGVmYXVsdAotICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbENvdW50ID4gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSGFwdGljIGNoYW5uZWwgbWFzayBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGNoYW5uZWwgcG9zaXRpb24gbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1heENoYW5uZWxDb3VudCA9IGtFbmFibGVFeHRlbmRlZENoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgID8gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUyA6IEZDQ18yOworICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbENvdW50ID4gbWF4Q2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBjaGFubmVsTWFzayBpcyB0aGUgImNhbm9uaWNhbCIgb25lIHdlIGV4cGVjdCBmb3IgdGhlIGNoYW5uZWxDb3VudC4KLSAgICAgICAgICAgIHJldHVybiBjaGFubmVsTWFzayA9PSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBhdWRpb19jaGFubmVsX3Bvc2l0aW9uX21hc2tfaXNfb3V0X2Nhbm9uaWNhbChjaGFubmVsTWFzayk7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDoKICAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgewpAQCAtNDE2LDYgKzQzOCwxMSBAQAogICAgIHZvaWQgZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIFNpbXBsZUxvZyBtVGhyZWFkTG9nezE2fTsgLy8gMTYgVGhyZWFkIGhpc3RvcnkgbGltaXQKKworICAgIGNsYXNzIFRocmVhZEJhc2U7CisgICAgdm9pZCBkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKTsKKwogICAgIC8vIC0tLSBDbGllbnQgLS0tCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIFJlZkJhc2UgewogICAgIHB1YmxpYzoKQEAgLTUwMiw2ICs1MjksOSBAQAogICAgIGNsYXNzIEVmZmVjdENoYWluOwogCiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtSW47CisgICAgc3RydWN0IFRlZVBhdGNoOworICAgIHVzaW5nIFRlZVBhdGNoZXMgPSBzdGQ6OnZlY3RvcjxUZWVQYXRjaD47CisKIAogICAgIHN0cnVjdCAgc3RyZWFtX3R5cGVfdCB7CiAgICAgICAgIHN0cmVhbV90eXBlX3QoKQpAQCAtNTQwLDYgKzU3MCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwpAQCAtNTY0LDYgKzU5NSwxMCBAQAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0TWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKIApAQCAtNjA1LDcgKzY0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKQEAgLTY3NSw2ICs3MTIsOSBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKIAogICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgdm9pZCBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYpPiB1c2VUaHJlYWQgPSBudWxscHRyKTsKIAogICAgIC8vIEF1ZGlvU3RyZWFtSW4gaXMgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgogICAgIC8vIEZvciBlbXBoYXNpcywgd2UgY291bGQgYWxzbyBtYWtlIGFsbCBwb2ludGVycyB0byB0aGVtIGJlICJjb25zdCAqIiwKQEAgLTY5MSw2ICs3MzEsMTEgQEAKICAgICAgICAgICAgIGF1ZGlvSHdEZXYoZGV2KSwgc3RyZWFtKGluKSwgZmxhZ3MoZmxhZ3MpIHt9CiAgICAgfTsKIAorICAgIHN0cnVjdCBUZWVQYXRjaCB7CisgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHBhdGNoUmVjb3JkOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gcGF0Y2hUcmFjazsKKyAgICB9OworCiAgICAgLy8gZm9yIG1BdWRpb1Nlc3Npb25SZWZzIG9ubHkKICAgICBzdHJ1Y3QgQXVkaW9TZXNzaW9uUmVmIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uaWQsIHBpZF90IHBpZCkgOgpAQCAtNzUyLDYgKzc5Nyw3IEBACiAgICAgICAgICAgICAgICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBiZWxvdyBhcmUgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZSA9IDAuZjsKICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdmFyaWFibGVzIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8UmVjb3JkVGhyZWFkPiA+ICAgIG1SZWNvcmRUaHJlYWRzOwpAQCAtNzY5LDYgKzgxNSw3IEBACiAgICAgICAgICAgICAgICAgVmVjdG9yPEF1ZGlvU2Vzc2lvblJlZio+IG1BdWRpb1Nlc3Npb25SZWZzOwogCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgbWFzdGVyVm9sdW1lX2woKSBjb25zdDsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBnZXRNYXN0ZXJCYWxhbmNlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlX2woY29uc3QgY2hhciAqbmFtZSk7CiAKQEAgLTc5MSw0NCArODM4LDE5IEBACiAKICAgICAvLyBmb3IgdXNlIGZyb20gZGVzdHJ1Y3RvcgogICAgIHN0YXR1c190ICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CiAgICAgc3RhdHVzX3QgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZUlucHV0SW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgIHZvaWQgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCiAgICAgc3RhdHVzX3QgICAgY2hlY2tTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKIAogICAgIHZvaWQgICAgICAgIGZpbHRlclJlc2VydmVkUGFyYW1ldGVycyhTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCB1aWRfdCBjYWxsaW5nVWlkKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gYWxsIHJlY29yZCB0aHJlYWRzIHNlcmlhbGx5IHNoYXJlIGEgY29tbW9uIHRlZSBzaW5rLCB3aGljaCBpcyByZS1jcmVhdGVkIG9uIGZvcm1hdCBjaGFuZ2UKLSAgICBzcDxOQkFJT19TaW5rPiAgIG1SZWNvcmRUZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gbVJlY29yZFRlZVNvdXJjZTsKLSNlbmRpZgorICAgIHZvaWQgICAgICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhzaXplX3Qgb3JpZ2luYWxLVlBTaXplLCBjb25zdCBTdHJpbmc4JiBvcmlnaW5hbEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWplY3RlZEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIHJlamVjdGVkS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCk7CiAKIHB1YmxpYzoKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gdGVlIHNpbmssIGlmIGVuYWJsZWQgYnkgcHJvcGVydHksIGFsbG93cyBkdW1wc3lzIHRvIHdyaXRlIG1vc3QgcmVjZW50IGF1ZGlvIHRvIC53YXYgZmlsZQotICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCk7Ci0KLSAgICAvLyB3aGV0aGVyIHRlZSBzaW5rIGlzIGVuYWJsZWQgYnkgcHJvcGVydHkKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua0lucHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua091dHB1dEVuYWJsZWQ7Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtUcmFja0VuYWJsZWQ7Ci0KLSAgICAvLyBydW50aW1lIGNvbmZpZ3VyZWQgc2l6ZSBvZiBlYWNoIHRlZSBzaW5rIHBpcGUsIGluIGZyYW1lcwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtJbnB1dEZyYW1lczsKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rT3V0cHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtUcmFja0ZyYW1lczsKLQotICAgIC8vIGNvbXBpbGUtdGltZSBkZWZhdWx0IHNpemUgb2YgdGVlIHNpbmsgcGlwZXMsIGluIGZyYW1lcwotICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0jZW5kaWYKLQogICAgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCB2YXJpYWJsZXMgYXRvbWljYWxseSB3aXRob3V0IG1Mb2NrLAogICAgIC8vIHRob3VnaCB0aGUgdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggbUxvY2suCiAgICAgYm9vbCAgICBpc0xvd1JhbURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0xvd1JhbURldmljZTsgfQpAQCAtODQzLDEwICs4NjUsMTUgQEAKIAogICAgIG5zZWNzX3QgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWU7ICAvLyB3aGVuIGEgZ2xvYmFsIGVmZmVjdCB3YXMgbGFzdCBlbmFibGVkCiAKLSAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKKyAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBQYXRjaFBhbmVsIG1QYXRjaFBhbmVsOwogICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtRWZmZWN0c0ZhY3RvcnlIYWw7CiAKLSAgICBib29sICAgICAgICBtU3lzdGVtUmVhZHk7CisgICAgYm9vbCAgICAgICBtU3lzdGVtUmVhZHk7CisKKyAgICBTaW1wbGVMb2cgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1BcHBTZXRQYXJhbWV0ZXJMb2c7CisgICAgU2ltcGxlTG9nICBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nOwogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCBlYjgyNmM2Li5kNDI5OWIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTM1LDYgKzM1LDkgQEAKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUgID0gMHgxLAogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCisgICAgICAgIC8vIE1lYW5zIHRoYXQgdGhpcyBpc24ndCBhIHRlcm1pbmFsIG1vZHVsZSwgYW5kIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAgICAgLy8gYXJlIHVzZWQgdG8gdHJhbnNwb3J0IGF1ZGlvIGRhdGEgZnVydGhlci4KKyAgICAgICAgQUhXRF9JU19JTlNFUlQgICAgICAgICAgICAgID0gMHg0LAogICAgIH07CiAKICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCkBAIC01NSw2ICs1OCwxMCBAQAogICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwogICAgIH0KIAorICAgIGJvb2wgaXNJbnNlcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9JU19JTlNFUlQpKTsKKyAgICB9CisKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQogICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQogICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IDFkNGIzZmUuLmE2MGE1ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtNjYsOCArNjYsOSBAQAogICAgIC8vIE1haW50YWluIGEgNjQtYml0IHJlbmRlciBwb3NpdGlvbiB1c2luZyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIHRoZSBIQUwuCiAgICAgLy8gVGhpcyBkZWx0YSBjYWxjdWxhdGlvbiByZWxpZXMgb24gdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVoYXZpb3IKICAgICAvLyBvZiBpbnRlZ2Vycy4gRm9yIGV4YW1wbGUgKDEwMCAtIDB4RkZGRkZGRjApID0gMTE2LgotICAgIHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKLSAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb24gPSAoaW50MzJfdCkoaGFsUG9zaXRpb24gLSB0cnVuY2F0ZWRQb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOworICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKKyAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKICAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKICAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGIzZjVlZmQuLmVjYWViNTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA5LDggKzMwOSw4IEBACiAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBlZmZlY3QgYnVmZmVycyB3aXRob3V0IGFuIGludGVybWVkaWFyeSBlZmZlY3QgcHJvY2Vzcy4KICAgICAvLyBUT0RPOiBjb25zaWRlciBpbXBsZW1lbnRpbmcgY2hhbm5lbCBjb252ZXJzaW9uLgogICAgIGNvbnN0IHNpemVfdCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCA9Ci0gICAgICAgICAgICBpbkNoYW5uZWxDb3VudCAhPSBvdXRDaGFubmVsQ291bnQgPyAwCi0gICAgICAgICAgICAgICAgICAgIDogb3V0Q2hhbm5lbENvdW50ICogc3RkOjptaW4oCisgICAgICAgICAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICogc3RkOjptaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CiAgICAgY29uc3QgYXV0byBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCA9IFt0aGlzLCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudF0oKSB7CkBAIC00ODAsNyArNDgwLDEyIEBACiAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW5wdXQgb250byBvdXRwdXQKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgewotICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIC8vIHNpbWlsYXIgaGFuZGxpbmcgd2l0aCBkYXRhX2J5cGFzcyBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgICBjb3B5SW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTEzMSw3ICsxMTM2LDggQEAKICAgICAvLyBpZiBjb250cm9sbGVyIGZsYWcgaXMgc2V0IChOb3RlIHRoYXQgY29udHJvbGxlciA9PSBUUlVFID0+IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHNldCkKICAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpICYmCiAgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHx8Ci0gICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCkpIHsKKyAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCB8fAorICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUikpIHsKICAgICAgICAgdWludDMyX3Qgdm9sdW1lWzJdOwogICAgICAgICB1aW50MzJfdCAqcFZvbHVtZSA9IE5VTEw7CiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yodm9sdW1lKTsKQEAgLTEzMjYsNiArMTMzMiw3IEBACiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I6IHMuYXBwZW5kKCJtb25pdG9ycyB2b2x1bWUiKTsgYnJlYWs7CiAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CiAgICAgfQogICAgIHMuYXBwZW5kKCIsICIpOwpAQCAtMTQ5Myw2ICsxNTAwLDExIEBACiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCisgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgIT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiXHRFZmZlY3QgSUQgJWQgSEFMIGR1bXA6XG4iLCBtSWQpOworICAgICAgICAodm9pZCltRWZmZWN0SW50ZXJmYWNlLT5kdW1wKGZkKTsKKyAgICB9CisKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTE4NTksNyArMTg3MSw3IEBACiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKICAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLApAQCAtMjI3Miw3ICsyMjg0LDcgQEAKICAgICB9CiAgICAgLy8gdGhlbiBpbmRpY2F0ZSB2b2x1bWUgdG8gYWxsIG90aGVyIGVmZmVjdHMgaW4gY2hhaW4uCiAgICAgLy8gUGFzcyBhbHRlcmVkIHZvbHVtZSB0byBlZmZlY3RzIGJlZm9yZSB2b2x1bWUgY29udHJvbGxlcgotICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlcgorICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlciBvciB3aXRoIHZvbHVtZSBtb25pdG9yIGZsYWcKICAgICB1aW50MzJfdCBsVm9sID0gbmV3TGVmdDsKICAgICB1aW50MzJfdCByVm9sID0gbmV3UmlnaHQ7CiAKQEAgLTIyODUsNyArMjI5NywxMiBAQAogICAgICAgICAgICAgbFZvbCA9ICpsZWZ0OwogICAgICAgICAgICAgclZvbCA9ICpyaWdodDsKICAgICAgICAgfQotICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKCZsVm9sLCAmclZvbCwgZmFsc2UpOworICAgICAgICAvLyBQYXNzIHJlcXVlc3RlZCB2b2x1bWUgZGlyZWN0bHkgaWYgdGhpcyBpcyB2b2x1bWUgbW9uaXRvciBtb2R1bGUKKyAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5pc1ZvbHVtZU1vbml0b3IoKSkgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZShsZWZ0LCByaWdodCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZSgmbFZvbCwgJnJWb2wsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KICAgICAqbGVmdCA9IG5ld0xlZnQ7CiAgICAgKnJpZ2h0ID0gbmV3UmlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCAxNWEyNmVhLi41OGNlMzUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTEzNCw2ICsxMzQsOSBAQAogICAgIGJvb2wgICAgICAgICAgICAgaXNWb2x1bWVDb250cm9sKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOyB9CisgICAgYm9vbCAgICAgICAgICAgICBpc1ZvbHVtZU1vbml0b3IoKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I7IH0KICAgICBzdGF0dXNfdCAgICAgICAgIHNldE9mZmxvYWRlZChib29sIG9mZmxvYWRlZCwgYXVkaW9faW9faGFuZGxlX3QgaW8pOwogICAgIGJvb2wgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdDsKICAgICB2b2lkICAgICAgICAgICAgIGFkZEVmZmVjdFRvSGFsX2woKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IGQwNjM3NzIuLmRkODRiZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgpAQCAtMTYxLDcgKzE2MiwyMSBAQAogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKLSAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXI7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworCisgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IH4wOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCBjYXVzZSBhbnkgaXNzdWVzIGlmIHdlIGp1c3QgZ2V0IGEgc21hbGwgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1JbnB1dFNvdXJjZSAhPSBOVUxMKTsKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CkBAIC0xOTMsMTEgKzIwOSwxOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlID4gMCkgewogICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbVBpcGVTaW5rLT53cml0ZShtUmVhZEJ1ZmZlciwgbVJlYWRCdWZmZXJTdGF0ZSk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCi0gICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKLSAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgZmFzdCB0cmFjayBpcyBhIHBhdGNoIHJlY29yZCwgdXBkYXRlIHRoZSBjYmxrIGJ5CisgICAgICAgICAgICAgICAgLy8gY2FsbGluZyByZWxlYXNlQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChwYXRjaEJ1ZmZlci5yYXcsIGN1cnJlbnQtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBmcmFtZXNXcml0dGVuICogbUZvcm1hdC5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAppbmRleCA5YmNhMmQ0Li5kMjg3MjMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKQEAgLTM3LDYgKzM4LDEwIEBACiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAorICAgIGF1ZGlvX2Zvcm1hdF90ICBtRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gbnVsbHB0cjsgICAvLyBhIHJlZmVyZW5jZSB0byBhIHBhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgaW4gZmFzdCBtb2RlCisKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDc5YmI5ZmUuLmM1Yjk5NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0zMiwxMyArMzIsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiVHlwZWRMb2dnZXIuaCIKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCi1GYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAorRmFzdE1peGVyOjpGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgcGFyZW50SW9IYW5kbGUpCisgICAgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCiAgICAgLy8gbUZhc3RUcmFja05hbWVzCiAgICAgLy8gbUdlbmVyYXRpb25zCiAgICAgbU91dHB1dFNpbmsoTlVMTCksCkBAIC01OCw3ICs2MCw2IEBACiAgICAgbVNpbmtDaGFubmVsQ291bnQoRkNDXzIpLAogICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAotICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCiAgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKICAgICBtRm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKICAgICBtU2FtcGxlUmF0ZSgwKSwKQEAgLTY2LDggKzY3LDExIEBACiAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCgwKSwgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgbU1hc3Rlck1vbm8oZmFsc2UpCisgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAorICAgIG1UaHJlYWRJb0hhbmRsZShwYXJlbnRJb0hhbmRsZSkKIHsKKyAgICAodm9pZCltVGhyZWFkSW9IYW5kbGU7IC8vIHByZXZlbnQgdW51c2VkIHdhcm5pbmcsIHNlZSBDKysxNyBbW21heWJlX3VudXNlZF1dCisKICAgICAvLyBGSVhNRSBwYXNzIHNJbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKICAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CiAgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CkBAIC0xMzUsNiArMTM5LDc1IEBACiAgICAgfQogfQogCit2b2lkIEZhc3RNaXhlcjo6dXBkYXRlTWl4ZXJUcmFjayhpbnQgaW5kZXgsIFJlYXNvbiByZWFzb24pIHsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdFRyYWNrICogY29uc3QgZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2luZGV4XTsKKworICAgIC8vIGNoZWNrIGFuZCB1cGRhdGUgZ2VuZXJhdGlvbgorICAgIGlmIChyZWFzb24gPT0gUkVBU09OX01PRElGWSAmJiBtR2VuZXJhdGlvbnNbaW5kZXhdID09IGZhc3RUcmFjay0+bUdlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2Ugb24gYW4gYWxyZWFkeSBjb25maWd1cmVkIHRyYWNrLgorICAgIH0KKyAgICBtR2VuZXJhdGlvbnNbaW5kZXhdID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKworICAgIC8vIG1NaXhlciA9PSBudWxscHRyIG9uIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSAoY2hlY2sgZG9uZSBhZnRlciBnZW5lcmF0aW9uIHVwZGF0ZSkuCisgICAgaWYgKG1NaXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgIGNhc2UgUkVBU09OX1JFTU9WRToKKyAgICAgICAgbU1peGVyLT5kZXN0cm95KGluZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFTT05fQUREOiB7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgIGluZGV4LCBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgZmFzdCB0cmFjayBpbmRleCIKKyAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5kZXgsIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgIH0KKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOyAgLy8gbm93IGZhbGx0aHJvdWdoIHRvIHVwZGF0ZSB0aGUgbmV3bHkgY3JlYXRlZCB0cmFjay4KKyAgICBjYXNlIFJFQVNPTl9NT0RJRlk6CisgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIoaW5kZXgsIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyKTsKKworICAgICAgICBmbG9hdCB2bGYsIHZyZjsKKyAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyLT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZsZiA9IHZyZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdm9sdW1lIHRvIGF2b2lkIHJhbXAgd2hlbmV2ZXIgdGhlIHRyYWNrIGlzIHVwZGF0ZWQgKG9yIGNyZWF0ZWQpLgorICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGZyb20gc3RhcnRpbmcgZnJlc2ggb3IKKyAgICAgICAgLy8gcmVzdW1pbmcgZnJvbSBhIHBhdXNlZCBzdGF0ZS4KKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworCisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVNT1ZFLCBudWxscHRyKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSk7CisKKyAgICAgICAgbU1peGVyLT5lbmFibGUoaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogaW52YWxpZCB1cGRhdGUgcmVhc29uICVkIiwgX19mdW5jX18sIHJlYXNvbik7CisgICAgfQorfQorCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwpAQCAtMTU1LDIwICsyMjgsMjUgQEAKICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gbU91dHB1dFNpbmtHZW4pIHsKICAgICAgICAgbU91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKICAgICAgICAgbU91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGN1cnJlbnQtPm1TaW5rQ2hhbm5lbE1hc2s7CisgICAgICAgIG1CYWxhbmNlLnNldENoYW5uZWxNYXNrKG1TaW5rQ2hhbm5lbE1hc2spOwogICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgewogICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKIAotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKLSAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IG1TaW5rQ2hhbm5lbENvdW50IC0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICAgICAgfQogICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMTgyLDE1ICsyNjAsMTUgQEAKICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIG1TYW1wbGVSYXRlID4gMCkgewotICAgICAgICAgICAgLy8gVGhlIG1peGVyIHByb2R1Y2VzIGVpdGhlciAxNiBiaXQgUENNIG9yIGZsb2F0IG91dHB1dCwgc2VsZWN0Ci0gICAgICAgICAgICAvLyBmbG9hdCBvdXRwdXQgaWYgdGhlIEhBTCBzdXBwb3J0cyBoaWdoZXIgdGhhbiAxNiBiaXQgcHJlY2lzaW9uLgotICAgICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gbUZvcm1hdC5tRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgogICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgU2VlIHRoZSBvdGhlciBGSVhNRSBhdCBGYXN0TWl4ZXI6OnNldE5CTG9nV3JpdGVyKCkKKyAgICAgICAgICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgcGFyYW1zOworICAgICAgICAgICAgcGFyYW1zLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIExPR19USFJFQURfUEFSQU1TKHBhcmFtcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CkBAIC0yMjAsNiArMjk4LDEwIEBACiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUuc2V0KG1Gb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkgKyAiX0YiKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CiAgICAgfQpAQCAtMjI3LDIxICszMDksMTYgQEAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKICAgICBjb25zdCB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKICAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOworICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwogICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBtRmFzdFRyYWNrc0dlbikgewotICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwogICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKICAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgewogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOwogICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5kZXN0cm95KGkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fUkVNT1ZFKTsKICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKLSAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CiAgICAgICAgIH0KIAogICAgICAgICAvLyBub3cgcHJvY2VzcyBhZGRlZCB0cmFja3MKQEAgLTI0OSwzNiArMzI2LDcgQEAKICAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CiAgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IGk7IC8vIGZvciBjbGFyaXR5LCBjaG9vc2UgbmFtZSBhcyBmYXN0IHRyYWNrIGluZGV4LgotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fQUREKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKQEAgLTI4Nyw0MCArMzM1LDEwIEBACiAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOwogICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAotICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVNaXhlclRyYWNrKGksIFJFQVNPTl9NT0RJRlkpOwogICAgICAgICB9CiAKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKLQotICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICB9CiB9CiAKQEAgLTMyOCwxMyArMzQ2LDI0IEBACiB7CiAgICAgLy8gVE9ETzogcGFzcyBhbiBJRCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hpY2ggdGltZSBzZXJpZXMgd2Ugd2FudCB0byB3cml0ZSB0byBpbiBOQkxvZy5jcHAKICAgICAvLyBPcjogcGFzcyBib3RoIG9mIHRoZXNlIGludG8gYSBzaW5nbGUgY2FsbCB3aXRoIGEgYm9vbGVhbgotICAgIGlmIChtSXNXYXJtKSB7Ci0gICAgICAgIExPR19ISVNUX1RTKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7Ci0gICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CisKKyAgICBpZiAobUlzV2FybSkgeworICAgICAgICAvLyBMb2dnaW5nIHRpbWVzdGFtcHMgZm9yIEZhc3RNaXhlciBpcyBjdXJyZW50bHkgZGlzYWJsZWQgdG8gbWFrZSBtZW1vcnkgcm9vbSBmb3IgbG9nZ2luZworICAgICAgICAvLyBvdGhlciBzdGF0aXN0aWNzIGluIEZhc3RNaXhlci4KKyAgICAgICAgLy8gVG8gcmUtZW5hYmxlLCBkZWxldGUgdGhlICNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMgbGluZXMgKGFuZCB0aGUgI2VuZGlmIGxpbmVzKS4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0hJU1RfVFMoKTsKKyNlbmRpZgorICAgICAgICAvL0FMT0dEKCJFcmljIEZhc3RNaXhlcjo6b25Xb3JrKCkgbUlzV2FybSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gaWYgYmxvY2suCisjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTCisgICAgICAgIExPR19BVURJT19TVEFURSgpOworI2VuZGlmCisgICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCkBAIC0zNzYsOCArNDA1LDggQEAKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKIAotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCkBAIC00MzksMTcgKzQ2OCwyOSBAQAogICAgICAgICAgICAgbW9ub19ibGVuZChtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwgRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KSwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIGZyYW1lQ291bnQpOworCiAgICAgICAgIC8vIHByZXBhcmUgdGhlIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRvIHNpbmsKICAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOwogICAgICAgICBpZiAobUZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0CiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKLSAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKLSAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLCB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkLgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgc2FtcGxlIGRhdGEgZnVsbHkgaW50ZXJsZWF2ZWQgaGVyZS4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQXVkaW9DaGFubmVsQ291bnQsIGJ1ZmZlciwgbVNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQXVkaW9DaGFubmVsQ291bnQsIG1Gb3JtYXQubUZvcm1hdCkpOwogICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisjZW5kaWYKICAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAogICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCiAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKQEAgLTQ3MCwzNSArNTExLDQ5IEBACiAgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0gICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICBpZiAobUlzV2FybSkgeworICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIHNlcnZlciAtIGtlcm5lbCB0aW1lIGRpZmZlcmVuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGxhdGVuY3kgaWYgd2UgaGF2ZSB2YWxpZCBpbmZvLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogMTAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgIExPR19MQVRFTkNZKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKLSAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCAyMzVkMjNmLi45N2FiNjM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0xOCwxMCArMTgsMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDEyICszNCwxNiBAQAogY2xhc3MgRmFzdE1peGVyIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6Ci0gICAgICAgICAgICBGYXN0TWl4ZXIoKTsKKyAgICAvKiogRmFzdE1peGVyIGNvbnN0cnVjdG9yIHRha2VzIGFzIHBhcmFtIHRoZSBwYXJlbnQgTWl4ZXJUaHJlYWQncyBpbyBoYW5kbGUgKGlkKQorICAgICAgICBmb3IgcHVycG9zZXMgb2YgaWRlbnRpZmljYXRpb24uICovCisgICAgZXhwbGljaXQgRmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHRocmVhZElvSGFuZGxlKTsKICAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKTsKIAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgeyBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsgLyogbWVtb3J5X29yZGVyX3NlcV9jc3QgKi8gfQorICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIHsgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7IH0KKyAgICB2aXJ0dWFsIGZsb2F0IGdldE1hc3RlckJhbGFuY2UoKSBjb25zdCB7IHJldHVybiBtTWFzdGVyQmFsYW5jZS5sb2FkKCk7IH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0Qm9vdHRpbWVPZmZzZXQoaW50NjRfdCBib290dGltZU9mZnNldCkgewogICAgICAgICBtQm9vdHRpbWVPZmZzZXQuc3RvcmUoYm9vdHRpbWVPZmZzZXQpOyAvKiBtZW1vcnlfb3JkZXJfc2VxX2NzdCAqLwogICAgIH0KQEAgLTUzLDYgKzU5LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CiAKKyAgICBlbnVtIFJlYXNvbiB7CisgICAgICAgIFJFQVNPTl9SRU1PVkUsCisgICAgICAgIFJFQVNPTl9BREQsCisgICAgICAgIFJFQVNPTl9NT0RJRlksCisgICAgfTsKKyAgICAvLyBjYWxsZWQgd2hlbiBhIGZhc3QgdHJhY2sgb2YgaW5kZXggaGFzIGJlZW4gcmVtb3ZlZCwgYWRkZWQsIG9yIG1vZGlmaWVkCisgICAgdm9pZCB1cGRhdGVNaXhlclRyYWNrKGludCBpbmRleCwgUmVhc29uIHJlYXNvbik7CisKICAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKICAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CiAKQEAgLTcxLDcgKzg1LDkgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOwogICAgIHZvaWQqICAgICAgICAgICBtTWl4ZXJCdWZmZXI7ICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCiAgICAgc2l6ZV90ICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgIG1NaXhlckJ1ZmZlckZvcm1hdDsgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICB1aW50MzJfdCAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50OyAvLyBhdWRpbyBjaGFubmVsIGNvdW50LCBleGNsdWRlcyBoYXB0aWMgY2hhbm5lbHMuCiAKICAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOwogICAgIE5CQUlPX0Zvcm1hdCAgICBtRm9ybWF0OwpAQCAtODQsOSArMTAwLDE3IEBACiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbVRpbWVzdGFtcDsKICAgICBpbnQ2NF90ICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSBtQmFsYW5jZTsKKwogICAgIC8vIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMuCiAgICAgc3RkOjphdG9taWNfYm9vbCBtTWFzdGVyTW9ubzsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gbU1hc3RlckJhbGFuY2V7fTsKICAgICBzdGQ6OmF0b21pY19pbnRfZmFzdDY0X3QgbUJvb3R0aW1lT2Zmc2V0OworCisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVRocmVhZElvSGFuZGxlOyAvLyBwYXJlbnQgdGhyZWFkIGlkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICBtVGVlOworI2VuZGlmCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCAyZTRmYjhjLi5hNDJlMDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKQEAgLTY4LDIxICs2OCwyMiBAQAogICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtcyBsYXRlbmN5PSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhtQ29tbWFuZCksIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzKTsKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMsIG1MYXRlbmN5TXMpOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAgICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKKyAgICBjb25zdCB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIGNvbnN0IHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CiAgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwogCiAgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG47CiAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKLSAgICBuID0gbiAmIDB4RkZGRjsKKyAgICBuICY9IDB4RkZGRjsKIAogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwpAQCAtOTAsOSArOTEsOSBAQAogICAgIH0KICAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKICAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IHdhbGwsIGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGtIeiwgbG9hZE1IejsKICAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CiAjZW5kaWYKICAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCkBAIC0xMDcsMTggKzEwOCwxOCBAQAogICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOwogICAgICAgICB9Ci0gICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHdhbGwuYWRkKHdhbGxOcyk7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07Ci0gICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyAgICAgICAgbG9hZE5zLmFkZChzYW1wbGVMb2FkTnMpOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwogICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwogICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAga0h6LmFkZChzYW1wbGVDcHVrSHogPj4gNCk7CiAgICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7CiAgICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOworICAgICAgICAgICAgICAgIGxvYWRNSHouYWRkKGFkak1Ieik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CkBAIC0xMjYsNDIgKzEyNyw0MiBAQAogICAgIH0KICAgICBpZiAobikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXROKCkgKiBtaXhQZXJpb2RTZWMpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE1lYW4oKSoxZS02LCB3YWxsLmdldE1pbigpKjFlLTYsIHdhbGwuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0TWVhbigpKjFlLTMsIGxvYWROcy5nZXRNaW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWF4KCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldFN0ZERldigpKjFlLTMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwogICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAga0h6LmdldE1lYW4oKSoxZS0zLCBrSHouZ2V0TWluKCkqMWUtMywga0h6LmdldE1heCgpKjFlLTMsIGtIei5nZXRTdGREZXYoKSoxZS0zKTsKICAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5nZXRNZWFuKCksIGxvYWRNSHouZ2V0TWluKCksIGxvYWRNSHouZ2V0TWF4KCksIGxvYWRNSHouZ2V0U3RkRGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKICAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CiAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbGVmdCwgcmlnaHQ7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgICAgICBsZWZ0LmFkZCh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LmFkZCh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKICAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQuZ2V0TWVhbigpKjFlLTYsIGxlZnQuZ2V0TWluKCkqMWUtNiwgbGVmdC5nZXRNYXgoKSoxZS02LCBsZWZ0LmdldFN0ZERldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldE1lYW4oKSoxZS02LCByaWdodC5nZXRNaW4oKSoxZS02LCByaWdodC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAppbmRleCA4ZWYzMWQxLi45YjkxY2JjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgpAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCiAKKyAgICBkb3VibGUgICBtTGF0ZW5jeU1zID0gMC47ICAgLy8gbWVhc3VyZWQgbGF0ZW5jeSwgZGVmYXVsdCBvZiAwIGlmIG5vIHZhbGlkIHRpbWVzdGFtcCByZWFkLgogICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQogICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKQEAgLTc0LDYgKzc2LDkgQEAKICAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKICAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCiAgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworICAgIC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzNmQ4ZWVmLi5iOTg4NDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIEZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCiAgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQorICAgIG1GcmFtZUNvdW50KDApCiB7CiAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzTWF4RmFzdFRyYWNrc09uY2UsIHNNYXhGYXN0VHJhY2tzSW5pdCk7CiAgICAgaWYgKG9rICE9IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMmJlMWU5MS4uMzk2Yzc5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CkBAIC00Nyw2ICs0OCw5IEBACiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOyAgICAvLyBBVURJT19DSEFOTkVMX09VVF9NT05PIG9yIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGhhcHRpYyBwbGF5YmFjayBpcyBlbmFibGVkIG9yIG5vdAorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7IC8vIGludGVuc2l0eSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHRpYyBkYXRhCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCkBAIC02OSw2ICs3Myw5IEBACiAgICAgTkJBSU9fU2luayogbU91dHB1dFNpbms7ICAgIC8vIEhBTCBvdXRwdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIGludCAgICAgICAgIG1PdXRwdXRTaW5rR2VuOyAvLyBpbmNyZW1lbnQgd2hlbiBtT3V0cHV0U2luayBpcyBhc3NpZ25lZAogICAgIHNpemVfdCAgICAgIG1GcmFtZUNvdW50OyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IG1peCBidWZmZXIKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOyAvLyBJZiBub3QgQVVESU9fQ0hBTk5FTF9OT05FLCBzcGVjaWZpZXMgc2luayBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzayB3aGVuIGl0IGNhbm5vdCBiZSBkaXJlY3RseSBjYWxjdWxhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGNvdW50CiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCkBAIC03Nyw5ICs4NCw2IEBACiAgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAgICAgICAgIE1JWF9XUklURSA9IDB4MTg7ICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAKLSAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKLSAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLQogICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAppbmRleCBkYzE1NDg3Li4wNGIzMmMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtNjUsOCArNjYsNiBAQAogICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCiAgICAgbVdhcm11cEN5Y2xlcygwKSwKICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzKDApLAotICAgIC8vIG1EdW1teU5CTG9nV3JpdGVyCi0gICAgbU5CTG9nV3JpdGVyKCZtRHVtbXlOQkxvZ1dyaXRlciksCiAgICAgbVRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCiAKICAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLApAQCAtOTMsNyArOTIsNyBAQAogewogICAgIC8vIExPR1Qgbm93IHdvcmtzIGV2ZW4gaWYgdGxOQkxvZ1dyaXRlciBpcyBudWxscHRyLCBidXQgd2UncmUgY29uc2lkZXJpbmcgY2hhbmdpbmcgdGhhdCwKICAgICAvLyBzbyB0aGlzIGluaXRpYWxpemF0aW9uIHBlcm1pdHMgYSBmdXR1cmUgY2hhbmdlIHRvIHJlbW92ZSB0aGUgY2hlY2sgZm9yIG51bGxwdHIuCi0gICAgdGxOQkxvZ1dyaXRlciA9ICZtRHVtbXlOQkxvZ1dyaXRlcjsKKyAgICB0bE5CTG9nV3JpdGVyID0gbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKQEAgLTEyMyw5ICsxMjIsOSBAQAogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKICAgICAgICAgICAgIG1EdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogbUR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgbU5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgICAgICAgICBzZXROQkxvZ1dyaXRlcihtTkJMb2dXcml0ZXIpOyAgIC8vIEZhc3RNaXhlciBpbmZvcm1zIGl0cyBBdWRpb01peGVyLCBGYXN0Q2FwdHVyZSBpZ25vcmVzCi0gICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgdGxOQkxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bU5CTG9nV3JpdGVyIDogbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgICAgICBzZXROQkxvZ1dyaXRlcih0bE5CTG9nV3JpdGVyKTsgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKIAogICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KQEAgLTI2MCw2ICsyNTksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2FybSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1NZWFzdXJlZFdhcm11cFRzOwogICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bVdhcm11cEN5Y2xlcyA9IG1XYXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxZTMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKiAxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XQVJNVVBfVElNRShtZWFzdXJlZFdhcm11cE1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IC0xOwpAQCAtMjcwLDYgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfVU5ERVJSVU4oYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbmV3VHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG1PdmVycnVuTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSWdub3JlTmV4dE92ZXJydW4pIHsKQEAgLTI3OSw2ICsyODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvdmVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1ZFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBtaW5pbXVtIGN5Y2xlIHRpbWUuIEl0OgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gY29tcGVuc2F0ZXMgZm9yIGFuIGF1ZGlvIEhBTCB3aXRoIGppdHRlciBkdWUgdG8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgpAQCAtMzM5LDYgKzM0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIExPR19XT1JLX1RJTUUobW9ub3RvbmljTnMpOwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKaW5kZXggMmE3MTQxNC4uM2Y2YjIwNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC03OCwxMiArNzgsMTEgQEAKICAgICB1bnNpZ25lZCAgICAgICAgbUNvbGRHZW47ICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KICAgICBib29sICAgICAgICAgICAgbUlzV2FybTsgICAgICAgIC8vIHRydWUgbWVhbnMgcmVhZHkgdG8gbWl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyBkdXJpbmcgd2FybXVwIHBoYXNlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKLSAgICBOQkxvZzo6V3JpdGVyICAgbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgTkJMb2c6OldyaXRlciogIG1OQkxvZ1dyaXRlcjsgICAvLyBhbHdheXMgbm9uLW51bGxwdHI6IHJlYWwgTkJMb2c6OldyaXRlciogb3IgJm1EdW1teU5CTG9nV3JpdGVyCi0gICAgc3RhdHVzX3QgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CisgICAgc3RydWN0IHRpbWVzcGVjICAgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3QgICAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzOyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgY3ljbGVzIGluIHJhbmdlCisgICAgY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4gbUR1bW15TkJMb2dXcml0ZXJ7bmV3IE5CTG9nOjpXcml0ZXIoKX07CisgICAgc3RhdHVzX3QgICAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKIAogICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsKICAgICBib29sICAgICAgICAgICAgbUF0dGVtcHRlZFdyaXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggNmY1NDZjMy4uOTY4ZDVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC0zOSw4ICs0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICAgc3RhdGljIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA4M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CQUlPX1RlZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmZGVmIFRFRV9TSU5LCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyBUZWUgZmlsZW5hbWVzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgorCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfQ19yZWFzb24ud2F2IiBSZWNvcmRUaHJlYWQKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9NX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChOb3JtYWwpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfRl9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoRmFzdCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1JfcmVhc29uLndhdiIgUmVjb3JkVHJhY2sKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1RyYWNrTmFtZV9UX3JlYXNvbi53YXYiIFBsYXliYWNrVHJhY2sKKworIHdoZXJlIERhdGUgPSBZWVlZbW1kZF9ISE1NU1NfTVNFQworCisgd2hlcmUgUmVhc29uID0gWyBEVE9SIHwgRFVNUCB8IFJFTU9WRSBdCisKKyBFeGFtcGxlczoKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzAzOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMjE4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8zNzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0N182Ml9DX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDhfNjJfNTlfUl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ5XzEzX0ZfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzEyNV82Ml81OV9SX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzE2OF82Ml9DX0RUT1Iud2F2CisqLworCitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9QUkVGSVhbXSA9ICJhZnRlZV8iOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfRElSRUNUT1JZW10gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSA9IDg7CisKKy8qKiBBdWRpb0ZpbGVIYW5kbGVyIG1hbmFnZXMgdGVtcG9yYXJ5IGF1ZGlvIHdhdiBmaWxlcyB3aXRoIGEgbGVhc3QgcmVjZW50bHkgY3JlYXRlZAorICAgIHJldGVudGlvbiBwb2xpY3kuCisKKyAgICBUaGUgdGVtcG9yYXJ5IGZpbGVuYW1lcyBhcmUgc3lzdGVtYXRpY2FsbHkgZ2VuZXJhdGVkLiBBIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsCisgICAgc3RvcmFnZSBkaXJlY3RvcnksIGFuZCBjb25jdXJyZW5jeSBwb29sIGFyZSBwYXNzZWQgaW4gb24gY3JlYXRpbmcgdGhlIG9iamVjdC4KKworICAgIFRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBieSAiY3JlYXRlIiwgd2hpY2ggcmV0dXJucyBhIGZpbGVuYW1lIGdlbmVyYXRlZCBieQorCisgICAgcHJlZml4ICsgMTQgY2hhciBkYXRlICsgc3VmZml4CisKKyAgICBUT0RPIE1vdmUgdG8gYXVkaW9fdXRpbHMuCisgICAgVE9ETyBBdm9pZCBwb2ludGluZyB0d28gQXVkaW9GaWxlSGFuZGxlcnMgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBwcmVmaXgKKyAgICBhcyB3ZSBkb24ndCBoYXZlIGEgcHJlZml4IHNwZWNpZmljIGxvY2sgZmlsZS4gKi8KKworY2xhc3MgQXVkaW9GaWxlSGFuZGxlciB7CitwdWJsaWM6CisKKyAgICBBdWRpb0ZpbGVIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnksIHNpemVfdCBwb29sKQorICAgICAgICA6IG1UaHJlYWRQb29sKHBvb2wpCisgICAgICAgICwgbVByZWZpeChwcmVmaXgpCisgICAgeworICAgICAgICAodm9pZClzZXREaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBmaWxlbmFtZSBvZiBjcmVhdGVkIGF1ZGlvIGZpbGUsIGVsc2UgZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuICovCisgICAgc3RkOjpzdHJpbmcgY3JlYXRlKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpOworCitwcml2YXRlOgorICAgIC8qKiBzZXRzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gdGhpcyBpcyBjdXJyZW50bHkgcHJpdmF0ZSB0byBhdm9pZCBjb25mdXNpb24KKyAgICAgICAgd2hlbiBjaGFuZ2luZyB3aGlsZSBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIG9jY3VycmluZyAoaXQncyBva2F5LCBidXQKKyAgICAgICAgd2Vha2x5IHN5bmNocm9uaXplZCkuICovCisgICAgc3RhdHVzX3Qgc2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpOworCisgICAgLyoqIGNsZWFucyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgZG9uZS4gKi8KKyAgICBzdGF0dXNfdCBjbGVhbihzdGQ6OnN0cmluZyAqZGlyID0gbnVsbHB0cik7CisKKyAgICAvKiogY3JlYXRlcyBhbiBhdWRpbyBmaWxlIGZyb20gYSByZWFkZXIgZnVuY3RvciBwYXNzZWQgaW4uICovCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWwoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0b3J5VmFsaWQoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkgeworICAgICAgICByZXR1cm4gZGlyZWN0b3J5LnNpemUoKSA+IDAgJiYgZGlyZWN0b3J5WzBdID09ICcvJzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICAgICAgY2hhciBmaWxlVGltZVtzaXplb2YoIllZWVltbWRkX0hITU1TU19cMCIpXTsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgICAgICBzdHJ1Y3QgdG0gdG07CisgICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyZnRpbWUoZmlsZVRpbWUsIHNpemVvZihmaWxlVGltZSksICIlWSVtJWRfJUglTSVTXyIsICZ0bSkgPT0gMCwKKyAgICAgICAgICAgICJpbmNvcnJlY3QgZmlsZVRpbWUgYnVmZmVyIik7CisgICAgICAgIGNoYXIgbXNlY1s0XTsKKyAgICAgICAgKHZvaWQpc25wcmludGYobXNlYywgc2l6ZW9mKG1zZWMpLCAiJTAzZCIsIChpbnQpKHR2LnR2X3VzZWMgLyAxMDAwKSk7CisgICAgICAgIHJldHVybiBtUHJlZml4ICsgZmlsZVRpbWUgKyBtc2VjICsgc3VmZml4ICsgIi53YXYiOworICAgIH0KKworICAgIGJvb2wgaXNNYW5hZ2VkRmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICBjb25zdGV4cHIgc2l6ZV90IEZJTEVOQU1FX0xFTl9EQVRFID0gNCArIDIgKyAyIC8vICVZJW0lZCUKKyAgICAgICAgICAgICsgMSArIDIgKyAyICsgMiAvLyBfSCVNJVMKKyAgICAgICAgICAgICsgMSArIDM7IC8vX01TRUMKKyAgICAgICAgY29uc3Qgc2l6ZV90IHByZWZpeExlbiA9IG1QcmVmaXguc2l6ZSgpOworICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihuYW1lKTsKKworICAgICAgICAvLyByZWplY3Qgb24gc2l6ZSwgcHJlZml4LCBhbmQgLndhdgorICAgICAgICBpZiAobmFtZUxlbiA8IHByZWZpeExlbiArIEZJTEVOQU1FX0xFTl9EQVRFICsgNCAvKiAud2F2ICovCisgICAgICAgICAgICAgfHwgc3RybmNtcChuYW1lLCBtUHJlZml4LmNfc3RyKCksIHByZWZpeExlbikgIT0gMAorICAgICAgICAgICAgIHx8IHN0cmNtcChuYW1lICsgbmFtZUxlbiAtIDQsICIud2F2IikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsaWRhdGUgZGF0ZSBwb3J0aW9uCisgICAgICAgIGNvbnN0IGNoYXIgKmRhdGUgPSBuYW1lICsgcHJlZml4TGVuOworICAgICAgICByZXR1cm4gc3RkOjphbGxfb2YoZGF0ZSwgZGF0ZSArIDgsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzhdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDksIGRhdGUgKyAxNSwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbMTVdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDE2LCBkYXRlICsgMTksIGlzZGlnaXQpOworICAgIH0KKworICAgIC8vIHlldCBhbm90aGVyIFRocmVhZFBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgY2xhc3MgVGhyZWFkUG9vbCB7CisgICAgcHVibGljOgorICAgICAgICBUaHJlYWRQb29sKHNpemVfdCBzaXplKQorICAgICAgICAgICAgOiBtVGhyZWFkUG9vbFNpemUoc2l6ZSkKKyAgICAgICAgeyB9CisKKyAgICAgICAgLyoqIGxhdW5jaGVzIHRhc2sgIm5hbWUiIHdpdGggYXNzb2NpYXRlZCBmdW5jdGlvbiAiZnVuYyIuCisgICAgICAgICAgICBpZiB0aGUgdGhyZWFkcG9vbCBpcyBleGhhdXN0ZWQsIGl0IHdpbGwgbGF1bmNoIG9uIGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgc3RhdHVzX3QgbGF1bmNoKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+Pj4gbUZ1dHVyZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1UaHJlYWRQb29sU2l6ZTsKKyAgICB9IG1UaHJlYWRQb29sOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByZWZpeDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6c3RyaW5nIG1EaXJlY3Rvcnk7ICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBtRmlsZXM7IC8vIEdVQVJERURfQlkobUxvY2spICBzb3J0ZWQgbGlzdCBvZiBmaWxlcyBieSBjcmVhdGlvbiB0aW1lCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBGUkFNRVNfUEVSX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfS0VFUCA9IDMyOworfTsKKworLyogc3RhdGljICovCit2b2lkIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6ZHVtcFRlZSgKKyAgICAgICAgaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlICZzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIC8vIFNpbmdsZXRvbi4gQ29uc3RydWN0ZWQgdGhyZWFkLXNhZmUgb24gZmlyc3QgY2FsbCwgbmV2ZXIgZGVzdHJveWVkLgorICAgIHN0YXRpYyBBdWRpb0ZpbGVIYW5kbGVyIGF1ZGlvRmlsZUhhbmRsZXIoCisgICAgICAgICAgICBERUZBVUxUX1BSRUZJWCwgREVGQVVMVF9ESVJFQ1RPUlksIERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFKTsKKworICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHNvdXJjZS0+Zm9ybWF0KCk7CisgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gYXVkaW9GaWxlSGFuZGxlci5jcmVhdGUoCisgICAgICAgICAgICAvLyB0aGlzIGZ1bmN0b3IgbXVzdCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIHN0YWNrCisgICAgICAgICAgICBbZmlyc3RSZWFkLCBzaW5rU291cmNlXSAodm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVzKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxSZWFkID09IChzc2l6ZV90KU9WRVJSVU4gJiYgZmlyc3RSZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNoZWNrIG9uY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsUmVhZDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KSwKKyAgICAgICAgICAgIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KSwKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0LAorICAgICAgICAgICAgc3VmZml4KTsKKworICAgIGlmIChmZCA+PSAwICYmIGZpbGVuYW1lLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgInRlZSB3cm90ZSB0byAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK05CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6TkJBSU9fU2lua1NvdXJjZSBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Om1ha2VTaW5rU291cmNlKAorICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCkKK3sKKyAgICBpZiAoRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdC5tRm9ybWF0KSkgeworICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUoZnJhbWVzLCBmb3JtYXQpOworICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGUgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOworICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlUmVhZGVyIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSB0cnVlOworICAgICAgICByZXR1cm4ge3BpcGUsIHBpcGVSZWFkZXJ9OworICAgIH0KK2V4aXQ6CisgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSBmYWxzZTsKKyAgICByZXR1cm4ge251bGxwdHIsIG51bGxwdHJ9OworfQorCitzdGQ6OnN0cmluZyBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGUoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGdlbmVyYXRlRmlsZW5hbWUoc3VmZml4KTsKKworICAgIGlmIChtVGhyZWFkUG9vbC5sYXVuY2goc3RkOjpzdHJpbmcoImNyZWF0ZSAiKSArIGZpbGVuYW1lLAorICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gY3JlYXRlSW50ZXJuYWwocmVhZGVyLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgZmlsZW5hbWUpOyB9KQorICAgICAgICAgICAgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OnNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KQoreworICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChkaXJlY3RvcnkpKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgc3RkOjpmaWxlc3lzdGVtIGluIEMrKzE3CisgICAgRElSICpkaXIgPSBvcGVuZGlyKGRpcmVjdG9yeS5jX3N0cigpKTsKKworICAgIGlmIChkaXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBvcGVuIGRpcmVjdG9yeSAlcyIsIF9fZnVuY19fLCBkaXJlY3RvcnkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHRvUmVtb3ZlID0gMDsKKyAgICBkZWNsdHlwZShtRmlsZXMpIGZpbGVzOworCisgICAgd2hpbGUgKGZpbGVzLnNpemUoKSA8IE1BWF9GSUxFU19SRUFEKSB7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICIlczogcmVhZGRpciBmYWlsdXJlICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBpcyBpdCBhIG1hbmFnZWQgZmlsZW5hbWU/CisgICAgICAgIGlmICghaXNNYW5hZ2VkRmlsZW5hbWUocmVzdWx0LT5kX25hbWUpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmaWxlcy5lbXBsYWNlX2JhY2socmVzdWx0LT5kX25hbWUpOworICAgIH0KKyAgICAodm9pZCljbG9zZWRpcihkaXIpOworCisgICAgLy8gT1BUSU1JWkFUSU9OOiB3ZSBkb24ndCBuZWVkIHRvIHN0YXQgZWFjaCBmaWxlLCB0aGUgZmlsZW5hbWVzIG5hbWVzIGFyZQorICAgIC8vIGFscmVhZHkgKHJvdWdobHkpIG9yZGVyZWQgYnkgY3JlYXRpb24gZGF0ZS4gIHdlIHVzZSBzdGQ6OmRlcXVlIGluc3RlYWQKKyAgICAvLyBvZiBzdGQ6OnNldCBmb3IgZmFzdGVyIGluc2VydGlvbiBhbmQgc29ydGluZyB0aW1lcy4KKworICAgIGlmIChmaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAvLyByZW1vdmVkIGZpbGVzIGNhbiB1c2UgYSBwYXJ0aXRpb24gKG5vIG5lZWQgdG8gZG8gYSBmdWxsIHNvcnQpLgorICAgICAgICB0b1JlbW92ZSA9IGZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworICAgICAgICBzdGQ6Om50aF9lbGVtZW50KGZpbGVzLmJlZ2luKCksIGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSAtIDEsIGZpbGVzLmVuZCgpKTsKKyAgICB9CisKKyAgICAvLyBrZXB0IGZpbGVzIG11c3QgYmUgc29ydGVkLgorICAgIHN0ZDo6c29ydChmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsIGZpbGVzLmVuZCgpKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBtRGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgICAgICBtRmlsZXMgPSBzdGQ6Om1vdmUoZmlsZXMpOworICAgIH0KKworICAgIGlmICh0b1JlbW92ZSA+IDApIHsgLy8gbGF1bmNoIGEgY2xlYW4gaW4gYmFja2dyb3VuZC4KKyAgICAgICAgKHZvaWQpbVRocmVhZFBvb2wubGF1bmNoKAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJjbGVhbmluZyAiKSArIGRpcmVjdG9yeSwgW3RoaXNdKCkgeyByZXR1cm4gY2xlYW4oKTsgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y2xlYW4oc3RkOjpzdHJpbmcgKmRpcmVjdG9yeSkKK3sKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmlsZXNUb1JlbW92ZTsKKyAgICBzdGQ6OnN0cmluZyBkaXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChtRGlyZWN0b3J5KSkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAgICAgZGlyID0gbURpcmVjdG9yeTsKKyAgICAgICAgaWYgKG1GaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAgICAgc2l6ZV90IHRvUmVtb3ZlID0gbUZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworCisgICAgICAgICAgICAvLyB1c2UgbW92ZSBhbmQgZXJhc2UgdG8gZWZmaWNpZW50bHkgdHJhbnNmZXIgc3RkOjpzdHJpbmcKKyAgICAgICAgICAgIHN0ZDo6bW92ZShtRmlsZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGZpbGVzVG9SZW1vdmUpKTsKKyAgICAgICAgICAgIG1GaWxlcy5lcmFzZShtRmlsZXMuYmVnaW4oKSwgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJwID0gZGlyICsgIi8iOworICAgIC8vIHJlbW92ZSBmaWxlcyBvdXRzaWRlIG9mIGxvY2sgZm9yIGJldHRlciBjb25jdXJyZW5jeS4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJmZpbGUgOiBmaWxlc1RvUmVtb3ZlKSB7CisgICAgICAgICh2b2lkKXVubGluaygoZGlycCArIGZpbGUpLmNfc3RyKCkpOworICAgIH0KKworICAgIC8vIHJldHVybiB0aGUgZGlyZWN0b3J5IGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoZGlyZWN0b3J5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmRpcmVjdG9yeSA9IGRpcjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpUaHJlYWRQb29sOjpsYXVuY2goCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpCit7CisgICAgaWYgKG1UaHJlYWRQb29sU2l6ZSA+IDEpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA+PSBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IG1GdXR1cmVzLmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVzLmVuZCgpOykgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4gJmZ1dHVyZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKCFmdXR1cmUudmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDApKSA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1GdXR1cmVzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyBub3QgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPCBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGVmZXJyZWQgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUZ1dHVyZXMuZW1wbGFjZV9iYWNrKG5hbWUsIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBmdW5jKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBpbW1lZGlhdGUgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmdW5jKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZUludGVybmFsKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSkKK3sKKyAgICAvLyBBdHRlbXB0IHRvIGNob29zZSB0aGUgYmVzdCBtYXRjaGluZyBmaWxlIGZvcm1hdC4KKyAgICAvLyBXZSBjYW4gY2hvb3NlIGFueSBzZl9mb3JtYXQKKyAgICAvLyBidXQgd3JpdGVGb3JtYXQgbXVzdCBiZSBvbmUgb2YgMTYsIDMyLCBmbG9hdAorICAgIC8vIGR1ZSB0byBzZl93cml0ZWYgY29tcGF0aWJpbGl0eS4KKyAgICBpbnQgc2ZfZm9ybWF0OworICAgIGF1ZGlvX2Zvcm1hdF90IHdyaXRlRm9ybWF0OworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzE2IGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzMyOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8zMiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9GTE9BVDsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV9GTE9BVCBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyBoYW5kbGUgYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoKSBmb3JtYXRzLgorICAgICAgICAvLyBoYW5kbGUgY29tcHJlc3NlZCBmb3JtYXRzIGFzIHNpbmdsZSBieXRlIGZpbGVzLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGVhbigmZGlyZWN0b3J5KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIHN0ZDo6c3RyaW5nIGRpclByZWZpeCA9IGRpcmVjdG9yeSArICIvIjsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSBkaXJQcmVmaXggKyBmaWxlbmFtZTsKKworICAgIC8qIGNvbnN0ICovIFNGX0lORk8gaW5mbyA9IHsKKyAgICAgICAgLmZyYW1lcyA9IDAsCisgICAgICAgIC5zYW1wbGVyYXRlID0gKGludClzYW1wbGVSYXRlLAorICAgICAgICAuY2hhbm5lbHMgPSAoaW50KWNoYW5uZWxDb3VudCwKKyAgICAgICAgLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBzZl9mb3JtYXQsCisgICAgfTsKKyAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4ocGF0aC5jX3N0cigpLCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoRlJBTUVTX1BFUl9SRUFEICogc3RkOjptYXgoCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHdyaXRlRm9ybWF0KSwgLy9vdXRwdXQgZnJhbWVzaXplCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKTsgLy8gaW5wdXQgZnJhbWVzaXplCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsUmVhZCA9IHJlYWRlcihidWZmZXIsIEZSQU1FU19QRVJfUkVBRCk7CisgICAgICAgIGlmIChhY3R1YWxSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBpbnB1dCBmb3JtYXQgdG8gd3JpdGVGb3JtYXQgYXMgbmVlZGVkLgorICAgICAgICBpZiAoZm9ybWF0ICE9IHdyaXRlRm9ybWF0KSB7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHdyaXRlRm9ybWF0LCBidWZmZXIsIGZvcm1hdCwgYWN0dWFsUmVhZCAqIGluZm8uY2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCByZWFsbHlXcml0dGVuOworICAgICAgICBzd2l0Y2ggKHdyaXRlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX3Nob3J0KHNmLCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfaW50KHNmLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9mbG9hdChzZiwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6ICVzIHdyaXRlRm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgd3JpdGVGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgZXJyb3I6ICV6ZCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRvdGFsICs9IHJlYWxseVdyaXR0ZW47CisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgYWN0dWFsUmVhZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBzaG9ydCBjb3VudDogJXpkIDwgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNmX2Nsb3NlKHNmKTsKKyAgICBmcmVlKGJ1ZmZlcik7CisgICAgaWYgKHRvdGFsID09IDApIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgLy8gU3VjY2VzczogYWRkIG91ciBuYW1lIHRvIG1hbmFnZWQgZmlsZXMuCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAvLyB3ZWFrIHN5bmNocm9uaXphdGlvbiAtIG9ubHkgdXBkYXRlIG1GaWxlcyBpZiB0aGUgZGlyZWN0b3J5IGhhc24ndCBjaGFuZ2VkLgorICAgICAgICBpZiAobURpcmVjdG9yeSA9PSBkaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIG1GaWxlcy5lbXBsYWNlX2JhY2soZmlsZW5hbWUpOyAgLy8gYWRkIHRvIHRoZSBlbmQgdG8gcHJlc2VydmUgc29ydC4KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7IC8vIHJldHVybiBmdWxsIHBhdGgKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ4Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmbmRlZiBBTkRST0lEX05CQUlPX1RFRV9ICisjZGVmaW5lIEFORFJPSURfTkJBSU9fVEVFX0gKKworI2lmZGVmIFRFRV9TSU5LCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhlIE5CQUlPX1RlZSB1c2VzIHRoZSBOQkFJTyBQaXBlIGFuZCBQaXBlUmVhZGVyIGZvciBub25ibG9ja2luZworICogZGF0YSBjb2xsZWN0aW9uLCBmb3IgZXZlbnR1YWwgZHVtcCB0byBsb2cgZmlsZXMuCisgKiBTZWUgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcgZm9yIGhvdyB0bworICogZW5hYmxlIGJ5IHJvLmRlYnVnZ2FibGUgYW5kIGFmLnRlZSBwcm9wZXJ0aWVzLgorICoKKyAqIFRoZSB3cml0ZSgpIGludG8gdGhlIE5CQUlPX1RlZSBpcyB0aGVyZWZvcmUgbm9uYmxvY2tpbmcsCisgKiBidXQgY2hhbmdpbmcgTkJBSU9fVGVlIGZvcm1hdHMgd2l0aCBzZXQoKSBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgYSB3cml0ZSgpOworICogdXN1YWxseSB0aGUgY2FsbGVyIGFscmVhZHkgaW1wbGVtZW50cyB0aGlzIG11dHVhbCBleGNsdXNpb24uCisgKgorICogQWxsIG90aGVyIGNhbGxzIGV4Y2VwdCBzZXQoKSB2cyB3cml0ZSgpIG1heSBvY2N1ciBhdCBhbnkgdGltZS4KKyAqCisgKiBkdW1wKCkgZGlzcnVwdGlvbiBpcyBtaW5pbWl6ZWQgdG8gdGhlIGNhbGxlciBzaW5jZSBzeXN0ZW0gY2FsbHMgYXJlIGV4ZWN1dGVkCisgKiBpbiBhbiBhc3luY2hyb25vdXMgdGhyZWFkICh3aGVuIHBvc3NpYmxlKS4KKyAqCisgKiBDdXJyZW50bHkgdGhlIE5CQUlPX1RlZSBpcyAiaGFyZHdpcmVkIiBmb3IgQXVkaW9GbGluZ2VyIHN1cHBvcnQuCisgKgorICogU29tZSBBdWRpb0ZsaW5nZXIgc3BlY2lmaWMgbm90ZXM6CisgKgorICogMSkgVGVlcyBjYXB0dXJlIG9ubHkgbGluZWFyIFBDTSBkYXRhLgorICogMikgVGVlcyB3aXRob3V0IGFueSBkYXRhIHdyaXR0ZW4gYXJlIGNvbnNpZGVyZWQgZW1wdHkgYW5kIGRvIG5vdCBnZW5lcmF0ZQorICogICAgYW55IG91dHB1dCBmaWxlcy4KKyAqIDIpIE9uY2UgYSBUZWUgZHVtcHMgZGF0YSwgaXQgaXMgY29uc2lkZXJlZCAiZW1wdGllZCIgYW5kIG5ldyBkYXRhCisgKiAgICBuZWVkcyB0byBiZSB3cml0dGVuIGJlZm9yZSBhbm90aGVyIFRlZSBmaWxlIGlzIGdlbmVyYXRlZC4KKyAqIDMpIFRlZSBmaWxlIGZvcm1hdCBpcworICogICAgV0FWIGludGVnZXIgUENNIDE2IGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULCBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULgorICogICAgV0FWIGZsb2F0IFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCisgKgorICogSW5wdXRfVGhyZWFkOgorICogMSkgQ2FwdHVyZSBidWZmZXIgaXMgdGVlZCB3aGVuIHJlYWQgZnJvbSB0aGUgSEFMLCBiZWZvcmUgcmVzYW1wbGluZyBmb3IgdGhlIEF1ZGlvUmVjb3JkCisgKiAgICBjbGllbnQuCisgKgorICogT3V0cHV0X1RocmVhZDoKKyAqIDEpIE1peGVyVGhyZWFkcyB3aWxsIHRlZSBhdCB0aGUgRmFzdE1peGVyIG91dHB1dCAoaWYgaXQgaGFzIG9uZSkgb3IgYXQgdGhlCisgKiAgICBOb3JtYWxNaXhlciBvdXRwdXQgKGlmIG5vIEZhc3RNaXhlcikuCisgKiAyKSBEdXBsaWNhdGluZ1RocmVhZHMgZG8gbm90IHRlZSBhbnkgbWl4ZWQgZGF0YS4gQXBwbHkgYSB0ZWUgb24gdGhlIGRvd25zdHJlYW0gT3V0cHV0VHJhY2sKKyAqICAgIG9yIG9uIHRoZSB1cHN0cmVhbSBwbGF5YmFjayBUcmFja3MuCisgKiAzKSBEaXJlY3RUaHJlYWRzIGFuZCBPZmZsb2FkVGhyZWFkcyBkbyBub3QgdGVlIGFueSBkYXRhLiBUaGUgdXBzdHJlYW0gdHJhY2sKKyAqICAgIChpZiBsaW5lYXIgUENNIGZvcm1hdCkgbWF5IGJlIHRlZWQgdG8gZGlzY292ZXIgZGF0YS4KKyAqIDQpIE1tYXBUaHJlYWRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIFRyYWNrczoKKyAqIDEpIFJlY29yZFRyYWNrcyBhbmQgcGxheWJhY2sgVHJhY2tzIHRlZSBhcyBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gb3IKKyAqICAgIHJlYWQgZnJvbSB0aGUgc2hhcmVkIGNsaWVudC1zZXJ2ZXIgdHJhY2sgYnVmZmVyIGJ5IHRoZSBhc3NvY2lhdGVkIFRocmVhZHMuCisgKiAyKSBUaGUgbWVjaGFuaXNtIGlzIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyIHJlbGVhc2UoKSBzbyBsYXJnZSBzdGF0aWMgVHJhY2sKKyAqICAgIHBsYXliYWNrIG1heSBub3Qgc2hvdyBhbnkgVGVlIGRhdGEgZGVwZW5kaW5nIG9uIHdoZW4gaXQgaXMgcmVsZWFzZWQuCisgKiAzKSBXaGVuIGEgdHJhY2sgYmVjb21lcyBpbmFjdGl2ZSwgdGhlIFRocmVhZCB3aWxsIHRyaWdnZXIgYSBkdW1wLgorICovCisKK2NsYXNzIE5CQUlPX1RlZSB7CitwdWJsaWM6CisgICAgLyogVEVFX0ZMQUcgaXMgdXNlZCBpbiBzZXQoKSBhbmQgbXVzdCBtYXRjaCB0aGUgZmxhZ3MgZm9yIHRoZSBhZi50ZWUgcHJvcGVydHkKKyAgICAgICBnaXZlbiBpbiBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZworICAgICovCisgICAgZW51bSBURUVfRkxBRyB7CisgICAgICAgIFRFRV9GTEFHX05PTkUgPSAwLAorICAgICAgICBURUVfRkxBR19JTlBVVF9USFJFQUQgPSAoMSA8PCAwKSwgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBpbnB1dCAoQ2FwdHVyZSkgVGhyZWFkcworICAgICAgICBURUVfRkxBR19PVVRQVVRfVEhSRUFEID0gKDEgPDwgMSksIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBvdXRwdXQgKFBsYXliYWNrKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX1RSQUNLID0gKDEgPDwgMiksICAgICAgICAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIHRyYWNrcyAoUmVjb3JkIGFuZCBQbGF5YmFjaykKKyAgICB9OworCisgICAgTkJBSU9fVGVlKCkKKyAgICAgICAgOiBtVGVlKHN0ZDo6bWFrZV9zaGFyZWQ8TkJBSU9fVGVlSW1wbD4oKSkKKyAgICB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuYWRkKG1UZWUpOworICAgIH0KKworICAgIH5OQkFJT19UZWUoKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkucmVtb3ZlKG1UZWUpOworICAgICAgICBkdW1wKC0xLCAiX0RUT1IiKTsgLy8gbG9nIGFueSBkYXRhIHJlbWFpbmluZyBpbiBUZWUuCisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHNldCBpcyB1c2VkIGZvciBkZWZlcnJlZCBjb25maWd1cmF0aW9uIG9mIFRlZS4KKyAgICAgKgorICAgICAqICBNYXkgYmUgY2FsbGVkIGFueXRpbWUgZXhjZXB0IGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gZm9ybWF0IE5CQUlPX0Zvcm1hdCB1c2VkIHRvIG9wZW4gTkJBSU8gcGlwZXMKKyAgICAgKiBccGFyYW0gZmxhZ3MgKGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nKQorICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX05PTkUgdG8gYnlwYXNzIGFmLnRlZSBwcm9wZXJ0eSBjaGVja3MgKGRlZmF1bHQpOworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgaW5wdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIG91dHB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfVFJBQ0sgdG8gY2hlY2sgYWYudGVlIGlmIHRyYWNrIGxvZ2dpbmcgc2V0LgorICAgICAqIFxwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyB0byBvcGVuIHRoZSBOQkFJTyBwaXBlIChzZXQgdG8gMCB0byB1c2UgZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiBccmV0dXJuCisgICAgICogICAgICAgICAtIE5PX0VSUk9SIG9uIHN1Y2Nlc3MgKG9yIGZvcm1hdCB1bmNoYW5nZWQpCisgICAgICogICAgICAgICAtIEJBRF9WQUxVRSBpZiBmb3JtYXQgb3IgZmxhZ3MgaW52YWxpZC4KKyAgICAgKiAgICAgICAgIC0gUEVSTUlTU0lPTl9ERU5JRUQgaWYgZmxhZ3Mgbm90IGFsbG93ZWQgYnkgYWYudGVlCisgICAgICovCisKKyAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoZm9ybWF0LCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCksIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiB3cml0ZSBkYXRhIHRvIHRoZSB0ZWUuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGwgaXMgbG9jayBmcmVlIChhcyBzaGFyZWQgcG9pbnRlciBhbmQgTkJBSU8gaXMgbG9jayBmcmVlKTsKKyAgICAgKiBtYXkgYmUgY2FsbGVkIHNpbXVsdGFuZW91cyB0byBhbGwgbWV0aG9kcyBleGNlcHQgc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYnVmZmVyIHRvIHdyaXRlIHRvIHBpcGUuCisgICAgICogXHBhcmFtIGZyYW1lQ291bnQgaW4gZnJhbWVzIGFzIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHBhc3NlZCB0byBzZXQoKQorICAgICAqLworCisgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSBjb25zdCB7CisgICAgICAgIG1UZWUtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgfQorCisgICAgLyoqIHNldHMgVGVlIGlkIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSBnZW5lcmF0ZWQgZmlsZSAoc2hvdWxkIGJlIHVuaXF1ZSkuICovCisgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+c2V0SWQoaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIHRoZSBhdWRpbyBjb250ZW50IHdyaXR0ZW4gdG8gdGhlIFRlZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgY29uc3QgeworICAgICAgICBtVGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIGFsbCBUZWVzIGN1cnJlbnRseSBhbGl2ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8qKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVlIC0gdGhlIGxpZmV0aW1lIGlzIHRocm91Z2gKKyAgICAgICAgYSBzaGFyZWQgcG9pbnRlciBzbyBkZXN0cnVjdGlvbiBvZiB0aGUgTkJBSU9fVGVlIGNvbnRhaW5lciBtYXkgcHJvY2VlZAorICAgICAgICBldmVuIHRob3VnaCBkdW1waW5nIGlzIG9jY3VycmluZy4gKi8KKyAgICBjbGFzcyBOQkFJT19UZWVJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgVEVFX0ZMQUcgZmxhZ3MsIHNpemVfdCBmcmFtZXMpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgdGVlQ29uZmlnID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLmRlYnVnZ2FibGUiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICA/IHByb3BlcnR5X2dldF9pbnQzMigiYWYudGVlIiwgMCkgOiAwOworCisgICAgICAgICAgICAvLyBjaGVjayB0aGUgdHlwZSBvZiBUZWUKKyAgICAgICAgICAgIGNvbnN0IFRFRV9GTEFHIHR5cGUgPSBURUVfRkxBRygKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiAoVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHwgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB8IFRFRV9GTEFHX1RSQUNLKSk7CisKKyAgICAgICAgICAgIC8vIHBhcmFtZXRlciBmbGFncyBjYW4ndCBzZWxlY3QgbXVsdGlwbGUgdHlwZXMuCisgICAgICAgICAgICBpZiAoX19idWlsdGluX3BvcGNvdW50KHR5cGUpID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHR5cGUgaXMgc2V0LCB3ZSBjaGVjayB0byBzZWUgaWYgaXQgaXMgcGVybWl0dGVkIGJ5IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBpZiAodHlwZSAhPSAwICYmICh0eXBlICYgdGVlQ29uZmlnKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgbnVtYmVyIG9mIGZyYW1lcyBmb3IgVGVlCisgICAgICAgICAgICBpZiAoZnJhbWVzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25zaWRlciB2YXJ5aW5nIGZyYW1lIGNvdW50IGJhc2VkIG9uIHR5cGUuCisgICAgICAgICAgICAgICAgZnJhbWVzID0gREVGQVVMVF9URUVfRlJBTUVTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgbWluaW11bSBudW1iZXIgb2YgZnJhbWVzPworCisgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiBmb3JtYXQgYW5kIGZyYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICAgICBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtRm9ybWF0KSAmJiBmcmFtZXMgPT0gbUZyYW1lcykgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBhdXRvIHNpbmtzb3VyY2UgPSBtYWtlU2lua1NvdXJjZShmb3JtYXQsIGZyYW1lcywgJmVuYWJsZWQpOworCisgICAgICAgICAgICAvLyBlbmFibGVkIGlzIHNldCBpZiBtYWtlU2lua1NvdXJjZSBpcyBzdWNjZXNzZnVsLgorICAgICAgICAgICAgLy8gTm90ZTogYXMgbWVudGlvbmVkIGluIE5CQUlPX1RlZTo6c2V0KCksIGRvbid0IGNhbGwgc2V0KCkgd2hpbGUgd3JpdGUoKSBpcworICAgICAgICAgICAgLy8gb25nb2luZy4KKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OyAvLyBjb3VsZCBnZXQgdGhpcyBmcm9tIHRoZSBTaW5rLgorICAgICAgICAgICAgICAgIG1GcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICAgICAgICAgbVNpbmtTb3VyY2UgPSBzdGQ6Om1vdmUoc2lua3NvdXJjZSk7CisgICAgICAgICAgICAgICAgbUVuYWJsZWQuc3RvcmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhUmVhZHkuZXhjaGFuZ2UoZmFsc2UpKSByZXR1cm47CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBOQkFJT19TaW5rU291cmNlIHNpbmtTb3VyY2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBtSWQgKyByZWFzb247CisgICAgICAgICAgICAgICAgc2lua1NvdXJjZSA9IG1TaW5rU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRlZShmZCwgc2lua1NvdXJjZSwgc3VmZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaWYgKCFtRW5hYmxlZC5sb2FkKCkgfHwgZnJhbWVDb3VudCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAodm9pZCltU2lua1NvdXJjZS5maXJzdC0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1EYXRhUmVhZHkuc3RvcmUodHJ1ZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRSSUNLWTogV2UgbmVlZCB0byBrZWVwIHRoZSBOQkFJT19TaW5rIGFuZCBOQkFJT19Tb3VyY2UgYm90aCBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIC8vIGJlY2F1c2UgUGlwZVJlYWRlciBob2xkcyBhIG5ha2VkIHJlZmVyZW5jZSAobm90IGEgc3Ryb25nIG9yIHdlYWsgcG9pbnRlcikgdG8gUGlwZS4KKyAgICAgICAgdXNpbmcgTkJBSU9fU2lua1NvdXJjZSA9IHN0ZDo6cGFpcjxzcDxOQkFJT19TaW5rPiwgc3A8TkJBSU9fU291cmNlPj47CisKKyAgICAgICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UmIHNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOworCisgICAgICAgIHN0YXRpYyBOQkFJT19TaW5rU291cmNlIG1ha2VTaW5rU291cmNlKAorICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKTsKKworICAgICAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEVFX0ZSQU1FUyA9IDB4MjAwMDAwOworCisgICAgICAgIC8vIGF0b21pYyBzdGF0dXMgY2hlY2tpbmcKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbUVuYWJsZWR7ZmFsc2V9OworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRGF0YVJlYWR5e2ZhbHNlfTsKKworICAgICAgICAvLyBsb2NrZWQgZHVtcCBpbmZvcm1hdGlvbgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1JZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIFRFRV9GTEFHIG1GbGFncyA9IFRFRV9GTEFHX05PTkU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX0Zvcm1hdCBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7ICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIHNpemVfdCBtRnJhbWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX1NpbmtTb3VyY2UgbVNpbmtTb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8qKiBSdW5uaW5nVGVlcyB0cmFja3MgY3VycmVudCBydW5uaW5nIHRlZXMgZm9yIGR1bXAgcHVycG9zZXMuCisgICAgICAgIEl0IGlzIGltcGxlbWVudGVkIHRvIGhhdmUgbWluaW1hbCBsb2NrZWQgcmVnaW9ucywgdG8gYmUgdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlci4gKi8KKyAgICBjbGFzcyBSdW5uaW5nVGVlcyB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIGFkZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKCFtVGVlcy5lbXBsYWNlKHRlZSkuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGFscmVhZHkgZXhpc3RzIGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbW92ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKG1UZWVzLmVyYXNlKHRlZSkgIT0gMSwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBkb2Vzbid0IGV4aXN0IGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IHRlZXM7IC8vIHNhZmUgc25hcHNob3Qgb2YgdGVlcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgdGVlcy5pbnNlcnQodGVlcy5lbmQoKSwgbVRlZXMuYmVnaW4oKSwgbVRlZXMuZW5kKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0ZWUgOiB0ZWVzKSB7CisgICAgICAgICAgICAgICAgdGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IG1UZWVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvLyBzaW5nbGV0b24KKyAgICBzdGF0aWMgUnVubmluZ1RlZXMgJmdldFJ1bm5pbmdUZWVzKCkgeworICAgICAgICBzdGF0aWMgUnVubmluZ1RlZXMgcnVubmluZ1RlZXM7CisgICAgICAgIHJldHVybiBydW5uaW5nVGVlczsKKyAgICB9CisKKyAgICAvLyBUaGUgTkJBSU8gVGVlSW1wbCBtYXkgaGF2ZSBsaWZldGltZSBsb25nZXIgdGhhbiBOQkFJT19UZWUgaWYKKyAgICAvLyBSdW5uaW5nVGVlczo6ZHVtcCgpIGlzIGJlaW5nIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gfk5CQUlPX1RlZSgpLgorICAgIC8vIFRoaXMgaXMgYWxsb3dlZCBmb3IgbWF4aW11bSBjb25jdXJyZW5jeS4KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gbVRlZTsKK307IC8vIE5CQUlPX1RlZQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSworI2VuZGlmIC8vICFBTkRST0lEX05CQUlPX1RFRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggZTVjYjhhMi4uNjc2YTU3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjQsOCArMjQsOSBAQAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ5LDExMSArNTAsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmdldEF1ZGlvUG9ydChwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwucmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKIH0KIAotCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoOjpnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvJiBpdGVyID0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZmluZChtUGF0Y2hIYW5kbGUpOworICAgIGlmIChpdGVyICE9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQuZ2V0TGF0ZW5jeU1zKGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlcikKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjp+UGF0Y2hQYW5lbCgpCi17CiB9CiAKIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQogewotICAgIEFMT0dWKCJnZXRBdWRpb1BvcnQiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSB8fAotICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpIHx8IChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIGxpbWl0IG51bWJlciBvZiBzb3VyY2VzIHRvIDEgZm9yIG5vdyBvciAyIHNvdXJjZXMgZm9yIHNwZWNpYWwgY3Jvc3MgaHcgbW9kdWxlIGNhc2UuCkBAIC0xNjMsODEgKzEzMCw3MyBAQAogICAgIH0KIAogICAgIGlmICgqaGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgKmhhbmRsZSAhPSAwICYmIGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAoKmhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsICpoYW5kbGUpOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IG1QYXRjaGVzW2luZGV4XS0+bUhhbEhhbmRsZTsKLSAgICAgICAgICAgICAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKLSAgICAgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCi0gICAgICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKLSAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSkgewotICAgICAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQotICAgICAgICAgICAgICAgIGlmIChoYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhdGNoLT5udW1fc2lua3MgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGh3TW9kdWxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKCpoYW5kbGUpOworICAgICAgICBpZiAoaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUpOworICAgICAgICAgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKKyAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKKyAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50CisgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAorICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJm9sZFBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOworICAgICAgICAgICAgICAgIGlmIChvbGRQYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkgeworICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvbGRQYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIGlmIChod0RldmljZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygqaGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIFBhdGNoICpuZXdQYXRjaCA9IG5ldyBQYXRjaChwYXRjaCk7CisgICAgUGF0Y2ggbmV3UGF0Y2h7KnBhdGNofTsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaW5zZXJ0ZWRNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiAKICAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmICghYXVkaW9Id0RldmljZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBpZiBjb25uZWN0aW9uIHRvIGEgbWl4IG9yIGFjcm9zcyBIVyBtb2R1bGVzCiAgICAgICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgbXVsdGlwbGUgc2lua3MgZm9yIG1peCBvciBhY3Jvc3MgbW9kdWxlcyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyByZWplY3QgY29ubmVjdGlvbiB0byBkaWZmZXJlbnQgc2luayB0eXBlcwogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBwYXRjaC0+c2lua3NbMF0udHlwZSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTI1Miw0MiArMjExLDU2IEBACiAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgogICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHx8CiAgICAgICAgICAgICAgICAgICAhYXVkaW9Id0RldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSkpKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBvdXRwdXREZXZpY2VBZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzICE9IDAgJiYgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4Lmh3X21vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgaXMgcmV1c2VkLCBzbyBpdCBpcyBub3QgY2xvc2VkIHdoZW4gcGF0Y2ggaXMgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpLCBmYWxzZSAvKmNsb3NlVGhyZWFkKi8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcGF0Y2gtPnNpbmtzWzBdLmZsYWdzLm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CkBAIC0yOTcsNTIgKzI3MCw2NyBAQAogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQobmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woc3JjTW9kdWxlLAorICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woc3JjTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUmVjb3JkLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFJlY29yZFRocmVhZCo+KHRocmVhZC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ld1BhdGNoLmNyZWF0ZUNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZE1vZHVsZSA9IGF1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgaW5wdXQgYXMgc2luayBpZiBhbnkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZSA9PSB0aHJlYWQtPmlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+bnVtX3NvdXJjZXMsCkBAIC0zNTYsOSArMzQ0LDkgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjTW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQpAQCAtMzY2LDggKzM1NCw4IEBACiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzc5LDMxOSArMzY3LDQ0NyBAQAogICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gYXVkaW9mbGluZ2VyLT5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IG1BdWRpb0ZsaW5nZXIucHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgewogICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7CiAKLSAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgb3V0cHV0IGFzIHNvdXJjZSBpZiBhbnkKKyAgICAgICAgICAgIGZvciAoYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogZXhpdDoKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgQUxPR1YoIiVzKCkgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBhdWRpb2ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYW5kbGUgPSAqaGFuZGxlOwotICAgICAgICBuZXdQYXRjaC0+bUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKLSAgICAgICAgbVBhdGNoZXMuYWRkKG5ld1BhdGNoKTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsICpoYW5kbGUsIGhhbEhhbmRsZSk7CisgICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOworICAgICAgICBuZXdQYXRjaC5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOworICAgICAgICBtUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgc3RkOjptb3ZlKG5ld1BhdGNoKSkpOworICAgICAgICBpZiAoaW5zZXJ0ZWRNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcygpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUsIGhhbEhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoKTsKLSAgICAgICAgZGVsZXRlIG5ld1BhdGNoOworICAgICAgICBuZXdQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCkKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6On5QYXRjaCgpCit7CisgICAgQUxPR0VfSUYoaXNTb2Z0d2FyZSgpLCAiU29mdHdhcmUgcGF0Y2ggY29ubmVjdGlvbnMgbGVha2VkICVkICVkIiwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBzdWJQYXRjaDsKLSAgICBzdWJQYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgc3ViUGF0Y2guc291cmNlc1swXSA9IGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMF07Ci0gICAgc3ViUGF0Y2gubnVtX3NpbmtzID0gMTsKLQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNpbmtzWzBdKTsKLSAgICBzdWJQYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobUF1ZGlvUGF0Y2guc291cmNlc1swXSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtUmVjb3JkLnRocmVhZCgpLCB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDIH0pLnBhdGNoKCksCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZVB0cigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1SZWNvcmQuaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgaWYgKGF1ZGlvUGF0Y2gtPm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHN1YlBhdGNoLnNpbmtzWzBdID0gYXVkaW9QYXRjaC0+c2lua3NbMF07Ci0gICAgICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NpbmtzICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1QbGF5YmFjay50aHJlYWQoKSkuYWRkU2luayhtQXVkaW9QYXRjaC5zaW5rc1swXSkucGF0Y2goKSwKKyAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlUHRyKCkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAogICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKLSAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBtUGxheWJhY2sudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKICAgICBpbnQgcGxheWJhY2tTaGlmdCA9IF9fYnVpbHRpbl9jdHoocGxheWJhY2tGcmFtZUNvdW50KTsKLSAgICBzaXplX3QgcmVjb3JkRnJhbWVjb3VudCA9IHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCk7Ci0gICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZWNvdW50KTsKKyAgICBzaXplX3QgcmVjb3JkRnJhbWVDb3VudCA9IG1SZWNvcmQudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lQ291bnQpOwogICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKICAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OwogICAgIH0KLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKLSAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZWNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCi0gICAgICAgICAgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZWNvdW50LCBmcmFtZUNvdW50KTsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZUNvdW50KSA+PiBzaGlmdDsKKyAgICBBTE9HVigiJXMoKSBwbGF5ZnJhbWVDb3VudCAlenUgcmVjb3JkRnJhbWVDb3VudCAlenUgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVDb3VudCwgZnJhbWVDb3VudCk7CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHJlY29yZCB0cmFjayB0byBjYXB0dXJlIGZyb20gcmVjb3JkIHRocmVhZAotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsTWFzaygpOwotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBtUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxNYXNrKCk7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwKKyAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IG1SZWNvcmQudGhyZWFkKCktPmZvcm1hdCgpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShpbnB1dEZvcm1hdCkpIHsKKyAgICAgICAgLy8gVGhlIHBsYXliYWNrVGhyZWFkIGZvcm1hdCB3aWxsIHNheSBQQ00gZm9yIElFQzYxOTM3IHBhY2tldGl6ZWQgc3RyZWFtLgorICAgICAgICAvLyBVc2UgcmVjb3JkVGhyZWFkIGZvcm1hdC4KKyAgICAgICAgZm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgaW5wdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGlmIChzYW1wbGVSYXRlID09IG1SZWNvcmQudGhyZWFkKCktPnNhbXBsZVJhdGUoKSAmJgorICAgICAgICAgICAgaW5DaGFubmVsTWFzayA9PSBtUmVjb3JkLnRocmVhZCgpLT5jaGFubmVsTWFzaygpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5mYXN0VHJhY2tBdmFpbGFibGUoKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+aGFzRmFzdENhcHR1cmUoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSByZWNvcmQgdGhyZWFkIGhhcyBmYXN0IGNhcHR1cmUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgLy8gT25seSBlbmFibGUgZmFzdCBtb2RlIHdoZW4gdGhlcmUgaXMgbm8gcmVzYW1wbGUgbmVlZGVkLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGYXN0IG1vZGUgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGNhc2UuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9CisgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gdGVtcFJlY29yZFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVJlY29yZC5jaGVja1RyYWNrKHRlbXBSZWNvcmRUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+YWRkUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc2lua3NbMF0uZmxhZ3Mub3V0cHV0IDogQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zb3VyY2VzID09IDIgJiYgbUF1ZGlvUGF0Y2guc291cmNlc1sxXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgLy8gInJldXNlIG9uZSBleGlzdGluZyBvdXRwdXQgbWl4IiBjYXNlCisgICAgICAgIHN0cmVhbVR5cGUgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW07CisgICAgfQorICAgIGlmIChtUGxheWJhY2sudGhyZWFkKCktPmhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHBsYXliYWNrIHRocmVhZCBoYXMgZmFzdCBtaXhlciB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICBvdXRwdXRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dEZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0sCisgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVBsYXliYWNrLmNoZWNrVHJhY2sodGVtcFBhdGNoVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwogCiAgICAgLy8gdGllIHBsYXliYWNrIGFuZCByZWNvcmQgdHJhY2tzIHRvZ2V0aGVyCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hUcmFjay5nZXQoKSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFJlY29yZC5nZXQoKSk7CisgICAgbVJlY29yZC5zZXRUcmFja0FuZFBlZXIodGVtcFJlY29yZFRyYWNrLCB0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CisgICAgbVBsYXliYWNrLnNldFRyYWNrQW5kUGVlcih0ZW1wUGF0Y2hUcmFjaywgdGVtcFJlY29yZFRyYWNrLmdldCgpKTsKIAogICAgIC8vIHN0YXJ0IGNhcHR1cmUgYW5kIHBsYXliYWNrCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisgICAgbVJlY29yZC50cmFjaygpLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOworICAgIG1QbGF5YmFjay50cmFjaygpLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIEFMT0dWKCIlcygpIG1SZWNvcmQuaGFuZGxlICVkIG1QbGF5YmFjay5oYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7CisgICAgbVJlY29yZC5zdG9wVHJhY2soKTsKKyAgICBtUGxheWJhY2suc3RvcFRyYWNrKCk7CisgICAgbVJlY29yZC5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKKyAgICBtUGxheWJhY2suY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmdldExhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBpZiAoIWlzU29mdHdhcmUoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byByZWNvcmRUcmFjayA9IG1SZWNvcmQuY29uc3RfdHJhY2soKTsKKyAgICBpZiAocmVjb3JkVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byBwbGF5YmFja1RyYWNrID0gbVBsYXliYWNrLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHBsYXliYWNrVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gTGF0ZW5jeSBpbmZvcm1hdGlvbiBmb3IgdHJhY2tzIG1heSBiZSBjYWxsZWQgd2l0aG91dCBvYnRhaW5pbmcKKyAgICAvLyB0aGUgdW5kZXJseWluZyB0aHJlYWQgbG9jay4KKyAgICAvLworICAgIC8vIFdlIHVzZSByZWNvcmQgc2VydmVyIGxhdGVuY3kgKyBwbGF5YmFjayB0cmFjayBsYXRlbmN5IChnZW5lcmFsbHkgc21hbGxlciB0aGFuIHRoZQorICAgIC8vIHJldmVyc2UgZHVlIHRvIGludGVybmFsIGJpYXNlcykuCisgICAgLy8KKyAgICAvLyBUT0RPOiBpcyB0aGlzIHN0YWJsZSBlbm91Z2g/IENvbnNpZGVyIGEgUGF0Y2hUcmFjayBzeW5jaHJvbml6ZWQgdmVyc2lvbiBvZiB0aGlzLgorCisgICAgLy8gRm9yIFBDTSB0cmFja3MgZ2V0IHNlcnZlciBsYXRlbmN5LgorICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKHJlY29yZFRyYWNrLT5mb3JtYXQoKSkpIHsKKyAgICAgICAgZG91YmxlIHJlY29yZFNlcnZlckxhdGVuY3lNcywgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5nZXRTZXJ2ZXJMYXRlbmN5TXMoJnJlY29yZFNlcnZlckxhdGVuY3lNcykgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RyYWNrLT5nZXRUcmFja0xhdGVuY3lNcygmcGxheWJhY2tUcmFja0xhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMgKyBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgJWQgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlLCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIC8vIFNlZSBpZiBrZXJuZWwgbGF0ZW5jaWVzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gSWYgc28sIGRvIGEgZnJhbWUgZGlmZiBhbmQgdGltZSBkaWZmZXJlbmNlIGNvbXB1dGF0aW9uIHRvIGVzdGltYXRlCisgICAgLy8gdGhlIHRvdGFsIHBhdGNoIGxhdGVuY3kuIFRoaXMgcmVxdWlyZXMgdGhhdCBmcmFtZSBjb3VudHMgYXJlIHJlcG9ydGVkIGJ5IHRoZQorICAgIC8vIEhBTCBhcmUgbWF0Y2hlZCBwcm9wZXJseSBpbiB0aGUgY2FzZSBvZiByZWNvcmQgb3ZlcnJ1bnMgYW5kIHBsYXliYWNrIHVuZGVycnVucy4KKyAgICBUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OkZyYW1lVGltZSByZWNvcmRGVHt9LCBwbGF5RlR7fTsKKyAgICByZWNvcmRUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZyZWNvcmRGVCk7CisgICAgcGxheWJhY2tUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZwbGF5RlQpOworICAgIGlmIChyZWNvcmRGVC50aW1lTnMgPiAwICYmIHBsYXlGVC50aW1lTnMgPiAwKSB7CisgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmID0gcmVjb3JkRlQuZnJhbWVzIC0gcGxheUZULmZyYW1lczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZk5zID0gcmVjb3JkRlQudGltZU5zIC0gcGxheUZULnRpbWVOczsKIAotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5kZWxldGVQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggdHJhY2sgYW5kIHBhdGNoIHJlY29yZCBoYXZlIGEgbGFyZ2UgdGltZSBkaXNwYXJpdHkgYmVjYXVzZQorICAgICAgICAvLyBvbmUgdGhyZWFkIHJ1bnMgYnV0IGFub3RoZXIgaXMgc3RvcHBlZC4gIFdlIGFyYml0cmFyaWx5IGNob29zZSB0aGUgbWF4aW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gdGltZSBkaWZmZXJlbmNlIGJhc2VkIG9uIGhvdyBvZnRlbiB3ZSBleHBlY3QgdGhlIHRpbWVzdGFtcHMgdG8gdXBkYXRlIGluIG5vcm1hbCBvcGVyYXRpb24KKyAgICAgICAgLy8gKHR5cGljYWwgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiA1MCBtcykuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXBzIGFyZW4ndCBzYW1wbGVkIGNsb3NlIGVub3VnaCwgdGhlIHBhdGNoIGxhdGVuY3kgaXMgbm90CisgICAgICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIGJhc2VkIG9uIG1vcmUgZXhwZXJpbWVudHMuCisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IG1heFZhbGlkVGltZURpZmZOcyA9IDIwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgaWYgKHN0ZDo6YWJzKHRpbWVEaWZmTnMpIDwgbWF4VmFsaWRUaW1lRGlmZk5zKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gZnJhbWVEaWZmICogMWUzIC8gcmVjb3JkVHJhY2stPnNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgIC0gdGltZURpZmZOcyAqIDFlLTY7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbnVtIHNvdXJjZXMgPT0gMiB3ZSBhcmUgcmV1c2luZyBhbiBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgc28gd2UgZG8gbm90IGNsb3NlIGl0Ci0gICAgICAgIGlmIChwYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgIT0gMikgewotICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZU91dHB1dEludGVybmFsX2wocGF0Y2gtPm1QbGF5YmFja1RocmVhZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgfQogCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitTdHJpbmc4IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0Cit7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdGFibGUgZHVtcCBmb3JtIGZvciBwYXRjaGVzLCBqdXN0IGxpa2UgdHJhY2tzLgorICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJQYXRjaCAlZDogdGhyZWFkICVwID0+IHRocmVhZCAlcCIsCisgICAgICAgICAgICBteUhhbmRsZSwgbVJlY29yZC5jb25zdF90aHJlYWQoKS5nZXQoKSwgbVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLmdldCgpKTsKKworICAgIC8vIGFkZCBsYXRlbmN5IGlmIGl0IGV4aXN0cworICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgaWYgKGdldExhdGVuY3lNcygmbGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGxhdGVuY3k6ICUuMmxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2ggaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19mdW5jX18sIGhhbmRsZSk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgc2l6ZV90IGluZGV4OwogCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gbVBhdGNoZXMuc2l6ZSgpKSB7CisgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZChoYW5kbGUpOworICAgIGlmIChpdGVyID09IG1QYXRjaGVzLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOworICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKIAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaDsKLQotICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgeworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAmc3JjID0gcGF0Y2guc291cmNlc1swXTsKKyAgICBzd2l0Y2ggKHNyYy50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChod0RldmljZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAotICAgICAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7CisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gcGF0Y2guc2lua3NbMF0uZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQubWl4Lmh3X21vZHVsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQubWl4Lmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHNyYy5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7CisgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoaGFuZGxlKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0CiB7Ci0gICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZyIpOwotCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmIChtb2R1bGUuc2Vjb25kLnN0cmVhbXMuY291bnQoc3RyZWFtKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaEhhbmRsZSA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoX2l0ZXIgPSBtUGF0Y2hlcy5maW5kKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hfaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRjaCAmcGF0Y2ggPSBwYXRjaF9pdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMtPmVtcGxhY2VfYmFjaygqdGhpcywgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLT5pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1SZWNvcmQuY29uc3RfdGhyZWFkKCktPmlkKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTdGFsZSBwYXRjaCBoYW5kbGUgaW4gdGhlIGNhY2hlOiAlZCIsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CisgICAgLy8gVGhlIHN0cmVhbSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBvZiBpbnNlcnRlZCBtb2R1bGVzLgorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CiAKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOwotICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtT3BlbmVkKAorICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgbUluc2VydGVkTW9kdWxlc1thdWRpb0h3RGV2aWNlLT5oYW5kbGUoKV0uc3RyZWFtcy5pbnNlcnQoc3RyZWFtKTsKICAgICB9Cit9CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lcmFzZShzdHJlYW0pOworICAgIH0KK30KKworQXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgaWYgKG1vZHVsZSA9PSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHJldHVybiBudWxscHRyOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic2V0QXVkaW9Qb3J0Q29uZmlnKCkgYmFkIGh3IG1vZHVsZSAlZCIsIG1vZHVsZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlcygpIGJhZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKK30KKworc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUobW9kdWxlKTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZSA/IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCkgOiBudWxscHRyOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6YWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN3X3BhdGNoZXMuaW5zZXJ0KGhhbmRsZSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZXJhc2UoaGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHBhdGNoUGFuZWxEdW1wOworICAgIGNvbnN0IGNoYXIgKmluZGVudCA9ICIgICI7CisKKyAgICAvLyBPbmx5IGR1bXAgc29mdHdhcmUgcGF0Y2hlcy4KKyAgICBib29sIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5Tb2Z0d2FyZSBwYXRjaGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBpdGVyLnNlY29uZC5kdW1wKGl0ZXIuZmlyc3QpLnN0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAoIW1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lbXB0eSgpIHx8ICFtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAgKz0gIlxuVHJhY2tlZCBpbnNlcnRlZCBtb2R1bGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggbW9kdWxlRHVtcCA9IFN0cmluZzg6OmZvcm1hdCgiTW9kdWxlICVkOiBJL08gaGFuZGxlczogIiwgbW9kdWxlLmZpcnN0KTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbW9kdWxlLnNlY29uZC5zdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZCgiOyBTVyBQYXRjaGVzOiAiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2ggOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgcGF0Y2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIG1vZHVsZUR1bXAuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwYXRjaFBhbmVsRHVtcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgd3JpdGUoZmQsIHBhdGNoUGFuZWxEdW1wLnN0cmluZygpLCBwYXRjaFBhbmVsRHVtcC5zaXplKCkpOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKaW5kZXggZDM3YzBkMy4uNjEyODU1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC0xOSwxMyArMTksMzMgQEAKICAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmcm9tIEF1ZGlvRmxpbmdlci5oCiAjZW5kaWYKIAotY2xhc3MgUGF0Y2hQYW5lbCA6IHB1YmxpYyBSZWZCYXNlIHsKKworLy8gUGF0Y2hQYW5lbCBpcyBjb25jZWFsZWQgd2l0aGluIEF1ZGlvRmxpbmdlciwgdGhlaXIgbGlmZXRpbWVzIGFyZSB0aGUgc2FtZS4KK2NsYXNzIFBhdGNoUGFuZWwgewogcHVibGljOgorICAgIGNsYXNzIFNvZnR3YXJlUGF0Y2ggeworICAgICAgcHVibGljOgorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFBhdGNoUGFuZWwgJnBhdGNoUGFuZWwsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHBsYXliYWNrVGhyZWFkSGFuZGxlLCBhdWRpb19pb19oYW5kbGVfdCByZWNvcmRUaHJlYWRIYW5kbGUpCisgICAgICAgICAgICAgICAgOiBtUGF0Y2hQYW5lbChwYXRjaFBhbmVsKSwgbVBhdGNoSGFuZGxlKHBhdGNoSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZEhhbmRsZShwbGF5YmFja1RocmVhZEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkSGFuZGxlKHJlY29yZFRocmVhZEhhbmRsZSkge30KKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OworICAgICAgICBTb2Z0d2FyZVBhdGNoJiBvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKIAotICAgIGNsYXNzIFBhdGNoOworICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCB1bmRlciBBdWRpb0ZsaW5nZXI6Om1Mb2NrCisgICAgICAgIHN0YXR1c190IGdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFBsYXliYWNrVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBsYXliYWNrVGhyZWFkSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRSZWNvcmRUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkVGhyZWFkSGFuZGxlOyB9OworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgUGF0Y2hQYW5lbCAmbVBhdGNoUGFuZWw7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVBsYXliYWNrVGhyZWFkSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUmVjb3JkVGhyZWFkSGFuZGxlOworICAgIH07CiAKLSAgICBleHBsaWNpdCBQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcik7Ci0gICAgdmlydHVhbCB+UGF0Y2hQYW5lbCgpOworICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoQXVkaW9GbGluZ2VyKiBhdWRpb0ZsaW5nZXIpIDogbUF1ZGlvRmxpbmdlcigqYXVkaW9GbGluZ2VyKSB7fQogCiAgICAgLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTQ1LDQ2ICs2NSwxNTYgQEAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyk7CiAKLSAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBSZXRyaWV2ZXMgYWxsIGN1cnJlbnRseSBlc3RyYWJsaXNoZWQgc29mdHdhcmUgcGF0Y2hlcyBmb3IgYSBzdHJlYW0KKyAgICAvLyBvcGVuZWQgb24gYW4gaW50ZXJtZWRpYXRlIG1vZHVsZS4KKyAgICBzdGF0dXNfdCBnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdDsKIAotICAgIHN0YXR1c190IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKTsKLSAgICB2b2lkIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpOworICAgIC8vIE5vdGlmaWVzIHBhdGNoIHBhbmVsIGFib3V0IGFsbCBvcGVuZWQgYW5kIGNsb3NlZCBzdHJlYW1zLgorICAgIHZvaWQgbm90aWZ5U3RyZWFtT3BlbmVkKEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CisgICAgdm9pZCBub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRocmVhZFR5cGUsIHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgICBjbGFzcyBFbmRwb2ludCB7CisgICAgcHVibGljOgorICAgICAgICBFbmRwb2ludCgpID0gZGVmYXVsdDsKKyAgICAgICAgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQmKSA9IGRlbGV0ZTsKKyAgICAgICAgRW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBFbmRwb2ludCYpID0gZGVsZXRlOworICAgICAgICBFbmRwb2ludChFbmRwb2ludCYmIG90aGVyKSBub2V4Y2VwdCB7IHN3YXAob3RoZXIpOyB9CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oRW5kcG9pbnQmJiBvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgc3dhcChvdGhlcik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgfkVuZHBvaW50KCkgeworICAgICAgICAgICAgQUxPR0VfSUYobUhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgIkEgbm9uIGVtcHR5IFBhdGNoIEVuZHBvaW50IGxlYWtlZCwgaGFuZGxlICVkIiwgbUhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBjaGVja1RyYWNrKFRyYWNrVHlwZSAqdHJhY2tPck51bGwpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICh0cmFja09yTnVsbCA9PSBudWxscHRyKSByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrT3JOdWxsLT5pbml0Q2hlY2soKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgICAgIHNwPFRocmVhZFR5cGU+IHRocmVhZCgpIHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8VHJhY2tUeXBlPiB0cmFjaygpIHsgcmV0dXJuIG1UcmFjazsgfQorICAgICAgICBzcDxjb25zdCBUaHJlYWRUeXBlPiBjb25zdF90aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CisgICAgICAgIHNwPGNvbnN0IFRyYWNrVHlwZT4gY29uc3RfdHJhY2soKSBjb25zdCB7IHJldHVybiBtVHJhY2s7IH0KKworICAgICAgICB2b2lkIGNsb3NlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpIHsKKyAgICAgICAgICAgIGlmIChtSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgcGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKG1IYW5kbGUpOworICAgICAgICAgICAgICAgIG1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVRocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNsb3NlVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmVsLT5tQXVkaW9GbGluZ2VyLmNsb3NlVGhyZWFkSW50ZXJuYWxfbChtVGhyZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIGhhbmRsZVB0cigpIHsgcmV0dXJuICZtSGFuZGxlOyB9CisgICAgICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZFR5cGU+JiB0aHJlYWQsIGJvb2wgY2xvc2VUaHJlYWQgPSB0cnVlKSB7CisgICAgICAgICAgICBtVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgbUNsb3NlVGhyZWFkID0gY2xvc2VUaHJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRUcmFja0FuZFBlZXIoY29uc3Qgc3A8VHJhY2tUeXBlPiYgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEJhc2U6OlBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcGVlcikgeworICAgICAgICAgICAgbVRyYWNrID0gdHJhY2s7CisgICAgICAgICAgICBtVGhyZWFkLT5hZGRQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICBtVHJhY2stPnNldFBlZXJQcm94eShwZWVyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHsgaWYgKG1UcmFjaykgbVRyYWNrLT5zdG9wKCk7IH0KKworICAgICAgICB2b2lkIHN3YXAoRW5kcG9pbnQgJm90aGVyKSBub2V4Y2VwdCB7CisgICAgICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICAgICAgICBzd2FwKG1UaHJlYWQsIG90aGVyLm1UaHJlYWQpOworICAgICAgICAgICAgc3dhcChtQ2xvc2VUaHJlYWQsIG90aGVyLm1DbG9zZVRocmVhZCk7CisgICAgICAgICAgICBzd2FwKG1IYW5kbGUsIG90aGVyLm1IYW5kbGUpOworICAgICAgICAgICAgc3dhcChtVHJhY2ssIG90aGVyLm1UcmFjayk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgdm9pZCBzd2FwKEVuZHBvaW50ICZhLCBFbmRwb2ludCAmYikgbm9leGNlcHQgeworICAgICAgICAgICAgYS5zd2FwKGIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxUaHJlYWRUeXBlPiBtVGhyZWFkOworICAgICAgICBib29sIG1DbG9zZVRocmVhZCA9IHRydWU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3A8VHJhY2tUeXBlPiBtVHJhY2s7CisgICAgfTsKIAogICAgIGNsYXNzIFBhdGNoIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpIDoKLSAgICAgICAgICAgIG1BdWRpb1BhdGNoKCpwYXRjaCksIG1IYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbUhhbEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1SZWNvcmRQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCi0gICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkge30KLSAgICAgICAgflBhdGNoKCkge30KKyAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCkgOiBtQXVkaW9QYXRjaChwYXRjaCkge30KKyAgICAgICAgflBhdGNoKCk7CisgICAgICAgIFBhdGNoKGNvbnN0IFBhdGNoJikgPSBkZWxldGU7CisgICAgICAgIFBhdGNoKFBhdGNoJiYpID0gZGVmYXVsdDsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KFBhdGNoJiYpID0gZGVmYXVsdDsKIAorICAgICAgICBzdGF0dXNfdCBjcmVhdGVDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCk7CisgICAgICAgIHZvaWQgY2xlYXJDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCk7CisgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUmVjb3JkLmhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FIHx8CisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsgfQorCisgICAgICAgIC8vIHJldHVybnMgdGhlIGxhdGVuY3kgb2YgdGhlIHBhdGNoIChmcm9tIHJlY29yZCB0byBwbGF5YmFjaykuCisgICAgICAgIHN0YXR1c190IGdldExhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcykgY29uc3Q7CisKKyAgICAgICAgU3RyaW5nOCBkdW1wKGF1ZGlvX3BhdGNoX2hhbmRsZV90IG15SGFuZGxlKSBjb25zdDsKKworICAgICAgICAvLyBOb3RlIHRoYXQgYXVkaW9fcGF0Y2g6OmlkIGlzIG9ubHkgdW5pcXVlIHdpdGhpbiBhIEhBTCBtb2R1bGUKICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgICAgICAgICBtQXVkaW9QYXRjaDsKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFuZGxlOwogICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIEhBTCBwYXRjaCBoYW5kbGUgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAvLyBiZWxvdyBtZW1iZXJzIGFyZSB1c2VkIGJ5IGEgc29mdHdhcmUgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBhIHNvdXJjZSBkZXZpY2UgZnJvbSBhCiAgICAgICAgIC8vIGdpdmVuIGF1ZGlvIEhXIG1vZHVsZSB0byBhIHNpbmsgZGV2aWNlIG9uIGFuIG90aGVyIGF1ZGlvIEhXIG1vZHVsZS4KLSAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlQXVkaW9QYXRjaCgpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBpZgotICAgICAgICAvLyBubyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgY2FuIGJlIHVzZWQgYnkgdGhlIHNvZnR3YXJlIHBhdGNoCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkOwotICAgICAgICAvLyBhdWRpbyB0cmFjayBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+ICBtUGF0Y2hUcmFjazsKLSAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkOwotICAgICAgICAvLyBhdWRpbyByZWNvcmQgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+ICAgbVBhdGNoUmVjb3JkOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3Rpbmcgc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0LgotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUmVjb3JkUGF0Y2hIYW5kbGU7Ci0gICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgICAgIC8vIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlOwotCisgICAgICAgIC8vIHRoZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUNvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyQ29ubmVjdGlvbnMoKQorICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgaXMgY3JlYXRlZCBpZiBubyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgY2FuIGJlIHVzZWQKKyAgICAgICAgLy8gY29ubmVjdHMgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQorICAgICAgICBFbmRwb2ludDxQbGF5YmFja1RocmVhZCwgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IG1QbGF5YmFjazsKKyAgICAgICAgLy8gY29ubmVjdHMgc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0CisgICAgICAgIEVuZHBvaW50PFJlY29yZFRocmVhZCwgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gbVJlY29yZDsKICAgICB9OwogCi1wcml2YXRlOgotICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcj4gICAgICBtQXVkaW9GbGluZ2VyOwotICAgIFNvcnRlZFZlY3RvciA8UGF0Y2ggKj4gICAgICBtUGF0Y2hlczsKKyAgICBBdWRpb0h3RGV2aWNlKiBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CisgICAgdm9pZCBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIHZvaWQgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIEF1ZGlvRmxpbmdlciAmbUF1ZGlvRmxpbmdlcjsKKyAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2g+IG1QYXRjaGVzOworCisgICAgLy8gVGhpcyBtYXAgYWxsb3dzIGdvaW5nIGZyb20gYSB0aHJlYWQgdG8gImRvd25zdHJlYW0iIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAvLyB3aGVuIGEgcHJvY2Vzc2luZyBtb2R1bGUgaW5zZXJ0ZWQgaW4gYmV0d2Vlbi4gRXhhbXBsZToKKyAgICAvLworICAgIC8vICBmcm9tIG1hcCB2YWx1ZS5zdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCBrZXkKKyAgICAvLyAgW01peGVyIHRocmVhZF0gLS0+IFtWaXJ0dWFsIG91dHB1dCBkZXZpY2VdIC0tPiBbUHJvY2Vzc2luZyBtb2R1bGVdIC0tLVwKKyAgICAvLyAgICAgICBbSGFyd2FyZSBtb2R1bGVdIDwtLSBbUGh5c2ljYWwgb3V0cHV0IGRldmljZV0gPC0tIFtTL1cgUGF0Y2hdIDwtLS8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcCB2YWx1ZS5zd19wYXRjaGVzCisgICAgLy8KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgbWl4ZXIgdGhyZWFkIHRvIGxvb2sgdXAgdGhlIHRocmVhZHMgb2YgdGhlIHNvZnR3YXJlIHBhdGNoCisgICAgLy8gZm9yIHByb3BhZ2F0aW5nIHRpbWluZyBpbmZvLCBwYXJhbWV0ZXJzLCBldGMuCisgICAgLy8KKyAgICAvLyBUaGUgY3VycmVudCBhc3N1bXB0aW9ucyBhcmU6CisgICAgLy8gICAxKSBUaGUgcHJvY2Vzc2luZyBtb2R1bGUgYWN0cyBhcyBhIG1peGVyIHdpdGggc2V2ZXJhbCBvdXRwdXRzIHdoaWNoCisgICAgLy8gICAgICByZXByZXNlbnQgZGlmZmVyZW50bHkgZG93bm1peGVkIGFuZCAvIG9yIGVuY29kZWQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKKyAgICAvLyAgICAgIG1peGVkIHN0cmVhbS4gVGhlcmUgaXMgbm8gMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlIGlucHV0IHN0cmVhbXMKKyAgICAvLyAgICAgIGFuZCB0aGUgc29mdHdhcmUgcGF0Y2hlcywgYnV0IHJhdGhlciBhIE46TiBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuCisgICAgLy8gICAgICBhIGdyb3VwIG9mIHN0cmVhbXMgYW5kIGEgZ3JvdXAgb2YgcGF0Y2hlcy4KKyAgICAvLyAgIDIpIFRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGluc2VydGVkIHByb2Nlc3NpbmcgbW9kdWxlcyBpbiB0aGUgc3lzdGVtLAorICAgIC8vICAgICAgc28gd2hlbiBsb29raW5nIGZvciBhIHN0cmVhbSBvciBwYXRjaCBoYW5kbGUgd2UgY2FuIGl0ZXJhdGUgb3ZlcgorICAgIC8vICAgICAgYWxsIG1vZHVsZXMuCisgICAgc3RydWN0IE1vZHVsZUNvbm5lY3Rpb25zIHsKKyAgICAgICAgc3RkOjpzZXQ8YXVkaW9faW9faGFuZGxlX3Q+IHN0cmVhbXM7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBzd19wYXRjaGVzOworICAgIH07CisgICAgc3RkOjptYXA8YXVkaW9fbW9kdWxlX2hhbmRsZV90LCBNb2R1bGVDb25uZWN0aW9ucz4gbUluc2VydGVkTW9kdWxlczsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IGE3OGJlOTkuLjM1NzM3MGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC00MSwyMiArNDEsMTUgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwYXVzZSgpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXROYW1lKGludCBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTmFtZSA+PSAwICYmIG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyBib3RoIG9sZCBuYW1lICVkIGFuZCBuZXcgbmFtZSAlZCBhcmUgdmFsaWQiLCBfX2Z1bmNfXywgbU5hbWUsIG5hbWUpOwotICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCkBAIC02NSwxMiArNTgsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVybiAgbVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKICAgICAgICAgICAgIGludDMyX3QgICAgICphdXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQXV4QnVmZmVyOyB9CkBAIC04Nyw2ICs4MywxMCBAQAogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwOyB9CiAKKyAgICAgICAgICAgIGRvdWJsZSAgICAgIGJ1ZmZlckxhdGVuY3lNcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdGF0aWMoKSA/IDAuIDogVHJhY2tCYXNlOjpidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogLy8gaW1wbGVtZW50IHZvbHVtZSBoYW5kbGluZy4KICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLApAQCAtMTExLDYgKzExMSwyNiBAQAogICAgIC8qKiBDb3B5IHRoZSB0cmFjayBtZXRhZGF0YSBpbiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IuIFRocmVhZCBzYWZlLiAqLwogICAgIHZpcnR1YWwgdm9pZCAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0OwogCisgICAgICAgICAgICAvKiogUmV0dXJuIGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHVzZWQgaW4gbWl4ZXIuICovCisgICAgICAgICAgICBib29sICAgIGdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7IH0KKyAgICAgICAgICAgIC8qKiBTZXQgaGFwdGljIHBsYXliYWNrIG9mIHRoZSB0cmFjayBpcyBlbmFibGVkIG9yIG5vdCwgc2hvdWxkIGJlCisgICAgICAgICAgICAgKiAgc2V0IGFmdGVyIHF1ZXJ5IG9yIGdldCBjYWxsYmFjayBmcm9tIHZpYnJhdG9yIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKiBSZXR1cm4gYXQgd2hhdCBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWNzLCB1c2VkIGluIG1peGVyLiAqLworICAgICAgICAgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IGdldEhhcHRpY0ludGVuc2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNJbnRlbnNpdHk7IH0KKyAgICAgICAgICAgIC8qKiBTZXQgaW50ZW5zaXR5IG9mIGhhcHRpYyBwbGF5YmFjaywgc2hvdWxkIGJlIHNldCBhZnRlciBxdWVyeWluZyB2aWJyYXRvciBzZXJ2aWNlLiAqLworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNJbnRlbnNpdHkoQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjppc1ZhbGlkSGFwdGljSW50ZW5zaXR5KGhhcHRpY0ludGVuc2l0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKG1IYXB0aWNJbnRlbnNpdHkgIT0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gZ2V0RXh0ZXJuYWxWaWJyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRXh0ZXJuYWxWaWJyYXRpb247IH0KKworICAgICAgICAgICAgdm9pZCAgICBzZXRUZWVQYXRjaGVzKFRlZVBhdGNoZXMgdGVlUGF0Y2hlcyk7CisKIHByb3RlY3RlZDoKICAgICAvLyBmb3IgbnVtZXJvdXMKICAgICBmcmllbmQgY2xhc3MgUGxheWJhY2tUaHJlYWQ7CkBAIC0xMjEsOCArMTQxLDggQEAKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2spOwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwotICAgIC8vIHJlbGVhc2VCdWZmZXIoKSBub3Qgb3ZlcnJpZGRlbgorICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGU7CiAKICAgICAvLyBFeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzaXplX3QgZnJhbWVzUmVhZHkoKSBjb25zdDsKQEAgLTE0MCw3ICsxNjAsNyBAQAogICAgIGJvb2wgaXNSZXN1bWVQZW5kaW5nKCk7CiAgICAgdm9pZCByZXN1bWVBY2soKTsKICAgICB2b2lkIHVwZGF0ZVRyYWNrRnJhbWVJbmZvKGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOworICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTE3MSw3ICsxOTEsNiBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CkBAIC0xODgsNyArMjA3LDI5IEBACiAKICAgICBzcDxtZWRpYTo6Vm9sdW1lSGFuZGxlcj4gIG1Wb2x1bWVIYW5kbGVyOyAvLyBoYW5kbGVzIG11bHRpcGxlIFZvbHVtZVNoYXBlciBjb25maWdzIGFuZCBvcGVyYXRpb25zCiAKKyAgICBib29sICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaW5kaWNhdGVzIGhhcHRpYyBwbGF5YmFjayBlbmFibGVkIG9yIG5vdAorICAgIC8vIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhCisgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IG1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKKyAgICBjbGFzcyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgOiBwdWJsaWMgb3M6OkJuRXh0ZXJuYWxWaWJyYXRpb25Db250cm9sbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcihUcmFjayogdHJhY2spIDogbVRyYWNrKHRyYWNrKSB7fQorICAgICAgICBiaW5kZXI6OlN0YXR1cyBtdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgdW5tdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICBwcml2YXRlOgorICAgICAgICBUcmFjayogY29uc3QgbVRyYWNrOworICAgIH07CisgICAgc3A8QXVkaW9WaWJyYXRpb25Db250cm9sbGVyPiBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyOworICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gICAgbUV4dGVybmFsVmlicmF0aW9uOworCiBwcml2YXRlOgorICAgIHZvaWQgICAgICAgICAgICAgICAgaW50ZXJjZXB0QnVmZmVyKGNvbnN0IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYnVmZmVyKTsKKyAgICAvKiogV3JpdGUgdGhlIHNvdXJjZSBkYXRhIGluIHRoZSBidWZmZXIgcHJvdmlkZXIuIEByZXR1cm4gd3JpdHRlbiBmcmFtZSBjb3VudC4gKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgIHdyaXRlRnJhbWVzKEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IGZyYW1lQ291bnQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBGPgorICAgIHZvaWQgICAgICAgICAgICAgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soRiBmKSB7CisgICAgICAgIGZvciAoYXV0byYgdHAgOiBtVGVlUGF0Y2hlcykgeyBmKHRwLnBhdGNoVHJhY2spOyB9CisgICAgfTsKKwogICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IGZvciBmYXN0IHRyYWNrcywgYW5kIHNob3VsZCBiZSBpbiBhIHN1YmNsYXNzCiAgICAgaW50ICAgICAgICAgICAgICAgICBtRmFzdEluZGV4OyAvLyBpbmRleCB3aXRoaW4gRmFzdE1peGVyU3RhdGU6Om1GYXN0VHJhY2tzW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgbUZhc3RJbmRleCA9PSAtMSBpZiBub3QgaXNGYXN0VHJhY2soKQpAQCAtMjA4LDYgKzI0OSw3IEBACiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwogICAgIC8vIElmIHRoZSBsYXN0IHRyYWNrIGNoYW5nZSB3YXMgbm90aWZpZWQgdG8gdGhlIGNsaWVudCB3aXRoIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQKICAgICBzdGQ6OmF0b21pY19mbGFnICAgICBtQ2hhbmdlTm90aWZpZWQgPSBBVE9NSUNfRkxBR19JTklUOworICAgIFRlZVBhdGNoZXMgIG1UZWVQYXRjaGVzOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiAKQEAgLTIzMyw3ICsyNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uID0gQVVESU9fU0VTU0lPTl9OT05FKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgYnVmZmVyUXVldWVFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CiAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KQEAgLTI0MSw2ICsyODMsMTggQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgLyoqIFNldCB0aGUgbWV0YWRhdGFzIG9mIHRoZSB1cHN0cmVhbSB0cmFja3MuIFRocmVhZCBzYWZlLiAqLwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWV0YWRhdGFzKGNvbnN0IFNvdXJjZU1ldGFkYXRhcyYgbWV0YWRhdGFzKTsKKyAgICAvKiogcmV0dXJucyBjbGllbnQgdGltZXN0YW1wIHRvIHRoZSB1cHN0cmVhbSBkdXBsaWNhdGluZyB0aHJlYWQuICovCisgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICBnZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgLSBrZXJuZWwgZGlmZmVyZW5jZSBpcyBub3QgdHJ1ZSBsYXRlbmN5IHdoZW4gZHJhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gbVNlcnZlclByb3h5LT5pc0RyYWluZWQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG1DbGllbnRQcm94eS0+Z2V0VGltZXN0YW1wKCZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3MsIHRoZSB0aW1lc3RhbXAgTE9DQVRJT05fU0VSVkVSIGFuZCBMT0NBVElPTl9LRVJORUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIHdpbGwgYmUgcHJvcGVybHkgZmlsbGVkLiBJZiBnZXRUaW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlbiBhIGRlZmF1bHQgaW5pdGlhbGl6ZWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdpdGggbVRpbWVOc1tdIGZpbGxlZCB3aXRoIC0xJ3MpIGlzIHJldHVybmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgICAgICAgICAgICBvYnRhaW5CdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCkBAIC0yNTcsNiArMzExLDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTsKICAgICBEdXBsaWNhdGluZ1RocmVhZCogY29uc3QgICAgbVNvdXJjZVRocmVhZDsgLy8gZm9yIHdhaXRUaW1lTXMoKSBpbiB3cml0ZSgpCiAgICAgc3A8QXVkaW9UcmFja0NsaWVudFByb3h5PiAgIG1DbGllbnRQcm94eTsKKwogICAgIC8qKiBBdHRyaWJ1dGVzIG9mIHRoZSBzb3VyY2UgdHJhY2tzLgogICAgICAqCiAgICAgICogVGhpcyBtZW1iZXIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIG1UcmFja01ldGFkYXRhc011dGV4IHRha2VuLgpAQCAtMjc0LDcgKzMyOSw3IEBACiB9OyAgLy8gZW5kIG9mIE91dHB1dFRyYWNrCiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKLWNsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworY2xhc3MgUGF0Y2hUcmFjayA6IHB1YmxpYyBUcmFjaywgcHVibGljIFBhdGNoVHJhY2tCYXNlIHsKIHB1YmxpYzoKIAogICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCkBAIC0yODUsNyArMzQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQgPSB7fSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hUcmFjaygpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KQEAgLTMwMSwxMiArMzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKTsKIAotICAgICAgICAgICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KLQogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgcmVzdGFydElmRGlzYWJsZWQoKTsKIAotICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7Ci0gICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKIH07ICAvLyBlbmQgb2YgUGF0Y2hUcmFjawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IGZjMmRiYmIuLmFiNGFmMzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgIHNldE92ZXJmbG93KCkgeyBib29sIHRtcCA9IG1PdmVyZmxvdzsgbU92ZXJmbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bXA7IH0KIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwpAQCAtNjMsMTIgKzYzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IGlmICghaXNQYXRjaFRyYWNrKCkpIG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICBzdGF0aWMgIGJvb2wgICAgICAgIGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSA9PSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVN0YXRlCiAKQEAgLTEwMiw3ICsxMTMsNyBAQAogfTsKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAotY2xhc3MgUGF0Y2hSZWNvcmQgOiB2aXJ0dWFsIHB1YmxpYyBSZWNvcmRUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitjbGFzcyBQYXRjaFJlY29yZCA6IHB1YmxpYyBSZWNvcmRUcmFjaywgcHVibGljIFBhdGNoVHJhY2tCYXNlIHsKIHB1YmxpYzoKIAogICAgIFBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLApAQCAtMTEyLDcgKzEyMyw4IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCA9IHt9KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTEyMywxMSArMTM1LDQgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlcik7Ci0KLSAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQotCi1wcml2YXRlOgotICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7Ci0gICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKIH07ICAvLyBlbmQgb2YgUGF0Y2hSZWNvcmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjdlYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotCi0vKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgotICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAotICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQotICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKLSAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLQotLy8gTm90IHZhbGlkIHVudGlsIGluaXRpYWxpemVkIGJ5IEF1ZGlvRmxpbmdlciBjb25zdHJ1Y3Rvci4gIEl0IHdvdWxkIGhhdmUgdG8gYmUKLS8vIHJlLWluaXRpYWxpemVkIGlmIHRoZSBwcm9jZXNzIGNvbnRhaW5pbmcgQXVkaW9GbGluZ2VyIHNlcnZpY2UgZm9ya3MgKHdoaWNoIGl0IGRvZXNuJ3QpLgotLy8gVGhpcyBpcyBvZnRlbiB1c2VkIHRvIHZhbGlkYXRlIGJpbmRlciBpbnRlcmZhY2UgY2FsbHMgd2l0aGluIGF1ZGlvc2VydmVyCi0vLyAoZS5nLiBBdWRpb1BvbGljeU1hbmFnZXIgdG8gQXVkaW9GbGluZ2VyKS4KLXBpZF90IGdldHBpZF9jYWNoZWQ7Ci0KLS8vIEEgdHJ1c3RlZCBjYWxsaW5nIFVJRCBtYXkgc3BlY2lmeSB0aGUgY2xpZW50IFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsLgotLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCkgewotICAgIHN3aXRjaCAodWlkKSB7Ci0gICAgY2FzZSBBSURfTUVESUE6Ci0gICAgY2FzZSBBSURfQVVESU9TRVJWRVI6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgewotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKLSAgICB9Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KLSAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcwotICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQotICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKLSAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCi0gICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCi0gICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgotICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7Ci0gICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2thZ2VzWzBdOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdCh1aWRfdCB1aWQpIHsKLSAgICAvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIHVuZm9ya2VkIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KLSAgICByZXR1cm4gdWlkID09IEFJRF9ST09UIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVIgOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQotICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgotICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgaWYgKHN0YXJ0KSB7Ci0gICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQotICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOwotfQotCi1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOwotfQotCi12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybjsKLQotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKLX0KLQotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOwotCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwotICAgIH0KLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBkdW1wQWxsb3dlZCgpIHsKLSAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOwotICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKLSAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIHJldHVybiBvazsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWFkYTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpOwotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHNldHRpbmdzQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Ci1ib29sIGR1bXBBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCBjMjMyMGJjLi44ZjE4MWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CkBAIC0zNiw2ICszOCw4IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgpAQCAtNjIsOCArNjYsOCBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgpAQCAtNzEsNyArNzUsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKIApAQCAtMjAwLDcgKzIwNCw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHg0MDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4RDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMzMsOSArMzM3LDkgQEAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKIHByaXZhdGU6CiAgICAgVGhyZWFkQ3B1VXNhZ2UgbUNwdVVzYWdlOyAgICAgICAgICAgLy8gaW5zdGFudGFuZW91cyB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVdjU3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCiAKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1IelN0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gY3ljbGVzCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcwogCiAgICAgaW50IG1DcHVOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkJ3MgY3VycmVudCBDUFUgbnVtYmVyCiAgICAgaW50IG1DcHVrSHo7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbmN5IG9mIHRocmVhZCdzIGN1cnJlbnQgQ1BVIGluIGtIegpAQCAtMzYxLDcgKzM2NSw3IEBACiAKICAgICAvLyByZWNvcmQgc2FtcGxlIGZvciB3YWxsIGNsb2NrIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgbVdjU3RhdHMuc2FtcGxlKHdjTnMpOworICAgICAgICBtV2NTdGF0cy5hZGQod2NOcyk7CiAgICAgfQogCiAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IENQVSBudW1iZXIKQEAgLTM4MCwyNiArMzg0LDI2IEBACiAKICAgICAvLyBpZiBubyBjaGFuZ2UgaW4gQ1BVIG51bWJlciBvciBmcmVxdWVuY3ksIHRoZW4gcmVjb3JkIHNhbXBsZSBmb3IgY3ljbGUgc3RhdGlzdGljcwogICAgIGlmICh2YWxpZCAmJiBtQ3B1a0h6ID4gMCkgewotICAgICAgICBkb3VibGUgY3ljbGVzID0gd2NOcyAqIGNwdWtIeiAqIDAuMDAwMDAxOwotICAgICAgICBtSHpTdGF0cy5zYW1wbGUoY3ljbGVzKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKKyAgICAgICAgbUh6U3RhdHMuYWRkKGN5Y2xlcyk7CiAgICAgfQogCi0gICAgdW5zaWduZWQgbiA9IG1XY1N0YXRzLm4oKTsKKyAgICBjb25zdCB1bnNpZ25lZCBuID0gbVdjU3RhdHMuZ2V0TigpOwogICAgIC8vIG1DcHVVc2FnZS5lbGFwc2VkKCkgaXMgZXhwZW5zaXZlLCBzbyBkb24ndCBjYWxsIGl0IGV2ZXJ5IGxvb3AKICAgICBpZiAoKG4gJiAxMjcpID09IDEpIHsKLSAgICAgICAgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgewotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDFrID0gcGVyTG9vcCAqIDAuMDAxOwotICAgICAgICAgICAgZG91YmxlIG1lYW4gPSBtV2NTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2ID0gbVdjU3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluaW11bSA9IG1XY1N0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMubWF4aW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heEN5Y2xlcyA9IG1IelN0YXRzLm1heGltdW0oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFuID0gbVdjU3RhdHMuZ2V0TWVhbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLmdldFN0ZERldigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMuZ2V0TWF4KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbkN5Y2xlcyA9IG1IelN0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXZDeWNsZXMgPSBtSHpTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5nZXRNYXgoKTsKICAgICAgICAgICAgIG1DcHVVc2FnZS5yZXNldEVsYXBzZWQoKTsKICAgICAgICAgICAgIG1XY1N0YXRzLnJlc2V0KCk7CiAgICAgICAgICAgICBtSHpTdGF0cy5yZXNldCgpOwpAQCAtNDUzLDUwICs0NTcsNiBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhmbGFncywgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBvdXRwdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgY2hhciAqc291cmNlVG9TdHJpbmcoYXVkaW9fc291cmNlX3Qgc291cmNlKQotewotICAgIHN3aXRjaCAoc291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDogICAgICAgICAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOiAgICAgICAgICAgICAgICAgIHJldHVybiAibWljIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6ICAgICAgICAgcmV0dXJuICJ2b2ljZSB1cGxpbmsiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOiAgICAgICByZXR1cm4gInZvaWNlIGRvd25saW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOiAgICAgICAgICAgcmV0dXJuICJ2b2ljZSBjYWxsIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6ICAgICAgICAgICAgcmV0dXJuICJjYW1jb3JkZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOiAgICByZXR1cm4gInZvaWNlIHJlY29nbml0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOiAgcmV0dXJuICJ2b2ljZSBjb21tdW5pY2F0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOiAgICAgICAgcmV0dXJuICJyZW1vdGUgc3VibWl4IjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDogICAgICAgICAgcmV0dXJuICJ1bnByb2Nlc3NlZCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6ICAgICAgICAgICAgIHJldHVybiAiRk0gdHVuZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6ICAgICAgICAgICAgICByZXR1cm4gImhvdHdvcmQiOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwotICAgIH0KLX0KLQogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLApAQCAtNzExLDggKzY3MSw4IEBACiAgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlKCk7CiAgICAgICAgICAgICBtTG9jYWxMb2cubG9nKCJDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIOiBvbGQgZGV2aWNlICUjeCAoJXMpIG5ldyBkZXZpY2UgJSN4ICglcykiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgdG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCB0b1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlKCk7CkBAIC03MjEsOCArNjgxLDggQEAKICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hfbChkYXRhLT5tSGFuZGxlKTsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2UoKTsKICAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coIkNGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiBvbGQgZGV2aWNlICUjeCAoJXMpIG5ldyBkZXZpY2UgJSN4ICglcykiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgdG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCB0b1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwpAQCAtNzQ5LDYgKzcwOSw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1hc2spOwogCiAgICAgc3dpdGNoIChyZXByZXNlbnRhdGlvbikgeworICAgIC8vIFRyYXZlbCBhbGwgc2luZ2xlIGJpdCBjaGFubmVsIG1hc2sgdG8gY29udmVydCBjaGFubmVsIG1hc2sgdG8gc3RyaW5nLgogICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewogICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKQEAgLTc2OSw2ICs3MzAsMTAgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUKSBzLmFwcGVuZCgidG9wLXNpZGUtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CKSBzLmFwcGVuZCgiaGFwdGljLUIsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpIHMuYXBwZW5kKCJoYXB0aWMtQSwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKQEAgLTc4Myw2ICs3NDgsMTIgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMpIHMuYXBwZW5kKCJYLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMpIHMuYXBwZW5kKCJaLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX0xFRlQpIHMuYXBwZW5kKCJiYWNrLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9DRU5URVIpIHMuYXBwZW5kKCJjZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX0xFRlQpIHMuYXBwZW5kKCJ0b3AtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCkgcy5hcHBlbmQoInRvcC1yaWdodCwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwpAQCAtODQxLDkgKzgxMiw0MSBAQAogICAgICAgICBkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KICAgICAvLyBOb3RlOiBvdXRwdXQgZGV2aWNlIG1heSBiZSB1c2VkIGJ5IGNhcHR1cmUgdGhyZWFkcyBmb3IgZWZmZWN0cyBzdWNoIGFzIEFFQy4KLSAgICBkcHJpbnRmKGZkLCAiICBPdXRwdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbU91dERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsIG1JbkRldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHNvdXJjZVRvU3RyaW5nKG1BdWRpb1NvdXJjZSkpOworICAgIGRwcmludGYoZmQsICIgIE91dHB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtT3V0RGV2aWNlLCB0b1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIHRvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHRvU3RyaW5nKG1BdWRpb1NvdXJjZSkuY19zdHIoKSk7CisKKyAgICAvLyBEdW1wIHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICBpZiAobVR5cGUgPT0gUkVDT1JECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgfQorCisgICAgaWYgKG1MYXN0SW9CZWdpbk5zID4gMCkgeyAvLyBNTUFQIG1heSBub3Qgc2V0IHRoaXMKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTGFzdCAlcyBvY2N1cnJlZCAobXNlY3MpOiAlbGxkXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIChzeXN0ZW1UaW1lKCkgLSBtTGFzdElvQmVnaW5OcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc1RpbWVNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFByb2Nlc3MgdGltZSBtcyBzdGF0czogJXNcbiIsIG1Qcm9jZXNzVGltZU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKG1Jb0ppdHRlck1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsICVzIGppdHRlciBtcyBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAobUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRocmVhZGxvb3AgJXMgbGF0ZW5jeSBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KIAogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xNTE5LDcgKzE1MjIsNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKICAgICBjb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSWQ7CkBAIC0xNTcxLDYgKzE1NzQsOSBAQAogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgogICAgIG1IYXNDaGFuZ2VkID0gdHJ1ZTsKKyNpZmRlZiBURUVfU0lOSworICAgIHRyYWNrLT5kdW1wVGVlKC0xIC8qIGZkICovLCAiX1JFTU9WRSIpOworI2VuZGlmCiAgICAgcmV0dXJuIGluZGV4OwogfQogCkBAIC0xNjc0LDcgKzE2ODAsNyBAQAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1UcmFja3ModHlwZSA9PSBNSVhFUiksCiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKLSAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAorICAgICAgICBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAogICAgICAgICBtTWl4ZXJTdGF0dXMoTUlYRVJfSURMRSksCiAgICAgICAgIG1NaXhlclN0YXR1c0lnbm9yaW5nRmFzdFRyYWNrcyhNSVhFUl9JRExFKSwKICAgICAgICAgbVN0YW5kYnlEZWxheU5zKEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyksCkBAIC0xNzA5LDEwICsxNzE1LDIxIEBACiAgICAgICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT5jYW5TZXRNYXN0ZXJNdXRlKCkpIHsKICAgICAgICAgICAgIG1NYXN0ZXJNdXRlID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1PdXRwdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CiAKICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX09VVF9CVVMsIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgIGlmICh0eXBlID09IE1JWEVSIHx8IHR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfb3V0cHV0X2RldmljZXMiLAorICAgICAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfT1VUX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgIH0KKwogICAgIC8vICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKICAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewpAQCAtMTc3Myw3ICsxNzkwLDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTE3OTMsNyArMTgxMCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtMTgxMCw5ICsxODI3LDEyIEBACiB7CiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG11dGU6ICVzXG4iLCBtTWFzdGVyTXV0ZSA/ICJvbiIgOiAib2ZmIik7CisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFwdGljIGNoYW5uZWwgbWFzazogJSN4ICglcylcbiIsIG1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFza1RvU3RyaW5nKG1IYXB0aWNDaGFubmVsTWFzaywgdHJ1ZSAvKiBvdXRwdXQgKi8pLmNfc3RyKCkpOworICAgIH0KICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CiAgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgRGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKQEAgLTE4MjUsNyArMTg0NSw3IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIG91dHB1dCwgZmxhZ3MsIG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgICAgICAgICAgb3V0cHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyB3cml0dGVuOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdXNwZW5kZWQgZnJhbWVzOiAlbGxkXG4iLCAobG9uZyBsb25nKW1TdXNwZW5kZWRGcmFtZXMpOwogICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgewpAQCAtMTg4MCwxMSArMTkwMCwxNyBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtT3V0cHV0LT5mbGFnczsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCByZXF1ZXN0ZWRGbGFncyA9ICpmbGFnczsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIGNoZWNrSU1lbW9yeShzaGFyZWRCdWZmZXIpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CisgICAgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgRkFTVCBmbGFnIGNvbnNpZGVyZWQgT0sgaWYgZmFzdCBtaXhlciBpcyBwcmVzZW50CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CkBAIC0xOTA1LDcgKzE5MzEsNyBAQAogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBUT0RPOiBleHRyYWN0IGFzIGEgZGF0YSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoYXQgYSBjb21wdXRhdGlvbmFsbHkKICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBkb3dubWl4ZXIgaXMgbm90IHJlcXVpcmVkOiBpc0Zhc3RPdXRwdXRDaGFubmVsQ29udmVyc2lvbigpCi0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykgfHwKICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAogICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgpAQCAtMjE3NCw0OCArMjIwMCwxNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCi17Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCi0gICAgICAgIGludCBuYW1lOwotICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgotICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICBuYW1lID0gKml0OwotICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCiB7Ci0gICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKLQotICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tJZHMpIHsKICAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja0lkcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAogICAgICAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCB3aGVuIE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKSBuZXh0IGNoYW5nZXMgbUF1ZGlvTWl4ZXIuCi0gICAgICAgICAgICBtRGVsZXRlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tJZHMuZW1wbGFjZSh0cmFja0lkKTsKICAgICAgICAgfQotCi0gICAgICAgIG1VbnVzZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKFQ6OlRSQUNLX05BTUVfUEVORElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgInZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG5vdCBpbiBtVHJhY2tzIChyZXR1cm5lZCAlemQpIiwgbmFtZSwgaW5kZXgpOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0yMjUxLDYgKzIyNDYsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKIHsKICAgICBpZiAoaXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMzAzLDE1ICsyMzAzLDEzIEBACiAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgc3RhdGUgPSB0cmFjay0+bVN0YXRlOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIC8vIGFib3J0IHRyYWNrIHdhcyBzdG9wcGVkL3BhdXNlZCB3aGlsZSB3ZSByZWxlYXNlZCB0aGUgbG9jawogICAgICAgICAgICAgaWYgKHN0YXRlICE9IHRyYWNrLT5tU3RhdGUpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjM0MCw2ICsyMzM4LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwID8gVHJhY2s6OkZTX0ZJTExFRCA6IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgaW50ZW5zaXR5ID0gQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8QXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90PihpbnRlbnNpdHkpKTsKKyAgICAgICAgICAgIC8vIEhhcHRpYyBwbGF5YmFjayBzaG91bGQgYmUgZW5hYmxlZCBieSB2aWJyYXRvciBzZXJ2aWNlLgorICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGUgaGFwdGljIHBsYXliYWNrIG9mIGFsbCBhY3RpdmUgdHJhY2sgdG8gZW5zdXJlIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBvbmUgdHJhY2sgcGxheWluZyBoYXB0aWMgaWYgY3VycmVudCB0cmFjayBzaG91bGQgcGxheSBoYXB0aWMuCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHRyYWNrLT5tUmVzZXREb25lID0gZmFsc2U7CiAgICAgICAgIHRyYWNrLT5tUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSAwOwogICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CkBAIC0yNDA1LDYgKzI0MjIsMTQgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7CkBAIC0yNDYyLDYgKzI0ODcsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIHJlamVjdCBvdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMKICAgICBpZiAoKG1EcmFpblNlcXVlbmNlICYgMSkgJiYgKHNlcXVlbmNlID09IG1EcmFpblNlcXVlbmNlKSkgeworICAgICAgICAvLyBSZWdpc3RlciBkaXNjb250aW51aXR5IHdoZW4gSFcgZHJhaW4gaXMgY29tcGxldGVkIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UKKyAgICAgICAgLy8gdGhlIHRpbWVzdGFtcCBmcmFtZSBwb3NpdGlvbiB0byByZXNldCB0byAwIGZvciBkaXJlY3QgYW5kIG9mZmxvYWQgdGhyZWFkcy4KKyAgICAgICAgLy8gKE91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyBhcmUgaWdub3JlZCwgc2luY2UgdGhlIGRpc2NvbnRpbnVpdHkgd291bGQgYmUgaGFuZGxlZAorICAgICAgICAvLyBlbHNld2hlcmUsIGUuZy4gaW4gZmx1c2gpLgorICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOwogICAgICAgICBtRHJhaW5TZXF1ZW5jZSAmPSB+MTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQpAQCAtMjQ4MSw2ICsyNTExLDcgQEAKICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKTsKIAogICAgIC8vIEdldCBhY3R1YWwgSEFMIGZvcm1hdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEZvcm1hdCgmbUhBTEZvcm1hdCk7CkBAIC0yNjAwLDcgKzI2MzEsNyBAQAogICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOwogICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkKSB7Ci0gICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIGFsc28gdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBubyBsb25nZXIgdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgogICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKQEAgLTI2MTQsNiArMjY0NSwxMSBAQAogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbUNoYW5uZWxNYXNrICY9IH5tSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CiAgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgpAQCAtMjc4MSwyNCArMjgxNywxOCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcygKICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgLy8gTWlzY2VsbGFuZW91cyB0cmFjayBjbGVhbnVwIHdoZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKKyAgICAvLyBjYWxsZWQgd2l0aG91dCBUaHJlYWQgbG9jayBidXQgc3luY2hyb25pemVkIHdpdGggdGhyZWFkTG9vcCBwcm9jZXNzaW5nLgogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKLSAgICAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQotICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0b3ApOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQorICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7CiAgICAgICAgIH0KICAgICB9CisjZWxzZQorICAgICh2b2lkKXRyYWNrc1RvUmVtb3ZlOyAvLyBzdXBwcmVzcyB1bnVzZWQgd2FybmluZworI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2hlY2tTaWxlbnRNb2RlX2woKQpAQCAtMjg1MCw2ICsyODgwLDkgQEAKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+IDApIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplOworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICBtVGVlLndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIGZyYW1lc1dyaXR0ZW4pOworI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOwogICAgICAgICB9CkBAIC0yOTg5LDcgKzMwMjIsNyBAQAogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKICAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCksCiAgICAgICAgICAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7CkBAIC0zMTMwLDggKzMxNjMsOCBAQAogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAKICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKLSAgICBuc2Vjc190IGxhc3RXcml0ZUZpbmlzaGVkID0gLTE7IC8vIHRpbWUgbGFzdCBzZXJ2ZXIgd3JpdGUgY29tcGxldGVkCi0gICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KKyAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRXcml0dGVuID0gLTI7IC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCisgICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAgICAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0zMTY3LDcgKzMyMDAsMTggQEAKIAogICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMgc2hvdWxkIHJlc2V0IGZyYW1lIGNvdW50IHRvIHplcm8gb24gc3RvcC9mbHVzaAorICAgIC8vIFRPRE86IGFkZCBjb25maXJtYXRpb24gY2hlY2tzOgorICAgIC8vIDEpIERJUkVDVCB0aHJlYWRzIGFuZCBsaW5lYXIgUENNIGZvcm1hdCByZWFsbHkgcmVzZXRzIHRvIDA/CisgICAgLy8gMikgSXMgZnJhbWUgY291bnQgcmVhbGx5IHZhbGlkIGlmIG5vdCBsaW5lYXIgcGNtPworICAgIC8vIDMpIEFyZSBhbGwgNjQgYml0cyBvZiBwb3NpdGlvbiByZXR1cm5lZCwgbm90IGp1c3QgbG93ZXN0IDMyIGJpdHM/CisgICAgaWYgKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5zZXREaXNjb250aW51aXR5TW9kZShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8pOworICAgIH0KKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisKKyAgICAvLyBsb29wQ291bnQgaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgZGlhZ25vc3RpY3MuCisgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7ICFleGl0UGVuZGluZygpOyArK2xvb3BDb3VudCkKICAgICB7CiAgICAgICAgIC8vIExvZyBtZXJnZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGR1cmluZyBBdWRpb0ZsaW5nZXIgYmluZGVyIHRyYW5zYWN0aW9ucywgYnV0CiAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgY292ZXIgYXVkaW8gcGxheWJhY2suIEl0J3MgcmVxdWVzdGVkIGhlcmUgZm9yIHRoYXQgcmVhc29uLgpAQCAtMzE3Nyw2ICszMjIxLDQ5IEBACiAKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKKyAgICAgICAgLy8gSWYgdGhlIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0JVUywgY2hlY2sgZm9yIGRvd25zdHJlYW0gbGF0ZW5jeS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZTogd2UgYWNjZXNzIG91dERldmljZSgpIG91dHNpZGUgb2YgbUxvY2suCisgICAgICAgIGlmIChpc01zZERldmljZSgpICYmIChvdXREZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBIZXJlLCB3ZSB0cnkgZm9yIHRoZSBBRiBsb2NrLCBidXQgZG8gbm90IGJsb2NrIG9uIGl0IGFzIHRoZSBsYXRlbmN5CisgICAgICAgICAgICAvLyBpcyBtb3JlIGluZm9ybWF0aW9uYWwuCisgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bUxvY2sudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gc3dQYXRjaGVzOworICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoaWQoKSwgJnN3UGF0Y2hlcykgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN3UGF0Y2hlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzd1BhdGNoZXNbMF0uZ2V0TGF0ZW5jeU1zX2woJmxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBzd1BhdGNoZXNbMF0uZ2V0UGF0Y2hIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvd25zdHJlYW1QYXRjaEhhbmRsZSAhPSBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gZG93bnN0cmVhbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBkb3duc3RyZWFtIGxhdGVuY3kgKHdlIGFzc3VtZSBhIG1heCByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgNSBzZWNvbmRzKS4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbkxhdGVuY3kgPSAwLiwgbWF4TGF0ZW5jeSA9IDUwMDAuOworICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zID49IG1pbkxhdGVuY3kgJiYgbGF0ZW5jeU1zIDw9IG1heExhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZXcgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3V0IG9mIHJhbmdlIGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA8IG1pbkxhdGVuY3kpIGxhdGVuY3lNcyA9IG1pbkxhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXRlbmN5TXMgPiBtYXhMYXRlbmN5KSBsYXRlbmN5TXMgPSBtYXhMYXRlbmN5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIG91ciBkZXZpY2UgaXMgbm8gbG9uZ2VyIEFVRElPX0RFVklDRV9PVVRfQlVTLCByZXNldCBwYXRjaCBoYW5kbGUgYW5kIHN0YXRzLgorICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5yZXNldCgpOworICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0zMTkwLDE2ICszMjc3LDUxIEBACiAgICAgICAgICAgICAgICAgbG9nU3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQ29sbGVjdCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFBsYXliYWNrIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpIHsgLy8gbm8gaW5kZW50YXRpb24KICAgICAgICAgICAgIC8vIEdhdGhlciB0aGUgZnJhbWVzUmVsZWFzZWQgY291bnRlcnMgZm9yIGFsbCBhY3RpdmUgdHJhY2tzLAogICAgICAgICAgICAgLy8gYW5kIGFzc29jaWF0ZSB3aXRoIHRoZSBzaW5rIGZyYW1lcyB3cml0dGVuIG91dC4gIFdlIG5lZWQKICAgICAgICAgICAgIC8vIHRoaXMgdG8gY29udmVydCB0aGUgc2luayB0aW1lc3RhbXAgdG8gdGhlIHRyYWNrIHRpbWVzdGFtcC4KICAgICAgICAgICAgIGJvb2wga2VybmVsTG9jYXRpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIER1cGxpY2F0aW5nVGhyZWFkIG1heSBub3QgaGF2ZSBhIG1Ob3JtYWxTaW5rLgorICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCisgICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKCZ0aW1lc3RhbXApID09IE9LKSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZCh0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogRG93bnN0cmVhbSBsYXRlbmN5IG9ubHkgYWRkZWQgaWYgdGltZXN0YW1wIGNvcnJlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwKSB7IC8vIHdlIGhhdmUgbGF0ZW5jeSBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBuZXdQb3NpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpbnQ2NF90KG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXRNZWFuKCkgKiBtU2FtcGxlUmF0ZSAqIDFlLTMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCByZXRyb2dyYWRlCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU3VzcGVuZGVkRnJhbWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBXZSBhbHdheXMgZmV0Y2ggdGhlIHRpbWVzdGFtcCBoZXJlIGJlY2F1c2Ugb2Z0ZW4gdGhlIGRvd25zdHJlYW0KICAgICAgICAgICAgICAgICAvLyBzaW5rIHdpbGwgYmxvY2sgd2hpbGUgd3JpdGluZy4KLSAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKLSAgICAgICAgICAgICAgICAodm9pZCkgbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogCiAgICAgICAgICAgICAgICAgLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB2YWxpZCBrZXJuZWwgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgaW4gdW5kZXJydW4KICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIG5vcm1hbCBtaXhlciBwZXJpb2QgaXMgdGhlIHNhbWUgYXMgdGhlIGZhc3QgbWl4ZXIgcGVyaW9kLCBvciB0aGVyZQpAQCAtMzIyOCw3ICszMzUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdXNwZW5kZWRGcmFtZXM7IC8vIGFkZCBmcmFtZXMgZGlzY2FyZGVkIHdoZW4gc3VzcGVuZGVkCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbUZyYW1lc1dyaXR0ZW4gZm9yIG5vbi1vZmZsb2FkZWQgdHJhY2tzIGFyZSBjb250aWd1b3VzCiAgICAgICAgICAgICAvLyBldmVuIGFmdGVyIHN0YW5kYnkoKSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdHJhY2sgZnJhbWUKICAgICAgICAgICAgIC8vIHRvIHNpbmsgZnJhbWUgbWFwcGluZy4KQEAgLTMyNDQsMTEgKzMzNjksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB0aW1lIGJlZm9yZSB3ZSBjYWxsZWQgdGhlIEhBTCB3cml0ZSAtIGl0IGlzIGEgYml0IG1vcmUgYWNjdXJhdGUKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gd2hlbiB0aGUgc2VydmVyIGxhc3QgcmVhZCBkYXRhIHRoYW4gdGhlIGN1cnJlbnQgdGltZSBoZXJlLgogICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0V3JpdGVUaW1lIHdpbGwgYmUgLTEKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCBtTGFzdElvQmVnaW5OcyB3aWxsIGJlIC0xCiAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2Ugc3lzdGVtVGltZSgpLgogICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1GcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtTGFzdFdyaXRlVGltZSA9PSAtMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0SW9CZWdpbk5zID09IC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzeXN0ZW1UaW1lKCkgOiBtTGFzdElvQmVnaW5OczsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKQEAgLTMyNTYsMTAgKzMzODEsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsgLy8gbm90ZSAwLiBtZWFucyB0aW1lc3RhbXAgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IC8vIGlmIChtVHlwZSAuLi4gKSB7IC8vIG5vIGluZGVudGF0aW9uCiAjaWYgMAogICAgICAgICAgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKICAgICAgICAgICAgIGlmICh6ICUgMTAwID09IDApIHsKQEAgLTMzMDAsNyArMzQzNSw3IEBACiAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAorICAgICAgICAgICAgaWYgKChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIHB1dCBhdWRpbyBoYXJkd2FyZSBpbnRvIHN0YW5kYnkgYWZ0ZXIgc2hvcnQgZGVsYXkKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU3RhbmRieV9sKCkpIHsKQEAgLTMzMTQsNyArMzQ0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGFib3V0IHRvIHdhaXQsIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0zMzk0LDggKzM1MjksMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKCFoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIGlmICghbUVmZmVjdEJ1ZmZlclZhbGlkICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQ2hhbm5lbENvdW50LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBmb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKQEAgLTM0MzgsOCArMzU5MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltRWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUobVNpbmtCdWZmZXIsIG1DaGFubmVsQ291bnQsIG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCkBAIC0zNDQ5LDQzICszNjE4LDY4IEBACiAgICAgICAgICAgICAvLyBtU2xlZXBUaW1lVXMgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2F2ZSBsYXN0V3JpdGVGaW5pc2hlZCBoZXJlLCBhcyBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLAotICAgICAgICAgICAgICAgIC8vIGZvciB0aHJvdHRsaW5nLiBPbiB0aHJlYWQgc3RhcnQsIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIHNldCB0byAtMSwgd2hpY2ggcHJvcGVybHkgcmVzdWx0cyBpbiBubyB0aHJvdHRsaW5nIGFmdGVyIHRoZSBmaXJzdCB3cml0ZS4KLSAgICAgICAgICAgICAgICBuc2Vjc190IHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZVBlcmlvZE5zIGlzIHVwZGF0ZWQgPj0gMCB3aGVuIHJldCA+IDAuCisgICAgICAgICAgICAgICAgaW50NjRfdCB3cml0ZVBlcmlvZE5zID0gLTE7CiAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlbWFpbmluZykgewogICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZXdyaXRlIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOyAgLy8gYWxzbyB1c2VkIGZvciBkdW1wc3lzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyAtPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZXMgPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzOworCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHdyaXRlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjb250aW51b3VzIG1peGluZyBjeWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFdyaXR0ZW4gKyAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyYW1lcywgd3JpdGVQZXJpb2ROc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhV3JpdGVOcyA9IGxhc3RJb0VuZE5zIC0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdElvRW5kTnMgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbGQgbXNlY3MsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhV3JpdGVOcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMsIG1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IGxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TG9vcENvdW50V3JpdHRlbiA9IGxvb3BDb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9UUkFDSykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAhbVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0V3JpdGVGaW5pc2hlZCAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3JpdGVQZXJpb2ROcyA+IDApIHsgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHdyaXRlIHBlcmlvZCBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8KQEAgLTM1MDQsMTIgKzM2OTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhyZWFkTG9vcF9taXggKHNpZ25pZmljYW50IGZvciBoZWF2eSBtaXhpbmcsIGVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBvbiBsb3cgdGllciBwcm9jZXNzb3JzKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgKGFuZCBkZWx0YU5zKSBpcyBhbiBvdmVyZXN0aW1hdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhTnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YU5zID0gbGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCxwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLCAmZGVsdGFOcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YU5zIC8gMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyBpcyBhbiBvdmVyZXN0aW1hdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IHdyaXRlUGVyaW9kTnMgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IChpbnQzMl90KW1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaWduZWQpbUhhbGZCdWZmZXJNcyA+PSB0aHJvdHRsZU1zICYmIHRocm90dGxlTXMgPiAwKSB7CkBAIC0zNTIyLDcgKzM3MTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRocm90dGxlIG11c3QgYmUgYXR0cmlidXRlZCB0byB0aGUgcHJldmlvdXMgbWl4ZXIgbG9vcCdzIHdyaXRlIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBiYWNrLXRvLWJhY2sgdGhyb3R0bGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCArPSB0aHJvdHRsZU1zICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBwcm9wZXIgdGltaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAgLy8gd2UgZmV0Y2ggdGhlIHdyaXRlIGVuZCB0aW1lIGFnYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CkBAIC0zNjA1LDI0ICszNzk3LDM2IEBACiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgQUxPR1YoInJlbW92ZVRyYWNrc19sIHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgdHJhY2stPmlkKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhbiBleHRlcm5hbCBjbGllbnQgdHJhY2ssIGluZm9ybSBBUE0gd2UncmUgbm8gbG9uZ2VyIGFjdGl2ZSwgYW5kIHJlbW92ZSBpZiBuZWVkZWQuCisgICAgICAgIC8vIFdlIGRvIHRoaXMgdW5kZXIgbG9jayBzbyB0aGF0IHRoZSBzdGF0ZSBpcyBjb25zaXN0ZW50IGlmIHRoZSBUcmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvdXIgdHJhY2tzIHZlY3RvcgorICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcCh0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KICAgICB9Ci0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKQEAgLTM2MzksNiArMzg0MywxNSBAQAogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpID09IE9LKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbk9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uT2Zmc2V0ID4gdGltZXN0YW1wLm1Qb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uIC09IHBvc2l0aW9uT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NzEsNiArMzg4NCw3IEBACiAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICB9CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNpbmtQb3J0SWQgPSBwYXRjaC0+c2lua3NbMF0uaWQ7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CiAgICAgLy8gdGhlIGNoYW5nZQpAQCAtMzcwMCw3ICszOTE0LDcgQEAKIAogICAgIC8vIG1QcmV2T3V0RGV2aWNlIGlzIHRoZSBsYXRlc3QgZGV2aWNlIHNldCBieSBjcmVhdGVBdWRpb1BhdGNoX2woKS4gSXQgaXMgbm90IHNldCB3aGVuCiAgICAgLy8gdGhlIHRocmVhZCBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIGZpcnN0IHBhdGNoIGNyZWF0aW9uIHRyaWdnZXJzIGFuIGlvQ29uZmlnQ2hhbmdlZCBjYWxsYmFjawotICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IG1QcmV2T3V0RGV2aWNlICE9IHR5cGU7CisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gKG1QcmV2T3V0RGV2aWNlICE9IHR5cGUpIHx8IChtRGV2aWNlSWQgIT0gc2lua1BvcnRJZCk7CiAgICAgbU91dERldmljZSA9IHR5cGU7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogCkBAIC0zNzI5LDYgKzM5NDMsNyBAQAogICAgIH0KICAgICBpZiAoY29uZmlnQ2hhbmdlZCkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIG1EZXZpY2VJZCA9IHNpbmtQb3J0SWQ7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3NzcsMTIgKzM5OTIsMTYgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3OTgsNiArNDAxNyw3IEBACiAgICAgICAgIC8vIG1QaXBlU2luayBiZWxvdwogICAgICAgICAvLyBtTm9ybWFsU2luayBiZWxvdwogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiAgICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7CiAgICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSUjeCwgbUZyYW1lU2l6ZT0lenUsICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUsIG1Ob3JtYWxGcmFtZUNvdW50PSV6dSIsCkBAIC0zODE0LDcgKzQwMzQsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4NTYsMTYgKzQwNzcsMTQgQEAKICAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCiAgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKLSNlbmRpZgorCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgogICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwpAQCAtMzg3Nyw3ICs0MDk2LDcgQEAKICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gbmV3IE1vbm9QaXBlKG1Ob3JtYWxGcmFtZUNvdW50ICogNCwgZm9ybWF0LCB0cnVlIC8qd3JpdGVDYW5CbG9jayovKTsKICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwogICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0jaWYgIUxPR19OREVCVUcgfHwgZGVmaW5lZChURUVfU0lOSykKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICBzc2l6ZV90IGluZGV4ID0KICNlbHNlCiAgICAgICAgICh2b2lkKQpAQCAtMzg4OCwyNSArNDEwNyw4IEBACiAgICAgICAgICAgICAgICAgKG1vbm9QaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgIG1QaXBlU2luayA9IG1vbm9QaXBlOwogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7Ci0gICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKLSAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgLy8gY3JlYXRlIGZhc3QgbWl4ZXIgYW5kIGNvbmZpZ3VyZSBpdCBpbml0aWFsbHkgd2l0aCBqdXN0IG9uZSBmYXN0IHRyYWNrIGZvciBvdXIgc3VibWl4Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKCk7CisgICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKG1JZCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIHNxLT5zZXRPYnNlcnZlckR1bXAoJm1TdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wKTsKQEAgLTM5MTcsOCArNDExOSwxMCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMzkyNiwyNCArNDEzMCwzMCBAQAogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmsgPSBtT3V0cHV0U2luay5nZXQoKTsKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKKyAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKKyAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0TWl4ZXJGdXRleDsKICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0TWl4ZXJEdW1wU3RhdGU7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgc3RhdGUtPm1UZWVTaW5rID0gbVRlZVNpbmsuZ2V0KCk7Ci0jZW5kaWYKICAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdE1peGVyTG9nU2l6ZSwgIkZhc3RNaXhlciIpOwogICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RNaXhlck5CTG9nV3JpdGVyLmdldCgpOwogICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAKKyAgICAgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgaW5mbzsKKyAgICAgICAgaW5mby5pZCA9IG1JZDsKKyAgICAgICAgaW5mby50eXBlID0gTkJMb2c6OkZBU1RNSVhFUjsKKyAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsKKwogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdE1peGVyKTsKIAogI2lmZGVmIEFVRElPX1dBVENIRE9HCkBAIC0zOTUyLDkgKzQxNjIsMTQgQEAKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnNldER1bXAoJm1BdWRpb1dhdGNoZG9nRHVtcCk7CiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5ydW4oIkF1ZGlvV2F0Y2hkb2ciLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICB0aWQgPSBtQXVkaW9XYXRjaGRvZy0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAjZW5kaWYKLQorICAgIH0gZWxzZSB7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gT25seSB1c2UgdGhlIE1peGVyVGhyZWFkIHRlZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgIG1UZWUuc2V0KG1PdXRwdXRTaW5rLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfTSIpOworI2VuZGlmCiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC00MDE4LDEyICs0MjMzLDYgQEAKICAgICByZXR1cm4gbGF0ZW5jeTsKIH0KIAotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQotewotICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyh0cmFja3NUb1JlbW92ZSk7Ci19Ci0KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQpAQCAtNDIyMiwxNCArNDQzMSwxNCBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKAogICAgICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSkKIHsKLSAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIG5hbWVzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcwotICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKFt0aGlzXShpbnQgbmFtZSkgewotICAgICAgICAvLyBmb3IgZWFjaCBuYW1lLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCi0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveShuYW1lKTsKKyAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIGlkcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tJZHMoW3RoaXNdKGludCB0cmFja0lkKSB7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrSWQsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KHRyYWNrSWQpOwogICAgICAgICB9CiAgICAgfSk7Ci0gICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja0lkcygpOwogCiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZApAQCAtNDI3MCw2ICs0NDc5LDM4IEBACiAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCiAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgogCisgICAgLy8gRGVmZXJyZWRPcGVyYXRpb25zIGhhbmRsZXMgc3RhdGlzdGljcyBhZnRlciBzZXR0aW5nIG1peGVyU3RhdHVzLgorICAgIGNsYXNzIERlZmVycmVkT3BlcmF0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBEZWZlcnJlZE9wZXJhdGlvbnMobWl4ZXJfc3RhdGUgKm1peGVyU3RhdHVzKQorICAgICAgICAgICAgOiBtTWl4ZXJTdGF0dXMobWl4ZXJTdGF0dXMpIHsgfQorCisgICAgICAgIC8vIHdoZW4gbGVhdmluZyBzY29wZSwgdGFsbHkgZnJhbWVzIHByb3Blcmx5LgorICAgICAgICB+RGVmZXJyZWRPcGVyYXRpb25zKCkgeworICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IG1peGluZyAoTUlYRVJfVFJBQ0tTX1JFQURZKQorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIHVuZGVycnVuIG9jY3Vycy4KKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZhc3RUcmFja3MgYW5kIE5vcm1hbFRyYWNrcyBoZXJlLgorICAgICAgICAgICAgaWYgKCptTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1bmRlcnJ1biA6IG1VbmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5maXJzdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRhbGx5VW5kZXJydW5GcmFtZXMoKSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSB0cmFjayBjb3VudGVycworICAgICAgICAvLyB3aXRoIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gZnJhbWVzIGZvciBhIHBhcnRpY3VsYXIgbWl4ZXIgcGVyaW9kLgorICAgICAgICAvLyBXZSBkZWZlciB0YWxseWluZyB1bnRpbCB3ZSBrbm93IHRoZSBmaW5hbCBtaXhlciBzdGF0dXMuCisgICAgICAgIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzcDxUcmFjaz4gdHJhY2ssIHNpemVfdCB1bmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgbVVuZGVycnVuRnJhbWVzLmVtcGxhY2VfYmFjayh0cmFjaywgdW5kZXJydW5GcmFtZXMpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBtaXhlcl9zdGF0ZSAqIGNvbnN0IG1NaXhlclN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNwPFRyYWNrPiwgc2l6ZV90Pj4gbVVuZGVycnVuRnJhbWVzOworICAgIH0gZGVmZXJyZWRPcGVyYXRpb25zKCZtaXhlclN0YXR1cyk7IC8vIGltcGxpY2l0IG5lc3RlZCBzY29wZSBmb3IgdmFyaWFibGUgY2FwdHVyZQorCisgICAgYm9vbCBub0Zhc3RIYXB0aWNUcmFjayA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV07CiAKQEAgLTQyNzgsNiArNDUxOSw5IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBmYXN0IHRyYWNrcwogICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBub0Zhc3RIYXB0aWNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgKHRob3VnaCB1bmxpa2VseSkgZm9yIGEgZmFzdCB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgICAvLyBhbmQgdGhlbiByZW1vdmVkIHdpdGhpbiB0aGUgc2FtZSBub3JtYWwgbWl4IGN5Y2xlLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBhcwpAQCAtNDMwNCwxMyArNDU0OCwxNCBAQAogICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIC8vIGRvbid0IGNvdW50IHVuZGVycnVucyB0aGF0IG9jY3VyIHdoaWxlIHN0b3BwaW5nIG9yIHBhdXNpbmcKICAgICAgICAgICAgIC8vIG9yIHN0b3BwZWQgd2hpY2ggY2FuIG9jY3VyIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQgd2hpbGUgYWN0aXZlCisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKCEodHJhY2stPmlzU3RvcHBpbmcoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICByZWNlbnRVbmRlcnJ1bnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgZmFzdCBtaXhlciB3aWxsIHB1bGwgJiBtaXggcGFydGlhbCBidWZmZXJzLCBidXQgd2UgY291bnQgYXMgYSBmdWxsIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMocmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWNjb3VudCBmb3IgRmFzdFRyYWNrIHVuZGVycnVucy4KKyAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBub3JtYWwgdHJhY2tzLAogICAgICAgICAgICAgLy8gd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGZvciBmYXN0IHRyYWNrcy4KQEAgLTQ0MDIsNiArNDY0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTQ0NDcsNiArNDY5NCwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDU2LDE5ICs0NzA3LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODksNyArNDc0Miw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NTAxLDEzICs0NzU0LDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTI0LDkgKzQ3NzcsOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzNyw5ICs0NzkwLDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyB0cmFjayBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsIGRvIG5vdCByYW1wIG9uIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ2MzUsMjQgKzQ4OTEsMjUgQEAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUodHJhY2tJZCk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCAodm9pZCAqKXRyYWNrLT5mb3JtYXQoKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykpOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKQEAgLTQ2NjIsMTQgKzQ5MTksMTQgQEAKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAogICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClyZXFTYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKICAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKQEAgLTQ2OTAsMjkgKzQ5NDcsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPwogICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCkpOwogCiAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllczsKQEAgLTQ3MjUsMTMgKzQ5OTAsMTMgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVkKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gZGVzaXJlZEZyYW1lczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmVycmVkT3BlcmF0aW9ucy50YWxseVVuZGVycnVuRnJhbWVzKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CiAKICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCiAgICAgICAgICAgICAvLyBwcmV2aW91cyBhdWRpbyBidWZmZXIgYWdhaW4gdG8gZWZmZWN0cwpAQCAtNDc0MCw3ICs1MDA1LDcgQEAKICAgICAgICAgICAgICAgICBjaGFpbi0+Y2xlYXJJbnB1dEJ1ZmZlcigpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKICAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgpAQCAtNDc1OSw3ICs1MDI0LDggQEAKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwgbmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTQ3NzIsMTMgKzUwMzgsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKHRyYWNrSWQpOwogICAgICAgICB9CiAKICAgICAgICAgfSAgIC8vIGxvY2FsIHZhcmlhYmxlIHNjb3BlIHRvIGF2b2lkIGdvdG8gd2FybmluZwogCiAgICAgfQogCisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUgJiYgc3EgIT0gTlVMTCkgeworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGZhc3QgdHJhY2sgcGxheWluZyBoYXB0aWMgYW5kIEZhc3RNaXhlciBleGlzdHMsCisgICAgICAgIC8vIGVuYWJsaW5nIHRoZSBmaXJzdCBGYXN0VHJhY2ssIHdoaWNoIHByb3ZpZGVzIG1peGVkIGRhdGEgZnJvbSBub3JtYWwKKyAgICAgICAgLy8gdHJhY2tzLCB0byBwbGF5IGhhcHRpYyBkYXRhLgorICAgICAgICBGYXN0VHJhY2sgKmZhc3RUcmFjayA9ICZzdGF0ZS0+bUZhc3RUcmFja3NbMF07CisgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gbm9GYXN0SGFwdGljVHJhY2spIHsKKyAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG5vRmFzdEhhcHRpY1RyYWNrOworICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFB1c2ggdGhlIG5ldyBGYXN0TWl4ZXIgc3RhdGUgaWYgbmVjZXNzYXJ5CiAgICAgYm9vbCBwYXVzZUF1ZGlvV2F0Y2hkb2cgPSBmYWxzZTsKICAgICBpZiAoZGlkTW9kaWZ5KSB7CkBAIC00ODMzLDkgKzUxMTAsOSBAQAogICAgIC8vIG9mIHByZXBhcmVUcmFja3NfbCgpOyB0aGlzIHJlbGVhc2VzIGFueSBvdXRzdGFuZGluZyBidWZmZXIgYmFjayB0byB0aGUgdHJhY2suCiAgICAgLy8gU2VlIGFsc28gdGhlIGltcGxlbWVudGF0aW9uIG9mIGRlc3Ryb3lUcmFja19sKCkuCiAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6ICp0cmFja3NUb1JlbW92ZSkgewotICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7Ci0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOworICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTAwNCwxNyArNTI4MSwxNyBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQpAQCAtNTAzMCw3ICs1MzA3LDkgQEAKICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWQgdGhyb3R0bGUgdGltZSAobXNlY3MpOiAldVxuIiwgbVRocmVhZFRocm90dGxlVGltZU1zKTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogJXNcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkuY19zdHIoKSk7CiAgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7Ci0KKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgYmFsYW5jZTogJWYgKCVzKVxuIiwgbU1hc3RlckJhbGFuY2UubG9hZCgpLAorICAgICAgICAgICAgKGhhc0Zhc3RNaXhlcigpID8gc3RkOjp0b19zdHJpbmcobUZhc3RNaXhlci0+Z2V0TWFzdGVyQmFsYW5jZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUJhbGFuY2UudG9TdHJpbmcoKSkuY19zdHIoKSk7CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwogCkBAIC01MDM4LDkgKzUzMTcsOSBAQAogICAgICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgICAgIGNvbnN0IEZhc3RNaXhlckR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0TWl4ZXJEdW1wU3RhdGUobUZhc3RNaXhlckR1bXBTdGF0ZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0TWl4ZXJEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdE1peGVyRHVtcFN0YXRlPihtRmFzdE1peGVyRHVtcFN0YXRlKTsKICAgICAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgICAgIGRlbGV0ZSBjb3B5OwogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICAvLyBTaW1pbGFyIGZvciBzdGF0ZSBxdWV1ZQpAQCAtNTA2MSwxMiArNTM0MCw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyXG4iKTsKICAgICB9Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIFdyaXRlIHRoZSB0ZWUgb3V0cHV0IHRvIGEgLndhdiBmaWxlCi0gICAgZHVtcFRlZShmZCwgbVRlZVNvdXJjZSwgbUlkLCAnTScpOwotI2VuZGlmCi0KIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aWRsZVNsZWVwVGltZVVzKCkgY29uc3QKQEAgLTUwOTMsMjMgKzUzNjYsMzQgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQotICAgICAgICAsIG1Wb2x1bWVTaGFwZXJBY3RpdmUoZmFsc2UpCiB7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6On5EaXJlY3RPdXRwdXRUaHJlYWQoKQogewogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIGJhbGFuY2U6ICVmICBMZWZ0OiAlZiAgUmlnaHQ6ICVmXG4iLAorICAgICAgICAgICAgbU1hc3RlckJhbGFuY2UubG9hZCgpLCBtTWFzdGVyQmFsYW5jZUxlZnQsIG1NYXN0ZXJCYWxhbmNlUmlnaHQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU1hc3RlckJhbGFuY2UgIT0gYmFsYW5jZSkgeworICAgICAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKKyAgICAgICAgbUJhbGFuY2UuY29tcHV0ZVN0ZXJlb0JhbGFuY2UoYmFsYW5jZSwgJm1NYXN0ZXJCYWxhbmNlTGVmdCwgJm1NYXN0ZXJCYWxhbmNlUmlnaHQpOworICAgICAgICBicm9hZGNhc3RfbCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6cHJvY2Vzc1ZvbHVtZV9sKFRyYWNrICp0cmFjaywgYm9vbCBsYXN0VHJhY2spCiB7CiAgICAgZmxvYXQgbGVmdCwgcmlnaHQ7CkBAIC01MTMzLDEyICs1NDE3LDEyIEBACiAgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgIH0KLSAgICAgICAgbGVmdCAqPSB2OworICAgICAgICBsZWZ0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZUxlZnQ7IC8vIERpcmVjdE91dHB1dFRocmVhZCBiYWxhbmNlIGFwcGxpZWQgYXMgdHJhY2sgdm9sdW1lCiAgICAgICAgIHJpZ2h0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKICAgICAgICAgaWYgKHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgcmlnaHQgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICB9Ci0gICAgICAgIHJpZ2h0ICo9IHY7CisgICAgICAgIHJpZ2h0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZVJpZ2h0OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTUxODAsNiArNTQ2NCwxMSBAQAogICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcmV2aW91c1RyYWNrID09IDApIHsKKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYW4gb2xkIHRyYWNrIGFkZGVkIGJhY2sgZHVyaW5nIHRyYWNrIHRyYW5zaXRpb24gZm9yIGRpcmVjdAorICAgICAgICAvLyBvdXRwdXQsIHNvIGFsd2F5cyBpc3N1ZXMgZmx1c2ggdG8gZmx1c2ggZGF0YSBvZiB0aGUgcHJldmlvdXMgdHJhY2sgaWYgaXQKKyAgICAgICAgLy8gd2FzIGFscmVhZHkgZGVzdHJveWVkIHdpdGggSEFMIHBhdXNlZCwgdGhlbiBmbHVzaCBjYW4gcmVzdW1lIHRoZSBwbGF5YmFjaworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICB9CiAgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOwogfQpAQCAtNTIxOCw3ICs1NTA3LDYgQEAKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGbHVzaFBlbmRpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPmZsdXNoQWNrKCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNTI1Myw3ICs1NTQxLDcgQEAKICAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CkBAIC01MzE1LDcgKzU2MDMsOCBAQAogCiAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MzI5LDcgKzU2MTgsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIG1peGVyIHN0YXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPmlkKCkpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC01NTY4LDYgKzU4NTcsNyBAQAogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7IC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIGZsdXNoIHJlc2V0cyBmcmFtZSBjb3VudC4KIH0KIAogaW50NjRfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IHsKQEAgLTU4MTEsNyArNjEwMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gIGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMigpKSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01ODU1LDcgKzYxNDUsNyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEhhcmR3YXJlIGJ1ZmZlciBjYW4gaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbyBzbyB3ZSBtdXN0CkBAIC01OTAyLDYgKzYxOTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCisgICAgICAgICAgICAgICAgICAgIGlmICghbVVzZUFzeW5jV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBleHBsaWNpdCBkcmFpbiBub3RpZmljYXRpb24gd2UgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZGlzY29udGludWl0eSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzICghbGFzdCkgb3IgdGhlIHVwY29taW5nIChsYXN0KSB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgc2tpcHBpbmcgdGhlIGRpc2NvbnRpbnVpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KQEAgLTU5MjMsOCArNjIyMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7IC8vIHN0aWxsIHJ1bm5pbmcsIGdpdmUgdXMgbW9yZSB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWRUaHJlYWQ6IEJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGwgY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNjA2Nyw3ICs2MzY1LDIyIEBACiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxXcml0dGVuID0gb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworCisgICAgICAgIC8vIENvbnNpZGVyIHRoZSBmaXJzdCBPdXRwdXRUcmFjayBmb3IgdGltZXN0YW1wIGFuZCBmcmFtZSBjb3VudGluZy4KKworICAgICAgICAvLyBUaGUgdGhyZWFkTG9vcCgpIGdlbmVyYWxseSBhc3N1bWVzIHdyaXRpbmcgYSBmdWxsIHNpbmsgYnVmZmVyIHNpemUgYXQgYSB0aW1lLgorICAgICAgICAvLyBIZXJlLCB3ZSBjb3JyZWN0IGZvciB3cml0ZUZyYW1lcyBvZiAwIChhIHN0b3ApIG9yIHVuZGVycnVucyBiZWNhdXNlCisgICAgICAgIC8vIHdlIGFsd2F5cyBjbGFpbSBzdWNjZXNzLgorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGNvcnJlY3Rpb24gPSBtU2lua0J1ZmZlclNpemUgLyBtRnJhbWVTaXplIC0gYWN0dWFsV3JpdHRlbjsKKyAgICAgICAgICAgIEFMT0dEX0lGKGNvcnJlY3Rpb24gIT0gMCAmJiB3cml0ZUZyYW1lcyAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHdyaXRlRnJhbWVzOiV1ICBhY3R1YWxXcml0dGVuOiV6ZCAgY29ycmVjdGlvbjolemQgIG1GcmFtZXNXcml0dGVuOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgd3JpdGVGcmFtZXMsIGFjdHVhbFdyaXR0ZW4sIGNvcnJlY3Rpb24sIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW4pOworICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gLT0gY29ycmVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IFJlcG9ydCBjb3JyZWN0aW9uIGZvciB0aGUgb3RoZXIgb3V0cHV0IHRyYWNrcyBhbmQgc2hvdyBpbiB0aGUgZHVtcC4KICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNjA5Miw3ICs2NDA1LDcgQEAKICAgICAgICAgc3MgPDwgIjoiOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbU91dHB1dFRyYWNrcykgewogICAgICAgICAgICAgY29uc3Qgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gdHJhY2stPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPm5hbWUoKSA8PCAiIDogIjsKKyAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPmlkKCkgPDwgIiA6ICI7CiAgICAgICAgICAgICBpZiAodGhyZWFkLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBzcyA8PCB0aHJlYWQuZ2V0KCkgPDwgIiwgIiA8PCB0aHJlYWQtPmlkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjIzMiw5ICs2NTQ1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCiAgICAgbUlucHV0KGlucHV0KSwKQEAgLTYyNDIsOSArNjU1Miw2IEBACiAgICAgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzLCBtUnNtcEluRnJhbWVzUDIsIGFuZCBtUnNtcEluRnJhbWVzT0EgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCi0jaWZkZWYgVEVFX1NJTksKLSAgICAsIG1UZWVTaW5rKHRlZVNpbmspCi0jZW5kaWYKICAgICAsIG1SZWFkT25seUhlYXAobmV3IE1lbW9yeURlYWxlcihrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSwKICAgICAgICAgICAgICJSZWNvcmRUaHJlYWRSTyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpKQogICAgIC8vIG1GYXN0Q2FwdHVyZSBiZWxvdwpAQCAtNjI2MSw4ICs2NTY4LDIwIEBACiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKKyAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1JbnB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOworICAgIH0KKwogICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9JTl9CVVMsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfaW5wdXRfZGV2aWNlcyIsCisgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX0lOX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFVRElPX0RFVklDRV9OT05FKSk7CisKICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc291cmNlIGZvciB0aGUgSEFMIGlucHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1JbnB1dFNvdXJjZSA9IG5ldyBBdWRpb1N0cmVhbUluU291cmNlKGlucHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKQEAgLTYzNTksNyArNjY3OCw3IEBACiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IGNhcHR1cmUKICAgICAgICAgbUZhc3RDYXB0dXJlLT5ydW4oIkZhc3RDYXB0dXJlIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdENhcHR1cmUtPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKICAgICAgICAgc3RyZWFtKCktPnNldEhhbFRocmVhZFByaW9yaXR5KGtQcmlvcml0eUZhc3RDYXB0dXJlKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAvLyBGSVhNRQpAQCAtNjM2Nyw2ICs2Njg2LDEwIEBACiAKICAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldChtSW5wdXRTb3VyY2UtPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX0lOUFVUX1RIUkVBRCk7CisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfQyIpOworI2VuZGlmCiBmYWlsZWQ6IDsKIAogICAgIC8vIEZJWE1FIG1Ob3JtYWxTb3VyY2UKQEAgLTY0MjcsOCArNjc1MCwxMCBAQAogICAgIC8vIHVzZWQgdG8gcmVxdWVzdCBhIGRlZmVycmVkIHNsZWVwLCB0byBiZSBleGVjdXRlZCBsYXRlciB3aGlsZSBtdXRleCBpcyB1bmxvY2tlZAogICAgIHVpbnQzMl90IHNsZWVwVXMgPSAwOwogCisgICAgaW50NjRfdCBsYXN0TG9vcENvdW50UmVhZCA9IC0yOyAgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKwogICAgIC8vIGxvb3Agd2hpbGUgdGhlcmUgaXMgd29yayB0byBkbwotICAgIGZvciAoOzspIHsKKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDs7ICsrbG9vcENvdW50KSB7ICAvLyBsb29wQ291bnQgdXNlZCBmb3Igc3RhdGlzdGljcyB0cmFja2luZwogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAogICAgICAgICAvLyBhY3RpdmVUcmFja3MgYWNjdW11bGF0ZXMgYSBjb3B5IG9mIGEgc3Vic2V0IG9mIG1BY3RpdmVUcmFja3MKQEAgLTY0OTQsNiArNjgxOSw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0lORzoKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTRUQ7CiAgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY1MTUsMTIgKzY4NDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgYWxsU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6ICAgIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgaWRsZQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTRUQ6ICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIHBhdXNlZAorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVE9QUEVEOiAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGRlc3Ryb3llZC90ZXJtaW5hdGVkCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVbmV4cGVjdGVkIGFjdGl2ZSB0cmFjayBzdGF0ZTolZCwgaWQ6JWQsIHRyYWNrczolenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhY3RpdmVUcmFja1N0YXRlLCBhY3RpdmVUcmFjay0+aWQoKSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CkBAIC02NTQ1LDcgKzY4NzEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzbGVlcCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHRyYWNrcyB0byBwcm9jZXNzCi0gICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OTYsNiArNjkyMiwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogYWJwID0gKGZhc3RUcmFjayAhPSAwICYmIGZhc3RUcmFjay0+aXNQYXRjaFRyYWNrKCkpID8KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlclByb3ZpZGVyKj4oZmFzdFRyYWNrLmdldCgpKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSBhYnApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gYWJwOworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gZmFzdFRyYWNrID09IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQgOiBmYXN0VHJhY2stPmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcS0+ZW5kKGRpZE1vZGlmeSk7CiAgICAgICAgICAgICBpZiAoZGlkTW9kaWZ5KSB7CiAgICAgICAgICAgICAgICAgc3EtPnB1c2goYmxvY2spOwpAQCAtNjYxOCwxMSArNjk1MiwxMSBAQAogCiAgICAgICAgIGludDMyX3QgcmVhciA9IG1Sc21wSW5SZWFyICYgKG1Sc21wSW5GcmFtZXNQMiAtIDEpOwogICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQ7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsgLy8gc3RhcnQgSU8gdGltaW5nCiAKICAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOwogCiAgICAgICAgICAgICAvLyBUaGUgYXVkaW8gZmlmbyByZWFkKCkgcmV0dXJucyBPVkVSUlVOIG9uIG92ZXJmbG93LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlcgogICAgICAgICAgICAgLy8gdG8gdGhlIGZ1bGwgYnVmZmVyIHBvaW50IChjbGVhcmluZyB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uKS4gIFVwb24gT1ZFUlJVTiBlcnJvciwKQEAgLTY2NzYsMTYgKzcwMTAsMzQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIGVuZCBJTyB0aW1pbmcKKwogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIHNlcnZlciBzdGF0cwogICAgICAgICAvLyBzeXN0ZW1UaW1lKCkgaXMgb3B0aW9uYWwgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRpbWVzdGFtcHMuCiAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdICs9IGZyYW1lc1JlYWQ7Ci0gICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbGFzdElvRW5kTnM7CiAKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBrZXJuZWwgc3RhdHMKICAgICAgICAgaWYgKG1QaXBlU291cmNlLmdldCgpID09IG51bGxwdHIgLyogZG9uJ3Qgb2J0YWluIGZvciBGYXN0Q2FwdHVyZSwgY291bGQgYmxvY2sgKi8pIHsKICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24sIHRpbWU7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgdGltZSA+IG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZChwb3NpdGlvbiwgdGltZSwgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHRpbWU7CiAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gZ2VuZXJhbCByZWNvcmQgYnVmZmVycyBzaG91bGQgdGVuZCB0byBiZSBlbXB0eSBpbgpAQCAtNjY5Myw4ICs3MDQ1LDE5IEBACiAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAvLyBBbHNvLCBpdCBpcyBub3QgYWR2YW50YWdlb3VzIHRvIGNhbGwgZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiBkdXJpbmcgdGhlIHJlYWQKICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgcmVhZCBvYnRhaW5zIGEgbG9jaywgcHJldmVudGluZyB0aGUgdGltZXN0YW1wIGNhbGwgZnJvbSBleGVjdXRpbmcuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gRnJvbSB0aGUgdGltZXN0YW1wLCBpbnB1dCByZWFkIGxhdGVuY3kgaXMgbmVnYXRpdmUgb3V0cHV0IHdyaXRlIGxhdGVuY3kuCisgICAgICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBtSW5wdXQgIT0gTlVMTCA/IG1JbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBSZWNvcmRUcmFjazo6Y2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKQorICAgICAgICAgICAgICAgID8gLSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSkgOiAwLjsKKyAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KKyAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aW1lc3RhbXAgaW5mb3JtYXRpb24KICAgICAgICAgLy8gQUxPR0QoIiVzIiwgbVRpbWVzdGFtcC50b1N0cmluZygpLmNfc3RyKCkpOwogCkBAIC02NzA4LDEwICs3MDcxLDI5IEBACiAgICAgICAgICAgICBnb3RvIHVubG9jazsKICAgICAgICAgfQogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG1GcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAKLSAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CisgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KQorICAgICAgICAgICAgICAgICYmIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50UmVhZCArIDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcmVhZFBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmFtZXNSZWFkLCByZWFkUGVyaW9kTnN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSAvKiBsYXN0VGltZXN0YW1wICovLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0gKGxhc3RJb0JlZ2luTnMgLSBtTGFzdElvRW5kTnMpICogMWUtNjsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1Jb0ppdHRlck1zLmFkZChqaXR0ZXJNcyk7CisgICAgICAgICAgICBtUHJvY2Vzc1RpbWVNcy5hZGQocHJvY2Vzc01zKTsKICAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGUgdGltaW5nIGluZm8uCisgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgIGxhc3RMb29wQ291bnRSZWFkID0gbG9vcENvdW50OworCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgKHZvaWQpbVRlZS53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKKyNlbmRpZgogICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgogICAgICAgICB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOwpAQCAtNjc2OSw5ICs3MTUxLDMzIEBACiAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIFJlY29yZEJ1ZmZlckNvbnZlcnRlciB1c2VkIGZvciBkaXJlY3Qgc3RyZWFtcy4gUGFzcworICAgICAgICAgICAgICAgICAgICAvLyBzdHJhaWdodCBmcm9tIFJlY29yZFRocmVhZCBidWZmZXIgdG8gUmVjb3JkVHJhY2sgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBidWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihidWZmZXIuZnJhbWVDb3VudCAhPSBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlYWQgbGVzcyB0aGFuIGV4cGVjdGVkICglenUgdnMgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidWZmZXIuZnJhbWVDb3VudCwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGJ1ZmZlci5yYXcsIGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNhbm5vdCBmaWxsIHJlcXVlc3QsIHN0YXR1czogJWQsIGZyYW1lQ291bnQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CkBAIC02OTQyLDYgKzczNDgsMTIgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSAmJiAoKmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBvbiBhbiBlbmNvZGVkIHN0cmVhbSByZXF1aXJlcyBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KQEAgLTcxMDcsOCArNzUxOSwxNCBAQAogICAgIHsKICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzdG9wcGVkIHlldCAobW92ZWQgdG8gUEFVU0VEIGFuZCBub3QgaW4gbUFjdGl2ZVRyYWNrcykKKyAgICAgICAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIHN0YXJ0SW5wdXQoKS4KICAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03MTI1LDE3ICs3NTQzLDM0IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHZlcmlmeSB0aGF0IHJlY29yZFRyYWNrIGlzIHN0aWxsIGluIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gU1RBUlRJTkdfMiBmb3JjZXMgZGVzdHJveSB0byBjYWxsIHN0b3BJbnB1dC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgbVN0YXRlOiVkIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHN0YXRlLCBsZXQgdGhlbSB0YWtlIG92ZXIsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgbVN0YXRlIGluIHRoZSBuZXcgc3RhdGUuCisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSdyZSBvaywgYnV0IHBlcmhhcHMgc3RhcnRJbnB1dCBoYXMgZmFpbGVkCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogc3RhcnRJbnB1dCBmYWlsZWQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gQWN0aXZlVHJhY2tzIGlmIFNUQVJUSU5HXzEgYW5kIHZhbGlkLCBzbyByZW1vdmUgZnJvbSBBY3RpdmVUcmFja3MsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgaW4gU1RBUlRJTkdfMSwgc28gZGVzdHJveSgpIHdpbGwgbm90IGNhbGwgc3RvcElucHV0LgogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKICAgICAgICAgfQogICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KICAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CkBAIC03MTQzLDI2ICs3NTc4LDE1IEBACiAgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KIAogICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cwotICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgaWYgKCFyZWNvcmRUcmFjay0+aXNEaXJlY3QoKSkgeworICAgICAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5yZXNldCgpOworICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgewotICAgICAgICAgICAgQUxPR1YoIlJlY29yZCBmYWlsZWQgdG8gc3RhcnQiKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLQotc3RhcnRFcnJvcjoKLSAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKLSAgICB9Ci0gICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPwotICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC03MTgxLDI0ICs3NjA1LDI2IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RvcCIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgLy8gaWYgd2UncmUgaW52YWxpZCwgd2UgY2FuJ3QgYmUgb24gdGhlIEFjdGl2ZVRyYWNrcy4KICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDAgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyBub3RlIHRoYXQgdGhyZWFkTG9vcCBtYXkgc3RpbGwgYmUgcHJvY2Vzc2luZyB0aGUgdHJhY2sgYXQgdGhpcyBwb2ludCBbd2l0aG91dCBsb2NrXQogICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNJTkc7Ci0gICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCi0gICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHdoaWxlIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORyAmJiAhcmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOyAvLyBzaWduYWwgdGhyZWFkIHRvIHN0b3AKKyAgICAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7CiAgICAgfQotICAgIC8vIEZJWE1FIGluY29ycmVjdCB1c2FnZSBvZiB3YWl0OiBubyBleHBsaWNpdCBwcmVkaWNhdGUgb3IgbG9vcAotICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrIGlzIGluIG1BY3RpdmVUcmFja3MgaGVyZQotICAgIGlmIChleGl0UGVuZGluZygpIHx8IG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7CisKKyAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNFRCkgeyAvLyBzdWNjZXNzZnVsIHN0b3AKICAgICAgICAgQUxPR1YoIlJlY29yZCBzdG9wcGVkIE9LIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIC8vIGRvbid0IGhhbmRsZSBhbnl0aGluZyAtIHdlJ3ZlIGJlZW4gaW52YWxpZGF0ZWQgb3IgcmVzdGFydGVkIGFuZCBpbiBhIGRpZmZlcmVudCBzdGF0ZQorICAgIEFMT0dXX0lGKCIlcyglZCk6IHVuc3luY2hyb25pemVkIHN0b3AsIHN0YXRlOiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNzI0MSw2ICs3NjY3LDIwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c2V0TWljcm9waG9uZURpcmVjdGlvbiIpOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkKK3sKKyAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24iKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKICAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fApAQCAtNzI5OSw4ICs3NzM5LDkgQEAKICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG1JbnB1dDsKICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gaW5wdXQgIT0gTlVMTCA/IGlucHV0LT5mbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb1N0cmVhbUluOiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIGlucHV0LCBmbGFncywgaW5wdXRGbGFnc1RvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaW5wdXQsIGZsYWdzLCB0b1N0cmluZyhmbGFncykuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWVzIHJlYWQ6ICVsbGRcbiIsIChsb25nIGxvbmcpbUZyYW1lc1JlYWQpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KIApAQCAtNzMxNiw5ICs3NzU3LDkgQEAKICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RDYXB0dXJlRHVtcFN0YXRlKG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RDYXB0dXJlRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdENhcHR1cmVEdW1wU3RhdGU+KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CiAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgZGVsZXRlIGNvcHk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtNzMzMiw3ICs3NzczLDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC03MzUyLDcgKzc3OTMsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKQEAgLTc2NDcsMTAgKzgwODgsMTUgQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZtU2FtcGxlUmF0ZSwgJm1DaGFubmVsTWFzaywgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCksICJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIEFMT0dJKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIH0KICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0RnJhbWVTaXplKCZtRnJhbWVTaXplKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgZnJhbWUgc2l6ZSBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtQnVmZmVyU2l6ZSk7CkBAIC03NzU1LDcgKzgyMDEsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCi0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1FZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWxyZWFkeSBvbmUgY2hhaW4gJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNzc5NCw2ICs4MjQwLDcgQEAKIAogICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwogICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOwpAQCAtNzgzNSw5ICs4MjgyLDEwIEBACiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKLSAgICBpZiAobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHsKKyAgICBpZiAoKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB8fCAobURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgbVByZXZJbkRldmljZSA9IG1JbkRldmljZTsKKyAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTc4NjAsMjQgKzgzMDgsMjggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVHJhY2tzLmFkZChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBkZXN0cm95VHJhY2tfbChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzkzMCw3ICs4MzgyLDcgQEAKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCi0gICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpLAogICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgIG1IYWxWb2xGbG9hdCgtMS4wZiksIC8vIEluaXRpYWxpemUgdG8gaWxsZWdhbCB2YWx1ZSBzbyBpdCBhbHdheXMgZ2V0cyBzZXQgcHJvcGVybHkgbGF0ZXIuCkBAIC03OTY0LDcgKzg0MTYsNyBAQAogICAgIH0KICAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtUG9ydElkKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgIH0KQEAgLTgwNDMsNiArODQ5NSw3IEBACiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOworICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC04MDUxLDcgKzg1MDQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgQUxPR0RfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgIk1tYXBUaHJlYWQ6OnN0YXJ0IGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CkBAIC04MDc2LDIxICs4NTMyLDIwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChwb3J0SWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIGFib3J0IGlmIHN0YXJ0IGlzIHJlamVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyCiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGVycm9yIHN0YXJ0IHJlamVjdGVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciA9ICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIH0KQEAgLTgxMDEsMjEgKzg1NTYsMjEgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAorICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/CisgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKKwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAogICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKLSAgICB9IGVsc2UgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NpbGVuY2VkX2woKSAmJiB0cmFjay0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKLSAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOworICAgIH0gZWxzZSBpZiAoIXRyYWNrLT5pc1NpbGVuY2VkX2woKSkgeworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAodC0+aXNTaWxlbmNlZF9sKCkgJiYgdC0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKKyAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPwotICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKLSAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTgxNjIsOCArODYxNyw4IEBACiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHRyYWNrLT5wb3J0SWQoKSk7CkBAIC04MTg4LDcgKzg2NDMsNyBAQAogICAgIGlmIChtSGFsU3RyZWFtID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTg0MTUsNyArODg3MCw3IEBACiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKLSAgICBpZiAoaXNPdXRwdXQoKSAmJiBtUHJldk91dERldmljZSAhPSBtT3V0RGV2aWNlKSB7CisgICAgaWYgKGlzT3V0cHV0KCkgJiYgKG1QcmV2T3V0RGV2aWNlICE9IG1PdXREZXZpY2UgfHwgbURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CkBAIC04NDI2LDcgKzg4ODEsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KLSAgICBpZiAoIWlzT3V0cHV0KCkgJiYgbVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UpIHsKKyAgICBpZiAoIWlzT3V0cHV0KCkgJiYgKG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlIHx8IG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgbVByZXZJbkRldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKQEAgLTg0NTksOSArODkxNCw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtQXVkaW9Id0Rldi0+aGFuZGxlKCk7CkBAIC04NjI2LDcgKzkwODEsNyBAQAogICAgIGRwcmludGYoZmQsICIgIEF0dHJpYnV0ZXM6IGNvbnRlbnQgdHlwZSAlZCB1c2FnZSAlZCBzb3VyY2UgJWRcbiIsCiAgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsIG1BdHRyLnVzYWdlLCBtQXR0ci5zb3VyY2UpOwogICAgIGRwcmludGYoZmQsICIgIFNlc3Npb246ICVkIHBvcnQgSWQ6ICVkXG4iLCBtU2Vzc2lvbklkLCBtUG9ydElkKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgY2xpZW50c1xuIik7CiAgICAgfQogfQpAQCAtODYzOSw3ICs5MDk0LDcgQEAKICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIE1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKQEAgLTg4NDUsNiArOTMwMCwxNSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobU91dHB1dCAmJiBtT3V0cHV0LT5mbGFncyAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKQEAgLTg4NjcsNyArOTMzMSwxMyBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpleGl0U3RhbmRieSgpCiB7Ci0gICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgeworICAgICAgICAvLyBtSW5wdXQgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgY2xlYXJJbnB1dCgpCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+c2V0R2FpbigxLjBmKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gTW1hcFRocmVhZDo6ZXhpdFN0YW5kYnkoKTsKIH0KIApAQCAtODkzNSw0ICs5NDA1LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGVhMjk0NTUuLjFhZmVhMDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKQEAgLTM5Myw2ICszOTMsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYnJvYWRjYXN0X2woKTsKIAorICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGlzTXNkRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXNkRGV2aWNlOyB9CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogcHJvdGVjdGVkOgpAQCAtNDM0LDYgKzQ0MCwxMiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8gX191bnVzZWQpIHsgfQogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBmYWxzZTsgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdpdGhpbiB0aGUgdGhyZWFkTG9vcCB0byBvYnRhaW4gdGltZXN0YW1wIGZyb20gdGhlIEhBTC4KKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAvLyBmb3IgbUVmZmVjdENoYWlucwogCiAgICAgICAgICAgICAgICAgY29uc3QgdHlwZV90ICAgICAgICAgICAgbVR5cGU7CkBAIC00NzMsNiArNDg1LDEwIEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVByZXZPdXREZXZpY2U7ICAgLy8gcHJldmlvdXMgb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2SW5EZXZpY2U7ICAgIC8vIHByZXZpb3VzIGlucHV0IGRldmljZQogICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgIG1QYXRjaDsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBAYnJpZWYgbURldmljZUlkICBjdXJyZW50IGRldmljZSBwb3J0IHVuaXF1ZSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7CiAKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtSWQ7CkBAIC00OTMsMTAgKzUwOSwyNyBAQAogICAgICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1OQkxvZ1dyaXRlcjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHk7CiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgICAgICAgICAgICAgIC8vIFRocmVhZExvb3Agc3RhdGlzdGljcyBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gLTE7CisgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gLTE7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZWFkIHVuZGVyIFRocmVhZEJhc2UgbG9jayAoaWYgbm90IG9uIHRoZSB0aHJlYWRMb29wIHRocmVhZCkuCisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSW9KaXR0ZXJNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtUHJvY2Vzc1RpbWVNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtTGF0ZW5jeU1zezAuOTk1IC8qIGFscGhhICovfTsKKworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Jc01zZERldmljZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIC8vIEEgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBldmFsdWF0ZWQgYnkgdGhlIHRocmVhZCBsb29wIGhhcyBjaGFuZ2VkIGFuZAogICAgICAgICAgICAgICAgIC8vIHdlIG11c3Qgbm90IHdhaXQgZm9yIGFzeW5jIHdyaXRlIGNhbGxiYWNrIGluIHRoZSB0aHJlYWQgbG9vcCBiZWZvcmUgZXZhbHVhdGluZyBpdAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TaWduYWxQZW5kaW5nOwogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgICAgICBOQkFJT19UZWUgICAgICAgICAgICAgICBtVGVlOworI2VuZGlmCiAgICAgICAgICAgICAgICAgLy8gQWN0aXZlVHJhY2tzIGlzIGEgc29ydGVkIHZlY3RvciBvZiB0cmFjayB0eXBlIFQgcmVwcmVzZW50aW5nIHRoZQogICAgICAgICAgICAgICAgIC8vIGFjdGl2ZSB0cmFja3Mgb2YgdGhyZWFkTG9vcCgpIHRvIGJlIGNvbnNpZGVyZWQgYnkgdGhlIGxvY2tlZCBwcmVwYXJlIHBvcnRpb24uCiAgICAgICAgICAgICAgICAgLy8gQWN0aXZlVHJhY2tzIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBUaHJlYWRCYXNlIGxvY2sgaGVsZC4KQEAgLTU0Myw2ICs1NzYsOSBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxUPiYgaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaW5kZXhPZihpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjQ1LDcgKzY4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKQEAgLTcwNyw2ICs3NDMsNyBAQAogCiAgICAgICAgICAgICAgICAgLy8gVm9sdW1lSW50ZXJmYWNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CkBAIC03ODQsNyArODIxLDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFzeW5jaHJvbm91cyBzaWduYWwgd2FpdCB0aW1lLgogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7IHJldHVybiBJTlQ2NF9NQVg7IH0KQEAgLTgwMSw2ICs4MzgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3Muc2l6ZSgpIDwgUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dERldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlKSAmJiBwb3Bjb3VudChkZXZpY2UpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCkBAIC04ODAsNiArOTIyLDExIEBACiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkRnJhbWVzOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQorCisgICAgLy8gbUhhcHRpY0NoYW5uZWxNYXNrIGFuZCBtSGFwdGljQ2hhbm5lbENvdW50IHdpbGwgb25seSBiZSB2YWxpZCB3aGVuIHRoZSB0aHJlYWQgc3VwcG9ydAorICAgIC8vIGhhcHRpYyBwbGF5YmFjay4KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQgPSAwOwogcHJpdmF0ZToKICAgICAvLyBtTWFzdGVyTXV0ZSBpcyBpbiBib3RoIFBsYXliYWNrVGhyZWFkIGFuZCBpbiBBdWRpb0ZsaW5nZXIuICBXaGVuIGEKICAgICAvLyBQbGF5YmFja1RocmVhZCBuZWVkcyB0byBmaW5kIG91dCBpZiBtYXN0ZXItbXV0ZWQsIGl0IGNoZWNrcyBpdCdzIGxvY2FsCkBAIC05MzUsMTYgKzk4MiwxOSBAQAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIG5hbWVzIGZvciBhbGwgdHJhY2tzCi0gICAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgorICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CiAgICAgcHVibGljOgotICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIDoKLSAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMoc2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7IH0KKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja0lkcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tJZHMoc2F2ZURlbGV0ZWRUcmFja0lkcykgeyB9CiAKICAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKLSAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiY2Fubm90IGFkZCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKTsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC05NjUsMjggKzEwMTUsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtRGVsZXRlZFRyYWNrTmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IG1EZWxldGVkVHJhY2tOYW1lcykgewotICAgICAgICAgICAgICAgICAgICBmKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tJZHMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgaW50IHRyYWNrSWQgOiBtRGVsZXRlZFRyYWNrSWRzKSB7CisgICAgICAgICAgICAgICAgZih0cmFja0lkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgcmV0dXJuIG1EZWxldGVkVHJhY2tJZHMuc2l6ZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKSB7IG1EZWxldGVkVHJhY2tOYW1lcy5jbGVhcigpOyB9CisgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja0lkcygpIHsgbURlbGV0ZWRUcmFja0lkcy5jbGVhcigpOyB9CiAKICAgICBwcml2YXRlOgotICAgICAgICAvLyBUcmFjayBuYW1lcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKLSAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja05hbWVzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZwotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tOYW1lczsKLQotICAgICAgICAvLyBGYXN0IGxvb2t1cCBvZiBwcmV2aW91c2x5IGRlbGV0ZWQgdHJhY2sgbmFtZXMgZm9yIHJldXNlLgotICAgICAgICAvLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBkZWNpc2lvbiAoYWN0dWFsbHkgYW55IG5vbi1uZWdhdGl2ZQotICAgICAgICAvLyBpbnRlZ2VyIHRoYXQgaXNuJ3QgaW4gbVRyYWNrc1sqXS0+bmFtZXMoKSBjb3VsZCBiZSB1c2VkKSAtIHdlIGF0dGVtcHQKLSAgICAgICAgLy8gdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhdmFpbGFibGUgbmFtZS4KLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtVW51c2VkVHJhY2tOYW1lczsKKyAgICAgICAgLy8gVHJhY2tzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcworICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrSWRzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZworICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tJZHM7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPHNwPFQ+PiBtVHJhY2tzOyAvLyB3cmFwcGVkIFNvcnRlZFZlY3Rvci4KICAgICB9OwpAQCAtOTk3LDcgKzEwMzgsOCBAQAogICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgICAgICAgICAgICAgKm1PdXRwdXQ7CiAKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJWb2x1bWU7Ci0gICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZTsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNle307CisgICAgYXVkaW9fdXRpbHM6OkJhbGFuY2UgICAgICAgICAgICBtQmFsYW5jZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1Xcml0ZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlczsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbldyaXRlOwpAQCAtMTA1NiwxNiArMTA5OCwxMyBAQAogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1QaXBlU2luazsKICAgICAvLyBUaGUgY3VycmVudCBzaW5rIGZvciB0aGUgbm9ybWFsIG1peGVyIHRvIHdyaXRlIGl0J3MgKHN1YiltaXgsIG1PdXRwdXRTaW5rIG9yIG1QaXBlU2luawogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1Ob3JtYWxTaW5rOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gRm9yIGR1bXBzeXMKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICBtVGVlU291cmNlOwotI2VuZGlmCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNjcmVlblN0YXRlOyAgIC8vIGNhY2hlZCBjb3B5IG9mIGdTY3JlZW5TdGF0ZQogICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICBrRmFzdE1peGVyTG9nU2l6ZSA9IDggKiAxMDI0OwogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIAorICAgIC8vIERvd25zdHJlYW0gcGF0Y2ggbGF0ZW5jeSwgYXZhaWxhYmxlIGlmIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwLgorICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zezAuOTk5fTsKIAogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKQEAgLTExMjEsNyArMTE2MCw2IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0xMTU0LDYgKzExOTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRmFzdE1peGVyRHVtcFN0YXRlLm1UcmFja3NbZmFzdEluZGV4XS5tVW5kZXJydW5zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTm9ybWFsU2luay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCgqdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck1vbm8uc3RvcmUobW9ubyk7CkBAIC0xMTY1LDIxICsxMjExLDM3IEBACiAgICAgICAgICAgICAgICAgLy8gQmxlbmRpbmcgd2l0aCBsaW1pdGVyIGlzIG5vdCBpZGVtcG90ZW50LAogICAgICAgICAgICAgICAgIC8vIGFuZCBibGVuZGluZyB3aXRob3V0IGxpbWl0ZXIgaXMgaWRlbXBvdGVudCBidXQgaW5lZmZpY2llbnQgdG8gZG8gdHdpY2UuCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gbU1hc3Rlck1vbm8ubG9hZCgpICYmICFoYXNGYXN0TWl4ZXIoKTsgfQorCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RNaXhlci0+c2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewogcHVibGljOgogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOworICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKKyAgICAgICAgOiBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpIHsgfQorCiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtMTE5NSwxMCArMTI1NywxMCBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKLSAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmU7CisgICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlID0gZmFsc2U7CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2b2lkIHByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKTsKIApAQCAtMTIwNywxMCArMTI2OSwzMSBAQAogCiAgICAgd3A8VHJhY2s+ICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2s7ICAgICAgICAgLy8gdXNlZCB0byBkZXRlY3QgdHJhY2sgc3dpdGNoCiAKKyAgICAvLyBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgZm9yIGluaXRpYWwgY29uZGl0aW9uIG9mIG1NYXN0ZXJCYWxhbmNlID0gMCAoZGlzYWJsZWQpLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlTGVmdCA9IDEuZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZVJpZ2h0ID0gMS5mOworCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMsIHF1ZXJ5IHRoZSBvdXRwdXQgc2luayBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwb3NpdGlvbjY0LCAmdGltZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoaW50NjRfdCl1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBPZmZsb2FkVGhyZWFkIDogcHVibGljIERpcmVjdE91dHB1dFRocmVhZCB7CkBAIC0xMzE4LDYgKzE0MDEsMjIgQEAKICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgbU91dHB1dFRyYWNrczsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmIChtT3V0cHV0VHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgdGhlIGZpcnN0IE91dHB1dFRyYWNrJ3Mga2VybmVsIGluZm9ybWF0aW9uIGZvciB0aW1lc3RhbXAuCisgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCB0cmFja1RpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRUcmFja3NbMF0tPmdldENsaWVudFByb3h5VGltZXN0YW1wKCk7CisgICAgICAgICAgICBpZiAodHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOyAgLy8gZGlzY2FyZCBzZXJ2ZXIgdGltZXN0YW1wIC0gdGhhdCdzIGlnbm9yZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH07CiAKIC8vIHJlY29yZCB0aHJlYWQKQEAgLTEzNzYsOSArMTQ3NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgdmlydHVhbCAgICAgflJlY29yZFRocmVhZCgpOwogCkBAIC0xNDI1LDcgKzE1MjEsNyBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGhlbiBkbyBpdCdzIHBhcnQgb2YgdGhlIHN0b3BwaW5nIHByb2Nlc3MKICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0OwogCkBAIC0xNDM5LDggKzE1MzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldElucHV0RnJhbWVzTG9zdCgpOwpAQCAtMTQ2MSw3ICsxNTU3LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAgICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0Q2FwdHVyZSAhPSAwOyB9Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CkBAIC0xNDc5LDggKzE1NzUsMTggQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgICAgICAgICBib29sICAgICAgICBmYXN0VHJhY2tBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtRmFzdFRyYWNrQXZhaWw7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgcG9wY291bnQgZm9yIGV4YWN0bHkgb25lIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfaW5wdXRfZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluRGV2aWNlICYgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE1MDgsOCArMTYxNCw2IEBACiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluUmVhcjsgICAgLy8gbGFzdCBmaWxsZWQgZnJhbWUgKyAxCiAKICAgICAgICAgICAgIC8vIEZvciBkdW1wc3lzCi0gICAgICAgICAgICBjb25zdCBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICBtVGVlU2luazsKLQogICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKIAogICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC0xNTUyLDYgKzE2NTYsOCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiAgICAgICAgICAgICAvLyBjb21tb24gc3RhdGUgdG8gYWxsIHJlY29yZCB0aHJlYWRzCiAgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sICAgICAgICAgICAgICAgICAgICBtQnROcmVjU3VzcGVuZGVkOworCisgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZCA9IDA7ICAgIC8vIGNvbnRpbnVvdXMgcnVubmluZyBjb3VudGVyLgogfTsKIAogY2xhc3MgTW1hcFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCkBAIC0xNjA0LDcgKzE3MTAsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsICAgICBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxTdHJlYW07IH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtMTYyNyw3ICsxNzMzLDcgQEAKICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkIF9fdW51c2VkLCBib29sIHNpbGVuY2VkIF9fdW51c2VkKSB7fQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xNjM1LDcgKzE3NDEsNiBAQAogCiAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHI7CiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKLSAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtRGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsKIAogICAgICAgICAgICAgICAgIHdwPE1tYXBTdHJlYW1DYWxsYmFjaz4gIG1DYWxsYmFjazsKQEAgLTE2ODgsNiArMTc5Myw4IEBACiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKQEAgLTE3MTYsNiArMTgyMyw4IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgcHJvY2Vzc1ZvbHVtZV9sKCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogIG1JbnB1dDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjY2ZiNjlmLi4wYmEwYWI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC0yNSwxMyArMjUsMTMgQEAKIHB1YmxpYzoKICAgICBlbnVtIHRyYWNrX3N0YXRlIHsKICAgICAgICAgSURMRSwKLSAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgRkxVU0hFRCwgICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIFNUT1BQRUQsCiAgICAgICAgIC8vIG5leHQgMiBzdGF0ZXMgYXJlIGN1cnJlbnRseSB1c2VkIGZvciBmYXN0IHRyYWNrcwogICAgICAgICAvLyBhbmQgb2ZmbG9hZGVkIHRyYWNrcyBvbmx5CiAgICAgICAgIFNUT1BQSU5HXzEsICAgICAvLyB3YWl0aW5nIGZvciBmaXJzdCB1bmRlcnJ1bgogICAgICAgICBTVE9QUElOR18yLCAgICAgLy8gd2FpdGluZyBmb3IgcHJlc2VudGF0aW9uIGNvbXBsZXRlCi0gICAgICAgIFJFU1VNSU5HLAorICAgICAgICBSRVNVTUlORywgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgQUNUSVZFLAogICAgICAgICBQQVVTSU5HLAogICAgICAgICBQQVVTRUQsCkBAIC01NCwxMSArNTQsNiBAQAogICAgICAgICBUWVBFX1BBVENILAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAgVFJBQ0tfTkFNRV9QRU5ESU5HID0gLTEsCi0gICAgICAgIFRSQUNLX05BTUVfRkFJTFVSRSA9IC0yLAotICAgIH07Ci0KICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBtQXR0ciwKQEAgLTkxLDYgKzg2LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KICAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9PVVRQVVQpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1BhdGNoVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9QQVRDSCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRXh0ZXJuYWxUcmFjaygpIGNvbnN0IHsgcmV0dXJuICFpc091dHB1dFRyYWNrKCkgJiYgIWlzUGF0Y2hUcmFjaygpOyB9CkBAIC0xMDAsNiArOTYsMTA2IEBACiAKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgIGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cjsgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgdm9pZCAgICAgICAgIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZWUuZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiogcmV0dXJucyB0aGUgYnVmZmVyIGNvbnRlbnRzIHNpemUgY29udmVydGVkIHRvIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgKiBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCBzdHJlYW1pbmcgdHJhY2tzLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gZm9yCisgICAgICAgICAgICAgKiBQQ00gc3RhdGljIHRyYWNrcyBhbmQgbm90IGRlZmluZWQgZm9yIG5vbi1QQ00gdHJhY2tzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jay4KKyAgICAgICAgICAgICAqLworICAgIHZpcnR1YWwgZG91YmxlICAgICAgYnVmZmVyTGF0ZW5jeU1zKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpICogMTAwMCAvIHNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgdHJhY2sgc3VwcG9ydHMgc2VydmVyIGxhdGVuY3kgY29tcHV0YXRpb24uCisgICAgICAgICAgICAgKiBUaGlzIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIHRyYWNrIGxpZmV0aW1lLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkOyB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgc2VydmVyIGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2sKKyAgICAgICAgICAgICAqIHRvIHRoZSBkZXZpY2Ugc2luay9zb3VyY2UuICBUaGlzIGlzIHRoZSB0aW1lIGZvciB0aGUgbmV4dCBmcmFtZSBpbiB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiB3cml0dGVuIG9yIHJlYWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCB0byB0aGUgZGV2aWNlIHNvdXJjZSBvciBzaW5rLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBzZXJ2ZXIgdGhyZWFkIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzb3VyY2Uvc2luay4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTZXJ2ZXJMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMsIGJvb2wgKmZyb21UcmFjayA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyB0aHJlYWQgbG9jayBpcyBhY3F1aXJlZCwgdGhlc2UgYXRvbWljcyBhcmUgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlciwgY29uc2lkZXJlZCBhIGJlbmlnbiByYWNlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIHNlcnZlckxhdGVuY3lNcyA9IG1TZXJ2ZXJMYXRlbmN5TXMubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJMYXRlbmN5TXMgPT0gMC4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVRyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyb21UcmFjayA9IG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgdG90YWwgY2xpZW50IGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2tzCisgICAgICAgICAgICAgKiBmb3IgdGhlIG5leHQgY2xpZW50IGFwcCBhY2Nlc3MgdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZTsgaS5lLiB0aGUKKyAgICAgICAgICAgICAqIHNlcnZlciBsYXRlbmN5IHBsdXMgdGhlIGJ1ZmZlciBsYXRlbmN5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBjbGllbnQgYXBwIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUcmFja0xhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzZXJ2ZXJMYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U2VydmVyTGF0ZW5jeU1zKCZzZXJ2ZXJMYXRlbmN5TXMsIGZyb21UcmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zICsgYnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbWFraW5nIHRoaXMgZXh0ZXJuYWwuCisgICAgICAgICAgIHN0cnVjdCBGcmFtZVRpbWUgeworICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXM7CisgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVOczsKKyAgICAgICAgICAgfTsKKworICAgICAgICAgICAvLyBLZXJuZWxGcmFtZVRpbWUgaXMgdXBkYXRlZCBwZXIgIm1peCIgcGVyaW9kIGV2ZW4gZm9yIG5vbi1wY20gdHJhY2tzLgorICAgICAgICAgICB2b2lkICAgICAgICAgZ2V0S2VybmVsRnJhbWVUaW1lKEZyYW1lVGltZSAqZnQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpmdCA9IG1LZXJuZWxGcmFtZVRpbWUubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICAgICAgICAgaW50IGlkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKIHByb3RlY3RlZDoKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2tCYXNlKTsKIApAQCAtMTExLDggKzIwNyw2IEBACiAgICAgLy8gYnV0IHB1dHRpbmcgaXQgaW4gVHJhY2tCYXNlIGF2b2lkcyB0aGUgY29tcGxleGl0eSBvZiB2aXJ0dWFsIGluaGVyaXRhbmNlCiAgICAgdmlydHVhbCBzaXplX3QgIGZyYW1lc1JlYWR5KCkgY29uc3QgeyByZXR1cm4gU0laRV9NQVg7IH0KIAotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KIAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CkBAIC0yMDgsMTMgKzMwMiwxOSBAQAogICAgIGNvbnN0IGJvb2wgICAgICAgICAgbUlzT3V0OwogICAgIHNwPFNlcnZlclByb3h5PiAgICAgbVNlcnZlclByb3h5OwogICAgIGNvbnN0IGludCAgICAgICAgICAgbUlkOwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgbVRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiAgICBtVGVlU291cmNlOworI2lmZGVmIFRFRV9TSU5LCisgICAgTkJBSU9fVGVlICAgICAgICAgICBtVGVlOworI2VuZGlmCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtVGVybWluYXRlZDsKICAgICB0cmFja190eXBlICAgICAgICAgIG1UeXBlOyAgICAgIC8vIG11c3QgYmUgb25lIG9mIFRZUEVfREVGQVVMVCwgVFlQRV9PVVRQVVQsIFRZUEVfUEFUQ0ggLi4uCiAgICAgYXVkaW9faW9faGFuZGxlX3QgICBtVGhyZWFkSW9IYW5kbGU7IC8vIEkvTyBoYW5kbGUgb2YgdGhlIHRocmVhZCB0aGUgdHJhY2sgaXMgYXR0YWNoZWQgdG8KICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7IC8vIHVuaXF1ZSBJRCBmb3IgdGhpcyB0cmFjayB1c2VkIGJ5IGF1ZGlvIHBvbGljeQogICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzSW52YWxpZDsgLy8gbm9uLXJlc2V0dGFibGUgbGF0Y2gsIHNldCBieSBpbnZhbGlkYXRlKCkKKworICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgIG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNre307IC8vIGxhdGVuY3kgZnJvbSB0cmFjayBvciBzZXJ2ZXIgdGltZXN0YW1wLgorICAgIHN0ZDo6YXRvbWljPGRvdWJsZT4gbVNlcnZlckxhdGVuY3lNc3t9OyAgICAgICAgLy8gbGFzdCBsYXRlbmN5IHB1c2hlZCBmcm9tIHNlcnZlciB0aHJlYWQuCisgICAgc3RkOjphdG9taWM8RnJhbWVUaW1lPiBtS2VybmVsRnJhbWVUaW1le307ICAgICAvLyBsYXN0IGZyYW1lIHRpbWUgb24ga2VybmVsIHNpZGUuCiB9OwogCiAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IFBhdGNoVHJhY2sgYW5kIFBhdGNoUmVjb3JkLgpAQCAtMjI5LDMgKzMyOSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpID0gMDsKIH07CisKK2NsYXNzIFBhdGNoVHJhY2tCYXNlIDogcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcgoreworcHVibGljOgorICAgIHVzaW5nIFRpbWVvdXQgPSBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz47CisgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksIGNvbnN0IFRocmVhZEJhc2UmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBzcDxDbGllbnRQcm94eT4gICAgICAgbVByb3h5OworICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5ID0gbnVsbHB0cjsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0e307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDZkMjVmYjkuLmFkNzhhNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2LDYgKzU2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tCYXNlIgogCiBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBuZXh0VHJhY2tJZCA9IDU1OwogCkBAIC05NywxNCArOTksMTUgQEAKICAgICAgICAgbUlkKGFuZHJvaWRfYXRvbWljX2luYygmbmV4dFRyYWNrSWQpKSwKICAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpLAogICAgICAgICBtVHlwZSh0eXBlKSwKLSAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZC0+aWQoKSksCisgICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQgPyB0aHJlYWQtPmlkKCkgOiBBVURJT19JT19IQU5ETEVfTk9ORSksCiAgICAgICAgIG1Qb3J0SWQocG9ydElkKSwKICAgICAgICAgbUlzSW52YWxpZChmYWxzZSkKIHsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gQVVESU9fVUlEX0lOVkFMSUQgJiYgY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CiAgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIC8vIGNsaWVudFVpZCBjb250YWlucyB0aGUgdWlkIG9mIHRoZSBhcHAgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0cmFjaywgc28gd2UgY2FuIGJsYW1lCkBAIC0xNDQsNyArMTQ3LDcgQEAKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7CiAgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOwogICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1Miw3ICsxNTUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKSBtYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjYsNyArMTY5LDggQEAKICAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDUsMjcgKzIwOSwxMiBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIF9fZnVuY19fLCBtSWQsIChpbnQpYWxsb2MpOwogICAgICAgICB9CiAgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChGb3JtYXRfaXNWYWxpZChwaXBlRm9ybWF0KSkgewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua1RyYWNrRnJhbWVzLCBwaXBlRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtwaXBlRm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1UZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtVGVlLnNldChzYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBmb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfVFJBQ0spOwogI2VuZGlmCiAKICAgICB9CkBAIC0yNDQsOSArMjMzLDYgQEAKIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewotI2lmZGVmIFRFRV9TSU5LCi0gICAgZHVtcFRlZSgtMSwgbVRlZVNvdXJjZSwgbUlkLCAnVCcpOwotI2VuZGlmCiAgICAgLy8gZGVsZXRlIHRoZSBwcm94eSBiZWZvcmUgZGVsZXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgaXQgcmVmZXJzIHRvLCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2UKICAgICBtU2VydmVyUHJveHkuY2xlYXIoKTsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewpAQCAtMjc0LDkgKzI2MCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogI2lmZGVmIFRFRV9TSU5LCi0gICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICB9CisgICAgbVRlZS53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKICNlbmRpZgogCiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CkBAIC0yOTMsOSArMjc3LDMyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBhdGNoVHJhY2tCYXNlOjpQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRCYXNlJiB0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQorICAgIDogbVByb3h5KHByb3h5KQoreworICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgIHNldFBlZXJUaW1lb3V0KCp0aW1lb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEb3VibGUgYnVmZmVyIG1peGVyCisgICAgICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogdGhyZWFkLmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc2FtcGxlUmF0ZSgpOworICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHN7bWl4QnVmZmVyTnN9KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQYXRjaFRyYWNrQmFzZTo6c2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gdGltZW91dC5jb3VudCgpIC8gc3RkOjpuYW5vOjpkZW47CisgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSB0aW1lb3V0LmNvdW50KCkgJSBzdGQ6Om5hbm86OmRlbjsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKQEAgLTM0MCw2ICszNDcsMTAgQEAKICAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKQEAgLTM2OCw2ICszNzksOCBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2siCiAKIC8vIFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKApAQCAtMzk3LDcgKzQxMCw2IEBACiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCiAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KICAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKQEAgLTQxNyw4ICs0MjksOCBAQAogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoJWQpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNCw3ICs0NDYsNyBAQAogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKICAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDUzLDEyICs0NjUsMjQgQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQotICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOworCisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgorICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKKyNlbmRpZgorCisgICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKHRoaXMpOworICAgICAgICBtRXh0ZXJuYWxWaWJyYXRpb24gPSBuZXcgb3M6OkV4dGVybmFsVmlicmF0aW9uKAorICAgICAgICAgICAgICAgIG1VaWQsICIiIC8qIHBrZyAqLywgbUF0dHIsIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIpOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCiB7Ci0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjpUcmFjayBkZXN0cnVjdG9yIik7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3Igd291bGQgY2xlYXIgbVNoYXJlZEJ1ZmZlciwKICAgICAvLyBidXQgaXQgd2lsbCBub3QgcHVzaCB0aGUgZGVjcmVtZW50ZWQgcmVmZXJlbmNlIGNvdW50LApAQCAtNDcyLDcgKzQ5Niw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtQ2JsayA9PSBudWxscHRyKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQ5OCwxOCArNTIyLDIxIEBACiAgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmRlc3Ryb3koKTsgfSk7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKLSAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgotICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCi0gICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgotICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJUeXBlICAgICBJZCBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTVCBVc2cgQ1QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBHIGRiICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQpAQCAtNTE4LDcgKzU0NSw3IEBACiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgVFlQRV9ERUZBVUxUOgogICAgIGNhc2UgVFlQRV9PVVRQVVQ6Ci0gICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzU3RhdGljKCkpIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbApAQCAtNTMyLDEzICs1NTksOSBAQAogICAgIH0KIAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9QRU5ESU5HKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIHBlbmQiLCB0cmFja1R5cGUpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIGZhaWwiLCB0cmFja1R5cGUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWQgJWMgJTZkIiwgbUZhc3RJbmRleCwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAlYyAlNmQiLCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfQogCiAgICAgY2hhciBub3dJblVuZGVycnVuOwpAQCAtNTkzLDIyICs2MTYsMjcgQEAKICAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAogICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTN4ICUyeCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UiLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICBzYW1wbGVSYXRlKCksCiAKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUF0dHIudXNhZ2UsCisgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsCisKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChtRmluYWxWb2x1bWUpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCkBAIC02MjEsMTEgKzY0OSwyMSBAQAogICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAotCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwCiAgICAgICAgICAgICApOworCisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCBiZWNhdXNlIHRyYWNrIGZyYW1lcyBoYXZlbid0IGJlZW4gcHJlc2VudGVkIHlldC4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTYzMyw4ICs2NzEsNyBAQAogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoCi0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC02NDMsMTYgKzY4MCw3MiBAQAogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBidWZmZXItPnJhdyA9IGJ1Zi5tUmF3OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCAmJiAhaXNTdG9wcGluZygpICYmICFpc1N0b3BwZWQoKSAmJiAhaXNQYXVzZWQoKSkgewotICAgICAgICBBTE9HVigidW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAotICAgICAgICAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOwogICAgIH0KLQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgaW50ZXJjZXB0QnVmZmVyKCpidWZmZXIpOworICAgIFRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworfQorCisvLyBUT0RPOiBjb21wZW5zYXRlIGZvciB0aW1lIHNoaWZ0IGJldHdlZW4gSFcgbW9kdWxlcy4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmludGVyY2VwdEJ1ZmZlcigKKyAgICAgICAgY29uc3QgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBzb3VyY2VCdWZmZXIpIHsKKyAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBzb3VyY2VCdWZmZXIuZnJhbWVDb3VudDsKKyAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsgIC8vIE5vIGF1ZGlvIHRvIGludGVyY2VwdC4KKyAgICAgICAgLy8gQWRkaXRpb25hbGx5IFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcjo6b2J0YWluQnVmZmVyIChjYWxsZWQgYnkgUGF0aFRyYWNrOjpnZXROZXh0QnVmZmVyKQorICAgICAgICAvLyBkb2VzIG5vdCBhbGxvdyAwIGZyYW1lIHNpemUgcmVxdWVzdCBjb250cmFyeSB0byBnZXROZXh0QnVmZmVyCisgICAgfQorICAgIGZvciAoYXV0byYgdGVlUGF0Y2ggOiBtVGVlUGF0Y2hlcykgeworICAgICAgICBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKiBwYXRjaFJlY29yZCA9IHRlZVBhdGNoLnBhdGNoUmVjb3JkLmdldCgpOworCisgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gd3JpdGVGcmFtZXMocGF0Y2hSZWNvcmQsIHNvdXJjZUJ1ZmZlci5pOCwgZnJhbWVDb3VudCk7CisgICAgICAgIC8vIE9uIGJ1ZmZlciB3cmFwLCB0aGUgYnVmZmVyIGZyYW1lIGNvdW50IHdpbGwgYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCwKKyAgICAgICAgLy8gd2hlbiB0aGlzIGhhcHBlbnMgYSBzZWNvbmQgYnVmZmVyIG5lZWRzIHRvIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGxlZnRvdmVyIGF1ZGlvCisgICAgICAgIHNpemVfdCBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuICE9IDAgJiYgZnJhbWVzTGVmdCAhPSAwKSB7CisgICAgICAgICAgICBmcmFtZXNXcml0dGVuICs9CisgICAgICAgICAgICAgICAgd3JpdGVGcmFtZXMocGF0Y2hSZWNvcmQsIHNvdXJjZUJ1ZmZlci5pOCArIGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplLCBmcmFtZXNMZWZ0KTsKKyAgICAgICAgICAgIGZyYW1lc0xlZnQgPSBmcmFtZUNvdW50IC0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgfQorICAgICAgICBBTE9HV19JRihmcmFtZXNMZWZ0ICE9IDAsICIlcyglZCkgUGF0Y2hSZWNvcmQgJWQgY2FuIG5vdCBwcm92aWRlIGJpZyBlbm91Z2ggIgorICAgICAgICAgICAgICAgICAiYnVmZmVyICV6dS8lenUsIGRyb3BwaW5nICV6dSBmcmFtZXMiLCBfX2Z1bmNfXywgbUlkLCBwYXRjaFJlY29yZC0+bUlkLAorICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuLCBmcmFtZUNvdW50LCBmcmFtZXNMZWZ0KTsKKyAgICB9CisgICAgYXV0byBzcGVudCA9IGNlaWw8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgIC8vIEF2ZXJhZ2UgaXMgfjIwdXMgcGVyIHRyYWNrLCB0aGlzIHNob3VsZCB2aXJ0dWFsbHkgbmV2ZXIgYmUgbG9nZ2VkIChMb2dnaW5nIHRha2VzID4yMDB1cykKKyAgICBBTE9HRF9JRihzcGVudCA+IDIwMHVzLCAiJXM6IHRvb2sgJWxsZHVzIHRvIGludGVyY2VwdCAlenUgdHJhY2tzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgc3BlbnQuY291bnQoKSwgbVRlZVBhdGNoZXMuc2l6ZSgpKTsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp3cml0ZUZyYW1lcyhBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIGF1dG8gc3RhdHVzID0gZGVzdC0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICBBTE9HVygiJXMgUGF0aFJlY29yZCBnZXROZXh0QnVmZmVyIGZhaWxlZCB3aXRoIGVycm9yICVkOiAlcyIsCisgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDw9IGZyYW1lQ291bnQpOworICAgIG1lbWNweShwYXRjaEJ1ZmZlci5yYXcsIHNyYywgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgIGF1dG8gZnJhbWVzV3JpdHRlbiA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgZGVzdC0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgIHJldHVybiBmcmFtZXNXcml0dGVuOworfQorCiAvLyByZWxlYXNlQnVmZmVyKCkgaXMgbm90IG92ZXJyaWRkZW4KIAogLy8gRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtNjgyLDYgKzc3NSwxMyBAQAogICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogCiAgICAgLy8gV2UgZG8gbm90IHNldCBkcmFpbmVkIGhlcmUsIGFzIEZhc3RUcmFjayB0aW1lc3RhbXAgbWF5IG5vdCBnbyB0byB2ZXJ5IGxhc3QgZnJhbWUuCisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kuCisgICAgLy8gVE9ETzogQ29uc2lkZXIgd2hldGhlciB0aGUgc2VydmVyIGxhdGVuY3kgbWF5IGJlIHBhc3NlZCBpbiBieSBGYXN0TWl4ZXIKKyAgICAvLyBhcyBhIGNvbnN0YW50IGZvciBhbGwgYWN0aXZlIEZhc3RUcmFja3MuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKTsKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh0cnVlKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCkBAIC03MTAsOCArODEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoInN0YXJ0KCVkKSwgY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CiAKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTczNywxNCArODM3LDE3IEBACiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gU1RPUFBJTkdfMSAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBQQVVTRUQgPT4gU1RPUFBJTkdfMSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlJFU1VNSU5HOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gUkVTVU1JTkcgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFJFU1VNSU5HIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICBBTE9HVigiPyA9PiBBQ1RJVkUgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiA/ID0+IEFDVElWRSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzdGF0ZXMgdG8gcmVzZXQgcG9zaXRpb24gaW5mbyBmb3Igbm9uLW9mZmxvYWRlZC9kaXJlY3QgdHJhY2tzCkBAIC03OTAsMTIgKzg5MywxNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RhcnQoKTsgfSk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0b3AoKQogewotICAgIEFMT0dWKCJzdG9wKCVkKSwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCIsIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTgxOSwxNSArOTI1LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RvcCgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDYsNyArOTUzLDggQEAKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgIGNhc2UgUkVTVU1JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTSU5HOwotICAgICAgICAgICAgQUxPR1YoIkFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC04NTQsMTEgKzk2MiwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gUGF1c2luZyB0aGUgVGVlUGF0Y2ggdG8gYXZvaWQgYSBnbGl0Y2ggb24gdW5kZXJydW4sIGF0IHRoZSBjb3N0IG9mIGJ1ZmZlcmVkIGF1ZGlvIGxvc3MuCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnBhdXNlKCk7IH0pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaCgpCiB7Ci0gICAgQUxPR1YoImZsdXNoKCVkKSIsIG1OYW1lKTsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTg4MCwxMSArOTkwLDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZmx1c2g6IG9mZmxvYWQgZmx1c2giKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG9mZmxvYWQgZmx1c2giLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSB8fCBtU3RhdGUgPT0gU1RPUFBJTkdfMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZsdXNoZWQgaW4gU1RPUFBJTkdfMSBvciAyIHN0YXRlLCBjaGFuZ2Ugc3RhdGUgdG8gQUNUSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKICAgICAgICAgICAgIH0KIApAQCAtOTE0LDYgKzEwMjUsOCBAQAogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CisgICAgLy8gRmx1c2ggdGhlIFRlZSB0byBhdm9pZCBvbiByZXN1bWUgcGxheWluZyBvbGQgZGF0YSBhbmQgZ2xpdGNoaW5nIG9uIHRoZSB0cmFuc2l0aW9uIHRvIG5ldyBkYXRhCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmZsdXNoKCk7IH0pOwogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKQEAgLTk0OSw3ICsxMDYyLDcgQEAKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHRocmVhZCBpcyBkZWFkIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fAogICAgICAgICAgICAgICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKQEAgLTk1OSw2ICsxMDcyLDE5IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwKKyAgICAgICAgaW50IHByb2dyYW1JZCkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8ICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgeworICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKmRpcmVjdE91dHB1dFRocmVhZCA9IHN0YXRpY19jYXN0PERpcmVjdE91dHB1dFRocmVhZCo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBkaXJlY3RPdXRwdXRUaHJlYWQtPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpAQCAtOTY5LDggKzEwOTUsMTAgQEAKICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnIG9wdGlvbkZsYWcKICAgICAgICAgICAgID0gY29uZmlndXJhdGlvbi0+Z2V0T3B0aW9uRmxhZ3MoKTsKICAgICAgICAgaWYgKChvcHRpb25GbGFnICYgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPUFRJT05fRkxBR19DTE9DS19USU1FKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKLSAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLCBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKKyAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKmNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi0+c2V0T3B0aW9uRmxhZ3MoCiAgICAgICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnKG9wdGlvbkZsYWcKQEAgLTk4NSw3ICsxMTEzLDcgQEAKICAgICAgICAgLy8gU2lnbmFsIHRocmVhZCB0byBmZXRjaCBuZXcgdm9sdW1lLgogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAxNyw2ICsxMTQ1LDExIEBACiAgICAgfTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpIHsKKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+ZGVzdHJveSgpOyB9KTsKKyAgICBtVGVlUGF0Y2hlcyA9IHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQogewogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewpAQCAtMTEwNSwxMSArMTIzOCwxNCBAQAogICAgIC8vIHRvIGRldGVjdCB3aGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHBsYXllZC4gSW4gdGhpcyBjYXNlIGZyYW1lc1dyaXR0ZW4gaXNuJ3QKICAgICAvLyB1c2VmdWwgYmVjYXVzZSBpdCBkb2Vzbid0IGFsd2F5cyByZWZsZWN0IHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBpbiB0aGUgaC93CiAgICAgLy8gYnVmZmVycywgcGFydGljdWxhcmx5IGlmIGEgdHJhY2sgaGFzIGJlZW4gcGF1c2VkIGFuZCByZXN1bWVkIGR1cmluZyBkcmFpbmluZwotICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGZyYW1lc1dyaXR0ZW4gJWxsZCIsCisgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgIChsb25nIGxvbmcpbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzLCAobG9uZyBsb25nKWZyYW1lc1dyaXR0ZW4pOwogICAgIGlmIChtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPT0gMCkgewogICAgICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSBmcmFtZXNXcml0dGVuICsgYXVkaW9IYWxGcmFtZXM7Ci0gICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiIKKyAgICAgICAgICAgICAgICAiIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGF1ZGlvSGFsRnJhbWVzICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgYXVkaW9IYWxGcmFtZXMpOwogICAgIH0KIApAQCAtMTE3NSw3ICsxMzExLDggQEAKICAgICBpZiAoaXNUZXJtaW5hdGVkKCkgfHwgbVN0YXRlID09IFBBVVNFRCB8fAogICAgICAgICAgICAgKChmcmFtZXNSZWFkeSgpID09IDApICYmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXRlID09IFNUT1BQRUQpKSkpIHsKLSAgICAgICAgQUxPR1coIlRyYWNrOjpzZXRTeW5jRXZlbnQoKSBpbiBpbnZhbGlkIHN0YXRlICVkIG9uIHNlc3Npb24gJWQgJXMgbW9kZSwgZnJhbWVzUmVhZHkgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgIG1TdGF0ZSwgbVNlc3Npb25JZCwgKG1TaGFyZWRCdWZmZXIgIT0gMCkgPyAic3RhdGljIiA6ICJzdHJlYW0iLCBmcmFtZXNSZWFkeSgpKTsKICAgICAgICAgZXZlbnQtPmNhbmNlbCgpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjQ2LDcgKzEzODMsMTcgQEAKIC8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgIGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKSB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lU3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZVN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvL3VwZGF0ZSBmcmFtZSBtYXAKICAgICBtRnJhbWVNYXAucHVzaCh0cmFja0ZyYW1lc1JlbGVhc2VkLCBzaW5rRnJhbWVzV3JpdHRlbik7CiAKQEAgLTEyNTUsNiArMTQwMiw3IEBACiAgICAgLy8gT3VyIHRpbWVzdGFtcHMgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZSB0cmFjayBpcyBvbiB0aGUgVGhyZWFkIGFjdGl2ZSBsaXN0LgogICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdHJhY2tzIGFyZSBub3QgcmVtb3ZlZCBiZWZvcmUgZnVsbCBkcmFpbi4KICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVTdGFtcDsKKyAgICBib29sIGRyYWluZWQgPSB0cnVlOyAvLyBkZWZhdWx0IGFzc3VtZSBkcmFpbmVkLCBpZiBubyBzZXJ2ZXIgaW5mbyBmb3VuZAogICAgIGJvb2wgY2hlY2tlZCA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fTUFYIC0gMTsKICAgICAgICAgICAgIGkgPj0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsgLS1pKSB7CkBAIC0xMjYzLDIxICsxNDExLDY0IEBACiAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPSBtRnJhbWVNYXAuZmluZFgobG9jYWwubVBvc2l0aW9uW2ldKTsKICAgICAgICAgICAgIC8vIGNoZWNrIGRyYWluIHN0YXRlIGZyb20gdGhlIGxhdGVzdCBzdGFnZSBpbiB0aGUgcGlwZWxpbmUuCiAgICAgICAgICAgICBpZiAoIWNoZWNrZWQgJiYgaSA8PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKKyAgICAgICAgICAgICAgICBkcmFpbmVkID0gbG9jYWwubVBvc2l0aW9uW2ldID49IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CiAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFjaGVja2VkKSB7IC8vIG5vIHNlcnZlciBpbmZvLCBhc3N1bWUgZHJhaW5lZC4KLSAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCh0cnVlKTsKLSAgICB9CisKKyAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXREcmFpbmVkKGRyYWluZWQpOwogICAgIC8vIFNldCBjb3JyZWN0aW9uIGZvciBmbHVzaGVkIGZyYW1lcyB0aGF0IGFyZSBub3QgYWNjb3VudGVkIGZvciBpbiByZWxlYXNlZC4KICAgICBsb2NhbC5tRmx1c2hlZCA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKTsKICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gIWRyYWluZWQ7CisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVTdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSk7CisKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh1c2VUcmFja1RpbWVzdGFtcCk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6QXVkaW9WaWJyYXRpb25Db250cm9sbGVyOjptdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgKnJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6QXVkaW9WaWJyYXRpb25Db250cm9sbGVyOjp1bm11dGUoCisgICAgICAgIC8qb3V0Ki8gYm9vbCAqcmV0KSB7CisgICAgKnJldCA9IGZhbHNlOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIC8vIExvY2sgZm9yIHVwZGF0aW5nIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICBpZiAoKG1UcmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tUaHJlYWQtPm1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtVHJhY2stPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok91dHB1dFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6T3V0cHV0VHJhY2soCiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCkBAIC0xMjk5LDkgKzE0OTAsOSBAQAogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCAiCisgICAgICAgIEFMT0dWKCIlcygpOiBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgogICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1DYmxrLCBtQnVmZmVyLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwpAQCAtMTMxMSw3ICsxNTAyLDggQEAKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTZW5kTGV2ZWwoMC4wKTsKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgfQogfQogCkBAIC0xMzQyLDcgKzE1MzQsNyBAQAogICAgIG1BY3RpdmUgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKQEAgLTEzNzMsOCArMTU2NSw5IEBACiAgICAgICAgICAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9idGFpbkJ1ZmZlcigmbU91dEJ1ZmZlciwgd2FpdFRpbWVMZWZ0TXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3V0cHV0IGJ1ZmZlcnM7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCltVGhyZWFkSW9IYW5kbGUsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyRnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDEwLDggKzE2MDMsOSBAQAogICAgICAgICAgICAgICAgIGlmIChwSW5CdWZmZXIgIT0gJmluQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDI5LDExICsxNjIzLDE0IEBACiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5yYXcgPSBwSW5CdWZmZXItPm1CdWZmZXI7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIGFkZGluZyBvdmVyZmxvdyBidWZmZXIgJXp1IiwgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAvLyBhdWRpbyBkYXRhIGlzIGNvbnN1bWVkIChzdG9yZWQgbG9jYWxseSk7IHNldCBmcmFtZUNvdW50IHRvIDAuCisgICAgICAgICAgICAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB0aHJlYWQgJWQgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gZXJyb3IgZm9yIHRoaXMuCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQ0LDcgKzE2NDEsNyBAQAogICAgICAgICBzdG9wKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG91dHB1dEJ1ZmZlckZ1bGw7CisgICAgcmV0dXJuIGZyYW1lcyAtIGluQnVmZmVyLmZyYW1lQ291bnQ7ICAvLyBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkLgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0CkBAIC0xNDk2LDYgKzE2OTMsMTAgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFRyYWNrIgorCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLApAQCAtMTUwNCwyMSArMTcwNSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCi0gICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKLSAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpwbGF5YmFja1RocmVhZCwgdGltZW91dCkKIHsKLSAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKLSAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwotCi0gICAgQUxPR1YoIlBhdGNoVHJhY2sgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KQEAgLTE1MjgsNyArMTcyNiw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrOjpzdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTE1NDIsMTEgKzE3NDAsMTEgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKLSAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJQYXRjaFRyYWNrKCkgJXAgZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCVkKTogZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTU1Nyw3ICsxNzU1LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xNTkyLDcgKzE3OTAsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCiB7CiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICBBTE9HVygiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgc3RhcnQoKTsKICAgICB9CiB9CkBAIC0xNjAwLDYgKzE3OTgsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBSZWNvcmQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpSZWNvcmRIYW5kbGUoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrKQpAQCAtMTYxNSw3ICsxODE1LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgbVJlY29yZFRyYWNrLT5zdGFydCgoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdClldmVudCwgKGF1ZGlvX3Nlc3Npb25fdCkgdHJpZ2dlclNlc3Npb24pKTsKIH0KQEAgLTE2MjYsMTggKzE4MjYsMzIgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RvcF9ub252aXJ0dWFsKCkgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0b3AoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIG1SZWNvcmRUcmFjay0+c3RvcCgpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtUmVjb3JkVHJhY2stPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKSk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChtUmVjb3JkVHJhY2stPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90PihkaXJlY3Rpb24pKSk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkVHJhY2siCiAKIC8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKQEAgLTE2NzIsMTggKzE4ODYsMjAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAotICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOwotICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCi0gICAgLy8KLSAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKLSAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKLSAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCi0gICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzRGlyZWN0KCkpIHsKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgICAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IFJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LApAQCAtMTY5NCwxMiArMTkxMCwyMCBAQAogICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogb25seSBOb3JtYWwgUmVjb3JkIGhhcyB0aW1lc3RhbXBzIChGYXN0IFJlY29yZCBkb2VzIG5vdCkuCisgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkKKyAgICAgICAgICAgICsgIl9SIik7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewotICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQpAQCAtMTc1NiwxNyArMTk4MCwzNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwotICAgICAgICB9CisgICAgICAgIHRyYWNrX3N0YXRlIHByaW9yU3RhdGUgPSBtU3RhdGU7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7IC8vIG1vdmUgbVN0YXRlIHRvIFNUT1BQRUQsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgICAgIC8vIEFQTSBwb3J0aWQvY2xpZW50IG1hbmFnZW1lbnQgZG9uZSBvdXRzaWRlIG9mIGxvY2suCisgICAgICAgIC8vIE5PVEU6IGlmIHRocmVhZCBkb2Vzbid0IGV4aXN0LCB0aGUgaW5wdXQgZGVzY3JpcHRvciBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZFOiAgICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgc3RpbGwgYWN0aXZlCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCBzdWNjZXNzZnVsbHkgY2FsbGVkCisgICAgICAgICAgICBjYXNlIFBBVVNJTkc6ICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygc3RvcCgpIHBhdXNpbmcgKHN0aWxsIGFjdGl2ZSkKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYW5kIHN0YXJ0SW5wdXQgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIGNhc2UgUEFVU0VEOiAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgSURMRTogICAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVE9QUEVEOiAgICAvLyB1bmV4cGVjdGVkIChkZXN0cm95ZWQpCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBwcmlvciBzdGF0ZTogJWQiLCBfX2Z1bmNfXywgbUlkLCBwcmlvclN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNzgzLDMxICsyMDI0LDUwIEBACiB9CiAKIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgICAgIElkIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgIFMgIEZsYWdzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgU291cmNlICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFNlcnZlciBGcm1DbnQgRnJtUmR5IFNpbCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2ZCAlNnUgJTd1ICU3dSAgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xODM3LDYgKzIwOTcsMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xODUwLDYgKzIxMjAsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTE4NjQsNiArMjE0MywzMSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoUmVjb3JkIgorCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzEsMjAgKzIxNzUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAotICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLAorICAgICAgICAgICAgICAgIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgUGF0Y2hUcmFja0Jhc2UobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpyZWNvcmRUaHJlYWQsIHRpbWVvdXQpCiB7Ci0gICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwotICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7Ci0KLSAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KQEAgLTE4OTcsMTIgKzIxOTksMTIgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKICAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICAgIiVzKCVkKTogbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xOTEzLDcgKzIyMTUsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE5MzIsNyArMjIzNCw5IEBACiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok1tYXBUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6Ok1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKQEAgLTE5NDAsMTMgKzIyNDQsMTQgQEAKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgaXNPdXQsCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAogICAgICAgICBtUGlkKHBpZCksIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQpAQCAtMTk2Myw3ICsyMjY4LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTk5NCwxOSArMjI5OSwyOCBAQAogewogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgU2Vzc2lvbiBQb3J0IElkICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlIEZsYWdzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXQoKSA/ICJVc2cgQ1QiOiAiU291cmNlIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlN3UgJTA4WCAlMDhYICU2dSAweCUwM1ggIiwKICAgICAgICAgICAgIG1QaWQsCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLmZsYWdzKTsKKyAgICBpZiAoaXNPdXQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlM3ggJTJ4IiwgbUF0dHIudXNhZ2UsIG1BdHRyLmNvbnRlbnRfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ4IiwgbUF0dHIuc291cmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAzOGMzYzAyLi42ZWYxOWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtOTcsOCArOTcsNDIgQEAKICNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAogICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAorLy8gTG9nIHRoZSBkaWZmZXJlbmNlIGJld3RlZW4gZnJhbWVzIHByZXNlbnRlZCBieSBIQUwgYW5kIGZyYW1lcyB3cml0dGVuIHRvIEhBTCBvdXRwdXQgc2luaywKKy8vIGRpdmlkZWQgYnkgdGhlIHNhbXBsZSByYXRlLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19MQVRFTkNZKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfTEFURU5DWT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIG92ZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfT1ZFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX09WRVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBpbmZvLiBUaGlzIGN1cnJlbnRseSBpbmNsdWRlcyB0eXBlLCBmcmFtZUNvdW50LCBhbmQgc2FtcGxlUmF0ZS4KKy8vIFBhcmFtZXRlciB0eXBlIGlzIHRocmVhZF9pbmZvX3QgYXMgZGVmaW5lZCBpbiBOQkxvZy5oLgorI2RlZmluZSBMT0dfVEhSRUFEX0lORk8oaW5mbykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpIGRvIHtOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9QQVJBTVM+KHBhcmFtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfVU5ERVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9VTkRFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHdhcm11cCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfV0FSTVVQX1RJTUUobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XQVJNVVBfVElNRT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgYSB0eXBlZCBlbnRyeSB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQncyB3b3JrIHRpbWUgaW4gbmFub3NlY29uZHMuCisvLyBQYXJhbWV0ZXIgbnMgc2hvdWxkIGJlIG9mIHR5cGUgdWludDMyX3QuCisjZGVmaW5lIExPR19XT1JLX1RJTUUobnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XT1JLX1RJTUU+KG5zKTsgfSB3aGlsZSAoMCkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBjaGVjayBmb3IgbnVsbHB0ciBldmVyeSB0aW1lLiBBbHNvIHJlZHVjZXMgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IGxvZ2dpbmcgbWFjcm8gYWJvdmUKKy8vIGVhY2ggdGltZSB3ZSB3YW50IHRvIGxvZyBhIG5ldyB0eXBlLgogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwogfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggNGM5MGJiNS4uOWU0ZWViYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0xMSw5ICsxMSwxMCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTIyLDExICsyMywxNSBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliYXVkaW9jbGllbnQgXAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCiAgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJtZWRpYW1ldHJpY3MgXAotICAgIGxpYmVmZmVjdHNjb25maWcKKyAgICBsaWJtZWRpYXV0aWxzIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnIFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CisKK0xPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpAQCAtNDgsNiArNTMsNyBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCisgICAgbGliYXVkaW9wb2xpY3kgXAogICAgIGxpYnNvdW5kdHJpZ2dlcgogCiBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKQEAgLTcyLDkgKzc4LDExIEBACiBlbmRpZiAjIGlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKQEAgLTgyLDkgKzkwLDkgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmJpbmRlciBsaWJoaWRsYmFzZSBsaWJ4bWwyCiAKK2lmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiBMT0NBTF9DRkxBR1MgKz0gLURVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCiBlbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIApAQCAtMTEwLDggKzExOCwxMSBAQAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDQ4MTJiMWYuLmFjYmZjOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtNTgsMjcgKzU4LDE1IEBACiAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgQVBJX0lOUFVUX0lOVkFMSUQgPSAtMSwKICAgICAgICAgQVBJX0lOUFVUX0xFR0FDWSAgPSAwLC8vIGUuZy4gYXVkaW8gcmVjb3JkaW5nIGZyb20gYSBtaWNyb3Bob25lCi0gICAgICAgIEFQSV9JTlBVVF9NSVhfQ0FQVFVSRSwvLyB1c2VkIGZvciAicmVtb3RlIHN1Ym1peCIsIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKKyAgICAgICAgQVBJX0lOUFVUX01JWF9DQVBUVVJFLC8vIHVzZWQgZm9yICJyZW1vdGUgc3VibWl4IiBsZWdhY3kgbW9kZSAobm8gREFQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKICAgICAgICAgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUsLy8gdXNlZCBmb3IgcGxhdGZvcm0gYXVkaW8gcmVyb3V0aW5nLCB3aGVyZSBtaXhlcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBleHRlcm5hbCBhbmQgZHluYW1pY2FsbHkgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIHdoaWNoIHJlcm91dGUgYXVkaW8gbWl4ZXMKKyAgICAgICAgQVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSywgIC8vIHVzZWQgZm9yIHBsYXliYWNrIGNhcHR1cmUgd2l0aCBhIE1lZGlhUHJvamVjdGlvbgogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgIGVudW0gewotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSA9IDAsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMID0gKDEgPDwgMCksICAgICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGNhbGwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUgPSAoMSA8PCAxKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGFub3RoZXIgY2FwdHVyZQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCA9ICgxIDw8IDIpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBob3R3b3JkCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUID0gKDEgPDwgMyksICAgLy8gcHJlLWVtcHRlZCBzb21lb25lCi0gICAgICAgICAgICAgICAgLy8gTkI6IHByZWVtcHQgaXMgbWFya2VkIG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIG90aGVycyBhcmUgb24gZmFpbGluZyBjYWxscwotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCA9ICgxIDw8IDQpLAotCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKLSAgICB9OwotCi0gICAgdHlwZWRlZiB1aW50MzJfdCBjb25jdXJyZW5jeV90eXBlX19tYXNrX3Q7Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CiAgICAgLy8KQEAgLTg5LDE0ICs3NywxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIHBob25lIHN0YXRlLiBWYWxpZCBwaG9uZXMgc3RhdGVzIGFyZSBkZWZpbmVkIGJ5IGF1ZGlvX21vZGVfdAogICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOwogICAgIC8vIGZvcmNlIHVzaW5nIGEgc3BlY2lmaWMgZGV2aWNlIGNhdGVnb3J5IGZvciB0aGUgc3BlY2lmaWVkIHVzYWdlCkBAIC0xMjIsMTkgKzExMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vIHJlcXVlc3QgYW4gaW5wdXQgYXBwcm9wcmlhdGUgZm9yIHJlY29yZCBmcm9tIHRoZSBzdXBwbGllZCBkZXZpY2Ugd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTE0NywxNiArMTMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8KICAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKQEAgLTE4MSw2ICsxNjEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpID0gMDsKKwogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCkBAIC0yMDYsNiArMTk5LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjI4LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyNTAsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApID0gMDsKIH07CiAKIApAQCAtMzI0LDExICszMzgsNiBAQAogICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKLSAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOwotCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOwogCkBAIC0zNTMsMTUgKzM2MiwyMCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CisKICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiBleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0ZmQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEwIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgICJuYW1lIjogImF1ZGlvcG9saWN5X3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgICJuYW1lIjogInN5c3RlbWF1ZGlvX3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI1YjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg5NjdlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKLS8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgotI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCi0KLWVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgU1RSQVRFR1lfTUVESUEsCi0gICAgU1RSQVRFR1lfUEhPTkUsCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAotICAgIFNUUkFURUdZX0RUTUYsCi0gICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCi0gICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKLSAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgTlVNX1NUUkFURUdJRVMKLX07Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggZmMwMTJhMi4uNDhiNTI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTIwLDYgKzIwLDIzIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVm9sdW1lU291cmNlIGlzIHRoZSBkaXNjcmltaW5lbnQgZm9yIHZvbHVtZSBtYW5hZ2VtZW50IG9uIGFuIG91dHB1dC4KKyAqIEl0IHVzZWQgdG8gYmUgdGhlIHN0cmVhbSB0eXBlIGJ5IGxlZ2FjeSwgaXQgbWF5IGJlIGhvc3Qgdm9sdW1lIGdyb3VwIG9yIGEgdm9sdW1lIGN1cnZlcyBpZgorICogd2UgYWxsb3cgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGN1cnZlIHBlciB2b2x1bWUgZ3JvdXAuCisgKi8KK2VudW0gVm9sdW1lU291cmNlIDogc3RkOjp1bmRlcmx5aW5nX3R5cGU8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnR5cGU7CitzdGF0aWMgY29uc3QgVm9sdW1lU291cmNlIFZPTFVNRV9TT1VSQ0VfTk9ORSA9IHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oQVVESU9fU1RSRUFNX0RFRkFVTFQpOworCitzdGF0aWMgaW5saW5lIFZvbHVtZVNvdXJjZSBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHN0cmVhbSk7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiAvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCiAjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCiAKQEAgLTEzNCw2ICsxNTEsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDliZDY4ZTEuLjYwNWZjMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0xNyw5ICsxNywyMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdGF0aWMgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGRlZmF1bHRBdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgZ0R5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKIAorc3RhdGljIGNvbnN0IHVpbnQzMl90IFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZID0gNTAwMDsKKwogLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4KIC8vIERvIG5vdCBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggMTkyMDAwCkBAIC0zMiwxNCArNDMsNiBAQAogI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCBGQ0NfOAogCiAvKioKLSAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZwotICogYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dHMoKQotICovCi0jZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKLSAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCi0KLQotLyoqCiAgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQogICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbwogICovCkBAIC02OCwyMyArNzEsNiBAQAogfQogCiAvKioKLSAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKICAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQogICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKICAqCkBAIC0xMDEsNiArODcsMjEgQEAKIH0KIAogLyoqCisgKiBDaGVjayB3aGV0aGVyIGF1ZGlvIGRldmljZSBoYXMgZW5jb2RpbmcgY2FwYWJpbGl0eS4KKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBkZXZpY2UgaGFzIGVuY29kaW5nIGNhcGFiaWxpdHksIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfaGFzX2VuY29kaW5nX2NhcGFiaWxpdHkoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIGEgZ2l2ZW4gYXVkaW8gc291cmNlIGZvciBjYXB0dXJlLiBUaGUgcHJpb3JpdHkgaXMgdXNlZCB3aGVuIG1vcmUgdGhhbiBvbmUKICAqIGNhcHR1cmUgc2Vzc2lvbiBpcyBhY3RpdmUgb24gYSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gZGV0ZXJtaW5lIHdoaWNoIHNlc3Npb24gZHJpdmVzIHJvdXRpbmcgYW5kCiAgKiBlZmZlY3QgY29uZmlndXJhdGlvbi4KQEAgLTEwOCw3ICsxMDksMTAgQEAKICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gY29uc2lkZXIuIFZhbGlkIHNvdXJjZXMgYXJlOgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTgogICogLSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSCisgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRQorICogLSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQKICAqIC0gQVVESU9fU09VUkNFX01JQworICogLSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UKICAqIC0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCiAgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTgogICogLSBBVURJT19TT1VSQ0VfSE9UV09SRApAQCAtMTIxLDEwICsxMjUsMTYgQEAKIHsKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIHJldHVybiA5OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgcmV0dXJuIDU7CisgICAgICAgIHJldHVybiA4OworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKKyAgICAgICAgcmV0dXJuIDY7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgICAgICByZXR1cm4gNTsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKICAgICAgICAgcmV0dXJuIDQ7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIHJldHVybiAzOwpAQCAtMTUyLDMgKzE2MiwyNSBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0MSA9PSBmb3JtYXQyOwogfQorCisvKioKKyAqIEBicmllZiBoYXNTdHJlYW0gY2hlY2tzIGlmIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiBvZiBzdHJlYW0gdHlwZXMgdG8gY29uc2lkZXIuCisgKiBAcGFyYW0gc3RyZWFtVHlwZSB0byBjb25zaWRlcgorICogQHJldHVybiB0cnVlIGlmIHZvaWNlIHN0cmVhbSBpcyBmb3VuZCBpbiB0aGUgZ2l2ZW4gc3RyZWFtcywgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIHJldHVybiBzdGQ6OmZpbmQoYmVnaW4oc3RyZWFtcyksIGVuZChzdHJlYW1zKSwgc3RyZWFtVHlwZSkgIT0gZW5kKHN0cmVhbXMpOworfQorCisvKioKKyAqIEBicmllZiBoYXNWb2ljZVN0cmVhbSBjaGVja3MgaWYgYSB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiB0byBjb25zaWRlci4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzVm9pY2VTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykKK3sKKyAgICByZXR1cm4gaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTAzN2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9HYWluLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BhdGNoLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BvcnQuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1JvdXRlLmNwcCIsCisgICAgICAgICJzcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0RldmljZURlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvSHdNb2R1bGUuY3BwIiwKKyAgICAgICAgInNyYy9JT1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9TZXJpYWxpemVyLmNwcCIsCisgICAgICAgICJzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAiLAorICAgICAgICAic3JjL1R5cGVDb252ZXJ0ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJtZWRpYSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmF1ZGlvcG9saWN5Y29tbW9uIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRjNWNjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvR2Fpbi5jcHAgXAotICAgIHNyYy9Id01vZHVsZS5jcHAgXAotICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCi0gICAgc3JjL0F1ZGlvUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1JvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCi0gICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKLSAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIFwKLSAgICBzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBcCi0gICAgc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvVm9sdW1lQ3VydmUuY3BwIFwKLSAgICBzcmMvVHlwZUNvbnZlcnRlci5jcHAgXAotICAgIHNyYy9BdWRpb1Nlc3Npb24uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJtZWRpYQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzIFwKLSAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0KLWlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBzcmMvU2VyaWFsaXplci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSBcCi0KLWVsc2UKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCi0gICAgc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvR2FpbnMuY3BwCi0KLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IGY4NmU3NWEuLmE5NDhlYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtMzgsNyArMzgsNyBAQAogY2xhc3MgQXVkaW9Sb3V0ZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Sb3V0ZT4gPgogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAppbmRleCA0YWM1MDhmLi40YWY5M2UxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0xOCw3ICsxOCw5IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MywxNyArNTUsNDEgQEAKICAgICBpbnQgZ2V0TWF4UmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5tYXhfcmFtcF9tczsgfQogCiAgICAgLy8gVE9ETzogcmVtb3ZlIGR1bXAgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CiAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogCisgICAgdm9pZCBzZXRVc2VGb3JWb2x1bWUoYm9vbCBjYW5Vc2VGb3JWb2x1bWUpIHsgbVVzZUZvclZvbHVtZSA9IGNhblVzZUZvclZvbHVtZTsgfQorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbVVzZUZvclZvbHVtZTsgfQorCiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW4gJmdldEdhaW4oKSBjb25zdCB7IHJldHVybiBtR2FpbjsgfQogCiBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKICAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlRm9yVm9sdW1lID0gZmFsc2U7Cit9OworCitjbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPgoreworcHVibGljOgorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ2FpbjogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChnYWluLT5jYW5Vc2VGb3JWb2x1bWUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGFkZChjb25zdCBzcDxBdWRpb0dhaW4+IGdhaW4pCisgICAgeworICAgICAgICBwdXNoX2JhY2soZ2Fpbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEludGVyZmFjZSBmb3IgSS9PIGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZXh0CisgKiBjYW4gYmUgcXVlcmllZCBhbmQgdXBkYXRlZC4KKyAqLworY2xhc3MgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSgpIHt9OworCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1dG8gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZSA9CisgICAgICAgIGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIGZpbHRlciwgdHJ1ZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICBhY3RpdmUgPSBhY3RpdmVDbGllbnRzLnNpemUoKSA+IDA7CisgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmVDbGllbnRzLnNpemUoKSA9PSBhY3RpdmVDbGllbnRzV2l0aFJvdXRlLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZVswXS0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0NvbGxlY3Rpb24mIGlvQ29sbGVjdGlvbiwgRmlsdGVyIGZpbHRlciwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlvQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIGRlc2MgPSBpb0NvbGxlY3Rpb24udmFsdWVBdChpKTsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGN1ckRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoZGVzYywgZmlsdGVyLCBhY3RpdmUsIGRldmljZXMpOworICAgICAgICBpZiAoYWN0aXZlICYmIGN1ckRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlID0gY3VyRGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggYjI1ZDZkNC4uODAzY2ZhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTE2LDM2ICsxNiw0NSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbi5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChtRGV2aWNlICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgbURldmljZS0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkU7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisgICAgdm9pZCBzZXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgeyBtRGV2aWNlID0gZGV2aWNlOyB9CisgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgeworICAgICAgICByZXR1cm4gbVByb2ZpbGUgIT0gbnVsbHB0ciA/IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkgOiAgRGV2aWNlVmVjdG9yKCk7IH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCisgICAgQXVkaW9NaXggICAgICAgICAgICAqbVBvbGljeU1peCA9IG51bGxwdHI7ICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNTUsNDMgKzY0LDUwIEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gZ2V0UHJlZW1wdGVkU2Vzc2lvbnMoKSBjb25zdDsKICAgICBib29sIGhhc1ByZWVtcHRlZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwogICAgIHZvaWQgY2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50ID4gMDsgfQogICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0OwotICAgIHN0YXR1c190IGFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gZ2V0QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisgICAgaW50MzJfdCBhY3RpdmVDb3VudCgpIHsgcmV0dXJuIG1HbG9iYWxBY3RpdmVDb3VudDsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdDsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KTsKICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkLgotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KDEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpCiAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZAotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSkKICAgICB2b2lkIHN0b3AoKTsKICAgICB2b2lkIGNsb3NlKCk7CiAKLXByaXZhdGU6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKLSAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0Ci0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiAgICAgICAgbVNlc3Npb25zOworICAgIFJlY29yZENsaWVudFZlY3RvciBnZXRDbGllbnRzRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCwgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgdm9pZCBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KKyAgICB2b2lkIGFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisKKyAgICB2b2lkIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oaW50IGV2ZW50LCBjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKKworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURldmljZSA9IG51bGxwdHI7IC8qKjwgY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8gKi8KKwogICAgIC8vIEJlY2F1c2UgYSBwcmVlbXB0aWJsZSBjYXB0dXJlIHNlc3Npb24gY2FuIHByZWVtcHQgYW5vdGhlciBvbmUsIHdlIGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3AKICAgICAvLyBzaXR1YXRpb24gd2VyZSBlYWNoIHNlc3Npb24gaXMgYWxsb3dlZCB0byByZXN0YXJ0IGFmdGVyIGJlaW5nIHByZWVtcHRlZCwKICAgICAvLyB0aHVzIHByZWVtcHRpbmcgdGhlIG90aGVyIG9uZSB3aGljaCByZXN0YXJ0cyBhbmQgc28gb24uCkBAIC05OSw3ICsxMTUsOSBAQAogICAgIC8vIGEgcGFydGljdWxhciBpbnB1dCBzdGFydGVkIGFuZCBwcmV2ZW50IHByZWVtcHRpb24gb2YgdGhpcyBhY3RpdmUgaW5wdXQgYnkgdGhpcyBzZXNzaW9uLgogICAgIC8vIFdlIGFsc28gaW5oZXJpdCBzZXNzaW9ucyBmcm9tIHRoZSBwcmVlbXB0ZWQgaW5wdXQgdG8gYXZvaWQgYSAzIHdheSBwcmVlbXB0aW9uIGxvb3AgZXRjLi4uCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVByZWVtcHRlZFNlc3Npb25zOwotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKQEAgLTExMSwxOSArMTI5LDMxIEBACiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogCiAgICAgLy8gY291bnQgYWN0aXZlIGNhcHR1cmUgc2Vzc2lvbnMgdXNpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWQgZGV2aWNlcy4KLSAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCBpcyBwYXNzZWQKLSAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSBjb25zdDsKKyAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBlbXB0eSB2ZWN0b3IgaXMgcGFzc2VkCisgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCiAgICAgICogT25seSBjb25zaWRlcnMgaW5wdXRzIGZyb20gcGh5c2ljYWwgZGV2aWNlcyAoZS5nLiBtYWluIG1pYywgaGVhZHNldCBtaWMpIHdoZW4KICAgICAgKiBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCiAgICAgICovCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcworICAgICogZGV2aWNlLgorICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgKiBAcGFyYW0gZGlzY29ubmVjdGVkRGV2aWNlIGRldmljZSB0byBiZSBkaXNjb25uZWN0ZWQKKyAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCA1ZTVkMzhiLi43MDRmNDA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xNiw1NSArMTYsMjM0IEBACiAKICNwcmFnbWEgb25jZQogCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgIkF1ZGlvU291cmNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSU9Qcm9maWxlOwogY2xhc3MgQXVkaW9NaXg7CiBjbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7CisKK2NsYXNzIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BY3Rpdml0eVRyYWNraW5nKCkgPSBkZWZhdWx0OworICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eUNvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluUGFzdE1zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3lzVGltZSA9PSAwKSB7CisgICAgICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lKSA8IGluUGFzdE1zKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZpdHlDb3VudCkgPCAwKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogaW52YWxpZCBkZWx0YSAlZCwgcmVmQ291bnQgJWQiLCBfX2Z1bmNfXywgZGVsdGEsIG1BY3Rpdml0eUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgaWYgKCFtQWN0aXZpdHlDb3VudCkgeworICAgICAgICAgICAgc2V0U3RvcFRpbWUoc3lzdGVtVGltZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KKyAgICBuc2Vjc190IGdldFN0b3BUaW1lKCkgY29uc3QgeyByZXR1cm4gbVN0b3BUaW1lOyB9CisgICAgdm9pZCBzZXRTdG9wVGltZShuc2Vjc190IHN0b3BUaW1lKSB7IG1TdG9wVGltZSA9IHN0b3BUaW1lOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CisgICAgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBY3Rpdml0eUNvdW50OiAlZCwgU3RvcFRpbWU6ICUiIFBSSWQ2NCAiLCAiLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvdW50KCksIGdldFN0b3BUaW1lKCkpOworICAgIH0KK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworICAgIG5zZWNzX3QgbVN0b3BUaW1lID0gMDsKK307CisKKy8qKgorICogQGJyaWVmIFZvbHVtZUFjdGl2aXR5OiBpdCB0cmFja3MgdGhlIGFjdGl2aXR5IGZvciB2b2x1bWUgcG9saWN5ICh2b2x1bWUgaW5kZXgsIG11dGUsCisgKiBtZW1vcml6ZSBwcmV2aW91cyBzdG9wLCBhbmQgc3RvcmUgbXV0ZSBpZiBpbmNvbXBhdGlibGUgZGV2aWNlIHdpdGggYW5vdGhlciBzdHJhdGVneS4KKyAqLworY2xhc3MgVm9sdW1lQWN0aXZpdHkgOiBwdWJsaWMgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIGJvb2wgaXNNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1NdXRlQ291bnQgPiAwOyB9CisgICAgaW50IGdldE11dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1NdXRlQ291bnQ7IH0KKyAgICBpbnQgaW5jTXV0ZUNvdW50KCkgeyByZXR1cm4gKyttTXV0ZUNvdW50OyB9CisgICAgaW50IGRlY011dGVDb3VudCgpIHsgcmV0dXJuIG1NdXRlQ291bnQgPiAwID8gLS1tTXV0ZUNvdW50IDogLTE7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICBBY3Rpdml0eVRyYWNraW5nOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiwgVm9sdW1lOiAlLjAzZiwgTXV0ZUNvdW50OiAlMDJkXG4iLCBtQ3VyVm9sdW1lRGIsIG1NdXRlQ291bnQpOworICAgIH0KKyAgICB2b2lkIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYikgeyBtQ3VyVm9sdW1lRGIgPSB2b2x1bWVEYjsgfQorICAgIGZsb2F0IGdldFZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJWb2x1bWVEYjsgfQorCitwcml2YXRlOgorICAgIGludCBtTXV0ZUNvdW50ID0gMDsgLyoqPCBtdXRlIHJlcXVlc3QgY291bnRlciAqLworICAgIGZsb2F0IG1DdXJWb2x1bWVEYiA9IE5BTjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbiBkQi4gKi8KK307CisvKioKKyAqIE5vdGU6IHZvbHVtZSBhY3Rpdml0aWVzIHNoYWxsIGJlIGluZGV4ZWQgYnkgQ3VydmVzSWQgaWYgd2Ugd2FudCB0byBhbGxvdyBtdWx0aXBsZQorICogY3VydmVzIHBlciB2b2x1bWUgZ3JvdXAsIGluZmVycmluZyBhIG11dGUgbWFuYWdlbWVudCBvciB2b2x1bWUgYmFsYW5jaW5nIGJldHdlZW4gSFcgYW5kIFNXIGlzCisgKiBkb25lCisgKi8KK3VzaW5nIFZvbHVtZUFjdGl2aXRpZXMgPSBzdGQ6Om1hcDxWb2x1bWVTb3VyY2UsIFZvbHVtZUFjdGl2aXR5PjsKKworLyoqCisgKiBAYnJpZWYgVGhlIEFjdGl2aXR5IGNsYXNzOiBpdCB0cmFja3MgdGhlIGFjdGl2aXR5IGZvciB2b2x1bWUgcG9saWN5ICh2b2x1bWUgaW5kZXgsIG11dGUsCisgKiBtZW1vcml6ZSBwcmV2aW91cyBzdG9wLCBhbmQgc3RvcmUgbXV0ZSBpZiBpbmNvbXBhdGlibGUgZGV2aWNlIHdpdGggYW5vdGhlciBzdHJhdGVneS4KKyAqIEhhdmluZyB0aGlzIGNsYXNzIHByZXZlbnRzIGZyb20gbG9vcGluZyBvbiBhbGwgYXR0cmlidXRlcyAobGVnYWN5IHN0cmVhbXMpIG9mIHRoZSBzdHJhdGVneQorICovCitjbGFzcyBSb3V0aW5nQWN0aXZpdHkgOiBwdWJsaWMgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZvaWQgc2V0TXV0ZWRCeURldmljZSggYm9vbCBpc011dGVkKSB7IG1Jc011dGVkQnlEZXZpY2UgPSBpc011dGVkOyB9CisgICAgYm9vbCBpc011dGVkQnlEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNNdXRlZEJ5RGV2aWNlOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKKyAgICB9Citwcml2YXRlOgorICAgIC8qKgorICAgICAqIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgZGV2aWNlIHNlbGVjdGlvbi4KKyAgICAgKiBTZWUgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICAgKi8KKyAgICBib29sIG1Jc011dGVkQnlEZXZpY2UgPSBmYWxzZTsKK307Cit1c2luZyBSb3V0aW5nQWN0aXZpdGllcyA9IHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgUm91dGluZ0FjdGl2aXR5PjsKIAogLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KLWNsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICAsIHB1YmxpYyBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4KIHsKIHB1YmxpYzoKICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBkZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbURldmljZXM7IH0KKyAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsgcmV0dXJuIG1EZXZpY2VzOyB9CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOwogCi0gICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0U3RvcFRpbWUgc2V0IHRoZSBzdG9wIHRpbWUgZHVlIHRvIHRoZSBjbGllbnQgc3RvcHBhZ2Ugb3IgYSByZSByb3V0aW5nIG9mIHRoaXMKKyAgICAgKiBjbGllbnQKKyAgICAgKiBAcGFyYW0gY2xpZW50IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gc3lzVGltZSB3aGVuIHRoZSBjbGllbnQgc3RvcHBlZC93YXMgcmVyb3V0ZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN0b3BUaW1lKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgbnNlY3NfdCBzeXNUaW1lKTsKKworICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIGNsaWVudC0+YWN0aXZlKCkgc3RhdGUgYW5kIHRoZSBvdXRwdXQgZGVzY3JpcHRvcidzIGdsb2JhbCBhY3RpdmUgY291bnQsCisgICAgICogYWxvbmcgd2l0aCB0aGUgc3RyZWFtIGFjdGl2ZSBjb3VudCBhbmQgbUFjdGl2ZUNsaWVudHMuCisgICAgICogVGhlIGNsaWVudCBtdXN0IGJlIHByZXZpb3VzbHkgYWRkZWQgYnkgdGhlIGJhc2UgY2xhc3MgYWRkQ2xpZW50KCkuCisgICAgICogSW4gY2FzZSBvZiBkdXBsaWNhdGluZyB0aHJlYWQsIGNsaWVudCBzaGFsbCBiZSBhZGRlZCBvbiB0aGUgZHVwbGljYXRlZCB0aHJlYWQsIG5vdCBvbiB0aGUKKyAgICAgKiBpbnZvbHZlZCBvdXRwdXRzIGJ1dCBzZXRDbGllbnRBY3RpdmUgd2lsbCBiZSBjYWxsZWQgb24gYWxsIG91dHB1dCB0byB0cmFjayBzdHJhdGVneSBhbmQKKyAgICAgKiBhY3RpdmUgY2xpZW50IGZvciBhIGdpdmVuIG91dHB1dC4KKyAgICAgKiBBY3RpdmUgcmVmIGNvdW50IG9mIHRoZSBjbGllbnQgd2lsbCBiZSBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCB0aHJvdWdoIHNldEFjdGl2ZSBBUEkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworCisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlID0gVk9MVU1FX1NPVVJDRV9OT05FLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAorICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0OworCisgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBnZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IGFjdGl2ZUxpc3Q7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7CisgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3QucHVzaF9iYWNrKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhY3RpdmVMaXN0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRBY3Rpdml0eUNvdW50KCkgOiAwOworICAgIH0KKyAgICBib29sIGlzTXV0ZWQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmlzTXV0ZWQoKSA6IGZhbHNlOworICAgIH0KKyAgICBpbnQgZ2V0TXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRNdXRlQ291bnQoKSA6IDA7CisgICAgfQorICAgIGludCBpbmNNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5pbmNNdXRlQ291bnQoKTsKKyAgICB9CisgICAgaW50IGRlY011dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpCisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXNbdnNdLmRlY011dGVDb3VudCgpOworICAgIH0KKyAgICB2b2lkIHNldEN1clZvbHVtZShWb2x1bWVTb3VyY2UgdnMsIGZsb2F0IHZvbHVtZURiKQorICAgIHsKKyAgICAgICAgLy8gRXZlbiBpZiBub3QgYWN0aXZpdHkgZm9yIHRoaXMgZ3JvdXAgcmVnaXN0ZXJlZCwgbmVlZCB0byBjcmVhdGUgYW55d2F5CisgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5zZXRWb2x1bWUodm9sdW1lRGIpOworICAgIH0KKyAgICBmbG9hdCBnZXRDdXJWb2x1bWUoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKSA/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRWb2x1bWUoKSA6IE5BTjsKKyAgICB9CisKKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdF9zdHJhdGVneV90IHBzLCB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdBY3Rpdml0aWVzLmZpbmQocHMpICE9IHN0ZDo6ZW5kKG1Sb3V0aW5nQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChwcykuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpIDogZmFsc2U7CisgICAgfQorICAgIGJvb2wgaXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nQWN0aXZpdGllcy5maW5kKHBzKSAhPSBzdGQ6OmVuZChtUm91dGluZ0FjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQocHMpLmlzTXV0ZWRCeURldmljZSgpIDogZmFsc2U7CisgICAgfQorICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYm9vbCBpc011dGVkKQorICAgIHsKKyAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzW3BzXS5zZXRNdXRlZEJ5RGV2aWNlKGlzTXV0ZWQpOworICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC03MywyMiArMjUyLDUzIEBACiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgeyBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7IH07CisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgc3A8QXVkaW9Qb3J0PiAgICAgICBtUG9ydDsKLSAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCi0gICAgdWludDMyX3QgbVJlZkNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgdXNpbmcgdGhpcyBvdXRwdXQKLSAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKLSAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZSBpbiBkQgotICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKLSAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIFRyYWNrQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZSBDbGllbnRNYXBIYW5kbGVyIHRvIGFib3J0IHdoZW4gcmVtb3ZpbmcgYSBjbGllbnQgd2hlbiBhY3RpdmUuCisgICAgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBjbGllbnQgPSBnZXRDbGllbnQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBub25leGlzdGVudCBjbGllbnQgcG9ydElkICVkIiwgX19mdW5jX18sIG1JZCwgcG9ydElkKTsKKyAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQsIHdlIGNvdWxkIHJlbW92ZSBpdHMKKyAgICAgICAgLy8gYXNzb2NpYXRlZCBhY3RpdmUgY291bnQgYnkgY2FsbGluZyBjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudCgpLAorICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBiZSBoaWRpbmcgYSBwcm9ibGVtLCBzbyB3ZSBsb2cgZmF0YWwgaW5zdGVhZC4KKyAgICAgICAgYXV0byBjbGllbnRJdGVyID0gc3RkOjpmaW5kKGJlZ2luKG1BY3RpdmVDbGllbnRzKSwgZW5kKG1BY3RpdmVDbGllbnRzKSwgY2xpZW50KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnRJdGVyICE9IG1BY3RpdmVDbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCkgcmVtb3ZpbmcgY2xpZW50IHBvcnRJZCAlZCB3aGljaCBpcyBhY3RpdmUgKGNvdW50ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcG9ydElkLCBjbGllbnQtPmdldEFjdGl2aXR5Q291bnQoKSk7CisgICAgICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CisgICAgfQorCisgICAgY29uc3QgVHJhY2tDbGllbnRWZWN0b3ImIGdldEFjdGl2ZUNsaWVudHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWN0aXZlQ2xpZW50czsKKyAgICB9CisKKyAgICBEZXZpY2VWZWN0b3IgbURldmljZXM7IC8qKjwgY3VycmVudCBkZXZpY2VzIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0byAqLworICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4ID0gbnVsbHB0cjsgICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAKIHByb3RlY3RlZDoKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisgICAgY29uc3Qgc3A8QXVkaW9Qb3J0PiBtUG9ydDsKKyAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqIGNvbnN0IG1DbGllbnRJbnRlcmZhY2U7CisgICAgdWludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZlIGNvdW50CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgLy8gVGhlIEFjdGl2ZUNsaWVudHMgc2hvd3MgdGhlIGNsaWVudHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBAVm9sdW1lU291cmNlIGNvdW50cworICAgIC8vIGFuZCBtYXkgaW5jbHVkZSB1cHN0cmVhbSBjbGllbnRzIGZyb20gYSBkdXBsaWNhdGluZyB0aHJlYWQuCisgICAgLy8gQ29tcGFyZSB3aXRoIHRoZSBDbGllbnRNYXAgKG1DbGllbnRzKSB3aGljaCBhcmUgZXh0ZXJuYWwgQXVkaW9UcmFjayBjbGllbnRzIG9mIHRoZQorICAgIC8vIG91dHB1dCBkZXNjcmlwdG9yIChhbmQgZG8gbm90IGNvdW50IGludGVybmFsIFBhdGNoVHJhY2tzKS4KKyAgICBUcmFja0NsaWVudFZlY3RvciBtQWN0aXZlQ2xpZW50czsKKworICAgIFJvdXRpbmdBY3Rpdml0aWVzIG1Sb3V0aW5nQWN0aXZpdGllczsgLyoqPCB0cmFjayByb3V0aW5nIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KKworICAgIFZvbHVtZUFjdGl2aXRpZXMgbVZvbHVtZUFjdGl2aXRpZXM7IC8qKjwgdHJhY2sgdm9sdW1lIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgpAQCAtOTksMTggKzMwOSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0OworICAgIHZvaWQgc2V0RGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIHsgbURldmljZXMgPSBkZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCk7CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0MSAhPSBOVUxMICYmIG1PdXRwdXQyICE9IE5VTEwpOyB9CiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEFsbENsaWVudHNJbmFjdGl2ZSgpCisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGNsaWVudHNMaXN0KHRydWUpKSB7CisgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCkBAIC0xMjAsNDcgKzMzNyw3MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7Ci0gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIGNoYW5nZVJlZkNvdW50KDEpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICAgICAgICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkLgotICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKTsKLSAgICAgICAgICAgIHZvaWQgc3RvcCgpOwotICAgICAgICAgICAgdm9pZCBjbG9zZSgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgb3BlbkR1cGxpY2F0aW5nKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKTsKKyAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKKworICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCisgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgc2V0Q2xpZW50QWN0aXZlKHRydWUpOworICAgICAgICBzdGF0dXNfdCBzdGFydCgpOworICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KKyAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSk7CisgICAgICAgIHZvaWQgc3RvcCgpOworICAgICAgICB2b2lkIGNsb3NlKCk7CisgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzRGV2aWNlCisgICAgICogQHBhcmFtIGRldmljZSB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYnkgdHlwZSAoZm9yIG5vbiBidXMgLyByZW1vdGUgc3VibWl4IGRldmljZXMpLAorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCAoYm90aCB0eXBlIGFuZCBhZGRyZXNzKSBmb3IgYnVzIC8gcmVtb3RlIHN1Ym1peAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0FsbERldmljZXMKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyB3ZWFrbHkgc3VwcG9ydGVkIGJ5IHR5cGUgKGUuZy4gZm9yIG5vbiBidXMgLyByc3VibWl4IGRldmljZXMpLAorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCAoYm90aCB0eXBlIGFuZCBhZGRyZXNzKSBmb3IgYnVzIC8gcmVtb3RlIHN1Ym1peAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXJTdXBwb3J0ZWREZXZpY2VzIHRha2VzIGEgdmVjdG9yIG9mIGRldmljZXMgYW5kIGZpbHRlcnMgdGhlbSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZGV2aWNlIHN1cHBvcnRlZCBieSB0aGlzIG91dHB1dCAodGhlIHByb2ZpbGUgZnJvbSB3aGljaCB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20pCisgICAgICogQHBhcmFtIGRldmljZXMgcmVmZXJlbmNlIGRldmljZSB2ZWN0b3IgdG8gYmUgZmlsdGVyZWQKKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiBkZXZpY2VzIGZpbHRlcmVkIGZyb20gdGhlIHN1cHBvcnRlZCBkZXZpY2VzIG9mIHRoaXMgb3V0cHV0ICh3ZWFrbHkgb3Igbm90CisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgdHlwZSkKKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQogICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCi0gICAgQXVkaW9NaXggKm1Qb2xpY3lNaXg7ICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAogICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQogICAgIGF1ZGlvX3Nlc3Npb25fdCBtRGlyZWN0Q2xpZW50U2Vzc2lvbjsgLy8gc2Vzc2lvbiBpZCBvZiB0aGUgZGlyZWN0IG91dHB1dCBjbGllbnQKLSAgICB1aW50MzJfdCBtR2xvYmFsUmVmQ291bnQ7ICAvLyBub24tc3RyZWFtLXNwZWNpZmljIHJlZiBjb3VudAogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhbiBpbnB1dCBkZXZpY2UgZGlyZWN0bHkuCiBjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcgogewogcHVibGljOgotICAgIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKKyAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtMTcwLDcgKzQxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKLSAgICBjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IG1Tb3VyY2U7CisgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gbVNvdXJjZTsKIAogfTsKIApAQCAtMTc4LDI1ICs0MTksNTIgQEAKICAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgc291cmNlIGNvbnRyaWJ1dGluZyB0byBWb2x1bWVTb3VyY2UgaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgCisgICAgICogdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCiAgICAgICogbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQogICAgICAqIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZyB3aGljaAogICAgICAqIHVzZXMgYW4gb3V0cHV0IGZvciBwbGF5YmFjayB3aXRoIGEgbm9uLWVtcHR5LCBub24gIjAiIGFkZHJlc3MuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmVSZW1vdGVseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiIGRldmljZS4KKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgc291cmNlIGNvbnRyaWJ1dGluZyB0byBWb2x1bWVTb3VyY2UgaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiCisgICAgICogZGV2aWNlLgogICAgICAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIGxvY2FsL3JlbW90ZSBwbGF5YmFjay4KICAgICAgKiBVc2VkIGZvciBpbnN0YW5jZSBieSBwb2xpY3kgbWFuYWdlciB0byBhbHRlciB0aGUgc3BlYWtlciBwbGF5YmFjayAoInNwZWFrZXIgc2FmZSIgYmVoYXZpb3IpCiAgICAgICogd2hlbiBtZWRpYSBwbGF5cyBvciBub3QgbG9jYWxseS4KICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZy4KICAgICAgKi8KLSAgICBib29sIGlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlTG9jYWxseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUgY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBhY3RpdmUgKG9yIHdhcyBhY3RpdmUKKyAgICAgKiBpbiB0aGUgcGFzdCkgb24gdGhlIGdpdmVuIG91dHB1dCBhbmQgYWxsIHRoZSBvdXRwdXRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBIVyBNb2R1bGUKKyAgICAgKiB0aGUgc2FtZSBtb2R1bGUgdGhhbiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICogQHBhcmFtIG91dHB1dERlc2MgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGJlIGNoZWNrZWQgdXBvbiBhY3Rpdml0eSBzdGF0dXMKKyAgICAgKiBAcGFyYW0gaW5QYXN0TXMgaWYgMCwgY2hlY2sgY3VycmVudGx5LCBvdGhlcndpc2UsIGNoZWNrIGluIHRoZSBwYXN0CisgICAgICogQHBhcmFtIHN5c1RpbWUgc2hhbGwgYmUgc2V0IGlmIHJlcXVlc3QgaXMgZG9uZSBmb3IgdGhlIHBhc3QgYWN0aXZpdHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuIG91dHB1dCBmb2xsb3dpbmcgdGhlIHN0cmF0ZWd5IGlzIGFjdGl2ZSBvbiB0aGUgc2FtZSBtb2R1bGUgdGhhbiBkZXNjLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgICogcHJldmVudCBmcm9tIHVzaW5nIHRoaXMgZGV2aWNlIGFueSBtb3JlIGJ5IGNsZWFyaW5nIGFsbCB0aGUgc2Vzc2lvbiByb3V0ZXMgaW52b2x2aW5nIHRoaXMKKyAgICAgKiBkZXZpY2UuCisgICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgICogQHBhcmFtIGRpc2Nvbm5lY3RlZERldmljZSBkZXZpY2UgdG8gYmUgZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CiAKICAgICAvKioKICAgICAgKiByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQpAQCAtMjE4LDI3ICs0ODYsNTMgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKiBAYnJpZWYgaXNBbnlPdXRwdXRBY3RpdmUgY2hlY2tzIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIChha2EgcGxheWluZykgZXhjZXB0IHRoZSBvbmUocykgdGhhdAorICAgICAqIGhvbGQgdGhlIHZvbHVtZSBzb3VyY2UgdG8gYmUgaWdub3JlZAorICAgICAqIEBwYXJhbSB2b2x1bWVTb3VyY2VUb0lnbm9yZSBzb3VyY2Ugbm90IGNvbnNpZGVyZWQgaW4gdGhlIGFjdGl2aXR5IGRldGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBmb3IgYW55IHNvdXJjZSBleGNlcHQgdGhlIG9uZSB0byBiZSBpZ25vcmVkCiAgICAgICovCi0gICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQW55QWN0aXZlKHZvbHVtZVNvdXJjZVRvSWdub3JlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiBjbGFzcyBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiA6CiAgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKiBAYnJpZWYgaXNBbnlPdXRwdXRBY3RpdmUgY2hlY2tzIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIChha2EgcGxheWluZykgZXhjZXB0IHRoZSBvbmUocykgdGhhdAorICAgICAqIGhvbGQgdGhlIHZvbHVtZSBzb3VyY2UgdG8gYmUgaWdub3JlZAorICAgICAqIEBwYXJhbSB2b2x1bWVTb3VyY2VUb0lnbm9yZSBzb3VyY2Ugbm90IGNvbnNpZGVyZWQgaW4gdGhlIGFjdGl2aXR5IGRldGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBmb3IgYW55IHNvdXJjZSBleGNlcHQgdGhlIG9uZSB0byBiZSBpZ25vcmVkCiAgICAgICovCi0gICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQW55QWN0aXZlKHZvbHVtZVNvdXJjZVRvSWdub3JlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCmluZGV4IGMxYzNmM2MuLjA4NDNmZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCw3ICszMSw3IEBACiBwdWJsaWM6CiAgICAgQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKQEAgLTQ3LDcgKzQ4LDcgQEAKIAogICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKaW5kZXggNDNmNmVkNi4uMjI2NGQ4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKQEAgLTE2LDggKzE2LDEwIEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgpAQCAtMjgsNyArMzAsNiBAQAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CiAjaW5jbHVkZSA8RWZmZWN0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KLSNpbmNsdWRlIDxTZXNzaW9uUm91dGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOCwyMSArMzksMjAgQEAKICAgICBBdWRpb1BvbGljeUNvbmZpZyhId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKnZvbHVtZXMgPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlKQogICAgICAgICA6IG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyksCi0gICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzKGRlZmF1bHRPdXRwdXREZXZpY2VzKSwKLSAgICAgICAgICBtVm9sdW1lQ3VydmVzKHZvbHVtZXMpLAorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGZhbHNlKQogICAgIHt9CiAKLSAgICB2b2lkIHNldFZvbHVtZXMoY29uc3QgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmdm9sdW1lcykKLSAgICB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ3VydmVzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICptVm9sdW1lQ3VydmVzID0gdm9sdW1lczsKLSAgICAgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBmaWxlOwogICAgIH0KIAogICAgIHZvaWQgc2V0SHdNb2R1bGVzKGNvbnN0IEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzKQpAQCAtMTAwLDUxICsxMDAsODMgQEAKIAogICAgIHZvaWQgc2V0RGVmYXVsdE91dHB1dERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdERldmljZSkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IGRlZmF1bHREZXZpY2U7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gZGVmYXVsdERldmljZTsKICAgICB9CiAKLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlczsgfQorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7IH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdCh2b2lkKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgbVNvdXJjZSA9ICJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCI7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOwotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CiAKLSAgICAgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOwogCi0gICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7Ci0gICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwotICAgICAgICBvdXRQcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CiAgICAgICAgIG91dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ0MTAwKSk7Ci0gICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZXMpOworICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICBvdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKTsKICAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG91dFByb2ZpbGUpOwogCi0gICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlOwotICAgICAgICBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7Ci0gICAgICAgIGluUHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7Ci0gICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCkpOworICAgICAgICBzcDxJbnB1dFByb2ZpbGU+IGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKKyAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CiAgICAgICAgIGluUHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRlZmF1bHRJbnB1dERldmljZSk7CiAgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGluUHJvZmlsZSk7CiAKLSAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworICAgIH0KKworICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMsIHdpdGggYW4gb3B0aW9uYWwgbGlzdCBvZiBzdWJmb3JtYXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgZnJvbSB1c2VycycgUE9WLgorICAgIHVzaW5nIFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19mb3JtYXRfdCwgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90Pj47CisKKyAgICBjb25zdCBTdXJyb3VuZEZvcm1hdHMgJmdldFN1cnJvdW5kRm9ybWF0cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldFN1cnJvdW5kRm9ybWF0cyhjb25zdCBTdXJyb3VuZEZvcm1hdHMgJnN1cnJvdW5kRm9ybWF0cykKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSBzdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCkKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSB7CisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTX0hELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FBQ19MQywgeworICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLCBBVURJT19GT1JNQVRfQUFDX0hFX1YyLCBBVURJT19GT1JNQVRfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzX0pPQywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzQsIHt9fX07CiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2U7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZtSHdNb2R1bGVzOyAvKio8IENvbGxlY3Rpb24gb2YgTW9kdWxlLCB3aXRoIFByb2ZpbGVzLCBpLmUuIE1peCBQb3J0cy4gKi8KICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2VzOwotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKm1Wb2x1bWVDdXJ2ZXM7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKICAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgogICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCiAgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICBTdXJyb3VuZEZvcm1hdHMgbVN1cnJvdW5kRm9ybWF0czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKaW5kZXggOGZjNmZlOS4uZDZmMjRiMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTE2LDE1ICsxNiwxNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQgeworI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KIAotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qKgogICogY3VzdG9tIG1peCBlbnRyeSBpbiBtUG9saWN5TWl4ZXMKQEAgLTQxLDEyICs0MywxMiBAQAogCiAgICAgYW5kcm9pZDo6QXVkaW9NaXggKmdldE1peCgpOwogCi0gICAgdm9pZCBzZXRNaXgoQXVkaW9NaXggJm1peCk7CisgICAgdm9pZCBzZXRNaXgoY29uc3QgQXVkaW9NaXggJm1peCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIEF1ZGlvTWl4ICAgIG1NaXg7ICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBtaXggZGVzY3JpcHRvcgorICAgIEF1ZGlvTWl4ICAgIG1NaXg7ICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KIH07CiAKQEAgLTY2LDIxICs2OCw0MSBAQAogICAgICAqIFRyeSB0byBmaW5kIGFuIG91dHB1dCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gYXR0cmlidXRlcyB0byBjb25zaWRlciBmb3dyIHRoZSByZXNlYXJjaCBvZiBvdXRwdXQgZGVzY3JpcHRvci4KLSAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBvdXRwdXQgY291bGQgYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGFuIG91dHB1dCB3YXMgZm91bmQgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKGluIHRoaXMgY2FzZSwgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIG91dHB1dCBwYXJhbSBpcyBpbml0aWFsaXplZCksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIHByaW1hcnkgb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgorICAgICAqIEBwYXJhbVtvdXRdIHNlY29uZGFyeURlc2Mgb3RoZXIgZGVzYyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUgcm91dGVkIHRvLgogICAgICAqLwotICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYyk7CisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBtaXggZm9yIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiBvdXRwdXQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBvdXRwdXQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBhdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3Qgb2Ygb3V0cHV0IGRldmljZXMgY3VycmVudGx5IHJlYWNoYWJsZQorICAgICAqIEBwYXJhbSBwb2xpY3lNaXggdG8gYmUgcmV0dXJuZWQgaWYgYW55IG1peCBtYXRjaGluZyBvdXB1dCBkZXNjcmlwdG9yCisgICAgICogQHJldHVybiBkZXZpY2Ugc2VsZWN0ZWQgZnJvbSB0aGUgbWl4IGF0dGFjaGVkIHRvIHRoZSBvdXRwdXQsIG51bGwgcG9pbnRlciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBudWxscHRyKTsKIAogICAgIHN0YXR1c190IGdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKyAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworCitwcml2YXRlOgorICAgIGVudW0gY2xhc3MgTWl4TWF0Y2hTdGF0dXMgeyBNQVRDSCwgTk9fTUFUQ0gsIElOVkFMSURfTUlYIH07CisgICAgTWl4TWF0Y2hTdGF0dXMgbWl4TWF0Y2goY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAppbmRleCAwOWE4NmRkLi4yZDE4MmJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJBdWRpb0NvbGxlY3Rpb25zLmgiCiAjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMjksOSArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBId01vZHVsZTsKLWNsYXNzIEF1ZGlvR2FpbjsKIGNsYXNzIEF1ZGlvUm91dGU7Ci10eXBlZGVmIFZlY3RvcjxzcDxBdWRpb0dhaW4+ID4gQXVkaW9HYWluQ29sbGVjdGlvbjsKIAogY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8YXVkaW9fcG9ydF9oYW5kbGVfdD4KIHsKQEAgLTQ5LDggKzQ4LDggQEAKIAogICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCBnZXRUYWdOYW1lKCkgY29uc3QgPSAwOwogCi0gICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5Db2xsZWN0aW9uICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQotICAgIGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CisgICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5zICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQorICAgIGNvbnN0IEF1ZGlvR2FpbnMgJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCiAgICAgewpAQCAtNjUsNiArNjQsNyBAQAogICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CiAgICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9CiAKICAgICAvLyBBdWRpbyBwb3J0IElEcyBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKQEAgLTExNiw2ICsxMTYsNyBAQAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdDsKICAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KIAogICAgIGJvb2wgdXNlSW5wdXRDaGFubmVsTWFzaygpIGNvbnN0CiAgICAgewpAQCAtMTMyLDE2ICsxMzMsMTcgQEAKICAgICB2b2lkIGFkZFJvdXRlKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgeyBtUm91dGVzLmFkZChyb3V0ZSk7IH0KICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZnZXRSb3V0ZXMoKSBjb25zdCB7IHJldHVybiBtUm91dGVzOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKwogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3Q7CiAKLSAgICBBdWRpb0dhaW5Db2xsZWN0aW9uIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgIEF1ZGlvR2FpbnMgbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCiAKIHByaXZhdGU6CiAgICAgdm9pZCBwaWNrQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLCBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKSBjb25zdDsKICAgICB2b2lkIHBpY2tTYW1wbGluZ1JhdGUodWludDMyX3QgJnJhdGUsY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlcykgY29uc3Q7CiAKKyAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KICAgICBTdHJpbmc4ICBtTmFtZTsKICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKQEAgLTE1MywyMiArMTU1LDIyIEBACiBjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KLQogICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBoYXNTYW1lSHdNb2R1bGVBcyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKG90aGVyICE9IDApICYmCisgICAgICAgIHJldHVybiAob3RoZXIgIT0gMCkgJiYgKG90aGVyLT5nZXRBdWRpb1BvcnQoKSAhPSAwKSAmJiAoZ2V0QXVkaW9Qb3J0KCkgIT0gMCkgJiYKICAgICAgICAgICAgICAgICAob3RoZXItPmdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBnZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogICAgIH0KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOwotICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKKyAgICBib29sIGhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lID0gZmFsc2UpIGNvbnN0OworCisgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKKyAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDg3NDFjNjYuLmI1ODhkNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKQEAgLTE2LDkxICsxNiw4NCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJwb2xpY3kuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gU2FtcGxlUmF0ZVZlY3RvcjsKLXR5cGVkZWYgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBDaGFubmVsc1ZlY3RvcjsKIHR5cGVkZWYgVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBGb3JtYXRWZWN0b3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KTsKK2Jvb2wgb3BlcmF0b3I9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICByZXR1cm4gIShsZWZ0ID09IHJpZ2h0KTsKK30KKworY2xhc3MgQ2hhbm5lbHNWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PgoreworcHVibGljOgorICAgIENoYW5uZWxzVmVjdG9yKCkgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHN2KSA6CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHN2KSB7fQorICAgIENoYW5uZWxzVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4gdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNJbk1hc2soKSBjb25zdDsKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQgdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNPdXRNYXNrKCkgY29uc3Q7Cit9OwogCiBjbGFzcyBBdWRpb1Byb2ZpbGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOwotICAgIH0KKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBjcmVhdGVGdWxsRHluYW1pYygpOwogCisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOwogICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikKLSAgICB7fQorICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKTsKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmdldENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrczsgfQotCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZnZXRTYW1wbGVSYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzOyB9CisgICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKTsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKTsKIAorICAgIHZvaWQgY2xlYXIoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZEZvcm1hdCgpICYmIGhhc1ZhbGlkUmF0ZXMoKSAmJiBoYXNWYWxpZENoYW5uZWxzKCk7IH0KLQotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CisgICAgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFza3MuaW5kZXhPZihjaGFubmVscykgPj0gMDsKICAgICB9Ci0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOwotICAgIH0KKyAgICBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7IH0KIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3QodWludDMyX3QgcmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmdXBkYXRlZENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKIApAQCAtMTE5LDcgKzExMiw3IEBACiAKICAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBTdHJpbmc4ICBtTmFtZTsKQEAgLTEzNiwyMTMgKzEyOSw0OCBAQAogY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQotICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOwotICAgICAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgotICAgICAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgotICAgICAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKLSAgICAgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOwotICAgICAgICAvLyB9Ci0gICAgICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSk7CiAgICAgLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgb25jZSByZXRyaWV2aW5nIGNhcGFiaWxpdGllcwogICAgIC8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwotICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAotICAgICAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CisgICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7CisgICAgdm9pZCBjbGVhclByb2ZpbGVzKCk7CisgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGlzIHByb2ZpbGUgdmVjdG9yIGNvbnRhaW5zIGlucHV0IHByb2ZpbGVzLAorICAgIC8vIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGZyb20gJ291dHB1dFByb2ZpbGVzJywgYWNjb3JkaW5nIHRvCisgICAgLy8gdGhlIGdpdmVuIHByZWZlcmVuY2VzIGZvciBhdWRpbyBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzLgorICAgIC8vIE5vdGU6IHN0ZDo6dmVjdG9ycyBhcmUgdXNlZCBiZWNhdXNlIHNwZWNpYWxpemVkIGNvbnRhaW5lcnMgZm9yIGZvcm1hdHMKKyAgICAvLyAgICAgICBhbmQgY2hhbm5lbHMgY2FuIGJlIHNvcnRlZCBhbmQgdXNlIHRoZWlyIG93biBvcmRlcmluZy4KKyAgICBzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsIC8vIG9yZGVyOiBtb3N0IHByZWYgLT4gbGVhc3QgcHJlZgorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdDsKIAotICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdDsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KIAotICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdCB7IHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOyB9CisgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKIAogICAgIC8vIE9uZSBhdWRpbyBwcm9maWxlIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2ggZm9ybWF0IHN1cHBvcnRlZCBieSBBdWRpbyBIQUwKLSAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQotICAgIHsKLSAgICAgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKLSAgICAgICAgICAgIGFkZChwcm9maWxlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKTsKIAotICAgIHZvaWQgY2xlYXJQcm9maWxlcygpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci0gICAgewotICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICAgICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgOCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLCBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMik7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKaW5kZXggNmIyNGZkZS4uMDM1N2ZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCkBAIC00Niw3ICs0NiwyMCBAQAogCiAgICAgYXVkaW9fcm91dGVfdHlwZV90IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzUGF0Y2ggY2hlY2tzIGlmIGFuIGF1ZGlvIHBhdGNoIGlzIHN1cHBvcnRlZCBieSBhIFJvdXRlIGRlY2xhcmVkIGluCisgICAgICogdGhlIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBmaWxlLgorICAgICAqIElmIHRoZSBwYXRjaCBpcyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgYW4gQXVkaW9IQUwgKHdoaWNoIHN1cHBvcnRzIG9mIGNvdXJzZSBSb3V0aW5nIEFQSSAzLjApLAorICAgICAqIGF1ZGlvcG9saWN5IHdpbGwgbm90IHJlcXVlc3QgQXVkaW9GbGluZ2VyIHRvIHVzZSBhIHNvZnR3YXJlIGJyaWRnZSB0byByZWFsaXplIGEgcGF0Y2gKKyAgICAgKiBiZXR3ZWVuIDIgcG9ydHMuCisgICAgICogQHBhcmFtIHNyY1BvcnQgKGFrYSB0aGUgc291cmNlKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRzdFBvcnQgKGFrYSB0aGUgc2luaykgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXVkaW8gcm91dGUgc3VwcG9ydHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgc2luayBhbmQgdGhlIHNvdXJjZSwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb1BvcnRWZWN0b3IgbVNvdXJjZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTI0N2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgQXVkaW9NaXgqIHBvbGljeU1peCwKLSAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9Ci0gICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9Ci0gICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9Ci0gICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9Ci0gICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7Ci0gICAgdWludDMyX3QgYWN0aXZlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQ291bnQ7IH0gOwotCi0gICAgdWludDMyX3QgY2hhbmdlT3BlbkNvdW50KGludCBkZWx0YSk7Ci0gICAgdWludDMyX3QgY2hhbmdlQWN0aXZlQ291bnQoaW50IGRlbHRhKTsKLQotICAgIHZvaWQgc2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87Ci0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7Ci0gICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwotICAgIGJvb2wgbVNpbGVuY2VkOwotICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwotICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7Ci0gICAgQXVkaW9NaXgqIG1Qb2xpY3lNaXg7IC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqIG1DbGllbnRJbnRlcmZhY2U7Ci0gICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBtSW5mb1Byb3ZpZGVyOwotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiA6Ci0gICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPEF1ZGlvU2Vzc2lvbj4gPiwKLSAgICBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgYWRkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLQotICAgIHN0YXR1c190IHJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdWludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3Q7Ci0KLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEFjdGl2ZVNlc3Npb25Db3VudCgpIGNvbnN0OwotICAgIGJvb2wgaGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDM3ZmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnB1dCBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gZGVwZW5kZW50IGF1ZGlvIHNlc3Npb25zIGNhbiBxdWVyeSBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlaXIgY29udGV4dAotICovCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOwotCi19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QgPSAwOzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MGY0Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLSNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci0KLWNsYXNzIEF1ZGlvU291cmNlRGVzY3JpcHRvcjogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1NvdXJjZURlc2NyaXB0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgOgotICAgICAgICBtRGV2aWNlKGRldmljZSksIG1BdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwgbVVpZCh1aWQpIHt9Ci0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2VEZXNjcmlwdG9yKCkge30KLQotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2MtPm1IYW5kbGU7IH0KLQotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1EZXZpY2U7Ci0gICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOwotICAgIHVpZF90IG1VaWQ7Ci0gICAgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKLSAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwotICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7Ci19OwotCi1jbGFzcyBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gOgotICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2UpIDoKKyAgICAgICAgbVBvcnRJZChwb3J0SWQpLCBtVWlkKHVpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCisgICAgICAgIG1Db25maWcoY29uZmlnKSwgbVByZWZlcnJlZERldmljZUlkKHByZWZlcnJlZERldmljZUlkKSwgbUFjdGl2ZShmYWxzZSksCisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KKyAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdDsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cmlidXRlczsgfQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZzsgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQ7IH07CisgICAgdm9pZCBzZXRQcmVmZXJyZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkKSB7CisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VJZCA9IHByZWZlcnJlZERldmljZUlkOworICAgIH0KKyAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQorICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJZCBmb3IgdGhpcyBjbGllbnQKKyAgICBjb25zdCB1aWRfdCBtVWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsgLy8gdXNhZ2UuLi4KKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IG1Db25maWc7CisgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUHJlZmVycmVkRGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgIGJvb2wgbUFjdGl2ZTsKKyAgICAgICAgICBib29sIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKK307CisKK2NsYXNzIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSksCisgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwgbVN0cmF0ZWd5KHN0cmF0ZWd5KSwgbVZvbHVtZVNvdXJjZSh2b2x1bWVTb3VyY2UpLCBtRmxhZ3MoZmxhZ3MpLAorICAgICAgICBtU2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUoc2Vjb25kYXJ5T3V0cHV0cykpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJhdGVneTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4mIGdldFNlY29uZGFyeU91dHB1dHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2Vjb25kYXJ5T3V0cHV0czsKKyAgICB9OworICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtVm9sdW1lU291cmNlOyB9CisKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAgICAgY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1BY3Rpdml0eUNvdW50LCAiJXMoJXMpIGludmFsaWQgZGVsdGEgJWQsIGluYWN0aXZlIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8aW50PihtQWN0aXZpdHlDb3VudCkgPCAtZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBDbGllbnREZXNjcmlwdG9yOjpzZXRBY3RpdmUobUFjdGl2aXR5Q291bnQgPiAwKTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgIGNvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBtU3RyYXRlZ3k7CisgICAgY29uc3QgVm9sdW1lU291cmNlIG1Wb2x1bWVTb3VyY2U7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gbVNlY29uZGFyeU91dHB1dHM7CisKKyAgICAvKioKKyAgICAgKiByZXF1aXJlZCBmb3IgZHVwbGljYXRpbmcgdGhyZWFkLCBwcmV2ZW50IGZyb20gcmVtb3ZpbmcgYWN0aXZlIGNsaWVudCBmcm9tIGFuIG91dHB1dAorICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCisgICAgICovCisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRBcHBTdGF0ZShhcHBfc3RhdGVfdCBhcHBTdGF0ZSkgeyBtQXBwU3RhdGUgPSBhcHBTdGF0ZTsgfQorICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlKCkgeyByZXR1cm4gbUFwcFN0YXRlOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbUFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFOyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkRWZmZWN0czsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3QgYm9vbCBtSXNTb3VuZFRyaWdnZXI7CisgICAgICAgICAgYXBwX3N0YXRlX3QgbUFwcFN0YXRlOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmNjNDNmZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMzEsMTUgKzMxLDMxIEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKIAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgIFN0cmluZzggYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1BZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIHsgbUFkZHJlc3MgPSBhZGRyZXNzOyB9CisKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRFbmNvZGVkRm9ybWF0KCkgeyByZXR1cm4gbUN1cnJlbnRFbmNvZGVkRm9ybWF0OyB9CisKKyAgICB2b2lkIHNldEVuY29kZWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBoYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpIGNvbnN0OworCisgICAgYm9vbCBzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtNDcsNDQgKzYzLDE0MSBAQAogCiAgICAgLy8gQXVkaW9Qb3J0CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwotCi0gICAgU3RyaW5nOCBtQWRkcmVzczsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIFN0cmluZzggbUFkZHJlc3N7IiJ9OwogICAgIFN0cmluZzggbVRhZ05hbWU7IC8vIFVuaXF1ZSBodW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciBhIGRldmljZSBwb3J0IGZvdW5kIGluIGNvbmYgZmlsZS4KICAgICBhdWRpb19kZXZpY2VzX3QgICAgIG1EZXZpY2VUeXBlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotCi1mcmllbmQgY2xhc3MgRGV2aWNlVmVjdG9yOworICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsKIH07CiAKIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8RGV2aWNlRGVzY3JpcHRvcj4gPgogewogcHVibGljOgogICAgIERldmljZVZlY3RvcigpIDogU29ydGVkVmVjdG9yKCksIG1EZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfTk9ORSkge30KKyAgICBleHBsaWNpdCBEZXZpY2VWZWN0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIDogRGV2aWNlVmVjdG9yKCkKKyAgICB7CisgICAgICAgIGFkZChpdGVtKTsKKyAgICB9CiAKICAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CiAgICAgdm9pZCBhZGQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgdm9pZCByZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OwogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OwotICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICAvLyBJZiAnYWRkcmVzcycgaXMgZW1wdHkgYW5kICdjb2RlYycgaXMgQVVESU9fRk9STUFUX0RFRkFVTFQsIGEgZGV2aWNlIHdpdGggYSBub24tZW1wdHkKKyAgICAvLyBhZGRyZXNzIG1heSBiZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkICd0eXBlJyBhbmQgZW1wdHkgYWRkcmVzcy4KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZUZyb21JZAorICAgICAqIEBwYXJhbSBpZCBvZiB0aGUgRGV2aWNlRGVzY3JpcHRvciB0byBzZWFjaCAoYWthIFBvcnQgaGFuZGxlKS4KKyAgICAgKiBAcmV0dXJuIERldmljZURlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBwb3J0IGlkIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZS4gSWYgdGhlIGlkIGlzCisgICAgICogZXF1YWwgdG8gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgaXQgYWxzbyByZXR1cm5zIGEgbnVsbHB0ci4KKyAgICAgKi8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0IHsgcmV0dXJuIGluZGV4T2YoaXRlbSkgPj0gMDsgfQogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBjb250YWluc0F0TGVhc3RPbmUKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRGV2aWNlVmVjdG9yIGNvbnRhaW5zIGF0IGxpc3Qgb25lIG9mIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYWxsIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3RvcgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGNvbGxlY3Rpb24gYWdhaW5zdCBhbm90aGVyIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBmaWx0ZXIgYWdhaW5zdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWVyZ2UgdHdvIHZlY3RvcnMuIEFzIFNvcnRlZFZlY3RvciBJbXBsZW1lbnRhdGlvbiBpcyBidWdneSAoaXQgZG9lcyBub3QgY2hlY2sgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLCBvbmx5IG9mIHRoZSBzb3VyY2UsIGl0IHByb3ZpZGVzIGEgc2FmZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHNvdXJjZSBkZXZpY2UgdmVjdG9yIHRvIG1lcmdlIHdpdGgKKyAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIG1lcmdlZCB2ZWN0b3IuCisgICAgICovCisgICAgc3NpemVfdCBtZXJnZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhZGQoZGV2aWNlcyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTb3J0ZWRWZWN0b3I6Om1lcmdlKGRldmljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBvcGVyYXRvciA9PSBEZXZpY2VWZWN0b3IgYXJlIGVxdWFscyBpZiBhbGwgdGhlIERldmljZURlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIChha2EKKyAgICAgKiBEZXZpY2VEZXNjcmlwdG9yIHdpdGggc2FtZSB0eXBlIGFuZCBhZGRyZXNzKSBhbmQgdGhlIHZlY3RvciBoYXMgc2FtZSBzaXplLgorICAgICAqIEBwYXJhbSByaWdodCBEZXZpY2VWZWN0b3IgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmlnaHQgY29udGFpbnMgdGhlIHNhbWUgZGV2aWNlIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKHJpZ2h0LmluZGV4T2YoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERldmljZVZlY3RvciAmcmlnaHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRGaXJzdFZhbGlkQWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHZhbGlkIGFkZHJlc3Mgb2YgYSBsaXN0IG9mIGRldmljZSwgIiIgaWYgbm8gZGV2aWNlIHdpdGggdmFsaWQgYWRkcmVzcworICAgICAqIGZvdW5kLgorICAgICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGhlbHBzIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgd2hlcmUgd2UgdXNlZCB0byBoYXZlIGEKKyAgICAgKiBkZXZpY2VzIG1hc2sgYW5kIGFuIGFkZHJlc3MuCisgICAgICovCisgICAgU3RyaW5nOCBnZXRGaXJzdFZhbGlkQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5hZGRyZXNzKCkgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5hZGRyZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggMDQ4MzFjNi4uN2YwMWRjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC0xNiwyNSArMTYsMzggQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQogY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYm9vbCBpc011c2ljRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBpbnQgaW8sIGludCBzZXNzaW9uKSA6CisgICAgICAgIG1JZChpZCksIG1JbyhpbyksIG1TZXNzaW9uKHNlc3Npb24pLCBtRW5hYmxlZChmYWxzZSksCisgICAgICAgIG1Jc011c2ljRWZmZWN0KGlzTXVzaWNFZmZlY3QpCisgICAgeworICAgICAgICBtZW1jcHkgKCZtRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9CiAKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwogICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKworICAgIGJvb2wgaXNNdXNpY0VmZmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1Jc011c2ljRWZmZWN0OyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNNdXNpY0VmZmVjdDsKIH07CiAKIGNsYXNzIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIEtleWVkVmVjdG9yPGludCwgc3A8RWZmZWN0RGVzY3JpcHRvcj4gPgpAQCAtNDMsMTQgKzU2LDE2IEBACiAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKIAogICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwgaW50IGlkLCBib29sIGlzTXVzaWNFZmZlY3QpOwogICAgIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBnZXRFZmZlY3QoaW50IGlkKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sICAgICBpc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKLSAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyMjlhNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yOwotCi1jbGFzcyBHYWlucwotewotcHVibGljIDoKLSAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50LCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOwotCi0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IGNiOWY0OWUuLmViMzRkYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC00Niw2ICs0NiwyMiBAQAogCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXREZWNsYXJlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGVjbGFyZWREZXZpY2VzOyB9CiAgICAgdm9pZCBzZXREZWNsYXJlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QWxsRGV2aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1EZWNsYXJlZERldmljZXM7CisgICAgICAgIGRldmljZXMubWVyZ2UobUR5bmFtaWNEZXZpY2VzKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfQorICAgIHZvaWQgYWRkRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgbUR5bmFtaWNEZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKworICAgIGJvb2wgcmVtb3ZlRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1EeW5hbWljRGV2aWNlcy5yZW1vdmUoZGV2aWNlKSA+PSAwOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZ2V0RHluYW1pY0RldmljZXMoKSBjb25zdCB7IHJldHVybiBtRHluYW1pY0RldmljZXM7IH0KIAogICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldElucHV0UHJvZmlsZXMoKSBjb25zdCB7IHJldHVybiBtSW5wdXRQcm9maWxlczsgfQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQpAQCAtODEsOCArOTcsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC05Myw2ICsxMjAsNyBAQAogICAgIElucHV0UHJvZmlsZUNvbGxlY3Rpb24gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgdWludDMyX3QgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgogICAgIERldmljZVZlY3RvciBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgRGV2aWNlVmVjdG9yIG1EeW5hbWljRGV2aWNlczsgLyoqPCBkZXZpY2VzIHRoYXQgY2FuIGJlIGFkZGVkL3JlbW92ZWQgYXQgcnVudGltZSAoZS5nLiByc2J1bWl4KSovCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOwogICAgIEF1ZGlvUG9ydFZlY3RvciBtUG9ydHM7CiB9OwpAQCAtMTAyLDE0ICsxMzAsNjQgQEAKIHB1YmxpYzoKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CiAKLSAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzID0gdHJ1ZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VEZXNjcmlwdG9yIHJldHVybnMgYSBkZXZpY2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHRoZSBkZXZpY2UgdHlwZSBhbmQKKyAgICAgKiBkZXZpY2UgYWRkcmVzcyAoaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpLgorICAgICAqIEl0IG1heSBsb29wIHR3aWNlIG9uIGFsbCBtb2R1bGVzIHRvIGNoZWNrIGlmIGFsbG93VG9DcmVhdGUgaXMgdHJ1ZQorICAgICAqICAgICAgLWZpcnN0IGxvb3Agd2lsbCBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIGEgbW9kdWxlIHNpbmNlIGRlY2xhcmVkIGluIHRoZSBsaXN0CisgICAgICogb2YgZGV2aWNlIHBvcnQgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogICAgICAtKGFsbG93VG9DcmVhdGUgaXMgdHJ1ZSlzZWNvbmQgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSBvbmUKKyAgICAgKiBvciBtb3JlIHByb2ZpbGVzIG9uIGEgZ2l2ZW4gbW9kdWxlIGFuZCB3aWxsIGFkZCBhcyBhIHN1cHBvcnRlZCBkZXZpY2UgZm9yIHRoaXMgbW9kdWxlLgorICAgICAqICAgICAgIFRoZSBkZXZpY2Ugd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBkeW5hbWljIGxpc3Qgb2YgZGV2aWNlIG9mIHRoaXMgbW9kdWxlCisgICAgICogQHBhcmFtIHR5cGUgb2YgdGhlIGRldmljZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCBpZiBub3QgQVVESU9fRk9STUFUX0RFRkFVTFQsIG11c3QgbWF0Y2ggb25lIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gbWF0Y2hBZGRyZXNzIHRydWUgaWYgYSBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gYWxsb3dUb0NyZWF0ZSB0cnVlIGlmIGFsbG93ZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGV2aWNlIChlLmcuIGhkbWksIHVzYi4uLikKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIHR5cGUgKGFuZCBhZGRyZXNzIGlmIG1hdGNoQWRkcmVzcyBpcyB0cnVlKQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY3JlYXRlRGV2aWNlIGNyZWF0ZXMgYSBuZXcgZGV2aWNlIGZyb20gdGhlIHR5cGUgYW5kIGFkZHJlc3MgZ2l2ZW4uIEl0IGNoZWNrcyB0aGF0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgdHlwZSwgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIGRldmljZSAod2VhayBjaGVjaykuCisgICAgICogVGhpcyBjb25jZXJucyBvbmx5IGR5bmFtaWMgZGV2aWNlLCBha2EgZGV2aWNlIHdpdGggYSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBub3QKKyAgICAgKiBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb2R1bGUvdW5kZXJseWluZyBwcm9maWxlcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRpbmcgdGhpcyB0eXBlLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFuVXBGb3JEZXZpY2U6IGxvb3Agb24gYWxsIHByb2ZpbGVzIG9mIGFsbCBtb2R1bGVzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbQorICAgICAqIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2UuIElmIHRoaXMgZGV2aWNlIGlzIGEgZHluYW1pYyBkZXZpY2UgKGFrYSBhIGRldmljZSBub3QgaW4gdGhlCisgICAgICogeG1sIGZpbGUgd2l0aCBhIHJ1bnRpbWUgYWRkcmVzcyksIGl0IGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgY29sbGVjdGlvbiBvZiBkeW5hbWljCisgICAgICogZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uZTBiNTZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzUsNyArMzUsNyBAQAogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQogICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKLSAgICAgICAgICBtYXhPcGVuQ291bnQoKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgPyAxIDogMCksCisgICAgICAgICAgbWF4T3BlbkNvdW50KDEpLAogICAgICAgICAgIGN1ck9wZW5Db3VudCgwKSwKICAgICAgICAgICBtYXhBY3RpdmVDb3VudCgxKSwKICAgICAgICAgICBjdXJBY3RpdmVDb3VudCgwKSB7fQpAQCAtNTcsMTIgKzU3LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwgYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCi0gICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCi0gICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIC8vIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgIC8qKgorICAgICAqIEBicmllZiBpc0NvbXBhdGlibGVQcm9maWxlOiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwKKyAgICAgKiBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KKyAgICAgKiBDaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKiBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICogQHBhcmFtIGZvcm1hdCB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkRm9ybWF0IGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIGZvcm1hdAorICAgICAqIEBwYXJhbSBjaGFubmVsTWFzayB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkQ2hhbm5lbE1hc2sgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgY2hhbm5lbCBtYXNrCisgICAgICogQHBhcmFtIGZsYWdzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyB0cnVlIGlmIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkIG9uIGZsYWdzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9maWxlIGlzIGNvbXBhdGlibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC03Myw1NCArODYsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogICAgIHZvaWQgbG9nKCk7CiAKICAgICBib29sIGhhc1N1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiAhbVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpOyB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICBib29sIHN1cHBvcnRzRGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgfQogCi0gICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgIHRoZSBhZGRyZXNzIGVuZm9yY2VtZW50IGlzIGxpbWl0ZWQgdG8gIm9mZmljYWwgZGV2aWNlcyIgdGhhdCBkaXN0aW5ndWlzaGUgb24gYWRkcmVzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIGJvb2wgZm9yY2VDaGVja09uQWRkcmVzcyA9IGZhbHNlKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOwotICAgIH0KLQotICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZUZvclR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gbVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UtPnR5cGUoKSkgJiYgIWZvcmNlQ2hlY2tPbkFkZHJlc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0RldmljZVR5cGVzKGRldmljZS0+dHlwZSgpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhkZXZpY2UpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7IH0KKyAgICBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyByZXF1aXJlZCBmb3IgaXNPZmZsb2FkU3VwcG9ydGVkKCkgY2hlY2sKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCktPmhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIHZvaWQgY2xlYXJTdXBwb3J0ZWREZXZpY2VzKCkgeyBtU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOyB9CiAgICAgdm9pZCBhZGRTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KLQorICAgIHZvaWQgcmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICB9CiAgICAgdm9pZCBzZXRTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgYWRkcmVzcyk7Ci0gICAgfQotCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnRlZERldmljZXM7IH0KIAogICAgIGJvb2wgY2FuT3Blbk5ld0lvKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwODQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLCBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD4gZ2V0QXR0cmlidXRlcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGdldFN0cmVhbVR5cGVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3QgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNmIwOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCAvKmlzU3BlYWtlckRyY0VuYWJsZWQqLykge30KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHN0cmVhbSwgc3RyZWFtKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdCA9IDA7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCAyOWRlODQ4Li40OGM0MTQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTE3LDIyMyArMTcsOSBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJBdWRpb1BvbGljeUNvbmZpZy5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotc3RydWN0IF94bWxOb2RlOwotc3RydWN0IF94bWxEb2M7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEF1ZGlvR2FpblRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kZVtdOyAvKio8IGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluVmFsdWVNQltdOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4VmFsdWVNQltdOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdFZhbHVlTUJbXTsgLyoqPCBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdGVwVmFsdWVNQltdOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblJhbXBNc1tdOyAvKio8IG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhSYW1wTXNbXTsgLyoqPCAubmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAgKi8KLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb0dhaW4gRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb0dhaW5Db2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gR2FpbiBoYXMgbm8gY2hpbGQKLX07Ci0KLS8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0Ci1zdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNhbXBsaW5nUmF0ZXNbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrc1tdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Qcm9maWxlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotfTsKLQotc3RydWN0IE1peFBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmbGFnc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhPcGVuQ291bnRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4QWN0aXZlQ291bnRbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBJT1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBJT1Byb2ZpbGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzCi19OwotCi1zdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdGFnTmFtZVtdOyAvKio8ICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlU291cmNlW107IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NbXTsgLyoqPCBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgRGV2aWNlRGVzY3JpcHRvciBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RGV2aWNlRGVzY3JpcHRvcj4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIERldmljZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMgKG9wdGlvbm5hbCkKLX07Ci0KLXN0cnVjdCBSb3V0ZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZU1peFtdOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2lua1tdOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc291cmNlc1tdOyAvKio8IHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Sb3V0ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpOwotfTsKLQotc3RydWN0IE1vZHVsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZXNUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBId01vZHVsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEh3TW9kdWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMgYW5kIHJvdXRlVHJhaXRzCi0gICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKLX07Ci0KLXN0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNwZWFrZXJEcmNFbmFibGVkW107Ci0gICAgfTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci19OwotCi1zdHJ1Y3QgVm9sdW1lVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdm9sdW1lUG9pbnRUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RyZWFtW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZUNhdGVnb3J5W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJlZmVyZW5jZVtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxWb2x1bWVDdXJ2ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBObyBDaGlsZAotfTsKLQotY2xhc3MgUG9saWN5U2VyaWFsaXplcgotewotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgcm9vdE5hbWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmVyc2lvbkF0dHJpYnV0ZTsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01ham9yOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNaW5vcjsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotCi1wdWJsaWM6Ci0gICAgUG9saWN5U2VyaWFsaXplcigpOwotICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKnN0ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OwotCi0gICAgc3RkOjpzdHJpbmcgbVJvb3RFbGVtZW50TmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCi19Oworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjQ0NDAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VWZWN0b3I7Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKLSAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50Ci0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLQotICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudAotCi0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0KLSAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgICAgIDogbVVpZCh1aWQpLAotICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAotICAgICAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKLSAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgICAgICAgbVNvdXJjZShzb3VyY2UpCi0gICAge30KLQotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7Ci0KLSAgICBib29sIGlzQWN0aXZlT3JDaGFuZ2VkKCkgewotICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7Ci0gICAgfQotCi0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKLQotICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7Ci0gICAgLy8gZm9yIG91dHB1dHMKLSAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7Ci0gICAgLy8gZm9yIGlucHV0cwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOwotfTsKLQotY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KLXsKLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKLSAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCi0gICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCi0gICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCi0gICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCi0gICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQotICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OwotCi0gICAgZXhwbGljaXQgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6Ci0gICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCi0gICAge30KLQotICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGJvb2wgZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogY2FwdGlvbik7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpOwotICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQuCi0gICAgLy8gU3BlY2lmeSBhbiBJbnB1dChTb3VyY2UpIHJvdXQgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OkFVRElPX1NUUkVBTV9ERUZBVUxUCi0gICAgLy8gaW4gdGhlIHN0cmVhbVR5cGUgYXJndW1lbnQuCi0gICAgdm9pZCBhZGRSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLQotcHJpdmF0ZToKLSAgICAvLyBVc2VkIHRvIG1hcmsgYSBTZXNzaW9uUm91dGUgYXMgZm9yIGVpdGhlciBpbnB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfSW5wdXQpCi0gICAgLy8gb3Igb3V0cHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9PdXRwdXQpCi0gICAgY29uc3Qgc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1NYXBUeXBlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjEwMzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OwotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCk7Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pOwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KTsKLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vKioKLSAqIHN0cmVhbSBkZXNjcmlwdG9ycyBjb2xsZWN0aW9uIGZvciB2b2x1bWUgY29udHJvbAotICovCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgU3RyZWFtRGVzY3JpcHRvcj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOwotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOwotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdDsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKaW5kZXggNjNjMTlkMS4uNmIwNDc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCkBAIC0yMywyNiArMjMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGRldmljZV9jYXRlZ29yeSBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE1peFR5cGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSb3V0ZUZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgUnVsZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKK3N0cnVjdCBSdWxlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwordXNpbmcgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGRldmljZV9jYXRlZ29yeT47CitzdHJ1Y3QgTWl4VHlwZVRyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGludDMyX3Q+IHt9Oworc3RydWN0IFJvdXRlRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPHVpbnQzMl90PiB7fTsKIAogdHlwZWRlZiBUeXBlQ29udmVydGVyPERldmljZUNhdGVnb3J5VHJhaXRzPiBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxNaXhUeXBlVHJhaXRzPiBNaXhUeXBlQ29udmVydGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YjJiNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEN1cnZlUG9pbnQKLXsKLSAgICBDdXJ2ZVBvaW50KCkge30KLSAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgotICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KLSAgICB1aW50MzJfdCBtSW5kZXg7Ci0gICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Ci19OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQotewotICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKLX0KLQotLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQotLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCi0vLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCi1jbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKLSAgICAgICAgbURldmljZUNhdGVnb3J5KGRldmljZSksIG1TdHJlYW1UeXBlKHN0cmVhbSkge30KLQotICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0KLSAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7Ci0gICAgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotfTsKLQotLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQotY2xhc3MgVm9sdW1lQ3VydmVzRm9yU3RyZWFtIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4KLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oKSA6IG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotICAgIHsKLSAgICAgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7Ci0gICAgfQotCi0gICAgc3A8Vm9sdW1lQ3VydmU+IGdldEN1cnZlc0ZvcihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KLSAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIHsgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsgfQotCi0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pIHsgbUluZGV4TWluID0gdm9sSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KSB7IG1JbmRleE1heCA9IHZvbEluZGV4TWF4OyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0KLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiBnZXRPcmlnaW5Wb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChtT3JpZ2luVm9sdW1lQ3VydmVzLmluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSIpOwotICAgICAgICByZXR1cm4gbU9yaWdpblZvbHVtZUN1cnZlcy52YWx1ZUZvcihkZXZpY2VDYXRlZ29yeSk7Ci0gICAgfQotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5IGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IHZvbHVtZUN1cnZlLT5nZXREZXZpY2VDYXRlZ29yeSgpOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgVm9sdW1lIEN1cnZlcyBwZXIgZGV2aWNlIGNhdGVnb3J5IGluIG9yZGVyIHRvIHN3aXRjaCBjdXJ2ZXMuCi0gICAgICAgICAgICBtT3JpZ2luVm9sdW1lQ3VydmVzLmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgICAgICAgICAgcmV0dXJuIEtleWVkVmVjdG9yOjphZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKLSAgICAgICAgaWYgKHZjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOwotICAgICAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vLyBDb2xsZWN0aW9uIG9mIFZvbHVtZSBDdXJ2ZXMgaW5kZXhlZCBieSB1c2UgY2FzZQotY2xhc3MgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKQotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgY3VydmVzCi0gICAgICAgIGZvciAoc3NpemVfdCBpID0gMCA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSk7Ci0gICAgICAgICAgICBLZXllZFZlY3Rvcjo6YWRkKHN0cmVhbSwgVm9sdW1lQ3VydmVzRm9yU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT25jZSBYTUwgaGFzIGJlZW4gcGFyc2VkLCBtdXN0IGJlIGNhbGwgZmlyc3QgdG8gc2FuaXR5IGNoZWNrIHRhYmxlIGFuZCBpbml0aWFsaXplIGluZGV4ZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotICAgIHsKLSAgICAgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbihpbmRleE1pbik7Ci0gICAgICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNYXgoaW5kZXhNYXgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBlZGl0Q3VydmVzRm9yKHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeyByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuY2FuQmVNdXRlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQotICAgIHsKLSAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZzb3VyY2VDdXJ2ZXMgPSBnZXRDdXJ2ZXNGb3Ioc3RyZWFtU3JjKTsKLSAgICAgICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZkc3RDdXJ2ZXMgPSBlZGl0Q3VydmVzRm9yKHN0cmVhbURzdCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHNvdXJjZUN1cnZlcy5zaXplKCkgPT0gZHN0Q3VydmVzLnNpemUoKSwgImRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCIpOwotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlQ3VydmVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IHNvdXJjZUN1cnZlcy5rZXlBdChpbmRleCk7Ci0gICAgICAgICAgICBkc3RDdXJ2ZXMuc2V0Vm9sdW1lQ3VydmUoY2F0LCBzb3VyY2VDdXJ2ZXMuZ2V0T3JpZ2luVm9sdW1lQ3VydmUoY2F0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkudm9sSW5kZXhUb0RiKGNhdCwgaW5kZXhJblVpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gdm9sdW1lQ3VydmUtPmdldFN0cmVhbVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtVHlwZSkuYWRkKHZvbHVtZUN1cnZlKTsKLSAgICB9Ci0gICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZlZGl0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSk7Ci0gICAgfQotICAgIGNvbnN0IFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZ2V0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSk7Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjYTY3Yjg3Li5jOTBhNTgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgNCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMTkzZDRhNi4uMjcyNTg3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCkBAIC05OCwzMiArOTgsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb0dhaW46OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMWUwNjQwYy4uMWZhMTEyMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsMjIgKzE3LDE5IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgotI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtSW9IYW5kbGUoMCksCi0gICAgICBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBvbGljeU1peChOVUxMKSwKLSAgICAgIG1Qcm9maWxlKHByb2ZpbGUpLCBtUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtSWQoMCksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKKyAgICA6IG1Qcm9maWxlKHByb2ZpbGUpCisgICAgLCAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBwcm9maWxlLT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CkBAIC01MCwxOSArNDcsMTQgQEAKICAgICByZXR1cm4gbVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpOwogfQogCi11aW50MzJfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0T3BlblJlZkNvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVNlc3Npb25zLmdldE9wZW5Db3VudCgpOwotfQotCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JZDsKIH0KIAotYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKK2F1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzb3VyY2UoKSBjb25zdAogewotICAgIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYWN0aXZlT25seSk7CisgICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKS5zb3VyY2U7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtODMsNyArNzUsNyBAQAogICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CiAgICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gaW5wdXRTb3VyY2UoKTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBzb3VyY2UoKTsKIH0KIAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CkBAIC0xMTgsNTcgKzExMCw1NSBAQAogICAgIG1QcmVlbXB0ZWRTZXNzaW9ucy5jbGVhcigpOwogfQogCi1ib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc0FjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmhhc0FjdGl2ZVNlc3Npb24oKTsKLX0KLQogYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAogewotICAgIHJldHVybiBtU2Vzc2lvbnMuaXNTb3VyY2VBY3RpdmUoc291cmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYKKyAgICAgICAgICAgICgoY2xpZW50LT5zb3VyY2UoKSA9PSBzb3VyY2UpIHx8CisgICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgorICAgICAgICAgICAgICAgICAgICAoY2xpZW50LT5zb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pc1NvdW5kVHJpZ2dlcigpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAotYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0CithdWRpb19hdHRyaWJ1dGVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKSBjb25zdAogeworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQgfTsKIAotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIGZvciAoYm9vbCBhY3RpdmVPbmx5IDogeyB0cnVlLCBmYWxzZSB9KSB7CisgICAgICAgIGludDMyX3QgdG9wUHJpb3JpdHkgPSAtMTsKKyAgICAgICAgYXBwX3N0YXRlX3QgdG9wU3RhdGUgPSBBUFBfU1RBVEVfSURMRTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcF9zdGF0ZV90IGN1clN0YXRlID0gY2xpZW50LT5hcHBTdGF0ZSgpOworICAgICAgICAgICAgaWYgKGN1clN0YXRlID49IHRvcFN0YXRlKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJQcmlvcml0eSA9IHNvdXJjZV9wcmlvcml0eShjbGllbnQtPnNvdXJjZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyUHJpb3JpdHkgPiB0b3BQcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gY2xpZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRvcFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcFN0YXRlID0gY3VyU3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXR0cmlidXRlczsKIH0KIAogYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7Ci0gICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbnMgYXJlIG5vdCBtaXhlZAotICAgIC8vIG9uIGEgZ2l2ZW4gaW5wdXQKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlQXQoMCktPmlzU291bmRUcmlnZ2VyKCk7Ci19Ci0KLXNwPEF1ZGlvU2Vzc2lvbj4gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGlmIChhY3RpdmVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0QWN0aXZlU2Vzc2lvbnMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zOworICAgIC8vIHNvdW5kIHRyaWdnZXIgYW5kIG5vbiBzb3VuZCB0cmlnZ2VyIGNsaWVudHMgYXJlIG5vdCBtaXhlZCBvbiBhIGdpdmVuIGlucHV0CisgICAgLy8gc28gY2hlY2sgb25seSBmaXJzdCBjbGllbnQKKyAgICBpZiAoZ2V0Q2xpZW50Q291bnQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci19Ci0KLXNpemVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGlmIChhY3RpdmVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5zaXplKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbikgewotICAgIHJldHVybiBtU2Vzc2lvbnMuYWRkU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24sIC8qQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKi90aGlzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgewotICAgIHJldHVybiBtU2Vzc2lvbnMucmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTsKKyAgICByZXR1cm4gZ2V0Q2xpZW50SXRlcmFibGUoKS5iZWdpbigpLT5pc1NvdW5kVHJpZ2dlcigpOwogfQogCiBhdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0UGF0Y2hIYW5kbGUoKSBjb25zdApAQCAtMTc5LDcgKzE2OSwxMSBAQAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsKLSAgICBtU2Vzc2lvbnMub25TZXNzaW9uSW5mb1VwZGF0ZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJULCBjbGllbnQpOworICAgICAgICB9CisgICAgfQogfQogCiBhdWRpb19jb25maWdfYmFzZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRDb25maWcoKSBjb25zdApAQCAtMTkwLDggKzE4NCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KQpAQCAtMjA4LDI0ICsyMDEsMjYgQEAKIAogICAgIG1EZXZpY2UgPSBkZXZpY2U7CiAKLSAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCisgICAgICAgICAgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IG1EZXZpY2UtPnR5cGUoKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1DbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLT5hZGRyZXNzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSAhPSBkZXZpY2UsCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlLT50eXBlKCkgIT0gZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgZGV2aWNlICUwOHggd2hlbiBnaXZlbiBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UtPnR5cGUoKSwgZGV2aWNlVHlwZSk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgaW5wdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqaW5wdXQsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqaW5wdXQsIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBsQ29uZmlnLnNhbXBsZV9yYXRlOwogICAgICAgICBtQ2hhbm5lbE1hc2sgPSBsQ29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgbUZvcm1hdCA9IGxDb25maWcuZm9ybWF0OwpAQCAtMjM5LDcgKzIzNCw3IEBACiAKIHN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzdGFydCgpCiB7Ci0gICAgaWYgKGdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgeworICAgIGlmICghaXNBY3RpdmUoKSkgewogICAgICAgICBpZiAoIW1Qcm9maWxlLT5jYW5TdGFydE5ld0lvKCkpIHsKICAgICAgICAgICAgIEFMT0dJKCIlcyBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgJWQiLCBfX2Z1bmNfXywgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTI2Miw0MiArMjU3LDE4OCBAQAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Y2xvc2UoKQogewogICAgIGlmIChtSW9IYW5kbGUgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgLy8gY2xlYW4gdXAgYWN0aXZlIGNsaWVudHMgaWYgYW55IChjYW4gaGFwcGVuIGlmIGNsb3NlKCkgaXMgY2FsbGVkIHRvIGZvcmNlCisgICAgICAgIC8vIGNsaWVudHMgdG8gcmVjb25uZWN0CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY2xpZW50IHdpdGggcG9ydCBJRCAlZCBzdGlsbCBhY3RpdmUgb24gaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUlkKTsKKyAgICAgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW9IYW5kbGUpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyCi0gICAgICAgIC8vIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHNlc3Npb25zCi0gICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCi0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKLSAgICAgICAgfQorCiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50ICVkIDwgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkLiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCwgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKICAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRDbGllbnQoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gJmNsaWVudCkgeworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmFkZENsaWVudChjbGllbnQpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5hYmxlZEVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLT5tU2Vzc2lvbiA9PSBjbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgY2xpZW50LT50cmFja0VmZmVjdEVuYWJsZWQobUVuYWJsZWRFZmZlY3RzLnZhbHVlQXQoaSksIHRydWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDbGllbnQoY2xpZW50LT5wb3J0SWQoKSkgPT0gbnVsbHB0ciwKKyAgICAgICAgIiVzKCVkKSBkb2VzIG5vdCBleGlzdCBvbiBpbnB1dCBkZXNjcmlwdG9yIiwgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCkpOworICAgIGlmIChhY3RpdmUgPT0gY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgZ2V0SWQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgLy8gSGFuZGxlIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgaW50MzJfdCBvbGRHbG9iYWxBY3RpdmVDb3VudCA9IG1HbG9iYWxBY3RpdmVDb3VudDsKKyAgICBpZiAoIWFjdGl2ZSAmJiBtR2xvYmFsQWN0aXZlQ291bnQgPCAxKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKSBpbnZhbGlkIGRlYWN0aXZhdGlvbiB3aXRoIGdsb2JhbEFjdGl2ZUNvdW50ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgICAgICAvLyBtR2xvYmFsQWN0aXZlQ291bnQgPSAxOworICAgIH0KKyAgICBjb25zdCBpbnQgZGVsdGEgPSBhY3RpdmUgPyAxIDogLTE7CisgICAgbUdsb2JhbEFjdGl2ZUNvdW50ICs9IGRlbHRhOwogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAwKSkgeworICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIG1TZXNzaW9ucy5kdW1wKGZkLCAxKTsKKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGludCBldmVudCA9IGFjdGl2ZSA/IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgOiBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1A7CisgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihldmVudCwgY2xpZW50KTsKKworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgIGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IHNlc3Npb25Db25maWcgPSBjbGllbnQtPmNvbmZpZygpOworICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190IHJlY29yZENsaWVudEluZm97Y2xpZW50LT51aWQoKSwgY2xpZW50LT5zZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNvdXJjZSgpLCBjbGllbnQtPnBvcnRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pc1NpbGVuY2VkKCl9OworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHNMaXN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xpZW50RWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgZWZmZWN0c0xpc3QgPSBnZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJnJlY29yZENsaWVudEluZm8sICZzZXNzaW9uQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFZmZlY3RzLCAmY29uZmlnLCBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2hIYW5kbGUsIHNvdXJjZSgpKTsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRDbGllbnRzRm9yU2Vzc2lvbigKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+c2Vzc2lvbigpID09IHNlc3Npb24pIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSkgY29uc3QKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKCghYWN0aXZlT25seSB8fCBjbGllbnQtPmFjdGl2ZSgpKQorICAgICAgICAgICAgJiYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCB8fCBzb3VyY2UgPT0gY2xpZW50LT5zb3VyY2UoKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fCBjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZXBsYWNlVmFsdWVGb3IoZWZmZWN0LT5tSWQsIGVmZmVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlbW92ZUl0ZW0oZWZmZWN0LT5tSWQpOworICAgIH0KKworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZ2V0Q2xpZW50c0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdCllZmZlY3QtPm1TZXNzaW9uKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gY2xpZW50RWZmZWN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpLmdldEVmZmVjdChlZmZlY3QtPm1JZCk7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IChlbmFibGVkICYmIGNsaWVudEVmZmVjdCA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgIHx8ICghZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgIT0gbnVsbHB0cik7CisgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIGlmIChjaGFuZ2VkICYmIGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3QKK3sKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlbmFibGVkRWZmZWN0czsKKyAgICAvLyByZXBvcnQgZWZmZWN0cyBmb3IgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgc291cmNlIGFzIGFwcGxpZWQgdG8gYWxsIGNsaWVudHMKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9CisgICAgICAgIGNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIHNvdXJjZSgpLCBmYWxzZSAvKnByZWZlcnJlZERldmljZU9ubHkqLyk7CisgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMCkgeworICAgICAgICBlbmFibGVkRWZmZWN0cyA9IGNsaWVudHNbMF0tPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgfQorICAgIHJldHVybiBlbmFibGVkRWZmZWN0czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgeworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gY2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGlmICh1aWQgPT0gY2xpZW50LT51aWQoKSkgeworICAgICAgICAgICAgYm9vbCB3YXNTaWxlbmNlZCA9IGNsaWVudC0+aXNTaWxlbmNlZCgpOworICAgICAgICAgICAgY2xpZW50LT5zZXRBcHBTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJiB3YXNTaWxlbmNlZCAhPSBjbGllbnQtPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIGdldElkKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZ2V0RW5hYmxlZEVmZmVjdHMoKS5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CisgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCiBib29sIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CkBAIC0zMjIsNTYgKzQ2Myw3NCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi11aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoYXVkaW9fZGV2aWNlc190IGRldmljZXMpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAogewogICAgIHVpbnQzMl90IGNvdW50ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKICAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSAmJgotICAgICAgICAgICAgICAgICgoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCkgfHwKLSAgICAgICAgICAgICAgICAgKChpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UgJiBkZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApKSkgeworICAgICAgICAgICAgICAgIChkZXZpY2VzLmlzRW1wdHkoKSB8fCBkZXZpY2VzLmNvbnRhaW5zKGlucHV0RGVzY3JpcHRvci0+Z2V0RGV2aWNlKCkpKSkgewogICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gY291bnQ7CiB9CiAKLVZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCitWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoKQogewogICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fAotICAgICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlSW5wdXRzLmFkZChpbnB1dERlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBhY3RpdmVJbnB1dHM7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0CitzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gaW5wdXREZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKTsKLSAgICByZXR1cm4gZGV2aWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPm1Jb0hhbmRsZSA9PSBlZmZlY3QtPm1JbykgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIH0KICAgICB9Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoCisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggOTliNDVjOC4uZmQzMzY0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0zNCwxOSArMzQsOCBAQAogCiBBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Qb3J0KHBvcnQpLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApCisgICAgOiBtUG9ydChwb3J0KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7Ci0gICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBtUmVmQ291bnRbaV0gPSAwOwotICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKLSAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1TdG9wVGltZVtpXSA9IDA7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7Ci0gICAgfQogICAgIGlmIChtUG9ydC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1Qb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CiAgICAgICAgIGlmIChtUG9ydC0+bUdhaW5zLnNpemUoKSA+IDApIHsKQEAgLTU1LDQ4ICs0NCw4NyBAQAogICAgIH0KIH0KIAorYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0Cit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSB7IC5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGUsIC5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAuZm9ybWF0ID0gbUZvcm1hdCB9OworICAgIHJldHVybiBjb25maWc7Cit9CisKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Qb3J0LmdldCgpICE9IG51bGxwdHIgPyBtUG9ydC0+Z2V0TW9kdWxlSGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKK2F1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0UGF0Y2hIYW5kbGUoKSBjb25zdAoreworICAgIHJldHVybiBtUGF0Y2hIYW5kbGU7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOworfQorCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAogewogICAgIHJldHVybiBtSWQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1EZXZpY2U7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQotewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAogICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGhhc1NhbWVId01vZHVsZUFzKG91dHB1dERlc2MpOwotICAgIH0KKyAgICByZXR1cm4gaGFzU2FtZUh3TW9kdWxlQXMob3V0cHV0RGVzYyk7CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0U3RvcFRpbWUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBuc2Vjc190IHN5c1RpbWUpCiB7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKLSAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOwotICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgbVZvbHVtZUFjdGl2aXRpZXNbY2xpZW50LT52b2x1bWVTb3VyY2UoKV0uc2V0U3RvcFRpbWUoc3lzVGltZSk7CisgICAgbVJvdXRpbmdBY3Rpdml0aWVzW2NsaWVudC0+c3RyYXRlZ3koKV0uc2V0U3RvcFRpbWUoc3lzVGltZSk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKK3sKKyAgICBhdXRvIGNsaWVudEl0ZXIgPSBzdGQ6OmZpbmQoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLCBjbGllbnQpOworICAgIGlmIChhY3RpdmUgPT0gKGNsaWVudEl0ZXIgIT0gZW5kKG1BY3RpdmVDbGllbnRzKSkpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaWdub3JlZCBhY3RpdmU6ICVkLCBjdXJyZW50IHN0cmVhbSBjb3VudCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBhY3RpdmUsCisgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChjbGllbnQtPnN0cmF0ZWd5KCkpLmdldEFjdGl2aXR5Q291bnQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7Ci0gICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgbUFjdGl2ZUNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUNsaWVudHMuZXJhc2UoY2xpZW50SXRlcik7CisgICAgfQorICAgIGNvbnN0IGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAvLyBJZiBwcyBpcyB1bmtub3duLCBpdCBpcyB0aW1lIHRvIHRyYWNrIGl0IQorICAgIG1Sb3V0aW5nQWN0aXZpdGllc1tjbGllbnQtPnN0cmF0ZWd5KCldLmNoYW5nZUFjdGl2aXR5Q291bnQoZGVsdGEpOworICAgIG1Wb2x1bWVBY3Rpdml0aWVzW2NsaWVudC0+dm9sdW1lU291cmNlKCldLmNoYW5nZUFjdGl2aXR5Q291bnQoZGVsdGEpOworCisgICAgLy8gSGFuZGxlIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgaW50MzJfdCBvbGRHbG9iYWxBY3RpdmVDb3VudCA9IG1HbG9iYWxBY3RpdmVDb3VudDsKKyAgICBpZiAoIWFjdGl2ZSAmJiBtR2xvYmFsQWN0aXZlQ291bnQgPCAxKSB7CisgICAgICAgIEFMT0dXKCIlcyglcyk6IGludmFsaWQgZGVhY3RpdmF0aW9uIHdpdGggZ2xvYmFsUmVmQ291bnQgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgbUdsb2JhbEFjdGl2ZUNvdW50ICs9IGRlbHRhOworCisgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgeworICAgICAgICBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID09IDApIHx8IChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA+IDAgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7Cit9CisKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZShWb2x1bWVTb3VyY2UgdnMsIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgcmV0dXJuICh2cyA9PSBWT0xVTUVfU09VUkNFX05PTkUpID8KKyAgICAgICAgICAgICAgICBpc0FjdGl2ZShpblBhc3RNcykgOiAobVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZSk7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTEwNSw0MyArMTMzLDIzIEBACiAgICAgaWYgKGluUGFzdE1zICE9IDApIHsKICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICBpZiAoaXRlci5maXJzdCA9PSBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUEFUQ0gpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGluUGFzdE1zID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc3lzVGltZSA9PSAwKSB7Ci0gICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgfQotICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkKQogewogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKQEAgLTE1MCw5ICsxNTgsOSBAQAogICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgogICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCiAgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKLSAgICBpZiAodm9sdW1lICE9IG1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgewotICAgICAgICBBTE9HVigic2V0Vm9sdW1lKCkgZm9yIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgbUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgIGlmICh2b2x1bWVEYiAhPSBnZXRDdXJWb2x1bWUoc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihzdHJlYW0pKSB8fCBmb3JjZSkgeworICAgICAgICBBTE9HVigic2V0Vm9sdW1lKCkgZm9yIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIHN0cmVhbSwgdm9sdW1lRGIsIGRlbGF5TXMpOworICAgICAgICBzZXRDdXJWb2x1bWUoc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihzdHJlYW0pLCB2b2x1bWVEYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODQsMzIgKzE5Miw1NSBAQAogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCitUcmFja0NsaWVudFZlY3RvciBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fAorICAgICAgICAgICAgICAgIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmICFjbGllbnQtPmlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnZvbHVtZVNvdXJjZVRvSWdub3JlXShjb25zdCBhdXRvICZjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjMsNDMgKzI1NCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1PdXRwdXQxLT5kZXZpY2VzKCk7CisgICAgICAgIGRldmljZXMubWVyZ2UobU91dHB1dDItPmRldmljZXMoKSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICByZXR1cm4gbURldmljZXM7CiB9CiAKIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwpAQCAtMjcxLDEyICsyOTMsMzkgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIHN1cHBvcnRlZERldmljZXMubWVyZ2UobU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzLmZpbHRlcihkZXZpY2VzKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dDItPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOworICAgICAgIHJldHVybiBtUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpOwogICAgIH0KIH0KIApAQCAtMjg5LDQxICszMzgsMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOworICAgICAgICBtT3V0cHV0Mi0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKICAgICB9Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLQotICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50Ci0gICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOwotICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKLSAgICB9Ci0gICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA+IDApICYmIChtR2xvYmFsUmVmQ291bnQgPT0gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC0zNjQsMzQgKzM4OCw1OCBAQAogICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKLSAgICAgICAgLy8gZW5hYmxlZAotICAgICAgICBmbG9hdCB2b2x1bWUgPSBWb2x1bWU6OkRiVG9BbXBsKG1DdXJWb2x1bWVbc3RyZWFtXSk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKLSAgICAgICAgfQotICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgaWYgKCFBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWVEYiwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBjaGFuZ2VkOworICAgIGlmICghZGV2aWNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBBc3N1bWUgZmlyc3QgZGV2aWNlIHRvIGNoZWNrIHVwb24gR2FpbiBDcm9udHJvbGxlciBhdmFpbGFiaWxpdHkKKyAgICAgICAgY29uc3QgYXV0byAmZGV2aWNlUG9ydCA9IGRldmljZXMoKS5pdGVtQXQoMCk7CisgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICVzIGhhc0dDICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgZGV2aWNlUG9ydC0+dG9TdHJpbmcoKS5jX3N0cigpLCBkZXZpY2VzKCkuaXRlbUF0KDApLT5oYXNHYWluQ29udHJvbGxlcih0cnVlKSk7CisgICAgICAgIGlmIChkZXZpY2VQb3J0LT5oYXNHYWluQ29udHJvbGxlcih0cnVlKSkgeworICAgICAgICAgICAgLy8gQHRvZG86IGRlZmF1bHQgc3RyZWFtIHZvbHVtZSB0byBtYXggKDApIHdoZW4gdXNpbmcgSFcgUG9ydCBnYWluPworICAgICAgICAgICAgZmxvYXQgdm9sdW1lQW1wbCA9IFZvbHVtZTo6RGJUb0FtcGwoMCk7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworCisgICAgICAgICAgICBBdWRpb0dhaW5zIGdhaW5zID0gZGV2aWNlUG9ydC0+Z2V0R2FpbnMoKTsKKyAgICAgICAgICAgIGludCBnYWluTWluVmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldE1pblZhbHVlSW5NYigpOworICAgICAgICAgICAgaW50IGdhaW5NYXhWYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWF4VmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2FpblN0ZXBWYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0U3RlcFZhbHVlSW5NYigpOworICAgICAgICAgICAgaW50IGdhaW5WYWx1ZU1iID0gKCh2b2x1bWVEYiAqIDEwMCkvIGdhaW5TdGVwVmFsdWVJbk1iKSAqIGdhaW5TdGVwVmFsdWVJbk1iOworICAgICAgICAgICAgZ2FpblZhbHVlTWIgPSBzdGQ6Om1heChnYWluTWluVmFsdWVJbk1iLCBzdGQ6Om1pbihnYWluVmFsdWVNYiwgZ2Fpbk1heFZhbHVlSW5NYikpOworCisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGRldmljZVBvcnQtPnRvQXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpOworICAgICAgICAgICAgY29uZmlnLmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICAgICAgICAgIGNvbmZpZy5nYWluLnZhbHVlc1swXSA9IGdhaW5WYWx1ZU1iOworICAgICAgICAgICAgcmV0dXJuIG1DbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnLCAwKSA9PSBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcyBlbmFibGVkCisgICAgZmxvYXQgdm9sdW1lQW1wbCA9IFZvbHVtZTo6RGJUb0FtcGwoZ2V0Q3VyVm9sdW1lKHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oc3RyZWFtKSkpOworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIH0KKyAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCkKIHsKKyAgICBtRGV2aWNlcyA9IGRldmljZXM7CisgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyA9IGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2aWNlcy50eXBlcygpOworCiAgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKICAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKQEAgLTQwMiw3ICs0NTAsNiBAQAogICAgICAgICBsQ29uZmlnID0gKmNvbmZpZzsKICAgICB9CiAKLSAgICBtRGV2aWNlID0gZGV2aWNlOwogICAgIC8vIGlmIHRoZSBzZWxlY3RlZCBwcm9maWxlIGlzIG9mZmxvYWRlZCBhbmQgbm8gb2ZmbG9hZCBpbmZvIHdhcyBzcGVjaWZpZWQsCiAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKICAgICBpZiAoKG1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgJiYKQEAgLTQyMCwxOSArNDY3LDE5IEBACiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKIAotICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSAhPSBkZXZpY2UsCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlcy50eXBlcygpICE9IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuT3V0cHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlcy50eXBlcygpLCBkZXZpY2UpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC00OTEsNiArNTM4LDE3IEBACiB2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSW9IYW5kbGUsIHBhcmFtLnRvU3RyaW5nKCkpOwpAQCAtNDk5LDExICs1NTcsNiBAQAogCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpCi0gICAgICAgIC8vIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHN0cmVhbXMgYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKICAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQpAQCAtNTM0LDU1ICs1ODcsNDEgQEAKIH0KIAogLy8gSHdBdWRpb091dHB1dERlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KLUh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCitId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+bURldmljZSwgY2xpZW50SW50ZXJmYWNlKSwKKyAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPnNyY0RldmljZSgpLCBjbGllbnRJbnRlcmZhY2UpLAogICAgICAgbVNvdXJjZShzb3VyY2UpCiB7CiB9CiAKLXN0YXR1c190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGZkKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlNvdXJjZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtU291cmNlLT5kdW1wKGZkKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fZGV2aWNlc190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiU291cmNlOlxuIik7CisgICAgbVNvdXJjZS0+ZHVtcChkc3QsIDAsIDApOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIH0KIAogdm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0KHBvcnQpOwogfQogCiAKLWJvb2wgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCitib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOworICAgIGJvb2wgY2hhbmdlZCA9IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwogCiAgICAgaWYgKGNoYW5nZWQpIHsKICAgICAgIC8vIFRPRE86IHVzZSBnYWluIGNvbnRyb2xsZXIgb24gc291cmNlIGRldmljZSBpZiBhbnkgdG8gYWRqdXN0IHZvbHVtZQpAQCAtNTkxLDM5ICs2MzAsMzggQEAKIH0KIAogLy8gU3dBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmVMb2NhbGx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpCi0gICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKQorICAgICAgICAgICAgICAgICYmICgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSA9PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQogICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKQEAgLTYzNCwxMSArNjcyLDI4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG90aGVyRGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5zaGFyZXNId01vZHVsZVdpdGgob3RoZXJEZXNjKSAmJgorICAgICAgICAgICAgICAgIG90aGVyRGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcywgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAgJiYKKyAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MCwxMiArNzA1LDExIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7Ci0gICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPmdldE1vZHVsZSgpICE9IE5VTEwpKSB7CisgICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRQcm9maWxlIDogcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02OTAsODkgKzc0NCw1OSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi0KLXN0YXR1c190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlLCBpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi4zYTRkYjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI3IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgJmNmZyA9IGNmZ3NbaV07CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgIFslcyAlZF0gIiwgc3BhY2VzLCAiIiwgcHJlZml4LCBpICsgMSk7CisgICAgICAgIGlmIChjZmcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIElEICVkICVzIiwgY2ZnLmlkLCB0b1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlKS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJNaXggSUQgJWQgSS9PIGhhbmRsZSAlZCIsIGNmZy5pZCwgY2ZnLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNpbmtzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zaW5rcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KK30KIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9QYXRjaDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUGF0Y2ggJWQ6IG93bmVyIHVpZCAlNGQsIGhhbmRsZSAlMmQsIGFmIGhhbmRsZSAlMmRcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLCBpbmRleCArIDEsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzcmMgIiwgbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7CisgICAgZHVtcFBhdGNoRW5kcG9pbnRzKGRzdCwgc3BhY2VzLCAic2luayIsIG1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKQEAgLTE2MSwxNiArMTM1LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKaW5kZXggMDg5MzBmMS4uMjNkNzY0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgIG1PdXRwdXQuY2xlYXIoKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1peDo6c2V0TWl4KEF1ZGlvTWl4ICZtaXgpCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoY29uc3QgQXVkaW9NaXggJm1peCkKIHsKICAgICBtTWl4ID0gbWl4OwogfQpAQCAtNTIsNjQgKzUyLDUzIEBACiAgICAgcmV0dXJuICZtTWl4OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBQb2xpY3kgTWl4ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNBdWRpbyBQb2xpY3kgTWl4ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKTsKICAgICBzdGQ6OnN0cmluZyBtaXhUeXBlTGl0ZXJhbDsKICAgICBpZiAoIU1peFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1NaXgubU1peFR5cGUsIG1peFR5cGVMaXRlcmFsKSkgewogICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IG1peCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtTWl4Lm1NaXhUeXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyByb3V0ZUZsYWdMaXRlcmFsOwogICAgIFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhtTWl4Lm1Sb3V0ZUZsYWdzLCByb3V0ZUZsYWdMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKLSAgICBkZXZpY2VUb1N0cmluZyhtTWl4Lm1EZXZpY2VUeXBlLCBkZXZpY2VMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgYWRkcmVzczogJXNcbiIsIHNwYWNlcywgIiIsIG1NaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1NaXgubURldmljZVR5cGUpLmNfc3RyKCkpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtTWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKIAogICAgIGludCBpbmRleENyaXRlcmlvbiA9IDA7CiAgICAgZm9yIChjb25zdCBhdXRvICZjcml0ZXJpb24gOiBtTWl4Lm1Dcml0ZXJpYSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIENyaXRlcmlvbiAlZDpcbiIsIHNwYWNlcyArIDIsICIiLCBpbmRleENyaXRlcmlvbisrKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VMaXRlcmFsOwogICAgICAgICBpZiAoIVVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tVXNhZ2UsIHVzYWdlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgdXNhZ2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgICAgICBpZiAobU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxpdGVyYWw7CiAgICAgICAgICAgICBpZiAoIVNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgc291cmNlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgc291cmNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVWlkOiVkXG4iLCBzcGFjZXMgKyA0LCAiIiwgY3JpdGVyaW9uLm1WYWx1ZS5tVWlkKTsKKwogICAgICAgICBzdGQ6OnN0cmluZyBydWxlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFSdWxlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1SdWxlLCBydWxlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlICVkIiwgX19GVU5DVElPTl9fLGNyaXRlcmlvbi5tUnVsZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUnVsZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHJ1bGVMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwKQEAgLTE2NSwxMzcgKzE1NCwyMDMgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmcHJpbWFyeURlc2MsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKQogewogICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcXVlcnlpbmcgJXp1IG1peGVzOiIsIHNpemUoKSk7Ci0gICAgZGVzYyA9IDA7CisgICAgcHJpbWFyeURlc2MgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgaWYgKCFwb2xpY3lEZXNjKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBNaXggaGFzIG5vIG91dHB1dCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisgICAgICAgIGNvbnN0IGJvb2wgcHJpbWFyeU91dHB1dE1peCA9ICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC0+bVJvdXRlRmxhZ3MpOwogCi0gICAgICAgIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaWYgYWRkaW5nIG1vcmUgcGxheWVyIHJ1bGVzIChjdXJyZW50bHkgb25seSAyKSwgbWFrZSBydWxlIGhhbmRsaW5nICJnZW5lcmljIgotICAgICAgICAgICAgLy8gICAgICBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSB0cmVhdG1lbnQgb2YgdXNhZ2UtIG9yIHVpZC1iYXNlZCBydWxlcwotICAgICAgICAgICAgYm9vbCBoYXNVc2FnZU1hdGNoUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdXNhZ2VNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlRXhjbHVzaW9uRm91bmQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByaW1hcnlPdXRwdXRNaXggJiYgcHJpbWFyeURlc2MgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBTa2lwaW5nICV6dTogUHJpbWFyeSBvdXRwdXQgYWxyZWFkeSBmb3VuZCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQcmltYXJ5IG91dHB1dCBhbHJlYWR5IGZvdW5kCisgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWl4TWF0Y2gobWl4LCBpLCBhdHRyaWJ1dGVzLCB1aWQpKSB7CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDogcmV0dXJuIEJBRF9WQUxVRTsgLy8gVE9ETzogRG8gd2UgcmVhbGx5IHdhbnQgdG8gYWJvcnQ/CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDoKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IGRvZXMgbm90IG1hdGNoIiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHRoZSBtaXgKKyAgICAgICAgICAgIGNhc2UgTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGhhc0FkZHJNYXRjaCA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIGdldE91dHB1dEZvckF0dHI6IG1peCAlenU6IGluc3BlY3RpbmcgbWl4IGNyaXRlcmlhICV6dSBvZiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNBZGRyTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIHVzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgdXNhZ2UgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCi0gICAgICAgICAgICAgICAgICAgICAgICB1aWRNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOwotICAgICAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGhhdmUgTUFUQ0ggcnVsZXMsIG9yIEVYQ0xVREUgcnVsZXMgaW4gZWFjaCBkaW1lbnNpb24sIG5vdCBhIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfVUlEIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCi0KLSAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQotICAgICAgICAgICAgaWYgKGhhc0FkZHJNYXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgIHBvbGljeURlc2MtPm1Qb2xpY3lNaXggPSBtaXg7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4KSB7CisgICAgICAgICAgICBwcmltYXJ5RGVzYyA9IHBvbGljeURlc2M7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IHNldCBwcmltYXJ5IGRlc2MiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocG9saWN5RGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1IGlnbm9yZWQgYXMgc2Vjb25kYXJ5T3V0cHV0IGJlY2F1c2Ugbm90IG9wZW5lZCB5ZXQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQWRkIGEgc2Vjb25kYXJ5IGRlc2MgJXp1IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIHNlY29uZGFyeURlc2NzLT5wdXNoX2JhY2socG9saWN5RGVzYyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChwcmltYXJ5RGVzYyA9PSBudWxscHRyICYmIHNlY29uZGFyeURlc2NzLT5lbXB0eSgpKSA/IEJBRF9WQUxVRSA6IE5PX0VSUk9SOworfQogCi0gICAgICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKK0F1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6TWl4TWF0Y2hTdGF0dXMgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjptaXhNYXRjaCgKKyAgICAgICAgY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCkgeworCisgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAvLyBMb29wYmFjayByZW5kZXIgbWl4ZXMgYXJlIGNyZWF0ZWQgZnJvbSBhIHB1YmxpYyBBUEkgYW5kIHRodXMgcmVzdHJpY3RlZAorICAgICAgICAvLyB0byBub24gc2Vuc2libGUgYXVkaW8gdGhhdCBoYXZlIG5vdCBvcHRlZCBvdXQuCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC0+bVJvdXRlRmxhZ3MpKSB7CisgICAgICAgICAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX05PX0NBUFRVUkUpID09IEFVRElPX0ZMQUdfTk9fQ0FQVFVSRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04gfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfTUVESUEgfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfR0FNRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gaWYgYWRkaW5nIG1vcmUgcGxheWVyIHJ1bGVzIChjdXJyZW50bHkgb25seSAyKSwgbWFrZSBydWxlIGhhbmRsaW5nICJnZW5lcmljIgorICAgICAgICAvLyAgICAgIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHRyZWF0bWVudCBvZiB1c2FnZS0gb3IgdWlkLWJhc2VkIHJ1bGVzCisgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZU1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVWlkRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOworICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNBZGRyTWF0Y2ggPSBmYWxzZTsKKworICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbWl4SW5kZXgsIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAorICAgICAgICAgICAgaWYgKHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgeworICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOworICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIFVJRCBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIFVJRHMKKyAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1aWRFeGNsdXNpb25Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgY2hlY2tzOiBmb3IgZWFjaCAiZGltZW5zaW9uIiBvZiBydWxlcyAodXNhZ2UsIHVpZC4uLiksIHdlIGNhbgorICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgorICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzVWlkTWF0Y2hSdWxlcyAmJiBoYXNVaWRFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCisgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaXRlcmF0aW5nIG9uIGNyaXRlcmlhIGJlY2F1c2UgYW4gZXhjbHVzaW9uIHdhcyBmb3VuZCAod2lsbCBmYWlsKQorICAgICAgICAgICAgfQorCisgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGV4aXRpbmcgb24gc3VjY2VzcyAob3IgaW1wbGljaXQgZmFpbHVyZSBhcyBkZXNjIGlzIDApCisgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKKyAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiAhdXNhZ2VNYXRjaEZvdW5kKSAgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7CisgICAgICAgICAgICBBTE9HVigiXHRnZXRPdXRwdXRGb3JBdHRyIHdpbGwgdXNlIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjICE9IDApIHsKLSAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBtaXg7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6TUFUQ0g7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh2YWx1ZUF0KGkpLT5nZXRPdXRwdXQoKSA9PSBvdXRwdXQpIHsKKyAgICAgICAgICAgIEF1ZGlvTWl4ICptaXggPSB2YWx1ZUF0KGkpLT5nZXRNaXgoKTsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAqcG9saWN5TWl4ID0gbWl4OworICAgICAgICAgICAgLy8gVGhpcyBEZXNjIGlzIGludm9sdmVkIGluIGEgTWl4LCB3aGljaCBoYXMgdGhlIGhpZ2hlc3QgcHJpbworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBtaXgtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4LT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICgweCV4LCBhZGRyPSVzKSBmb3JjZWQgYnkgbWl4IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVHlwZSwgYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsRGV2aWNlcywgQXVkaW9NaXggKipwb2xpY3lNaXgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7Ci0KICAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMzA0LDE3ICszNTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8CiAgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgogICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVNvdXJjZSAhPSBpbnB1dFNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxEZXZpY2VzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBQb2xpY3lNaXggb25seSBmb3IgcmVtb3RlIHN1Ym1peCBmb3IgaW5wdXQKKyAgICAgICAgICAgICAgICAvLyBzbyBtaXgtPm1EZXZpY2VUeXBlIGNhbiBvbmx5IGJlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICBhdXRvIG1peERldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgbWl4LT5tRGV2aWNlQWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIGlmIChtaXhEZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSBtaXg7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWl4RGV2aWNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBBdWRpb01peCAqKnBvbGljeU1peCkKQEAgLTMyOCw3ICszODgsNyBAQAogICAgIEFMT0dWKCJnZXRJbnB1dE1peEZvckF0dHIgbG9va2luZyBmb3IgYWRkcmVzcyAlc1xuICBtaXhlcyBhdmFpbGFibGU6IiwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvTWl4ICptaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOwogICAgICAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgfQogI2VuZGlmCkBAIC0zNDksMTQgKzQwOSw5NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBzdGQ6OnN0cmluZyBsb2coIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOwotICAgIHdyaXRlKGZkLCBsb2cuY19zdHIoKSwgbG9nLnNpemUoKSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAvLyByZW1vdmUgZXhpc3RpbmcgcnVsZXMgZm9yIHRoaXMgdWlkCisgICAgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworCisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogYWRkIGEgcnVsZSB0byBtYXRjaCBvciBleGNsdWRlIHRoZSB1aWQgYmFzZWQgb24gdGhlIGRldmljZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIGNvbnN0IEF1ZGlvTWl4ICptaXggPSB2YWx1ZUF0KGkpLT5nZXRNaXgoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBtaXggZ29lcyB0byBhIGRldmljZSBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzCisgICAgICAgIGJvb2wgZGV2aWNlTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZXZpY2VzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tqXS5tVHlwZSA9PSBtaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgICAgICYmIGRldmljZXNbal0ubUFkZHJlc3MgPT0gbWl4LT5tRGV2aWNlQWRkcmVzcykgeworICAgICAgICAgICAgICAgIGRldmljZU1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlTWF0Y2gpIHsKKyAgICAgICAgICAgIG1peC0+c2V0TWF0Y2hVaWQodWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbWl4IGRvZXNuJ3QgZ28gdG8gb25lIG9mIHRoZSBsaXN0ZWQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHVpZCwKKyAgICAgICAgICAgIC8vIG1vZGlmeSBpdHMgcnVsZXMgdG8gZXhjbHVkZSB0aGUgdWlkCisgICAgICAgICAgICBtaXgtPnNldEV4Y2x1ZGVVaWQodWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIC8vIGZvciBlYWNoIHBsYXllciBtaXg6IHJlbW92ZSBleGlzdGluZyBydWxlcyB0aGF0IG1hdGNoIG9yIGV4Y2x1ZGUgdGhpcyB1aWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGJvb2wgZm91bmRVaWRSdWxlID0gZmFsc2U7CisgICAgICAgIGNvbnN0IEF1ZGlvTWl4ICptaXggPSB2YWx1ZUF0KGkpLT5nZXRNaXgoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBjcml0ZXJpYVRvUmVtb3ZlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBydWxlID0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGU7CisgICAgICAgICAgICAvLyBpcyB0aGlzIHJ1bGUgYWZmZWN0aW5nIHRoZSB1aWQ/CisgICAgICAgICAgICBpZiAoKHJ1bGUgPT0gUlVMRV9FWENMVURFX1VJRCB8fCBydWxlID09IFJVTEVfTUFUQ0hfVUlEKQorICAgICAgICAgICAgICAgICAgICAmJiB1aWQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZFVpZFJ1bGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGNyaXRlcmlhVG9SZW1vdmUuaW5zZXJ0KGNyaXRlcmlhVG9SZW1vdmUuYmVnaW4oKSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kVWlkUnVsZSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjcml0ZXJpYVRvUmVtb3ZlLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWEucmVtb3ZlQXQoY3JpdGVyaWFUb1JlbW92ZVtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLAorICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0IHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBmaW5kIHJ1bGVzIHRoYXQgZG9uJ3QgZXhjbHVkZSB0aGlzIHVpZCwgYW5kIGFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIHJ1bGVBbGxvd3NVaWQgPSB0cnVlOworICAgICAgICBjb25zdCBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZTsKKyAgICAgICAgICAgIGlmIChydWxlID09IFJVTEVfRVhDTFVERV9VSUQKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgcnVsZUFsbG93c1VpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChydWxlQWxsb3dzVWlkKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChBdWRpb0RldmljZVR5cGVBZGRyKG1peC0+bURldmljZVR5cGUsIG1peC0+bURldmljZUFkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAppbmRleCBkODU1NjJlLi5hNjZjNjk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTMxLDkgKzMxLDE1IEBACiAvLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCiB2b2lkIEF1ZGlvUG9ydDo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQogeworICAgIEFMT0dWKCIlczogYXR0YWNoaW5nIG1vZHVsZSAlcyB0byBwb3J0ICVzIiwgX19GVU5DVElPTl9fLCBnZXRNb2R1bGVOYW1lKCksIG1OYW1lLnN0cmluZygpKTsKICAgICBtTW9kdWxlID0gbW9kdWxlOwogfQogCit2b2lkIEF1ZGlvUG9ydDo6ZGV0YWNoKCkKK3sKKyAgICBtTW9kdWxlID0gbnVsbHB0cjsKK30KKwogLy8gTm90ZSB0aGF0IGlzIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIEF1ZGlvRmxpbmdlciB1bmlxdWUgSURzCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKIHsKQEAgLTM1NCwyNiArMzYwLDE4IEBACiAgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOwogfQogCi12b2lkIEF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgaWYgKCFtTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBtUHJvZmlsZXMuZHVtcChmZCwgc3BhY2VzKTsKKyAgICAgICAgbVByb2ZpbGVzLmR1bXAoZHN0LCBzcGFjZXMpOwogCiAgICAgICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NiwyMiArMzg0LDEyIEBACiAKIC8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KIAotQXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQotewotICAgIG1TYW1wbGluZ1JhdGUgPSAwOwotICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZykpOwotICAgIG1HYWluLmluZGV4ID0gLTE7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQogewotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKQEAgLTQyNSw2ICs0MTMsOSBAQAogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgIH0KIAogZXhpdDoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC00MzYsMzMgKzQyNywzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHVwZGF0ZUZpZWxkKAorICAgICAgICBjb25zdCBUJiBwb3J0Q29uZmlnRmllbGQsIFQgYXVkaW9fcG9ydF9jb25maWc6Oipwb3J0X2NvbmZpZ19maWVsZCwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnLAorICAgICAgICB1bnNpZ25lZCBpbnQgY29uZmlnTWFzaywgVCBkZWZhdWx0VmFsdWUpCit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSB7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IG51bGxwdHIpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gc3JjQ29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHBvcnRDb25maWdGaWVsZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKwogdm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9CisgICAgdXBkYXRlRmllbGQobVNhbXBsaW5nUmF0ZSwgJmF1ZGlvX3BvcnRfY29uZmlnOjpzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSwgMHUpOworICAgIHVwZGF0ZUZpZWxkKG1DaGFubmVsTWFzaywgJmF1ZGlvX3BvcnRfY29uZmlnOjpjaGFubmVsX21hc2ssCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUFVRElPX0NIQU5ORUxfTk9ORSk7CisgICAgdXBkYXRlRmllbGQobUZvcm1hdCwgJmF1ZGlvX3BvcnRfY29uZmlnOjpmb3JtYXQsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRk9STUFULCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwogICAgIGlmICgoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pICYmIGF1ZGlvcG9ydCAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwpAQCAtNDc4LDYgKzQ3NCwxOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CiAgICAgfQorCisgICAgdXBkYXRlRmllbGQobUZsYWdzLCAmYXVkaW9fcG9ydF9jb25maWc6OmZsYWdzLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTLCB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9KTsKK30KKworYm9vbCBBdWRpb1BvcnRDb25maWc6Omhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSBjb25zdAoreworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNhblVzZUZvclZvbHVtZSA/IGF1ZGlvcG9ydC0+Z2V0R2FpbnMoKS5jYW5Vc2VGb3JWb2x1bWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb3BvcnQtPmdldEdhaW5zKCkuc2l6ZSgpID4gMDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKaW5kZXggZmQ2ZmMxYy4uYTY0NWUwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCkBAIC0xNCwyMCArMTQsMTEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc0luTWFzaygpIGNvbnN0Cit7CisgICAgQ2hhbm5lbHNWZWN0b3IgaW5NYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgaW5NYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5NYXNrVmVjdG9yOworfQorCitDaGFubmVsc1ZlY3RvciBDaGFubmVsc1ZlY3Rvcjo6YXNPdXRNYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBvdXRNYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgb3V0TWFza1ZlY3Rvci5hZGQoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dE1hc2tWZWN0b3I7Cit9CisKK2Jvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCit7CisgICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCisgICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKK30KKworc3RhdGljIEF1ZGlvUHJvZmlsZSogY3JlYXRlRnVsbER5bmFtaWNJbXBsKCkKK3sKKyAgICBBdWRpb1Byb2ZpbGUqIGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKKyAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7CisgICAgcmV0dXJuIGR5bmFtaWNQcm9maWxlOworfQorCisvLyBzdGF0aWMKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpCit7CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgorICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KQoreworICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7CisgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCisgICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIHt9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKK3sKKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpjbGVhcigpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0V4YWN0KHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewpAQCAtMzksMjcgKzEzMSw2IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yID09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCi17Ci0gICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvcihzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCi17Ci0gICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCi0gICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0CiB7CkBAIC0xODIsNDcgKzI1Myw3OSBAQAogICAgIHJldHVybiBiZXN0TWF0Y2ggPiAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CiB9CiAKLXZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPyAiW2R5bmFtaWMgY2hhbm5lbHNdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID8gIltkeW5hbWljIHJhdGVzXSIgOiAiIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsOwogICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKG1Gb3JtYXQsIGZvcm1hdExpdGVyYWwpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KICAgICBpZiAoIW1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIAogICAgIGlmICghbUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOworICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKKyAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKKyAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7CisgICAgLy8gfQorICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOworICAgIHJldHVybiBpbmRleDsKK30KKworc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKK3sKKyAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgICAgICBmb3JtYXRzLmFkZChwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRDaGFubmVsc0Zvcihwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcm9maWxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSAmJiBwcm9maWxlID09IHByb2ZpbGVUb0FkZCkgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAorICAgIHJldHVybiBhZGQocHJvZmlsZVRvQWRkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCkBAIC0yODEsNiArMzg0LDIyOCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjbGVhclByb2ZpbGVzKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoLS1pKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0KGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMgYW5kIHRoZSBjb250ZW50cyBvZiAnb3JkZXInLgorLy8gVGhlIHJlc3VsdCBpcyBvcmRlcmVkIGFjY29yZGluZyB0byAnb3JkZXInLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3JkZXI+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIGNvbnN0IE9yZGVyJiBvcmRlcikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCl9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gY29tbW9uOworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoY29tbW9uLCBjb21tb24uYmVnaW4oKSkpOworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBvcmRlcikgeworICAgICAgICBpZiAoY29tbW9uLmZpbmQoZSkgIT0gY29tbW9uLmVuZCgpKSByZXN1bHQucHVzaF9iYWNrKGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBJbnRlcnNlY3QgdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMsIHJldHVybiBjb21tb24gZWxlbWVudHMgYWNjb3JkaW5nIHRvICdjb21wJyBvcmRlcmluZy4KKy8vICdjb21wJyBpcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb21wYXJlPgorc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gaW50ZXJzZWN0QW5kT3JkZXIoCisgICAgICAgIGNvbnN0IFQmIGlucHV0MSwgY29uc3QgVCYgaW5wdXQyLCBDb21wYXJlIGNvbXApCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgQ29tcGFyZT4gc2V0MXtpbnB1dDEuYmVnaW4oKSwgaW5wdXQxLmVuZCgpLCBjb21wfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQye2lucHV0Mi5iZWdpbigpLCBpbnB1dDIuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oc2V0MS5iZWdpbigpLCBzZXQxLmVuZCgpLCBzZXQyLmJlZ2luKCksIHNldDIuZW5kKCksCisgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgY29tcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHByZWZlcnJlZE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2UgKmJlc3RPdXRwdXRDb25maWcpIGNvbnN0Cit7CisgICAgYXV0byBmb3JtYXRzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoZ2V0U3VwcG9ydGVkRm9ybWF0cygpLAorICAgICAgICAgICAgb3V0cHV0UHJvZmlsZXMuZ2V0U3VwcG9ydGVkRm9ybWF0cygpLCBwcmVmZXJyZWRGb3JtYXRzKTsKKyAgICAvLyBQaWNrIHRoZSBiZXN0IGNvbXBhdGlibGUgcHJvZmlsZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBmb3JtYXRzKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gaW5wdXRQcm9maWxlID0gZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gb3V0cHV0UHJvZmlsZSA9IG91dHB1dFByb2ZpbGVzLmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGYpOworICAgICAgICBpZiAoaW5wdXRQcm9maWxlID09IG51bGxwdHIgfHwgb3V0cHV0UHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNoYW5uZWxzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRDaGFubmVscygpLmFzT3V0TWFzaygpLAorICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCksIHByZWZlcnJlZE91dHB1dENoYW5uZWxzKTsKKyAgICAgICAgaWYgKGNoYW5uZWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gc2FtcGxlUmF0ZXMgPSBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzID8KKyAgICAgICAgICAgICAgICBpbnRlcnNlY3RBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksIG91dHB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8dHlwZW5hbWUgU2FtcGxlUmF0ZVZlY3Rvcjo6dmFsdWVfdHlwZT4oKSkgOgorICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKTsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCIlcygpIGZvdW5kIGNoYW5uZWwgbWFzayAlI3ggYW5kIHNhbXBsZSByYXRlICVkIGZvciBmb3JtYXQgJSN4LiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sICpjaGFubmVscy5iZWdpbigpLCAqc2FtcGxlUmF0ZXMuYmVnaW4oKSwgZik7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmZvcm1hdCA9IGY7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPnNhbXBsZV9yYXRlID0gKnNhbXBsZVJhdGVzLmJlZ2luKCk7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmNoYW5uZWxfbWFzayA9ICpjaGFubmVscy5iZWdpbigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkgJiYgaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0Zvcm1hdFZlY3RvciBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdAoreworICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKK3sKKyAgICAvLyBPbmx5IGFsbG93IHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9mIGR5bmFtaWMgcHJvZmlsZQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKKyAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKKyAgICAgICAgYWRkKHByb2ZpbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyA4KTsKKyAgICB9Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldFNhbXBsZVJhdGVzRm9yKAorICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCiBpbnQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA3OWFkMWY3Li43OWYwOTE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMjQsMjkgKzI0LDMyIEBACiBuYW1lc3BhY2UgYW5kcm9pZAogewogCi12b2lkIEF1ZGlvUm91dGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CiAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Citib29sIEF1ZGlvUm91dGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3QKK3sKKyAgICBpZiAobVNpbmsgPT0gMCB8fCBkc3RQb3J0ID09IDAgfHwgZHN0UG9ydCAhPSBtU2luaykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCIlczogc2lua3MgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc291cmNlUG9ydCA6IG1Tb3VyY2VzKSB7CisgICAgICAgIGlmIChzb3VyY2VQb3J0ID09IHNyY1BvcnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogc291cmNlcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgc291cmNlUG9ydC0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGE0NmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU2Vzc2lvbiIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1Nlc3Npb246OkF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkgOgotICAgIG1SZWNvcmRDbGllbnRJbmZvKHsgLnVpZCA9IHVpZCwgLnNlc3Npb24gPSBzZXNzaW9uLCAuc291cmNlID0gaW5wdXRTb3VyY2V9KSwKLSAgICBtQ29uZmlnKHsgLmZvcm1hdCA9IGZvcm1hdCwgLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZSwgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrfSksCi0gICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKLSAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAotICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKLXsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VPcGVuQ291bnQoaW50IGRlbHRhKQotewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1PcGVuQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgb3BlbiBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1PcGVuQ291bnQpOwotICAgICAgICBtT3BlbkNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtT3BlbkNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBtT3BlbkNvdW50KTsKLSAgICByZXR1cm4gbU9wZW5Db3VudDsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudChpbnQgZGVsdGEpCi17Ci0gICAgY29uc3QgdWludDMyX3Qgb2xkQWN0aXZlQ291bnQgPSBtQWN0aXZlQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUFjdGl2ZUNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGludmFsaWQgZGVsdGEgJWQsIGFjdGl2ZSBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1BY3RpdmVDb3VudCk7Ci0gICAgICAgIG1BY3RpdmVDb3VudCA9ICh1aW50MzJfdCkoLWRlbHRhKTsKLSAgICB9Ci0gICAgbUFjdGl2ZUNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBhY3RpdmUgY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1BY3RpdmVDb3VudCk7Ci0gICAgaW50IGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FOwotCi0gICAgaWYgKChvbGRBY3RpdmVDb3VudCA9PSAwKSAmJiAobUFjdGl2ZUNvdW50ID4gMCkpIHsKLSAgICAgICAgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUOwotICAgIH0gZWxzZSBpZiAoKG9sZEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1BY3RpdmVDb3VudCA9PSAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQgIT0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FKSB7Ci0gICAgICAgIC8vIER5bmFtaWMgcG9saWN5IGNhbGxiYWNrOgotICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQpID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGNhbGxiYWNrOgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZtUmVjb3JkQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtQWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uOjptYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdAotewotICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbVJlY29yZENsaWVudEluZm8uc291cmNlICYmCi0gICAgICAgIG90aGVyLT5mb3JtYXQoKSA9PSBtQ29uZmlnLmZvcm1hdCAmJgotICAgICAgICBvdGhlci0+c2FtcGxlUmF0ZSgpID09IG1Db25maWcuc2FtcGxlX3JhdGUgJiYKLSAgICAgICAgb3RoZXItPmNoYW5uZWxNYXNrKCkgPT0gbUNvbmZpZy5jaGFubmVsX21hc2sgJiYKLSAgICAgICAgb3RoZXItPmZsYWdzKCkgPT0gbUZsYWdzICYmCi0gICAgICAgIG90aGVyLT51aWQoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby51aWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246OnNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKQotewotICAgIG1JbmZvUHJvdmlkZXIgPSBwcm92aWRlcjsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246Om9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdAotewotICAgIGlmIChtQWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIHJlc2VuZCB0aGUgY2FsbGJhY2sgYWZ0ZXIgcmVxdWVyeWluZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIGluZm8gcHJvdmlkZXIKLSAgICAgICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBwcm92aWRlciA9IG1JbmZvUHJvdmlkZXI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldENvbmZpZygpIDoKLSAgICAgICAgICAgICAgICBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKLSAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gc2Vzc2lvbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc291cmNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuZm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGU6ICVkXG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2s6ICUwOHhcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUNvbmZpZy5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlzIHNvdW5kdHJpZ2dlcjogJXNcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUlzU291bmRUcmlnZ2VyID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3BlbiBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1PcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFjdGl2ZSBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1BY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjphZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBBTE9HVygiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgYWxyZWFkeSBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0SW5mb1Byb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBhZGQoc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICBBTE9HVigiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgIGNsaWVudCAlZCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OnJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgaW4iLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBBTE9HVigicmVtb3ZlU2Vzc2lvbigpIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKLSAgICB2YWx1ZUF0KGluZGV4KS0+c2V0SW5mb1Byb3ZpZGVyKE5VTEwpOwotICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0T3BlbkNvdW50KCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCBvcGVuQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3BlbkNvdW50ICs9IHZhbHVlQXQoaSktPm9wZW5Db3VudCgpOwotICAgIH0KLSAgICByZXR1cm4gb3BlbkNvdW50OwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3QKLXsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbnMuYWRkKHZhbHVlQXQoaSktPnNlc3Npb24oKSwgdmFsdWVBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZVNlc3Npb25zOwotfQotCi1zaXplX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3QKLXsKLSAgICBzaXplX3QgYWN0aXZlQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVNlc3Npb25Db3VudCgpICE9IDA7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZXF1aXZhbGVudCB0byBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gb25seSBpZiBpdAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY2FwdHVyZSB0cmlnZ2VyZWQgYnkgYSBoYXJkd2FyZSBob3R3b3JkIHJlY29nbml0aW9uCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPiAwICYmCi0gICAgICAgICAgICAgICAgKChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gc291cmNlKSB8fAotICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKLSAgICAgICAgICAgICAgICAgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYKLSAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5pc1NvdW5kVHJpZ2dlcigpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYXVkaW9fc291cmNlX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLSAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gIGF1ZGlvU2Vzc2lvbiA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhY3RpdmVPbmx5ICYmIGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IGN1clByaW9yaXR5OwotICAgICAgICAgICAgc291cmNlID0gYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5vblNlc3Npb25JbmZvVXBkYXRlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBTZXNzaW9uczpcbiIsIHNwYWNlcywgIiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMzZTU3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU291cmNlRGVzY3JpcHRvciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPEh3TW9kdWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPElPUHJvZmlsZS5oPgotI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEF1ZGlvU291cmNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtU3RyZWFtOiAlZFxuIiwgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibURldmljZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtRGV2aWNlLT5kdW1wKGZkLCAyICwgMCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvU291cmNlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIHNvdXJjZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gU291cmNlICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDdhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX0NsaWVudERlc2NyaXB0b3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIHNzIDw8ICJQb3J0SWQ6ICIgPDwgbVBvcnRJZCA8PCAiIFNlc3Npb25JZDogIiA8PCBtU2Vzc2lvbklkIDw8ICIgVWlkOiAiIDw8IG1VaWQ7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0NsaWVudCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFBvcnQgSWQ6ICVkIFNlc3Npb24gSWQ6ICVkIFVJRDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbVBvcnRJZCwgbVNlc3Npb25JZCwgbVVpZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRm9ybWF0OiAlMDh4IFNhbXBsaW5nIHJhdGU6ICVkIENoYW5uZWxzOiAlMDh4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Db25maWcuZm9ybWF0LCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXR0cmlidXRlczogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcmVmZXJyZWQgRGV2aWNlIElkOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtUHJlZmVycmVkRGV2aWNlSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0YXRlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZSA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7Cit9CisKK3ZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgfQorfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncyk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgKyAyIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKK30KKworU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6U291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLAorICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAorICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8pLAorICAgICAgICBtUGF0Y2hEZXNjKHBhdGNoRGVzYyksIG1TcmNEZXZpY2Uoc3JjRGV2aWNlKQoreworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpCit7CisgICAgbVN3T3V0cHV0ID0gc3dPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0SHdPdXRwdXQoY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+JiBod091dHB1dCkKK3sKKyAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERldmljZTpcbiIsIHNwYWNlcywgIiIpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCAyLCAwKTsKK30KKwordm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMDVmNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Q29uZmlnUGFyc2luZ1V0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2s7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LnVzZUlucHV0Q2hhbm5lbE1hc2soKSkgewotICAgICAgICAgICAgICAgIGlmIChJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXVkaW9Qb3J0Lm1HYWlucy5hZGQoZ2Fpbik7Ci19Ci0KLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRBdWRpb1BvcnRHYWluKG5vZGUsIGF1ZGlvUG9ydCwgaW5kZXgrKyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYykKLXsKLSAgICBsb2FkQXVkaW9Qb3J0R2FpbnMocm9vdCwgKmRldmljZURlc2MpOwotICAgIGlmIChkZXZpY2VEZXNjLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBkZXZpY2VEZXNjLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJmRldmljZURlc2MtPm1HYWluKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9UWVBFKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VGcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAotICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChyb290LT5uYW1lKSk7Ci0KLSAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlVmVjdG9yKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKG5vZGUsIGRldmljZURlc2MpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgKGxpdGVyYWwgdHlwZSkgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotCi0gICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIHJvbGUpOwotCi0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7Ci0gICAgU2FtcGxlUmF0ZVZlY3RvciBzYW1wbGVSYXRlczsKLSAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsczsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPFNhbXBsZVJhdGVUcmFpdHM+KG5vZGUtPnZhbHVlLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGRldmljZXMsIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkQXVkaW9Qb3J0R2FpbnMobm9kZSwgKnByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoZm9ybWF0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0NoYW5uZWxzKGNoYW5uZWxzLmlzRW1wdHkoKSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiwgZm9yIGVhY2ggZm9ybWF0LCBjcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBjb2xsZWN0aW9uIG9mIHJhdGUgYW5kIGNoYW5uZWxzLgotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sIGNoYW5uZWxzLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQoZm9ybWF0c1tpXSA9PSBnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljUmF0ZShzYW1wbGVSYXRlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm9maWxlLT5zZXRBdWRpb1Byb2ZpbGVzKGF1ZGlvUHJvZmlsZXMpOwotICAgIEFMT0dXX0lGKCFwcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCksICJsb2FkJXMoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIiwKLSAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiKTsKLSAgICBpZiAocHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkJXMoKSBhZGRpbmcgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAotICAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiLAotICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpLCBwcm9maWxlLT5nZXRGbGFncygpKTsKLSAgICAgICAgcmV0dXJuIG1vZHVsZS0+YWRkUHJvZmlsZShwcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVEZXZpY2Uobm9kZSwgZGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZXMpOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSwgY29uZmlnKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobm9kZS0+bmFtZSk7Ci0gICAgICAgIGlmIChsb2FkSHdNb2R1bGUobm9kZSwgbW9kdWxlLCBjb25maWcpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBod01vZHVsZXMuYWRkKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZWNsYXJlZERldmljZXMpCi17Ci0gICAgY2hhciAqdGFnTGl0ZXJhbCA9IHN0cm5kdXAodGFnLCBzdHJsZW4odGFnKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZ0xpdGVyYWwsIEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlRnJvbVN0cmluZyhkZXZUYWcsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaW5CaXQgPSB0eXBlICYgQVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc2luZ2xlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkJpdCB8ICgxIDw8ICgzMSAtIF9fYnVpbHRpbl9jbHoodHlwZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSAmPSB+c2luZ2xlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2ID0gbmV3IERldmljZURlc2NyaXB0b3Ioc2luZ2xlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB9Ci0gICAgZnJlZSh0YWdMaXRlcmFsKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKLSAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKLSAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgICAgICBjb25maWcuYWRkQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0RGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPnNldEhhbFZlcnNpb24obWFqb3IsIG1pbm9yKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsIG1ham9yLCBtaW5vcik7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIHByaW1hcnlNb2R1bGUpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQ7Ci0gICAgICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KG5vZGUtPnZhbHVlLCBzcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGxvYWRNb2R1bGVHbG9iYWxDb25maWcocm9vdCwgcHJpbWFyeU1vZHVsZSwgY29uZmlnKTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBId01vZHVsZUNvbGxlY3Rpb24gaHdNb2R1bGVzOwotICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLCBjb25maWcpOwotCi0gICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24sIGF0dGFjaGVkIHRvIHByaW1hcnkuCi0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBjb25maWcsIGh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOwotCi0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhod01vZHVsZXMpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggMTljMjA2Mi4uOTE5NjFkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKQEAgLTI2LDE0ICsyOCwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3IodHlwZSwgRm9ybWF0VmVjdG9ye30sIHRhZ05hbWUpCit7Cit9CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMsCisgICAgICAgIGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIDoKICAgICBBdWRpb1BvcnQoU3RyaW5nOCgiIiksIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCiAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKLSAgICBtQWRkcmVzcygiIiksIG1UYWdOYW1lKHRhZ05hbWUpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUlkKDApCisgICAgbVRhZ05hbWUodGFnTmFtZSksIG1EZXZpY2VUeXBlKHR5cGUpLCBtRW5jb2RlZEZvcm1hdHMoZW5jb2RlZEZvcm1hdHMpCiB7CisgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfHwgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7CiAgICAgICAgIG1BZGRyZXNzID0gU3RyaW5nOCgiMCIpOwogICAgIH0KKyAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KKyAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KKyAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQorICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgorICAgICAqLworICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSAmJiBtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0FDMyk7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKKyAgICB9CiB9CiAKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgRGV2aWNlRGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdApAQCAtNDcsMTUgKzY1LDU3IEBACiAgICAgbUlkID0gZ2V0TmV4dFVuaXF1ZUlkKCk7CiB9CiAKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZGV0YWNoKCkgeworICAgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb3J0OjpkZXRhY2goKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2hlY2tFcXVhbChjb25zdCBUJiBmMSwgY29uc3QgVCYgZjIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczEoZjEuYmVnaW4oKSwgZjEuZW5kKCkpOworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHMyKGYyLmJlZ2luKCksIGYyLmVuZCgpKTsKKyAgICByZXR1cm4gczEgPT0gczI7Cit9CisKIGJvb2wgRGV2aWNlRGVzY3JpcHRvcjo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3QKIHsKICAgICAvLyBEZXZpY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXk6CiAgICAgLy8gLSBhcmUgb2YgdGhlIHNhbWUgdHlwZSAoYSBkZXZpY2UgdHlwZSBjYW5ub3QgYmUgQVVESU9fREVWSUNFX05PTkUpCiAgICAgLy8gLSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgZW5jb2RpbmdGb3JtYXRzIChpZiBkZXZpY2Ugc3VwcG9ydHMgZW5jb2RpbmcpCiAgICAgaWYgKG90aGVyID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcyk7CisKKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKKyAgICAgICAgICAgY2hlY2tFcXVhbChtRW5jb2RlZEZvcm1hdHMsIG90aGVyLT5tRW5jb2RlZEZvcm1hdHMpOworfQorCitib29sIERldmljZURlc2NyaXB0b3I6Omhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3QKK3sKKyAgICBpZiAoIWRldmljZV9oYXNfZW5jb2RpbmdfY2FwYWJpbGl0eSh0eXBlKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAobUVuY29kZWRGb3JtYXRzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKG1DdXJyZW50RW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvcjo6c3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7CisgICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQpAQCAtNzAsNyArMTMwLDcgQEAKIHNzaXplX3QgRGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW0tPmVxdWFscyhpdGVtQXQoaSkpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmVxdWFscyhpdGVtKSkgeyAvLyBpdGVtIG1heSBiZSBudWxsIHNwPD4sIGkuZS4gQVVESU9fREVWSUNFX05PTkUKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIxLDcwICsxODEsODQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1hdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7Ci0gICAgICAgICAgICBkZXZpY2VzIHw9IGl0ZW1BdChpKS0+dHlwZSgpOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICByZW1vdmUoZGV2aWNlKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0CithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcyB8PSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgIC8vIElmIGZvcm1hdCBpcyBzcGVjaWZpZWQsIG1hdGNoIGl0IGFuZCBpZ25vcmUgYWRkcmVzcworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIG1hdGNoIGl0CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWx3YXlzIG1hdGNoCisgICAgICAgICAgICBpZiAoKChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpICYmCisgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgfHwKKyAgICAgICAgICAgICAgICAoaXRlbUF0KGkpLT5zdXBwb3J0c0Zvcm1hdChmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmFkZHJlc3MoKSA9PSBhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIGZvcm1hdCAlMDh4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCksIGZvcm1hdCk7CiAgICAgcmV0dXJuIGRldmljZTsKIH0KIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgaWYgKGlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZU1hc2soYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAgICAgYm9vbCBpc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpOwogICAgIHR5cGUgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgewotICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT50eXBlKCkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+dHlwZSgpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIGlmICgoaXNPdXRwdXQgPT0gY3VySXNPdXRwdXQpICYmICgodHlwZSAmIGN1clR5cGUpICE9IDApKSB7CiAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwogICAgICAgICAgICAgdHlwZSAmPSB+Y3VyVHlwZTsKLSAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKLSAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSB0eXBlICYmIGRldmljZS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OiVzKCkgZm9yIHR5cGUgJTA4eCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKQEAgLTIwMCwyMCArMjc0LDE1IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTI0NiwxOSArMzE1LDE4IEBACiAgICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KICAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCiAgICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0KLSAgICAgICAgICAgIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CiAgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CiAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5nZXRIYW5kbGUoKTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKQEAgLTI3MCw0MiArMzM4LDcxIEBACiAgICAgcG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKTsKICAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CiAgICAgfQogICAgIGlmICghbVRhZ05hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgaWYgKGRldmljZVRvU3RyaW5nKG1EZXZpY2VUeXBlLCBkZXZpY2VMaXRlcmFsKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMsIHZlcmJvc2UpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCA6OmFuZHJvaWQ6OnRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgIH0KKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIHZlcmJvc2UpOworfQorCitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCkgPDwgIixAOiIgPDwgbUFkZHJlc3M7CisgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0geyJ7In07CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CisgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6ZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZERldmljZXM7Cit9CisKK2Jvb2wgRGV2aWNlVmVjdG9yOjpjb250YWluc0F0TGVhc3RPbmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiAhZmlsdGVyKGRldmljZXMpLmlzRW1wdHkoKTsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbHRlcihkZXZpY2VzKS5zaXplKCkgPT0gZGV2aWNlcy5zaXplKCk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9nKCkgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZSk7Ci0gICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JVg6JXMsIGFkZHI6JXMiLCBtSWQsICBtRGV2aWNlVHlwZSwgZGV2aWNlLmNfc3RyKCksCisgICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JTA4WDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLAorICAgICAgICAgIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCksCiAgICAgICAgICAgbUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDdiMjM0MWUuLjg5Zjk4OTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMiwyNSArMjIsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSUQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJL086ICVkXG4iLCBzcGFjZXMsICIiLCBtSW8pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q6ICVzXG4iLCBzcGFjZXMsICIiLCBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Nlc3Npb246ICVkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc05hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCAgbURlc2MubmFtZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKIH0KIAogRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OkVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCkgOgpAQCAtNTMsMTAgKzQyLDE0IEBACiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsIGJvb2wgaXNNdXNpY0VmZmVjdCkKIHsKKyAgICBpZiAoZ2V0RWZmZWN0KGlkKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBlZmZlY3QgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CkBAIC02NiwzNCArNTksMzMgQEAKICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA+IG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKSB7CiAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKICAgICB9Ci0gICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCi0gICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzZXNzaW9uICVkIGlkICVkIiwKKyAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzZXNzaW9uLCBpZCk7CiAgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CiAKLSAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKLSAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKLSAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7Ci0gICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7Ci0KKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoZGVzYywgaXNNdXNpY0VmZmVjdCwgaWQsIGlvLCBzZXNzaW9uKTsKICAgICBhZGQoaWQsIGVmZmVjdERlc2MpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExMSwxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDExICsxNTAsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWJvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKK2Jvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5pc011c2ljRWZmZWN0KCkpICYmCiAgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgewogICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOwpAQCAtMTc0LDI0ICsxNzQsMjIgQEAKICAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKLSAgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnksIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgIlxuJSpzVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsICIKKyAgICAgICAgICAgICJUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLAorICAgICAgICAgICAgKGZsb2F0KSBtVG90YWxFZmZlY3RzQ3B1TG9hZCAvIDEwLAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeSwKKyAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNFZmZlY3RzOlxuIiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBFZmZlY3QgJWQ6XG4iLCBzcGFjZXMsICIiLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwN2ExNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpHYWlucyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSA8Vm9sdW1lLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmdpbmVkZWZhdWx0Ci1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi0vLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcwotLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KLS8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgotLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTk2LjBmfSwgezMzLCAtNjguMGZ9LCB7NjYsIC0zNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTk2LjBmfSwgezEsIC05Ni4wZn0sIHsyLCAtOTYuMGZ9LCB7MTAwLCAtOTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMTI4LjBmfSwgezIwLCAtODAuMGZ9LCB7NjAsIC00MC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9NVVNJQwotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUKLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9UVFMKLSAgICAgIC8vICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiOiBhbHdheXMgc2lsZW50IGV4Y2VwdCBvbiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JFUk9VVElORwotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1BBVENICi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi19OwotCi0vL3N0YXRpYwotZmxvYXQgR2FpbnM6OnZvbEluZGV4VG9EYihjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpjdXJ2ZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgsIGludCBpbmRleEluVWkpCi17Ci0gICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCi0gICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCAtIGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXg7Ci0gICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIGluZGV4TWluKSkgLyAoaW5kZXhNYXggLSBpbmRleE1pbik7Ci0KLSAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCi0gICAgaW50IHNlZ21lbnQgPSAwOwotICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMDsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMTsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAyOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9Ci0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKLSAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKLSAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOwotCi0gICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAotICAgICAgICAgICAgZGVjaWJlbHMsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uKTsKLQotICAgIHJldHVybiBkZWNpYmVsczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCmluZGV4IGFlZjdkYmUuLmVjN2ZmNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKQEAgLTUxLDcgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICByZXR1cm4gYWRkT3V0cHV0UHJvZmlsZShwcm9maWxlKTsKQEAgLTk3LDYgKzEwMCw5IEBACiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRQcm9maWxlc1tpXS0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogbU91dHB1dFByb2ZpbGVzW2ldLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTEzLDcgKzExOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUpKTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBkZXZEZXNjLT5zZXRBZGRyZXNzKGFkZHJlc3MpOworICAgIGFkZER5bmFtaWNEZXZpY2UoZGV2RGVzYyk7CisgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKKyAgICBkZXZEZXNjLT5hdHRhY2godGhpcyk7CiAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldkRlc2MpOwogCiAgICAgQUxPR1YoImFkZElucHV0UHJvZmlsZSgpIG5hbWUgJXMgcmF0ZSAlZCBtYXNrIDB4JTA4eCIsCkBAIC0xMjYsNiArMTM1LDkgQEAKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogbUlucHV0UHJvZmlsZXNbaV0tPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzLnJlbW92ZUF0KGkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxOCwzNyArMjMwLDM3IEBACiAgICAgbUhhbmRsZSA9IGhhbmRsZTsKIH0KIAotdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Citib29sIEh3TW9kdWxlOjpzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnJvdXRlIDogbVJvdXRlcykgeworICAgICAgICBpZiAocm91dGUtPnN1cHBvcnRzUGF0Y2goc3JjUG9ydCwgZHN0UG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7CiAgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gb3V0cHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIGlucHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkRlY2xhcmVkIiksICAyLCB0cnVlKTsKLSAgICBtUm91dGVzLmR1bXAoZmQsIDIpOworICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkRlY2xhcmVkIiksIDIsIHRydWUpOworICAgIG1EeW5hbWljRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRHluYW1pYyIpLCAgMiwgdHJ1ZSk7CisgICAgbVJvdXRlcy5kdW1wKGRzdCwgMik7CiB9CiAKIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdApAQCAtMjYxLDY0ICsyNzMsMTYwIEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3NwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdAogewogICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKLSAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgPworICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPwogICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IG1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBwcm9maWxlcykgewotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyh0eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOworICAgICAgICAgICAgICAgICAgICBzcCA8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZSh0eXBlLCBTdHJpbmc4KCksIGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzKSBjb25zdAorc3A8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICByZXR1cm4gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoZGV2aWNlLT50eXBlKCksIGVuY29kZWRGb3JtYXQpOworfQorCitEZXZpY2VWZWN0b3IgSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRBdmFpbGFibGVEZXZpY2VzRnJvbU1vZHVsZU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlRGV2aWNlcykgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRnJvbU5hbWUobmFtZSk7CisgICAgaWYgKG1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoKTsKKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dUb0NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRkcmVzcykgY29uc3QKK3sKKyAgICBTdHJpbmc4IGRldkFkZHJlc3MgPSAoYWRkcmVzcyA9PSBudWxscHRyIHx8ICFtYXRjaEFkZHJlc3MpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGFkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAotICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiAoZGV2QWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICBkZXZBZGRyZXNzID0gU3RyaW5nOCgiMCIpOwogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiAqdGhpcykgewotICAgICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gaHdNb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOwotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG1vZHVsZURldmljZXMgPSBod01vZHVsZS0+Z2V0QWxsRGV2aWNlcygpOworICAgICAgICBhdXRvIG1vZHVsZURldmljZSA9IG1vZHVsZURldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsIGRldkFkZHJlc3MsIGVuY29kZWRGb3JtYXQpOworICAgICAgICBpZiAobW9kdWxlRGV2aWNlKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0QWRkcmVzcyhkZXZBZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChhbGxvd1RvQ3JlYXRlKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZURldmljZTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1hdGNoQWRyZXNzKSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICB9CisgICAgaWYgKCFhbGxvd1RvQ3JlYXRlKSB7CisgICAgICAgIEFMT0dWKCIlczogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJXMgJTA0eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBuYW1lLCBkZXZpY2VUeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVEZXZpY2UoZGV2aWNlVHlwZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Y3JlYXRlRGV2aWNlKGNvbnN0IGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBod01vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZVR5cGVzKHR5cGUsIGVuY29kZWRGb3JtYXQpOworICAgIGlmIChod01vZHVsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA0eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLCB0eXBlLAorICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIFN0cmluZzgobmFtZSkpOworICAgIGRldmljZS0+c2V0TmFtZShTdHJpbmc4KG5hbWUpKTsKKyAgICBkZXZpY2UtPnNldEFkZHJlc3MoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworCisgIC8vIEFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0IG9mIGR5bmFtaWMgZGV2aWNlcworICAgIGh3TW9kdWxlLT5hZGREeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKKyAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgQUxPR0QoIiVzOiBhZGRpbmcgZHluYW1pYyBkZXZpY2UgJXMgdG8gbW9kdWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKworICAgIGNvbnN0IGF1dG8gJnByb2ZpbGVzID0gKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9maWxlIDogcHJvZmlsZXMpIHsKKyAgICAgICAgLy8gQWRkIHRoZSBkZXZpY2UgYXMgc3VwcG9ydGVkIHRvIGFsbCBwcm9maWxlIHN1cHBvcnRpbmcgIndlYWtseSIgb3Igbm90IHRoZSBkZXZpY2UKKyAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGl0cyB0eXBlCisgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UsIGZhbHNlIC8qbWF0Y2hBZHJlc3MqLykpIHsKKworICAgICAgICAgICAgLy8gQHRvZG8gcXVpZCBvZiBhdWRpbyBwcm9maWxlPyBpbXBvcnQgdGhlIHByb2ZpbGUgZnJvbSBkZXZpY2Ugb2YgdGhlIHNhbWUgdHlwZT8KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmlzb1R5cGVEZXZpY2VGb3JQcm9maWxlID0KKyAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkuZ2V0RGV2aWNlKHR5cGUsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQoaXNvVHlwZURldmljZUZvclByb2ZpbGUsIHRydWUgLyogZm9yY2UgKi8pOworCisgICAgICAgICAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgJXMgdG8gcHJvZmlsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6Y2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQoreworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiAqdGhpcykgeworICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CisgICAgICAgIGlmICghbW9kdWxlRGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2UtPmRldGFjaCgpOworICAgICAgICAvLyBPbmx5IHJlbW92ZSBmcm9tIGR5bmFtaWMgbGlzdCwgbm90IGZyb20gZGVjbGFyZWQgbGlzdCEhIQorICAgICAgICBpZiAoIWh3TW9kdWxlLT5nZXREeW5hbWljRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBod01vZHVsZS0+cmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOworICAgICAgICBBTE9HVigiJXM6IHJlbW92ZWQgZHluYW1pYyBkZXZpY2UgJXMgZnJvbSBtb2R1bGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKworICAgICAgICBjb25zdCBJT1Byb2ZpbGVDb2xsZWN0aW9uICZwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpID8KKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBwcm9maWxlcykgeworICAgICAgICAgICAgLy8gRm9yIGNsZWFudXAsIHN0cm9uZyBtYXRjaCBpcyByZXF1aXJlZAorICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSwgdHJ1ZSAvKm1hdGNoQWRyZXNzKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZW1vdmluZyBkZXZpY2UgJXMgZnJvbSBwcm9maWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+cmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGRldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5zZXROYW1lKFN0cmluZzgoZGV2aWNlX25hbWUpKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgcmV0dXJuIGRldkRlc2M7CiB9CiAKLXN0YXR1c190IEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCmluZGV4IDM5MGVhMzYuLmZlMmVhZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMjUsMTEgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KLS8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKLWJvb2wgSU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NiwxNCArNDIsOCBAQAogICAgICAgICAgICAgZ2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOwogCi0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIGp1c3QgY2hlY2sgdHlwZXMgaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgc2VsZWN0ZWQKLSAgICAgICAgaWYgKHBvcGNvdW50KGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA+IDEpIHsKLSAgICAgICAgICAgIGlmICgobVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgIT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpID09IDApIHsKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbVN1cHBvcnRlZERldmljZXMuY29udGFpbnNBbGxEZXZpY2VzKGRldmljZXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTMsMTYgKzEwMywxMSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIElPUHJvZmlsZTo6ZHVtcChpbnQgZmQpCit2b2lkIElPUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgNCk7CiAKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIDQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOwogICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbDsKICAgICBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CiAgICAgICAgIElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7CkBAIC0xMzAsMjEgKzExNSwxNCBAQAogICAgICAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKICAgICB9CiAgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7Ci0KLSAgICByZXN1bHQuY2xlYXIoKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAorICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAogICAgICAgICAgICAgIG1heE9wZW5Db3VudCwgY3VyT3BlbkNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4QWN0aXZlQ291bnQsIGN1ckFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogdm9pZCBJT1Byb2ZpbGU6OmxvZygpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCmluZGV4IGEyNTMxMTMuLjVmODIwYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCkBAIC0xNywyNDEgKzE3LDQzMiBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OlNlcmlhbGl6ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJTZXJpYWxpemVyLmgiCi0jaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxpc3RyZWFtPgotCi11c2luZyBzdGQ6OnN0cmluZzsKKyNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlICJTZXJpYWxpemVyLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCituYW1lc3BhY2UgeworCisvLyBUT0RPKG1uYWdhbm92KTogQ29uc2lkZXIgZmluZGluZyBhbiBhbHRlcm5hdGl2ZSBmb3IgdXNpbmcgSElETCBjb2RlLgordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGhhcmR3YXJlOjpTdGF0dXM7Cit1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgQz4KK3N0cnVjdCBBbmRyb2lkQ29sbGVjdGlvblRyYWl0cyB7CisgICAgdHlwZWRlZiBzcDxFPiBFbGVtZW50OworICAgIHR5cGVkZWYgQyBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgdm9pZCogUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkRWxlbWVudFRvQ29sbGVjdGlvbihjb25zdCBFbGVtZW50ICZlbGVtZW50LCBDb2xsZWN0aW9uICpjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLT5hZGQoZWxlbWVudCkgPj0gMCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitzdHJ1Y3QgU3RkQ29sbGVjdGlvblRyYWl0cyB7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDOjp2YWx1ZV90eXBlIEVsZW1lbnQ7CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgYXV0byBwYWlyID0gY29sbGVjdGlvbi0+aW5zZXJ0KGVsZW1lbnQpOworICAgICAgICByZXR1cm4gcGFpci5zZWNvbmQgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXVkaW9HYWluVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvR2FpbiwgQXVkaW9HYWlucz4KIHsKLSAgICB4bWxDaGFyICp4bWxWYWx1ZSA9IHhtbEdldFByb3AoY3VyLCAoY29uc3QgeG1sQ2hhciopYXR0cmlidXRlKTsKLSAgICBpZiAoeG1sVmFsdWUgPT0gTlVMTCkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImdhaW4iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJnYWlucyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqIGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptb2RlID0gIm1vZGUiOworICAgICAgICAvKiogY29udHJvbGxlZCBjaGFubmVscywgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrID0gImNoYW5uZWxfbWFzayI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluVmFsdWVNQiA9ICJtaW5WYWx1ZU1CIjsgLyoqPCBtaW4gdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4VmFsdWVNQiA9ICJtYXhWYWx1ZU1CIjsgLyoqPCBtYXggdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIC8qKiBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRlZmF1bHRWYWx1ZU1CID0gImRlZmF1bHRWYWx1ZU1CIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdGVwVmFsdWVNQiA9ICJzdGVwVmFsdWVNQiI7IC8qKjwgc3RlcCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1pblJhbXBNcyA9ICJtaW5SYW1wTXMiOworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4UmFtcE1zID0gIm1heFJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgdG8gYWxsb3cgdXNlIHNldFBvcnRHYWluIGluc3RlYWQgb2Ygc2V0U3RyZWFtVm9sdW1lLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnVzZUZvclZvbHVtZSA9ICJ1c2VGb3JWb2x1bWUiOworCisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIE5vIGNoaWxkcmVuCit9OworCisvLyBBIHByb2ZpbGUgc2VjdGlvbiBjb250YWlucyBhIG5hbWUsICBvbmUgYXVkaW8gZm9ybWF0IGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKKy8vIGFuZCBjaGFubmVsIG1hc2tzIGZvciB0aGlzIGZvcm1hdAorc3RydWN0IEF1ZGlvUHJvZmlsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb1Byb2ZpbGUsIEF1ZGlvUHJvZmlsZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJwcm9maWxlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAicHJvZmlsZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc2FtcGxpbmdSYXRlcyA9ICJzYW1wbGluZ1JhdGVzIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmb3JtYXQgPSAiZm9ybWF0IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGFubmVsTWFza3MgPSAiY2hhbm5lbE1hc2tzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitzdHJ1Y3QgTWl4UG9ydFRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxJT1Byb2ZpbGUsIElPUHJvZmlsZUNvbGxlY3Rpb24+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAibWl4UG9ydCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZSA9ICJyb2xlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlU291cmNlID0gInNvdXJjZSI7IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZmxhZ3MgPSAiZmxhZ3MiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heE9wZW5Db3VudCA9ICJtYXhPcGVuQ291bnQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heEFjdGl2ZUNvdW50ID0gIm1heEFjdGl2ZUNvdW50IjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMKK307CisKK3N0cnVjdCBEZXZpY2VQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPERldmljZURlc2NyaXB0b3IsIERldmljZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJkZXZpY2VQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZGV2aWNlUG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIC8qKiAgPGRldmljZSB0YWcgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWdOYW1lID0gInRhZ05hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgLyoqIG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiYWRkcmVzcyI7CisgICAgICAgIC8qKiBvcHRpb25hbDogdGhlIGxpc3Qgb2YgZW5jb2RlZCBhdWRpbyBmb3JtYXRzIHRoYXQgYXJlIGtub3duIHRvIGJlIHN1cHBvcnRlZC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICplbmNvZGVkRm9ybWF0cyA9ICJlbmNvZGVkRm9ybWF0cyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBHYWluVHJhaXRzIChvcHRpb25hbCkKK307CisKK3N0cnVjdCBSb3V0ZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb1JvdXRlLCBBdWRpb1JvdXRlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInJvdXRlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAicm91dGVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7IC8qKjwgPHJvdXRlIHR5cGU+OiBtaXggb3IgbXV4LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGVNaXggPSAibWl4IjsgLyoqPCB0eXBlIGF0dHJpYnV0ZSBtaXggdmFsdWUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc2luayA9ICJzaW5rIjsgLyoqPCA8c2luazogaW52b2x2ZWQgaW4gdGhpcyByb3V0ZT4uICovCisgICAgICAgIC8qKiBzb3VyY2VzOiBhbGwgc291cmNlIHRoYXQgY2FuIGJlIGludm9sdmVkIGluIHRoaXMgcm91dGUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc291cmNlcyA9ICJzb3VyY2VzIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBId01vZHVsZSAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNb2R1bGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SHdNb2R1bGUsIEh3TW9kdWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtb2R1bGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJtb2R1bGVzIjsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZXNUYWcgPSAiYXR0YWNoZWREZXZpY2VzIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkQXR0YWNoZWREZXZpY2VUYWcgPSAiaXRlbSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSAiZGVmYXVsdE91dHB1dERldmljZSI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAiaGFsVmVyc2lvbiI7CisgICAgfTsKKworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMsIGFuZCByb3V0ZVRyYWl0cworICAgIC8vIE5lZWQgdG8gY2FsbCBkZXNlcmlhbGl6ZSBvbiBlYWNoIGNoaWxkCit9OworCitzdHJ1Y3QgR2xvYmFsQ29uZmlnVHJhaXRzCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2xvYmFsQ29uZmlndXJhdGlvbiI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzcGVha2VyRHJjRW5hYmxlZCA9ICJzcGVha2VyX2RyY19lbmFibGVkIjsKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJzdXJyb3VuZFNvdW5kIjsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBDaGlsZHJlbjogU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cworfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMgOiBwdWJsaWMgU3RkQ29sbGVjdGlvblRyYWl0czxBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImZvcm1hdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImZvcm1hdHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdWJmb3JtYXRzID0gInN1YmZvcm1hdHMiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK2NsYXNzIFBvbGljeVNlcmlhbGl6ZXIKK3sKK3B1YmxpYzoKKyAgICBQb2xpY3lTZXJpYWxpemVyKCkgOiBtVmVyc2lvbntzdGQ6OnRvX3N0cmluZyhnTWFqb3IpICsgIi4iICsgc3RkOjp0b19zdHJpbmcoZ01pbm9yKX0KKyAgICB7CisgICAgICAgIEFMT0dWKCIlczogVmVyc2lvbj0lcyBSb290PSVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksIHJvb3ROYW1lKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNYWpvciA9IDE7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNaW5vciA9IDA7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1WZXJzaW9uOworCisgICAgLy8gQ2hpbGRyZW46IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cywgU3Vycm91bmRTb3VuZFRyYWl0cyAob3B0aW9uYWwpCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciB2b2lkICgqeG1sRGVsZXRlcikoVCogdCk7Cit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGF1dG8geG1sRGVsZXRlcjx4bWxEb2M+ID0geG1sRnJlZURvYzsKKy8vIGh0dHA6Ly9iLzExMTA2NzI3NyAtIEFkZCBiYWNrIGNvbnN0ZXhwciB3aGVuIHdlIHN3aXRjaCB0byBDKysxNy4KK3RlbXBsYXRlIDw+CithdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CisKKy8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGF1dG8gbWFrZV94bWxVbmlxdWUoVCAqdCkgeworICAgIC8vIFdyYXAgZGVsZXRlciBpbiBsYW1iZGEgdG8gZW5hYmxlIGVtcHR5IGJhc2Ugb3B0aW1pemF0aW9uCisgICAgYXV0byBkZWxldGVyID0gW10oVCAqdCkgeyB4bWxEZWxldGVyPFQ+KHQpOyB9OworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCwgZGVjbHR5cGUoZGVsZXRlcik+e3QsIGRlbGV0ZXJ9OworfQorCitzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7CisgICAgYXV0byB4bWxWYWx1ZSA9IG1ha2VfeG1sVW5pcXVlKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihhdHRyaWJ1dGUpKSk7CisgICAgaWYgKHhtbFZhbHVlID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICBzdHJpbmcgdmFsdWUoKGNvbnN0IGNoYXIqKXhtbFZhbHVlKTsKLSAgICB4bWxGcmVlKHhtbFZhbHVlKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih4bWxWYWx1ZS5nZXQoKSkpOwogICAgIHJldHVybiB2YWx1ZTsKIH0KIAotdXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01ham9yID0gMTsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNaW5vciA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUVsZW1lbnROYW1lID0gInJlZmVyZW5jZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUgPSAibmFtZSI7Ci0KIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdHJpbmcgJnJlZk5hbWUpCitjb25zdCB4bWxOb2RlKiBnZXRSZWZlcmVuY2UoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSkKIHsKLSAgICBjb25zdCBfeG1sTm9kZSAqY29sID0gcm9vdDsKLSAgICB3aGlsZSAoY29sICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY29sLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY3VyID0gY29sLT5jaGlsZHJlbjsKLSAgICAgICAgICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSk7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyLT5jaGlsZHJlbjsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6cmVmZXJlbmNlVGFnKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIFRyYWl0OjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY29sID0gY29sLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKK3N0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICpjb2xsZWN0aW9uLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykgJiYKLSAgICAgICAgICAgICAgICB4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gTlVMTDsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICB9IGVsc2UgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcm9vdDsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0ckVsZW1lbnQgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6ZGVzZXJpYWxpemUoZG9jLCBjaGlsZCwgZWxlbWVudCwgc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmFkZChlbGVtZW50KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICBmb3IgKDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZWxlbWVudCA9IFRyYWl0OjpkZXNlcmlhbGl6ZShjaGlsZCwgc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgICAgICB9Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OnRhZyA9ICJnYWluIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJnYWlucyI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptb2RlW10gPSAibW9kZSI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tbXSA9ICJjaGFubmVsX21hc2siOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblZhbHVlTUJbXSA9ICJtaW5WYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CW10gPSAibWF4VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUJbXSA9ICJkZWZhdWx0VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6c3RlcFZhbHVlTUJbXSA9ICJzdGVwVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluUmFtcE1zW10gPSAibWluUmFtcE1zIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhSYW1wTXNbXSA9ICJtYXhSYW1wTXMiOwotCi1zdGF0dXNfdCBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvR2FpblRyYWl0czo6RWxlbWVudD4gQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7CiAgICAgc3RhdGljIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICBnYWluID0gbmV3IEVsZW1lbnQoaW5kZXgrKywgdHJ1ZSk7CisgICAgRWxlbWVudCBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCsrLCB0cnVlKTsKIAotICAgIHN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1vZGUpOworICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptb2RlKTsKICAgICBpZiAoIW1vZGUuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhtb2RlKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwogICAgIGlmICghY2hhbm5lbHNMaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNoYW5uZWxzTGl0ZXJhbCkpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOwogICAgIGludDMyX3QgbWluVmFsdWVNQjsKICAgICBpZiAoIW1pblZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblZhbHVlTUJMaXRlcmFsLCBtaW5WYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIobWluVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CiAgICAgaW50MzJfdCBtYXhWYWx1ZU1COwogICAgIGlmICghbWF4VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4VmFsdWVNQkxpdGVyYWwsIG1heFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFZhbHVlSW5NYihtYXhWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CiAgICAgaW50MzJfdCBkZWZhdWx0VmFsdWVNQjsKICAgICBpZiAoIWRlZmF1bHRWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhkZWZhdWx0VmFsdWVNQkxpdGVyYWwsIGRlZmF1bHRWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGRlZmF1bHRWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CiAgICAgdWludDMyX3Qgc3RlcFZhbHVlTUI7CiAgICAgaWYgKCFzdGVwVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oc3RlcFZhbHVlTUJMaXRlcmFsLCBzdGVwVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0U3RlcFZhbHVlSW5NYihzdGVwVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKICAgICB1aW50MzJfdCBtaW5SYW1wTXM7CiAgICAgaWYgKCFtaW5SYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblJhbXBNc0xpdGVyYWwsIG1pblJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMobWluUmFtcE1zKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOwogICAgIHVpbnQzMl90IG1heFJhbXBNczsKICAgICBpZiAoIW1heFJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4UmFtcE1zTGl0ZXJhbCwgbWF4UmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhtYXhSYW1wTXMpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAotICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKLQotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0ZDo6c3RyaW5nIHVzZUZvclZvbHVtZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp1c2VGb3JWb2x1bWUpOworICAgIGJvb2wgdXNlRm9yVm9sdW1lID0gZmFsc2U7CisgICAgaWYgKCF1c2VGb3JWb2x1bWVMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKHVzZUZvclZvbHVtZUxpdGVyYWwsIHVzZUZvclZvbHVtZSkpIHsKKyAgICAgICAgZ2Fpbi0+c2V0VXNlRm9yVm9sdW1lKHVzZUZvclZvbHVtZSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCBVc2VGb3JWb2x1bWU6ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2Fpbi0+Z2V0TW9kZSgpLCBnYWluLT5nZXRDaGFubmVsTWFzaygpLCBnYWluLT5nZXRNaW5WYWx1ZUluTWIoKSwKKyAgICAgICAgICBnYWluLT5nZXRNYXhWYWx1ZUluTWIoKSwgdXNlRm9yVm9sdW1lKTsKKworICAgIGlmIChnYWluLT5nZXRNb2RlKCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZ2FpbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInByb2ZpbGVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6dGFnID0gInByb2ZpbGUiOwotCi1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXNbXSA9ICJzYW1wbGluZ1JhdGVzIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpmb3JtYXRbXSA9ICJmb3JtYXQiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrc1tdID0gImNoYW5uZWxNYXNrcyI7Ci0KLXN0YXR1c190IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJnByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9Qcm9maWxlVHJhaXRzOjpFbGVtZW50PiBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKLSAgICBzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7Ci0gICAgc3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CisgICAgc3RkOjpzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOwogCi0gICAgcHJvZmlsZSA9IG5ldyBFbGVtZW50KGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOworICAgIEVsZW1lbnQgcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCisgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKIAogICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZ0R5bmFtaWNGb3JtYXQpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhwcm9maWxlLT5nZXRDaGFubmVscygpLmlzRW1wdHkoKSk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUocHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKS5pc0VtcHR5KCkpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBwcm9maWxlOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOwotY29uc3QgY2hhciAqY29uc3QgTWl4UG9ydFRyYWl0czo6dGFnID0gIm1peFBvcnQiOwotCi1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpmbGFnc1tdID0gImZsYWdzIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4T3BlbkNvdW50W10gPSAibWF4T3BlbkNvdW50IjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnRbXSA9ICJtYXhBY3RpdmVDb3VudCI7Ci0KLXN0YXR1c190IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBQdHJFbGVtZW50ICZtaXhQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxNaXhQb3J0VHJhaXRzOjpFbGVtZW50PiBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjaGlsZCwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX0ZVTkNUSU9OX18sIHJvbGUuY19zdHIoKSk7Ci0gICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSByb2xlID09ICJzb3VyY2UiID8gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIEFMT0dWKCIlczogUm9sZT0lcyIsIF9fZnVuY19fLCByb2xlLmNfc3RyKCkpOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPworICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCi0gICAgbWl4UG9ydCA9IG5ldyBFbGVtZW50KFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOworICAgIEVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChuYW1lLmNfc3RyKCkpLCBwb3J0Um9sZSk7CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCBjaGlsZCwgcHJvZmlsZXMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgICAgICBwcm9maWxlcy5hZGQoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICB9CiAgICAgbWl4UG9ydC0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKLSAgICBzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOwogICAgIGlmICghZmxhZ3MuZW1wdHkoKSkgewogICAgICAgICAvLyBTb3VyY2Ugcm9sZQogICAgICAgICBpZiAocG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewpAQCAtMjYxLDUyICs0NTIsNDYgQEAKICAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKICAgICBpZiAoIW1heE9wZW5Db3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhPcGVuQ291bnQsIG1peFBvcnQtPm1heE9wZW5Db3VudCk7CiAgICAgfQotICAgIHN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CiAgICAgaWYgKCFtYXhBY3RpdmVDb3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhBY3RpdmVDb3VudCwgbWl4UG9ydC0+bWF4QWN0aXZlQ291bnQpOwogICAgIH0KICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIEF1ZGlvR2FpblRyYWl0czo6Q29sbGVjdGlvbiBnYWluczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIGNoaWxkLCBnYWlucywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtaXhQb3J0LT5zZXRHYWlucyhnYWlucyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1peFBvcnQ7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OnRhZyA9ICJkZXZpY2VQb3J0IjsKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZGV2aWNlUG9ydHMiOwotCi1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnRhZ05hbWVbXSA9ICJ0YWdOYW1lIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dHlwZVtdID0gInR5cGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmFkZHJlc3NbXSA9ICJhZGRyZXNzIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVNvdXJjZVtdID0gInNvdXJjZSI7Ci0KLXN0YXR1c190IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmRldmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPERldmljZVBvcnRUcmFpdHM6OkVsZW1lbnQ+IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dGFnTmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnJvbGUpOwogICAgIGlmIChyb2xlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CiAKQEAgLTMxNCwzMzggKzQ5OSwzMDEgQEAKICAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKLSAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19GVU5DVElPTl9fLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBkZXZpY2VEZXNjID0gbmV3IEVsZW1lbnQodHlwZSwgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkRm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cyk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzLCBlbmNvZGVkRm9ybWF0c0xpdGVyYWwuY19zdHIoKSk7CisgICAgRm9ybWF0VmVjdG9yIGVuY29kZWRGb3JtYXRzOworICAgIGlmICghZW5jb2RlZEZvcm1hdHNMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgZW5jb2RlZEZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhlbmNvZGVkRm9ybWF0c0xpdGVyYWwsICIgIik7CisgICAgfQorICAgIEVsZW1lbnQgZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIGVuY29kZWRGb3JtYXRzLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOwogCi0gICAgc3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6YWRkcmVzcyk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOwogICAgIGlmICghYWRkcmVzcy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCIlczogYWRkcmVzcz0lcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlczogYWRkcmVzcz0lcyBmb3IgJXMiLCBfX2Z1bmNfXywgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBkZXZpY2VEZXNjLT5zZXRBZGRyZXNzKFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKSk7CiAgICAgfQogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGRvYywgcm9vdCwgcHJvZmlsZXMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGN1ciwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3AgPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKLSAgICAgICAgcHJvZmlsZXMuYWRkKGR5bmFtaWNQcm9maWxlKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgfQogICAgIGRldmljZURlc2MtPnNldEF1ZGlvUHJvZmlsZXMocHJvZmlsZXMpOwogCiAgICAgLy8gRGVzZXJpYWxpemUgQXVkaW9HYWluIGNoaWxkcmVuCi0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oZG9jLCByb290LCBkZXZpY2VEZXNjLT5tR2FpbnMsIE5VTEwpOwotICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGN1ciwgJmRldmljZURlc2MtPm1HYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19mdW5jX18sCisgICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCkpOworICAgIHJldHVybiBkZXZpY2VEZXNjOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6dGFnID0gInJvdXRlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7Ci0KLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVNaXhbXSA9ICJtaXgiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c2lua1tdID0gInNpbmsiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c291cmNlc1tdID0gInNvdXJjZXMiOwotCi0KLXN0YXR1c190IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48Um91dGVUcmFpdHM6OkVsZW1lbnQ+IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fcm91dGVfdHlwZV90IHJvdXRlVHlwZSA9ICh0eXBlID09IEF0dHJpYnV0ZXM6OnR5cGVNaXgpID8KICAgICAgICAgICAgICAgICBBVURJT19ST1VURV9NSVggOiBBVURJT19ST1VURV9NVVg7CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7Ci0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHJvdXRlVHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7CisgICAgRWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKLSAgICBzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2luayk7CisgICAgc3RkOjpzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzaW5rKTsKICAgICBpZiAoc2lua0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gQ29udmVydCBTaW5rIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KHNpbmtBdHRyLmNfc3RyKCkpKTsKICAgICBpZiAoc2luayA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTaW5rKHNpbmspOworICAgIHJvdXRlLT5zZXRTaW5rKHNpbmspOwogCi0gICAgc3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c291cmNlcyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIFRva2VuaXplIGFuZCBDb252ZXJ0IFNvdXJjZXMgbmFtZSB0byBwb3J0IHBvaW50ZXIKICAgICBBdWRpb1BvcnRWZWN0b3Igc291cmNlczsKLSAgICBjaGFyICpzb3VyY2VzTGl0ZXJhbCA9IHN0cm5kdXAoc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKTsKLSAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwsICIsIik7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gc291cmNlc0xpdGVyYWx7c3RybmR1cCgKKyAgICAgICAgICAgICAgICBzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpfTsKKyAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwuZ2V0KCksICIsIik7CiAgICAgd2hpbGUgKGRldlRhZyAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJsZW4oZGV2VGFnKSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fRlVOQ1RJT05fXywgZGV2VGFnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBkZXZUYWcpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICB9CiAgICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCAiLCIpOwogICAgIH0KLSAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKIAotICAgIHNpbmstPmFkZFJvdXRlKGVsZW1lbnQpOworICAgIHNpbmstPmFkZFJvdXRlKHJvdXRlKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBzb3VyY2VzLml0ZW1BdChpKTsKLSAgICAgICAgc291cmNlLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICAgICAgc291cmNlLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgfQotICAgIGVsZW1lbnQtPnNldFNvdXJjZXMoc291cmNlcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJvdXRlLT5zZXRTb3VyY2VzKHNvdXJjZXMpOworICAgIHJldHVybiByb3V0ZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlVGFnID0gIml0ZW0iOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSAiZGVmYXVsdE91dHB1dERldmljZSI7Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6dGFnID0gIm1vZHVsZSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibW9kdWxlcyI7Ci0KLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6dmVyc2lvbltdID0gImhhbFZlcnNpb24iOwotCi1zdGF0dXNfdCBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPE1vZHVsZVRyYWl0czo6RWxlbWVudD4gTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgdWludDMyX3QgdmVyc2lvbk1ham9yID0gMCwgdmVyc2lvbk1pbm9yID0gMDsKLSAgICBzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dmVyc2lvbik7CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKICAgICBpZiAoIXZlcnNpb25MaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgc3NjYW5mKHZlcnNpb25MaXRlcmFsLmNfc3RyKCksICIldS4ldSIsICZ2ZXJzaW9uTWFqb3IsICZ2ZXJzaW9uTWlub3IpOwotICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19GVU5DVElPTl9fLAorICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19mdW5jX18sCiAgICAgICAgICAgICAgIHZlcnNpb25NYWpvciwgdmVyc2lvbk1ham9yKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CiAKLSAgICBtb2R1bGUgPSBuZXcgRWxlbWVudChuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKKyAgICBFbGVtZW50IG1vZHVsZSA9IG5ldyBId01vZHVsZShuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKIAogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuczogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKICAgICBNaXhQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIG1peFBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihkb2MsIHJvb3QsIG1peFBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oY3VyLCAmbWl4UG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRQcm9maWxlcyhtaXhQb3J0cyk7CiAKICAgICBEZXZpY2VQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIGRldmljZVBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihkb2MsIHJvb3QsIGRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oY3VyLCAmZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXREZWNsYXJlZERldmljZXMoZGV2aWNlUG9ydHMpOwogCiAgICAgUm91dGVUcmFpdHM6OkNvbGxlY3Rpb24gcm91dGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oZG9jLCByb290LCByb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihjdXIsICZyb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFJvdXRlcyhyb3V0ZXMpOwogCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSByb290LT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkcmVuICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZVRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqYXR0YWNoZWREZXZpY2UgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOCgoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkcmVuICE9IE5VTEw7CisgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7CisgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZVRhZykpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYXR0YWNoZWREZXZpY2UgPSBtYWtlX3htbFVuaXF1ZSh4bWxOb2RlTGlzdEdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5kb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRhY2hlZERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFkZEF2YWlsYWJsZURldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShhdHRhY2hlZERldmljZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpkZWZhdWx0T3V0cHV0RGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTs7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdE91dHB1dERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpKTsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgYXV0byBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4tPmRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpKTsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IDAgJiYgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjdHgtPnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLCBfX0ZVTkNUSU9OX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxGcmVlKGRlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQ7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbW9kdWxlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBHbG9iYWxDb25maWdUcmFpdHM6OnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKLQotY29uc3QgY2hhciBHbG9iYWxDb25maWdUcmFpdHM6OkF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkW10gPSAic3BlYWtlcl9kcmNfZW5hYmxlZCI7Ci0KLQotc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil0YWcpKSB7Ci0gICAgICAgICAgICBzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkOwogICAgICAgICAgICAgaWYgKCFzcGVha2VyRHJjRW5hYmxlZC5lbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp0YWcgPSAidm9sdW1lIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJ2b2x1bWVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOwotCi1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6c3RyZWFtW10gPSAic3RyZWFtIjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeVtdID0gImRldmljZUNhdGVnb3J5IjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VbXSA9ICJyZWYiOwotCi1zdGF0dXNfdCBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitzdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgIGlmIChzdHJlYW1UeXBlTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKLSAgICBpZiAoIVN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZUxpdGVyYWwsIHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7Ci0gICAgaWYgKGRldmljZUNhdGVnb3J5TGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5OwotICAgIGlmICghRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OmZyb21TdHJpbmcoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLCBkZXZpY2VDYXRlZ29yeSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzPSVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICBjb25maWctPnNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKIAotICAgIHN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7Ci0gICAgY29uc3QgX3htbE5vZGUgKnJlZiA9IE5VTEw7Ci0gICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZ2V0UmVmZXJlbmNlPFZvbHVtZVRyYWl0cz4ocm9vdC0+cGFyZW50LCByZWYsIHJlZmVyZW5jZU5hbWUpOwotICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKLQotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpwb2ludERlZmluaXRpb24gPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFN1cnJvdW5kRm9ybWF0cyhmb3JtYXRzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4gcG9pbnQ7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+ID4oKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbiwgcG9pbnQsICIsIik7Ci0gICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVQb2ludFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudC0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7Ci0gICAgICAgICAgICB4bWxGcmVlKHBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1Qb2xpY3lTZXJpYWxpemVyOjpQb2xpY3lTZXJpYWxpemVyKCkgOiBtUm9vdEVsZW1lbnROYW1lKHJvb3ROYW1lKQorUmV0dXJuPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OkVsZW1lbnQ+IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OmRlc2VyaWFsaXplKAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgICBvc3MgPDwgZ01ham9yIDw8ICIuIiA8PCBnTWlub3I7Ci0gICAgbVZlcnNpb24gPSBvc3Muc3RyKCk7Ci0gICAgQUxPR1YoIiVzOiBWZXJzaW9uPSVzIFJvb3Q9JXMiLCBfX0ZVTkNUSU9OX18sIG1WZXJzaW9uLmNfc3RyKCksIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChmb3JtYXRMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCBmb3IgYSBzdXJyb3VuZCBmb3JtYXQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0TGl0ZXJhbCk7CisgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCBmb3JtYXQgJXMiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgRWxlbWVudCBwYWlyID0gc3RkOjptYWtlX3BhaXIoZm9ybWF0LCBDb2xsZWN0aW9uOjptYXBwZWRfdHlwZXt9KTsKKworICAgIHN0ZDo6c3RyaW5nIHN1YmZvcm1hdHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3ViZm9ybWF0cyk7CisgICAgaWYgKHN1YmZvcm1hdHNMaXRlcmFsLmVtcHR5KCkpIHJldHVybiBwYWlyOworICAgIEZvcm1hdFZlY3RvciBzdWJmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcoc3ViZm9ybWF0c0xpdGVyYWwsICIgIik7CisgICAgZm9yIChjb25zdCBhdXRvJiBzdWJmb3JtYXQgOiBzdWJmb3JtYXRzKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gcGFpci5zZWNvbmQuaW5zZXJ0KHN1YmZvcm1hdCk7CisgICAgICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIHN1YmZvcm1hdCAleCB0byBjb2xsZWN0aW9uIiwgX19mdW5jX18sIHN1YmZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWlyOwogfQogCi1zdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQorc3RhdHVzX3QgUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICB4bWxEb2NQdHIgZG9jOwotICAgIGRvYyA9IHhtbFBhcnNlRmlsZShjb25maWdGaWxlKTsKLSAgICBpZiAoZG9jID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKKyAgICBhdXRvIGRvYyA9IG1ha2VfeG1sVW5pcXVlKHhtbFBhcnNlRmlsZShjb25maWdGaWxlKSk7CisgICAgaWYgKGRvYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwotICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudDogZW1wdHkuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIHhtbE5vZGVQdHIgcm9vdCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYy5nZXQoKSk7CisgICAgaWYgKHJvb3QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudDogZW1wdHkuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7Ci0gICAgICAgICBBTE9HRSgiJXM6IGxpYnhtbCBmYWlsZWQgdG8gcmVzb2x2ZSBYSW5jbHVkZXMgb24gJXMgZG9jdW1lbnQuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYy5nZXQoKSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgfQogCi0gICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSkpICB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgcm9vdCBlbGVtZW50IGZvdW5kIGluIHhtbCBkYXRhICVzLiIsIF9fRlVOQ1RJT05fXywgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICBpZiAoeG1sU3RyY21wKHJvb3QtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHJvb3ROYW1lKSkpICB7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgcm9vdCBlbGVtZW50IGZvdW5kIGluIHhtbCBkYXRhICVzLiIsIF9fZnVuY19fLCByb290TmFtZSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyb290LT5uYW1lKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCB2ZXJzaW9uQXR0cmlidXRlKTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIHZlcnNpb25BdHRyaWJ1dGUpOwogICAgIGlmICh2ZXJzaW9uLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fRlVOQ1RJT05fXywgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fZnVuY19fLCByb290TmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICh2ZXJzaW9uICE9IG1WZXJzaW9uKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ICVzIGdvdCAlcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksCiAgICAgICAgICAgICAgIHZlcnNpb24uY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIExldHMgZGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICAvLyBNb2R1bGVzCiAgICAgTW9kdWxlVHJhaXRzOjpDb2xsZWN0aW9uIG1vZHVsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1vZHVsZVRyYWl0cz4oZG9jLCBjdXIsIG1vZHVsZXMsICZjb25maWcpOwotICAgIGNvbmZpZy5zZXRId01vZHVsZXMobW9kdWxlcyk7Ci0KLSAgICAvLyBkZXNlcmlhbGl6ZSB2b2x1bWUgc2VjdGlvbgotICAgIFZvbHVtZVRyYWl0czo6Q29sbGVjdGlvbiB2b2x1bWVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVUcmFpdHM+KGRvYywgY3VyLCB2b2x1bWVzLCAmY29uZmlnKTsKLSAgICBjb25maWcuc2V0Vm9sdW1lcyh2b2x1bWVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOwogCiAgICAgLy8gR2xvYmFsIENvbmZpZ3VyYXRpb24KLSAgICBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGN1ciwgY29uZmlnKTsKKyAgICBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKHJvb3QsIGNvbmZpZyk7CiAKLSAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgLy8gU3Vycm91bmQgY29uZmlndXJhdGlvbgorICAgIFN1cnJvdW5kU291bmRUcmFpdHM6OmRlc2VyaWFsaXplKHJvb3QsIGNvbmZpZyk7CisKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKK3sKKyAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZU5hbWUsIGNvbmZpZyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA2NTI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNX1Nlc3Npb25Sb3V0ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIlNlc3Npb25Sb3V0ZS5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTZXNzaW9uUm91dGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLXZvaWQgU2Vzc2lvblJvdXRlOjpsb2coY29uc3QgY2hhciogcHJlZml4KQotewotICAgIEFMT0dJKCIlc1tTZXNzaW9uUm91dGUgc3RybToweCVYLCBzcmM6JWQsIHNlc3M6MHglWCwgZGV2OjB4JVggcmVmczolZCBhY3Q6JWQiLAotICAgICAgICAgIHByZWZpeCwgbVN0cmVhbVR5cGUsIG1Tb3VyY2UsIG1TZXNzaW9uLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yICE9IDAgPyBtRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkUsCi0gICAgICAgICAgbVJlZkNvdW50LCBtQWN0aXZpdHlDb3VudCk7Ci19Ci0KLS8vIC0tLSBTZXNzaW9uUm91dGVNYXAgY2xhc3MgaW1wbGVtZW50YXRpb24KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICByZXR1cm4gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwICYmIHZhbHVlRm9yKHNlc3Npb24pLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwOwotfQotCi1ib29sIFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgaWYgKGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCkgewotICAgICAgICBpZiAodmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkKSB7Ci0gICAgICAgICAgICB2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OnJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDApIHsKLSAgICAgICAgQUxPR19BU1NFUlQocm91dGUtPm1SZWZDb3VudCA+IDApOwotICAgICAgICAtLXJvdXRlLT5tUmVmQ291bnQ7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVJlZkNvdW50IDw9IDApIHsKLSAgICAgICAgICAgIHJlbW92ZUl0ZW0oc2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBTZXNzaW9uUm91dGVNYXA6OmluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICByZXR1cm4gcm91dGUgIT0gMCA/ICsrKHJvdXRlLT5tQWN0aXZpdHlDb3VudCkgOiAtMTsKLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6ZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIGlmIChyb3V0ZSAhPSAwICYmIHJvdXRlLT5tQWN0aXZpdHlDb3VudCA+IDApIHsKLSAgICAgICAgcmV0dXJuIC0tKHJvdXRlLT5tQWN0aXZpdHlDb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OmxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKQotewotICAgIEFMT0dJKCIlcyAtLS0tIiwgY2FwdGlvbik7Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICB2YWx1ZUF0KGluZGV4KS0+bG9nKCIgICIpOwotICAgIH0KLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OmFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotewotICAgIGlmIChtTWFwVHlwZSA9PSBNQVBUWVBFX0lOUFVUICYmIHN0cmVhbVR5cGUgIT0gU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSkgewotICAgICAgICBBTE9HRSgiQWRkaW5nIE91dHB1dCBSb3V0ZSB0byBJbnB1dFJvdXRlTWFwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfT1VUUFVUICYmIHNvdXJjZSAhPSBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgSW5wdXQgUm91dGUgdG8gT3V0cHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0KLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSAwIHx8IHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByb3V0ZSA9IG5ldyBTZXNzaW9uUm91dGUoc2Vzc2lvbiwgc3RyZWFtVHlwZSwgc291cmNlLCBkZXNjcmlwdG9yLCB1aWQpOwotICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkKHNlc3Npb24sIHJvdXRlKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBTZXNzaW9uUm91dGVNYXA6OmdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKQotewotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IHZhbHVlQXQoaW5kZXgpOwotICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSByb3V0ZS0+bVN0cmVhbVR5cGUgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTY0OWZiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lcyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2luY2x1ZGUgIlN0cmVhbURlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1TdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKLSAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCi17Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY3VycmVudCBzdHJlYW0ncyBpbmRleCB0byBtSW5kZXhNYXggc28gdm9sdW1lIGlzbid0IDAgaW4KLSAgICAvLyBjYXNlcyB3aGVyZSB0aGUgSmF2YSBsYXllciBkb2Vzbid0IGNhbGwgaW50byB0aGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgdG8KLSAgICAvLyBzZXQgdGhlIGRlZmF1bHQgdm9sdW1lLgotICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIG1JbmRleE1heCk7Ci19Ci0KLWludCBTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotewotICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgaWYgKG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPCAwKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FOwotICAgIH0KLSAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKQotewotICAgIG1JbmRleEN1ci5jbGVhcigpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi17Ci0gICAgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pCi17Ci0gICAgbUluZGV4TWluID0gdm9sSW5kZXhNaW47Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KQotewotICAgIG1JbmRleE1heCA9IHZvbEluZGV4TWF4OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KQotewotICAgIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV0gPSBwb2ludDsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAotICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCi0gICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OlN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCkKLXsKLSAgICBmb3IgKHNpemVfdCBzdHJlYW0gPSAwIDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgYWRkKHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSksIFN0cmVhbURlc2NyaXB0b3IoKSk7Ci0gICAgfQotfQotCi1ib29sIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuY2FuQmVNdXRlZCgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi17Ci0gICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5LCBwb2ludCk7Ci19Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKlN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotewotICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbikKLXsKLSAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbih2b2xJbmRleE1pbik7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCkKLXsKLSAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1heCh2b2xJbmRleE1heCk7Ci19Ci0KLWZsb2F0IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjp2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgY29uc3QKLXsKLSAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gdmFsdWVBdChzdHJlYW0pOwotICAgIHJldHVybiBHYWluczo6dm9sSW5kZXhUb0RiKHN0cmVhbURlc2MuZ2V0Vm9sdW1lQ3VydmVQb2ludChjYXRlZ29yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1pbigpLCBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWF4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJblVpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKLXsKLSAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsCi0gICAgICAgICAgICAgIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNldFZvbHVtZUluZGV4TWluKHN0cmVhbSwgaW5kZXhNaW4pOwotICAgIHNldFZvbHVtZUluZGV4TWF4KHN0cmVhbSwgaW5kZXhNYXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRldmljZV9jYXRlZ29yeT4oaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbaV1bal0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKLSAgICBpZiAoaXNTcGVha2VyRHJjRW5hYmxlZCkgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9TWVNURU0sIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fUklORywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9BTEFSTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fTVVTSUMsIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpCi17Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdHJlYW1Ec3QsIHN0YXRpY19jYXN0PGRldmljZV9jYXRlZ29yeT4oaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tzdHJlYW1TcmNdW2pdKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDZmNDhlYWUuLjdjNzZkOGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC00NSw2ICs0NSw3IEBACiBjb25zdCBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjpUYWJsZSBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19BTEwpLAogICAgIFRFUk1JTkFUT1IKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2YxYmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lQ3VydmUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJWb2x1bWVDdXJ2ZS5oIgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1mbG9hdCBWb2x1bWVDdXJ2ZTo6dm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFtQ3VydmVQb2ludHMuaXNFbXB0eSgpLCAiSW52YWxpZCB2b2x1bWUgY3VydmUiKTsKLQotICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKLSAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCi0gICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OwotICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgewotICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOwotICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKLSAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OwotICAgIH0KLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKLQotICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50Ci0gICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKLSAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPj0gbmJDdXJ2ZVBvaW50cykgewotICAgICAgICAvL3VzZSBsYXN0IHBvaW50IG9mIHRhYmxlCi0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7Ci0gICAgfQotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiAhPSBtQ3VydmVQb2ludHNbMF0ubUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbMF0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSkgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWKCJWT0xVTUUgbURldmljZUNhdGVnb3J5ICVkLCBtU3RyZWFtVHlwZSAlZCB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCi0gICAgICAgICAgICBtRGV2aWNlQ2F0ZWdvcnksIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCwKLSAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZiksIGRlY2liZWxzLAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKTsKLQotICAgIHJldHVybiBkZWNpYmVsczsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIHsiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiKCUzZCwgJTVkKSIsCi0gICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpXS5tSW5kZXgsIG1DdXJ2ZVBvaW50c1tpXS5tQXR0ZW51YXRpb25Jbk1iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIGlmICghY3VydmVQb2ludHMpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRMaXRlcmFsOwotICAgICAgICBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIGRldmljZUNhdExpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMgJXMgOiIsCi0gICAgICAgICAgICAgICAgIHNwYWNlcywgIiIsIGRldmljZUNhdExpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLXN0YXR1c190IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5Wb2x1bWUgQ3VydmVzIGZvciBVc2UgQ2FzZXMgKGFrYSBTdHJlYW0gdHlwZXMpIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbDsKLSAgICAgICAgU3RyZWFtVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIHN0cmVhbVR5cGVMaXRlcmFsKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICAgICAiICVzICglMDJ6dSk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAotICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQsIDIsIHRydWUpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggMzc5ZjdlNS4uYjI4MzgxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xODUsMTQgKzE4NSwyNyBAQAogICAgICAgICA8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9ImJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIAotICAgIDwhLS0gVm9sdW1lIHNlY3Rpb24gLS0+CisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbjoKKyAgICAgICAgSU1QT1JUQU5UIE5PVEU6IFZvbHVtZSB0YWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIGVuZ2luZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBpdCBoZXJlIGZvciBsZWdhY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgd2lsbCBmYWxsYmFjayBvbiB0aGVzZSBmaWxlcyBpZiBub25lIGFyZSBwcm92aWRlZCBieSBlbmdpbmUuCisgICAgIC0tPgogCiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKaW5kZXggYTc1ZjFjYi4uYjRjYzFkMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCkBAIC0xODUsMTQgKzE4NSwyNyBAQAogICAgICAgICA8IS0tIEhlYXJpbmcgYWlkIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CiAKKyAgICAgICAgPCEtLSBNU0QgQXVkaW8gSEFMIChvcHRpb25hbCkgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9Im1zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKwogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAppbmRleCA1ODc2OGMzLi45YWQ2MDlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCkBAIC0zMCwxMSArMzAsMjEgQEAKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCi0gICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKwogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxY2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICA8L21vZHVsZXM+CisgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAppbmRleCAyNmMzODFmLi44MzUwZWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCkBAIC0xNSw2ICsxNSw5IEBACiAtLT4KIAogPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCiAgICAgPG1vZHVsZXM+CiAgICAgICAgIDwhLS0gU3R1YiBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InN0dWJfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CkBAIC0yNiw1ICsyOSw2IEBACiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CiAKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggNWI3YWU3Zi4uZWVkYzk2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmxpZSAtLT4KKzwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmaWxlIC0tPgogPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgogICAgIDxhdHRhY2hlZERldmljZXM+CiAgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MDE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgZm9yIFRWIC0tPgorPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRpcmVjdCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIiAvPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJ0dW5uZWwiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIiAvPgorICAgPC9taXhQb3J0cz4KKyAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIiAvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJPdXQgQXV4IERpZ2l0YWwiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfQUMzIEFVRElPX0ZPUk1BVF9JRUM2MTkzNyIgLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik91dCBBdXggRGlnaXRhbCIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGlyZWN0LHR1bm5lbCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c3Vycm91bmRTb3VuZD4KKyAgPCEtLSBFYWNoIG9mIHRoZSBsaXN0ZWQgZm9ybWF0cyBnZXRzIGFuIGVudHJ5IGluIFN1cnJvdW5kIFNldHRpbmdzIGRpYWxvZyBvbiBUViBkZXZpY2VzLgorICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgIGFuZCBhIGRpc3BsYXkgbmFtZSBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LnRvRGlzcGxheU5hbWUuIEZvciB0aGUgZm9ybWF0cyB0aGF0IGRvbid0CisgICAgICAgbmVlZCBhIGRlZGljYXRlZCBTdXJyb25kIFNldHRpbmdzIGRpYWxvZyBlbnRyeSwgYSBzdWJmb3JtYXRzIGxpc3QgaGFzIHRvIGJlIHVzZWQuIC0tPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FBQ19MQyIgc3ViZm9ybWF0cz0iQVVESU9fRk9STUFUX0FBQ19IRV9WMSBBVURJT19GT1JNQVRfQUFDX0hFX1YyIEFVRElPX0ZPUk1BVF9BQUNfRUxEIEFVRElPX0ZPUk1BVF9BQUNfWEhFIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDNCIgLz4KKyAgPC9mb3JtYXRzPgorPC9zdXJyb3VuZFNvdW5kPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZGUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjg1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxQcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxWb2x1bWVHcm91cC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKworY2xhc3MgRW5naW5lQmFzZSA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworCisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtUGhvbmVTdGF0ZTsgfQorCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmF0ZWd5VmVjdG9yIGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworCisgICAgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3QgZ3JvdXApIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmZpbmQoZ3JvdXApICE9IGVuZChtVm9sdW1lR3JvdXBzKSA/CisgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3Vwcy5hdChncm91cCktPmdldFZvbHVtZUN1cnZlcygpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBWb2x1bWVHcm91cFZlY3RvciBnZXRWb2x1bWVHcm91cHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXNGb3JWb2x1bWVHcm91cCh2b2x1bWVfZ3JvdXBfdCB2b2x1bWVHcm91cCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JWb2x1bWVHcm91cCh2b2x1bWVfZ3JvdXBfdCB2b2x1bWVHcm91cCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworCisKKyAgICBlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICBjb25zdCBQcm9kdWN0U3RyYXRlZ3lNYXAgJmdldFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QgeyByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzOyB9CisKKyAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgJmdldFByb2R1Y3RTdHJhdGVnaWVzKCkgeyByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzOyB9CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKmdldEFwbU9ic2VydmVyKCkgY29uc3QgeyByZXR1cm4gbUFwbU9ic2VydmVyOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc0luQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpOworICAgIH0KKworICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHN0cmVhbSk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KTsKKworICAgIHN0YXR1c190IHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyBwcml2YXRlOgorICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXIgPSBudWxscHRyOworCisgICAgUHJvZHVjdFN0cmF0ZWd5TWFwIG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBWb2x1bWVHcm91cE1hcCBtVm9sdW1lR3JvdXBzOworICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZSA9IEFVRElPX01PREVfTk9STUFMOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLworCisgICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9IHt9OworfTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3YThlZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiVm9sdW1lR3JvdXAuaCIKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxIYW5kbGVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBAYnJpZWYgVGhlIFByb2R1Y3RTdHJhdGVneSBjbGFzcyBkZXNjcmliZXMgZm9yIGVhY2ggcHJvZHVjdF9zdHJhdGVneV90IGlkZW50aWZpZXIgdGhlCisgKiBhc3NvY2lhdGVkIGF1ZGlvIGF0dHJpYnV0ZXMsIHRoZSBkZXZpY2UgdHlwZXMgdG8gdXNlLCB0aGUgZGV2aWNlIGFkZHJlc3MgdG8gdXNlLgorICogVGhlIGlkZW50aWZpZXIgaXMgdm9sdW50YXJpbHkgbm90IHN0cm9uZ2x5IHR5cGVkIGluIG9yZGVyIHRvIGJlIGV4dGVuc2libGUgYnkgT0VNLgorICovCitjbGFzcyBQcm9kdWN0U3RyYXRlZ3kgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD4KK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IEF1ZGlvQXR0cmlidXRlcyB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBtVm9sdW1lR3JvdXAgPSBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICB9OworCisgICAgdXNpbmcgQXVkaW9BdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPjsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgICB2b2lkIGFkZEF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhdWRpb0F0dHJpYnV0ZXMpOworCisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBsaXN0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0OworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3VwcG9ydGVkU3RyZWFtcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1hdGNoZXMgY2hlY2tzIGlmIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzIHNoYWxsIGZvbGxvdyB0aGUgc3RyYXRlZ3kuCisgICAgICogICAgICAgIE9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiBhIHN0cmF0ZWd5IG1hdHRlcnMuCisgICAgICogICAgICAgIElmIG9ubHkgdGhlIHVzYWdlIGlzIGF2YWlsYWJsZSwgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZCBvbiB0aGUgdXNhZ2VzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLCBvdGhlcndpc2UgYWxsIGZpZWxkcyBtdXN0IG1hdGNoLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIHRoZSBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcykgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0OworCisgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQorICAgIHsKKyAgICAgICAgbURldmljZUFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQWRkcmVzczsgfQorCisgICAgdm9pZCBzZXREZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKKyAgICB7CisgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOyB9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0OworCisgICAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKworICAgIEF1ZGlvQXR0cmlidXRlc1ZlY3RvciBtQXR0cmlidXRlc1ZlY3RvcjsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICBzdGQ6OnN0cmluZyBtRGV2aWNlQWRkcmVzczsgLyoqPCBEZXZpY2UgYWRkcmVzcyBhcHBsaWNhYmxlIGZvciB0aGlzIHN0cmF0ZWd5LCBtYXliZSBlbXB0eSAqLworCisgICAgLyoqCisgICAgICogQXBwbGljYWJsZSBkZXZpY2UocykgdHlwZSBtYXNrIGZvciB0aGlzIHN0cmF0ZWd5LgorICAgICAqLworICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKK307CisKK2NsYXNzIFByb2R1Y3RTdHJhdGVneU1hcCA6IHB1YmxpYyBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIHNwPFByb2R1Y3RTdHJhdGVneT4gPgoreworcHVibGljOgorICAgIC8qKgorICAgICAqIEBicmllZiBpbml0aWFsaXplOiBzZXQgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGluIGNhY2hlLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiB0aGUgdmVjdG9yIGlzIGRpbWVuc2lvbm5pbmcuCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiBAcmV0dXJuIGFwcGxpY2FibGUgcHJvZHVjdCBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSwgZGVmYXVsdCBpZiBub25lIGFwcGxpY2FibGUuCisgICAgICovCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqICAgICAgICBBdWRpb01hbmFnZXI6IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIGZvcm1lciByb3V0aW5nIHN0cmF0ZWd5CisgICAgICogICAgICAgIENhckF1ZGlvTWFuYWdlcjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgY2FyIHVzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgW2dldEF1ZGlvQXR0cmlidXRlc0ZvckNhclVzYWdlXQorICAgICAqICAgICAgICBPZW1FeHRlbnNpb246IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIE9lbSB1c2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0ZWd5CisgICAgICogQHJldHVybiBhdWRpbyBhdHRyaWJ1dGVzIChvciBhdCBsZWFzdCBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMpIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICovCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldERlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbURlZmF1bHRTdHJhdGVneSA9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzMTRlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJVm9sdW1lQ3VydmVzLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPEhhbmRsZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEN1cnZlUG9pbnQKK3sKKyAgICBDdXJ2ZVBvaW50KCkge30KKyAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgorICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KKyAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQoreworICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKK30KKworLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQorLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCisvLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCitjbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgOiBtRGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSB7fQorCisgICAgdm9pZCBhZGQoY29uc3QgQ3VydmVQb2ludCAmcG9pbnQpIHsgbUN1cnZlUG9pbnRzLmFkZChwb2ludCk7IH0KKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihpbnQgaW5kZXhJblVpLCBpbnQgdm9sSW5kZXhNaW4sIGludCB2b2xJbmRleE1heCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKKworICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGRldmljZV9jYXRlZ29yeSBtRGV2aWNlQ2F0ZWdvcnk7CisgICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKK307CisKKy8vIFZvbHVtZSBDdXJ2ZXMgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgaW5kZXhlZCBieSBkZXZpY2UgY2F0ZWdvcnkKK2NsYXNzIFZvbHVtZUN1cnZlcyA6IHB1YmxpYyBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+LAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXMKK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVDdXJ2ZXMoaW50IGluZGV4TWluID0gMCwgaW50IGluZGV4TWF4ID0gMTAwKSA6CisgICAgICAgIG1JbmRleE1pbihpbmRleE1pbiksIG1JbmRleE1heChpbmRleE1heCkKKyAgICB7CisgICAgICAgIGFkZEN1cnJlbnRWb2x1bWVJbmRleChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7CisgICAgfQorICAgIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICAgICAgbUluZGV4TWF4ID0gaW5kZXhNYXg7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzcDxWb2x1bWVDdXJ2ZT4gZ2V0Q3VydmVzRm9yKGRldmljZV9jYXRlZ29yeSBkZXZpY2UpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlRm9yKGRldmljZSk7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRQorICAgICAgICBpZiAobUluZGV4Q3VyLmZpbmQoZGV2aWNlKSA9PSBlbmQobUluZGV4Q3VyKSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5hdChkZXZpY2UpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKSB7IG1JbmRleEN1ci5jbGVhcigpOyB9CisgICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgbUluZGV4Q3VyW2RldmljZV0gPSBpbmRleDsKKyAgICB9CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KKworICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQorCisgICAgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5maW5kKGRldmljZSkgIT0gZW5kKG1JbmRleEN1cik7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3dpdGNoQ3VydmVzRnJvbShjb25zdCBWb2x1bWVDdXJ2ZXMgJnJlZmVyZW5jZUN1cnZlcykKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmVmZXJlbmNlQ3VydmVzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzISBkZXZpY2UgY2F0ZWdvcnkgbm90IGFsaWduZWQsIGNhbm5vdCBzd2l0Y2giLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBjYXQgPSBrZXlBdChpbmRleCk7CisgICAgICAgICAgICBzZXRWb2x1bWVDdXJ2ZShjYXQsIHJlZmVyZW5jZUN1cnZlcy5nZXRPcmlnaW5Wb2x1bWVDdXJ2ZShjYXQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHN0YXR1c190IHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3dpdGNoQ3VydmVzRnJvbSgqdGhpcyk7CisgICAgfQorCisgICAgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+IGdldE9yaWdpblZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3QKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5Iik7CisgICAgICAgIHJldHVybiBtT3JpZ2luVm9sdW1lQ3VydmVzLnZhbHVlRm9yKGRldmljZUNhdGVnb3J5KTsKKyAgICB9CisgICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCisgICAgeworICAgICAgICBBTE9HX0FTU0VSVChpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkgZm9yIFZvbHVtZSBDdXJ2ZSIpOworICAgICAgICByZXBsYWNlVmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gdm9sdW1lQ3VydmUtPmdldERldmljZUNhdGVnb3J5KCk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBWb2x1bWUgQ3VydmVzIHBlciBkZXZpY2UgY2F0ZWdvcnkgaW4gb3JkZXIgdG8gc3dpdGNoIGN1cnZlcy4KKyAgICAgICAgICAgIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuYWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgICAgICAgICByZXR1cm4gS2V5ZWRWZWN0b3I6OmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0LCBpbnQgaW5kZXhJblVpKSBjb25zdAorICAgIHsKKyAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IHZjID0gZ2V0Q3VydmVzRm9yKGRldmljZUNhdCk7CisgICAgICAgIGlmICh2YyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdmMtPnZvbEluZGV4VG9EYihpbmRleEluVWksIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSAlZCBmb3IgVm9sdW1lIEN1cnZlIiwgZGV2aWNlQ2F0KTsKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYWRkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCisgICAgeworICAgICAgICBtQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cik7CisgICAgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QXR0cmlidXRlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgdm9pZCBhZGRTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgIHsKKyAgICAgICAgbVN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtU3RyZWFtczsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgS2V5ZWRWZWN0b3I8ZGV2aWNlX2NhdGVnb3J5LCBzcDxWb2x1bWVDdXJ2ZT4gPiBtT3JpZ2luVm9sdW1lQ3VydmVzOworICAgIHN0ZDo6bWFwPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KKyAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCisgICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLworICAgIGNvbnN0IGJvb2wgbUNhbkJlTXV0ZWQgPSB0cnVlOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIG1BdHRyaWJ1dGVzOworICAgIFN0cmVhbVR5cGVWZWN0b3IgbVN0cmVhbXM7IC8qKjwgS2VlcCBpdCBmb3IgbGVnYWN5LiAqLworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUdyb3VwLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzRiNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUdyb3VwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVm9sdW1lR3JvdXAgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD4KK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKKyAgICB2b2lkIGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJmN1cnZlKTsKKworICAgIFZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gJm1Hcm91cFZvbHVtZUN1cnZlczsgfQorCisgICAgdm9pZCBhZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRTdXBwb3J0ZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwVm9sdW1lQ3VydmVzLmdldEF0dHJpYnV0ZXMoKTsgfQorCisgICAgdm9pZCBhZGRTdXBwb3J0ZWRTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCB7IHJldHVybiBtR3JvdXBWb2x1bWVDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIGNvbnN0IHZvbHVtZV9ncm91cF90IG1JZDsKKyAgICBWb2x1bWVDdXJ2ZXMgbUdyb3VwVm9sdW1lQ3VydmVzOworfTsKKworY2xhc3MgVm9sdW1lR3JvdXBNYXAgOiBwdWJsaWMgc3RkOjptYXA8dm9sdW1lX2dyb3VwX3QsIHNwPFZvbHVtZUdyb3VwPiA+Cit7CitwdWJsaWM6CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU3YjQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvQmFzZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKKyNpbmNsdWRlICJFbmdpbmVEZWZhdWx0Q29uZmlnLmgiCisjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwordm9pZCBFbmdpbmVCYXNlOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCit7CisgICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKKyAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBudWxscHRyKT8gTk9fRVJST1IgOiBOT19JTklUOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworCisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fU1RSRUFNX0RUTUYpOworICAgIH0gZWxzZSBpZiAoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgIWlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgRW5naW5lQmFzZTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQorCitlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIGxvYWRQcm9kdWN0U3RyYXRlZ2llcyA9CisgICAgICAgICAgICBbXShhdXRvJiBzdHJhdGVneUNvbmZpZ3MsIGF1dG8mIHByb2R1Y3RTdHJhdGVnaWVzLCBhdXRvJiB2b2x1bWVHcm91cHMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdHJhdGVneUNvbmZpZyA6IHN0cmF0ZWd5Q29uZmlncykgeworICAgICAgICAgICAgc3A8UHJvZHVjdFN0cmF0ZWd5PiBzdHJhdGVneSA9IG5ldyBQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lDb25maWcubmFtZSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmdyb3VwIDogc3RyYXRlZ3lDb25maWcuYXR0cmlidXRlc0dyb3VwcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4odm9sdW1lR3JvdXBzKSwgZW5kKHZvbHVtZUdyb3VwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZ3JvdXBdKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAudm9sdW1lR3JvdXAgPT0gdm9sdW1lR3JvdXAuc2Vjb25kLT5nZXROYW1lKCk7IH0pOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGl0ZXIgIT0gZW5kKHZvbHVtZUdyb3VwcyksICJJbnZhbGlkIFZvbHVtZSBHcm91cCBOYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC52b2x1bWVHcm91cC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuc3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+YWRkU3VwcG9ydGVkU3RyZWFtKGdyb3VwLnN0cmVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IGdyb3VwLmF0dHJpYnV0ZXNWZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LT5hZGRBdHRyaWJ1dGVzKHtncm91cC5zdHJlYW0sIGl0ZXItPnNlY29uZC0+Z2V0SWQoKSwgYXR0cn0pOworICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmFkZFN1cHBvcnRlZEF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5SWQgPSBzdHJhdGVneS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIHByb2R1Y3RTdHJhdGVnaWVzW3N0cmF0ZWd5SWRdID0gc3RyYXRlZ3k7CisgICAgICAgIH0KKyAgICB9OworICAgIGF1dG8gbG9hZFZvbHVtZUdyb3VwcyA9IFtdKGF1dG8gJnZvbHVtZUNvbmZpZ3MsIGF1dG8gJnZvbHVtZUdyb3VwcykgeworICAgICAgICBmb3IgKGF1dG8gJnZvbHVtZUNvbmZpZyA6IHZvbHVtZUNvbmZpZ3MpIHsKKyAgICAgICAgICAgIHNwPFZvbHVtZUdyb3VwPiB2b2x1bWVHcm91cCA9IG5ldyBWb2x1bWVHcm91cCh2b2x1bWVDb25maWcubmFtZSwgdm9sdW1lQ29uZmlnLmluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUNvbmZpZy5pbmRleE1heCk7CisgICAgICAgICAgICB2b2x1bWVHcm91cHNbdm9sdW1lR3JvdXAtPmdldElkKCldID0gdm9sdW1lR3JvdXA7CisKKyAgICAgICAgICAgIGZvciAoYXV0byAmY29uZmlnQ3VydmUgOiB2b2x1bWVDb25maWcudm9sdW1lQ3VydmVzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCA9IERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmICghRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OmZyb21TdHJpbmcoY29uZmlnQ3VydmUuZGV2aWNlQ2F0ZWdvcnksIGRldmljZUNhdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBjb25maWdDdXJ2ZS5kZXZpY2VDYXRlZ29yeS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPFZvbHVtZUN1cnZlPiBjdXJ2ZSA9IG5ldyBWb2x1bWVDdXJ2ZShkZXZpY2VDYXQpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byAmcG9pbnQgOiBjb25maWdDdXJ2ZS5jdXJ2ZVBvaW50cykgeworICAgICAgICAgICAgICAgICAgICBjdXJ2ZS0+YWRkKHtwb2ludC5pbmRleCwgcG9pbnQuYXR0ZW51YXRpb25Jbk1ifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbHVtZUdyb3VwLT5hZGQoY3VydmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBhdXRvIHJlc3VsdCA9IGVuZ2luZUNvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gY29uZmlndXJhdGlvbiBmb3VuZCwgdXNpbmcgZGVmYXVsdCBtYXRjaGluZyBwaG9uZSBleHBlcmllbmNlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGVuZ2luZUNvbmZpZzo6Q29uZmlnIGNvbmZpZyA9IGdEZWZhdWx0RW5naW5lQ29uZmlnOworICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBlbmdpbmVDb25maWc6OnBhcnNlTGVnYWN5Vm9sdW1lcyhjb25maWcudm9sdW1lR3JvdXBzKTsKKyAgICAgICAgcmVzdWx0ID0ge3N0ZDo6bWFrZV91bmlxdWU8ZW5naW5lQ29uZmlnOjpDb25maWc+KGNvbmZpZyksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCA9PSBOT19FUlJPUiA/IDAgOiAxKX07CisgICAgfQorICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICJza2lwcGVkICV6dSBlbGVtZW50cyIsIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50KTsKKyAgICBsb2FkVm9sdW1lR3JvdXBzKHJlc3VsdC5wYXJzZWRDb25maWctPnZvbHVtZUdyb3VwcywgbVZvbHVtZUdyb3Vwcyk7CisgICAgbG9hZFByb2R1Y3RTdHJhdGVnaWVzKHJlc3VsdC5wYXJzZWRDb25maWctPnByb2R1Y3RTdHJhdGVnaWVzLCBtUHJvZHVjdFN0cmF0ZWdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cHMpOworICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5pbml0aWFsaXplKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU3RyYXRlZ3lWZWN0b3IgRW5naW5lQmFzZTo6Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QKK3sKKyAgICBhdXRvIGZpbmRCeUZsYWcgPSBbXShjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ2llcywgYXV0byBmbGFnKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4ocHJvZHVjdFN0cmF0ZWdpZXMpLCBlbmQocHJvZHVjdFN0cmF0ZWdpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBhdXRvICZzdHJhdGVneSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogc3RyYXRlZ3kuc2Vjb25kLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIGZsYWcpID09IGZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9KTsKKyAgICB9OworICAgIGF1dG8gc3RyYXRlZ2llcyA9IG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBhdXRvIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlciA9IGZpbmRCeUZsYWcoc3RyYXRlZ2llcywgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKTsKKworICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCAmJgorICAgICAgICAgICAgZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyICE9IHN0cmF0ZWdpZXMuZW5kKCkpIHsKKyAgICAgICAgYXV0byBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneSA9ICplbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXI7CisgICAgICAgIHN0cmF0ZWdpZXMuZXJhc2UoZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyKTsKKyAgICAgICAgc3RyYXRlZ2llcy5pbnNlcnQoYmVnaW4oc3RyYXRlZ2llcyksIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5KTsKKyAgICB9CisgICAgU3RyYXRlZ3lWZWN0b3Igb3JkZXJlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogc3RyYXRlZ2llcykgeworICAgICAgICBvcmRlcmVkU3RyYXRlZ2llcy5wdXNoX2JhY2soaXRlci5zZWNvbmQtPmdldElkKCkpOworICAgIH0KKyAgICByZXR1cm4gb3JkZXJlZFN0cmF0ZWdpZXM7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgRW5naW5lQmFzZTo6Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIC8vIEBUT0RPIGRlZmF1bHQgbXVzaWMgc3RyZWFtIHRvIGNvbnRyb2wgdm9sdW1lIGlmIG5vIGdyb3VwPworICAgIHJldHVybiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpICE9IGVuZChtUHJvZHVjdFN0cmF0ZWdpZXMpKSA/CisgICAgICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmF0KHBzKS0+Z2V0U3VwcG9ydGVkU3RyZWFtcygpIDoKKyAgICAgICAgICAgICAgICBTdHJlYW1UeXBlVmVjdG9yKEFVRElPX1NUUkVBTV9NVVNJQyk7Cit9CisKK0F0dHJpYnV0ZXNWZWN0b3IgRW5naW5lQmFzZTo6Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgIT0gZW5kKG1Qcm9kdWN0U3RyYXRlZ2llcykpID8KKyAgICAgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuYXQocHMpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSA6IEF0dHJpYnV0ZXNWZWN0b3IoKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjaygKKyAgICAgICAge3Byb2R1Y3RTdHJhdGVneS0+Z2V0TmFtZSgpLCBwcm9kdWN0U3RyYXRlZ3ktPmxpc3RBdWRpb0F0dHJpYnV0ZXMoKSwKKyAgICAgICAgIHByb2R1Y3RTdHJhdGVneS0+Z2V0SWQoKX0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1ZvbHVtZUN1cnZlcyAqRW5naW5lQmFzZTo6Z2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgdm9sdW1lX2dyb3VwX3Qgdm9sR3IgPSBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBtVm9sdW1lR3JvdXBzLmZpbmQodm9sR3IpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciA9PSBzdGQ6OmVuZChtVm9sdW1lR3JvdXBzKSwgIk5vIHZvbHVtZSBncm91cHMgZm9yICVzIiwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuYXQodm9sR3IpLT5nZXRWb2x1bWVDdXJ2ZXMoKTsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHZvbHVtZV9ncm91cF90IHZvbEdyID0gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBtVm9sdW1lR3JvdXBzLmZpbmQodm9sR3IpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciA9PSBzdGQ6OmVuZChtVm9sdW1lR3JvdXBzKSwgIk5vIHZvbHVtZSBncm91cHMgZm9yICVzIiwKKyAgICAgICAgICAgICAgICB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmF0KHZvbEdyKS0+Z2V0Vm9sdW1lQ3VydmVzKCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKK3sKKyAgICBhdXRvIHNyY0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtU3JjKTsKKyAgICBhdXRvIGRzdEN1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtRHN0KTsKKworICAgIGlmIChzcmNDdXJ2ZXMgPT0gbnVsbHB0ciB8fCBkc3RDdXJ2ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gZHN0Q3VydmVzLT5zd2l0Y2hDdXJ2ZXNGcm9tKCpzcmNDdXJ2ZXMpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpyZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgVm9sdW1lQ3VydmVzICpjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGN1cnZlcyAhPSBudWxscHRyID8gY3VydmVzLT5zd2l0Y2hDdXJ2ZXNGcm9tKCpjdXJ2ZXMpIDogQkFEX1ZBTFVFOworfQorCitWb2x1bWVHcm91cFZlY3RvciBFbmdpbmVCYXNlOjpnZXRWb2x1bWVHcm91cHMoKSBjb25zdAoreworICAgIFZvbHVtZUdyb3VwVmVjdG9yIGdyb3VwOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVHcm91cHMpIHsKKyAgICAgICAgZ3JvdXAucHVzaF9iYWNrKGl0ZXIuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7Cit9CisKK3ZvbHVtZV9ncm91cF90IEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK3ZvbHVtZV9ncm91cF90IEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitTdHJlYW1UeXBlVmVjdG9yIEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3Qgdm9sdW1lR3JvdXApIGNvbnN0Cit7CisgICAgLy8gQFRPRE8gZGVmYXVsdCBtdXNpYyBzdHJlYW0gdG8gY29udHJvbCB2b2x1bWUgaWYgbm8gZ3JvdXA/CisgICAgcmV0dXJuIChtVm9sdW1lR3JvdXBzLmZpbmQodm9sdW1lR3JvdXApICE9IGVuZChtVm9sdW1lR3JvdXBzKSkgPworICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cHMuYXQodm9sdW1lR3JvdXApLT5nZXRTdHJlYW1UeXBlcygpIDoKKyAgICAgICAgICAgICAgICBTdHJlYW1UeXBlVmVjdG9yKEFVRElPX1NUUkVBTV9NVVNJQyk7Cit9CisKK0F0dHJpYnV0ZXNWZWN0b3IgRW5naW5lQmFzZTo6Z2V0QWxsQXR0cmlidXRlc0ZvclZvbHVtZUdyb3VwKHZvbHVtZV9ncm91cF90IHZvbHVtZUdyb3VwKSBjb25zdAoreworICAgIHJldHVybiAobVZvbHVtZUdyb3Vwcy5maW5kKHZvbHVtZUdyb3VwKSAhPSBlbmQobVZvbHVtZUdyb3VwcykpID8KKyAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBzLmF0KHZvbHVtZUdyb3VwKS0+Z2V0U3VwcG9ydGVkQXR0cmlidXRlcygpIDogQXR0cmlidXRlc1ZlY3RvcigpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVHcm91cHMpIHsKKyAgICAgICAgZ3JvdXBzLnB1c2hfYmFjayh7aXRlci5zZWNvbmQtPmdldE5hbWUoKSwgaXRlci5zZWNvbmQtPmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIuc2Vjb25kLT5nZXRTdXBwb3J0ZWRBdHRyaWJ1dGVzKCksIGl0ZXIuc2Vjb25kLT5nZXRTdHJlYW1UeXBlcygpfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFbmdpbmVCYXNlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuZHVtcChkc3QsIDIpOworICAgIG1Wb2x1bWVHcm91cHMuZHVtcChkc3QsIDIpOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRlMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLyoqCisgKiBAYnJpZWYgQXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyBoYXJkIGNvZGVkIGFycmF5IG9mIHN0cmF0ZWdpZXMgdG8gZmlsbCBuZXcgZW5naW5lIEFQSSBjb250cmFjdC4KKyAqLworY29uc3QgZW5naW5lQ29uZmlnOjpQcm9kdWN0U3RyYXRlZ2llcyBnT3JkZXJlZFN0cmF0ZWdpZXMgPSB7CisgICAgeyJTVFJBVEVHWV9QSE9ORSIsCisgICAgIHsKKyAgICAgICAgIHsicGhvbmUiLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgIkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwKKyAgICAgICAgICAgICIifX0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzY28iLCBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgIkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19TQ08sCisgICAgICAgICAgICAiIn19LAorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9TT05JRklDQVRJT04iLAorICAgICB7CisgICAgICAgICB7InJpbmciLCBBVURJT19TVFJFQU1fUklORywgIkFVRElPX1NUUkVBTV9SSU5HIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0sCisgICAgICAgICB7ImFsYXJtIiwgQVVESU9fU1RSRUFNX0FMQVJNLCAiQVVESU9fU1RSRUFNX0FMQVJNIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0sCisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAiQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VELCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCAiQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OLCAiQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9NRURJQSIsCisgICAgIHsKKyAgICAgICAgIHsibXVzaWMiLCBBVURJT19TVFJFQU1fTVVTSUMsICJBVURJT19TVFJFQU1fTVVTSUMiLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9NRURJQSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9HQU1FLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9LAorICAgICAgICAgfSwKKyAgICAgICAgIHsic3lzdGVtIiwgQVVESU9fU1RSRUFNX1NZU1RFTSwgIkFVRElPX1NUUkVBTV9TWVNURU0iLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfRFRNRiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0RUTUYsICJBVURJT19TVFJFQU1fRFRNRiIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1RUUywgIkFVRElPX1NUUkVBTV9UVFMiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19CRUFDT04sICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfUkVST1VUSU5HIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUkVST1VUSU5HLCAiQVVESU9fU1RSRUFNX1JFUk9VVElORyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfUEFUQ0giLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9QQVRDSCwgIkFVRElPX1NUUkVBTV9QQVRDSCIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9Cit9OworCitjb25zdCBlbmdpbmVDb25maWc6OkNvbmZpZyBnRGVmYXVsdEVuZ2luZUNvbmZpZyA9IHsKKyAgICAxLjAsCisgICAgZ09yZGVyZWRTdHJhdGVnaWVzLAorICAgIHt9LAorICAgIHt9LAorICAgIHt9Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlNjY5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUHJvZHVjdFN0cmF0ZWd5OjpQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIDoKKyAgICBtTmFtZShuYW1lKSwKKyAgICBtSWQoc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+OjpnZXROZXh0SGFuZGxlKCkpKQoreworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneTo6YWRkQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmF1ZGlvQXR0cmlidXRlcykKK3sKKyAgICBtQXR0cmlidXRlc1ZlY3Rvci5wdXNoX2JhY2soYXVkaW9BdHRyaWJ1dGVzKTsKK30KKworc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBQcm9kdWN0U3RyYXRlZ3k6Omxpc3RBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdAoreworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcz4gYW5kcm9pZEFhOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGFuZHJvaWRBYS5wdXNoX2JhY2soe2F0dHIubVZvbHVtZUdyb3VwLCBhdHRyLm1TdHJlYW0sIGF0dHIubUF0dHJpYnV0ZXN9KTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWRBYTsKK30KKworQXR0cmlidXRlc1ZlY3RvciBQcm9kdWN0U3RyYXRlZ3k6OmdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0Cit7CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ckdyb3VwIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgYXR0clZlY3Rvci5wdXNoX2JhY2soYXR0ckdyb3VwLm1BdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgaWYgKG5vdCBhdHRyVmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJWZWN0b3I7CisgICAgfQorICAgIHJldHVybiB7IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIgfTsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6Om1hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsKKyAgICB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IFByb2R1Y3RTdHJhdGVneTo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsgfSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1TdHJlYW0gOiBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RyZWFtVHlwZV0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tU3RyZWFtID09IHN0cmVhbVR5cGU7IH0pOworICAgIHJldHVybiBpdGVyICE9IGVuZChtQXR0cmlidXRlc1ZlY3RvcikgPyBpdGVyLT5tQXR0cmlidXRlcyA6IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5Ojppc0RlZmF1bHQoKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLCBbXShjb25zdCBhdXRvICZhdHRyKSB7CisgICAgICAgIHJldHVybiBhdHRyLm1BdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyOyB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCitTdHJlYW1UeXBlVmVjdG9yIFByb2R1Y3RTdHJhdGVneTo6Z2V0U3VwcG9ydGVkU3RyZWFtcygpIGNvbnN0Cit7CisgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zOworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oc3RyZWFtcyksIGVuZChzdHJlYW1zKSwgc3VwcG9ydGVkQXR0ci5tU3RyZWFtKSA9PSBlbmQoc3RyZWFtcykgJiYKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKHN1cHBvcnRlZEF0dHIubVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbXM7Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5OjpzdXBwb3J0U3RyZWFtVHlwZShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW1UeXBlKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtVHlwZTsgfSkgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoc3VwcG9ydGVkQXR0ci5tQXR0cmlidXRlcywgYXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1Wb2x1bWVHcm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tVm9sdW1lR3JvdXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byAmaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvICZhdHRyKSB7cmV0dXJuIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHI7fSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1Wb2x1bWVHcm91cCA6IFZPTFVNRV9HUk9VUF9OT05FOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOworICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7CisgICAgaWYgKCFPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKG1BcHBsaWNhYmxlRGV2aWNlcywgZGV2aWNlTGl0ZXJhbCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBkZXZpY2UgJWQiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlRGV2aWNlcyk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHt0eXBlOiVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpdGVyYWwuY19zdHIoKSwgbURldmljZUFkZHJlc3MuY19zdHIoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR3JvdXA6ICVkIHN0cmVhbTogJXNcbiIsIHNwYWNlcyArIDMsICIiLCBhdHRyLm1Wb2x1bWVHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dG9TdHJpbmcoYXR0ci5tU3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBBdHRyaWJ1dGVzOiAiLCBzcGFjZXMgKyAzLCAiIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF0dFN0ciA9CisgICAgICAgICAgICAgICAgYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0ciA/ICJ7IEFueSB9IiA6IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIubUF0dHJpYnV0ZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXNcbiIsIGF0dFN0ci5jX3N0cigpKTsKKyAgICB9Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPm1hdGNoZXMoYXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIG1hdGNoaW5nIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIGF0dHJpYnV0ZXMgJXMsIHJldHVybiBkZWZhdWx0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gc3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LT5zdXBwb3J0U3RyZWFtVHlwZShzdHJlYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3ktPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBzdHJlYW0gJXMsIHVzaW5nIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4ge307Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gaXRlci5zZWNvbmQtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3IgYXR0cmlidXRlcyAlcywgdXNpbmcgZGVmYXVsdCAoYWthIE1VU0lDKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gIEFVRElPX1NUUkVBTV9NVVNJQzsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGVmYXVsdCgpIGNvbnN0Cit7CisgICAgaWYgKG1EZWZhdWx0U3RyYXRlZ3kgIT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFN0cmF0ZWd5OworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPmlzRGVmYXVsdCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHVzaW5nIGRlZmF1bHQgJXMiLCBfX0ZVTkNUSU9OX18sIGl0ZXIuc2Vjb25kLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBObyBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGlmIChmaW5kKHN0cmF0ZWd5KSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQiLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKVswXTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+c3VwcG9ydFN0cmVhbVR5cGUoc3RyZWFtKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3Igc3RyZWFtICVkLCB1c2luZyBkZWZhdWx0IiwgX19GVU5DVElPTl9fLCBzdHJlYW0pOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKKworYXVkaW9fZGV2aWNlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBpZiAoZmluZChzdHJhdGVneSkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5Iiwgc3RyYXRlZ3kpOworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGVmYXVsdFN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdChnZXREZWZhdWx0KCkpLT5nZXREZXZpY2VUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXREZXZpY2VUeXBlcygpOworfQorCitzdGQ6OnN0cmluZyBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzSWQpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQocHNJZCkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5IiwgcHNJZCk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0KGdldERlZmF1bHQoKSktPmdldERldmljZUFkZHJlc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIGF0KHBzSWQpLT5nZXREZXZpY2VBZGRyZXNzKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IGl0ZXIuc2Vjb25kLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgIGlmIChncm91cCAhPSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworICAgIH0KKyAgICByZXR1cm4gYXQoZGVmYXVsdFN0cmF0ZWd5KS0+Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwID0gaXRlci5zZWNvbmQtPmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgICAgICBpZiAoZ3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIGF0KGRlZmF1bHRTdHJhdGVneSktPmdldERlZmF1bHRWb2x1bWVHcm91cCgpOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneU1hcDo6aW5pdGlhbGl6ZSgpCit7CisgICAgbURlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICBBTE9HX0FTU0VSVChtRGVmYXVsdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwgIk5vIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBmb3VuZCIpOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneU1hcDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Byb2R1Y3QgU3RyYXRlZ2llcyBkdW1wOiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGl0ZXIuc2Vjb25kLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQorfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzUyNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlZvbHVtZUN1cnZlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiVm9sdW1lQ3VydmUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Zsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOworICAgIGlmICh2b2xJbmRleE1pbiA8IDAgfHwgdm9sSW5kZXhNYXggPCAwKSB7CisgICAgICAgIC8vIEluIG9yZGVyIHRvIGxldCBBdWRpb1NlcnZpY2UgaW5pdGlhbGl6ZSB0aGUgbWluIGFuZCBtYXgsIGNvbnZlbnRpb24gaXMgdG8gdXNlIC0xCisgICAgICAgIHJldHVybiBOQU47CisgICAgfQorICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgeworICAgICAgICAvLyBhbiBpbmRleCBvZiAwIG1lYW5zIG11dGUgcmVxdWVzdCB3aGVuIHZvbEluZGV4TWluID4gMAorICAgICAgICBpZiAoaW5kZXhJblVpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJWT0xVTUUgZm9yY2luZyBtdXRlIGZvciBpbmRleCAwIHdpdGggbWluIGluZGV4ICVkIiwgdm9sSW5kZXhNaW4pOworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtaW4gaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWluKTsKKyAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNaW47CisgICAgfSBlbHNlIGlmIChpbmRleEluVWkgPiB2b2xJbmRleE1heCkgeworICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1heCBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNYXgpOworICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1heDsKKyAgICB9CisKKyAgICBzaXplX3QgbmJDdXJ2ZVBvaW50cyA9IG1DdXJ2ZVBvaW50cy5zaXplKCk7CisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbQorICAgIGludCBuYlN0ZXBzID0gMSArIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUluZGV4IC0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKKworICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50CisgICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKKyAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPj0gbmJDdXJ2ZVBvaW50cykgeworICAgICAgICAvL3VzZSBsYXN0IHBvaW50IG9mIHRhYmxlCisgICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7CisgICAgfQorICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA9PSAwKSB7CisgICAgICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiAhPSBtQ3VydmVQb2ludHNbMF0ubUluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbMF0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKKyAgICB9CisgICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCisgICAgZmxvYXQgZGVjaWJlbHMgPSAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSkgLworICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKTsKKworICAgIEFMT0dWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAorICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCwKKyAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZiksIGRlY2liZWxzLAorICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKTsKKworICAgIHJldHVybiBkZWNpYmVsczsKK30KKwordm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0Cit7CisgICAgaWYgKCFjdXJ2ZVBvaW50cykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRzdC0+YXBwZW5kKCIgeyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUN1cnZlUG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMoJTNkLCAlNWQpIiwgc3BhY2VzLCAiIiwgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdChpID09IChtQ3VydmVQb2ludHMuc2l6ZSgpIC0gMSkgPyAiIH1cbiIgOiAiLCAiKTsKKyAgICB9Cit9CisKK3ZvaWQgVm9sdW1lQ3VydmVzOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3sKKyAgICBpZiAoIWN1cnZlUG9pbnRzKSB7CisvLyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyUwMmQgICAgICAlcyAgICAgICAgICUwM2QgICAgICAgICUwM2QgICAgICAgICIsIHNwYWNlcywgIiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbSwgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMgKyAxLCAiIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsIHNwYWNlcyArIDEsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1JbmRleEN1cikgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUwNHggOiAlMDJkLCAiLCBwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtTmFtZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICBzdHJlYW1OYW1lcyArPSBhbmRyb2lkOjp0b1N0cmluZyhzdHJlYW0pICsgIigiK3N0ZDo6dG9fc3RyaW5nKHN0cmVhbSkrIikgIjsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1ZvbHVtZSBDdXJ2ZXMgU3RyZWFtcy9BdHRyaWJ1dGVzLCBDdXJ2ZSBwb2ludHMgU3RyZWFtcyBmb3IgZGV2aWNlIgorICAgICAgICAgICAgICAgICAgICAgICIgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsIHNwYWNlcywgIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgU3RyZWFtczogJXMgXG4iLCBzcGFjZXMsICIiLCBzdHJlYW1OYW1lcy5jX3N0cigpKTsKKyAgICBpZiAoIW1BdHRyaWJ1dGVzLmVtcHR5KCkpIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgQXR0cmlidXRlczoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBtQXR0cmlidXRlcykgeworICAgICAgICBzdGQ6OnN0cmluZyBhdHRTdHIgPSBhdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyID8gInsgQW55IH0iIDogYW5kcm9pZDo6dG9TdHJpbmcoYXR0cmlidXRlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgJXNcbiIsIGF0dHJpYnV0ZXMgPT0gbUF0dHJpYnV0ZXMuZnJvbnQoKSA/IDAgOiBzcGFjZXMgKyAxMywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dFN0ci5jX3N0cigpKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRMaXRlcmFsOworICAgICAgICBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIGRldmljZUNhdExpdGVyYWwpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzIDoiLCBzcGFjZXMsICIiLCBkZXZpY2VDYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMSwgdHJ1ZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4OTgwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUdyb3VwLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1ZvbHVtZUdyb3VwIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiVm9sdW1lR3JvdXAuaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8KKy8vIFZvbHVtZUdyb3VwIGltcGxlbWVudGF0aW9uCisvLworVm9sdW1lR3JvdXA6OlZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgOgorICAgIG1OYW1lKG5hbWUpLCBtSWQoc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD46OmdldE5leHRIYW5kbGUoKSkpLAorICAgIG1Hcm91cFZvbHVtZUN1cnZlcyhWb2x1bWVDdXJ2ZXMoaW5kZXhNaW4sIGluZGV4TWF4KSkKK3sKK30KKwordm9pZCBWb2x1bWVHcm91cDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5kdW1wKGRzdCwgc3BhY2VzICsgMiwgdHJ1ZSk7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJmN1cnZlKQoreworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5hZGQoY3VydmUpOworfQorCit2b2lkIFZvbHVtZUdyb3VwOjphZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkQXR0cmlidXRlcyhhdHRyKTsKK30KKwordm9pZCBWb2x1bWVHcm91cDo6YWRkU3VwcG9ydGVkU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5hZGRTdHJlYW1UeXBlKHN0cmVhbSk7Cit9CisKKy8vCisvLyBWb2x1bWVHcm91cE1hcCBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgVm9sdW1lR3JvdXBNYXA6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1ZvbHVtZSBHcm91cHMgZHVtcDoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpdGVyLnNlY29uZC0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyOTJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQyIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wb25lbnQgYnVpbGQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMpIFwKKyAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL0VuZ2luZUNvbmZpZy5jcHAKKworTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVdleHRyYQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmFuZHJvaWRpY3UgXAorICAgIGxpYnhtbDIgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYmN1dGlscworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlnCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb19zeXN0ZW1faGVhZGVycyBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1ZWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCitzdHJ1Y3QgX3htbE5vZGU7CitzdHJ1Y3QgX3htbERvYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVuZ2luZUNvbmZpZyB7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgYXVkaW8gcG9saWN5IHVzYWdlcyBjb25maWd1cmF0aW9uIGZpbGUuICovCitjb25zdGV4cHIgY2hhciBERUZBVUxUX1BBVEhbXSA9ICIvdmVuZG9yL2V0Yy9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIjsKKworLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBQT0xJQ1lfVVNBR0VfTElCUkFSWV9QQVRIW10gPSB7Ii9vZG0vZXRjLyIsICIvdmVuZG9yL2V0Yy8iLCAiL3N5c3RlbS9ldGMvIn07CisKK3VzaW5nIEF0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19hdHRyaWJ1dGVzX3Q+OwordXNpbmcgU3RyZWFtVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK3N0cnVjdCBBdHRyaWJ1dGVzR3JvdXAgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CisgICAgc3RkOjpzdHJpbmcgdm9sdW1lR3JvdXA7CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyaWJ1dGVzVmVjdDsKK307CisKK3VzaW5nIEF0dHJpYnV0ZXNHcm91cHMgPSBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVzR3JvdXA+OworCitzdHJ1Y3QgQ3VydmVQb2ludCB7CisgICAgaW50IGluZGV4OworICAgIGludCBhdHRlbnVhdGlvbkluTWI7Cit9OwordXNpbmcgQ3VydmVQb2ludHMgPSBzdGQ6OnZlY3RvcjxDdXJ2ZVBvaW50PjsKKworc3RydWN0IFZvbHVtZUN1cnZlIHsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeTsKKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKK307Cit1c2luZyBWb2x1bWVDdXJ2ZXMgPSBzdGQ6OnZlY3RvcjxWb2x1bWVDdXJ2ZT47CisKK3N0cnVjdCBWb2x1bWVHcm91cCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBpbnQgaW5kZXhNaW47CisgICAgaW50IGluZGV4TWF4OworICAgIFZvbHVtZUN1cnZlcyB2b2x1bWVDdXJ2ZXM7Cit9OwordXNpbmcgVm9sdW1lR3JvdXBzID0gc3RkOjp2ZWN0b3I8Vm9sdW1lR3JvdXA+OworCitzdHJ1Y3QgUHJvZHVjdFN0cmF0ZWd5IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIEF0dHJpYnV0ZXNHcm91cHMgYXR0cmlidXRlc0dyb3VwczsKK307CisKK3VzaW5nIFByb2R1Y3RTdHJhdGVnaWVzID0gc3RkOjp2ZWN0b3I8UHJvZHVjdFN0cmF0ZWd5PjsKKwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKKworc3RydWN0IENyaXRlcmlvblR5cGUKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgaXNJbmNsdXNpdmU7CisgICAgVmFsdWVQYWlycyB2YWx1ZVBhaXJzOworfTsKKwordXNpbmcgQ3JpdGVyaW9uVHlwZXMgPSBzdGQ6OnZlY3RvcjxDcml0ZXJpb25UeXBlPjsKKworc3RydWN0IENyaXRlcmlvbgoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWU7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdExpdGVyYWxWYWx1ZTsKK307CisKK3VzaW5nIENyaXRlcmlhID0gc3RkOjp2ZWN0b3I8Q3JpdGVyaW9uPjsKKworc3RydWN0IENvbmZpZyB7CisgICAgZmxvYXQgdmVyc2lvbjsKKyAgICBQcm9kdWN0U3RyYXRlZ2llcyBwcm9kdWN0U3RyYXRlZ2llczsKKyAgICBDcml0ZXJpYSBjcml0ZXJpYTsKKyAgICBDcml0ZXJpb25UeXBlcyBjcml0ZXJpb25UeXBlczsKKyAgICBWb2x1bWVHcm91cHMgdm9sdW1lR3JvdXBzOworfTsKKworLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLworc3RydWN0IFBhcnNpbmdSZXN1bHQgeworICAgIC8qKiBQYXJzZWQgY29uZmlnLCBudWxscHRyIGlmIHRoZSB4bWwgbGliIGNvdWxkIG5vdCBsb2FkIHRoZSBmaWxlICovCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gcGFyc2VkQ29uZmlnOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50OyAvLzwgTnVtYmVyIG9mIHNraXBwZWQgaW52YWxpZCBwcm9kdWN0IHN0cmF0ZWdpZXMKK307CisKKy8qKiBQYXJzZXMgdGhlIHByb3ZpZGVkIGF1ZGlvIHBvbGljeSB1c2FnZSBjb25maWd1cmF0aW9uLgorICogQHJldHVybiBhdWRpbyBwb2xpY3kgdXNhZ2UgQHNlZSBDb25maWcKKyAqLworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoID0gREVGQVVMVF9QQVRIKTsKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lcyhWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3Vwcyk7CisKK30gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkNzczOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvQ29uZmlnIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRW5naW5lQ29uZmlnLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCituYW1lc3BhY2UgZW5naW5lQ29uZmlnIHsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpnVmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgQz4KK3N0cnVjdCBCYXNlU2VyaWFsaXplclRyYWl0cyB7CisgICAgdHlwZWRlZiBFIEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKK307CisKK3N0cnVjdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8QXR0cmlidXRlc0dyb3VwLCBBdHRyaWJ1dGVzR3JvdXBzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiQXR0cmlidXRlc0dyb3VwIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiQXR0cmlidXRlc0dyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW1UeXBlID0gInN0cmVhbVR5cGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZvbHVtZUdyb3VwID0gInZvbHVtZUdyb3VwIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9OworCitzdHJ1Y3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFByb2R1Y3RTdHJhdGVneSwgUHJvZHVjdFN0cmF0ZWdpZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJQcm9kdWN0U3RyYXRlZ3kiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJQcm9kdWN0U3RyYXRlZ2llcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9Oworc3RydWN0IFZhbHVlVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZhbHVlUGFpciwgVmFsdWVQYWlycz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZhbHVlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidmFsdWVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsaXRlcmFsID0gImxpdGVyYWwiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm51bWVyaWNhbCA9ICJudW1lcmljYWwiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblR5cGVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Q3JpdGVyaW9uVHlwZSwgQ3JpdGVyaW9uVHlwZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJjcml0ZXJpb25fdHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImNyaXRlcmlvbl90eXBlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxDcml0ZXJpb24sIENyaXRlcmlhPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiY3JpdGVyaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiY3JpdGVyaWEiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZWZhdWx0VmFsID0gImRlZmF1bHQiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWb2x1bWVDdXJ2ZSwgVm9sdW1lQ3VydmVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidm9sdW1lIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGV2aWNlQ2F0ZWdvcnkgPSAiZGV2aWNlQ2F0ZWdvcnkiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbSA9ICJzdHJlYW0iOyAvLyBGb3IgbGVnYWN5IHZvbHVtZSBjdXJ2ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2UgPSAicmVmIjsgLyoqPCBGb3Igdm9sdW1lIGN1cnZlcyBmYWN0b3JpemF0aW9uLiAqLworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZUdyb3VwVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZvbHVtZUdyb3VwLCBWb2x1bWVHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2b2x1bWVHcm91cCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZUdyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsgLy8gRm9yIGxlZ2FjeSB2b2x1bWUgY3VydmVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqaW5kZXhNaW4gPSAiaW5kZXhNaW4iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmluZGV4TWF4ID0gImluZGV4TWF4IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKKwordXNpbmcgeG1sQ2hhclVuaXF1ZSA9IHN0ZDo6dW5pcXVlX3B0cjx4bWxDaGFyLCBkZWNsdHlwZSh4bWxGcmVlKT47CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICB4bWxDaGFyVW5pcXVlIGNoYXJQdHIoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhciAqPihhdHRyaWJ1dGUpKSwgeG1sRnJlZSk7CisgICAgaWYgKGNoYXJQdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNoYXJQdHIuZ2V0KCkpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnKQoreworICAgIGZvciAocm9vdCA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgcm9vdCAhPSBOVUxMOyByb290ID0gcm9vdC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdD4KK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICZuYlNraXBwZWRFbGVtZW50KQoreworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCisgICAgICAgICAgICB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1cjsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJTa2lwcGVkRWxlbWVudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXR0cmlidXRlc0F0dHJpYnV0ZVJlZiA9ICJhdHRyaWJ1dGVzUmVmIjsgLyoqPCBmb3IgZmFjdG9yaXphdGlvbi4gKi8KKworc3RhdGljIHN0YXR1c190IHBhcnNlQXR0cmlidXRlcyhjb25zdCBfeG1sTm9kZSAqY3VyLCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisgICAgICAgICAgICBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGlmIChub3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb250ZW50VHlwZVhtbC5jX3N0cigpLCBjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjb250ZW50IHR5cGUgJXMiLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBjb250ZW50IHR5cGUgJXMiLCAgX19GVU5DVElPTl9fLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VYbWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2U7CisgICAgICAgICAgICBpZiAobm90IFVzYWdlVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyh1c2FnZVhtbC5jX3N0cigpLCB1c2FnZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2FnZSAlcyIsIHVzYWdlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID0gdXNhZ2U7CisgICAgICAgICAgICBBTE9HVigiJXMgdXNhZ2UgJXMiLCAgX19GVU5DVElPTl9fLCB1c2FnZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzIGZsYWdzICVzIiwgIF9fRlVOQ1RJT05fXywgZmxhZ3MuY19zdHIoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmZsYWdzID0gQXVkaW9GbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZUtleSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJrZXkiKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZVZhbHVlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisKKyAgICAgICAgICAgIEFMT0dWKCIlcyBCdW5kbGUgJXMgJXMiLCAgX19GVU5DVElPTl9fLCBidW5kbGVLZXkuY19zdHIoKSwgYnVuZGxlVmFsdWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MoYnVuZGxlS2V5ICsgIj0iICsgYnVuZGxlVmFsdWUpOworICAgICAgICAgICAgc3RkOjpzdHJuY3B5KGF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIHsKKyAgICAvLyBSZXRyaWV2ZSBjb250ZW50IHR5cGUsIHVzYWdlLCBmbGFncywgYW5kIGJ1bmRsZSBmcm9tIHhtbAorICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmF0dHJOb2RlID0gY3VyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXR0clJlZiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgaWYgKCFhdHRyUmVmLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgYXR0ck5vZGUsIGF0dHJSZWYsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgICAgIGlmIChhdHRyTm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYXR0clJlZi5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplQXR0cmlidXRlcyhkb2MsIGF0dHJOb2RlLT54bWxDaGlsZHJlbk5vZGUsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQXR0cmlidXRlcyhhdHRyTm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJDb250ZW50VHlwZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkZsYWdzIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUF0dHJpYnV0ZXMoY3VyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdHRyaWJ1dGVzQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjdG9yICZjb2xsZWN0aW9uKQoreworICAgIHN0YXR1c190IHJldCA9IEJBRF9WQUxVRTsKKyAgICAvLyBFaXRoZXIgd2UgZG8gcHJvdmlkZSBvbmx5IG9uZSBhdHRyaWJ1dGVzIG9yIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoZG9jLCBjdXIsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIGlmIHRoZSAiQXR0cmlidXRlcyIgYmFsaXNlIGlzIG9taXR0ZWQsIG9ubHkgb25lIEF0dHJpYnV0ZXMgaXMgYWxsb3dlZAorICAgICAgICAgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZhdHRyaWJ1dGVzR3JvdXApCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiQXR0cmlidXRlc0dyb3VwVHJhaXRzIE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB2b2x1bWVHcm91cCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dm9sdW1lR3JvdXApOworICAgIGlmICh2b2x1bWVHcm91cC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp2b2x1bWVHcm91cCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dm9sdW1lR3JvdXAsIHZvbHVtZUdyb3VwLmNfc3RyKCkpOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbVR5cGVYbWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICBpZiAobm90IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZVhtbC5jX3N0cigpLCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXMiLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCBjaGlsZCwgYXR0cmlidXRlc1ZlY3QpOworCisgICAgYXR0cmlidXRlc0dyb3VwLnB1c2hfYmFjayh7bmFtZSwgc3RyZWFtVHlwZSwgdm9sdW1lR3JvdXAsIGF0dHJpYnV0ZXNWZWN0fSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWYWx1ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBDb2xsZWN0aW9uICZ2YWx1ZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgaWYgKGxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHVpbnQzMl90IG51bWVyaWNhbCA9IDA7CisgICAgc3RkOjpzdHJpbmcgbnVtZXJpY2FsVGFnID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpudW1lcmljYWwpOworICAgIGlmIChudW1lcmljYWxUYWcuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghY29udmVydFRvKG51bWVyaWNhbFRhZywgbnVtZXJpY2FsKSkgeworICAgICAgICBBTE9HRSgiJXM6IDogSW52YWxpZCB2YWx1ZSglcykiLCBfX0ZVTkNUSU9OX18sIG51bWVyaWNhbFRhZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdmFsdWVzLnB1c2hfYmFjayh7bnVtZXJpY2FsLCBsaXRlcmFsfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDcml0ZXJpb25UeXBlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlvblR5cGVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBib29sIGlzSW5jbHVzaXZlKHR5cGUgPT0gImluY2x1c2l2ZSIpOworCisgICAgVmFsdWVQYWlycyBwYWlyczsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWYWx1ZVRyYWl0cz4oZG9jLCBjaGlsZCwgcGFpcnMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBjcml0ZXJpb25UeXBlcy5wdXNoX2JhY2soe25hbWUsIGlzSW5jbHVzaXZlLCBwYWlyc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ3JpdGVyaW9uVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlhKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWwpOworICAgIGlmIChkZWZhdWx0VmFsdWUuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3QgbWFuZGF0b3J5IHRvIHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGNyaXRlcmlvbiwgZXZlbiBpdCBpcyByZWNvbW1hbmRlZC4uLgorICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCAoYnV0IHJlY29tbWFuZGVkKSIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCwgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKworICAgIGNyaXRlcmlhLnB1c2hfYmFjayh7bmFtZSwgdHlwZU5hbWUsIGRlZmF1bHRWYWx1ZX0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmc3RyYXRlZ2llcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJQcm9kdWN0U3RyYXRlZ3lUcmFpdHMgTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBBdHRyaWJ1dGVzR3JvdXBzIGF0dHJHcm91cHM7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF0dHJpYnV0ZXNHcm91cFRyYWl0cz4oZG9jLCBjaGlsZCwgYXR0ckdyb3Vwcywgc2tpcHBlZCk7CisKKyAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayh7bmFtZSwgYXR0ckdyb3Vwc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZ2b2x1bWVzKQoreworICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICBpZiAoZGV2aWNlQ2F0ZWdvcnkuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKKyAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKKyAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgcmVmLCByZWZlcmVuY2VOYW1lLCBjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZXRyaWV2ZSBjdXJ2ZSBwb2ludCBmcm9tIHJlZmVyZW5jZSBlbGVtZW50IGlmIGZvdW5kIG9yIGRpcmVjdGx5IGZyb20gY3VycmVudCBjdXJ2ZQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvaW50OworICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQ+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19mdW5jX18sIHZvbHVtZVBvaW50VGFnLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2hfYmFjayh7cG9pbnRbMF0sIHBvaW50WzFdfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9sdW1lcy5wdXNoX2JhY2soeyBkZXZpY2VDYXRlZ29yeSwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWb2x1bWVHcm91cFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmdm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBpbmRleE1pbiA9IDA7CisgICAgaW50IGluZGV4TWF4ID0gMDsKKyAgICBTdHJlYW1WZWN0b3Igc3RyZWFtcyA9IHt9OworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3QgPSB7fTsKKworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6bmFtZSkpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgbmFtZVhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChuYW1lWG1sID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWVYbWwuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWluKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1pblhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1pblhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWluTGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1pblhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNaW5MaXRlcmFsLCBpbmRleE1pbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWF4KSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1heFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1heFhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWF4TGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1heFhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNYXhMaXRlcmFsLCBpbmRleE1heCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCByb290LCBhdHRyaWJ1dGVzVmVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoc3RyZWFtKSArICIgIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYXR0cm1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBhdHRyaWJ1dGVzVmVjdCkgeworICAgICAgICBhdHRybU5hbWVzICs9IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIpICsgIlxuIjsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBncm91cD0lcyBpbmRleE1pbj0lZCwgaW5kZXhNYXg9JWQgc3RyZWFtcz0lcyBhdHRyaWJ1dGVzPSVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbmFtZS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgsIHN0cmVhbU5hbWVzLmNfc3RyKCksIGF0dHJtTmFtZXMuY19zdHIoICkpOworCisgICAgVm9sdW1lQ3VydmVzIGdyb3VwVm9sdW1lQ3VydmVzOworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIHJvb3QsIGdyb3VwVm9sdW1lQ3VydmVzLCBza2lwcGVkKTsKKyAgICB2b2x1bWVzLnB1c2hfYmFjayh7IG5hbWUsIGluZGV4TWluLCBpbmRleE1heCwgZ3JvdXBWb2x1bWVDdXJ2ZXMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZVRhZyA9ICJ2b2x1bWUiOworCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiAmbGVnYWN5Vm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJzdHJlYW0iKTsKKyAgICBpZiAoc3RyZWFtVHlwZUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBzdHJlYW0gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJkZXZpY2VDYXRlZ29yeSIpOworICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBkZXZpY2VDYXRlZ29yeSBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJyZWYiKTsKKyAgICBjb25zdCB4bWxOb2RlICpyZWYgPSBOVUxMOworICAgIGlmICghcmVmZXJlbmNlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGdldFJlZmVyZW5jZSh4bWxEb2NHZXRSb290RWxlbWVudChkb2MpLCByZWYsIHJlZmVyZW5jZU5hbWUsIGxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcpOworICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiByZWZlcmVuY2UgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgY3VyLT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBwb2ludFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChwb2ludFhtbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX2Z1bmNfXywgbGVnYWN5Vm9sdW1lVGFnLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludD4+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpLCBwb2ludCwgIiwiKTsKKyAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZywKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoX2JhY2soe3BvaW50WzBdLCBwb2ludFsxXX0pOworICAgICAgICB9CisgICAgfQorICAgIGxlZ2FjeVZvbHVtZXNbc3RyZWFtVHlwZUxpdGVyYWxdLnB1c2hfYmFjayh7IGRldmljZUNhdGVnb3J5TGl0ZXJhbCwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmbmJTa2lwcGVkRWxlbWVudCkKK3sKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiBsZWdhY3lWb2x1bWVNYXA7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWxlZ2FjeVZvbHVtZVRhZykpIHsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lKGRvYywgY2hpbGQsIGxlZ2FjeVZvbHVtZU1hcCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBuYlNraXBwZWRFbGVtZW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmdm9sdW1lTWFwSXRlciA6IGxlZ2FjeVZvbHVtZU1hcCkgeworICAgICAgICAvLyBJbiBvcmRlciB0byBsZXQgQXVkaW9TZXJ2aWNlIHNldHRpbmcgdGhlIG1pbiBhbmQgbWF4IChjb21wYXRpYmlsaXR5KSwgc2V0IE1pbiBhbmQgTWF4CisgICAgICAgIC8vIHRvIC0xIGV4Y2VwdCBmb3IgcHJpdmF0ZSBzdHJlYW1zCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICAgICAgaWYgKCFTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHZvbHVtZU1hcEl0ZXIuZmlyc3QsIHN0cmVhbVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RyZWFtICVzIiwgX19mdW5jX18sIHZvbHVtZU1hcEl0ZXIuZmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGludCBpbmRleE1pbiA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAwIDogLTE7CisgICAgICAgIGludCBpbmRleE1heCA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAxMDAgOiAtMTsKKyAgICAgICAgdm9sdW1lR3JvdXBzLnB1c2hfYmFjayh7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgeG1sRG9jUHRyIGRvYzsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUocGF0aCk7CisgICAgaWYgKGRvYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdWZXJzaW9uQXR0cmlidXRlKTsKKyAgICBpZiAodmVyc2lvbi5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmVyc2lvbiBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBhdXRvIGNvbmZpZyA9IHN0ZDo6bWFrZV91bmlxdWU8Q29uZmlnPigpOworICAgIGNvbmZpZy0+dmVyc2lvbiA9IHN0ZDo6c3RvZih2ZXJzaW9uKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248UHJvZHVjdFN0cmF0ZWd5VHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5wcm9kdWN0U3RyYXRlZ2llcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxDcml0ZXJpb25UcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPmNyaXRlcmlhLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPENyaXRlcmlvblR5cGVUcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPmNyaXRlcmlvblR5cGVzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZUdyb3VwVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT52b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKworICAgIHJldHVybiB7c3RkOjptb3ZlKGNvbmZpZyksIG5iU2tpcHBlZEVsZW1lbnRzfTsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGNvbnN0IGNoYXIqIHBhdGgsIFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7CisgICAgeG1sRG9jUHRyIGRvYzsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUocGF0aCk7CisgICAgaWYgKGRvYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKGRvYywgY3VyLCB2b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9IHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKK3N0YXRpYyBjb25zdCBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQorICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKK3N0YXRpYyBjb25zdCBpbnQgZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoID0gMTI4OworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbVhtbENvbmZpZ0ZpbGVOYW1lID0gImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSA9CisgICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIjsKKworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7CisgICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoXTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGZpbGVOYW1lczsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKKyAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUpOworICAgIH0KKyAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbVhtbENvbmZpZ0ZpbGVOYW1lKTsKKworICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0ID0gcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgdm9sdW1lR3JvdXBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTQyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaAppbmRleCAwNDU5NGY1Li4zOGYzNDAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKQEAgLTE3LDcgKzE3LDEwIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CisjaW5jbHVkZSA8SVZvbHVtZUN1cnZlcy5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPFZvbHVtZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgpAQCAtMjgsNiArMzEsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBEZXZpY2VTdHJhdGVneU1hcCA9IHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgRGV2aWNlVmVjdG9yPjsKK3VzaW5nIFN0cmF0ZWd5VmVjdG9yID0gc3RkOjp2ZWN0b3I8cHJvZHVjdF9zdHJhdGVneV90PjsKK3VzaW5nIFZvbHVtZUdyb3VwVmVjdG9yID0gc3RkOjp2ZWN0b3I8dm9sdW1lX2dyb3VwX3Q+OworCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlZGljYXRlZCB0byB0aGUgcG9saWN5IG1hbmFnZXIgdGhhdCBhIFBvbGljeSBFbmdpbmUgc2hhbGwgaW1wbGVtZW50LgogICovCkBAIC01MCw0MiArNTcsNiBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpID0gMDsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBhIGdpdmVuIGlucHV0IHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0bwotICAgICAqCi0gICAgICogQHJldHVybiBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UsIG1heSBiZSBub25lIGlmIGVycm9yLgotICAgICAqLwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG91dHB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0byBhIGdpdmVuIHN0cmF0ZWd5LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW0gdHlwZSBmb3Igd2hpY2ggdGhlIHNlbGVjdGVkIG91cHV0IGRldmljZSBpcyByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIG91cHV0IGRldmljZSBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieSBpcyByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiB1c2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkgPSAwOwotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSBUZWxlcGhvbnkgTW9kZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gbW9kZTogQW5kcm9pZCBQaG9uZSBzdGF0ZSAobm9ybWFsLCByaW5ndG9uZSwgY3N2LCBpbiBjb21tdW5pY2F0aW9uKQpAQCAtMTMzLDYgKzEwNCwyMDAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgPSAwOwogCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdWRpbyBhdHRyaWJ1dGVzIHRvIGdldCB0aGUgc2VsZWN0ZWQgQHByb2R1Y3Rfc3RyYXRlZ3lfdCBmb2xsb3dlZCBieS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQHByb2R1Y3Rfc3RyYXRlZ3lfdCB0byBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMgcmV0cmlldmVzIHRoZSBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIGdpdmVuCisgICAgICogYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBvZiB0aGUgb3V0cHV0IHJlcXVlc3RpbmcgRGV2aWNlKHMpIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBwcmVmZXJlZERldmljZSB2YWxpZCByZWZlcmVuY2UgaWYgYSBwcmVmZXJlZCBkZXZpY2UgaXMgcmVxdWVzdGVkLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gZnJvbUNhY2hlIGlmIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHNlbGVjdGVkIGRldmljZSBkZXNjcmlwdG9ycy4KKyAgICAgKiAgICAgICAgIEFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcyBhY2NvcmRpbmcKKyAgICAgKiAgICAgICAgIHRvIGN1cnJlbnQgcGhvbmUgc3RhdGUsIGZvcmNlZCBzdGF0ZXMsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICogICAgICAgICBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLAorICAgICAqICAgICAgICAgYTJkcCBvdXRwdXQuLi4pCisgICAgICogVGhpcyBhbGxvd3MgdG86CisgICAgICogICAgICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgKiAgICAgIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAqICAgICAgImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAorICAgICAqICAgICAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAorICAgICAqICAgICAgYmVmb3JlIG1hbmFnZXIgdXBkYXRlcyBpdHMgb3V0cHV0cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSBMZWdhY3kgZnVuY3Rpb24gcmV0cmlldmluZyBkZXZpY2VzIGZyb20gYSBzdHJlYW0gdHlwZS4KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHR5cGUgb2YgdGhlIG91dHB1dCByZXF1ZXN0aW5nIERldmljZShzKSBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZnJvbUNhY2hlIGlmIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIEByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gY3VycmVudCBwaG9uZSBzdGF0ZSwgZm9yY2VkIHN0YXRlcywgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgKiAgICAgICAgIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsCisgICAgICogICAgICAgICBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBUaGlzIGFsbG93cyB0bzoKKyAgICAgKiAgICAgIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAqICAgICAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICogICAgICAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICogICAgICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICogICAgICBiZWZvcmUgbWFuYWdlciB1cGRhdGVzIGl0cyBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyCisgICAgICogQHBhcmFtW291dF0gbWl4IHRvIGJlIHVzZWQgaWYgYSBtaXggaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGlucHV0IGRldmljZSBmb3IgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMsIG1heSBiZSBudWxsIGlmIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBBdWRpb01peCAqKm1peCA9IG51bGxwdHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGVnYWN5IHN0cmVhbSB0eXBlIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBhc3NvY2lhdGVkIGF1ZGlvX3N0cmVhbV90eXBlX3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGF1ZGlvX3N0cmVhbV90eXBlX3QgYXNzb2NpYXRlZCB0byB0aGUgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtIGdldCB0aGUgYXVkaW8gYXR0cmlidXRlcyBmcm9tIGxlZ2FjeSBzdHJlYW0gdHlwZQorICAgICAqIEF0dHJpYnV0ZXMgcmV0dXJuZWQgbWlnaHQgb25seSBiZSB1c2VkIHRvIGNoZWNrIHVwb24gcm91dGluZyBkZWNpc2lvbiwgbm90IHZvbHVtZSBkZWNpc2lvbnMuCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gYXVkaW8gYXR0cmlidXRlcyBtYXRjaGluZyB0aGUgbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgbGVnYWN5IHN0cmVhbSB0eXBlIGZvbGxvd2luZworICAgICAqIHRoZSBnaXZlbiBwcm9kdWN0IHN0cmF0ZWd5CisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIGFzc29jaWF0ZWQgbGVnYWN5IFN0cmVhbSBUeXBlcyB2ZWN0b3Igb2YgdGhlIGdpdmVuIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBwcm9kdWN0IHN0cmF0ZWd5LiBBbnkgYXR0cmlidXRlcyB0aGF0ICJtYXRjaGVzIiB3aXRoIHRoaXMgb25lIHdpbGwgZm9sbG93IHRoZSBwcm9kdWN0CisgICAgICogc3RyYXRlZ3kuCisgICAgICogIm1hdGNoaW5nIiBtZWFucyB0aGUgdXNhZ2Ugc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCB1c2FnZSwgQU5ECisgICAgICogY29udGVudCB0eXBlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgY29udGVudCB0eXBlIEFORAorICAgICAqIGZsYWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIGZsYWdzIEFORAorICAgICAqIHRhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgdGFncy4KKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHByb2R1Y3Qgc3RyYXRlZ3kgaWRzLCBlbXB0eSBpZiB1bmtub3duIHN0cmF0ZWd5LgorICAgICAqLworICAgIHZpcnR1YWwgQXR0cmlidXRlc1ZlY3RvciBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE9yZGVyZWRBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzCisgICAgICogQHJldHVybiBwcmlvcml0eSBvcmRlcmVkIHByb2R1Y3Qgc3RyYXRlZ2llcyB0byBoZWxwIHRoZSBBdWRpb1BvbGljeU1hbmFnZXIgZXZhbHVhdGluZyB0aGUKKyAgICAgKiBkZXZpY2Ugc2VsZWN0aW9uIHBlciBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0aXplZCBzdHJhdGVnaWVzLgorICAgICAqLworICAgIHZpcnR1YWwgU3RyYXRlZ3lWZWN0b3IgZ2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlLiBEZXZpY2Ugc2VsZWN0aW9uIGZvciBBdWRpb0F0dHJpYnV0ZSAvIFN0cmVhbXMgaXMgY2FjaGVkCisgICAgICogaW4gdGhlIGVuZ2luZSBpbiBvcmRlciB0byBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIGF1ZGlvIHN5c3RlbSBpcyBzdGFibGUuCisgICAgICogV2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSBhbmRyb2lkIG1vZGUgaXMgY2hhbmdlZCwgZW5naW5lIGlzIG5vdGlmaWVkIGFuZCBjYW4gdXBkYXRlCisgICAgICogdGhlIGNhY2hlLgorICAgICAqIFdoZW4gc3RhcnRpbmcgLyBzdG9wcGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uLCB0aGUgZW5naW5lCisgICAgICogbmVlZHMgdG8gdXBkYXRlIHRoZSBjYWNoZSB1cG9uIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMuIEludHJvc3BlY3Rpb24gQVBJIHRvIHJldHJpZXZlIGEgY29sbGVjdGlvbiBvZgorICAgICAqIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHRoYXQgYWxsb3dzIHRvIGJ1aWxkIEF1ZGlvQXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gYQorICAgICAqIHByb2R1Y3Rfc3RyYXRlZ3kgd2hpY2ggaXMganVzdCBhbiBpbmRleC4gSXQgaGFzIGFsc28gYSBodW1hbiByZWFkYWJsZSBuYW1lIHRvIGhlbHAgdGhlCisgICAgICogQ2FyL09lbS9BdWRpb01hbmFnZXIgaWRlbnRpeWluZyB0aGUgdXNlIGNhc2UuCisgICAgICogQHBhcmFtIHN0cmF0ZWdpZXMgY29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBsaXN0IGhhcyBiZWVuIHJldHJpZXZlZCwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgcmVxdWVzdGVkIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gSVZvbHVtZUN1cnZlcyBpbnRlcmZhY2UgcG9pbnRlciBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZSByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUgc3RyZWFtCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUN1cnZlc0ZvclZvbHVtZUdyb3VwIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHZvbHVtZSBncm91cAorICAgICAqIEBwYXJhbSBncm91cCB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3QgZ3JvdXApIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVHcm91cHMgcmV0cmlldmVzIHRoZSBjb2xsZWN0aW9uIG9mIHZvbHVtZSBncm91cHMuCisgICAgICogQHJldHVybiB2ZWN0b3Igb2Ygdm9sdW1lIGdyb3VwcworICAgICAqLworICAgIHZpcnR1YWwgVm9sdW1lR3JvdXBWZWN0b3IgZ2V0Vm9sdW1lR3JvdXBzKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgorICAgICAqIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdm9sdW1lIGdyb3VwIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMsIGRlZmF1bHQgZ3JvdXAgaWYgbm9uZQorICAgICAqIGFwcGxpY2FibGUsIFZPTFVNRV9HUk9VUF9OT05FIGlmIG5vIGRlZmF1bHQgZ3JvdXAgZGVmaW5lZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgdm9sdW1lIGdyb3VwIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZW4KKyAgICAgKiBsZWdhY3kgc3RyZWFtIHR5cGUKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHR5cGUgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdm9sdW1lIGdyb3VwIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBkZWZhdWx0IGdyb3VwIGlmIG5vbmUgYXBwbGljYWJsZSwKKyAgICAgKiBWT0xVTUVfR1JPVVBfTk9ORSBpZiBubyBkZWZhdWx0IGdyb3VwIGRlZmluZWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlc0ZvclZvbHVtZUdyb3VwKHZvbHVtZV9ncm91cF90IHZvbHVtZUdyb3VwKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QWxsQXR0cmlidXRlc0ZvclZvbHVtZUdyb3VwKHZvbHVtZV9ncm91cF90IHZvbHVtZUdyb3VwKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzIGludHJvc3BlY3Rpb24gQVBJIHRvIGdldCB0aGUgQXVkaW8gVm9sdW1lIEdyb3VwcywgYWthCisgICAgICogZm9ybWVyIHN0cmVhbSBhbGlhc2VzIGluIEF1ZGlvIFNlcnZpY2UsIGRlZmluaW5nIHZvbHVtZSBjdXJ2ZXMgYXR0YWNoZWQgdG8gb25lIG9yIG1vcmUKKyAgICAgKiBBdWRpbyBBdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBncm91cHMKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSB2b2x1bWUgZ3JvdXBzIHdlcmUgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKaW5kZXggYjc5MDJjZi4uNDNiYTYyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApAQCAtMTYsNyArMTYsNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmg+CiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgpAQCAtNTEsOCArNTAsNiBAQAogCiAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJmdldFZvbHVtZUN1cnZlcygpID0gMDsKLQogICAgIHZpcnR1YWwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKaW5kZXggYzIxMDVlOS4uNGVmZjZlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKQEAgLTExLDE0ICsxMSwxNSBAQAogICAgIHNyYy9FbmdpbmUuY3BwIFwKICAgICBzcmMvRW5naW5lSW5zdGFuY2UuY3BwIFwKICAgICBzcmMvU3RyZWFtLmNwcCBcCi0gICAgc3JjL1N0cmF0ZWd5LmNwcCBcCi0gICAgc3JjL1VzYWdlLmNwcCBcCiAgICAgc3JjL0lucHV0U291cmNlLmNwcCBcCisgICAgLi4vZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAgXAorICAgIC4uL2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAgXAorICAgIC4uL2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCiAKIGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uIDo9IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZQorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZQogCiBMT0NBTF9DRkxBR1MgKz0gXAogICAgIC1XYWxsIFwKQEAgLTMyLDggKzMzLDEyIEBACiAgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAogICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTQ1LDEzICs1MCwxNCBAQAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZyBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgXAogICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYnBhcmFtZXRlciBcCiAgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeSBcCiAgICAgbGlieG1sMgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDE5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyNiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworUFJPVklTSU9OX0NSSVRFUklPTl9UWVBFUyA6PSAkKFRPT0xTKS9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIFRPUCBGSUxFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fcGhvbmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRV9TVEVNKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llc19waG9uZS54bWwgIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzX3Bob25lLnhtbAorTE9DQUxfTU9EVUxFX1NURU0gOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKKworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFVVE9NT1RJVkUgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fYXV0b21vdGl2ZS54bWwKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGF1dG9tb3RpdmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXNfYXV0b21vdGl2ZS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzX2F1dG9tb3RpdmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBhdXRvbW90aXZlLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBhdXRvbW90aXZlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisKK0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSA6PSBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oCitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKK0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoTE9DQUxfUEFUSCkvY29tbW9uLyQoTE9DQUxfTU9EVUxFKS5pbgorCitpbmNsdWRlICQoUFJPVklTSU9OX0NSSVRFUklPTl9UWVBFUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMTQwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIi8+CisKKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODdkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKyAgICA8IS0tIE9FTSBVc2FnZXMgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yCisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX09FTV9UWVBFLCAwKTsKKyAgICB9CisgICAgaWYoCisgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICggYWEubVVzYWdlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgKSAmJgorICAgICggdHlwZSA9PSAxICkgKQorICAgIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDwhLS0gIHRyYWZmaWNfYW5ub3VjZW1lbnQgPSAxIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjEiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzIiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIENhciBVc2FnZXMgLS0+CisgICAgPCEtLSBLZWVwIHRob3NlIGxpbmVzIG9ubHkgZm9yIGNhciAtLT4KKyAgICA8IS0tIENoZWNrIGNhciBjb25kaXRpb25zIGlmIGFueSBPRU0gY29uZGl0aW9ucyBtYXRjaGVkIC0tPgorICAgIDwhLS0gQXMgZGVmaW5lZCBieSBDYXJBdWRpb0F0dHJpYnV0ZXNVdGlsLmphdmEgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgcmFkaW8gaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgICAgIGludCB0eXBlID0gQ0FSX0FVRElPX1RZUEVfREVGQVVMVDsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9DQVJfQVVESU9fVFlQRSwgQ0FSX0FVRElPX1RZUEVfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoCisgICAgICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgICAgICggdHlwZSA9PSBDQVJfQVVESU9fVFlQRV9SQURJTyApICkKKyAgICAgICAgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyYWRpbyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im1lZGlhX2Nhcl9hdWRpb190eXBlXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJleHRfYXVkaW9fc291cmNlIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfNyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iNyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NvbW1hbmQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9WT0lDRV9DT01NQU5EID0gMSAtLT4KKyAgICAgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIxIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJzYWZldHlfYWxlcnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfU0FGRVRZX0FMRVJUID0gMiAtLT4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFRvIGJlIGNoZWNrZWQKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0JPVFRPTQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQ0FSX1BST1hZCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9NRURJQV9NVVRFCisgICAgLS0+CisKKyAgICA8IS0tIEdlbmVyaWMgVXNhZ2VzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibXVzaWMiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im1lZGlhIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJuYXZfZ3VpZGFuY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJwaG9uZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iYWxhcm0iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJpbmciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJub3RpZmljYXRpb24iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InN5c3RlbSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0idHRzIj4KKyAgICAgICAgPCEtLSBUVFMgc3RyZWFtIE1VU1QgQkUgTUFOQUdFRCBPVVRTSURFIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpZiBOTyBERURJQ0FURUQgT1VUUFVUCisgICAgICAgICAgICAgZm9yIFRUUywgb3RoZXJ3aXNlIHdoZW4gYmVhY29uIGhhcHBlbnMsIGRlZmF1bHQgc3RyYXRlZ3kgaXMgLi4uIG11dGVkLgorICAgICAgICAgICAgIElmIGl0IGlzIG1lZGlhLCBpdCBpcyBhbm5veWluZy4uLiAtLT4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIiB2b2x1bWVHcm91cD0idHRzIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+Cis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI2YjUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDE5MiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8IS0tIFZvbHVtZSBHcm91cHMgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIE5vdGU6CisgICAgICAgIEl0IGlzIFZBTElEIHRvIGhhdmUgYSBncm91cCB3aXRob3V0IGF0dHJpYnV0ZXMgaWYgYSBwcm9kdWN0IHN0cmF0ZWd5IGlzIGZvbGxvd2luZworICAgICAgICB0aGlzIGdyb3VwIGZvciBhbGwgYXR0cmlidXRlcy4KKyAgICAgICAgT3RoZXJ3aXNlLCBhdHRyaWJ1dGVzIG11c3QgYmUgc3BlY2lmaWVkCistLT4KKworPHZvbHVtZUdyb3Vwcz4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV90cmFmZmljX2Fub3VuY2VtZW50PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPCEtLSBPRU0gQURBUyBpcyBhIHZvbHVtZSBncm91cCB0aGF0IGhhcyBhIHNpbmdsZSBwb3J0IGdhaW4gKHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgaXQgaXMgYSBncm91cAorICAgICBidXQgbWF5IGhvc3QgZGlmZmVyZW50IHN0cmVhbXMuCisgICAgIEEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBhbW9uZyB0aGVtIChlaXRoZXIgdGhleSBhcmUgbXVsdHVhbHkgZXhjbHVpc3ZlLCBzbyB0aGUgdm9sdW1lCisgICAgIHdpbGwgYmUgdGhlIG9uZSBvZiB0aGUgY3VycmVudGx5IGFjaXR2ZSBzdHJlYW0sIG90aGVyd2lzZSBhIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYnkKKyAgICAgYW55IG1lYW4uIC0tPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX2FkYXNfMjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fYWRhc18zPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCis8IS0tIE1FRElBIGlzIGEgdm9sdW1lIGdyb3VwIHRoYXQgaGFzIGEgc2luZ2xlIHBvcnQgZ2FpbiAodGhpcyBpcyB0aGUgcmVhc29uIHdoeSBpdCBpcyBhIGdyb3VwCisgICAgIGJ1dCBtYXkgaG9zdCBkaWZmZXJlbnQgc3RyZWFtcy4KKyAgICAgQSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGFtb25nIHRoZW0gKGVpdGhlciB0aGV5IGFyZSBtdWx0dWFseSBleGNsdXNpdmUsIHNvIHRoZSB2b2x1bWUKKyAgICAgd2lsbCBiZSB0aGUgb25lIG9mIHRoZSBhY3RpdmUgc3RyZWFtIHdpdGggaGlnaGVzdCBwcmlvcml0eSAoT1JERVIgTUFUVEVSUykgdW5sZXNzIHRoZSBjdXJ2ZXMKKyAgICAgZm9sbG93ZWQgd2lsbCB0aGUgdGhlIGN1cnZlcyBmb3IgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzLi0tPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWFfY2FyX2F1ZGlvX3R5cGVfMzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYV9jYXJfYXVkaW9fdHlwZV83PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWE8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnNwZWVjaDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnN5c3RlbTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnBob25lPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgyYjJlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNyaXRlcmlhPgorICAgIDxjcml0ZXJpb24gbmFtZT0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiB0eXBlPSJJbnB1dERldmljZXNNYXNrVHlwZSIgZGVmYXVsdD0ibm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgdHlwZT0iT3V0cHV0RGV2aWNlc01hc2tUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIiB0eXBlPSJPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgZGVmYXVsdD0ibm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iQXZhaWxhYmxlSW5wdXREZXZpY2VzQWRkcmVzc2VzIiB0eXBlPSJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJUZWxlcGhvbnlNb2RlIiB0eXBlPSJBbmRyb2lkTW9kZVR5cGUiIGRlZmF1bHQ9Ik5vcm1hbCIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiB0eXBlPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yTWVkaWEiIHR5cGU9IkZvcmNlVXNlRm9yTWVkaWFUeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yUmVjb3JkIiB0eXBlPSJGb3JjZVVzZUZvclJlY29yZFR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JEb2NrIiB0eXBlPSJGb3JjZVVzZUZvckRvY2tUeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yU3lzdGVtIiB0eXBlPSJGb3JjZVVzZUZvclN5c3RlbVR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iIHR5cGU9IkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCIgdHlwZT0iRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmRUeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmciIHR5cGU9IkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmdUeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKzwvY3JpdGVyaWE+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTczNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbC5pbgpAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNyaXRlcmlvbl90eXBlcz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iT3V0cHV0RGV2aWNlc01hc2tUeXBlIiB0eXBlPSJpbmNsdXNpdmUiLz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iSW5wdXREZXZpY2VzTWFza1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgdHlwZT0iaW5jbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDwhLS0gbGVnYWN5IHJlbW90ZSBzdWJtaXggLS0+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iMCIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJBbmRyb2lkTW9kZVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJCb29sZWFuVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGYWxzZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iVHJ1ZSIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVNwZWFrZXIiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRTY28iIG51bWVyaWNhbD0iMyIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvck1lZGlhVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3BlYWtlciIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VIZWFkcGhvbmVzIiBudW1lcmljYWw9IjIiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0QTJkcCIgbnVtZXJpY2FsPSI0Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VBbmFsb2dEb2NrIiBudW1lcmljYWw9IjgiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZURpZ2l0YWxEb2NrIiBudW1lcmljYWw9IjkiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vQnRBMmRwIiBudW1lcmljYWw9IjEwIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRTY28iIG51bWVyaWNhbD0iMyIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlV2lyZWRBY2Nlc3NvcnkiIG51bWVyaWNhbD0iNSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckRvY2tUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdENhckRvY2siIG51bWVyaWNhbD0iNiIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnREZXNrRG9jayIgbnVtZXJpY2FsPSI3Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VBbmFsb2dEb2NrIiBudW1lcmljYWw9IjgiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZURpZ2l0YWxEb2NrIiBudW1lcmljYWw9IjkiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW1UeXBlIiB0eXBlPSJleGNsdXNpdmUiID4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3lzdGVtRW5mb3JjZWQiIG51bWVyaWNhbD0iMTEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiIG51bWVyaWNhbD0iMTIiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmRUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciIgbnVtZXJpY2FsPSIxMyIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzIiBudW1lcmljYWw9IjE0Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmdUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+Cis8L2NyaXRlcmlvbl90eXBlcz4KKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTMzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPGNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKworPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTZkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRGVmYXVsdCBWb2x1bWUgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIEZ1bGwgRGVmYXVsdCBWb2x1bWUgdGFibGUgZm9yIGFsbCBkZXZpY2UgY2F0ZWdvcnkgLS0+Cis8dm9sdW1lcz4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJTSUxFTlRfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgPHBvaW50PjAsLTk2MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC05NjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IFN5c3RlbSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTIwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IE1lZGlhIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBNZWRpYSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ2ODA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NDIsLTIwNzA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+ODUsLTU0MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gTm9uLW11dGFibGUgZGVmYXVsdCB2b2x1bWUgY3VydmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGZpcnN0IHBvaW50IGlzIGFsd2F5cyBmb3IgaW5kZXggMCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBhdHRlbnVhdGlvbiBpcyBzbWFsbCBlbm91Z2ggdGhhdCBzdHJlYW0gY2FuIHN0aWxsIGJlIGhlYXJkIC0tPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgICAgIGJhc2VkIG9uIERFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgZm9yIGhlYWRzZXQgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIFNwZWFrZXIgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKzwvdm9sdW1lcz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTg3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorCisgICAgPCEtLSAiaGlkZGVuIHN0cmF0ZWdpZXMiIGxpa2UgVFRTLCBlbmZvcmNlZCBhdWRpYmxlOgorICAgICAgICAgICAgU2hhbGwgd2UgZXhwb3NlIHRoZW0gaGVyZSBvciBrZWVwIGl0IGhhcmQgY29kZWQgLS0+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGZvciBlbmZvcmNlZCBzeXN0ZW0gc291bmRzIGluIGNlcnRhaW4KKyAgICAgICAgIGNvdW50cmllcyAoZS5nLiBjYW1lcmEgaW4gSmFwYW4pCisgICAgICAgICBUaGlzIHN0cmF0ZWd5IHdpbGwgb25seSBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHBob25lIGlmIGZvcmNlIGZvciBzeXN0ZW0gaXMgc2V0IHRvCisgICAgICAgICBlbmZvcmNlZC4gLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BIT05FIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InZvaWNlX2NhbGwiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiB2b2x1bWVHcm91cD0iYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0iYWxhcm0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIHZvbHVtZUdyb3VwPSJlbmZvcmNlZF9hdWRpYmxlIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgdm9sdW1lR3JvdXA9ImFjY2Vzc2liaWxpdHkiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0RUTUYiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9EVE1GIiB2b2x1bWVHcm91cD0iZHRtZiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkciLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZXhjbHVzaXZlbHkgdHJhbnNtaXR0ZWQgdGhyb3VnaCB0aGUgIHNwZWFrZXIKKyAgICAgICAgIChUVFMpIG9mIHRoZSBkZXZpY2UgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSByZXJvdXRpbmcgbWF5IGJlIHJlbW92ZWQgYXMgZm9sbG93aW5nIG1lZGlhPz8/IC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUkVST1VUSU5HIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiB2b2x1bWVHcm91cD0icmVyb3V0aW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIERlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBoYXMgZW1wdHkgYXR0cmlidXRlcyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BBVENIIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUEFUQ0giIHZvbHVtZUdyb3VwPSJwYXRjaCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisKKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdhMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMjMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBWb2x1bWUgc2VjdGlvbiBkZWZpbmVzIGEgdm9sdW1lIGN1cnZlIGZvciBhIGdpdmVuIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkuCitJdCBjb250YWlucyBhIGxpc3Qgb2YgcG9pbnRzIG9mIHRoaXMgY3VydmUgZXhwcmVzc2luZyB0aGUgYXR0ZW51YXRpb24gaW4gTWlsbGliZWxzIGZvciBhIGdpdmVuCit2b2x1bWUgaW5kZXggZnJvbSAwIHRvIDEwMC4KKzx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk94oCd4oCdPgorPHBvaW50PjAsLTk2MDA8L3BvaW50PgorPHBvaW50PjEwMCwwPC9wb2ludD4KKzwvdm9sdW1lPgorLS0+CisKKzx2b2x1bWVHcm91cHM+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT52b2ljZV9jYWxsPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI3MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtOTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnN5c3RlbTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtNTEwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NTcsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD44NSwtMjMwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tdXNpYzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MjU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWxhcm08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm5vdGlmaWNhdGlvbjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ibHVldG9vdGhfc2NvPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZW5mb3JjZWRfYXVkaWJsZTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjAwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5kdG1mPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtNDAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTQwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5hY2Nlc3NpYmlsaXR5PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmVyb3V0aW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cGF0Y2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaAppbmRleCBhNTk3ZTg3Li5lZmM2OWRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC0xOSwxMCArMTksOCBAQAogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlOwogY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogY2xhc3MgRW5naW5lOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKaW5kZXggMmUyOWE5Yi4uMWZjMjI2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMTYsMTAgKzE2LDExIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8RW5naW5lRGVmaW5pdGlvbi5oPgogI2luY2x1ZGUgPFZvbHVtZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtMzYsMTkgKzM3LDYgQEAKIHsKIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGUgZW5naW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmF0ZWd5IHRvIGFkZAotICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgotICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IGlkKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBBZGQgYSBzdHJlYW1zIHRvIHRoZSBlbmdpbmUuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmVhbSB0byBhZGQKQEAgLTYyLDE5ICs1MCw2IEBACiAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3QgaWQpID0gMDsKIAogICAgIC8qKgotICAgICAqIEFkZCBhIHVzYWdlIHRvIHRoZSBlbmdpbmUKLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgdXNhZ2UgdG8gYWRkCi0gICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCi0gICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdXNhZ2UgaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqLwotICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgaWQpID0gMDsKLQotICAgIC8qKgogICAgICAqIEFkZCBhbiBpbnB1dCBzb3VyY2UgdG8gdGhlIGVuZ2luZQogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgdG8gYWRkCkBAIC04OCwyNiArNjMsNiBAQAogICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IGlkKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRldmljZSB0byBiZSB1c2VkIGJ5IGEgc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5OiBuYW1lIG9mIHRoZSBzdHJhdGVneSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW06IG5hbWUgb2YgdGhlIHN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmF0ZWd5IHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJlYW0sIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgc3RyZWFtLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBzdHJlYW06IG5hbWUgb2YgdGhlIHN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0CkBAIC0xMTksMTYgKzc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHVzYWdlOiBuYW1lIG9mIHRoZSB1c2FnZSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiB1c2FnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHVzYWdlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgaW5wdXQgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYW4gaW5wdXQgc291cmNlLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZTogbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CkBAIC0xMzksNiArODQsMjIgQEAKICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBwcm9kdWN0IHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgcHJvZHVjdCBzdHJhdGVneSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsKaW5kZXggYmFhZWZkMi4uMDYwODMwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCkBAIC03LDE1NiArNywxNDYgQEAKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1pZmVxICgxLCAwKQotCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSBuby1pbnB1dF9jb25maWd1cmFibGUpKQorCiBQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCi1CVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5taworI0BUT0RPOiB1cHN0cmVhbSBuZXcgZG9tYWluIGdlbmVyYXRvcgorI0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFBGV19DT1JFKS9zdXBwb3J0L2FuZHJvaWQvYnVpbGRfcGZ3X3NldHRpbmdzLm1rCiBQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCiBQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKIAorVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENPTkZJR1VSQVRJT04gRklMRVMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIFBvbGljeSBQRlcgdG9wIGxldmVsIGZpbGUgIyMjIyMjIyMjCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yawogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKS5pbgogCisjIGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsgcHJldmVudHMgZnJvbSB1c2luZyBkZWJ1ZyBpbnRlcmZhY2UKIEFVRElPX1BBVFRFUk4gPSBAVFVOSU5HX0FMTE9XRURACi1pZmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorI2lmZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCiBBVURJT19WQUxVRSA9IGZhbHNlCi1lbHNlCi1BVURJT19WQUxVRSA9IHRydWUKLWVuZGlmCisjZWxzZQorI0FVRElPX1ZBTFVFID0gdHJ1ZQorI2VuZGlmCiAKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKExPQ0FMX01PRFVMRV9QQVRIKS8kKExPQ0FMX01PRFVMRSkKK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvJChMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCkvJChMT0NBTF9NT0RVTEUpCiAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIAotCi0jIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCi0gICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAotICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAotCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgQ29tbW9uIFN0cnVjdHVyZXMgIyMjIyMjIyMjCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CiBMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogCi0jIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Ci1MT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5Ci1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCi0gICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCi0gICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAotICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotCi1pZmVxICgkKHBmd19yZWJ1aWxkX3NldHRpbmdzKSx0cnVlKQotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0Ci1QRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwotCi1pbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotZWxzZQotIyBVc2UgdGhlIGV4aXN0aW5nIGZpbGUKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTZXR0aW5ncy8kKExPQ0FMX01PRFVMRV9TVEVNKQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZiAjIHBmd19yZWJ1aWxkX3NldHRpbmdzCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIEV4YW1wbGUgU3RydWN0dXJlcyAjIyMjIyMjIyMKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwuY29tbW9uCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCisgICAgbGlicG9saWN5LXN1YnN5c3RlbSBcCisKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCiAKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gT3V0cHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1vdXRwdXQKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9PdXRwdXREZXZpY2UueG1sCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5Ci1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCi0gICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCi0gICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAotICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbC5jb21tb24gXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKIAotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAogUEZXX0VERF9GSUxFUyA6PSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwogCiBpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSkKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gSW5wdXQgIyMjIyMjIyMjCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkKKwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kubm8taW5wdXQKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9JbnB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sLmNvbW1vbiBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAogCi1QRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi1QRldfQ1JJVEVSSUFfRklMRSA6PSAkKExPQ0FMX1BBVEgpL3BvbGljeV9jcml0ZXJpYS50eHQKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCiBQRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3NOb0lucHV0L2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvdm9sdW1lcy5wZncKIAogaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKIAotZW5kaWYgIyBpZmVxICgxLCAwKQorZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksbm8taW5wdXRfY29uZmlndXJhYmxlKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRhNThmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEBOT1RFOgorIyBBdWRpbyBQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYWJsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAorIworIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1BGV19DT1JFIDo9IGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoVE9PTFMpL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5taworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwuY2FyCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQcm9kdWN0U3RyYXRlZ2llcy54bWwuY2FyIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCisgICAgbGlicG9saWN5LXN1YnN5c3RlbQorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwuY2FyCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5LmNhcgorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKKworUEZXX0VERF9GSUxFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFBGV19FRERfRklMRVMpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwuY2FyIFwKKyAgICBQb2xpY3lDbGFzcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKKworUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK2luY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNzE3IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTEKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogT2VtU3RyYXRlZ3kyCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA4X09FTTEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDhfT0VNMQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzA5X09FTTIKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDlfT0VNMgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFZvaWNlQ29tbWFuZAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL2RldmljZV9hZGRyZXNzID0gQlVTMDJfVk9JQ0VfQ09NTUFORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBOYXZHdWlkYW5jZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAxX05BVl9HVUlEQU5DRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBWb2ljZUNhbGwKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9kZXZpY2VfYWRkcmVzcyA9IEJVUzA0X0NBTEwKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfQ0FMTAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IEFsYXJtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA1X0FMQVJNCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA1X0FMQVJNCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDNfQ0FMTF9SSU5HCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX0NBTExfUklORworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA2X05PVElGSUNBVElPTgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNl9OT1RJRklDQVRJT04KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTeXN0ZW0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vZGV2aWNlX2FkZHJlc3MgPSBCVVMwN19TWVNURU1fU09VTkQKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDdfU1lTVEVNX1NPVU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCisgICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIvPgorCisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1NZU1RFTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JJTkciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTVVTSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUxBUk0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIgorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9EVE1GIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9UVFMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUkVST1VUSU5HIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9QQVRDSCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9ERUZBVUxUIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX01JQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9DQU1DT1JERVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5wcm9jZXNzZWQiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0ZNX1RVTkVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9IT1RXT1JEIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgIDwvQ29tcG9uZW50TGlicmFyeT4KKworICAgIDxJbnN0YW5jZURlZmluaXRpb24+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InByb2R1Y3Rfc3RyYXRlZ2llcyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWdpZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JiYTAzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisKKyAgPENvbXBvbmVudFR5cGUgTmFtZT0iUHJvZHVjdFN0cmF0ZWdpZXMiIERlc2NyaXB0aW9uPSIiPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9Im9lbV9zdHJhdGVneV8xIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0ib2VtX3N0cmF0ZWd5XzIiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9InJhZGlvIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0iZXh0X2F1ZGlvX3NvdXJjZSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW1hbmQiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJzYWZldHlfYWxlcnQiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0ibmF2X2d1aWRhbmNlIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgppbmRleCBmNTYxNWNkLi5mODBhMDdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgpAQCAtMSw2ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8UGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5IiBTZXJ2ZXJQb3J0PSI1MDE5IiBUdW5pbmdBbGxvd2VkPSJAVFVOSU5HX0FMTE9XRURAIj4KKyAgICBTeXN0ZW1DbGFzc05hbWU9IlBvbGljeSIgU2VydmVyUG9ydD0iL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIvcG9saWN5X2RlYnVnIgorICAgIFR1bmluZ0FsbG93ZWQ9IkBUVU5JTkdfQUxMT1dFREAiPgogCiAgICAgPFN1YnN5c3RlbVBsdWdpbnM+CiAgICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDk0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9jb25maWd1cmFibGUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMgUG9saWN5IFBGVyBTdHJ1Y3R1cmVzICMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sLnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIFwKKyAgICBQcm9kdWN0U3RyYXRlZ2llcy54bWwucGhvbmUgXAorICAgIFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIFwKKyAgICBsaWJwb2xpY3ktc3Vic3lzdGVtIFwKKworTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUHJvZHVjdFN0cmF0ZWdpZXMueG1sLnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5LnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorCitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoUEZXX0VERF9GSUxFUykKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbC5waG9uZSBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCisKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTkzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKQEAgLTAsMCArMSw1OTYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisKKwlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKKwkJIworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKKwkJIworCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogRGV2aWNlCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAxCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdwpAQCAtMCwwICsxLDYyNSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ2llcworCXN1cERvbWFpbjogRHRtZgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXJXaGVuTm90SW5DYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpAQCAtMCwwICsxLDM2MSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKworCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCSMgbm8gZW5mb3JjZWRfYXVkaWJsZSBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQkjCisJCQkJIyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKwkJCQkjIGV4Y2VwdDoKKwkJCQkjICAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorCQkJCSMgICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JTeXN0ZW0gSXMgRm9yY2VTeXN0ZW1FbmZvcmNlZAorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQU5ZCisJCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNwZWFrZXIgaXMgYWxzbyB0aGUgZmFsbGJhY2sgZGV2aWNlIGlmIGFueSBvZiB0aGUgZGV2aWNlIGZyb20gRGV2aWNlMiBkb21haW4KKwkJCQkJIyBpcyBzZWxlY3RlZC4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JEZXZpY2UKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEhkbWkKKwkJCQkJCUFOWQorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJCQkJRm9yY2VVc2VGb3JEb2NrIElzTm90IEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IE5vRGV2aWNlCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQzNTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpAQCAtMCwwICsxLDM0MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IE1lZGlhCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTNkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3CkBAIC0wLDAgKzEsNDgzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGhvbmUKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCSMKKwkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQorCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbworCQkJCQkJIworCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIG9uIGRlZmF1bHQgb3V0cHV0IGRldmljZSB3aGljaCBjYW4gYmUgc3BlYWtlciBmb3IgZXhhbXBsZQorCQkJCSMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjRjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDQzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUmVyb3V0aW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmVyb3V0aW5nL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CkBAIC0wLDAgKzEsNDkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCQkJCQlidXMgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjbworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CkBAIC0wLDAgKzEsNTM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcnMKKworCQkJY29uZjogU3BlYWtlclNhZmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCisJCQkJIworCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKKwkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNzY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CkBAIC0wLDAgKzEsNDMgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2Y2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV91bmtub3duLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogVW5rbm93bgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy91bmtub3duL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Vua25vd24vZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1Y2UyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQcm9kdWN0U3RyYXRlZ2llcy54bWwiLz4KKworCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUEFUQ0giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfREVGQVVMVCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9NSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfQ0FNQ09SREVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZm1fdHVuZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9GTV9UVU5FUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfSE9UV09SRCIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwcm9kdWN0X3N0cmF0ZWdpZXMiIFR5cGU9IlByb2R1Y3RTdHJhdGVnaWVzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorCisgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iIj4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0icGhvbmUiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKworICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICA8L0NvbXBvbmVudFR5cGU+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKaW5kZXggYjQzZjgzYi4uMDcxMDQ0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKQEAgLTg0NzIsNyArODQ3Miw3IEBACiAgICAgPENvbmZpZ3VyYXRpb25zPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgotICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ1RvbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IlJpbmd0b25lIi8+CiAgICAgICAgIDwvQ29tcG91bmRSdWxlPgogICAgICAgPC9Db25maWd1cmF0aW9uPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUGhvbmUiPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTE5ODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKLQkJIwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKLQkJIwotCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCi0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzYzc0MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRHRtZgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYwotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNDYzMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCSMKLQkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotCQkJCSMgZXhjZXB0OgotCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0JCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCi0JCQkJCUFMTAotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBTlkKLQkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgotCQkJCQkjIGlzIHNlbGVjdGVkLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQotCQkJCQkJQU5ZCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBOb0RldmljZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjZhZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogTWVkaWEKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzcxYWQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogUGhvbmUKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZQotCQkJY29uZjogU2NvQ2Fya2l0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCSMKLQkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQotCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbwotCQkJCQkJIwotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBvbiBkZWZhdWx0IG91dHB1dCBkZXZpY2Ugd2hpY2ggY2FuIGJlIHNwZWFrZXIgZm9yIGV4YW1wbGUKLQkJCQkjCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNjJmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogUmVyb3V0aW5nCi0JCSMKLQkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5Ci0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQwZDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCBidXQgSERNSSBpcyBub3QgcmVhY2hhYmxlCi0JCQkJCSMKLQkJCQkJaGRtaSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IFNwZWFrZXIKLQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIEVORk9SQ0VEX0FVRElCTEUgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjczYzRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFNvbmlmaWNhdGlvblJlc3BlY3RmdWwKLQkJIwotCQkjIFNvbmlmaWNpYXRpb24gUmVzcGVjdGZ1bCBmb2xsb3dzOgotCQkjCS0gSWYgaW4gY2FsbDogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0IGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaW4gY2FsbCBhbHNvLi4uKQotCQkjCS0gSWYgbm90IGluIGNhbGwgQU5EIGEgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZSByZW1vdGVseTogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0Ci0JCSMgICAgIGZvbGxvd3MgZW5mb3JjZWQgYXVkaWJsZSwgd2hpY2ggZm9sbG93cyBtZWRpYSkKLQkJIwktIGlmIG5vdCBpbiBjYWxsIGFuZCBubyBtdXNpYyBzdHJlYW0gYWN0aXZlIHJlbW90ZWx5IGFuZCBtdXNpYyBzdHJlYW0gYWN0aXZlKTogc3RyYXRlZ3kKLQkJIyAgICAgbWVkaWEKLQkJIyAgIC0gT3RoZXJ3aXNlIGZvbGxvd3Mgc29uaWZpY2F0aW9uIGJ5IHJlcGxhY2luZyBzcGVha2VyIHdpdGggc3BlYWtlciBzYWZlIGlmIHNwZWFrZXIgaXMKLQkJIwkgIHNlbGVjdGVkLgotCQkjCi0JCSMgQ2FzZSBvZiBzdHJlYW0gYWN0aXZlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VycwotCi0JCQljb25mOiBTcGVha2VyU2FmZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlclNhZmUKLQkJCQkjCi0JCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCBhbmQgcmVwbGFjZSBzcGVha2VyIGJ5IHNwZWFrZXIgc2FmZQotCQkJCSMgaWYgYW5kIG9ubHkgaWYgc3BlYWtlciBvbmx5IHNlbGVjdGVkCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJCSMKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWMyMTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCi0JCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQwYjlkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotZG9tYWluOiBTdHJhdGVneUZvclN0cmVhbQotCi0JY29uZjogQ2FsaWJyYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkjCi0JCSMgTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotCQkjIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0JCSMKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGVuZm9yY2VkX2F1ZGlibGUKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSB0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5Ci0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSByZXJvdXRpbmcKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKaW5kZXggYjMxMTVlNy4uZmJlYTllMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CkBAIC0yNCw3ICsyNCw3IEBACiAJCQkjIEluIGNhc2Ugb2YgUmluZyBvciBBbGFybSBzdHJlYW0gdHlwZSBhY3RpdmUsIHN3aXRjaGluZyB0byBzb25pZmljYXRpb24KIAkJCSMgQHRvZG86IGhhbmRsZSB0aGlzIGR5bmFtaWMgY2FzZS4gQXMgYSBXQSwgdXNpbmcgUmluZ3RvbmUgbW9kZS4uLgogCQkJIwotCQkJVGVsZXBob255TW9kZSBJcyBSaW5nVG9uZQorCQkJVGVsZXBob255TW9kZSBJcyBSaW5ndG9uZQogCiAJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CmluZGV4IDkxN2Q0YTcuLmY5MjM2MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKQEAgLTksNyArOSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMzcsNyArMzcsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC05Myw3ICs5Myw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjA1LDcgKzIwNSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAppbmRleCA0NjFlNDRhLi41NmM1ZWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApAQCAtMzcsNiArMzcsMTAgQEAKICAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+CiAgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjIzIi8+CiAgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcm94eSIgU2l6ZT0iMSIgUG9zPSIyNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZWFyaW5nX2FpZCIgU2l6ZT0iMSIgUG9zPSIyNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlY2hvX2NhbmNlbGxlciIgU2l6ZT0iMSIgUG9zPSIyOCIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgpAQCAtNjcsNiArNzEsOSBAQAogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayIgU2l6ZT0iMSIgUG9zPSIxOCIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIxOSIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJveHkiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2JsZSIgU2l6ZT0iMSIgUG9zPSIyMyIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgpAQCAtMTI2LDMwICsxMzMsNiBAQAogICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAotICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSBkZWZpbml0aW9uIGFzIGFuIGVudW1lcmF0aW9uLiBOdW1lcmljYWwgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmFsdWUKLSAgICAgICAgIG9mIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGluIHBvbGljeSBoZWFkZXIgZmlsZS4gLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3kiPgotICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtZWRpYSIgTnVtZXJpY2FsPSIwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBob25lIiBOdW1lcmljYWw9IjEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uIiBOdW1lcmljYWw9IjIiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIE51bWVyaWNhbD0iMyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjQiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI1Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgTnVtZXJpY2FsPSI2Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iNyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iOCIvPgotICAgICAgICA8L0VudW1QYXJhbWV0ZXI+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IlN0cmF0ZWd5OiclMSciPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgogCiAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVm9sdW1lUHJvZmlsZVR5cGUiPgpAQCAtMTcwLDI5ICsxNTMsMzAgQEAKICAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiLz4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iICBNYXBwaW5nPSJTdHJlYW0iPgogICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUiIFR5cGU9IlZvbHVtZVByb2ZpbGVUeXBlIgogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJWb2x1bWUgcHJvZmlsZSBmb2xsb3dlZCBieSBhIGdpdmVuIHN0cmVhbSB0eXBlLiIvPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAogICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgogCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2UiPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfc3RyYXRlZ3kiIFR5cGU9IlN0cmF0ZWd5IiBNYXBwaW5nPSJVc2FnZTonJTEnIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQogICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZSI+CiAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UiIFR5cGU9IklucHV0RGV2aWNlc01hc2siCi0gICAgICAgICAgICAgICAgICAgTWFwcGluZz0iSW5wdXRTb3VyY2U6JyUxJyIgRGVzY3JpcHRpb249IlNlbGVjdGVkIElucHV0IGRldmljZSIvPgorICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+CiAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPRFVDVCBTVFJBVEVHWSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVneSIgTWFwcGluZz0iUHJvZHVjdFN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzZWxlY3RlZF9vdXRwdXRfZGV2aWNlcyIgVHlwZT0iT3V0cHV0RGV2aWNlc01hc2siLz4KKyAgICAgICAgPFN0cmluZ1BhcmFtZXRlciBOYW1lPSJkZXZpY2VfYWRkcmVzcyIgTWF4TGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249ImlmIGFueSwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBQUk9EVUNUIFNUUkFURUdZIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKwogPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAppbmRleCBhZDljMzU2Li5hNGU3NTM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApAQCAtMTEsMTIwICsxMSw1NCBAQAogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KIAotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iSWRlbnRpZmllciBtdXN0IG1hdGNoIHRoZSBlbnVtIHZhbHVlIHRvIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgYmV0d2VlbiB0aGUgUG9saWN5TWFuYWdlciBhbmQgUEZXIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBob25lIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOlBob25lLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb24sSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvblJlc3BlY3RmdWwsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlZEF1ZGlibGUsSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlcm91dGluZyxJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQogICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpWb2ljZUNhbGwsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06U3lzdGVtLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSaW5nLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06TXVzaWMsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpBbGFybSxJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpFbmZvcmNlQXVkaWJsZSxJZGVudGlmaWVyOjciCi0gICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06RHRtZixJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpUdHMsSWRlbnRpZmllcjo5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMCIKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSZXJvdXRpbmcsSWRlbnRpZmllcjoxMSIKKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlBhdGNoLElkZW50aWZpZXI6MTIiCisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1BBVENIIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KICAgICAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb191c2FnZV90IGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6VW5rbm93bixJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmciIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uU2lnbmFsbGluZyxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QWxhcm0sSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uVGVsZXBob255UmluZ3RvbmUsSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvblJlcXVlc3QsSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkluc3RhbnQsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkRlbGF0ZWQsSWRlbnRpZmllcjo5Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9ldmVudCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkV2ZW50LElkZW50aWZpZXI6MTAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VOYXZpZ2F0aW9uR3VpZGFuY2UsSWRlbnRpZmllcjoxMiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX3NvbmlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlU29uaWZpY2F0aW9uLElkZW50aWZpZXI6MTMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZ2FtZSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjoxNCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2aXJ0dWFsX3NvdXJjZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VmlydHVhbFNvdXJjZSxJZGVudGlmaWVyOjE1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFudCIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbnQsSWRlbnRpZmllcjoxNiIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KIAogICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6RGVmYXVsdCxJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOk1pYyxJZGVudGlmaWVyOjEiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0RFRkFVTFQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfTUlDIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlVXBsaW5rLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgogICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VEb3dubGluayxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDYWxsLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Q2FtY29yZGVyLElkZW50aWZpZXI6NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0NBTUNPUkRFUiIvPgogICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VSZWNvZ25pdGlvbixJZGVudGlmaWVyOjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVtb3RlU3VibWl4LElkZW50aWZpZXI6OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlVucHJvY2Vzc2VkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KICAgICAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CkBAIC0xMzMsOCArNjcsNiBAQAogCiAgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgogICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+CiAgICAgPC9JbnN0YW5jZURlZmluaXRpb24+CiA8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9wb2xpY3lfY3JpdGVyaWEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODBjYmUxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1FeGNsdXNpdmVDcml0ZXJpb24gVGVsZXBob255TW9kZSAgICAgICAgICAgICAgICA6ICAgTm9ybWFsICAgICAgICAgIFJpbmdUb25lICAgICAgICAgICAgICAgIEluQ2FsbCAgICAgICAgICAgICAgSW5Db21tdW5pY2F0aW9uCi1JbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlSW5wdXREZXZpY2VzICAgICAgICA6ICAgQ29tbXVuaWNhdGlvbiBBbWJpZW50IEJ1aWx0aW5NaWMgQmx1ZXRvb3RoU2NvSGVhZHNldCBXaXJlZEhlYWRzZXQgSGRtaSBUZWxlcGhvbnlSeCBCYWNrTWljIFJlbW90ZVN1Ym1peCBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgRm1UdW5lciBUdlR1bmVyIExpbmUgU3BkaWYgQmx1ZXRvb3RoQTJkcCBMb29wYmFjayBJcCBCdXMgU3R1YgotSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZU91dHB1dERldmljZXMgICAgICAgOiAgIEVhcnBpZWNlIFNwZWFrZXIgV2lyZWRTcGVha2VyIFdpcmVkSGVhZHNldCBXaXJlZEhlYWRwaG9uZSBCbHVldG9vdGhTY28gQmx1ZXRvb3RoU2NvSGVhZHNldCBCbHVldG9vdGhTY29DYXJraXQgQmx1ZXRvb3RoQTJkcCBCbHVldG9vdGhBMmRwSGVhZHBob25lcyBCbHVldG9vdGhBMmRwU3BlYWtlciBIZG1pIEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBSZW1vdGVTdWJtaXggVGVsZXBob255VHggTGluZSBIZG1pQXJjIFNwZGlmIEZtIEF1eExpbmUgU3BlYWtlclNhZmUgSXAgQnVzIFN0dWIKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyICAgICAgICAgICAgRm9yY2VCdFNjbwotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yTWVkaWEgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIJCQlGb3JjZUhlYWRwaG9uZXMgICAgICAgICBGb3JjZUJ0QTJkcCAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sgICAgRm9yY2VOb0J0QTJkcCAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JSZWNvcmQgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlQnRTY28gICAgICAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckRvY2sgICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSAgICAgRm9yY2VCdENhckRvY2sgICAgICBGb3JjZUJ0RGVza0RvY2sgICAgIEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JTeXN0ZW0gICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciAgIEZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCmluZGV4IDM1NTljZjEuLjY1ZGM5YWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCkBAIC04LDEwICs4LDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAgXAogICAgIFBvbGljeVN1YnN5c3RlbS5jcHAgXAotICAgIFN0cmF0ZWd5LmNwcCBcCiAgICAgSW5wdXRTb3VyY2UuY3BwIFwKICAgICBTdHJlYW0uY3BwIFwKLSAgICBVc2FnZS5jcHAKKyAgICBQcm9kdWN0U3RyYXRlZ3kuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSBcCiAgICAgLVdhbGwgXApAQCAtMjEsMTUgKzIwLDIwIEBACiAgICAgLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSAgXAogICAgIGxpYnBhcmFtZXRlciBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJsb2cgXAogCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9jbGllbnRfaGVhZGVycyBcCisgICAgbGliYmFzZV9oZWFkZXJzCisKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGZ3X3V0aWxpdHkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCmluZGV4IGVhYzRlZmUuLmY5MWY4ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCiAjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKICNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCkBAIC0zMyw5ICszNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAogICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKIHsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZShjb250ZXh0LmdldEl0ZW0oTWFwcGluZ0tleU5hbWUpKTsKKworICAgIGlmKG5vdCBhbmRyb2lkOjpTb3VyY2VUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKG5hbWUsIG1JZCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBJbnB1dCBTb3VyY2UgbmFtZTogJXMsIGludmFsaWQgWE1MIHN0cnVjdHVyZSBmaWxlIiwgbmFtZS5jX3N0cigpKTsKKyAgICB9CiAgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRJbnB1dFNvdXJjZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRJbnB1dFNvdXJjZShuYW1lLCBtSWQpOwogfQogCiBib29sIElucHV0U291cmNlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCmluZGV4IDk4ZDEwYTkuLmJmYzFiY2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCkBAIC0xNywxMCArMTcsOSBAQAogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgogI2luY2x1ZGUgIlN1YnN5c3RlbU9iamVjdEZhY3RvcnkuaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgIlByb2R1Y3RTdHJhdGVneS5oIgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzYsOSArMzUsOCBAQAogCiAKIGNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmVhbUNvbXBvbmVudE5hbWUgPSAiU3RyZWFtIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJTdHJhdGVneSI7CiBjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUgPSAiSW5wdXRTb3VyY2UiOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptVXNhZ2VDb21wb25lbnROYW1lID0gIlVzYWdlIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWUgPSAiUHJvZHVjdFN0cmF0ZWd5IjsKIAogUG9saWN5U3Vic3lzdGVtOjpQb2xpY3lTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvcmU6OmxvZzo6TG9nZ2VyICZsb2dnZXIpCiAgICAgOiBDU3Vic3lzdGVtKG5hbWUsIGxvZ2dlciksCkBAIC02NSwyMiArNjMsMTYgQEAKICAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAogICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8U3RyZWFtPigKICAgICAgICAgICAgIG1TdHJlYW1Db21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQotICAgICAgICApOwotICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCi0gICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJhdGVneT4oCi0gICAgICAgICAgICBtU3RyYXRlZ3lDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCi0gICAgICAgICk7Ci0gICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKLSAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFVzYWdlPigKLSAgICAgICAgICAgIG1Vc2FnZUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlOYW1lKSkKICAgICAgICAgKTsKICAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAogICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8SW5wdXRTb3VyY2U+KAogICAgICAgICAgICAgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxQcm9kdWN0U3RyYXRlZ3k+KAorICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWUsIDApCiAgICAgICAgICk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaAppbmRleCA4MjJlZWI5Li45YmYxYzIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCkBAIC01Myw3ICs1Myw2IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDM7IC8qKjwgYW1lbmQzIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtU3RyZWFtQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZTsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVVzYWdlQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI5ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQcm9kdWN0U3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnByb2R1Y3Rfc3RyYXRlZ3lfdDsKKworUHJvZHVjdFN0cmF0ZWd5OjpQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQoreworICAgIEFMT0dfQVNTRVJUKGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAhPSBudWxscHRyLCAiSW52YWxpZCBDb25maWd1cmFibGUgRWxlbWVudCIpOworICAgIG1Qb2xpY3lTdWJzeXN0ZW0gPSBzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSk7CisgICAgQUxPR19BU1NFUlQobVBvbGljeVN1YnN5c3RlbSAhPSBudWxscHRyLCAiSW52YWxpZCBQb2xpY3kgU3Vic3lzdGVtIik7CisKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlID0gbVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCk7CisgICAgQUxPR19BU1NFUlQobVBvbGljeVBsdWdpbkludGVyZmFjZSAhPSBudWxscHRyLCAiSW52YWxpZCBQb2xpY3kgUGx1Z2luIEludGVyZmFjZSIpOworCisgICAgc3RkOjpzdHJpbmcgbmFtZShpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldE5hbWUoKSk7CisgICAgbUlkID0gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKG5hbWUpOworCisgICAgQUxPR19BU1NFUlQobUlkICE9IFBST0RVQ1RfU1RSQVRFR1lfSU5WQUxJRCwgIlByb2R1Y3QgU3RyYXRlZ3kgJXMgbm90IGZvdW5kIiwgbmFtZS5jX3N0cigpKTsKKworICAgIEFMT0dFKCJQcm9kdWN0IFN0cmF0ZWd5ICVzIGFkZGVkIiwgbmFtZS5jX3N0cigpKTsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBEZXZpY2UgZGV2aWNlUGFyYW1zOworICAgIGJsYWNrYm9hcmRSZWFkKCZkZXZpY2VQYXJhbXMsIHNpemVvZihkZXZpY2VQYXJhbXMpKTsKKworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KG1JZCwgZGV2aWNlUGFyYW1zLmFwcGxpY2FibGVEZXZpY2UpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kobUlkLCBkZXZpY2VQYXJhbXMuZGV2aWNlQWRkcmVzcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjA4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFByb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Cit7Citwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBtTWF4U3RyaW5nU2l6ZSA9IDI1NzsgLyoqPCBtYXggc3RyaW5nIHNpemUgKHBsdXMgemVybyB0ZXJtaW5hbCkuICovCisKKyAgICBzdHJ1Y3QgRGV2aWNlCisgICAgeworICAgICAgICB1aW50MzJfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLworICAgICAgICBjaGFyIGRldmljZUFkZHJlc3NbbU1heFN0cmluZ1NpemVdOyAvKio8IGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmF0ZWd5LiAqLworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3B1YmxpYzoKKyAgICBQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAorICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIGFuZHJvaWQ6OnByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZjM2E4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCi0jaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwotCi1TdHJhdGVneTo6U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKLSAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAotICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKLXsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKLQotICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyYXRlZ3koZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Ci19Ci0KLWJvb2wgU3RyYXRlZ3k6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKLXsKLSAgICB1aW50MzJfdCBhcHBsaWNhYmxlT3V0cHV0RGV2aWNlOwotICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlT3V0cHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZU91dHB1dERldmljZSkpOwotICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VGb3JTdHJhdGVneShtSWQsIGFwcGxpY2FibGVPdXRwdXREZXZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyYjgyYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgotI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWNsYXNzIFBvbGljeVN1YnN5c3RlbTsKLQotY2xhc3MgU3RyYXRlZ3kgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAotewotcHVibGljOgotICAgIFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOwotCi1wcml2YXRlOgotICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgotICAgICAqLwotICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOwotCi0gICAgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneSBtSWQ7IC8qKjwgc3RyYXRlZ3kgaWRlbnRpZmllciB0byBsaW5rIHdpdGggYXVkaW8uaC4qLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKaW5kZXggYzY0MmEyMy4uNTIzMGUwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKQEAgLTE3LDkgKzE3LDkgQEAKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwogCiBTdHJlYW06OlN0cmVhbShjb25zdCBzdHJpbmcgJi8qbWFwcGluZ1ZhbHVlKi8sCiAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCkBAIC0yOSwxMCArMjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKICAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCiB7Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZShjb250ZXh0LmdldEl0ZW0oTWFwcGluZ0tleU5hbWUpKTsKKworICAgIGlmIChub3QgYW5kcm9pZDo6U3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhuYW1lLCBtSWQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgU3RyZWFtIHR5cGUgbmFtZTogJXMsIGludmFsaWQgWE1MIHN0cnVjdHVyZSBmaWxlIiwgbmFtZS5jX3N0cigpKTsKKyAgICB9CiAKICAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmVhbShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJlYW0obmFtZSwgbUlkKTsKIH0KIAogYm9vbCBTdHJlYW06OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKQEAgLTQwLDExICs0NCw4IEBACiAgICAgQXBwbGljYWJsZSBwYXJhbXM7CiAgICAgYmxhY2tib2FyZFJlYWQoJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOwogCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JTdHJlYW0obUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KHBhcmFtcy5zdHJhdGVneSkpOwotCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJhbXMudm9sdW1lUHJvZmlsZSkpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgbUlkLCBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJhbXMudm9sdW1lUHJvZmlsZSkpOwogCiAgICAgcmV0dXJuIHRydWU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaAppbmRleCA0YTg3NWRiLi5lMGNlMmZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCkBAIC0yOSw3ICsyOSw2IEBACiBwcml2YXRlOgogICAgIHN0cnVjdCBBcHBsaWNhYmxlCiAgICAgewotICAgICAgICB1aW50MzJfdCBzdHJhdGVneTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KICAgICAgICAgdWludDMyX3Qgdm9sdW1lUHJvZmlsZTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KICAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTlmOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJVc2FnZS5oIgotI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKLQotVXNhZ2U6OlVzYWdlKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsIGNvcmU6OmxvZzo6TG9nZ2VyICZsb2dnZXIpCi0gICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAotICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCi0gICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOwotCi0gICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRVc2FnZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKLX0KLQotYm9vbCBVc2FnZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQotewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKLSAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFN0cmF0ZWd5Rm9yVXNhZ2UobUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KGFwcGxpY2FibGVTdHJhdGVneSkpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwMjA0Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgotI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWNsYXNzIFBvbGljeVN1YnN5c3RlbTsKLQotY2xhc3MgVXNhZ2UgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAotewotcHVibGljOgotICAgIFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOwotCi1wcml2YXRlOgotICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgotICAgICAqLwotICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOwotCi0gICAgYXVkaW9fdXNhZ2VfdCBtSWQ7IC8qKjwgdXNhZ2UgaWRlbnRpZmllciB0byBsaW5rIHdpdGggYXVkaW8uaC4gKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0MWQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZQpAQCAtMCwwICsxLDQgQEAKK3VzZXJkZWJ1Z19vcl9lbmcoYAorICBhbGxvdyBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcl9zb2NrZXQ6ZGlyIHJ3X2Rpcl9wZXJtczsKKyAgYWxsb3cgYXVkaW9zZXJ2ZXIgYXVkaW9zZXJ2ZXJfc29ja2V0OnNvY2tfZmlsZSBjcmVhdGVfZmlsZV9wZXJtczsKKycpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZS50ZSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjE5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZS50ZQpAQCAtMCwwICsxLDIgQEAKKyMgUG9saWN5IEVuZ2luZSByZW1vdGUgY29ubmVjdGlvbiBmb3IgcnVudGltZSBkZWJ1ZyBvZiBwYXJhbWV0ZXIgZnJhbWV3b3JrCit0eXBlIGF1ZGlvc2VydmVyX3NvY2tldCwgZmlsZV90eXBlLCBjb3JlZG9tYWluX3NvY2tldDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlX2NvbnRleHRzIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwZmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlX2NvbnRleHRzCkBAIC0wLDAgKzEgQEAKKy9kZXYvc29ja2V0L2F1ZGlvc2VydmVyKC8uKik/ICAgIHU6b2JqZWN0X3I6YXVkaW9zZXJ2ZXJfc29ja2V0OnMwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCmluZGV4IGI3MmRlZDguLjAyYjQxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCkBAIC0xOCw4ICsxOCw2IEBACiAKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0yOCwxMCArMjYsOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiAvKioKICAqIENvbGxlY3Rpb24gb2YgcG9saWN5IGVsZW1lbnQgYXMgYSBtYXAgaW5kZXhlZCB3aXRoIGEgdGhlaXIgVUlEIHR5cGUuCkBAIC0xNDksMTUgKzE0NSw5IEBACiB0ZW1wbGF0ZSA8Pgogc3RydWN0IENvbGxlY3Rpb248c3RkOjpzdHJpbmc+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwogdGVtcGxhdGUgPD4KLXN0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwotdGVtcGxhdGUgPD4KIHN0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKIAotdHlwZWRlZiBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5Q29sbGVjdGlvbjsKIHR5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PiBTdHJlYW1Db2xsZWN0aW9uOwotdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+IFVzYWdlQ29sbGVjdGlvbjsKIHR5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4gSW5wdXRTb3VyY2VDb2xsZWN0aW9uOwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKaW5kZXggNTJlNzdlNS4uOTc5NTBkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKQEAgLTIyLDEwICsyMiw4IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KIGNsYXNzIEVsZW1lbnQKQEAgLTY0LDcgKzYyLDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqCiAgICAgICogQHRwYXJhbSBQcm9wZXJ0eSBmb3Igd2hpY2ggdGhpcyBwb2xpY3kgZWxlbWVudCBoYXMgc2V0dGVyIC8gZ2V0dGVyLgpAQCAtNzUsNyArNzMsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKaW5kZXggMGQxOGZmYS4uODlhMTY5NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcApAQCAtMjUsOTIgKzI1LDYzIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgIkVuZ2luZS5oIgotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgorCisjaW5jbHVkZSA8RW5naW5lQ29uZmlnLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6bWFwOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotdGVtcGxhdGUgPD4KLVN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkKLXsKLSAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKLX0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiB0ZW1wbGF0ZSA8PgogU3RyZWFtQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KCkKIHsKICAgICByZXR1cm4gbVN0cmVhbUNvbGxlY3Rpb247CiB9CiB0ZW1wbGF0ZSA8PgotVXNhZ2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4oKQotewotICAgIHJldHVybiBtVXNhZ2VDb2xsZWN0aW9uOwotfQotdGVtcGxhdGUgPD4KIElucHV0U291cmNlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PigpCiB7CiAgICAgcmV0dXJuIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247CiB9CiAKIHRlbXBsYXRlIDw+Ci1jb25zdCBTdHJhdGVneUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdHJhdGVneUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogY29uc3QgU3RyZWFtQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KCkgY29uc3QKIHsKICAgICByZXR1cm4gbVN0cmVhbUNvbGxlY3Rpb247CiB9CiB0ZW1wbGF0ZSA8PgotY29uc3QgVXNhZ2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4oKSBjb25zdAotewotICAgIHJldHVybiBtVXNhZ2VDb2xsZWN0aW9uOwotfQotdGVtcGxhdGUgPD4KIGNvbnN0IElucHV0U291cmNlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247CiB9CiAKLUVuZ2luZTo6RW5naW5lKCkKLSAgICA6IG1NYW5hZ2VySW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBsdWdpbkludGVyZmFjZSh0aGlzKSwKLSAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3IobmV3IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkpLAotICAgICAgbUFwbU9ic2VydmVyKE5VTEwpCitFbmdpbmU6OkVuZ2luZSgpIDogbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSkKIHsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4iKTsKKyAgICB9CiB9CiAKIEVuZ2luZTo6fkVuZ2luZSgpCiB7Ci0gICAgbVN0cmF0ZWd5Q29sbGVjdGlvbi5jbGVhcigpOwogICAgIG1TdHJlYW1Db2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgbUlucHV0U291cmNlQ29sbGVjdGlvbi5jbGVhcigpOwotICAgIG1Vc2FnZUNvbGxlY3Rpb24uY2xlYXIoKTsKLX0KLQotCi12b2lkIEVuZ2luZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotewotICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7Ci0gICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7CiB9CiAKIHN0YXR1c190IEVuZ2luZTo6aW5pdENoZWNrKCkKIHsKLSAgICBpZiAobVBvbGljeVBhcmFtZXRlck1nciA9PSBOVUxMIHx8IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnN0YXJ0KCkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAobVBvbGljeVBhcmFtZXRlck1nciA9PSBudWxscHRyIHx8IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnN0YXJ0KCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3Qgc3RhcnQgUG9saWN5IFBGVyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKT8gTk9fRVJST1IgOiBOT19JTklUOworICAgIHJldHVybiBFbmdpbmVCYXNlOjppbml0Q2hlY2soKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KQEAgLTEzOCw1NSArMTA5LDE2IEBACiAgICAgcmV0dXJuIGVsZW1lbnQtPnRlbXBsYXRlIGdldDxQcm9wZXJ0eT4oKTsKIH0KIAotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCitib29sIEVuZ2luZTo6c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZwcm9maWxlKQogewotICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90Pih1c2FnZSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotewotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7Ci0KLSAgICAvKiogVGhpcyBpcyB0aGUgb25seSBjYXNlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBiZWNhdXNlIHRoZSBQRlcgaXMgdW5hYmxlIHRvIGtub3cgdGhlCi0gICAgICogYWN0aXZpdHkgb2Ygc3RyZWFtcy4KLSAgICAgKgotICAgICAqIC1XaGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgotICAgICAqIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKLSAgICAgKiB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90Ci0gICAgICogaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKLSAgICAgKgotICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCi0gICAgICovCi0gICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMICYmCi0gICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCi0gICAgICAgICAgICAhb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgotICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihTVFJBVEVHWV9NRURJQSk7Ci0gICAgfQotICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZICYmCi0gICAgICAgIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCi0gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCi0gICAgICAgICAgICAvLyBEZXZpY2UgRm9yIFNvbmlmaWNhdGlvbiBjb25mIGZpbGUgaGFzIEhETUksIFNQRElGIGFuZCBIRE1JIEFSQyB1bnJlYWNoZWFibGUuCi0gICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7Ci19Ci0KLWJvb2wgRW5naW5lOjpQbHVnaW5JbnRlcmZhY2VJbXBsOjpzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnByb2ZpbGUpCi17Ci0gICAgaWYgKG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSkpIHsKLSAgICAgICAgbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRWb2x1bWVDdXJ2ZXMoKS5zd2l0Y2hWb2x1bWVDdXJ2ZShwcm9maWxlLCBzdHJlYW0pOworICAgIGlmIChzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0sIHByb2ZpbGUpKSB7CisgICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CiBib29sIEVuZ2luZTo6c2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSkKIHsKQEAgLTIwMCw3ICsxMzIsMTEgQEAKIAogc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQogewotICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldFBob25lU3RhdGUobW9kZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0UGhvbmVTdGF0ZShtb2RlKTsKIH0KIAogYXVkaW9fbW9kZV90IEVuZ2luZTo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0CkBAIC0yMTEsNyArMTQ3LDExIEBACiBzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwogfQogCiBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEVuZ2luZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdApAQCAtMjIwLDI4ICsxNjAsMjE2IEBACiB9CiAKIHN0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogeworICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisKICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZEZXNjLT50eXBlKCkpKSB7CiAgICAgICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOwogICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfQogICAgIHJldHVybiBCQURfVFlQRTsKIH0KIAorc3RhdHVzX3QgRW5naW5lOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKQoreworICAgIGF1dG8gcmVzdWx0ID0gRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICAvLyBDdXN0b20gWE1MIFBhcnNpbmcKKyAgICBhdXRvIGxvYWRDcml0ZXJpYT0gW3RoaXNdKGNvbnN0IGF1dG8mIGNvbmZpZ0NyaXRlcmlhLCBjb25zdCBhdXRvJiBjb25maWdDcml0ZXJpb25UeXBlcykgeworICAgICAgICBmb3IgKGF1dG8mIGNyaXRlcmlvbiA6IGNvbmZpZ0NyaXRlcmlhKSB7CisgICAgICAgICAgICBlbmdpbmVDb25maWc6OkNyaXRlcmlvblR5cGUgY3JpdGVyaW9uVHlwZTsKKyAgICAgICAgICAgIGZvciAoYXV0byAmY29uZmlnQ3JpdGVyaW9uVHlwZSA6IGNvbmZpZ0NyaXRlcmlvblR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NyaXRlcmlvblR5cGUubmFtZSA9PSBjcml0ZXJpb24udHlwZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uVHlwZSA9IGNvbmZpZ0NyaXRlcmlvblR5cGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5vdCBjcml0ZXJpb25UeXBlLm5hbWUuZW1wdHkoKSwgIkludmFsaWQgY3JpdGVyaW9uIHR5cGUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbi5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbVBvbGljeVBhcmFtZXRlck1nci0+YWRkQ3JpdGVyaW9uKGNyaXRlcmlvbi5uYW1lLCBjcml0ZXJpb25UeXBlLmlzSW5jbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblR5cGUudmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb24uZGVmYXVsdExpdGVyYWxWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbG9hZENyaXRlcmlhKHJlc3VsdC5wYXJzZWRDb25maWctPmNyaXRlcmlhLCByZXN1bHQucGFyc2VkQ29uZmlnLT5jcml0ZXJpb25UeXBlcyk7CisgICAgcmV0dXJuIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ID09IDA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIHByb2R1Y3RTdHJhdGVnaWVzID0gZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKTsKKyAgICBpZiAocHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgPT0gcHJvZHVjdFN0cmF0ZWdpZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gZ2V0IGRldmljZSBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBwcyk7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworCisgICAgLyoqIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgYmVjYXVzZSB0aGUgUEZXIGlzIHVuYWJsZSB0byBrbm93IHRoZQorICAgICAqIGFjdGl2aXR5IG9mIHN0cmVhbXMuCisgICAgICoKKyAgICAgKiAtV2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KKyAgICAgKiBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICogdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAorICAgICAqIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCisgICAgICoKKyAgICAgKiAtV2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgorICAgICAqLworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgaWYgKHBzID09IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSAmJgorICAgICAgICAgICAgIWlzX3N0YXRlX2luX2NhbGwoZ2V0UGhvbmVTdGF0ZSgpKSAmJgorICAgICAgICAgICAgIW91dHB1dHMuaXNBY3RpdmVSZW1vdGVseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkgJiYKKyAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneUZvck1lZGlhID0KKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgZGV2aWNlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Rm9yTWVkaWEpOworICAgIH0gZWxzZSBpZiAocHMgPT0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSAmJgorICAgICAgICAob3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORykpIHx8CisgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSkgeworICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQorICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgorICAgICAgICAgICAgLy8gRGV2aWNlIEZvciBTb25pZmljYXRpb24gY29uZiBmaWxlIGhhcyBIRE1JLCBTUERJRiBhbmQgSERNSSBBUkMgdW5yZWFjaGVhYmxlLgorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lOb3RpZmljYXRpb24gPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX1JJTkcpOworICAgICAgICBkZXZpY2VzID0gcHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lOb3RpZmljYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcyk7CisgICAgfQorICAgIGlmIChkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FIHx8CisgICAgICAgICAgICAoZGV2aWNlcyAmIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CisgICAgICAgIEFMT0dFX0lGKGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUsICIlczogbm8gdmFsaWQgZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICB9CisgICAgaWYgKC8qZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VzKSovIGRldmljZXMgPT0gQVVESU9fREVWSUNFX09VVF9CVVMpIHsKKyAgICAgICAgLy8gV2UgZG8gZXhwZWN0IG9ubHkgb25lIGRldmljZSBmb3IgdGhlc2UgdHlwZXMgb2YgZGV2aWNlcworICAgICAgICAvLyBDcml0ZXJpb24gZGV2aWNlIGFkZHJlc3MgZ2FyYW50ZWUgdGhpcyBvbmUgaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIElmIHRoaXMgY3JpdGVyaW9uIGlzIG5vdCB3aXNoZWQsIG5lZWQgdG8gZW5zdXJlIHRoaXMgZGV2aWNlIGlzIGF2YWlsYWJsZQorICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MocHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcykuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlczpkZXZpY2UgMHgleCAlcyAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgYWRkcmVzcy5jX3N0cigpLCBwcyk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgfQorICAgIEFMT0dWKCIlczpkZXZpY2UgMHgleCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgcHMpOworICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJyZWREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgZXhwbGljdCByb3V0aW5nIGRldmljZQorICAgIGlmIChwcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXMgZXhwbGljaXQgUm91dGluZyBvbiBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgcHJlZmVycmVkRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZERldmljZSk7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IEVuZ2luZUJhc2U6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgYXV0byAmaW5wdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0SW5wdXRzKCk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKyAgICAvLworICAgIC8vIEV4cGxpY2l0IFJvdXRpbmcgPz8/IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQKKyAgICAvLyBmaXJzdCBhcyBpdCB1c2VkIHRvIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXRzLCBhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBwb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtaXgpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZ2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oYXR0ci5zb3VyY2UpOworCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIGFkZHJlc3MgPSAiMCI7CisgICAgICAgIHN0ZDo6c2l6ZV90IHBvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFncyB7IGF0dHIudGFncyB9OworICAgICAgICBpZiAoKHBvcyA9IHRhZ3MuZmluZCgiYWRkcj0iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSB0YWdzLnN1YnN0cihwb3MgKyBzdGQ6OnN0cmxlbigiYWRkcj0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK3ZvaWQgRW5naW5lOjp1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpCit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXNbc3RyYXRlZ3ktPmdldElkKCldID0gZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneS0+Z2V0SWQoKSk7CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6c2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykKK3sKKyAgICBpZiAoZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5maW5kKHN0cmF0ZWd5KSA9PSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHNldCBhZGRyZXNzICVzIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgc3RyYXRlZ3kpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VBZGRyZXNzKGFkZHJlc3MpOworfQorCitib29sIEVuZ2luZTo6c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKK3sKKyAgICBpZiAoZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5maW5kKHN0cmF0ZWd5KSA9PSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0IGRldmljZSAlZCBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZVR5cGVzKGRldmljZXMpOworICAgIHJldHVybiB0cnVlOworfQorCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKLSAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbVBsdWdpbkludGVyZmFjZTsKKyAgICByZXR1cm4gdGhpczsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAppbmRleCAzMjhkMjNkLi41NTUzOTk0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTE2LDIyICsxNiwyMCBAQAogCiAjcHJhZ21hIG9uY2UKIAotCisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQ29sbGVjdGlvbi5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZAoteworbmFtZXNwYWNlIGFuZHJvaWQgewogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CiAKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjsKIGNsYXNzIFZvbHVtZVByb2ZpbGU7CiAKLWNsYXNzIEVuZ2luZQorY2xhc3MgRW5naW5lIDogcHVibGljIEVuZ2luZUJhc2UsIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCiB7CiBwdWJsaWM6CiAgICAgRW5naW5lKCk7CkBAIC00MCwxMzIgKzM4LDY5IEBACiAgICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KICAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CiAKLXByaXZhdGU6Ci0gICAgLy8vIEludGVyZmFjZSBtZW1iZXJzCi0gICAgY2xhc3MgTWFuYWdlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgLy8vCisgICAgLy8vIGZyb20gRW5naW5lQmFzZQorICAgIC8vLworICAgIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIEF1ZGlvTWl4ICoqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkgb3ZlcnJpZGU7CisKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgIC8vLworICAgIHN0YXR1c190IGFkZFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIG92ZXJyaWRlCiAgICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWFuYWdlckludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQotCi0gICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1Qb2xpY3lFbmdpbmUtPnNldE9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGlucHV0U291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7Ci0gICAgfSBtTWFuYWdlckludGVyZmFjZTsKLQotICAgIGNsYXNzIFBsdWdpbkludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKKyAgICAgICAgcmV0dXJuIGFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOworICAgIH0KKyAgICBzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3Qgc291cmNlKSBvdmVycmlkZQogICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFBsdWdpbkludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorICAgICAgICByZXR1cm4gYWRkPGF1ZGlvX3NvdXJjZV90PihuYW1lLCBzb3VyY2UpOworICAgIH0KKyAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPHJvdXRpbmdfc3RyYXRlZ3k+KG5hbWUsIHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4obmFtZSwgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IHVzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3VzYWdlX3Q+KG5hbWUsIHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fc291cmNlX3Q+KG5hbWUsIHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvclN0cmF0ZWd5KGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgJnN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKTsKKyAgICBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsIGlucHV0U291cmNlKTsKKyAgICB9CisgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90PihzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UpOwotICAgICAgICB9CisgICAgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSBvdmVycmlkZTsKIAotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1QbHVnaW5JbnRlcmZhY2U7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUobmFtZSk7CisgICAgfQogCiBwcml2YXRlOgogICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwogICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOwogCi0gICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOwotCi0gICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpOwotICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOwotICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0OwotICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwotICAgIFN0cmF0ZWd5Q29sbGVjdGlvbiBtU3RyYXRlZ3lDb2xsZWN0aW9uOyAvKio8IFN0cmF0ZWdpZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLwogICAgIFN0cmVhbUNvbGxlY3Rpb24gbVN0cmVhbUNvbGxlY3Rpb247IC8qKjwgU3RyZWFtcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICAqLwotICAgIFVzYWdlQ29sbGVjdGlvbiBtVXNhZ2VDb2xsZWN0aW9uOyAvKio8IFVzYWdlcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAgICAgSW5wdXRTb3VyY2VDb2xsZWN0aW9uIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247IC8qKjwgSW5wdXQgc291cmNlcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgpAQCAtMTg2LDEyICsxMjEsMTYgQEAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KICAgICBib29sIHNldFByb3BlcnR5Rm9yS2V5KGNvbnN0IFByb3BlcnR5ICZwcm9wZXJ0eSwgY29uc3QgS2V5ICZrZXkpOwogCisgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgLyoqCiAgICAgICogUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGhpZGRlbiB0aHJvdWdoIGEgd3JhcHBlci4KICAgICAgKi8KICAgICBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlciAqbVBvbGljeVBhcmFtZXRlck1ncjsKIAotICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7CisgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCmluZGV4IDlhYTg5YjIuLjI0NDI1OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBFbmdpbmVJbnN0YW5jZTo6RW5naW5lSW5zdGFuY2UoKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBhZTM5ZmVmLi5kMjUyZDNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMjAsMTMgKzIwLDEzIEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpCiB7Ci0gICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAorICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKaW5kZXggNmM0OThkYy4uZTE4NjVjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaApAQCAtMTgsMTAgKzE4LDggQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiAvKioKICAqIFNwZWNpYWxpemF0aW9uIG9mIHBvbGljeSBiYXNlIGNsYXNzIGVsZW1lbnQgZm9yIGF1ZGlvX3NvdXJjZV90CkBAIC02MSw3ICs1OSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKi8KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTM5OTE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9TdHJhdGVneSIKLQotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi1zdGF0dXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcikKLXsKLSAgICBpZiAoaWRlbnRpZmllciA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0gICAgQUxPR0QoIiVzOiBTdHJhdGVneSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkZXZpY2UgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5LgotICogSXQgY2hlY2tzIGlmIHRoZSBvdXRwdXQgZGV2aWNlIGlzIHZhbGlkLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlcyBzZWxlY3RlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgotICoKLSAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGRldmljZSBpcyBlaXRoZXIgdmFsaWQgb3Igbm9uZSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gKi8KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpzZXQ8YXVkaW9fZGV2aWNlc190PihhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLXsKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZXMpIHx8IGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dEKCIlczogMHglWCBmb3Igc3RyYXRlZ3kgJXMiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLWF1ZGlvX2RldmljZXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpnZXQ8YXVkaW9fZGV2aWNlc190PigpIGNvbnN0Ci17Ci0gICAgQUxPR1YoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVEZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlRGV2aWNlczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1N2Q1NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLS8qKgotICogQHRwYXJhbSBhdWRpb19kZXZpY2VzX3Q6IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4KLSAqLwotdGVtcGxhdGUgPD4KLWNsYXNzIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4KLXsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyhBVURJT19ERVZJQ0VfTk9ORSkKLSAgICB7fQotICAgIH5FbGVtZW50KCkge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKi8KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgKgotICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCi0gICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgotICAgICoKLSAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICovCi0gICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAgKi8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQotCi0gICAgLyoqCi0gICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90Ci0gICAgICogb3IgYSBzdHJpbmcuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0KLXByaXZhdGU6Ci0gICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCi0gICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOwotICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOwotCi0gICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0KLSAgICBhdWRpb19kZXZpY2VzX3QgbUFwcGxpY2FibGVEZXZpY2VzOyAvKio8IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KLX07Ci0KLXR5cGVkZWYgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneTsKLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCmluZGV4IDBlZDM2NGYuLjI5N2ViMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldElkZW50aWZpZXIoYXVkaW9fc3RyZWFtX3R5cGVfdCBpZGVudGlmaWVyKQogewpAQCAtMzYsMzIgKzM0LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qKgotKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhpcyBzdHJlYW0uCi0qIEl0IGNoZWNrcyBpZiB0aGUgc3RyYXRlZ3kgaXMgdmFsaWQuCi0qCi0qIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0qCi0qIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGlzIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotKi8KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLXsKLSAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIEFMT0dEKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXJvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXM6IDB4JVggZm9yIFN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OwotfQotCiB0ZW1wbGF0ZSA8Pgogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGF1ZGlvX3N0cmVhbV90eXBlX3Qgdm9sdW1lUHJvZmlsZSkKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCmluZGV4IDY5MDIwMDMuLmE0ZmRkMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaApAQCAtMTgsMjMgKzE4LDIwIEBACiAKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiRW5naW5lRGVmaW5pdGlvbi5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1hcD4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiAvKioKLSAqIEB0cGFyYW0gcm91dGluZ19zdHJhdGVneTogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uCisgKiBAdHBhcmFtIHByb2R1Y3Rfc3RyYXRlZ3lfdDogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uCiAgKi8KIHRlbXBsYXRlIDw+CiBjbGFzcyBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+CiB7CiBwdWJsaWM6CiAgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKLSAgICAgICAgOiBtTmFtZShuYW1lKSwKLSAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKQorICAgICAgICA6IG1OYW1lKG5hbWUpCiAgICAge30KICAgICB+RWxlbWVudCgpIHt9CiAKQEAgLTYyLDcgKzU5LDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSAgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKi8KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CkBAIC03OSw4ICs3Niw2IEBACiAgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCi0KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1Wb2x1bWVQcm9maWxlOyAvKio8IFZvbHVtZSBQcm9maWxlIGZvbGxvd2VkIGJ5IHRoaXMgc3RyZWFtLiAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMDgyOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvVXNhZ2UiCi0KLSNpbmNsdWRlICJVc2FnZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3VzYWdlX3QgaWRlbnRpZmllcikKLXsKLSAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1VTQUdFX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0gICAgQUxPR0QoIiVzOiBVc2FnZSAlcyBoYXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotc3RhdHVzX3QgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6c2V0PHJvdXRpbmdfc3RyYXRlZ3k+KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgaWYgKHN0cmF0ZWd5ID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dEKCIlczogJWQgZm9yIFVzYWdlICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1yb3V0aW5nX3N0cmF0ZWd5IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OmdldDxyb3V0aW5nX3N0cmF0ZWd5PigpIGNvbnN0Ci17Ci0gICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlU3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVTdHJhdGVneTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllMGUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotLyoqCi0gKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuCi0gKi8KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+Ci17Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKLSAgICAgICAgOiBtTmFtZShuYW1lKSwKLSAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKQotICAgIHt9Ci0gICAgfkVsZW1lbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAqCi0gICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCi0gICAgKgotICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKGF1ZGlvX3VzYWdlX3QgaWRlbnRpZmllcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICAqLwotICAgIGF1ZGlvX3VzYWdlX3QgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKLSAgICAgKiBvciBhIHN0cmluZy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0gICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgYXVkaW9fdXNhZ2VfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4gKi8KLX07Ci0KLXR5cGVkZWYgRWxlbWVudDxhdWRpb191c2FnZV90PiBVc2FnZTsKLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGYyOWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBvd25lcjogInJlbmF1bHQiLAorICAgIG1haW46ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkyOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZiNzBhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CkBAIC0wLDAgKzEsMjQzIEBACisjIS91c3IvYmluL3B5dGhvbgorCisjCisjIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRJbmNsdWRlIGFzIEVJCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tIGFzIE1JTklET00KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKyMKKyMgSGVscGVyIHNjcmlwdCB0aGF0IGhlbHBzIHRvIGZlZWQgYXQgYnVpbGQgdGltZSB0aGUgWE1MIGNyaXRlcmlvbiB0eXBlcyBmaWxlIHVzZWQgYnkKKyMgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZSB0byBzdGFydCB0aGUgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgSXQgcHJldmVudHMgdG8gZmlsbCB0aGVtIG1hbnVhbGx5IGFuZCBhdm9pZCBkaXZlcmdlbmNlcyB3aXRoIGFuZHJvaWQuCisjCisjIFRoZSBEZXZpY2UgVHlwZXMgY3JpdGVyaW9uIHR5cGVzIGFyZSBmZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSB3aXRoIHRoZSBvcHRpb24KKyMgICAgICAgICAgIC0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciA8cGF0aC90by9hbmRyb2lkL2F1ZGlvL2Jhc2UvZmlsZS9hdWRpby1iYXNlLmg+CisjCisjIFRoZSBEZXZpY2UgQWRkcmVzc2VzIGNyaXRlcmlvbiB0eXBlcyBhcmUgZmVkIGZyb20gdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyMgaW4gb3JkZXIgdG8gZGlzY292ZXIgYWxsIHRoZSBkZXZpY2VzIGZvciB3aGljaCB0aGUgYWRkcmVzcyBtYXR0ZXIuCisjICAgICAgICAgICAtLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUgPHBhdGgvdG8vYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sPgorIworIyBUaGUgcmVmZXJlbmNlIGZpbGUgb2YgY3JpdGVyaW9uIHR5cGVzIG11c3QgYWxzbyBiZSBzZXQgYXMgYW4gaW5wdXQgb2YgdGhlIHNjcmlwdDoKKyMgICAgICAgICAgIC0tY3JpdGVyaW9udHlwZXMgPHBhdGgvdG8vY3JpdGVyaW9uL2ZpbGUvYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbC5pbj4KKyMKKyMgQXQgbGFzdCwgdGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0IHNoYWxsIGJlIHNldCBhbHNvOgorIyAgICAgICAgICAgLS1vdXRwdXRmaWxlIDxwYXRoL3RvL291dC92ZW5kb3IvZXRjL2F1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWw+CisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBhdWRpbyBjcml0ZXJpb24gdHlwZSBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gQmFzZSBDIGhlYWRlciBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkFORFJPSURfQVVESU9fQkFTRV9IRUFERVIiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUnLAorICAgICAgICAgICAgaGVscD0iQW5kcm9pZCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IihBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY3JpdGVyaW9udHlwZXMnLAorICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIFhNTCBiYXNlIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPicgXAorICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSU9OX1RZUEVfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgb3V0cHV0ZmlsZSBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShjcml0ZXJpb25UeXBlcywgYWRkcmVzc0NyaXRlcmlhLCBjcml0ZXJpb25UeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKyAgICBjcml0ZXJpb25fdHlwZXNfaW5fdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlvblR5cGVzRmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19kaWN0IGluIGNyaXRlcmlvblR5cGVzLml0ZW1zKCk6CisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZSBpbiBjcml0ZXJpb25fdHlwZXNfcm9vdC5maW5kYWxsKCdjcml0ZXJpb25fdHlwZScpOgorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICBvcmRlcmVkX3ZhbHVlcyA9IE9yZGVyZWREaWN0KHNvcnRlZCh2YWx1ZXNfZGljdC5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMV0pKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9yZGVyZWRfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2xpdGVyYWwnLCBrZXkpCisKKyAgICBpZiBhZGRyZXNzQ3JpdGVyaWE6CisgICAgICAgIGZvciBjcml0ZXJpb25fbmFtZSwgdmFsdWVzX2xpc3QgaW4gYWRkcmVzc0NyaXRlcmlhLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSBjcml0ZXJpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiLCBsaXRlcmFsPXZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cigxIDw8IGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKGNyaXRlcmlvbl90eXBlc19yb290LCBlbmNvZGluZz0ndXRmOCcsIG1ldGhvZD0neG1sJykKKyAgICByZXBhcnNlZCA9IE1JTklET00ucGFyc2VTdHJpbmcoeG1sc3RyKQorICAgIHByZXR0eVhtbFN0ciA9IHJlcGFyc2VkLnRvcHJldHR5eG1sKG5ld2w9J1xyXG4nKQorICAgIHByZXR0eVhtbFN0ciA9IG9zLmxpbmVzZXAuam9pbihbcyBmb3IgcyBpbiBwcmV0dHlYbWxTdHIuc3BsaXRsaW5lcygpIGlmIHMuc3RyaXAoKV0pCisgICAgb3V0cHV0RmlsZS53cml0ZShwcmV0dHlYbWxTdHIuZW5jb2RlKCd1dGYtOCcpKQorCitkZWYgY2FwaXRhbGl6ZUxpbmUobGluZSk6CisgICAgcmV0dXJuICcgJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBsaW5lLnNwbGl0KCcgJykpKQorCisKKyMKKyMgUGFyc2UgdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgZGV2aWNlIGNyaXRlcmlhIGFkZHJlc3NlcworIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdChhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKSkKKyAgICAjCisgICAgIyBleHRyYWN0IGFsbCBkZXZpY2VzIGFkZHJlc3NlcyBmcm9tIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnc2luaycgOiAiT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiLAorICAgICAgICAnc291cmNlJyA6ICJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB9CisKKyAgICBhZGRyZXNzX2NyaXRlcmlhID0geworICAgICAgICAnT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUnIDogW10sCisgICAgICAgICdJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlJyA6IFtdIH0KKworICAgIG9sZFdvcmtpbmdEaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50ICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZFdvcmtpbmdEaXIKKworICAgIG5ld0RpciA9IG9zLnBhdGguam9pbihvbGRXb3JraW5nRGlyICwgYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZS5uYW1lKQorCisgICAgcG9saWN5X2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld0RpcikpKQorCisgICAgcHJpbnQgIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKQorCisgICAgcG9saWN5X3Jvb3QgPSBwb2xpY3lfaW5fdHJlZS5nZXRyb290KCkKKyAgICBFSS5pbmNsdWRlKHBvbGljeV9yb290KQorCisgICAgb3MuY2hkaXIob2xkV29ya2luZ0RpcikKKworICAgIGZvciBkZXZpY2UgaW4gcG9saWN5X3Jvb3QuaXRlcignZGV2aWNlUG9ydCcpOgorICAgICAgICBmb3Iga2V5IGluIGFkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZS5rZXlzKCk6CisgICAgICAgICAgICBpZiBkZXZpY2UuZ2V0KCdyb2xlJykgPT0ga2V5IGFuZCBkZXZpY2UuZ2V0KCdhZGRyZXNzJykgOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306IDx7fT4iLmZvcm1hdChrZXksIGRldmljZS5nZXQoJ2FkZHJlc3MnKSkpCisgICAgICAgICAgICAgICAgYWRkcmVzc19jcml0ZXJpYVthZGRyZXNzX2NyaXRlcmlhX21hcHBpbmdfdGFibGVba2V5XV0uYXBwZW5kKGRldmljZS5nZXQoJ2FkZHJlc3MnKSkKKworICAgIGZvciBjcml0ZXJpYSBpbiBhZGRyZXNzX2NyaXRlcmlhOgorICAgICAgICB2YWx1ZXMgPSAnLCcuam9pbihhZGRyZXNzX2NyaXRlcmlhW2NyaXRlcmlhXSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGNyaXRlcmlhLCB2YWx1ZXMpKQorCisgICAgcmV0dXJuIGFkZHJlc3NfY3JpdGVyaWEKKworIworIyBQYXJzZSB0aGUgYXVkaW8tYmFzZS5oIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgYW5kcm9pZCBkZXBlbmRlbnQgY3JpdGVyaW9uIHR5cGVzOgorIyAgIC1BbmRyb2lkIE1vZGUKKyMgICAtT3V0cHV0IGRldmljZXMgdHlwZQorIyAgIC1JbnB1dCBkZXZpY2VzIHR5cGUKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICMKKyAgICAjIEFkYXB0YXRpb24gdGFibGUgYmV0d2VlbiBBbmRyb2lkIEVudW1lcmF0aW9uIHByZWZpeCBhbmQgQXVkaW8gUEZXIENyaXRlcmlvbiB0eXBlIG5hbWVzCisgICAgIworICAgIGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnQVVESU9fTU9ERScgOiAiQW5kcm9pZE1vZGVUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9PVVQnIDogIk91dHB1dERldmljZXNNYXNrVHlwZSIsCisgICAgICAgICdBVURJT19ERVZJQ0VfSU4nIDogIklucHV0RGV2aWNlc01hc2tUeXBlIn0KKworICAgIGFsbF9jcml0ZXJpYSA9IHsKKyAgICAgICAgJ0FuZHJvaWRNb2RlVHlwZScgOiB7fSwKKyAgICAgICAgJ091dHB1dERldmljZXNNYXNrVHlwZScgOiB7fSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc01hc2tUeXBlJyA6IHt9IH0KKworICAgICMKKyAgICAjIF9DTlQsIF9NQVgsIF9BTEwgYW5kIF9OT05FIGFyZSBwcm9oaWJpdGVkIHZhbHVlcyBhcyB0aGVyIGFyZSBqdXN0IGhlbHBlcnMgZm9yIGVudW0gdXNlcnMuCisgICAgIworICAgIGlnbm9yZWRfdmFsdWVzID0gWyAnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORScgXQorCisgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiXHMqKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXF8iIFwKKyAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAorICAgICAgICByIig/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdKykiKQorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQorCisgICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGVudW1lcmF0ZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgICAgIG1hdGNoID0gY3JpdGVyaWFfcGF0dGVybi5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIlRoZSBmb2xsb3dpbmcgbGluZSBpcyBWQUxJRDoge306e31cbnt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUubmFtZSwgbGluZV9udW1iZXIsIGxpbmUpKQorCisgICAgICAgICAgICBjcml0ZXJpb25fbmFtZSA9IGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlW21hdGNoLmdyb3VwZGljdCgpWyd0eXBlJ11dCisgICAgICAgICAgICBsaXRlcmFsID0gJycuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbWF0Y2guZ3JvdXBkaWN0KClbJ2xpdGVyYWwnXS5zcGxpdCgnXycpKSkKKyAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQorCisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0CisgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorCisgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIGludChudW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0udmFsdWVzKCk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJjcml0ZXJpb24ge30gZHVwbGljYXRlZCB2YWx1ZXM6Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306e30iLmZvcm1hdChudW1lcmljYWxfdmFsdWUsIGxpdGVyYWwpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiS0VFUElORyBMQVRFU1QiKQorICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0KKworICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtsaXRlcmFsXSA9IGludChudW1lcmljYWxfdmFsdWUsIDApCisKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGxpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSkpCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcikKKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlcyA9IGFyZ3MuY3JpdGVyaW9udHlwZXMKKworICAgIGdlbmVyYXRlWG1sQ3JpdGVyaW9uVHlwZXNGaWxlKGFsbF9jcml0ZXJpYSwgYWRkcmVzc19jcml0ZXJpYSwgY3JpdGVyaW9uX3R5cGVzLCBhcmdzLm91dHB1dGZpbGUpCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NjQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKQEAgLTAsMCArMSwzNSBAQAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT09MIDo9IGRvbWFpbkdlbmVyYXRvclBvbGljeS5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT1BMRVZFTF9GSUxFIDo9ICQoUEZXX1RPUExFVkVMX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklBX0ZJTEUgOj0gJChQRldfQ1JJVEVSSUFfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfVFVOSU5HX0ZJTEUgOj0gJChQRldfVFVOSU5HX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0VERF9GSUxFUyA6PSAkKFBGV19FRERfRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0RPTUFJTl9GSUxFUyA6PSAkKFBGV19ET01BSU5fRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1NDSEVNQVNfRElSIDo9ICQoUEZXX1NDSEVNQVNfRElSKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFBGV19DUklURVJJT05fVFlQRVNfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSBkb21haW5HZW5lcmF0b3JQb2xpY3kucHkKKworCSIkKE1ZX1RPT0wpIiAtLXZhbGlkYXRlIFwKKwkJLS10b3BsZXZlbC1jb25maWcgIiQoTVlfVE9QTEVWRUxfRklMRSkiIFwKKwkJLS1jcml0ZXJpYSAiJChNWV9DUklURVJJQV9GSUxFKSIgXAorCQktLWNyaXRlcmlvbnR5cGVzICIkKE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFKSIgXAorCQktLWluaXRpYWwtc2V0dGluZ3MgJChNWV9UVU5JTkdfRklMRSkgXAorCQktLWFkZC1lZGRzICQoTVlfRUREX0ZJTEVTKSBcCisJCS0tYWRkLWRvbWFpbnMgJChNWV9ET01BSU5fRklMRVMpIFwKKwkJLS1zY2hlbWFzLWRpciAkKE1ZX1NDSEVNQVNfRElSKSA+ICIkQCIKKworCisjIENsZWFyIHZhcmlhYmxlcyBmb3IgZnVydGhlciB1c2UKK1BGV19UT1BMRVZFTF9GSUxFIDo9CitQRldfU1RSVUNUVVJFX0ZJTEVTIDo9CitQRldfQ1JJVEVSSUFfRklMRSA6PQorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9CitQRldfVFVOSU5HX0ZJTEUgOj0KK1BGV19FRERfRklMRVMgOj0KK1BGV19ET01BSU5fRklMRVMgOj0KK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzkyOTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKQEAgLTAsMCArMSwyNjggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMKKyMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IEVkZFBhcnNlcgorZnJvbSBQRldTY3JpcHRHZW5lcmF0b3IgaW1wb3J0IFBmd1NjcmlwdFRyYW5zbGF0b3IKK2ltcG9ydCBob3N0Q29uZmlnCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCisKKyMKKyMgSW4gb3JkZXIgdG8gYnVpbGQgdGhlIFhNTCBTZXR0aW5ncyBmaWxlIGF0IGJ1aWxkIHRpbWUsIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjIHNoYWxsIGJlIHN0YXJ0ZWQgYW5kIGZlZCB3aXRoIGFsbCB0aGUgY3JpdGVyaW9uIHR5cGVzL2NyaXRlcmlhIHRoYXQgd2lsbCBiZSB1c2VkIGJ5CisjIHRoZSBlbmdpbmVjb25maWd1cmFibGUuCisjIFRoaXMgc2NyaXB0cyBhbGxvd3MgZ2VuZXJhdGVzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBzYW1lIGF1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwgLworIyBhdWRpb19jcml0ZXJpYS54bWwgZmlsZXMgdXNlZCBhdCBydW4gdGltZSBieSB0aGUgZW5naW5lY29uZmlndXJhYmxlCisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBTZXR0aW5ncyBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS10b3BsZXZlbC1jb25maWcnLAorICAgICAgICAgICAgaGVscD0iVG9wLWxldmVsIHBhcmFtZXRlci1mcmFtZXdvcmsgY29uZmlndXJhdGlvbiBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlRPUExFVkVMX0NPTkZJR19GSUxFIiwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpYScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpYSBmaWxlLCBpbiBYTUwgZm9ybWF0OiBcCisgICAgICAgICAgICAgICAgICBpbiAnPGNyaXRlcmlhPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb24gbmFtZT0iIiB0eXBlPSIiLz4gXAorICAgICAgICAgICAgICAgICAgICAgIDwvY3JpdGVyaWE+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJQV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpb250eXBlcycsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgWE1MIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPiBcCisgICAgICAgICAgICAgPC9jcml0ZXJpb25fdHlwZXM+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJT05fVFlQRV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW5pdGlhbC1zZXR0aW5ncycsCisgICAgICAgICAgICBoZWxwPSJJbml0aWFsIFhNTCBzZXR0aW5ncyBmaWxlIChjb250YWluaW5nIGEgXAorICAgICAgICA8Q29uZmlndXJhYmxlRG9tYWlucz4gIHRhZyIsCisgICAgICAgICAgICBuYXJncz0nPycsCisgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfU0VUVElOR1NfRklMRSIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hZGQtZG9tYWlucycsCisgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIHNpbmdsZSBkb21haW4gZmlsZXMgKGVhY2ggY29udGFpbmluZyBhIHNpbmdsZSBcCisgICAgICAgIDxDb25maWd1cmFibGVEb21haW4+IHRhZyIsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfRE9NQUlOX0ZJTEUiLAorICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgZGVzdD0neG1sX2RvbWFpbl9maWxlcycsCisgICAgICAgICAgICBkZWZhdWx0PVtdKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYWRkLWVkZHMnLAorICAgICAgICAgICAgaGVscD0iTGlzdCBvZiBmaWxlcyBpbiBFREQgc3ludGF4IChha2EgXCIucGZ3XCIgZmlsZXMpIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkVERF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIG5hcmdzPScqJywKKyAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBkZXN0PSdlZGRfZmlsZXMnKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc2NoZW1hcy1kaXInLAorICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IG9mIHBhcmFtZXRlci1mcmFtZXdvcmsgWE1MIFNjaGVtYXMgZm9yIGdlbmVyYXRpb24gXAorICAgICAgICB2YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhcmdldC1zY2hlbWFzLWRpcicsCisgICAgICAgICAgICBoZWxwPSJJZ25vcmVkLiBLZXB0IGZvciByZXRyby1jb21wYXRpYmlsaXR5IikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZhbGlkYXRlJywKKyAgICAgICAgICAgIGhlbHA9IlZhbGlkYXRlIHRoZSBzZXR0aW5ncyBhZ2FpbnN0IFhNTCBzY2hlbWFzIiwKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisjCisjIFBhcnNlcyBhdWRpb19jcml0ZXJpb25fdHlwZXMueG1sIC8gYXVkaW9fY3JpdGVyaWEueG1sIGZpbGVzIHVzZWQgYXQgcnVuIHRpbWUgYnkgdGhlCisjIGVuZ2luZWNvbmZpZ3VyYWJsZSBhbmQgb3V0cHV0cyBhIGRpY3Rpb25uYXJ5IG9mIGNyaXRlcmlhLgorIyBGb3IgZWFjaCBjcml0ZXJpYSwgdGhlIG5hbWUsIHR5cGUgKGFrYSBpbmNsdXNpdmUgKGJpdGZpZWxkKSBvciBleGNsdXNpdmUgKGVudW0pLCB0aGUgdmFsdWVzCisjIGFyZSBwcm92aWRlZC4KKyMKK2RlZiBwYXJzZUNyaXRlcmlhQW5kQ3JpdGVyaW9uVHlwZXMoY3JpdGVyaWFGaWxlLCBjcml0ZXJpb25UeXBlc0ZpbGUpOgorICAgICMgUGFyc2UgY3JpdGVyaWEgYW5kIGNyaXRlcmlvbiB0eXBlcyBYTUwgZmlsZXMKKyAgICAjCisgICAgY3JpdGVyaWFfdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlhRmlsZSkKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpYUZpbGUge30iLmZvcm1hdChjcml0ZXJpYUZpbGUpKQorICAgIGNyaXRlcmlvbl90eXBlc190cmVlID0gRVQucGFyc2UoY3JpdGVyaW9uVHlwZXNGaWxlKQorICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCisKKyAgICBjcml0ZXJpYV9yb290ID0gY3JpdGVyaWFfdHJlZS5nZXRyb290KCkKKyAgICBjcml0ZXJpb25fdHlwZXNfcm9vdCA9IGNyaXRlcmlvbl90eXBlc190cmVlLmdldHJvb3QoKQorCisgICAgYWxsX2NyaXRlcmlhID0gW10KKyAgICBmb3IgY3JpdGVyaW9uIGluIGNyaXRlcmlhX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uJyk6CisgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uLmdldCgnbmFtZScpCisgICAgICAgIHR5cGVfbmFtZSA9IGNyaXRlcmlvbi5nZXQoJ3R5cGUnKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgdHlwZV9uYW1lIHt9Ii5mb3JtYXQodHlwZV9uYW1lKSkKKworICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGVzIGluIGNyaXRlcmlvbl90eXBlc190cmVlLmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CisgICAgICAgICAgICBjcml0ZXJpb25fdHlwZV9uYW1lID0gY3JpdGVyaW9uX3R5cGVzLmdldCgnbmFtZScpCisgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZV9uYW1lID09IHR5cGVfbmFtZToKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25faW5jbHVzaXZlbmVzcyA9IGNyaXRlcmlvbl90eXBlcy5nZXQoJ3R5cGUnKQorCisgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcyA9IFtdCisKKyAgICAgICAgICAgICAgICB2YWx1ZXNfbm9kZSA9IGNyaXRlcmlvbl90eXBlcy5maW5kKCd2YWx1ZXMnKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlc19ub2RlOgorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzX25vZGUuZmluZGFsbCgndmFsdWUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKHZhbHVlLmdldCgnbGl0ZXJhbCcpKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGNyaXRlcmlvbl92YWx1ZXMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKCcnKQorCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3R5cGVfbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl90eXBlX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3MpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl92YWx1ZXMge30iLmZvcm1hdChjcml0ZXJpb25fdmFsdWVzKSkKKworICAgICAgICAgICAgICAgIGFsbF9jcml0ZXJpYS5hcHBlbmQoeworICAgICAgICAgICAgICAgICAgICAibmFtZSIgOiBjcml0ZXJpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImluY2x1c2l2ZSIgOiBjcml0ZXJpb25faW5jbHVzaXZlbmVzcywKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIgOiBjcml0ZXJpb25fdmFsdWVzfSkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgcmV0dXJuIGFsbF9jcml0ZXJpYQorCisjCisjIFBhcnNlcyB0aGUgRWRkIGZpbGVzIChha2EgLnBmdyBleHRlbnNpb24gZmlsZSksIHdoaWNoIGlzIGEgc2ltcGxpZmllZCBsYW5ndWFnZSB0byB3cml0ZSB0aGUKKyMgcGFyYW1ldGVyIGZyYW1ld29yayBzZXR0aW5ncy4KKyMKK2RlZiBwYXJzZUVkZChFRERGaWxlcyk6CisgICAgcGFyc2VkX2VkZHMgPSBbXQorCisgICAgZm9yIGVkZF9maWxlIGluIEVEREZpbGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByb290ID0gRWRkUGFyc2VyLlBhcnNlcigpLnBhcnNlKGVkZF9maWxlKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15U3ludGF4RXJyb3IgYXMgZXg6CisgICAgICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKHN0cihleCkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkVYSVQgT04gRkFJTFVSRSIpCisgICAgICAgICAgICBleGl0KDIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdC5wcm9wYWdhdGUoKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15UHJvcGFnYXRpb25FcnJvciwgZXggOgorICAgICAgICAgICAgbG9nZ2luZy5jcml0aWNhbChzdHIoZXgpKQorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJFWElUIE9OIEZBSUxVUkUiKQorICAgICAgICAgICAgZXhpdCgxKQorCisgICAgICAgIHBhcnNlZF9lZGRzLmFwcGVuZCgoZWRkX2ZpbGUubmFtZSwgcm9vdCkpCisgICAgcmV0dXJuIHBhcnNlZF9lZGRzCisKKyMKKyMgR2VuZXJhdGVzIGFsbCB0aGUgcmVxdWlyZWQgY29tbWFuZHMgdG8gYmUgc2VudCB0byB0aGUgaW5zdGFuY2Ugb2YgcGFyYW1ldGVyLWZyYW1ld29yayBsYXVuY2hlZAorIyBhdCBydW50aW1lIHRvIGdlbmVyYXRlIHRoZSBYTUwgU2V0dGluZ3MgZmlsZS4KKyMgSXQgdGFrZXMgYXMgaW5wdXQgdGhlIGNvbGxlY3Rpb24gb2YgY3JpdGVyaWEsIHRoZSBkb21haW5zIGFuZCB0aGUgc2ltcGxpZmllZCBzZXR0aW5ncyByZWFkIGZyb20KKyMgcGZ3LgorIworZGVmIGdlbmVyYXRlRG9tYWluQ29tbWFuZHMobG9nZ2luZywgYWxsX2NyaXRlcmlhLCBpbml0aWFsX3NldHRpbmdzLCB4bWxfZG9tYWluX2ZpbGVzLCBwYXJzZWRfZWRkcyk6CisgICAgICAgICMgY3JlYXRlIGFuZCBpbmplY3QgYWxsIHRoZSBjcml0ZXJpYQorICAgICAgICBsb2dnaW5nLmluZm8oIkNyZWF0aW5nIGFsbCBjcml0ZXJpYSIpCisgICAgICAgIGZvciBjcml0ZXJpb24gaW4gYWxsX2NyaXRlcmlhOgorICAgICAgICAgICAgeWllbGQgWyJjcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24iLCBjcml0ZXJpb25bJ2luY2x1c2l2ZSddLAorICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblsnbmFtZSddXSArIGNyaXRlcmlvblsndmFsdWVzJ10KKworICAgICAgICB5aWVsZCBbInN0YXJ0Il0KKworICAgICAgICAjIEltcG9ydCBpbml0aWFsIHNldHRpbmdzIGZpbGUKKyAgICAgICAgaWYgaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGluaXRpYWwgc2V0dGluZ3MgZmlsZSB7fSIuZm9ybWF0KGluaXRpYWxfc2V0dGluZ3MpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5zV2l0aFNldHRpbmdzWE1MIiwgaW5pdGlhbF9zZXR0aW5nc10KKworICAgICAgICAjIEltcG9ydCBlYWNoIHN0YW5kYWxvbmUgZG9tYWluIGZpbGVzCisgICAgICAgIGZvciBkb21haW5fZmlsZSBpbiB4bWxfZG9tYWluX2ZpbGVzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgc2luZ2xlIGRvbWFpbiBmaWxlIHt9Ii5mb3JtYXQoZG9tYWluX2ZpbGUpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5XaXRoU2V0dGluZ3NYTUwiLCBkb21haW5fZmlsZV0KKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBzY3JpcHQgZm9yIGVhY2ggRUREIGZpbGUKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBwYXJzZWRfZWRkIGluIHBhcnNlZF9lZGRzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUcmFuc2xhdGluZyBhbmQgaW5qZWN0aW5nIEVERCBmaWxlIHt9Ii5mb3JtYXQoZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJhbnNsYXRvciA9IFBmd1NjcmlwdFRyYW5zbGF0b3IoKQorICAgICAgICAgICAgcGFyc2VkX2VkZC50cmFuc2xhdGUodHJhbnNsYXRvcikKKyAgICAgICAgICAgIGZvciBjb21tYW5kIGluIHRyYW5zbGF0b3IuZ2V0U2NyaXB0KCk6CisgICAgICAgICAgICAgICAgeWllbGQgY29tbWFuZAorCisjCisjIEVudHJ5IHBvaW50IG9mIHRoZSBkb21haW4gZ2VuZXJhdG9yLgorIyAgICAgICAtUGFyc2VzIENyaXRlcmlvbiB0eXBlcyBhbmQgY3JpdGVyaWEgZmlsZXMKKyMgICAgICAgLVBhcnNlcyBzZXR0aW5ncyB3cml0dGVuIGluIHNpbXBsaWZpZWQgcGZ3IGxhbmd1YWdlLgorIyAgICAgICAtTGF1bmNoZXMgYSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjICAgICAgIC1UcmFuc2xhdGVzIHRoZSBzZXR0aW5ncyBpbnRvIGNvbW1hbmQgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYnkgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgICAgICAgLVVzZSB0aGUgZXhwb3J0cyBjb21tYW5kIGFuZCBvdXRwdXQgdGhlbSBpbiBYTUwgU2V0dGluZ3MgZmlsZS4KKyMKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIGFsbF9jcml0ZXJpYSA9IHBhcnNlQ3JpdGVyaWFBbmRDcml0ZXJpb25UeXBlcyhhcmdzLmNyaXRlcmlhLCBhcmdzLmNyaXRlcmlvbnR5cGVzKQorCisgICAgIworICAgICMgRUREIGZpbGVzIChha2EgIi5wZnciIGZpbGVzKQorICAgICMKKyAgICBwYXJzZWRfZWRkcyA9IHBhcnNlRWRkKGFyZ3MuZWRkX2ZpbGVzKQorCisgICAgIyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgdG9wbGV2ZWwgY29uZmlndXJhdGlvbiBmaWxlIHRvIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzCisgICAgIyBiZXR3ZWVuIGRldmVsb3BtZW50IHNldHVwIGFuZCB0YXJnZXQgKGluc3RhbGxhdGlvbikgc2V0dXAsIGluIHBhcnRpY3VsYXIsIHRoZQorICAgICMgVHVuaW5nTXdpdGggb2RlIG11c3QgYmUgZW5mb3JjZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3aWxsIGJlIGFsbG93ZWQgb24gdGhlIHRhcmdldAorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKG1vZGU9J3cnLCBkZWxldGU9RmFsc2UsIHN1ZmZpeD0iLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSJUTVBkb21haW5HZW5lcmF0b3JQRkNvbmZpZ18iKQorCisgICAgaW5zdGFsbF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoYXJncy50b3BsZXZlbF9jb25maWcpKQorICAgIGhvc3RDb25maWcuY29uZmlndXJlKAorICAgICAgICAgICAgaW5maWxlPWFyZ3MudG9wbGV2ZWxfY29uZmlnLAorICAgICAgICAgICAgb3V0ZmlsZT1mYWtlX3RvcGxldmVsX2NvbmZpZywKKyAgICAgICAgICAgIHN0cnVjdFBhdGg9aW5zdGFsbF9wYXRoKQorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLmNsb3NlKCkKKworICAgICMgQ3JlYXRlIHRoZSBjb25uZWN0b3IuIFBpcGUgaXRzIGlucHV0IHRvIHVzIGluIG9yZGVyIHRvIHdyaXRlIGNvbW1hbmRzOworICAgICMgY29ubmVjdCBpdHMgb3V0cHV0IHRvIHN0ZG91dCBpbiBvcmRlciB0byBoYXZlIGl0IGR1bXAgdGhlIGRvbWFpbnMKKyAgICAjIHRoZXJlOyBjb25uZWN0IGl0cyBlcnJvciBvdXRwdXQgdG8gc3RkZXJyLgorICAgIGNvbm5lY3RvciA9IHN1YnByb2Nlc3MuUG9wZW4oWyJkb21haW5HZW5lcmF0b3JDb25uZWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2UnIGlmIGFyZ3MudmVyYm9zZSBlbHNlICduby12ZXJib3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRhdGUnIGlmIGFyZ3MudmFsaWRhdGUgZWxzZSAnbm8tdmFsaWRhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2NoZW1hc19kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN5cy5zdGRvdXQsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN5cy5zdGRlcnIpCisKKyAgICBpbml0aWFsX3NldHRpbmdzID0gTm9uZQorICAgIGlmIGFyZ3MuaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgaW5pdGlhbF9zZXR0aW5ncyA9IG9zLnBhdGgucmVhbHBhdGgoYXJncy5pbml0aWFsX3NldHRpbmdzKQorCisgICAgZm9yIGNvbW1hbmQgaW4gZ2VuZXJhdGVEb21haW5Db21tYW5kcyhsb2dnaW5nLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCdcMCcuam9pbihjb21tYW5kKSkKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCJcbiIpCisKKyAgICAjIENsb3NpbmcgdGhlIGNvbm5lY3RvcidzIGlucHV0IHRyaWdnZXJzIHRoZSBkb21haW4gZ2VuZXJhdGlvbgorICAgIGNvbm5lY3Rvci5zdGRpbi5jbG9zZSgpCisgICAgY29ubmVjdG9yLndhaXQoKQorICAgIG9zLnJlbW92ZShmYWtlX3RvcGxldmVsX2NvbmZpZy5uYW1lKQorICAgIHJldHVybiBjb25uZWN0b3IucmV0dXJuY29kZQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBleGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViZGZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKENSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9BTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUgOj0gJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVE9PTCA6PSAkKEhPU1RfT1VUKS9iaW4vYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKKyAgICAkKENSSVRFUklPTl9UWVBFU19GSUxFKSBcCisgICAgJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCisKKwkiJChNWV9DUklURVJJT05fVE9PTCkiIFwKKwkJLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICIkKE1ZX0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkiIFwKKwkJLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0tb3V0cHV0ZmlsZSAiJChAKSIKKworIyBDbGVhciB2YXJpYWJsZXMgZm9yIGZ1cnRoZXIgdXNlCitDUklURVJJT05fVFlQRVNfRklMRSA6PQorQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9CitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tawppbmRleCAzNmUwZjQyLi5jN2Q4ZDM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTEwLDEzICsxMCwyMiBAQAogICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKKyAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uCiAKLUxPQ0FMX1NSQ19GSUxFUzo9IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlieG1sMgorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtMjgsMTUgKzM3LDMgQEAKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ09ORklHVVJBVElPTiBGSUxFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBzcGVjaWZpYyBtYW5hZ2VtZW50IG9mIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpCi1MT0NBTF9TUkNfRklMRVMgOj0gY29uZmlnLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCmluZGV4IDliMDQ0MmUuLjRiNTc0NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgIlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCIKICNpbmNsdWRlIDxQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3Rvci5oPgogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UuaD4KQEAgLTU2LDE1ICs1NSwzNyBAQAogICAgIH0KIH07CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwogCi1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lID0KICAgICAiL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lID0KKyAgICAiL3ZlbmRvci9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lID0gIlRlbGVwaG9ueU1vZGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiOworCisvKioKKyAqIE9yZGVyIE1VU1QgYmUgYWxpZ24gd2l0aCBkZWZpbnRpaW9uIG9mIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB3aXRoaW4gYXVkaW9fcG9saWN5LmgKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdGb3JjZVVzZUNyaXRlcmlvblRhZ1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPQoreworICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID0gICAgICAgICJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9ICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvck1lZGlhIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JSZWNvcmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10gPSAgICAgICJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIgorfTsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4ge307CkBAIC03NSwxOCArOTYsNDMgQEAKICAgICA6IG1QZndDb25uZWN0b3JMb2dnZXIobmV3IFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyKQogewogICAgIC8vIENvbm5lY3RvcgotICAgIG1QZndDb25uZWN0b3IgPSBuZXcgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yKG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lKTsKKyAgICBpZiAoYWNjZXNzKG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUsIFJfT0spID09IDApIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworICAgIH0KIAogICAgIC8vIExvZ2dlcgogICAgIG1QZndDb25uZWN0b3ItPnNldExvZ2dlcihtUGZ3Q29ubmVjdG9yTG9nZ2VyKTsKK30KIAotICAgIC8vIExvYWQgY3JpdGVyaWEgZmlsZQotICAgIGlmICgobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSAmJgotICAgICAgICAobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5laXRoZXIgdmVuZG9yIGNvbmYgZmlsZSAoJXMpIG5vciBzeXN0ZW0gY29uZiBmaWxlICglcykgY291bGQgYmUgZm91bmQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoLAotICAgICAgICAgICAgICBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCk7CitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzSW5jbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVBhaXJzIHBhaXJzLCBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG5vdCBpc1N0YXJ0ZWQoKSwgIkNhbm5vdCBhZGQgYSBjcml0ZXJpb24gaWYgUEZXIGlzIGFscmVhZHkgc3RhcnRlZCIpOworICAgIGF1dG8gY3JpdGVyaW9uVHlwZSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOworCisgICAgZm9yIChhdXRvIHBhaXIgOiBwYWlycykgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgcGFpciAlZCwlcyBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgcGFpci5maXJzdCwKKyAgICAgICAgICAgICAgcGFpci5zZWNvbmQuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kLCBlcnJvcik7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKG5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKKyAgICAgICAgICAgICAgICAiJXM6IENyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOworCisgICAgYXV0byBjcml0ZXJpb24gPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24obmFtZSwgY3JpdGVyaW9uVHlwZSk7CisgICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOworCisgICAgaWYgKG5vdCBkZWZhdWx0VmFsdWUuZW1wdHkoKSkgeworICAgICAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOworICAgICAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRlZmF1bHRWYWx1ZS5jX3N0cigpLCBudW1lcmljYWxWYWx1ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShudW1lcmljYWxWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6On5QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCkBAIC0xMTIsMTEyICsxNTgsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlKGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlvblR5cGVzLmZpbmQodHlwZU5hbWUpID09IG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uVHlwZSAlcyBhbHJlYWR5IGFkZGVkIiwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgQUxPR0QoIiVzOiBBZGRpbmcgbmV3IGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGVOYW1lLmNfc3RyKCkpOwotCi0gICAgbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKAotICAgIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCi0gICAgdWludDMyX3QgbnVtZXJpY1ZhbHVlLAotICAgIGNvbnN0IHN0cmluZyAmbGl0ZXJhbFZhbHVlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSAhPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgJXMgbm90IGZvdW5kIiwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgQUxPR1YoIiVzOiBBZGRpbmcgbmV3IHZhbHVlIHBhaXIgKCVkLCVzKSBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBudW1lcmljVmFsdWUsIGxpdGVyYWxWYWx1ZS5jX3N0cigpLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqY3JpdGVyaW9uVHlwZSA9IG1Qb2xpY3lDcml0ZXJpb25UeXBlc1t0eXBlTmFtZV07Ci0gICAgc3RkOjpzdHJpbmcgZXJyb3I7Ci0gICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLCBlcnJvcik7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlOwotICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0KLSAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnR5cGVOYW1lID0gbm9kZS0+bmFtZTsKLSAgICAgICAgY2hhciAqdmFsdWVOYW1lcyA9IHN0cm5kdXAobm9kZS0+dmFsdWUsIHN0cmxlbihub2RlLT52YWx1ZSkpOwotCi0gICAgICAgIGFkZENyaXRlcmlvblR5cGUodHlwZU5hbWUsIGlzSW5jbHVzaXZlKTsKLQotICAgICAgICB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgICAgIGNoYXIgKmN0eDsKLSAgICAgICAgY2hhciAqdmFsdWVOYW1lID0gc3RydG9rX3IodmFsdWVOYW1lcywgIiwiLCAmY3R4KTsKLSAgICAgICAgd2hpbGUgKHZhbHVlTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoc3RybGVuKHZhbHVlTmFtZSkgIT0gMCkgewotCi0gICAgICAgICAgICAgICAgLy8gQ29uZiBmaWxlIG1heSB1c2Ugb3Igbm90IHBhaXIsIGlmIG5vIHBhaXIsIHVzZSBpbmNyZW1lbnRhbCBpbmRleCwgZWxzZQotICAgICAgICAgICAgICAgIC8vIHVzZSBwcm92aWRlZCBpbmRleC4KLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHZhbHVlTmFtZSwgJzonKSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlyc3QgPSBzdHJ0b2sodmFsdWVOYW1lLCAiOiIpOwotICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNvbmQgPSBzdHJ0b2soTlVMTCwgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGZpcnN0ICE9IE5VTEwpICYmIChzdHJsZW4oZmlyc3QpICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgIT0gTlVMTCkgJiYgKHN0cmxlbihzZWNvbmQpICE9IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBwYWlyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG88c3RyaW5nLCB1aW50MzJfdD4oZmlyc3QsIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGluZGV4KCVzKSBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIGluZGV4LCBzZWNvbmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGZ3SW5kZXggPSBpc0luY2x1c2l2ZSA/IDEgPDwgaW5kZXggOiBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgcGZ3SW5kZXgsIHZhbHVlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWVOYW1lID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmY3R4KTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHZhbHVlTmFtZXMpOwotICAgIH0KLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIGZhbHNlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0cmluZyAmdHlwZSkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLQotICAgICAgICBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdEZWZhdWx0VGFnKSB7Ci0gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBub2RlLT52YWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ1R5cGVUYWcpIHsKLSAgICAgICAgICAgIHR5cGUgPSBub2RlLT52YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCAlcyAlcyBub2RlIiwgX19GVU5DVElPTl9fLCBub2RlLT5uYW1lLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogVCAqUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEVsZW1lbnQoY29uc3Qgc3RyaW5nICZuYW1lLCBzdGQ6Om1hcDxzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKQogewpAQCAtMjM2LDk3ICsxNzYsNiBAQAogICAgIHJldHVybiBpdCAhPSBlbGVtZW50c01hcC5lbmQoKSA/IGl0LT5zZWNvbmQgOiBOVUxMOwogfQogCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IG5vIGluY2x1c2l2ZSBjcml0ZXJpYSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLSAgICAgICAgbG9hZENyaXRlcmlvbihub2RlKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvbihjb25zdCBzdHJpbmcgJm5hbWUsIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQobmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAotICAgICAgICAgICAgICAgICJSb3V0ZSBDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIG5hbWUuY19zdHIoKSk7Ci0KLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqY3JpdGVyaW9uVHlwZSA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlPih0eXBlTmFtZSwgbVBvbGljeUNyaXRlcmlvblR5cGVzKTsKLQotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24obmFtZSwgY3JpdGVyaW9uVHlwZSk7Ci0KLSAgICBtUG9saWN5Q3JpdGVyaWFbbmFtZV0gPSBjcml0ZXJpb247Ci0gICAgaW50IG51bWVyaWNhbFZhbHVlID0gMDsKLSAgICBpZiAoIWNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSwgIG51bWVyaWNhbFZhbHVlKSkgewotICAgICAgICBBTE9HRSgiJXM7IHRyeWluZyB0byBhcHBseSBpbnZhbGlkIGRlZmF1bHQgbGl0ZXJhbCB2YWx1ZSAoJXMpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBkZWZhdWx0TGl0ZXJhbFZhbHVlLmNfc3RyKCkpOwotICAgIH0KLSAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG51bWVyaWNhbFZhbHVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlvbihjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjb25zdCBjaGFyICpjcml0ZXJpb25OYW1lID0gcm9vdC0+bmFtZTsKLQotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKGNyaXRlcmlvbk5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBjcml0ZXJpb25OYW1lKTsKLQotICAgIHN0cmluZyBwYXJhbUtleU5hbWUgPSAiIjsKLSAgICBzdHJpbmcgcGF0aCA9ICIiOwotICAgIHN0cmluZyB0eXBlTmFtZSA9ICIiOwotICAgIHN0cmluZyBkZWZhdWx0VmFsdWUgPSAiIjsKLQotICAgIHBhcnNlQ2hpbGRyZW4ocm9vdCwgZGVmYXVsdFZhbHVlLCB0eXBlTmFtZSk7Ci0KLSAgICBhZGRDcml0ZXJpb24oY3JpdGVyaW9uTmFtZSwgdHlwZU5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDb25maWcoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnUG9saWN5Q29uZlRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IGZpbmQgbm9kZSBmb3IgcGZ3IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HRCgiJXM6IExvYWRpbmcgY29uZiBmb3IgcGZ3IiwgX19GVU5DVElPTl9fKTsKLSAgICBsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShub2RlKTsKLSAgICBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShub2RlKTsKLSAgICBsb2FkQ3JpdGVyaWEobm9kZSk7Ci19Ci0KLQotc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgQUxPR19BU1NFUlQocGF0aCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlOiBlbXB0eSBwYXRoIik7Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBBTE9HRCgiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJVbmFibGUgdG8gYWxsb2NhdGUgYSBjb25maWd1cmF0aW9uIG5vZGUiKTsKLSAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKLQotICAgIGxvYWRDb25maWcocm9vdCk7Ci0KLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0gICAgQUxPR0QoIiVzOiBsb2FkZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogYm9vbCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6aXNTdGFydGVkKCkKIHsKICAgICByZXR1cm4gbVBmd0Nvbm5lY3RvciAmJiBtUGZ3Q29ubmVjdG9yLT5pc1N0YXJ0ZWQoKTsKQEAgLTMzNSw5ICsxODQsOSBAQAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4obW9kZSkpKSB7CkBAIC0zNTEsOSArMjAwLDkgQEAKIGF1ZGlvX21vZGVfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0CiB7CiAgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9OT1JNQUw7CiAgICAgfQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19tb2RlX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7CkBAIC0zNzAsNyArMjE5LDcgQEAKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0uY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihjb25maWcpKSkgewpAQCAtMzkwLDcgKzIzOSw3IEBACiAgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0pOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgfQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190Pihjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCkpOwpAQCAtNDA0LDEyICsyNTMsNDUgQEAKICAgICByZXR1cm4gaW50ZXJmYWNlLT5nZXRMaXRlcmFsVmFsdWUodmFsdWVUb0NoZWNrLCBsaXRlcmFsVmFsdWUpOwogfQogCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBjcml0ZXJpb25OYW1lID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZEZXNjLT50eXBlKCkpID8KKyAgICAgICAgICAgICAgICBnT3V0cHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWUgOiBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZTsKKworICAgIEFMT0dWKCIlczogZGV2aWNlIHdpdGggYWRkcmVzcyAlcyAlcyIsIF9fRlVOQ1RJT05fXywgZGV2RGVzYy0+YWRkcmVzcygpLnN0cmluZygpLAorICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFPyAiZGlzY29ubmVjdGVkIiA6ICJjb25uZWN0ZWQiKTsKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQorICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihjcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOworCisgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGF1dG8gY3JpdGVyaW9uVHlwZSA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uVHlwZSgpOworICAgIGludCBkZXZpY2VBZGRyZXNzSWQ7CisgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZXZEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCksIGRldmljZUFkZHJlc3NJZCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiB1bmtub3duIGRldmljZSBhZGRyZXNzIHJlcG9ydGVkICglcykiLCBfX0ZVTkNUSU9OX18sIGRldkRlc2MtPmFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICBpbnQgY3VycmVudFZhbHVlTWFzayA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKTsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgY3VycmVudFZhbHVlTWFzayB8PSBkZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjdXJyZW50VmFsdWVNYXNrICY9IH5kZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoY3VycmVudFZhbHVlTWFzayk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKQEAgLTQyMCw5ICszMDIsOSBAQAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ091dHB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShvdXRwdXREZXZpY2VzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZkMTc2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBEZWZpbml0aW9ucyBmb3IgYXVkaW8gcG9saWN5IGNyaXRlcmlhIGNvbmZpZ3VyYXRpb24gZmlsZSAoYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYpICAgLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0vLyAgICAgIEBUT0RPOiBzY3JpcHRlZCBmcm9tIGF1ZGlvLmggJiBhdWRpb19wb2xpY3ksaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoID0KLSAgICAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoID0KLSAgICAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotCi0vKioKLSAqIFBGVyBpbnN0YW5jZXMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQb2xpY3lDb25mVGFnID0gIlBvbGljeSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdEZWZhdWx0VGFnID0gIkRlZmF1bHQiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnVHlwZVRhZyA9ICJUeXBlIjsKLQotLyoqCi0gKiBQRlcgZWxlbWVudHMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkluY2x1c2l2ZUNyaXRlcmlvblR5cGUiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJFeGNsdXNpdmVDcml0ZXJpb25UeXBlIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0NyaXRlcmlvblRhZyA9ICJDcml0ZXJpb24iOwotCi0vKioKLSAqIFBGVyBrbm93biBjcml0ZXJpb24gdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbnB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVJbnB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZU91dHB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZyA9ICJUZWxlcGhvbnlNb2RlIjsKLQotLyoqCi0gKiBPcmRlciBNVVNUIGJlIGFsaWduIHdpdGggZGVmaW50aWlvbiBvZiBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3Qgd2l0aGluIGF1ZGlvX3BvbGljeS5oCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBnRm9yY2VVc2VDcml0ZXJpb25UYWdbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0KLXsKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9ICAgICAgICAiRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPSAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JNZWRpYSIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yUmVjb3JkIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddID0gICAgICAiRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIKLX07Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2Q1YTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBATk9URToKLSMgQXVkaW8gUG9saWN5IENyaXRlcmlhIGZpbGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKLSMKLSMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDcml0ZXJpb24gdHlwZSBFeGFtcGxlOgotIyBGb3IgZWFjaCBjcml0ZXJpb24sIGEgY291cGxlIG9mIG51bWVyaWNhbCwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcm92aWRlZCB0byB0aGUgUEZXLgotIyBUaGUgbnVtZXJpY2FsIHBhcnQgaXMgbm90IG1hbmRhdG9yeS4gSWYgbm90IGZpbGxlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IG51bWVyaWNhbCB2YWx1ZSB3aWxsIGJlCi0jIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYnkgYXVkaW8gSEFMIHVzaW5nIHRoZSBmb2xsb3dpbmcgbG9naWM6Ci0jICAgLSBFeGNsdXNpdmUgY3JpdGVyaW9uOgotIyAgICAgICAgICAqIDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAgICAgIC4uLgotIyAgICAgICAgICAqIE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLgotIyAgIC0gSW5jbHVzaXZlIGNyaXRlcmlvbjoKLSMgICAgICAgICAgKiAxIDw8IDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIDw8IDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICAgICAgLi4uCi0jICAgICAgICAgICogMSA8PCBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZSwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlfEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiAgW251bWVyaWNhbCB2YWx1ZSAxOl08bGl0ZXJhbCB2YWx1ZSAxPixbbnVtZXJpY2FsIHZhbHVlIDI6XTxsaXRlcmFsIHZhbHVlIDI+LDxsaXRlcmFsIHZhbHVlIDM+LC4uLgotIyAgICB9Ci0jIH0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyaXRlcmlvbjoKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBDcml0ZXJpb24gewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiB7Ci0jICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDxDcml0ZXJpb24gdHlwZSBuYW1lPgotIyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICA8ZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uPgotIyAgICAgICAgfQotIyAgICB9Ci0jIH0KLQotUG9saWN5IHsKLSAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSAgICAgICAgIwotICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAjIEFVRElPX0RFVklDRV9PVVRfKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMKLSAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlICAgRWFycGllY2UsU3BlYWtlcixXaXJlZEhlYWRzZXQsV2lyZWRIZWFkcGhvbmUsQmx1ZXRvb3RoU2NvLEJsdWV0b290aFNjb0hlYWRzZXQsQmx1ZXRvb3RoU2NvQ2Fya2l0LEJsdWV0b290aEEyZHAsQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMsQmx1ZXRvb3RoQTJkcFNwZWFrZXIsSGRtaSxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsUmVtb3RlU3VibWl4LFRlbGVwaG9ueVR4LExpbmUsSGRtaUFyYyxTcGRpZixGbSxBdXhMaW5lLFNwZWFrZXJTYWZlCi0gICAgICAgICMKLSAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgIyBBVURJT19ERVZJQ0VfSU5fKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMgTm90ZSBhbHNvIHRoYXQgZGlyZWN0aW9uIGJpdCB3aWxsIGJlIGRlY2ltYXRlZCBieSBBdWRpb0hBTCBpbiBvcmRlciB0byBhbGxvdyB1c2luZyBhIG1hc2sKLSAgICAgICAgIyB3aXRoIHRoZSBjYXJkaW5hbGl0eSBvZiAxIGJldHdlZW4gYSBiaXQgYW5kIGFuIGlucHV0IGRldmljZS4KLSAgICAgICAgIwotICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZSAgICBDb21tdW5pY2F0aW9uLEFtYmllbnQsQnVpbHRpbk1pYyxCbHVldG9vdGhTY29IZWFkc2V0LFdpcmVkSGVhZHNldCxIZG1pLFRlbGVwaG9ueVJ4LEJhY2tNaWMsUmVtb3RlU3VibWl4LEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxGbVR1bmVyLFR2VHVuZSxMaW5lLFNwZGlmLEJsdWV0b290aEEyZHAsTG9vcGJhY2sKLSAgICB9Ci0gICAgRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhdWRpb19tb2RlX3QKLSAgICAgICAgIyBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgQW5kcm9pZE1vZGVUeXBlICAgICAwOk5vcm1hbCwxOlJpbmdUb25lLDI6SW5DYWxsLDM6SW5Db21tdW5pY2F0aW9uCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMzpGb3JjZUJ0U2NvCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlICAgICAgICAgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMjpGb3JjZUhlYWRwaG9uZXMsNDpGb3JjZUJ0QTJkcCw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrLDEwOkZvcmNlTm9CdEEyZHAKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwzOkZvcmNlQnRTY28sNTpGb3JjZVdpcmVkQWNjZXNzb3J5Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUgICAgICAgICAgICAgMDpGb3JjZU5vbmUsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDY6Rm9yY2VCdENhckRvY2ssNzpGb3JjZUJ0RGVza0RvY2ssODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMTE6Rm9yY2VTeXN0ZW1FbmZvcmNlZAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUgIDA6Rm9yY2VOb25lLDEyOkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW9fcG9saWN5LmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUgIDA6Rm9yY2VOb25lLDEzOkZvcmNlRW5jb2RlZFN1cnJvdW5kTmV2ZXIsMTQ6Rm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMKLSAgICB9Ci0KLSAgICBDcml0ZXJpb24gewotICAgICAgICBBdmFpbGFibGVJbnB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQotICAgICAgICB9Ci0gICAgICAgIEF2YWlsYWJsZU91dHB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIE91dHB1dERldmljZXNNYXNrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKLSAgICAgICAgfQotICAgICAgICBUZWxlcGhvbnlNb2RlIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBbmRyb2lkTW9kZVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBOb3JtYWwKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvck1lZGlhIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvck1lZGlhVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckRvY2sgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvclN5c3RlbSB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCmluZGV4IDRjMWFjZmUuLjViZmFkMjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPEh3TW9kdWxlLmg+CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SV0xvY2suaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMjcsMjcgKzMyLDIwIEBACiAKIGNsYXNzIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcjsKIGNsYXNzIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U7Ci1jbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZTsKIHN0cnVjdCBjbm9kZTsKIAogY2xhc3MgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXI7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKIAogY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIKIHsKIHByaXZhdGU6Ci0gICAgdHlwZWRlZiBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyICo+IENyaXRlcmlvblR5cGVWYWx1ZVBhaXI7Ci0KLSAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICo+IENyaXRlcmlvbkNvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKj4gQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25Db2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25NYXBJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIENyaXRlcmlvbk1hcENvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6aXRlcmF0b3IgQ3JpdGVyaW9uVHlwZU1hcEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIENyaXRlcmlhVHlwZU1hcENvbnN0SXRlcmF0b3I7CisgICAgdXNpbmcgQ3JpdGVyaWEgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqPjsKIAogcHVibGljOgogICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CkBAIC0xMjAsNiArMTE4LDIwIEBACiAgICAgICovCiAgICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcyk7CiAKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBhZGRDcml0ZXJpb24gdG8gdGhlIHBvbGljeSBwZncKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgY3JpdGVyaW9uCisgICAgICogQHBhcmFtIGlzSW5jbHVzaXZlIGlmIHRydWUsIGluY2x1c2l2ZSwgaWYgZmFsc2UgZXhjbHVzaXZlIGNyaXRlcmlvbiB0eXBlCisgICAgICogQHBhcmFtIHBhaXJzIG9mIG51bWVyaWNhbC9saXRlcmFsIHZhbHVlcyBvZiB0aGUgY3JpdGVyaW9uCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBwcm92aWRlZCBhcyBsaXRlcmFsLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNJbmNsdXNpdmUsIFZhbHVlUGFpcnMgcGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUpOworCiBwcml2YXRlOgogICAgIC8qKgogICAgICAqIEFwcGx5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwbGF0Zm9ybSBvbiB0aGUgcG9saWN5IHBhcmFtZXRlciBtYW5hZ2VyLgpAQCAtMTMzLDk2ICsxNDUsNyBAQAogICAgICAqLwogICAgIHZvaWQgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKIAotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNyaXRlcmlvbiBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHBhdGggQ3JpdGVyaW9uIGNvbmYgZmlsZSBwYXRoLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpcyBwYXJzaW5nIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uIHR5cGUuCi0gICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSBhdHRyaWJ1dGUgb2YgdGhlIGNyaXRlcmlvbiB0eXBlLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdmFsdWUgcGFpciB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIHZhbHVlIHBhaXIgaXMgYWRkZWQgdG8uCi0gICAgICogQHBhcmFtW2luXSBudW1lcmljIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtW2luXSBsaXRlcmFsIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgdWludDMyX3QgbnVtZXJpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWwpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIGNyaXRlcmlvbiBpcyBhc3NvY2lhdGVkIHRvLgotICAgICAqIEBwYXJhbVtpbl0gZGVmYXVsdExpdGVyYWxWYWx1ZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpOwotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBpbmNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaWEgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlhKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIGEgY3JpdGVyaW9uIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlvbiB0eXBlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIHRydWUgaWYgaW5jbHVzaXZlLCBmYWxzZSBpcyBleGNsdXNpdmUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENvbmZpZyhjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY2hpZHJlbiBub2RlIGZyb20gYSBnaXZlbiByb290IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICogQHBhcmFtW291dF0gZGVmYXVsdFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgotICAgICAqIEBwYXJhbVtvdXRdIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCi0gICAgKi8KLSAgICB2b2lkIHBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0ZDo6c3RyaW5nICZ0eXBlKTsKLQotICAgIC8qKgorICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhbiBlbGVtZW50IGZyb20gYSBtYXAgYnkgaXRzIG5hbWUuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFQgdHlwZSBvZiBlbGVtZW50IHRvIHNlYXJjaC4KQEAgLTI2Niw4ICsxODksNyBAQAogCiAgICAgYm9vbCBpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uLCBpbnQgdmFsdWVUb0NoZWNrKTsKIAotICAgIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpb25UeXBlczsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIFR5cGUgbWFwLiAqLwotICAgIENyaXRlcmlvbkNvbGxlY3Rpb24gbVBvbGljeUNyaXRlcmlhOyAvKio8IFBvbGljeSBDcml0ZXJpb24gTWFwLiAqLworICAgIENyaXRlcmlhIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KIAogICAgIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvciAqbVBmd0Nvbm5lY3RvcjsgLyoqPCBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgY29ubmVjdG9yLiAqLwogICAgIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyICptUGZ3Q29ubmVjdG9yTG9nZ2VyOyAvKio8IFBvbGljeSBQRlcgbG9nZ2VyLiAqLwpAQCAtMjg0LDYgKzIwNiw3IEBACiAgICAgc3RydWN0IHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkOwogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lOyAvKio8IERlZmF1bHQgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWU7IC8qKjwgVmVuZG9yIFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKaW5kZXggODM3ZDViYi4uZWJmMzgzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpAQCAtOCwxMCArOCwxMyBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICBzcmMvRW5naW5lLmNwcCBcCiAgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCisgICAgLi4vZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcCBcCisgICAgLi4vZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwCiAKIGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZQorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCiBMT0NBTF9DRkxBR1MgKz0gXAogICAgIC1XYWxsIFwKQEAgLTI2LDggKzI5LDcgQEAKICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJpb25pYykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmlvbmljKQogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCkBAIC0zNywxMiArMzksMTkgQEAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbGliYmFzZV9oZWFkZXJzCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlibG9nIFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlnIFwKKyAgICBsaWJhdWRpb3BvbGljeQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmVlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2RlZmF1bHQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbl9waG9uZS54bWwKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFX1NURU0pCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzX3Bob25lLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llc19waG9uZS54bWwKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgIyBpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9kZWZhdWx0KQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTMzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisKKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTZkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERlZmF1bHQgVm9sdW1lIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBGdWxsIERlZmF1bHQgVm9sdW1lIHRhYmxlIGZvciBhbGwgZGV2aWNlIGNhdGVnb3J5IC0tPgorPHZvbHVtZXM+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBGdWxsIFNjYWxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iU0lMRU5UX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgIDxwb2ludD4wLC05NjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtOTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBTeXN0ZW0gcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTI0MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTE4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTEyMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC02MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBNZWRpYSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgTWVkaWEgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00NjgwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjQyLC0yMDcwPC9wb2ludD4KKyAgICAgICAgPHBvaW50Pjg1LC01NDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tIE5vbi1tdXRhYmxlIGRlZmF1bHQgdm9sdW1lIGN1cnZlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBmaXJzdCBwb2ludCBpcyBhbHdheXMgZm9yIGluZGV4IDAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogYXR0ZW51YXRpb24gaXMgc21hbGwgZW5vdWdoIHRoYXQgc3RyZWFtIGNhbiBzdGlsbCBiZSBoZWFyZCAtLT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICAgICBiYXNlZCBvbiBERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIGZvciBoZWFkc2V0IC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBTcGVha2VyIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+Cis8L3ZvbHVtZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTg3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDExMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKworICAgIDwhLS0gImhpZGRlbiBzdHJhdGVnaWVzIiBsaWtlIFRUUywgZW5mb3JjZWQgYXVkaWJsZToKKyAgICAgICAgICAgIFNoYWxsIHdlIGV4cG9zZSB0aGVtIGhlcmUgb3Iga2VlcCBpdCBoYXJkIGNvZGVkIC0tPgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBmb3IgZW5mb3JjZWQgc3lzdGVtIHNvdW5kcyBpbiBjZXJ0YWluCisgICAgICAgICBjb3VudHJpZXMgKGUuZy4gY2FtZXJhIGluIEphcGFuKQorICAgICAgICAgVGhpcyBzdHJhdGVneSB3aWxsIG9ubHkgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBwaG9uZSBpZiBmb3JjZSBmb3Igc3lzdGVtIGlzIHNldCB0bworICAgICAgICAgZW5mb3JjZWQuIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QSE9ORSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIHZvbHVtZUdyb3VwPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgdm9sdW1lR3JvdXA9ImJsdWV0b290aF9zY28iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19TQ08iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUklORyIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9ImFsYXJtIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FMQVJNIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiB2b2x1bWVHcm91cD0iZW5mb3JjZWRfYXVkaWJsZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfQUNDRVNTSUJJTElUWSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiIHZvbHVtZUdyb3VwPSJhY2Nlc3NpYmlsaXR5Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9Im5vdGlmaWNhdGlvbiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9EVE1GIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fRFRNRiIgdm9sdW1lR3JvdXA9ImR0bWYiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGV4Y2x1c2l2ZWx5IHRyYW5zbWl0dGVkIHRocm91Z2ggdGhlICBzcGVha2VyCisgICAgICAgICAoVFRTKSBvZiB0aGUgZGV2aWNlIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIiB2b2x1bWVHcm91cD0idHRzIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgcmVyb3V0aW5nIG1heSBiZSByZW1vdmVkIGFzIGZvbGxvd2luZyBtZWRpYT8/PyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1JFUk9VVElORyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgdm9sdW1lR3JvdXA9InJlcm91dGluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QQVRDSCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1BBVENIIiB2b2x1bWVHcm91cD0icGF0Y2giPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworCis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdhMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDIzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVm9sdW1lIHNlY3Rpb24gZGVmaW5lcyBhIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5LgorSXQgY29udGFpbnMgYSBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IgYSBnaXZlbgordm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAuCis8dm9sdW1lIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dm9pY2VfY2FsbDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTkwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTUxMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjU3LC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjUwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+ODUsLTIzMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bXVzaWM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjI1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFsYXJtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ub3RpZmljYXRpb248L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+Ymx1ZXRvb3RoX3NjbzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmVuZm9yY2VkX2F1ZGlibGU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTM0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIwMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWNjZXNzaWJpbGl0eTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJlcm91dGluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnBhdGNoPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAppbmRleCBlODZhZTVmLi5mMTkxNzM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzgsNjAgKzM5LDMzIEBACiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB7CiAKK3N0cnVjdCBsZWdhY3lfc3RyYXRlZ3lfbWFwIHsgY29uc3QgY2hhciAqbmFtZTsgbGVnYWN5X3N0cmF0ZWd5IGlkOyB9Oworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGxlZ2FjeV9zdHJhdGVneV9tYXA+IGdMZWdhY3lTdHJhdGVneSA9IHsKKyAgICB7ICJTVFJBVEVHWV9OT05FIiwgU1RSQVRFR1lfTk9ORSB9LAorICAgIHsgIlNUUkFURUdZX01FRElBIiwgU1RSQVRFR1lfTUVESUEgfSwKKyAgICB7ICJTVFJBVEVHWV9QSE9ORSIsIFNUUkFURUdZX1BIT05FIH0sCisgICAgeyAiU1RSQVRFR1lfU09OSUZJQ0FUSU9OIiwgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIH0sCisgICAgeyAiU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCB9LAorICAgIHsgIlNUUkFURUdZX0RUTUYiLCBTVFJBVEVHWV9EVE1GIH0sCisgICAgeyAiU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSIsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgfSwKKyAgICB7ICJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiLCBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIgfSwKKyAgICB7ICJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIiwgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSB9LAorICAgIHsgIlNUUkFURUdZX1JFUk9VVElORyIsIFNUUkFURUdZX1JFUk9VVElORyB9LAorICAgIHsgIlNUUkFURUdZX1BBVENIIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sIC8vIGJvaWxlciB0byBtYW5hZ2Ugc3RyZWFtIHBhdGNoIHZvbHVtZQorfTsKKwogRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpKyspIHsKLSAgICAgICAgbUZvcmNlVXNlW2ldID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgYXV0byByZXN1bHQgPSBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLAorICAgICAgICAgICAgICJQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYXRpb24gaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJXp1IGVsZW1lbnRzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogZ0xlZ2FjeVN0cmF0ZWd5KSB7CisgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcFtnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoc3RyYXRlZ3kubmFtZSldID0gc3RyYXRlZ3kuaWQ7CiAgICAgfQogfQogCi1FbmdpbmU6On5FbmdpbmUoKQotewotfQotCi12b2lkIEVuZ2luZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotewotICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7Ci0gICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLXN0YXR1c190IEVuZ2luZTo6aW5pdENoZWNrKCkKLXsKLSAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKSA/ICBOT19FUlJPUiA6IE5PX0lOSVQ7Ci19Ci0KLXN0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCi17Ci0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKLQotICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKLSAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKLSAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93Ci0gICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7Ci0gICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKLQotICAgIGlmICghaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRWb2x1bWVDdXJ2ZXMoKS5zd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fRFRNRik7Ci0gICAgfSBlbHNlIGlmIChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiAhaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fRFRNRik7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQogewogICAgIHN3aXRjaCh1c2FnZSkgewpAQCAtMTAxLDcgKzc1LDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKQEAgLTExMiw3ICs4NSw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCkBAIC0xMjAsNyArOTIsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCkBAIC0xMzAsMjEgKzEwMSwxOCBAQAogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0spIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfRE9DSyIsIGNvbmZpZyk7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU86CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBIRE1JX1NZU1RFTV9BVURJTyIsIGNvbmZpZyk7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQ6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKQEAgLTE1NCwxMDkgKzEyMiwyNSBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEVOQ09ERURfU1VSUk9VTkQiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1ZJQlJBVEVfUklOR0lORyIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CiAgICAgICAgIGJyZWFrOyAvLyBUT0RPIHJldHVybiBCQURfVkFMVUU/CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CiB9CiAKLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1JFUk9VVElORzsKLSAgICB9Ci19Ci0KLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi17Ci0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAodXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgfQotfQotCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotewotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7Ci0gICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7Ci0KLSAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOwotCi0gICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KHN0cmF0ZWd5LCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsICh1aW50MzJfdClBVURJT19ERVZJQ0VfTk9ORSk7Ci19Ci0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAotICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdAorYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQobGVnYWN5X3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdAogewogICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0KQEAgLTI2OSwxNiArMTUzLDE3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSB7CisgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBib29sIG1lZGlhX2FjdGl2ZV9sb2NhbGx5ID0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCisgICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpOwogICAgICAgICAgICAgLy8gcm91dGluZyBpcyBzYW1lIGFzIG1lZGlhIHdpdGhvdXQgdGhlICJyZW1vdGUiIGRldmljZQogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoU1RSQVRFR1lfTUVESUEsCiAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsCkBAIC0zMTUsMTQgKzIwMCwxNCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBnZXRQcmltYXJ5T3V0cHV0IHJldHVybiBvbmx5IGRldmljZXMgZnJvbSBmaXJzdCBtb2R1bGUgaW4KICAgICAgICAgICAgIC8vIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCwgaGVhcmluZyBhaWQgaXMgbm90IHRoZXJlLCBidXQgaXQncwogICAgICAgICAgICAgLy8gYSBwcmltYXJ5IGRldmljZQogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgb2Ygc29sdmluZyB0aGlzIHByb2JsZW0KICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAocHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkgJgorICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CiAKICAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKQEAgLTMzNCw3ICsyMTksNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5CiAgICAgICAgIC8vIG9yZGVyIG9mIHByaW9yaXR5Ci0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgc3dpdGNoIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwpAQCAtMzUyLDcgKzIzNyw3IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwpAQCAtMzg2LDcgKzI3MSw3IEBACiAgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bwogICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKQEAgLTQxMCw5ICsyOTUsOSBAQAogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CiAKLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSB7CisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZQorICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKQEAgLTQyNyw3ICszMTIsNyBAQAogICAgICAgICAvLyAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKIAogICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CiAKQEAgLTQ0Myw5ICszMjgsOSBAQAogICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFVzZSBPTkxZIEJsdWV0b290aCBTQ08gb3V0cHV0IHdoZW4gcmluZ2luZyBpbiB2aWJyYXRpb24gbW9kZQotICAgICAgICAgICAgaWYgKCEoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgICAgIGlmICghKChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSkgewotICAgICAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddCisgICAgICAgICAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HKQogICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgewogICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlMiAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gZGV2aWNlMjsKQEAgLTQ1NCw3ICszMzksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFVzZSBib3RoIEJsdWV0b290aCBTQ08gYW5kIHBob25lIGRlZmF1bHQgb3V0cHV0IHdoZW4gcmluZ2luZyBpbiBub3JtYWwgbW9kZQotICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKICAgICAgICAgICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKQEAgLTQ3Niw3ICszNjEsNyBAQAogICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJgogICAgICAgICAgICAgICAgICAgICAoQVVESU9fREVWSUNFX09VVF9IRE1JIHwgQVVESU9fREVWSUNFX09VVF9TUERJRiB8IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC00ODQsOSArMzY5LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOwotICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgeworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOworICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CkBAIC01MDcsNyArMzkyLDcgQEAKICAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgewogICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIwIikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIwIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTE3LDExICs0MDIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciBzb2x1dGlvbiB0byBwcmV2ZW50IHJvdXRpbmcgdG8gQlQgaGVhcmluZyBhaWQoYi8xMjI5MzEyNjEpLgorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CiAgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTMyLDcgKzQxOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKKyAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTYxLDcgKzQ0OCw3IEBACiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgeworICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTU4Miw3ICs0NjksNyBAQAogCiAgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSA9PQogICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CkBAIC02MDQsNyArNDkxLDcgQEAKIAogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgQUxPR1YoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBzdHJhdGVneSAlZCIsIHN0cmF0ZWd5KTsKLSAgICAgICAgZGV2aWNlID0gbUFwbU9ic2VydmVyLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKKyAgICAgICAgZGV2aWNlID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CiAgICAgICAgIEFMT0dFX0lGKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSwKICAgICAgICAgICAgICAgICAgImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIpOwogICAgIH0KQEAgLTYxNSw5ICs1MDIsOSBAQAogCiBhdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKIHsKLSAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKLSAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7Ci0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogCiAgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CkBAIC02MzIsNiArNTE5LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC02NTEsNyArNTM5LDcgQEAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CiAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKLSAgICB9IGVsc2UgaWYgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgfSBlbHNlIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCiAgICAgICAgIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CiAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CkBAIC02NzEsMTIgKzU1OSwxMSBAQAogICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCiAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKLSAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCi0gICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSkgewogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CiAgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKQEAgLTcxMCw3ICs1OTcsNyBAQAogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgogICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6Ci0gICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwogICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKQEAgLTczOSwxNiArNjI2LDMyIEBACiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNzY1LDEwICs2NjgsMTA3IEBACiAgICAgcmV0dXJuIGRldmljZTsKIH0KIAordm9pZCBFbmdpbmU6OnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIGF1dG8gZGV2aWNlcyA9IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3ktPmdldElkKCkpOworICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXNbc3RyYXRlZ3ktPmdldElkKCldID0gZGV2aWNlczsKKyAgICAgICAgc3RyYXRlZ3ktPnNldERldmljZVR5cGVzKGRldmljZXMudHlwZXMoKSk7CisgICAgICAgIHN0cmF0ZWd5LT5zZXREZXZpY2VBZGRyZXNzKGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKworICAgIGF1dG8gbGVnYWN5U3RyYXRlZ3kgPSBtTGVnYWN5U3RyYXRlZ3lNYXAuZmluZChzdHJhdGVneSkgIT0gZW5kKG1MZWdhY3lTdHJhdGVneU1hcCkgPworICAgICAgICAgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcC5hdChzdHJhdGVneSkgOiBTVFJBVEVHWV9OT05FOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQobGVnYWN5U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUFVRElPX0RFVklDRV9OT05FKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZXMpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVycmVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGV4cGxpY3Qgcm91dGluZyBkZXZpY2UKKyAgICBpZiAocHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGV4cGxpY2l0IFJvdXRpbmcgb24gZGV2aWNlICVzIiwgX19mdW5jX18sIHByZWZlcnJlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWREZXZpY2UpOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICAvLworICAgIC8vIEBUT0RPOiB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkIGZpcnN0IGFzIGl0IHVzZWQgdG8KKyAgICAvLyBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0cywgc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmcm9tQ2FjaGUpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBFbmdpbmU6OmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKm1peCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZwb2xpY3lNaXhlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbigpOworICAgIGNvbnN0IGF1dG8gJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IGF1dG8gJmlucHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldElucHV0cygpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3M7CisKKyAgICAvLworICAgIC8vIEV4cGxpY2l0IFJvdXRpbmcgPz8/IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQKKyAgICAvLyBmaXJzdCBhcyBpdCB1c2VkIHRvIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXRzLCBhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBwb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtaXgpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGF0dHIuc291cmNlKTsKKworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VUeXBlKSkgeworICAgICAgICBhZGRyZXNzID0gIjAiOworICAgICAgICBzdGQ6OnNpemVfdCBwb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MgeyBhdHRyLnRhZ3MgfTsKKyAgICAgICAgaWYgKChwb3MgPSB0YWdzLmZpbmQoImFkZHI9IikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhZGRyZXNzID0gdGFncy5zdWJzdHIocG9zICsgc3RkOjpzdHJsZW4oImFkZHI9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKwogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKKyAgICByZXR1cm4gdGhpczsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCmluZGV4IDA2MTg2YzEuLmQ4YTM2OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCkBAIC0xNiw3ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCi0KKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgiCiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CkBAIC0yOSwxMTQgKzI5LDY3IEBACiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB7CiAKLWNsYXNzIEVuZ2luZQorZW51bSBsZWdhY3lfc3RyYXRlZ3kgeworICAgIFNUUkFURUdZX05PTkUgPSAtMSwKKyAgICBTVFJBVEVHWV9NRURJQSwKKyAgICBTVFJBVEVHWV9QSE9ORSwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCisgICAgU1RSQVRFR1lfRFRNRiwKKyAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAorICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKKyAgICBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLAorICAgIFNUUkFURUdZX1JFUk9VVElORywKK307CisKK2NsYXNzIEVuZ2luZSA6IHB1YmxpYyBFbmdpbmVCYXNlCiB7CiBwdWJsaWM6CiAgICAgRW5naW5lKCk7Ci0gICAgdmlydHVhbCB+RW5naW5lKCk7CisgICAgdmlydHVhbCB+RW5naW5lKCkgPSBkZWZhdWx0OwogCiAgICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KICAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CiAKIHByaXZhdGU6Ci0gICAgLy8vIEludGVyZmFjZSBtZW1iZXJzCi0gICAgY2xhc3MgTWFuYWdlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgTWFuYWdlckludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorICAgIC8vLworICAgIC8vLyBmcm9tIEVuZ2luZUJhc2UsIHNvIGZyb20gQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgLy8vCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclVzYWdlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAvKmRldkRlc2MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IC8qc3RhdGUqLykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgQXVkaW9NaXggKiptaXggPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KICAgICBFbmdpbmUoY29uc3QgRW5naW5lICZvYmplY3QpOwogICAgIEVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKIAotICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgaW5saW5lIGJvb2wgaXNJbkNhbGwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwobVBob25lU3RhdGUpOwotICAgIH0KLQotICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOwotICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKLSAgICB9CiAgICAgc3RhdHVzX3Qgc2V0RGVmYXVsdERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKLSAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneUludChsZWdhY3lfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3Q7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdDsKLSAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7ICAvKio8IGN1cnJlbnQgcGhvbmUgc3RhdGUuICovCiAKLSAgICAvKiogY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24uICovCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdOworICAgIERldmljZVN0cmF0ZWd5TWFwIG1EZXZpY2VzRm9yU3RyYXRlZ2llczsKIAotICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7CisgICAgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBsZWdhY3lfc3RyYXRlZ3k+IG1MZWdhY3lTdHJhdGVneU1hcDsKIH07CiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGZkNDk0NzMuLmM5NjlhZjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMzgsMjEgKzM4LDIwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPGF1ZGlvX3BvbGljeV9jb25mLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCi0jaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtNjcsMjUgKzY2LDE1IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLS8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKLSAgICBBVURJT19GT1JNQVRfRFRTLAotICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAotICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCi19OwotLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKLSAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKLX07CisvLyBDb21wcmVzc2VkIGZvcm1hdHMgZm9yIE1TRCBtb2R1bGUsIG9yZGVyZWQgZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGNvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CisvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCkBAIC05NCw0MyArODMsNDkgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oZGV2aWNlX2FkZHJlc3MpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKGRldmljZS0+YWRkcmVzcygpKTsKICAgICBjb25zdCBTdHJpbmc4IGtleShzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA/CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgOiBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtRGlzY29ubmVjdCk7Ci0gICAgcGFyYW0uYWRkSW50KGtleSwgZGV2aWNlKTsKKyAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UtPnR5cGUoKSk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIGZvcm1hdCAweCVYIiwKKyAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogCiAgICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZVR5cGUpKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlVHlwZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSkgewogICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwogCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogCiAgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKICAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKQEAgLTE0MCwyMSArMTM1LDIzIEBACiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNvbm5lY3RpbmcgZGV2aWNlICVzIGZvcm1hdCAleCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldmljZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIGVuY29kZWRGb3JtYXQpOwogICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgbW9kdWxlIG5hbWU9JXMiLCBtb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTE2Miw5MyArMTU5LDEyMyBAQAogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgb3V0cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgb3V0cHV0cy4uLikKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKKworICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQogICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKICAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwgX19mdW5jX18sIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAvLyBTZW5kIERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKLSAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgbU91dHB1dHMuY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGRldmljZSk7CisKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBvdXRwdXRzKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgYWN0aXZlIGRldmljZSBjb2RlYworICAgICAgICAgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogICAgICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKLSAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKLSAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gZXZhbHVhdGUgcGxheWJhY2sgcm91dGluZyB3aGVuIGNvbm5lY3RpbmcgYSByZW1vdGUgc3VibWl4CisgICAgICAgIC8vIG91dHB1dCBkZXZpY2UgdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5IG9mIHR5cGUgcmVjb3JkZXIgYXMgbm8KKyAgICAgICAgLy8gcGxheWJhY2sgdXNlIGNhc2UgaXMgYWZmZWN0ZWQuCisgICAgICAgIGJvb2wgZG9DaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMgPSB0cnVlOworICAgICAgICBpZiAoZGV2aWNlLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAgICAgJiYgc3RybmNtcChkZXZpY2VfYWRkcmVzcywgIjAiLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSAhPSAwKSB7CiAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUG9saWN5TWl4ICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RybmNtcChkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZG9DaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKLSAgICAgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0gICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICBhdXRvIGNoZWNrQ2xvc2VPdXRwdXRzID0gWyZdKCkgeworICAgICAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAorICAgICAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNoZWNrIEEyRFAgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoZG9DaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMpIHsKKyAgICAgICAgICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhjaGVja0Nsb3NlT3V0cHV0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGVja0Nsb3NlT3V0cHV0cygpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yIG1zZE91dERldmljZXMgPSBnZXRNc2RBdWRpb091dERldmljZXMoKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAoZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAogICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCiAgICAgICAgICAgICAgICAgLy8gYSB2YWxpZCBkZXZpY2Ugc2VsZWN0aW9uIG9uIHRob3NlIG91dHB1dHMuCi0gICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9ICFkZXNjLT5pc0R1cGxpY2F0ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gKG1zZE91dERldmljZXMuaXNFbXB0eSgpIHx8IG1zZE91dERldmljZXMgIT0gZGVzYy0+ZGV2aWNlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlc2MtPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlIHdoZW4gZGlzY29ubmVjdGluZyAoYSBub24tZHVwbGljYXRlZCBkZXZpY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsIG5ld0RldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2RGVzYyk7CisgICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC0yNTYsNjcgKzI4Myw2NiBAQAogICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCiAKICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKICAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOwogCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2aWNlKTsKICAgICAgICAgc3dpdGNoIChzdGF0ZSkKICAgICAgICAgewogICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQmVmb3JlIGNoZWNraW5nIGludHB1dHMsIGJyb2FkY2FzdCBjb25uZWN0IGV2ZW50IHRvIGFsbG93IEhBTCB0byByZXRyaWV2ZSBkeW5hbWljCiAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIG9uIG5ld2x5IGNvbm5lY3RlZCBkZXZpY2VzIChpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIGlucHV0cy4uLikKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOworCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CisKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2aWNlKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRldmljZSBub3QgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCi0gICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIGludmFsaWQgc3RhdGU6ICV4IiwgX19mdW5jX18sIHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtMzI2LDE5ICszNTIsMTkgQEAKICAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAogICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldkRlc2MpOworICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZpY2UpOwogICAgICAgICB9CiAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfSAvLyBlbmQgaWYgaXMgaW5wdXQgZGV2aWNlCiAKLSAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKKyAgICBBTE9HVygiJXMoKSBpbnZhbGlkIGRldmljZTogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKQEAgLTM0NiwxMSArMzcyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsCisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93VG9DcmVhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihkZXZpY2VfYWRkcmVzcykgIT0gMCkvKm1hdGNoQWRkcmVzcyovKTsKIAogICAgIGlmIChkZXZEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIHVuZGVjbGFyZWQgZGV2aWNlLCB0eXBlICUwOHgsIGFkZHJlc3M6ICVzIiwKKyAgICAgICAgQUxPR1YoImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIHVuZGVjbGFyZWQgZGV2aWNlLCB0eXBlICUwOHgsIGFkZHJlc3M6ICVzIiwKICAgICAgICAgICAgICAgZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KQEAgLTM2Miw1NSArMzg5LDY1IEBACiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgX19mdW5jX18sIGRldmljZSk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSkgIT0gMCkgPworICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IDApID8KICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDogQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIFN0cmluZzggcmVwbHk7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgaW50IGlzUmVjb25maWdBMmRwU3VwcG9ydGVkID0gMDsKIAotICAgIEFMT0dWKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKCkgZGV2aWNlOiAweCVYLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCgpIGRldmljZTogMHglWCwgYWRkcmVzcyAlcyBuYW1lICVzIGVuY29kZWRGb3JtYXQ6IDB4JVgiLAorICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIC8vIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZURldmljZXMgPSBnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICBpZiAoZGV2aWNlTGlzdC5lbXB0eSgpKSB7CiAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG86IGRldmljZSBpcyBub3QgY29ubmVjdGVkCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwogCiAgICAgLy8gRm9yIG9mZmxvYWRlZCBBMkRQLCBIdyBtb2R1bGVzIG1heSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvCi0gICAgLy8gY29uZmlndXJlIGNvZGVjcy4gQ2hlY2sgaWYgYW55IG9mIHRoZSBsb2FkZWQgaHcgbW9kdWxlcwotICAgIC8vIHN1cHBvcnRzIHRoaXMuCi0gICAgLy8gSWYgc3VwcG9ydGVkLCBzZW5kIGEgc2V0IHBhcmFtZXRlciB0byBjb25maWd1cmUgQTJEUCBjb2RlY3MKLSAgICAvLyBhbmQgcmV0dXJuLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCisgICAgLy8gY29uZmlndXJlIGNvZGVjcy4KKyAgICAvLyBIYW5kbGUgdHdvIHNwZWNpZmljIGNhc2VzIGJ5IHNlbmRpbmcgYSBzZXQgcGFyYW1ldGVyIHRvCisgICAgLy8gY29uZmlndXJlIEEyRFAgY29kZWNzLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCisgICAgLy8gQ2FzZSAxOiBBMkRQIGFjdGl2ZSBkZXZpY2Ugc3dpdGNoZXMgZnJvbSBwcmltYXJ5IHRvIHByaW1hcnkKKyAgICAvLyBtb2R1bGUKKyAgICAvLyBDYXNlIDI6IEEyRFAgZGV2aWNlIGNvbmZpZyBjaGFuZ2VzIG9uIHByaW1hcnkgbW9kdWxlLgogICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7Ci0gICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpKTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOwotICAgICAgICByZXBsaWVkUGFyYW1ldGVycy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSwgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpOwotICAgICAgICBpZiAoaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHApOwotICAgICAgICAgICAgcGFyYW0uYWRkKGtleSwgU3RyaW5nOCgidHJ1ZSIpKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoZGV2aWNlLCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHByaW1hcnlIYW5kbGUgPSBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCk7CisgICAgICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpLmNvbnRhaW5zKGRldkRlc2MpICYmCisgICAgICAgICAgIChtb2R1bGUgIT0gMCAmJiBtb2R1bGUtPmdldEhhbmRsZSgpID09IHByaW1hcnlIYW5kbGUpKSB7CisgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSwgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKGlzUmVjb25maWdBMmRwU3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7CisgICAgICAgICAgICAgICAgcGFyYW0uYWRkKGtleSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGV2RGVzYy0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxOCw3ICs0NTUsOCBAQAogICAgIC8vIFRoaXMgd2lsbCBmb3JjZSByZWFkaW5nIGFnYWluIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+Z2V0RW5jb2RlZEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKSBlcnJvciBkaXNhYmxpbmcgY29ubmVjdGlvbiBzdGF0ZTogJWQiLAogICAgICAgICAgICAgICBzdGF0dXMpOwpAQCAtNDI3LDcgKzQ2NSw3IEBACiAKICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKSBlcnJvciBlbmFibGluZyBjb25uZWN0aW9uIHN0YXRlOiAlZCIsCiAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC00MzcsMTYgKzQ3NSw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgQUxPR1YoImdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoKSIpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OworICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5TW9kdWxlID0KKyAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOworICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBwcmltYXJ5TW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZWNsYXJlZERldmljZXMpIHsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuYmVnaW4oKSwgZGV2aWNlLT5lbmNvZGVkRm9ybWF0cygpLmVuZCgpKTsKKyAgICB9CisgICAgZm9ybWF0cy0+YXNzaWduKGZvcm1hdFNldC5iZWdpbigpLCBmb3JtYXRTZXQuZW5kKCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoY29uc3QgRGV2aWNlVmVjdG9yICZyeERldmljZXMsIHVpbnQzMl90IGRlbGF5TXMpCiB7CiAgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CisgICAgYm9vbCBjcmVhdGVSeFBhdGNoID0gZmFsc2U7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CiAKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKKyAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCkudHlwZXMoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKLSAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisgICAgQUxPR19BU1NFUlQoIXJ4RGV2aWNlcy5pc0VtcHR5KCksICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHNlbGVjdGVkIG91dHB1dCBkZXZpY2UiKTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gfTsKKyAgICBhdXRvIHR4U291cmNlRGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIEFMT0dfQVNTRVJUKHR4U291cmNlRGV2aWNlICE9IDAsICJ1cGRhdGVDYWxsUm91dGluZygpIGlucHV0IHNlbGVjdGVkIGRldmljZSBub3QgYXZhaWxhYmxlIik7CisKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICVzIHR4RGV2aWNlICVzIiwKKyAgICAgICAgICByeERldmljZXMuaXRlbUF0KDApLT50b1N0cmluZygpLmNfc3RyKCksIHR4U291cmNlRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKQEAgLTQ1OSw1NyArNTIxLDkyIEBACiAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwogICAgIH0KIAotICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzCi0gICAgLy8gdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgotICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KLSAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSAmIHJ4RGV2aWNlKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKKyAgICBhdXRvIHRlbGVwaG9ueVJ4TW9kdWxlID0KKyAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgYXV0byB0ZWxlcGhvbnlUeE1vZHVsZSA9CisgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAvLyByZXRyaWV2ZSBSeCBTb3VyY2UgYW5kIFR4IFNpbmsgZGV2aWNlIGRlc2NyaXB0b3JzCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNpbmtEZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisKKyAgICAvLyBSWCBhbmQgVFggVGVsZXBob255IGRldmljZSBhcmUgZGVjbGFyZWQgYnkgUHJpbWFyeSBBdWRpbyBIQUwKKyAgICBpZiAoaXNQcmltYXJ5TW9kdWxlKHRlbGVwaG9ueVJ4TW9kdWxlKSAmJiBpc1ByaW1hcnlNb2R1bGUodGVsZXBob255VHhNb2R1bGUpICYmCisgICAgICAgICAgICAodGVsZXBob255UnhNb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMpKSB7CisgICAgICAgIGlmIChyeFNvdXJjZURldmljZSA9PSAwIHx8IHR4U2lua0RldmljZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBSWCAvIFRYIFRlbGVwaG9ueSBkZXZpY2UocykgaXMoYXJlKSBub3QgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgQUxPR0UoInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFR4IGFuZC9vciBSWCBkZXZpY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgICAgICB9CisgICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBwYXRjaCAoYWthIFN3IEJyaWRnaW5nKSBpZiBQcmltYXJ5IEhXIG1vZHVsZSBoYXMgZGVjbGFyZWQgc3VwcG9ydGluZyBhCisgICAgICAgIC8vIHJvdXRlIGJldHdlZW4gdGVsZXBob255IFJYIHRvIFNpbmsgZGV2aWNlIGFuZCBTb3VyY2UgZGV2aWNlIHRvIHRlbGVwaG9ueSBUWAorICAgICAgICBjb25zdCBhdXRvICZwcmltYXJ5TW9kdWxlID0gdGVsZXBob255UnhNb2R1bGU7CisgICAgICAgIGNyZWF0ZVJ4UGF0Y2ggPSAhcHJpbWFyeU1vZHVsZS0+c3VwcG9ydHNQYXRjaChyeFNvdXJjZURldmljZSwgcnhEZXZpY2VzLml0ZW1BdCgwKSk7CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSAhcHJpbWFyeU1vZHVsZS0+c3VwcG9ydHNQYXRjaCh0eFNvdXJjZURldmljZSwgdHhTaW5rRGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvcgorICAgICAgICAvLyB2b2ljZSBjYWxscyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICAgICAgY3JlYXRlUnhQYXRjaCA9ICEoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKS5jb250YWlucyhyeERldmljZXMuaXRlbUF0KDApKSkgJiYKKyAgICAgICAgICAgICAgICAocnhTb3VyY2VEZXZpY2UgIT0gMCk7CiAgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCiAgICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCi0gICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKLSAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9ICEoYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpLmNvbnRhaW5zKHR4U291cmNlRGV2aWNlKSkgJiYKKyAgICAgICAgICAgICAgICAodHhTaW5rRGV2aWNlICE9IDApOworICAgIH0KKyAgICAvLyBVc2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgIGlmICghY3JlYXRlUnhQYXRjaCkgeworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCB0cnVlLCBkZWxheU1zKTsKICAgICB9IGVsc2UgeyAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaCh0cnVlIC8qaXNSeCovLCByeERldmljZSwgZGVsYXlNcyk7Ci0gICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaCh0cnVlIC8qaXNSeCovLCByeERldmljZXMuaXRlbUF0KDApLCBkZWxheU1zKTsKKworICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSBidXQgUlggZGV2aWNlIGlzCisgICAgICAgIC8vIG9uIG90aGVyIEhXIG1vZHVsZSwgU2lua01ldGFEYXRhIG9mIHRlbGVwaG9ueSBpbnB1dCBzaG91bGQgaGFuZGxlIGl0CisgICAgICAgIC8vIGFzc3VtaW5nIHRoZSBkZXZpY2UgdXNlcyBhdWRpbyBIQUwgVjUuMCBhbmQgYWJvdmUKICAgICB9CiAgICAgaWYgKGNyZWF0ZVR4UGF0Y2gpIHsgLy8gY3JlYXRlIFRYIHBhdGggYXVkaW8gcGF0Y2gKLSAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4U291cmNlRGV2aWNlLCBkZWxheU1zKTsKICAgICB9CiAKICAgICByZXR1cm4gbXV0ZVdhaXRNczsKIH0KIAogc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKLSAgICAgICAgYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAgICAgaWYgKGlzUngpIHsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc2lua3NbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZGV2aWNlKS4KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICB9IGVsc2UgewotICAgICAgICB0eFNvdXJjZURldmljZURlc2MgPSBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShkZXZpY2UpLgorICAgICAgICAgICAgICAgIGFkZFNpbmsobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBpc1J4ID8gZGV2aWNlIDogQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFg7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvdXRwdXREZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAvLyBAVE9ETzogc3RpbGwgaWdub3JpbmcgdGhlIGFkZHJlc3MsIG9yIG5vdCBkZWFsaW5nIHBsYXRmb3JtIHdpdGggbXV0bGlwbGUgdGVsZXBob255ZGV2aWNlcworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG91dHB1dERldmljZSA9IGlzUnggPworICAgICAgICAgICAgICAgIGRldmljZSA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Iob3V0cHV0RGV2aWNlKSwgbU91dHB1dHMpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CiAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgdGFyZ2V0IGRldmljZQogICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksICIlcygpICVzIGRldmljZSBvdXRwdXQgJWQgaXMgZHVwbGljYXRlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0KTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0ggfSk7CiAgICAgfQogCiAgICAgaWYgKCFpc1J4KSB7CkBAIC01MTgsMzkgKzYxNSw1MCBAQAogICAgICAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoIGFuZCBsb2dpYyBoZXJlIG11c3QgYmUKICAgICAgICAgLy8gc3ltbWV0cmljIHRvIHRoZSBvbmUgaW4gc3RhcnRJbnB1dCgpCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyh0eFNvdXJjZURldmljZURlc2MpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy5rZXlBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLnBhdGNoKCksICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCiAgICAgICAgICAgICAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyAlcyBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMsIGlzUnggPyAiUlgiIDogIlRYIik7CiAgICAgc3A8QXVkaW9QYXRjaD4gYXVkaW9QYXRjaDsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvUGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksIG1VaWRDYWNoZWQpOwogICAgICAgICBhdWRpb1BhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CiAgICAgICAgIGF1ZGlvUGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwogICAgIH0KICAgICByZXR1cm4gYXVkaW9QYXRjaDsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmREZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CiAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAogICAgICAgICAgICAgIiVzKCkgc2VsZWN0ZWQgZGV2aWNlIHR5cGUgJSN4IGlzIG5vdCBpbiBkZXZpY2VzIGxpc3QiLCBfX2Z1bmNfXywgZGV2aWNlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgZGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICByZXR1cm4gZGV2aWNlRGVzYzsKKyAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZURldmljZVR5cGVzKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdCB7CisgICAgc3A8SHdNb2R1bGU+IG1vZCA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUobW9kdWxlSWQpOworICAgIHJldHVybiBtb2QgIT0gMCA/IGRldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUobW9kLT5nZXRIYW5kbGUoKSkgOiBBVURJT19ERVZJQ0VfTk9ORTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGV2aWNlT2ZNb2R1bGUoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORAorICAgICAgICAgICAgICAgIHx8IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKQorICAgICAgICAgICAgICAgIC5pbmRleE9mKGRldkRlc2MpICE9IE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTU2NCwxNCArNjcyLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PwotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdG9wcwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNTg0LDQ4ICs2ODYsNDcgQEAKICAgICAgICAgICAgICAgICAgIHx8IChpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CiAKICAgICBpbnQgZGVsYXlNcyA9IDA7CiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBhdXRvIHNvbmlmaWNhdGlvblN0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAogICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCiAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCi0gICAgICAgICAgICBpZiAoKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKLSAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUobXVzaWNTdHJhdGVneSwgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgogICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bGF0ZW5jeSgpKjIpKSB7CiAgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCi0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKICAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCiAgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICByeERldmljZSA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKTsKKyAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZXMsIGRlbGF5TXMpOwogICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewogICAgICAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNjM1LDQwICs3MzYsMzAgQEAKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gcmVldmFsdWF0ZSByb3V0aW5nIG9uIGFsbCBvdXRwdXRzIGluIGNhc2UgdHJhY2tzIGhhdmUgYmVlbiBzdGFydGVkIGR1cmluZyB0aGUgY2FsbAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLCAwIC8qZGVsYXlNcyovKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCAwIC8qZGVsYXlNcyovKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KIAogICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9CisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKTsKIH0KIAogYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UGhvbmVTdGF0ZSgpIHsKQEAgLTY3Niw3ICs3NjcsNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKICAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSB1c2FnZSAlZCwgY29uZmlnICVkLCBtUGhvbmVTdGF0ZSAlZCIsIHVzYWdlLCBjb25maWcsIG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7CiAgICAgaWYgKGNvbmZpZyA9PSBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSkpIHsKQEAgLTY5Miw5ICs3ODMsNyBAQAogICAgICAgICAgICAgKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAvLyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMgaGFuZGxlZCBieSBzeXN0ZW0gVUkKQEAgLTcwNCwyNiArNzkzLDI3IEBACiAgICAgICAgIGRlbGF5TXMgPSBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUzsKICAgICB9CiAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSwgZGVsYXlNcyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgd2FpdE1zID0gdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcywgZGVsYXlNcyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXREZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgewotICAgICAgICAgICAgd2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICAvLyBBcyBkb25lIGluIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSwgd2UgY291bGQgYWxzbyBmaXggZGVmYXVsdCBkZXZpY2UgaXNzdWUgYnkKKyAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KKyAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCisgICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7Ci0gICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlLCB3YWl0TXMsIHRydWUpOworICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgIW5ld0RldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCB3YWl0TXMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7CisgICAgICAgIGF1dG8gbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7CiAgICAgICAgIC8vIEZvcmNlIG5ldyBpbnB1dCBzZWxlY3Rpb24gaWYgdGhlIG5ldyBkZXZpY2UgY2FuIG5vdCBiZSByZWFjaGVkIHZpYSBjdXJyZW50IGlucHV0Ci0gICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMobmV3RGV2aWNlKSkgewogICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBuZXdEZXZpY2UpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2xvc2VJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwpAQCAtNzM2LDI4ICs4MjYsMzEgQEAKICAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwogfQogCi0vLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCi0vLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAotc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKKy8vIEZpbmQgYW4gb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZC4gV2hlbiAiZGlyZWN0T25seSIgaXMgc2V0LCByZXN0cmljdAorLy8gc2VhcmNoIHRvIHByb2ZpbGVzIGZvciBkaXJlY3Qgb3V0cHV0cy4KK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSkKIHsKLSAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KLSAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9Ci0gICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAotICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpOwotICAgIGZsYWdzID0KLSAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChkaXJlY3RPbmx5KSB7CisgICAgICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgorICAgICAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGV2YW50RmxhZ3MgPQorICAgICAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8CisgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpOworICAgICAgICBmbGFncyA9CisgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQogCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qdXBkYXRlZEZvcm1hdCovLAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLApAQCAtNzY1LDEwICs4NTgsMTYgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5IHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIGlmIGNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb2RlYworICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGlyZWN0T25seSkgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgIC8vIHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQogICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzgzLDggKzg4Miw3IEBACiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAKICAgICAvLyBOb3RlIHRoYXQgcmVsYXRlZCBtZXRob2QgZ2V0T3V0cHV0Rm9yQXR0cigpIHVzZXMgZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgbm90IHNlbGVjdE91dHB1dCgpLgogICAgIC8vIFdlIHVzZSBzZWxlY3RPdXRwdXQoKSBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGRlc2lyZWQgQXVkaW9UcmFjayBzYW1wbGUgcmF0ZSwKQEAgLTc5MiwxMyArODkwLDE1MSBAQAogICAgIC8vIGdldE91dHB1dCgpIHNvbGVseSBvbiBhdWRpb19zdHJlYW1fdHlwZSBzdWNoIGFzIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCkKICAgICAvLyBhbmQgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgpLgogCi0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKIAotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBzdHJlYW0gJWQgc2VsZWN0ZWQgZGV2aWNlICUwOHgsIG91dHB1dCAlZCIsIHN0cmVhbSwgZGV2aWNlLCBvdXRwdXQpOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBzdHJlYW0gJWQgc2VsZWN0ZWQgZGV2aWNlcyAlcywgb3V0cHV0ICVkIiwgc3RyZWFtLAorICAgICAgICAgIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXQpOwogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtKQoreworICAgIGlmIChzcmNBdHRyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhzcmNBdHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBzcmNBdHRyLT51c2FnZSwgc3JjQXR0ci0+Y29udGVudF90eXBlLCBzcmNBdHRyLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpkc3RBdHRyID0gKnNyY0F0dHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNyY1N0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3JjU3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHNyY1N0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRySW50KAorICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcykKK3sKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlczsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIERldmljZVZlY3RvciBtc2REZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHJlcXVlc3RlZFBvcnRJZCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXMocmVzdWx0QXR0ciwgYXR0ciwgKnN0cmVhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAqc3RyZWFtID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKnJlc3VsdEF0dHIpOworCisgICAgQUxPR1YoIiVzKCkgYXR0cmlidXRlcz0lcyBzdHJlYW09JXMgc2Vzc2lvbiAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sCisgICAgICAgICAgdG9TdHJpbmcoKnJlc3VsdEF0dHIpLmNfc3RyKCksIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCksIHNlc3Npb24sIHJlcXVlc3RlZFBvcnRJZCk7CisKKyAgICAvLyBUaGUgcHJpbWFyeSBvdXRwdXQgaXMgdGhlIGV4cGxpY2l0IHJvdXRpbmcgKGVnLiBzZXRQcmVmZXJyZWREZXZpY2UpIGlmIHNwZWNpZmllZCwKKyAgICAvLyAgICAgICBvdGhlcndpc2UsIGZhbGxiYWNrIHRvIHRoZSBkeW5hbWljIHBvbGljaWVzLCBpZiBub25lIG1hdGNoLCBxdWVyeSB0aGUgZW5naW5lLgorICAgIC8vIFNlY29uZGFyeSBvdXRwdXRzIGFyZSBhbHdheXMgZm91bmQgYnkgZHluYW1pYyBwb2xpY2llcyBhcyB0aGUgZW5naW5lIGRvIG5vdCBzdXBwb3J0IHRoZW0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcG9saWN5RGVzYzsKKyAgICBpZiAobVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoKnJlc3VsdEF0dHIsIHVpZCwgcG9saWN5RGVzYywgc2Vjb25kYXJ5RGVzY3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBvbGljeURlc2MgPSBudWxscHRyOyAvLyByZXNldCBnZXRPdXRwdXRGb3JBdHRyIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICAgICBzZWNvbmRhcnlEZXNjcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgcm91dGluZyBpcyBoaWdoZXIgcHJpb3JpdHkgdGhlbiBhbnkgZHluYW1pYyBwb2xpY3kgcHJpbWFyeSBvdXRwdXQKKyAgICBib29sIHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMgPSByZXF1ZXN0ZWREZXZpY2UgPT0gbnVsbHB0ciAmJiBwb2xpY3lEZXNjICE9IG51bGxwdHI7CisKKyAgICAvLyBGSVhNRTogaW4gY2FzZSBvZiBSRU5ERVIgcG9saWN5LCB0aGUgb3V0cHV0IGNhcGFiaWxpdGllcyBzaG91bGQgYmUgY2hlY2tlZAorICAgIGlmICgodXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcyB8fCAhc2Vjb25kYXJ5RGVzY3MtPmVtcHR5KCkpCisgICAgICAgICYmICFhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgeworICAgICAgICBBTE9HRCgiJXM6IHJlamVjdGluZyByZXF1ZXN0IGFzIGR5bmFtaWMgYXVkaW8gcG9saWN5IG9ubHkgc3VwcG9ydCBwY20iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICh1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzKSB7CisgICAgICAgICpvdXRwdXQgPSBwb2xpY3lEZXNjLT5tSW9IYW5kbGU7CisgICAgICAgIEF1ZGlvTWl4ICptaXggPSBwb2xpY3lEZXNjLT5tUG9saWN5TWl4OworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZURlc2MgIT0gMCA/IGRldmljZURlc2MtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgLy8gVmlydHVhbCBzb3VyY2VzIG11c3QgYWx3YXlzIGJlIGR5bmFtaWNhbHkgb3IgZXhwbGljaXRseSByb3V0ZWQKKyAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBleHBsaWNpdCByb3V0aW5nIG1hbmFnZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kgaW4gQVBNIGlzIG5vdyBoYW5kbGVkIGJ5IGVuZ2luZQorICAgIC8vIGluIG9yZGVyIHRvIGxldCB0aGUgY2hvaWNlIG9mIHRoZSBvcmRlciB0byBmdXR1cmUgdmVuZG9yIGVuZ2luZQorICAgIG91dHB1dERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0ciwgcmVxdWVzdGVkRGV2aWNlLCBmYWxzZSk7CisKKyAgICBpZiAoKHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCisgICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgorICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCisgICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgorICAgIC8vIFRPRE86IFJlbW92ZSBjaGVjayBvZiBBVURJT19TVFJFQU1fTVVTSUMgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGVkIG9uIHRoZSBhcHAgc2lkZS4KKyAgICBpZiAob3V0cHV0RGV2aWNlcy50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCisgICAgICAgICgqc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQyAgfHwgcmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTikgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkUG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgICAgICAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzKCkgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3ggc3RyZWFtICVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MsIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCkpOworCisgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGlmICghbXNkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZXMuaXNFbXB0eSgpID8gbnVsbHB0ciA6IG91dHB1dERldmljZXMuaXRlbUF0KDApOworICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RQYXRjaChkZXZpY2UpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBVc2luZyBNU0QgZGV2aWNlcyAlcyBpbnN0ZWFkIG9mIGRldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBvdXRwdXREZXZpY2VzID0gbXNkRGV2aWNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhvdXRwdXREZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpzZWxlY3RlZERldmljZUlkID0gZ2V0Rmlyc3REZXZpY2VJZChvdXRwdXREZXZpY2VzKTsKKworICAgIEFMT0dWKCIlcyByZXR1cm5zIG91dHB1dCAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODA3LDEwMyArMTA0Myw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIHVpZCwgZGVzYykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZGVzYyAhPSAwLCAiSW52YWxpZCBkZXNjIHJldHVybmVkIGJ5IGdldE91dHB1dEZvckF0dHIiKTsKLSAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCi0gICAgICAgICAgICAiIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzLAotICAgICAgICAgICAgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0KLSAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1PdXRwdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgKnN0cmVhbSwgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSwgZGV2aWNlRGVzYywgdWlkKTsKLQotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotCi0gICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgfQotCi0gICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCi0gICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgotICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCi0gICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKLSAgICAgICAgKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKLSAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKLSAgICAgICAgaXNJbkNhbGwoKSkgewotICAgICAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IiwKLSAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKLQotICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKLSAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0RGVzY3M7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOwogCi0gICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgLy8gUHJldmVudCBmcm9tIHN0b3JpbmcgaW52YWxpZCByZXF1ZXN0ZWQgZGV2aWNlIGlkIGluIGNsaWVudHMKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCA9CisgICAgICByZXF1ZXN0ZWREZXZpY2UgIT0gbnVsbHB0ciA/IHJlcXVlc3RlZFBvcnRJZCA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQ7CiAKLSAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAorICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dERlc2NzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gd2Vha1NlY29uZGFyeU91dHB1dERlc2NzOworICAgIGZvciAoYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeU91dHB1dERlc2NzKSB7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MucHVzaF9iYWNrKHNlY29uZGFyeURlc2MpOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnID0gey5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgIC5mb3JtYXQgPSBjb25maWctPmZvcm1hdCwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIH07CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2MgPQorICAgICAgICBuZXcgVHJhY2tDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVRvVm9sdW1lU291cmNlKCpzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjcykpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IoKm91dHB1dCk7CisgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoIiVzKCkgcmV0dXJucyBvdXRwdXQgJWQgcmVxdWVzdGVkUG9ydElkICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAqb3V0cHV0LCByZXF1ZXN0ZWRQb3J0SWQsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLApAQCAtOTM0LDcgKzExMjcsOCBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICAqZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CiAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKLSAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICAgICAgICAgKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQykgPT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgQUxPR1YoIlNldCBWb0lQIGFuZCBEaXJlY3Qgb3V0cHV0IGZsYWdzIGZvciBQQ00gZm9ybWF0Iik7CkBAIC05NjAsMTEgKzExNTQsMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgfQogCiAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewpAQCAtOTc5LDcgKzExNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5jaGFubmVsX21hc2sgPT0gZGVzYy0+bUNoYW5uZWxNYXNrKSAmJgogICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbiA9PSBkZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbikpIHsKICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTk5MywxOSArMTE4OCwzNCBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBnZXRGaXJzdERldmljZUFkZHJlc3MoZGV2aWNlcyk7CiAKLSAgICAgICAgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZSwgYWRkcmVzcywgc3RyZWFtLCAqZmxhZ3MsICZvdXRwdXQpOworICAgICAgICAvLyBNU0QgcGF0Y2ggbWF5IGJlIHVzaW5nIHRoZSBvbmx5IG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gc2VydmljZSB0aGlzIHJlcXVlc3QuIFJlbGVhc2UKKyAgICAgICAgLy8gTVNEIHBhdGNoIHRvIHByaW9yaXRpemUgdGhpcyByZXF1ZXN0IG92ZXIgYW55IGFjdGl2ZSBvdXRwdXQgb24gTVNELgorICAgICAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1zZFBhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoID0gbXNkUGF0Y2hlc1tpXTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3M7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzW2pdOworICAgICAgICAgICAgICAgIGlmIChzaW5rLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaW5rLT5leHQuZGV2aWNlLnR5cGUgJiBkZXZpY2VzLnR5cGVzKCkpICE9IEFVRElPX0RFVklDRV9OT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzcy5pc0VtcHR5KCkgfHwgc3RybmNtcChzaW5rLT5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tSGFuZGxlLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZXMsIHN0cmVhbSwgKmZsYWdzLCAmb3V0cHV0KTsKIAogICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAogICAgICAgICAgICAgKGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gMCAmJiBjb25maWctPnNhbXBsZV9yYXRlICE9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpIHx8CiAgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgY29uZmlnLT5mb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgfHwKICAgICAgICAgICAgIChjb25maWctPmNoYW5uZWxfbWFzayAhPSAwICYmIGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxlIHJhdGUgJWQgJWQsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiIAorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4IiwgX19mdW5jX18sIG91dHB1dCwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgY29uZmlnLT5mb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMTAxOCwxNCArMTIyOCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24gPSBzZXNzaW9uOwogCiAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwogICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgQUxPR1YoIiVzIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgb3V0cHV0KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KQEAgLTEwNDYsMzAgKzEyNTQsMTg5IEBACiAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCiAgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQotICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2VzKCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsICIKICAgICAgICAgICAgICJzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVscyAlI3gsIGZsYWdzICUjeCIsCiAgICAgICAgICAgICBzdHJlYW0sIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKIAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkQXVkaW9JbkRldmljZSgpIGNvbnN0IHsKKyAgICBhdXRvIG1zZEluRGV2aWNlcyA9IG1Id01vZHVsZXMuZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICByZXR1cm4gbXNkSW5EZXZpY2VzLmlzRW1wdHkoKT8gbnVsbHB0ciA6IG1zZEluRGV2aWNlcy5pdGVtQXQoMCk7Cit9CisKK0RldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZEF1ZGlvT3V0RGV2aWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3TW9kdWxlcy5nZXRBdmFpbGFibGVEZXZpY2VzRnJvbU1vZHVsZU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworfQorCitjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFBhdGNoZXMoKSBjb25zdCB7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlczsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IDApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9QYXRjaGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UgPSAmcGF0Y2gtPm1QYXRjaC5zb3VyY2VzW2pdOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9PSBtc2RNb2R1bGUtPmdldEhhbmRsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZFBhdGNoZXMuYWRkQXVkaW9QYXRjaChwYXRjaC0+bUhhbmRsZSwgcGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbXNkUGF0Y2hlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzcDxId01vZHVsZT4gZGV2aWNlTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2Uob3V0cHV0RGV2aWNlLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlcyIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzID0gbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgaWYgKGlucHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIGlucHV0IHByb2ZpbGVzIGZvciBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gZGV2aWNlTW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgIGlmIChvdXRwdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gb3V0cHV0IHByb2ZpbGVzIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIG1zZFByb2ZpbGVzOworICAgIC8vIEVhY2ggSU9Qcm9maWxlIHJlcHJlc2VudHMgYSBNaXhQb3J0IGZyb20gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisgICAgZm9yIChjb25zdCBhdXRvICZpblByb2ZpbGUgOiBpbnB1dFByb2ZpbGVzKSB7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKGluUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIG1zZFByb2ZpbGVzLmFwcGVuZFZlY3RvcihpblByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGRldmljZVByb2ZpbGVzOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSkgeworICAgICAgICAgICAgZGV2aWNlUHJvZmlsZXMuYXBwZW5kVmVjdG9yKG91dFByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIGJlc3RTaW5rQ29uZmlnOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1zZFByb2ZpbGVzLmZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoZGV2aWNlUHJvZmlsZXMsCisgICAgICAgICAgICBjb21wcmVzc2VkRm9ybWF0c09yZGVyLCBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyLCB0cnVlIC8qcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcyovLAorICAgICAgICAgICAgJmJlc3RTaW5rQ29uZmlnKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dEKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGVzIGZvdW5kIGZvciBkZXZpY2U6ICVzLCBod0F2U3luYzogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdBdlN5bmMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBzaW5rQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIHNpbmtDb25maWctPmNoYW5uZWxfbWFzayA9IGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBzaW5rQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gRm9yIGVuY29kZWQgc3RyZWFtcyBmb3JjZSBkaXJlY3QgZmxhZyB0byBwcmV2ZW50IGRvd25zdHJlYW0gbWl4aW5nLgorICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgc291cmNlQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIC8vIFNwZWNpZnkgZXhhY3QgY2hhbm5lbCBtYXNrIHRvIHByZXZlbnQgZ3Vlc3NpbmcgYnkgYml0IGNvdW50IGluIFBhdGNoUGFuZWwuCisgICAgc291cmNlQ29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgc291cmNlQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gQ29weSBpbnB1dCBzdHJlYW0gZGlyZWN0bHkgd2l0aG91dCBhbnkgcHJvY2Vzc2luZyAoZS5nLiByZXNhbXBsaW5nKS4KKyAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChod0F2U3luYykgeworICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUgfAorICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLIHwgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUIHwgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgc2lua0NvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgc291cmNlQ29uZmlnLT5jb25maWdfbWFzayB8PSBjb25maWdfbWFzazsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhdGNoQnVpbGRlciBBdWRpb1BvbGljeU1hbmFnZXI6OmJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3QKK3sKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZ2V0TXNkQXVkaW9JbkRldmljZSgpKS5hZGRTaW5rKG91dHB1dERldmljZSk7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc291cmNlQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNvdXJjZXNbMF07CisgICAgYXVkaW9fcG9ydF9jb25maWcgc2lua0NvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zaW5rc1swXTsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgTVNEIG1vZHVsZSBoYXMgSFdfQVZfU1lOQyBmbGFnIHNldCBpbiB0aGUgQVAgY29uZmlnIGZpbGUuCisgICAgLy8gRm9yIG5vdywgd2UganVzdCBmb3JjZWZ1bGx5IHRyeSB3aXRoIEh3QXZTeW5jIGZpcnN0LgorICAgIHN0YXR1c190IHJlcyA9IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3Iob3V0cHV0RGV2aWNlLCB0cnVlIC8qaHdBdlN5bmMqLywKKyAgICAgICAgICAgICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUiA/IE5PX0VSUk9SIDoKKyAgICAgICAgICAgIGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgZmFsc2UgLypod0F2U3luYyovLCAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBGb3VuZCBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIGVuY29kZWQgYXVkaW8uIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgcmV0dXJuIChQYXRjaEJ1aWxkZXIoKSkuYWRkU291cmNlKHNvdXJjZUNvbmZpZykuYWRkU2luayhzaW5rQ29uZmlnKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBVc2UgbWVkaWEgc3RyYXRlZ3kgZm9yIHVuc3BlY2lmaWVkIG91dHB1dCBkZXZpY2UuIFRoaXMgc2hvdWxkIG9ubHkKKyAgICAgICAgLy8gb2NjdXIgb24gY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCkuIERldmljZSBjb25uZWN0aW9uIGV2ZW50cyBtYXkKKyAgICAgICAgLy8gdGhlcmVmb3JlIGludmFsaWRhdGUgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cy4KKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRldmljZXMuaXNFbXB0eSgpLCAibm8gb3V0cHVkZXZpY2UgdG8gc2V0IE1zZCBQYXRjaCIpOworICAgICAgICBkZXZpY2UgPSBkZXZpY2VzLml0ZW1BdCgwKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlciA9IGJ1aWxkTXNkUGF0Y2goZGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CisgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlcyA9IGdldE1zZFBhdGNoZXMoKTsKKyAgICBpZiAoIW1zZFBhdGNoZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobXNkUGF0Y2hlcy5zaXplKCkgPiAxLAorICAgICAgICAgICAgICAgICJUaGUgY3VycmVudCBNU0QgcHJvdG90eXBlIG9ubHkgc3VwcG9ydHMgb25lIG91dHB1dCBwYXRjaCIpOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjdXJyZW50UGF0Y2ggPSBtc2RQYXRjaGVzLnZhbHVlQXQoMCk7CisgICAgICAgIGlmIChhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmY3VycmVudFBhdGNoLT5tUGF0Y2gsIHBhdGNoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKGN1cnJlbnRQYXRjaC0+bUhhbmRsZSwgbVVpZENhY2hlZCk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgLTEgLyppbmRleCovLCBudWxscHRyIC8qcGF0Y2hIYW5kbGUqLywKKyAgICAgICAgICAgIHBhdGNoLCAwIC8qZGVsYXlNcyovLCBtVWlkQ2FjaGVkLCBudWxscHRyIC8qcGF0Y2hEZXNjUHRyKi8pOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgTVNEIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgQUxPR0lfSUYoc3RhdHVzID09IE5PX0VSUk9SLCAiJXMoKSBQYXRjaCBjcmVhdGVkIGZyb20gTVNEX0lOIHRvICIKKyAgICAgICAgICAgImRldmljZTolcyAoZm9ybWF0OiUjeCBjaGFubmVsczolI3ggc2FtcGxlcmF0ZTolZCkiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LAorICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpCiB7CiAgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCi0gICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlcygpKS4KICAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKLSAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKLSAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGJpdCBkZXB0aCB0aGUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIG9uZQotICAgIC8vIDM6IHRoZSBwcmltYXJ5IG91dHB1dAotICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgaGFwdGljIHBsYXliYWNrIHdoZW4gcmVxdWVzdGluZyBoYXB0aWMgcGxheWJhY2sKKyAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKKyAgICAvLyAzOiB0aGUgb3V0cHV0IHdpdGggdGhlIGJpdCBkZXB0aCB0aGUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIG9uZQorICAgIC8vIDQ6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDU6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKQEAgLTEwNzksMTggKzE0NDYsNDYgQEAKICAgICB9CiAKICAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOworICAgIGNvbnN0IHNpemVfdCBoYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRm9ybWF0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXRGb3JGbGFncyA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCisgICAgLy8gRmxhZ3Mgd2hpY2ggbXVzdCBiZSBwcmVzZW50IG9uIGJvdGggdGhlIHJlcXVlc3QgYW5kIHRoZSBzZWxlY3RlZCBvdXRwdXQKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga01hbmRhdGVkRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSk7CisKICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBoYXB0aWMgY2hhbm5lbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgaGFwdGljIG91dHB1dCBpZiBwcmVzZW50LgorICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBoYXB0aWMgb3V0cHV0LCBzYW1lIGF1ZGlvIGZvcm1hdCBhbmQgc2FtcGxlIHJhdGUgYXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgaWYgKGhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBoYXB0aWMgY2hhbm5lbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgZmlyc3Qgb3V0cHV0IHRoYXQKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGhhcHRpYyBwbGF5YmFjay4KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA+PSBoYXB0aWNDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBoYXB0aWMgY2hhbm5lbCBpcyBub3Qgc3BlY2lmaWVkLCBza2lwIGhhcHRpYyBvdXRwdXQuCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGtNYW5kYXRlZEZsYWdzICYgZmxhZ3MpICE9CisgICAgICAgICAgICAgICAgKGtNYW5kYXRlZEZsYWdzICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmdldEZsYWdzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewpAQCAtMTEzOCw2NyArMTUzMywzMiBAQAogICAgIHJldHVybiBvdXRwdXRzWzBdOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKLSAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgLy8gUm91dGluZz8KLSAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOwotICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOwotICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peDsKLSAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCk7Ci0gICAgICAgIGlmICgocG9saWN5TWl4LT5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKG5ld0RldmljZSAhPSBvdXRwdXREZXNjLT5kZXZpY2UoKSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLQotICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CisgICAgdWludDMyX3QgZGVsYXlNczsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQsICZkZWxheU1zKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG5ld0RldmljZSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgIH0KLQogICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICB9CkBAIC0xMjA2LDE5ICsxNTY2LDIyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCiB7CiAgICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCiAgICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwogCiAgICAgKmRlbGF5TXMgPSAwOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisgICAgYXV0byBjbGllbnRTdHJhdGVneSA9IGNsaWVudC0+c3RyYXRlZ3koKTsKKyAgICBhdXRvIGNsaWVudEF0dHIgPSBjbGllbnQtPmF0dHJpYnV0ZXMoKTsKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKLSAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgeworICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKSAvKnNvdXJjZVRvSWdub3JlKi8pKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7CkBAIC0xMjMzLDYgKzE1OTYsMjQgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peDsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZVR5cGU7CisgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOworICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgICAgICAgICAgbmV3RGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0RldmljZVR5cGUgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOworICAgICAgICB9CisgICAgICAgIHNwIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShuZXdEZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZSwgIiVzOiBubyBkZXZpY2UgZm91bmQgdD0ldSwgYT0lcyIsIF9fZnVuY19fLCBuZXdEZXZpY2VUeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICB9CisKICAgICAvLyByZXF1aXJlc011dGVDaGVjayBpcyBmYWxzZSB3aGVuIHdlIGNhbiBieXBhc3MgbXV0ZSBzdHJhdGVneS4KICAgICAvLyBJdCBjb3ZlcnMgYSBjb21tb24gY2FzZSB3aGVuIHRoZXJlIGlzIG5vIG1hdGVyaWFsbHkgYWN0aXZlIGF1ZGlvCiAgICAgLy8gYW5kIG11dGluZyB3b3VsZCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgZGVsYXkgYW5kIGRyb3BwZWQgYXVkaW8uCkBAIC0xMjQyLDMxICsxNjIzLDM3IEBACiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCiAgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKLSAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgZGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChkZXZpY2VzICE9IG91dHB1dERlc2MtPmRldmljZXMoKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGNsaWVudFN0cmF0ZWd5LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAxIHx8ICFkZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKGRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgfQotCi0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKKyAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0KKyAgICAgICAgICAgIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSkpIHx8CisgICAgICAgICAgICAgZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSkgfHwKKyAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKSk7CiAgICAgICAgIHVpbnQzMl90IHdhaXRNcyA9IGJlYWNvbk11dGVMYXRlbmN5OwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgewogICAgICAgICAgICAgICAgIC8vIEFuIG91dHB1dCBoYXMgYSBzaGFyZWQgZGV2aWNlIGlmCiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQogICAgICAgICAgICAgICAgIC8vIC0gc3VwcG9ydHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UKICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNoYXJlZERldmljZSA9IG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcykuaXNFbXB0eSgpKTsKIAogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzOgogICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKQEAgLTEyNzYsNyArMTY2Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIG91dHB1dC4KICAgICAgICAgICAgICAgICBpZiAoc2hhcmVkRGV2aWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBkZXZpY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZXMoKSAhPSBkZXZpY2VzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjk5LDI1ICsxNjg2LDIwIEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlV2FpdE1zID0KLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSwgMCwgTlVMTCwgYWRkcmVzcywgcmVxdWlyZXNNdXRlQ2hlY2spOwotCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIGZvcmNlLCAwLCBOVUxMLCByZXF1aXJlc011dGVDaGVjayk7CiAKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQogICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOwogCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pKSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgICAgICB9CiAKQEAgLTEzMzYsNTYgKzE3MTgsMzggQEAKIAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOworICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pLCB0cnVlLCBvdXRwdXREZXNjKTsKICAgICB9CiAKLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKKyAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VzLnR5cGVzKCkpICYmIHBvbGljeU1peCAhPSBOVUxMICYmCisgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKLSAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSb3V0aW5nPwotICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIGludCBhY3Rpdml0eUNvdW50ID0gbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IChtT3V0cHV0Um91dGVzLmhhc1JvdXRlKHNlc3Npb24pICYmIChhY3Rpdml0eUNvdW50ID09IDApKTsKLQotICAgICAgICBpZiAoZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50KTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgKSB7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKQEAgLTEzOTMsNTIgKzE3NTcsNjUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKIHsKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisKICAgICBoYW5kbGVFdmVudEZvckJlYWNvbihzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUyA/IFNUT1BQSU5HX0JFQUNPTiA6IFNUT1BQSU5HX09VVFBVVCk7CiAKLSAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQorICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPiAwKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMSkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSh0cnVlKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGNsaWVudC0+c3RyYXRlZ3koKSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgICAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSB0cnVlOworICAgICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CiAgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworICAgICAgICBvdXRwdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKICAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdG9wVGltZShjbGllbnQsIHN5c3RlbVRpbWUoKSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCiAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgogICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAogICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCiAgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCiAgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CiAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjI7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNBY3RpdmUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlMiA9IGdldE5ld091dHB1dERldmljZShkZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGRlc2MtPmRldmljZSgpICE9IG5ld0RldmljZTI7CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlcyAhPSBkZXNjLT5kZXZpY2VzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzMiA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2VzKCkgIT0gbmV3RGV2aWNlczI7CiAKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzMiwgZm9yY2UsIGRlbGF5TXMpOworCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWFwcGx5IGRldmljZSBzcGVjaWZpYyB2b2x1bWUgaWYgbm90IGRvbmUgYnkgc2V0T3V0cHV0RGV2aWNlKCkKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIG5ld0RldmljZTIsIGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIG5ld0RldmljZXMyLnR5cGVzKCksIGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTQ0OCwxMCArMTgyNSwxMCBAQAogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG91dHB1dERlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX1JJTkcpLCBmYWxzZSwgb3V0cHV0RGVzYyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudC0+YXR0cmlidXRlcygpLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTE0NjEsMzUgKzE4MzgsNDEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgLy8gSWYgYW4gb3V0cHV0IGRlc2NyaXB0b3IgaXMgY2xvc2VkIGR1ZSB0byBhIGRldmljZSByb3V0aW5nIGNoYW5nZSwKKyAgICAgICAgLy8gdGhlbiB0aGVyZSBhcmUgcmFjZSBjb25kaXRpb25zIHdpdGggcmVsZWFzZU91dHB1dCBmcm9tIHRyYWNrcworICAgICAgICAvLyB0aGF0IG1heSBiZSBkZXN0cm95ZWQgKHdpdGggbm8gUGxheWJhY2tUaHJlYWQpIG9yIGEgUGxheWJhY2tUaHJlYWQKKyAgICAgICAgLy8gZGVzdHJveWVkIHNob3J0bHkgdGhlcmVhZnRlci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGVyZSB3ZSBqdXN0IGxvZyBhIHdhcm5pbmcsIGluc3RlYWQgb2YgYSBmYXRhbCBlcnJvci4KKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBSb3V0aW5nCi0gICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gc3RvcE91dHB1dCgpIG5lZWRzIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYmVmb3JlIHJlbGVhc2VPdXRwdXQoKQorICAgIC8vIG90aGVyd2lzZSB0aGVyZSBtYXkgYmUgaW5hY2N1cmF0ZSBzdHJlYW0gcmVmZXJlbmNlIGNvdW50cy4KKyAgICAvLyBUaGlzIGlzIGNoZWNrZWQgaW4gb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50IGJlbG93LgorICAgIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogfQogCi0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTUwMCwyOCArMTg4MywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCi0gICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3ggYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLCBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncywgdG9TdHJpbmcoKmF0dHIpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CiAgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLSAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2M7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWREZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGJvb2wgaXNTb3VuZFRyaWdnZXI7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCiAgICAgLy8gcG9zc2libGUKQEAgLTE1MzQsOCArMTkyMSw4IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmdldENsaWVudHNGb3JTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU0NCw3NSArMTkzMSw3MSBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJRC4KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IFVJRCBpcyBzaWxlbmNlZCwgYWxsb3cgYSBuZXcgVUlEIGNvbm5lY3Rpb24gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgVUlECi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9TZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3Igc2Vzc2lvbiAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXAgaXMgb3JkZXJlZCBieSBrZXkgdmFsdWVzIChwb3J0SWQpIGFuZCBwb3J0SWRzIGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbHkuIFNvIHRoZSBmaXJzdCBjbGllbnQgaW4gdGhpcyBsaXN0IGlzIHRoZSBvbmUgb3BlbmVkIGJ5IGF1ZGlvIGZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBtbWFwIHN0cmVhbSBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYmUgaWdub3JlZCBhcyBpdCBkb2VzIG5vdCBjb3JyZXNwb25kCisgICAgICAgICAgICAgICAgLy8gdG8gYW4gYWN0dWFsIGNsaWVudAorICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gKmNsaWVudHMuY2JlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gY2xpZW50LT51aWQoKSAmJiAhY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIGNsaWVudCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+dWlkKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKIAotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CiAKLSAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKLSAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgorICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9IGVsc2UgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgaWYgKGV4cGxpY2l0Um91dGluZ0RldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBleHBsaWNpdFJvdXRpbmdEZXZpY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQcmV2ZW50IGZyb20gc3RvcmluZyBpbnZhbGlkIHJlcXVlc3RlZCBkZXZpY2UgaWQgaW4gY2xpZW50cworICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgYXR0cmlidXRlcy5zb3VyY2UpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCi0gICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUywgIkludmFsaWQgTWl4IFR5cGUiKTsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAorICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0CisgICAgICAgICAgICAvLyBrbm93IGFib3V0IGl0IGFuZCBpcyB0aGVyZWZvcmUgY29uc2lkZXJlZCAibGVnYWN5IgorICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7CisgICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpKSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9DQVBUVVJFOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCkgewogICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9URUxFUEhPTllfUlg7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKQEAgLTE2MjAsNDMgKzIwMDMsNDkgQEAKIAogICAgIH0KIAotICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgYWRkcmVzcywgc2Vzc2lvbiwgdWlkLCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peCk7CisgICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCBhdHRyaWJ1dGVzLCBjb25maWcsIGZsYWdzLCBwb2xpY3lNaXgpOwogICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworZXhpdDoKIAotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSA/CisgICAgICAgICAgICAgICAgZGV2aWNlLT5nZXRJZCgpIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGlzU291bmRUcmlnZ2VyID0gYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbikgPiAwOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwgKmF0dHIsICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZERldmljZUlkLCBhdHRyaWJ1dGVzLnNvdXJjZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyKTsKKyAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKCppbnB1dCk7CisgICAgaW5wdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLAorICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOwogCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwpAQCAtMTY2Niw3ICsyMDU1LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgorICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gJiYKICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CkBAIC0xNjgxLDggKzIwNzAsNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgcHJvZmlsZUZsYWdzID0gZmxhZ3M7CiAgICAgZm9yICg7OykgewogICAgICAgICBwcm9maWxlRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7IC8vIHJlc2V0IGVhY2ggdGltZSB0aHJvdWdoIGxvb3AsIGluIGNhc2UgaXQgaXMgdXBkYXRlZAotICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCisgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZsYWdzKTsKICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewogICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKQEAgLTE2OTEsOSArMjA3OSw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgewogICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQogICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCi0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MpOworICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzA4LDg2ICsyMDk2LDQxIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBzb3VuZCB0cmlnZ2VyLCByZXVzZSBpbnB1dCBpZiB1c2VkIGJ5IG90aGVyIHNvdW5kIHRyaWdnZXIgb24gc2FtZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBlbHNlCisgICAgICAgICAgICAvLyAgICByZXVzZSBpbnB1dCBpZiBhY3RpdmUgY2xpZW50IGFwcCBpcyBub3QgaW4gSURMRSBzdGF0ZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QoKTsKKyAgICAgICAgICAgIGJvb2wgZG9DbG9zZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU291bmRUcmlnZ2VyICE9IGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU291bmRUcmlnZ2VyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBjbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgY2xpZW50LT5hcHBTdGF0ZSgpICE9IEFQUF9TVEFURV9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvQ2xvc2UgPSB0cnVlOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgYWxyZWFkeSBvcGVuZWQgaW5wdXQgc3RyZWFtIG9uIHRoaXMgcHJvZmlsZSBpZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBjYXB0dXJlIHNvdXJjZSBpcyBiYWNrZ3JvdW5kIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBwYXRoIHJlcXVlc3RlZCBjb25maWd1cmF0aW9ucyBtYXRjaCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IHNvdXJjZSBwcmlvcml0eSBpcyBsZXNzIHRoYW4gdGhlIGhpZ2hlc3Qgc291cmNlIHByaW9yaXR5IG9uIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIHJldXNlZCwgY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBwcm9maWxlIGZvciB0aGUgbmV3IGNsaWVudCBzbyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY29uZmlnLT5jaGFubmVsX21hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgY29uZmlnLT5mb3JtYXQpKSAmJgotICAgICAgICAgICAgICAgICAgICAoc291cmNlX3ByaW9yaXR5KGRlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShmYWxzZSAvKmFjdGl2ZU9ubHkqLykpIDwKLSAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wcmlvcml0eShpbnB1dFNvdXJjZSkpKSkgewotICAgICAgICAgICAgICAgIHJldXNlZElucHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZG9DbG9zZSkgeworICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQoZGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZXVzaW5nIGlucHV0ICVkIiwgX19GVU5DVElPTl9fLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmV1c2VkSW5wdXREZXNjICE9IDApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBzZXNzaW9ucyA9IHJldXNlZElucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyhmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgc3RvcElucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgfQotCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKICAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwpAQCAtMTc5NSwxNCArMjEzOCw3IEBACiAgICAgbENvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CiAgICAgbENvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OwogCi0gICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIC8vIHRoZSBpbnB1dHMgdmVjdG9yIG11c3QgYmUgb2Ygc2l6ZSA+PSAxLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlCi0gICAgICAgIGFkZHJlc3MgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzIDogU3RyaW5nOCgiIik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwgcHJvZmlsZUZsYWdzLCAmaW5wdXQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBoYWxJbnB1dFNvdXJjZSwgcHJvZmlsZUZsYWdzLCAmaW5wdXQpOwogCiAgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fApAQCAtMTgxOSw3ICsyMTU1LDYgQEAKICAgICB9CiAKICAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7Ci0gICAgaW5wdXREZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKIAogICAgIGFkZElucHV0KGlucHV0LCBpbnB1dERlc2MpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKQEAgLTE4MjcsMzg5ICsyMTYyLDE3NiBAQAogICAgIHJldHVybiBpbnB1dDsKIH0KIAotLy9zdGF0aWMKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHJldHVybiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB8fAotICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUik7Ci19CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MsCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbikKLXsKLSAgICAvLyBEbyBub3QgYWxsb3cgY2FwdHVyZSBpZiBhbiBhY3RpdmUgdm9pY2UgY2FsbCBpcyB1c2luZyBhIHNvZnR3YXJlIHBhdGNoIGFuZAotICAgIC8vIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UgaXMgb24gdGhlIHNhbWUgSFcgbW9kdWxlLgotICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVmaW5lIHRvIG9ubHkgaW5wdXRzIHdob3NlIHByb2ZpbGUgY29ubmVjdHMgdG8gdGhlCi0gICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaAotICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICBpbnB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpID09IG1DYWxsVHhQYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIHN0YXJ0aW5nIGNvbmN1cnJlbnQgY2FwdHVyZSBpcyBlbmFibGVkIGlmOgotICAgIC8vIDEpIGNhcHR1cmluZyBmb3IgcmUtcm91dGluZwotICAgIC8vIDIpIGNhcHR1cmluZyBmb3IgSE9UV09SRCBzb3VyY2UKLSAgICAvLyAzKSBjYXB0dXJpbmcgZm9yIEZNIFRVTkVSIHNvdXJjZQotICAgIC8vIDMpIEFsbCBvdGhlciBhY3RpdmUgY2FwdHVyZXMgYXJlIGVpdGhlciBmb3IgcmUtcm91dGluZyBvciBIT1RXT1JECi0KLSAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSB8fAotICAgICAgICAgICAgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVJbnB1dCA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoYWN0aXZlSW5wdXQtPmlucHV0U291cmNlKHRydWUpKSAmJgotICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVJbnB1dC0+bURldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBGSVhNRTogcmVtb3ZlIHdoZW4gY29uY3VycmVudCBjYXB0dXJlIGlzIHJlYWR5LiBUaGlzIGlzIGEgaGFjayB0byB3b3JrIGFyb3VuZCBidWcgYi82MzA4MzUzNy4KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgewotICAgIGlmICghbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSkgewotICAgICAgICBib29sIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBmYWxzZTsKLSAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXMgPSAwOwotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciogbk1vZHVsZXMgPSBOVUxMOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBudW1Nb2R1bGVzICE9IDApIHsKLSAgICAgICAgICAgIG5Nb2R1bGVzID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKikgY2FsbG9jKAotICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzLCBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgIGlmIChuTW9kdWxlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZhaWxlZCB0byBtYWxsb2MgdGhlIGJ1ZmZlciwgc28ganVzdCBzYXkgbm8gZm9yIG5vdywgYW5kIGhvcGUgdGhhdCB3ZSBoYXZlIG1vcmUKLSAgICAgICAgICAgICAgLy8gcmFtIHRoZSBuZXh0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBtb2R1bGUgZGVzY3JpcHRvcnMiKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXMgPSBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKG5Nb2R1bGVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Nb2R1bGVzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSAmPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb2R1bGVzW2ldLnByb3BlcnRpZXMuY29uY3VycmVudF9jYXB0dXJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUobk1vZHVsZXMpOwotICAgICAgICB9Ci0gICAgICAgIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLSAgICAgICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KQotewotCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChpbnB1dDolZCwgc2Vzc2lvbjolZCwgc2lsZW5jZWQ6JWQsIGNvbmN1cnJlbmN5OiVkKSIsCi0gICAgICAgICAgICBpbnB1dCwgc2Vzc2lvbiwgc2lsZW5jZWQsICpjb25jdXJyZW5jeSk7Ci0KLSAgICAqY29uY3VycmVuY3kgPSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIGlmICghaXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChpbnB1dERlc2MsIGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gY2xpZW50LT5zZXNzaW9uKCk7CisKKyAgICBBTE9HVigiJXMgaW5wdXQ6JWQsIHNlc3Npb246JWQpIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgc2Vzc2lvbik7CisKKyAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgaWYgKG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoKSAhPSAwKSB7Ci0gICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICB9Ci0jZWxzZQotICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKLSAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogY2FsbCBpbiBwcm9ncmVzcyIsIGlucHV0KTsKLSAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0KLSAgICAgICAgLy8gSWYgYSBVSUQgaXMgaWRsZSBhbmQgcmVjb3JkcyBzaWxlbmNlIGFuZCBhbm90aGVyIG5vdCBzaWxlbmNlZCByZWNvcmRpbmcgc3RhcnRzCi0gICAgICAgIC8vIGZyb20gYW5vdGhlciBVSUQgKGlkbGUgb3IgYWN0aXZlKSB3ZSBzdG9wIHRoZSBjdXJyZW50IGlkbGUgVUlEIHJlY29yZGluZyBpbgotICAgICAgICAvLyBmYXZvciBvZiB0aGUgbmV3IG9uZSAtICJUaGVyZSBjYW4gYmUgb25seSBvbmUiIFRNCi0gICAgICAgIGlmICghc2lsZW5jZWQpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KDApOwotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uSWQgPSBhY3RpdmVTZXNzaW9uLT5zZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgc3RvcHBpbmcgc2lsZW5jZWQgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYWN0aXZlU291cmNlID0gYWN0aXZlRGVzYy0+aW5wdXRTb3VyY2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzUHJlZW1wdGVkU2Vzc2lvbihzZXNzaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZCBmb3IgSE9UV09SRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIGZvciBIT1RXT1JEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZCBmb3IgSE9UV09SRDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzb3VuZCB0cmlnZ2VyIHNlc3Npb24gc3VwcG9ydHMgY29uY3VycmVudCBjYXB0dXJlIGlmIHRoZQotICAgICAgICAvLyBpbnB1dCBpcyBhbHNvIGEgc291bmQgdHJpZ2dlciBpbnB1dC4gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgcHJlZW1wdCBhbnkgaG90d29yZCBzdHJlYW0KLSAgICAgICAgLy8gdGhhdCdzIHJ1bm5pbmcuCi0gICAgICAgIGNvbnN0IGJvb2wgYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciA9Ci0gICAgICAgICAgICBpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkgPyBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgOiBmYWxzZTsKLQotICAgICAgICAvLyBpZiBjYXB0dXJlIGlzIGFsbG93ZWQsIHByZWVtcHQgY3VycmVudGx5IGFjdGl2ZSBIT1RXT1JEIGNhcHR1cmVzCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgaWYgKGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgJiYgYWN0aXZlRGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy5rZXlBdCgwKTsKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVIYW5kbGUgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gc2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVDsKLSAgICAgICAgICAgICAgICBzZXNzaW9ucy5hZGQoYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQcmVlbXB0ZWRTZXNzaW9ucyhzZXNzaW9ucyk7Ci0gICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIGZvciBIT1RXT1JEIHByZWVtcHRpbmcgSE9UV09SRCBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCB3aXRoIHRoZSBjb3JyZWN0IHNpbGVuY2Ugc3RhdGUKLSAgICBhdWRpb1Nlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKLQotICAgIC8vIGluY3JlbWVudCBhY3Rpdml0eSBjb3VudCBiZWZvcmUgY2FsbGluZyBnZXROZXdJbnB1dERldmljZSgpIGJlbG93IGFzIG9ubHkgYWN0aXZlIHNlc3Npb25zCisgIC8vIGluY3JlbWVudCBhY3Rpdml0eSBjb3VudCBiZWZvcmUgY2FsbGluZyBnZXROZXdJbnB1dERldmljZSgpIGJlbG93IGFzIG9ubHkgYWN0aXZlIHNlc3Npb25zCiAgICAgLy8gYXJlIGNvbnNpZGVyZWQgZm9yIGRldmljZSBzZWxlY3Rpb24KLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KDEpOworICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CisgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAKLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGlucHV0RGVzYy0+YWN0aXZlQ291bnQoKSAgPT0gMSkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKLSAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5nZXREZXZpY2VUeXBlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOworICAgIEFMT0dWKCIlcyBpbnB1dCAlZCBzb3VyY2UgPSAlZCBleGl0IiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5zb3VyY2UoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmICghY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RvcHBlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgtMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7Ci0gICAgICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOworICAgIGlucHV0RGVzYy0+c3RvcCgpOworICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPmdldERldmljZVR5cGUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOworCisgICAgICAgIC8vIGluZGljYXRlIGluYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0b3BwaW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgICAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICAgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoaW5wdXREZXNjLT5nZXREZXZpY2UoKSkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERlc2MtPmNsZWFyUHJlZW1wdGVkU2Vzc2lvbnMoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CiAKLSAgICAvLyBSb3V0aW5nCi0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQpOwogCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgQUxPR19BU1NFUlQoaW5wdXREZXNjICE9IDApOworICAgIGlucHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIG9uIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmNoYW5nZU9wZW5Db3VudCgtMSkgPT0gMCkgewotICAgICAgICBpbnB1dERlc2MtPnJlbW92ZUF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5nZXRPcGVuUmVmQ291bnQoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgQUxPR1YoIiVzKCVkKSAlenUgY2xpZW50cyByZW1haW5pbmciLCBfX2Z1bmNfXywgcG9ydElkLCBpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7CisgICAgQUxPR1YoIiVzIGV4aXQiLCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBY3RpdmVDbGllbnRzKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXQpCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dC0+Y2xpZW50c0xpc3QodHJ1ZSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgY2xvc2VDbGllbnQoY2xpZW50LT5wb3J0SWQoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCit7CisgICAgc3RvcElucHV0KHBvcnRJZCk7CisgICAgcmVsZWFzZUlucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKQEAgLTIyMjYsNyArMjM0OCw2IEBACiAgICAgICAgIH0KICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuY2xlYXIoKTsKICAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CkBAIC0yMjM2LDE5ICsyMzU3LDIxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCiB7CiAgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWF4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgZm9yIHN0cmVhbSAlZDogaW52YWxpZCBtaW4gJWQgb3IgbWF4ICVkIiwgX19mdW5jX18sIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBvdGhlciBwcml2YXRlIHN0cmVhbSB2b2x1bWVzIHdoaWNoIGZvbGxvdyB0aGlzIG9uZQogICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogICAgIH0KIH0KIApAQCAtMjI1NiwxMyArMjM3OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0KKyAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKTsKICAgICAvLyBWT0lDRV9DQUxMIGFuZCBCTFVFVE9PVEhfU0NPIHN0cmVhbSBoYXZlIG1pblZvbHVtZUluZGV4ID4gMCBidXQKICAgICAvLyBjYW4gYmUgbXV0ZWQgZGlyZWN0bHkgYnkgYW4gYXBwIHRoYXQgaGFzIE1PRElGWV9QSE9ORV9TVEFURSBwZXJtaXNzaW9uLgotICAgIGlmICgoKGluZGV4IDwgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtKSkgJiYKKyAgICBpZiAoKChpbmRleCA8IGN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpKSAmJgogICAgICAgICAgICAgISgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgJiYKICAgICAgICAgICAgIGluZGV4ID09IDApKSB8fAotICAgICAgICAgICAgKGluZGV4ID4gbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKSkpIHsKKyAgICAgICAgICAgIChpbmRleCA+IGN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewpAQCAtMjI3MCw3ICsyMzkzLDcgQEAKICAgICB9CiAKICAgICAvLyBGb3JjZSBtYXggdm9sdW1lIGlmIHN0cmVhbSBjYW5ub3QgYmUgbXV0ZWQKLSAgICBpZiAoIW1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSkgaW5kZXggPSBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pOworICAgIGlmICghY3VydmVzLmNhbkJlTXV0ZWQoKSkgaW5kZXggPSBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKIAogICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwOHgsIGluZGV4ICVkIiwKICAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOwpAQCAtMjI4MCwzMiArMjQwMywzMiBAQAogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmFkZEN1cnJlbnRWb2x1bWVJbmRleCgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGRldmljZSwgaW5kZXgpOworICAgICAgICBhdXRvICZjdXJDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oY3VyU3RyZWFtKSk7CisgICAgICAgIGN1ckN1cnZlcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7CiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgogICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKLSAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RyZWFtIGluY2x1ZGVzCisgICAgLy8gLSBUaGUgZGV2aWNlIChvciBkZXZpY2VzKSBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbSBpbmNsdWRlcwogICAgIC8vIHRoZSByZXF1ZXN0ZWQgZGV2aWNlCiAgICAgLy8gLSBGb3Igbm9uIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSwgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZSBvbiB0aGUgb3V0cHV0IGlzIGVpdGhlciB0aGUKLSAgICAvLyByZXF1ZXN0ZWQgZGV2aWNlIG9yIG9uZSBvZiB0aGUgZGV2aWNlcyBzZWxlY3RlZCBieSB0aGUgc3RyYXRlZ3kKKyAgICAvLyByZXF1ZXN0ZWQgZGV2aWNlIG9yIG9uZSBvZiB0aGUgZGV2aWNlcyBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbQogICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgogICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIShzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB8fCBpc0luQ2FsbCgpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBjdXJTdHJhdGVneSA9IGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyU3RyZWFtRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZ2V0RGV2aWNlRm9yU3RyYXRlZ3koCi0gICAgICAgICAgICAgICAgICAgIGN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyU3RyZWFtRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CiAgICAgICAgICAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgJiYKICAgICAgICAgICAgICAgICAgICAgKChjdXJTdHJlYW1EZXZpY2UgJiBkZXZpY2UpID09IDApKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0yMzE1LDE3ICsyNDM4LDE5IEBACiAgICAgICAgICAgICAgICAgY3VyU3RyZWFtRGV2aWNlIHw9IGRldmljZTsKICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJEZXZpY2UpICYgY3VyU3RyZWFtRGV2aWNlKSAhPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFjdXJ2ZXMuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoY3VyU3RyZWFtRGV2aWNlKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gcmVzY2FsZSBpbmRleCBiZWZvcmUgYXBwbHlpbmcgdG8gY3VyU3RyZWFtIGFzIHJhbmdlcyBtYXkgYmUgZGlmZmVyZW50IGZvcgorICAgICAgICAgICAgLy8gc3RyZWFtIGFuZCBjdXJTdHJlYW0KKyAgICAgICAgICAgIGludCBpZHggPSByZXNjYWxlVm9sdW1lSW5kZXgoaW5kZXgsIHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgICAgIGlmIChhcHBseVZvbHVtZSkgewogICAgICAgICAgICAgICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIHZvbHVtZSBjaGFuZ2UgZm9yIHN5c3RlbSBzdHJlYW0gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzCiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkgPyBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApOworICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaWR4LCBkZXNjLCBjdXJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCk7CiAgICAgICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjM0NSwxOCArMjQ3MCwxMTkgQEAKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBzZWxlY3RlZCBmb3IgdGhpcworICAgIC8vIHN0cmVhbSBieSB0aGUgZW5naW5lLgogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKICAgICB9CiAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKIAotICAgICppbmRleCA9ICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSk7CisgICAgKmluZGV4ID0gIGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLmdldFZvbHVtZUluZGV4KGRldmljZSk7CiAgICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIEdldCBWb2x1bWUgZ3JvdXAgbWF0Y2hpbmcgdGhlIEF1ZGlvIEF0dHJpYnV0ZXMKKyAgICBhdXRvIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIGlmICh2b2x1bWVHcm91cCA9PSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICBBTE9HRCgiJXM6IGNvdWxkIG5vdCBmaW5kIGdyb3VwIG1hdGNoaW5nIHdpdGggJXMiLCBfX0ZVTkNUSU9OX18sIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HRCgiJXM6IEZPVU5EIGdyb3VwICVkIG1hdGNoaW5nIHdpdGggJXMiLCBfX0ZVTkNUSU9OX18sIHZvbHVtZUdyb3VwLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gc2V0Vm9sdW1lR3JvdXBJbmRleChnZXRWb2x1bWVDdXJ2ZXMoYXR0ciksIHZvbHVtZUdyb3VwLCBpbmRleCwgZGV2aWNlLCBhdHRyKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVHcm91cEluZGV4KElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywgdm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IC8qYXR0cmlidXRlcyovKQoreworICAgIEFMT0dWVigiJXM6IGdyb3VwPSVkIiwgX19mdW5jX18sIGdyb3VwKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBzZXRWb2x1bWVDdXJ2ZUluZGV4KGdyb3VwLCBpbmRleCwgZGV2aWNlLCBjdXJ2ZXMpOworICAgIC8vIHVwZGF0ZSB2b2x1bWUgb24gYWxsIG91dHB1dHMgYW5kIHN0cmVhbXMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIFRoZSByZXF1ZXN0ZWQgc3RyZWFtIChvciBhIHN0cmVhbSBtYXRjaGluZyBmb3Igdm9sdW1lIGNvbnRyb2wpIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0CisgICAgLy8gLSBUaGUgZGV2aWNlIChvciBkZXZpY2VzKSBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbSBpbmNsdWRlcworICAgIC8vIHRoZSByZXF1ZXN0ZWQgZGV2aWNlCisgICAgLy8gLSBGb3Igbm9uIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSwgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZSBvbiB0aGUgb3V0cHV0IGlzIGVpdGhlciB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgZGV2aWNlIG9yIG9uZSBvZiB0aGUgZGV2aWNlcyBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbQorICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgorICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgorICAgIC8vIEBUT0RPCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIDAgLypmbGFncyovKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZUN1cnZlSW5kZXgodm9sdW1lX2dyb3VwX3Qgdm9sdW1lR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKQoreworICAgIC8vIFZPSUNFX0NBTEwgc3RyZWFtIGhhcyBtaW5Wb2x1bWVJbmRleCA+IDAgIGJ1dCBjYW4gYmUgbXV0ZWQgZGlyZWN0bHkgYnkgYW4KKyAgICAvLyBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCisgICAgLy8gSWYgdm9pY2UgaXMgbWVtYmVyIG9mIHRoZSB2b2x1bWUgZ3JvdXAsIGl0IHdpbGwgY29udGFtaW5hdGUgYWxsIHRoZSBtZW1iZXIgb2YgdGhpcyBncm91cAorICAgIGF1dG8gc3RyZWFtcyA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yVm9sdW1lR3JvdXAodm9sdW1lR3JvdXApOworICAgIGlmICgoKGluZGV4IDwgdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCkpICYmICEoaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYgaW5kZXggPT0gMCkpIHx8CisgICAgICAgICAgICAoaW5kZXggPiB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKSkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiB3cm9uZyBpbmRleCAlZCBtaW49JWQgbWF4PSVkIiwgX19GVU5DVElPTl9fLCBpbmRleCwKKyAgICAgICAgICAgICAgdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCksIHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSBtYXggdm9sdW1lIGlmIHN0cmVhbSBjYW5ub3QgYmUgbXV0ZWQKKyAgICBpZiAoIXZvbHVtZUN1cnZlcy5jYW5CZU11dGVkKCkpIGluZGV4ID0gdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisKKyAgICBBTE9HRCgiJXMgZGV2aWNlICUwOHgsIGluZGV4ICVkIiwgX19GVU5DVElPTl9fICwgZGV2aWNlLCBpbmRleCk7CisgICAgdm9sdW1lQ3VydmVzLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIHNlbGVjdGVkIGZvciB0aGlzCisgICAgLy8gc3RyZWFtIGJ5IHRoZSBlbmdpbmUuCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBnZXRWb2x1bWVJbmRleChnZXRWb2x1bWVDdXJ2ZXMoYXR0ciksIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4KGNvbnN0IElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgIGluZGV4ID0gY3VydmVzLmdldFZvbHVtZUluZGV4KGRldmljZSk7CisgICAgQUxPR1YoIiVzOiBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlLCBpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWF4KCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpCiB7CiAgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCBzdWl0YWJsZSBmb3IgZ2xvYmFsIGVmZmVjdHMuCkBAIC0yMzY4LDkgKzI1OTQsOSBAQAogICAgIC8vIDM6IFRoZSBwcmltYXJ5IG91dHB1dAogICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0yMzg2LDcgKzI2MTIsNyBAQAogCiAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQykpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cyBhY3RpdmVPbmx5ICVkIG91dHB1dCAlZCBmbGFncyAweCUwOHgiLApAQCAtMjQ0MSw3ICsyNjY3LDM2IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc2Vzc2lvbiwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgaWYgKG1FZmZlY3RzLmdldEVmZmVjdChpZCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1FZmZlY3RzLmlzRWZmZWN0RW5hYmxlZChpZCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGVmZmVjdCAlZCBlbmFibGVkIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgIHNldEVmZmVjdEVuYWJsZWQoaWQsIGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gbUVmZmVjdHMuZ2V0RWZmZWN0KGlkKTsKKyAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUlucHV0cy50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTI0NTEsMTQgKzI3MDYsMTQgQEAKICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBhY3RpdmUgPSBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluUGFzdE1zKTsKKyAgICAgICAgYWN0aXZlID0gbU91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSwgaW5QYXN0TXMpOwogICAgIH0KICAgICByZXR1cm4gYWN0aXZlOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcyk7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSwgaW5QYXN0TXMpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMjUwMywzMyArMjc1OCw0NSBAQAogICAgIHNwPEh3TW9kdWxlPiByU3VibWl4TW9kdWxlOwogICAgIC8vIGV4YW1pbmUgZWFjaCBtaXgncyByb3V0ZSB0eXBlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLIG9yIE1JWF9ST1VURV9GTEFHX1JFTkRFUiwgbm90IHRoZSBjb21iaW5hdGlvbgotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfQUxMKSA9PSBNSVhfUk9VVEVfRkxBR19BTEwpIHsKKyAgICAgICAgQXVkaW9NaXggbWl4ID0gbWl4ZXNbaV07CisgICAgICAgIC8vIE9ubHkgY2FwdHVyZSBvZiBwbGF5YmFjayBpcyBhbGxvd2VkIGluIExPT1BfQkFDSyAmIFJFTkRFUiBtb2RlCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncykgJiYgbWl4Lm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBQb2xpY3kgTWl4ICV6dSBvZiAlenU6ICIKKyAgICAgICAgICAgICAgICAgICJPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpKTsKICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyIsIGksIG1peGVzLnNpemUoKSk7CisgICAgICAgIC8vIExPT1BfQkFDSyBhbmQgTE9PUF9CQUNLIHwgUkVOREVSIGhhdmUgdGhlIHNhbWUgcmVtb3RlIHN1Ym1peCBiYWNrZW5kIGFuZCBhcmUgaGFuZGxlZAorICAgICAgICAvLyBpbiB0aGUgc2FtZSB3YXkuCisgICAgICAgIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgTE9PUF9CQUNLICVkIiwgaSwgbWl4ZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgbWl4Lm1Sb3V0ZUZsYWdzKTsKICAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKICAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKTsKICAgICAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CiAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBhZGRyZXNzICVzIiwgaSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peCwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0yNTM5LDMxICsyODA2LDM3IEBACiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoYWRkcmVzcywgJmlucHV0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CiAKLSAgICAgICAgICAgIGlmIChtaXhlc1tpXS5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBtaXhlc1tpXS5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gbWl4Lm1EZXZpY2VUeXBlOwogICAgICAgICAgICAgQUxPR1YoIiByZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgUkVOREVSLCBkZXY9MHglWCBhZGRyPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgbWl4Lm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sIGZvdW5kT3V0cHV0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMCA7IGogPCBtT3V0cHV0cy5zaXplKCkgOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKGRlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIGlmICgocGF0Y2ggIT0gMCkgJiYgKHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cm5jbXAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIGRlc2MpICE9IE5PX0VSUk9SKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXgsIGRlc2MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IHJlZ2lzdGVyIG1peCBSRU5ERVIsICBkZXY9MHglWCBhZGRyPSVzIiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE91dHB1dCA9IHRydWU7CkBAIC0yNTc0LDEyICsyODQ3LDEyIEBACiAKICAgICAgICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmICghZm91bmRPdXRwdXQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIE91dHB1dCBub3QgZm91bmQgZm9yIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjYyMCwxOCArMjg5MywxOCBAQAogICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSAgewogICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKIAotICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0yNjQxLDU3ICsyOTE0LDExNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3RleHByIHNpemVfdCBhdWRpb0Zvcm1hdFByZWZpeExlbiA9IHNpemVvZigiQVVESU9fRk9STUFUXyIpOworICAgIGZvciAoY29uc3QgYXV0byYgZm10IDogbU1hbnVhbFN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICBpZiAoaSsrICE9IDApIGRzdC0+YXBwZW5kKCIsICIpOworICAgICAgICBzdGQ6OnN0cmluZyBzZm10OworICAgICAgICBGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKGZtdCwgc2ZtdCk7CisgICAgICAgIGRzdC0+YXBwZW5kKHNmbXQuc2l6ZSgpID49IGF1ZGlvRm9ybWF0UHJlZml4TGVuID8KKyAgICAgICAgICAgICAgICBzZm10LmNfc3RyKCkgKyBhdWRpb0Zvcm1hdFByZWZpeExlbiAtIDEgOiBzZm10LmNfc3RyKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgdWlkPSVkIG51bSBkZXZpY2VzICV6dSIsIF9fRlVOQ1RJT05fXywgdWlkLCBkZXZpY2VzLnNpemUoKSk7CisgICAgLy8gdWlkL2RldmljZSBhZmZpbml0eSBpcyBvbmx5IGZvciBvdXRwdXQgZGV2aWNlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlc1tpXS5tVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRVaWREZXZpY2VBZmZpbml0aWVzKCkgZGV2aWNlPSUwOHggaXMgTk9UIGFuIG91dHB1dCBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gIG1Qb2xpY3lNaXhlcy5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyByZWV2YWx1YXRlIG91dHB1dHMgZm9yIGFsbCBnaXZlbiBkZXZpY2VzCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHgiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFkZHI9JXMiLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICBzdGF0dXNfdCByZXMgPSAgbVBvbGljeU1peGVzLmdldERldmljZXNGb3JVaWQodWlkLCBkZXZpY2VzKTsKKyAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlZXZhbHVhdGUgb3V0cHV0cyBmb3IgYWxsIGZvdW5kIGRldmljZXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSBlcnJvciBpbiBjaGVja091dHB1dHNGb3JEZXZpY2UgZm9yIGRldmljZT0lMDh4IGFkZHI9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKKyAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIHN0ZDo6c3RyaW5nIHN0YXRlTGl0ZXJhbDsKKyAgICBBdWRpb01vZGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSwgc3RhdGVMaXRlcmFsKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOworICAgIGNvbnN0IGNoYXIqIGZvcmNlVXNlc1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPSB7CisgICAgICAgICJjb21tdW5pY2F0aW9ucyIsICJtZWRpYSIsICJyZWNvcmQiLCAiZG9jayIsICJzeXN0ZW0iLAorICAgICAgICAiSERNSSBzeXN0ZW0gYXVkaW8iLCAiZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQiLCAidmlicmF0ZSByaW5naW5nIiB9OworICAgIGZvciAoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IGkgPSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT047CisgICAgICAgICBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkgPSAoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90KSgoaW50KWkgKyAxKSkgeworICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlVmFsdWUgPSBtRW5naW5lLT5nZXRGb3JjZVVzZShpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JjZSB1c2UgZm9yICVzOiAlZCIsIGZvcmNlVXNlc1tpXSwgZm9yY2VVc2VWYWx1ZSk7CisgICAgICAgIGlmIChpID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCAmJgorICAgICAgICAgICAgICAgIGZvcmNlVXNlVmFsdWUgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgiIChNQU5VQUw6ICIpOworICAgICAgICAgICAgZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhkc3QpOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBUVFMgb3V0cHV0ICVzYXZhaWxhYmxlXG4iLCBtVHRzT3V0cHV0QXZhaWxhYmxlID8gIiIgOiAibm90ICIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb25maWcgc291cmNlOiAlc1xuIiwgbUNvbmZpZy5nZXRTb3VyY2UoKS5jX3N0cigpKTsgLy8gZ2V0Q29uZmlnIG5vdCBjb25zdAorICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKKyAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZHN0KTsKKyAgICBtT3V0cHV0cy5kdW1wKGRzdCk7CisgICAgbUlucHV0cy5kdW1wKGRzdCk7CisgICAgbUVmZmVjdHMuZHVtcChkc3QpOworICAgIG1BdWRpb1BhdGNoZXMuZHVtcChkc3QpOworICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvU291cmNlcy5kdW1wKGRzdCk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5Qb2xpY3kgRW5naW5lIGR1bXA6XG4iKTsKKyAgICBtRW5naW5lLT5kdW1wKGRzdCk7Cit9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKLSAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7Ci0gICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKLSAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQgJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRUUyBvdXRwdXQgJXNcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiYXZhaWxhYmxlIiA6ICJub3QgYXZhaWxhYmxlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkdW1wKCZyZXN1bHQpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKLSAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZmQpOwotICAgIG1PdXRwdXRzLmR1bXAoZmQpOwotICAgIG1JbnB1dHMuZHVtcChmZCk7Ci0gICAgbVZvbHVtZUN1cnZlcy0+ZHVtcChmZCk7Ci0gICAgbUVmZmVjdHMuZHVtcChmZCk7Ci0gICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGZkKTsKLSAgICBtUG9saWN5TWl4ZXMuZHVtcChmZCk7Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTI3MTIsMTIgKzMwNDUsOSBAQAogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgewotICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCkBAIC0yNzM2LDkgKzMwNjYsMTIgQEAKICAgICB9CiAKICAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKKyAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgeworICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbWluX2R1cmF0aW9uX3NlY3MpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKQEAgLTI3NTgsMTUgKzMwOTEsMzQgQEAKIAogICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByb2ZpbGUgdG8gc3VwcG9ydCB0aGlzLgogICAgIC8vIEFVRElPX0RFVklDRV9OT05FCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChEZXZpY2VWZWN0b3IoKSAvKmlnbm9yZSBkZXZpY2UgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIHByb2ZpbGUgJXNmb3VuZCIsIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiKTsKICAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0X2ZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MoYXR0cmlidXRlcy5mbGFncywgJm91dHB1dF9mbGFncyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChEZXZpY2VWZWN0b3IoKSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOworICAgIEFMT0dWKCIlcygpIHByb2ZpbGUgJXNmb3VuZCB3aXRoIG5hbWU6ICVzLCAiCisgICAgICAgICJzYW1wbGUgcmF0ZTogJXUsIGZvcm1hdDogMHgleCwgY2hhbm5lbF9tYXNrOiAweCV4LCBvdXRwdXQgZmxhZ3M6IDB4JXgiLAorICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAocHJvZmlsZSAhPSAwID8gcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpIDogIm51bGwiKSwKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI4NzUsOCArMzIyNyw3IEBACiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMjk0OCw4ICszMjk5LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZEZXNjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKQEAgLTI5NzAsNyArMzMyMCw3IEBACiAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCiAgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBkZXZpY2VzLCB0cnVlLCAwLCBoYW5kbGUpOwogICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewpAQCAtMjk5OSwxNCArMzM0OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKQEAgLTMwMjAsOSArMzM2OSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPnR5cGUoKSwgdHJ1ZSwgaGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIHNldHRpbmcgZGV2aWNlICVzIG9uIG91dHB1dCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2UsIHRydWUsIGhhbmRsZSk7CiAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CkBAIC0zMDQyLDE2ICszMzkxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3JjRGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKICAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7Ci0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHNyY0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CiAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKQEAgLTMwNTksMjkgKzM0MDgsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBzaW5rRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwogCiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgc29mdHdhcmUgYnJpZGdlIGluIFBhdGNoUGFuZWwgaWY6CiAgICAgICAgICAgICAgICAgLy8gLSBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyBhcmUgb24gZGlmZmVyZW50IEhXIG1vZHVsZXMgT1IKICAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wCi0gICAgICAgICAgICAgICAgaWYgKCFzcmNEZXZpY2VEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlRGVzYykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2VEZXNjLT5tTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA8IDMpKSB7CisgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAgYnV0IG5vIHJvdXRlIGhhcyBiZWVuIGRlY2xhcmVkIGJldHdlZW4gZGV2aWNlcworICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXNyY0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgZGV2aWNlIGZvciBub3cgdG8gc2ltcGxpZnkgb3V0cHV0IHNlbGVjdGlvbiBsb2dpYwogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT50eXBlKCksIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewpAQCAtMzA5NSwyOCArMzQ0NCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCiAKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgaW5kZXgsIGhhbmRsZSwgJm5ld1BhdGNoLCAwLCB1aWQsICZwYXRjaERlc2MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zMTU2LDExICszNDg1LDExIEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CiAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOwpAQCAtMzI0OSwxMCArMzU3OCwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZyA9IHt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWcgPSB7fTsKICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwogICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwogICAgIH0KQEAgLTMyODAsMzEgKzM2MDksMzEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU3RyYXRlZ3lSb3V0ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgLy8gVGFrZSB0aGUgZmlyc3QgYXR0cmlidXRlcyBmb2xsb3dpbmcgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgYXMgaXQgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcm91dGVkCisgICAgLy8gZGV2aWNlLiBBbGwgYXR0cmlidXRlcyB3aWhpbiBhIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgInJvdXRpbmcgc3RyYXRlZ3kiCisgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcykuZnJvbnQoKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgewogICAgICAgICBpZiAobU91dHB1dHMua2V5QXQoaikgPT0gb3VwdHV0VG9Ta2lwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7Ci0gICAgICAgIGlmICghaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneSkpIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5IGlzIG9uIGFub3RoZXIgb3V0cHV0IG1peCwKICAgICAgICAgLy8gaW52YWxpZGF0ZSBhbGwgdHJhY2tzIGluIHRoaXMgc3RyYXRlZ3kgdG8gZm9yY2UgcmUgY29ubmVjdGlvbi4KICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlbGVjdCBuZXcgZGV2aWNlIG9uIHRoZSBvdXRwdXQgbWl4LgogICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKG1PdXRwdXRzLmtleUF0KGopKSA8IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcykpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLCBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zMzEyLDEzICszNjQxLDE4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJTZXNzaW9uUm91dGVzKHVpZF90IHVpZCkKIHsKICAgICAvLyByZW1vdmUgb3V0cHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKLSAgICBTb3J0ZWRWZWN0b3I8cm91dGluZ19zdHJhdGVneT4gYWZmZWN0ZWRTdHJhdGVnaWVzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbU91dHB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpKTsKKyAgICBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+IGFmZmVjdGVkU3RyYXRlZ2llczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50U3RyYXRlZ3kgPSBjbGllbnQtPnN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihhZmZlY3RlZFN0cmF0ZWdpZXMpLCBlbmQoYWZmZWN0ZWRTdHJhdGVnaWVzKSwgY2xpZW50U3RyYXRlZ3kpICE9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQoYWZmZWN0ZWRTdHJhdGVnaWVzKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLnB1c2hfYmFjayhjbGllbnQtPnN0cmF0ZWd5KCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzMyOSwxMiArMzY2MywxMiBAQAogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc291cmNlX3Q+IGFmZmVjdGVkU291cmNlczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1JbnB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQocm91dGUtPm1Tb3VyY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQoY2xpZW50LT5zb3VyY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzQyLDcgKzM2NzYsNyBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzVG9DbG9zZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+aW5wdXRTb3VyY2UoKSkgPj0gMCkgeworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5zb3VyY2UoKSkgPj0gMCkgewogICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5hZGQoaW5wdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM1NCw4ICszNjg4LDggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+dWlkKCkgPT0gdWlkKSB7CiAgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzY3LDg3ICszNzAxLDExMCBAQAogewogICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwogICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0lOUFVUKTsKLSAgICAqZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0hPVFdPUkQpOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX0hPVFdPUkQgfTsKKyAgICAqZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHIpLT50eXBlKCk7CiAKICAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmFjcXVpcmVTZXNzaW9uKCpzZXNzaW9uLCAqaW9IYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQogewotICAgIEFMT0dWKCIlcyBzb3VyY2UgJXAgYXR0cmlidXRlcyAlcCBoYW5kbGUgJXAiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlKTsKLSAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzIGludmFsaWQgYXJndW1lbnQ6IHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLQogICAgIGlmIChzb3VyY2UtPnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fAogICAgICAgICAgICAgc291cmNlLT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgQUxPR1YoIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKKyAgICAgICAgQUxPR1coIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9CiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSk7Ci0gICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVigiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlLT5leHQuZGV2aWNlLmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGlmIChzcmNEZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0KLSAgICAgICAgICAgIG5ldyBBdWRpb1NvdXJjZURlc2NyaXB0b3Ioc3JjRGV2aWNlRGVzYywgYXR0cmlidXRlcywgdWlkKTsKIAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2ggPSB7fTsKICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmZHVtbXlQYXRjaCwgdWlkKTsKLSAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjID0gcGF0Y2hEZXNjOworCisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG5ldyBTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICpwb3J0SWQsIHVpZCwgKmF0dHJpYnV0ZXMsIHBhdGNoRGVzYywgc3JjRGV2aWNlLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqYXR0cmlidXRlcykpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpLCBzb3VyY2VEZXNjKTsKLSAgICAgICAgKmhhbmRsZSA9IHNvdXJjZURlc2MtPmdldEhhbmRsZSgpOworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZCgqcG9ydElkLCBzb3VyY2VEZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAKICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIG9uZSBwYXRjaCBwZXIgc291cmNlLgogICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+bURldmljZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9IHNvdXJjZURlc2MtPnNyY0RldmljZSgpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IHNpbmtEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKHNpbmtEZXZpY2UsIFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VWZWN0b3Igc2lua0RldmljZXMgPQorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgdHJ1ZSk7CisgICAgQUxPR19BU1NFUlQoIXNpbmtEZXZpY2VzLmlzRW1wdHkoKSwgImNvbm5lY3RBdWRpb1NvdXJjZSgpOiBubyBkZXZpY2UgZm91bmQgZm9yIGF0dHJpYnV0ZXMiKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gc2lua0RldmljZXMuaXRlbUF0KDApOworICAgIEFMT0dfQVNTRVJUKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHNpbmtEZXZpY2UpLCAiJXM6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tUGF0Y2g7CiAKLSAgICBpZiAoc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpID09Ci0gICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMyAmJgotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSAmJgorICAgICAgICAgICAgc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA+PSAzICYmCisgICAgICAgICAgICBzaW5rRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpICYmCisgICAgICAgICAgICBzcmNEZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBBTE9HVigiJXMgRGV2aWNlIHRvIERldmljZSByb3V0ZSBzdXBwb3J0ZWQgYnkgPj0zLjAgSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogbWF5IGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIHdlIHNob3VsZCB1c2UgSFcgb3IgU1cgcGF0Y2gKICAgICAgICAgLy8gICBjcmVhdGUgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgIC8vICAgY3JlYXRlIEh3b3V0cHV0IGFuZCBhZGQgdG8gbUh3T3V0cHV0cwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZSwgbU91dHB1dHMpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPQotICAgICAgICAgICAgICAgIHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmNoYW5uZWxfbWFzazsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmZvcm1hdDsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLCAmc3RyZWFtLCBzb3VyY2VEZXNjLT51aWQoKSwgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICUwOHggaXMgZHVwbGljYXRlZCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKQEAgLTM0NjAsNTEgKzM4MTcsNTYgQEAKICAgICAgICAgLy8gYmUgY29ubmVjdGVkIGFzIHdlbGwgYXMgdGhlIHN0cmVhbSB0eXBlIGZvciB2b2x1bWUgY29udHJvbAogICAgICAgICAvLyAtIHRoZSBzaW5rIGlzIGRlZmluZWQgYnkgd2hhdGV2ZXIgb3V0cHV0IGRldmljZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSBvdXRwdXQKICAgICAgICAgLy8gdGhvdWdoIHdoaWNoIHRoaXMgcGF0Y2ggaXMgcm91dGVkLgotICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID0gMDsKLSAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzBdLCBOVUxMKTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzFdLCBOVUxMKTsKLSAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsCisgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjRGV2aWNlKS5hZGRTb3VyY2Uob3V0cHV0RGVzYywgeyAuc3RyZWFtID0gc3RyZWFtIH0pOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tUGF0Y2ggPSAqcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQoc291cmNlRGVzYy0+cG9ydElkKCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgcG9ydElkIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0RGVzYyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5hZGRDbGllbnQoc291cmNlRGVzYyk7CisKICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgc2lua0RldmljZSwgTlVMTCwgJmRlbGF5TXMpOworICAgICAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7CiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICBzb3VyY2VEZXNjLT5tU3dPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKICAgICAgICAgaWYgKGRlbGF5TXMgIT0gMCkgewogICAgICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUsIHNvdXJjZURlc2MtPm1QYXRjaERlc2MpOworICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgYWRkQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSwgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCkpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgX191bnVzZWQpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKGhhbmRsZSk7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUZvcihwb3J0SWQpOworICAgIEFMT0dWKCIlcyBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgIGlmIChzb3VyY2VEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIGhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIHNvdXJjZSBmb3IgcG9ydCBJRCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogCi0gICAgbUF1ZGlvU291cmNlcy5yZW1vdmVJdGVtKGhhbmRsZSk7CisgICAgbUF1ZGlvU291cmNlcy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU1Miw1MCArMzkxNCw2IEBACiAgICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFZlY3RvciYgZm9ybWF0cykgewotICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBTdHJpbmc4IHJlcGx5OwotICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBpb0hhbmRsZSwgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cykpOwotICAgIEFMT0dWKCIlczogc3VwcG9ydGVkIGZvcm1hdHMgJXMiLCBfX0ZVTkNUSU9OX18sIHJlcGx5LnN0cmluZygpKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKLSAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZm9ybWF0LCBiYWlsaW5nIG91dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGZvciAoYXV0byBmb3JtYXQgOiBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSkpIHsKLSAgICAgICAgLy8gT25seSBBVURJT19GT1JNQVRfQUFDX0xDIHdpbGwgYmUgdXNlZCBpbiBTZXR0aW5ncyBVSSBmb3IgYWxsIEFBQyBmb3JtYXRzLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQUFDX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDX0xDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgZXhpc3QgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdHNbaV0pIHsKLSAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoU1VSUk9VTkRfRk9STUFUU1tpXSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4aXN0ICYmIGlzU3Vycm91bmRGb3JtYXQpIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLApAQCAtMzYwNSwyNjEgKzM5MjMsMTk5IEBACiAgICAgICAgICAgICAoc3Vycm91bmRGb3JtYXRzID09IE5VTEwgfHwgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCA9PSBOVUxMKSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldFN1cnJvdW5kRm9ybWF0cygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCIsCi0gICAgICAgICAgICAqbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQpOwotCi0gICAgLy8gT25seSByZXR1cm4gdmFsdWUgaWYgdGhlcmUgaXMgSERNSSBvdXRwdXQuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CisgICAgQUxPR1YoIiVzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIHJlcG9ydGVkICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCAqbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsIHJlcG9ydGVkKTsKIAogICAgIHNpemVfdCBmb3JtYXRzV3JpdHRlbiA9IDA7CiAgICAgc2l6ZV90IGZvcm1hdHNNYXggPSAqbnVtU3Vycm91bmRGb3JtYXRzOwotICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSAwOwotICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsgLy8gVXNlcyBwcmltYXJ5IHN1cnJvdW5kIGZvcm1hdHMgb25seQogICAgIGlmIChyZXBvcnRlZCkgewotICAgICAgICAvLyBPbmx5IGdldCBzdXJyb3VuZCBmb3JtYXRzIHdoaWNoIGFyZSByZXBvcnRlZCBieSBkZXZpY2UuCi0gICAgICAgIC8vIEZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUk7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLSAgICAgICAgYm9vbCByZXBvcnRlZEZvcm1hdEZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMuCi0gICAgICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfSERNSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0cy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzLml0ZW1BdChqKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXRzLml0ZW1BdChqKSwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNYXggT3V0cHV0IG51bWJlciAldSBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tYXhPcGVuQ291bnQsIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dCwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAvLyBSZXR1cm4gZm9ybWF0cyBmcm9tIGFsbCBkZXZpY2UgcHJvZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBieQorICAgICAgICAvLyBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07CisgICAgICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0cyA9CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHN1cHBvcnRlZEZvcm1hdHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHN1cHBvcnRlZEZvcm1hdHNbal0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLnNlY29uZC5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlcG9ydGVkRm9ybWF0Rm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKFNVUlJPVU5EX0ZPUk1BVFNbaV0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gZm9ybWF0cy5zaXplKCk7CisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdDogZm9ybWF0cykgewogICAgICAgICBpZiAoZm9ybWF0c1dyaXR0ZW4gPCBmb3JtYXRzTWF4KSB7Ci0gICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0c1tpXTsKLSAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGZvcm1hdHNbaV0gPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmZpbmQoQUFDX0ZPUk1BVFNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0OworICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZm9yY2VVc2UpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTDoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY291bnQoZm9ybWF0KSAhPSAwOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtU3Vycm91bmRGb3JtYXRzLmZpbmQoZm9ybWF0c1tpXSkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIEFVVE8gb3IgQUxXQVlTID0+IHRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkW2Zvcm1hdHNXcml0dGVuKytdID0gZm9ybWF0RW5hYmxlZDsKICAgICAgICAgfQotICAgICAgICAoKm51bVN1cnJvdW5kRm9ybWF0cykrKzsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewotICAgIC8vIENoZWNrIGlmIGF1ZGlvIGZvcm1hdCBpcyBhIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IFNVUlJPVU5EX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1N1cnJvdW5kRm9ybWF0KSB7CisgICAgQUxPR1YoIiVzKCkgZm9ybWF0IDB4JVggZW5hYmxlZCAlZCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CisgICAgY29uc3QgYXV0byYgZm9ybWF0SXRlciA9IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZmluZChhdWRpb0Zvcm1hdCk7CisgICAgaWYgKGZvcm1hdEl0ZXIgPT0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5lbmQoKSkgeworICAgICAgICBBTE9HVygiJXMoKSBmb3JtYXQgMHglWCBpcyBub3QgYSBrbm93biBzdXJyb3VuZCBmb3JtYXQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIE1BTlVBTC4KLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCi0gICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKLSAgICBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCkgIT0KKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICBBTE9HVygiJXMoKSBub3QgaW4gbWFudWFsIG1vZGUgZm9yIHN1cnJvdW5kIHNvdW5kIGZvcm1hdCBzZWxlY3Rpb24iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiBlbmFibGVkKQotICAgICAgICAgICAgfHwgKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgPT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiAhZW5hYmxlZCkpIHsKKyAgICBpZiAoKG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY291bnQoYXVkaW9Gb3JtYXQpICE9IDApID09IGVuYWJsZWQpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIC8vIFRoZSBvcGVyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIHRoZXJlIGlzIEhETUkgb3V0cHV0IGF2YWlsYWJsZS4KLSAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gc3Vycm91bmRGb3JtYXRzQmFja3VwKG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpOwogICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KHN1YkZvcm1hdCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVyYXNlKHN1YkZvcm1hdCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzsKICAgICBib29sIHByb2ZpbGVVcGRhdGVkID0gZmFsc2U7Ci0gICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soCiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCi0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPmFkZHJlc3MoKTsKICAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaU91dHB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKICAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICAvLyBGSVhNRTogV2h5IGRvaW5nIHRoaXMgZm9yIGlucHV0IEhETUkgZGV2aWNlcyBpZiB3ZSBkb24ndCBhdWdtZW50IHRoZWlyIHJlcG9ydGVkIGZvcm1hdHM/CisgICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0hETUkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKTsKICAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKICAgICB9CiAKLSAgICAvLyBVbmRvIHRoZSBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSBkdWUgdG8gbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZC4KICAgICBpZiAoIXByb2ZpbGVVcGRhdGVkKSB7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQsIHVuZG9pbmcgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6Om1vdmUoc3Vycm91bmRGb3JtYXRzQmFja3VwKTsKICAgICB9CiAKICAgICByZXR1cm4gcHJvZmlsZVVwZGF0ZWQgPyBOT19FUlJPUiA6IElOVkFMSURfT1BFUkFUSU9OOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjpzZXRSZWNvcmRTaWxlbmNlZCh1aWQ6JWQsIHNpbGVuY2VkOiVkKSIsIHVpZCwgc2lsZW5jZWQpOworICAgIEFMT0dWKCIlcyh1aWQ6JWQsIHN0YXRlOiVkKSIsIF9fZnVuY19fLCB1aWQsIHN0YXRlKTsKIAotICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOwotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdChqKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT51aWQoKSA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXREZXNjLT5jbGllbnRzTGlzdChmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgaWYgKHVpZCA9PSBjbGllbnQtPnVpZCgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRBcHBTdGF0ZShzdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCiB7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgYXVkaW9Qb3J0OworICAgICAgICAgICAgb3V0UHJvZmlsZS0+dG9BdWRpb1BvcnQoJmF1ZGlvUG9ydCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF1ZGlvUG9ydC5udW1fY2hhbm5lbF9tYXNrczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvUG9ydC5jaGFubmVsX21hc2tzW2ldICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCit7CisgICAgQUxPR1YoIiVzIHBvcnQgSWQgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogICAgIGlmIChwYXRjaERlc2MgPT0gMCkgewogICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBubyBwYXRjaCB3aXRoIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICByZW1vdmVBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKIAotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgIGlmIChzd091dHB1dERlc2MgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc3RyZWFtLCBmYWxzZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzb3VyY2VEZXNjKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc3dPdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tSHdPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgewogICAgICAgICAgIC8vICAgcmVsZWFzZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAvLyAgIGNsb3NlIEh3b3V0cHV0IGFuZCByZW1vdmUgZnJvbSBtSHdPdXRwdXRzCkBAIC0zODcwLDE2ICs0MTI2LDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dCgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1NvdXJjZXMuc2l6ZSgpOyBpKyspICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9Ci0gICAgICAgICAgICAgICAgKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGF0dHIsIHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zODk1LDcgKzQxNTAsNiBAQAogICAgIHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbisrOwogfQogCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgogLy8gVHJlYmxpemVkIGF1ZGlvIHBvbGljeSB4bWwgY29uZmlnIHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KIHN0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQogICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9zeXN0ZW0vZXRjIn07CkBAIC0zOTI0LDQzICs0MTc4LDMzIEBACiAKICAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwogICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBjb25maWcpOworICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCAmY29uZmlnKTsKICAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0U291cmNlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotI2VuZGlmCiAKIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZm9yVGVzdGluZyovKQogICAgIDoKLSAgICBtVWlkQ2FjaGVkKGdldHVpZCgpKSwKKyAgICBtVWlkQ2FjaGVkKEFJRF9BVURJT1NFUlZFUiksIC8vIG5vIG5lZWQgdG8gY2FsbCBnZXR1aWQoKSwgdGhlcmUncyBvbmx5IG9uZSBvZiB1cyBydW5uaW5nLgogICAgIG1wQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKICAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKj4obVZvbHVtZUN1cnZlcy5nZXQoKSkpLAotI2Vsc2UKLSAgICBtVm9sdW1lQ3VydmVzKG5ldyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UpLAotI2VuZGlmCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgbURlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKICAgICBtQmVhY29uTXV0ZWQoZmFsc2UpLAogICAgIG1UdHNPdXRwdXRBdmFpbGFibGUoZmFsc2UpLAogICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKLSAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCisgICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKQogewogfQogCkBAIC0zOTcxLDIxICs0MjE1LDIyIEBACiAgICAgaW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7Ci0jZWxzZQotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKKy8vICBUaGlzIGNoZWNrIGlzIHRvIGNhdGNoIGFueSBsZWdhY3kgcGxhdGZvcm0gdXBkYXRpbmcgdG8gUSB3aXRob3V0IGhhdmluZworLy8gIHN3aXRjaGVkIHRvIFhNTCBzaW5jZSBpdHMgZGVwcmVjYXRpb24gb24gTy4KKy8vIFRPRE86IGFmdGVyIFEgcmVsZWFzZSwgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGZsYWcgYXMgWE1MIGlzIG5vdyB0aGUgb25seQorLy8gICAgICAgIG9wdGlvbiBhbmQgYWxsIGxlZ2FjeSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gWE1MLgorI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCisjZXJyb3IgQXVkaW8gcG9saWN5IG5vIGxvbmdlciBzdXBwb3J0cyBsZWdhY3kgLmNvbmYgY29uZmlndXJhdGlvbiBmb3JtYXQKICNlbmRpZgorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKKyAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKICAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplKCkgewotICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoZ2V0Q29uZmlnKCkuaXNTcGVha2VyRHJjRW5hYmxlZCgpKTsKLQogICAgIC8vIE9uY2UgcG9saWN5IGNvbmZpZyBoYXMgYmVlbiBwYXJzZWQsIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUgYW5kIGluaXRpYWxpemUgaXQuCiAgICAgYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOwogICAgIGlmICghZW5naW5lSW5zdGFuY2UpIHsKQEAgLTQwMDcsOCArNDI1Miw2IEBACiAKICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcwogICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlc0FsbCkgewogICAgICAgICBod01vZHVsZS0+c2V0SGFuZGxlKG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUoaHdNb2R1bGUtPmdldE5hbWUoKSkpOwogICAgICAgICBpZiAoaHdNb2R1bGUtPmdldEhhbmRsZSgpID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewpAQCAtNDAzNyw1MSArNDI4MCw0OSBAQAogICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpOworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsUHJvZmlsZURldmljZXMgPSBzdXBwb3J0ZWREZXZpY2VzLmZpbHRlcihtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzdXBwb3J0ZWREZXZpY2UgPSAwOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkRGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIHByb2ZpbGUncyBTdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCi0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VGb3JUeXBlKG91dHB1dERldmljZVR5cGVzKTsKKyAgICAgICAgICAgICAgICAvLyBjaG9vc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMuCisgICAgICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBhdmFpbFByb2ZpbGVEZXZpY2VzLml0ZW1BdCgwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzdXBwb3J0ZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgcHJvZmlsZVR5cGUsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOwotCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBzdXBwb3J0ZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZXMgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICAgfQogICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCiAgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdApAQCAtNDA5Niw4NSArNDMzNyw2OCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUoaW5wdXREZXZpY2VUeXBlcyk7Ci0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIEFMT0dWKCIgIGZvciBpbnB1dCBkZXZpY2UgMHgleCB1c2luZyBhZGRyZXNzICVzIiwgcHJvZmlsZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoaW5wdXREZXZpY2VzLnNpemUoKSA9PSAwLCAiSW5wdXQgZGV2aWNlIGxpc3QgaXMgZW1wdHkhIik7Ci0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4obnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2RGVzYy0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQoaW5Qcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICVzIG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiT3V0cHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0pOwotICAgICAgICAgICAgY29udGludWU7CisgICAgYXV0byBjaGVja0FuZFNldEF2YWlsYWJsZSA9IFt0aGlzXShhdXRvJiBkZXZpY2VzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkZXZpY2UgJXMgaXMgdW5yZWFjaGFibGUiLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERldmljZSBpcyBub3cgdmFsaWRhdGVkIGFuZCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7Ci0gICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KKyAgICB9OworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBjaGVja0FuZFNldEF2YWlsYWJsZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKwogICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKLSAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKKyAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgIEFMT0dFX0lGKG1EZWZhdWx0T3V0cHV0RGV2aWNlICE9IDAsICJEZWZhdWx0IGRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsCisgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgIH0KICAgICAvLyBJZiBtaWNyb3Bob25lcyBhZGRyZXNzIGlzIGVtcHR5LCBzZXQgaXQgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzID0gU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JBQ0tfTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQyMDUsNyArNDQyOSw3IEBACiAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzQWxsLmNsZWFyKCk7Ci0gICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CisgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKQEAgLTQyMzgsNDQgKzQ0NjIsMjggQEAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICBkZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlQnlBZGRyZXNzKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgaWYgKGRldkRlc2MgIT0gMCkgewotICAgICAgICBBTE9HVigiZmluZElvSGFuZGxlc0J5QWRkcmVzcygpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBzYW1lIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZpY2UtPnR5cGUoKTsKKyAgICBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0gZGV2aWNlLT5hZGRyZXNzKCk7CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CiAKLSAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgewogICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICAgICAgZGV2RGVzYy0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgIGRldmljZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKQEAgLTQyODMsMTMgKzQ0OTEsMTAgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00Mjk3LDcgKzQ1MDIsNyBAQAogICAgICAgICBBTE9HVigiICBmb3VuZCAlenUgcHJvZmlsZXMsICV6dSBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQzMTMsOCArNDUxOCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00MzMwLDE2ICs0NTM1LDE2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MzU4LDcgKzQ1NjMsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIGRldmljZSwgYWRkcmVzcywgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgRGV2aWNlVmVjdG9yKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDM2NywxNCArNDU3MywxNSBAQAogCiAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiBhZGRyZXNzICE9ICIwIikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoYWRkcmVzcywgcG9saWN5TWl4KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChhZGRyZXNzLCBwb2xpY3lNaXgpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKIAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpKSB7CkBAIC00NDA2LDI4ICs0NjEzLDI4IEBACiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmb3IgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgLy8gTG9hZCBkaWdpdGFsIGZvcm1hdCBpbmZvIG9ubHkgZm9yIGRpZ2l0YWwgZGV2aWNlcwotICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZShkZXY9MHgleCwgYWRkcj0lcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIERldmljZVZlY3RvcihkZXZpY2UpLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKQEAgLTQ0MzYsMTAgKzQ2NDMsMTAgQEAKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoIG9uIGRldmljZQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgPT0gZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGRldmljZSwgYWRkcmVzcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwpAQCAtNDQ1MCw3ICs0NjU3LDcgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKQEAgLTQ0NjIsMjQgKzQ2NjksMjIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKIAotICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgewogICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICAgICAgZGV2RGVzYy0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgIGRldmljZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIGlucHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlVHlwZXMoZGV2aWNlLT50eXBlKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CiAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKICAgICAgICAgICAgIH0KQEAgLTQ0OTMsMTkgKzQ2OTgsMTYgQEAKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKIAotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtNDUyMCw4ICs0NzIyLDggQEAKICAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDU0MCwxNCArNDc0MiwxNCBAQAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzID0gZGV2aWNlLT5hZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ1NjQsMjAgKzQ3NjYsMjEgQEAKICAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAogCiAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sICAKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTQ1ODUsNyArNDc4OCw3IEBACiAgICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvcGVuZWQgaW5wdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKICAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgICAgIGlmICghKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0RGV2aWNlKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSkpKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKICAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKQEAgLTQ1OTcsNyArNDgwMCw3IEBACiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpLnNpemUoKTsKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKQEAgLTQ2MTQsMzggKzQ4MTcsMzEgQEAKIHsKICAgICBBTE9HVigiY2xvc2VPdXRwdXQoJWQpIiwgb3V0cHV0KTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGNsb3NpbmdPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChjbG9zaW5nT3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChvdXRwdXREZXNjKTsKKyAgICBtUG9saWN5TWl4ZXMuY2xvc2VPdXRwdXQoY2xvc2luZ091dHB1dCk7CiAKICAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVkIG91dHB1dHMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgYmVpbmcgcmVtb3ZlZC4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCi0gICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKLSAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgewotICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOwotICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOwotICAgICAgICAgICAgfQorICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0ID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGR1cE91dHB1dC0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0IHx8IGR1cE91dHB1dC0+bU91dHB1dDIgPT0gY2xvc2luZ091dHB1dCkpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiByZW1haW5pbmdPdXRwdXQgPQorICAgICAgICAgICAgICAgIGR1cE91dHB1dC0+bU91dHB1dDEgPT0gY2xvc2luZ091dHB1dCA/IGR1cE91dHB1dC0+bU91dHB1dDIgOiBkdXBPdXRwdXQtPm1PdXRwdXQxOwogICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAogICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQogICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KICAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCi0gICAgICAgICAgICBib29sIHdhc0FjdGl2ZSA9IG91dHB1dERlc2MyLT5pc0FjdGl2ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGJvb2wgd2FzQWN0aXZlID0gcmVtYWluaW5nT3V0cHV0LT5pc0FjdGl2ZSgpOworICAgICAgICAgICAgLy8gTm90ZTogbm8tb3Agb24gdGhlIGNsb3Npbmcgb3V0cHV0IHdoZXJlIGFsbCBjbGllbnRzIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluYWN0aXZlCisgICAgICAgICAgICBkdXBPdXRwdXQtPnNldEFsbENsaWVudHNJbmFjdGl2ZSgpOwogICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCiAgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQogICAgICAgICAgICAgaWYgKHdhc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nT3V0cHV0LT5zdG9wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKQEAgLTQ2NTcsNyArNDg1Myw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCi0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGNsb3NpbmdPdXRwdXQtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CiAgICAgICAgICh2b2lkKSAvKnN0YXR1c190IHN0YXR1cyovIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKQEAgLTQ2NjUsMTAgKzQ4NjEsMjYgQEAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9CiAKLSAgICBvdXRwdXREZXNjLT5jbG9zZSgpOworICAgIGNsb3NpbmdPdXRwdXQtPmNsb3NlKCk7CiAKICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisKKyAgICAvLyBNU0QgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHRvIHN1cHBvcnQgYSBub24tTVNEIGRpcmVjdCBvdXRwdXQuIFJlc2V0IE1TRCBwYXRjaCBpZgorICAgIC8vIG5vIGRpcmVjdCBvdXRwdXRzIGFyZSBvcGVuLgorICAgIGlmICghZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGJvb2wgZGlyZWN0T3V0cHV0T3BlbiA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0tPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgIGRpcmVjdE91dHB1dE9wZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZGlyZWN0T3V0cHV0T3BlbikgeworICAgICAgICAgICAgQUxPR1YoIm5vIGRpcmVjdCBvdXRwdXRzIG9wZW4sIHJlc2V0IE1TRCBwYXRjaCIpOworICAgICAgICAgICAgc2V0TXNkUGF0Y2goKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCkBAIC00NjgzLDYgKzQ4OTUsNyBAQAogCiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKIAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGlucHV0RGVzYy0+Z2V0RGV2aWNlKCk7CiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CkBAIC00NjkzLDUxICs0OTA2LDY3IEBACiAKICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKKworICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkgJiYKKyAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgeworICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgfQogfQogCi1Tb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cykKK1NvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlcygKKyAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cykKIHsKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CiAKLSAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgQUxPR1ZWKCIlcygpIGRldmljZXMgJXMiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJXp1IGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgIEFMT0dWVigib3V0cHV0ICV6dSBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSVzIiwKICAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpOwotICAgICAgICBpZiAoKGRldmljZSAmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSkgPT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBmb3VuZCBvdXRwdXQgJWQiLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0c0FsbERldmljZXMoZGV2aWNlcykKKyAgICAgICAgICAgICAgICAmJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgIEFMT0dWVigiJXMoKSBmb3VuZCBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgb3Blbk91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvdXRwdXRzOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoc3RkOjpmdW5jdGlvbjxib29sKCk+IG9uT3V0cHV0c0NoZWNrZWQpCiB7Ci0gICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKKyAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKyAgICBpZiAob25PdXRwdXRzQ2hlY2tlZCAhPSBudWxscHRyICYmIG9uT3V0cHV0c0NoZWNrZWQoKSkgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgIT0gMCkgeworICAgICAgICBzZXRNc2RQYXRjaCgpOwogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmZvbGxvd3NTYW1lUm91dGluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJBdHRyKSBjb25zdAogewotICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOworICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGxBdHRyKSA9PQorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyQXR0cik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIGF1dG8gcHNJZCA9IG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cik7CisKKyAgICBEZXZpY2VWZWN0b3Igb2xkRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIDAsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCAwLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhvbGREZXZpY2VzLCBtUHJldmlvdXNPdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhuZXdEZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAvLyBhbHNvIHRha2UgaW50byBhY2NvdW50IGV4dGVybmFsIHBvbGljeS1yZWxhdGVkIGNoYW5nZXM6IGFkZCBhbGwgb3V0cHV0cyB3aGljaCBhcmUKICAgICAvLyBhc3NvY2lhdGVkIHdpdGggcG9saWNpZXMgaW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIG91dHB1dCB2ZWN0b3JzCi0gICAgQUxPR1ZWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiKTsKKyAgICBBTE9HVlYoIiVzKCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiLCBfX2Z1bmNfXyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByZXZpb3VzT3V0cHV0cy5zaXplKCkgOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CkBAIC00NzUzLDcgKzQ5ODIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgIGlmIChzcmNPdXRwdXRzICE9IGRzdE91dHB1dHMpIHsKICAgICAgICAgLy8gZ2V0IG1heGltdW0gbGF0ZW5jeSBvZiBhbGwgc291cmNlIG91dHB1dHMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG11dGUgdGltZSBndWFyYW50ZWVpbmcKICAgICAgICAgLy8gYXVkaW8gZnJvbSBpbnZhbGlkYXRlZCB0cmFja3Mgd2lsbCBiZSByZW5kZXJlZCB3aGVuIHVubXV0aW5nCiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwpAQCAtNDc2Myw0OCArNDk5Miw2NCBAQAogICAgICAgICAgICAgICAgIG1heExhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKKyAgICAgICAgQUxPR1ZfSUYoIShzcmNPdXRwdXRzLmlzRW1wdHkoKSB8fCBkc3RPdXRwdXRzLmlzRW1wdHkoKSksCisgICAgICAgICAgICAgICIlczogc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlcyB0byBvdXRwdXQgJXMiLCBfX2Z1bmNfXywgcHNJZCwKKyAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoc3JjT3V0cHV0c1swXSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoZHN0T3V0cHV0c1swXSkuY19zdHIoKSk7CiAgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dCA6IHNyY091dHB1dHMpIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUZvcihzcmNPdXQpOwotICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsIG5ld0RldmljZSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHNJZCkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHNJZCwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHBzSWQsIGZhbHNlLCBkZXNjLCBtYXhMYXRlbmN5ICogTEFURU5DWV9NVVRFX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChzcmNPdXQsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKICAgICAgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJlYW0gZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJlYW0gKGFuZCBsaW5rZWQpIGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgZm9yIChhdXRvIHN0cmVhbSA6ICBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwc0lkKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiB7Ci0gICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOwotICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpIHsKKyAgICBzdGQ6OnNldDxhdWRpb19zdHJlYW1fdHlwZV90PiBzdHJlYW1zVG9JbnZhbGlkYXRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjcmlwdG9yID0gbU91dHB1dHNbaV07CisgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50IDogb3V0cHV0RGVzY3JpcHRvci0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgLy8gRklYTUUgY29kZSBkdXBsaWNhdGVkIGZyb20gZ2V0T3V0cHV0Rm9yQXR0ckludAorICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeURlc2NzOworICAgICAgICAgICAgbVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoY2xpZW50LT5hdHRyaWJ1dGVzKCksIGNsaWVudC0+dWlkKCksIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5RGVzY3MpOworICAgICAgICAgICAgaWYgKCFzdGQ6OmVxdWFsKGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA6IHN0cmVhbXNUb0ludmFsaWRhdGUpIHsKKyAgICAgICAgQUxPR0QoIiVzIEludmFsaWRhdGUgc3RyZWFtICVkIGR1ZSB0byBzZWNvbmRhcnkgb3V0cHV0IGNoYW5nZSIsIF9fZnVuY19fLCBzdHJlYW0pOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQpAQCAtNDg1NywxMDggKzUxMDIsODcgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQorRGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZm9yY2VkIGJ5IHBhdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYW4gYWN0aXZlIHN0cmVhbSBvbiB0aGlzIG91dHB1dCBhbmQKLSAgICAvLyB1c2UgaXQgaW4gcHJpb3JpdHkgYmVmb3JlIGFueSBvdGhlciBydWxlCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShvdXRwdXREZXNjLCBQUk9EVUNUX1NUUkFURUdZX05PTkUsIGFjdGl2ZSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQogCi0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBMZWdhY3kgRW5naW5lIGNhbm5vdCB0YWtlIGNhcmUgb2YgYnVzIGRldmljZXMgYW5kIG1peCwgc28gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNvbmZsaWN0CisgICAgLy8gb2Ygc2V0Rm9yY2VVc2UgLyBEZWZhdWx0IEJ1cyBkZXZpY2UgaGVyZQorICAgIGRldmljZSA9IG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQob3V0cHV0RGVzYywgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpOworICAgICAgICBhdXRvIGF0dHIgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKworICAgICAgICBpZiAoKGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmCisgICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSkgfHwKKyAgICAgICAgICAgICAoKGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fQUxBUk0pIHx8IGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkpICYmCisgICAgICAgICAgICAgICAgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSB8fAorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgeworICAgICAgICAgICAgLy8gUmV0cmlldmFsIG9mIGRldmljZXMgZm9yIHZvaWNlIERMIGlzIGRvbmUgb24gcHJpbWFyeSBvdXRwdXQgcHJvZmlsZSwgY2Fubm90CisgICAgICAgICAgICAvLyBjaGVjayB0aGUgcm91dGUgKHdvdWxkIGZvcmNlIG1vZGlmeWluZyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgcHJvZmlsZSkKKyAgICAgICAgICAgIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmcm9tQ2FjaGUpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6Ci0gICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMzogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkKLSAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KLSAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQotICAgIC8vIDg6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgotICAgIC8vIDk6IHRoZSBzdHJhdGVneSBmb3IgYmVhY29uLCBhLmsuYS4gInRyYW5zbWl0dGVkIHRocm91Z2ggc3BlYWtlciIgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSB0LXQtcwotCi0gICAgLy8gRklYTUU6IGV4dGVuZCB1c2Ugb2YgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZSgpIHRvIGFsbCBzdHJhdGVnaWVzCi0gICAgLy8gd2l0aCBhIHJlZmluZWQgcnVsZSBjb25zaWRlcmluZyBtdXR1YWxseSBleGNsdXNpdmUgZGV2aWNlcyAodXNpbmcgc2FtZSBiYWNrZW5kKQotICAgIC8vIGFzIG9wcG9zZWQgdG8gYWxsIHN0cmVhbXMgb24gdGhlIHNhbWUgYXVkaW8gSEFMIG1vZHVsZS4KLSAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAotICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX01FRElBKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRFRNRikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1JFUk9VVElORykpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HLCBmcm9tQ2FjaGUpOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7CisgICAgQUxPR1YoIiVzIHNlbGVjdGVkIGRldmljZXMgJXMiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIHJldHVybiBkZXZpY2VzOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5nZXREZXZpY2UoKS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+Z2V0RGV2aWNlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKLSAgICAvLyBBVURJT19ERVZJQ0VfTk9ORSwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZSh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOworICAgIGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXREZXNjLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgYWN0aXZlLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICB9Ci0gICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShzb3VyY2UpOworCisgICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCisgICAgLy8gYSBudWxsIHNwPD4sIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKTsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIH0KKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHJldHVybiBkZXZpY2U7CkBAIC00OTY5LDY1ICs1MTkzLDUwIEBACiAgICAgcmV0dXJuIChzdHJlYW0xID09IHN0cmVhbTIpOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOwotfQotCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKLSAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCi0gICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KLSAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgLy8gZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuCisgICAgLy8gZW5naW5lJ3MgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSB3b3VsZCBmYWxsYmFjayBvbiBpdHMgZGVmYXVsdCBiZWhhdmlvciAobW9zdCBwcm9iYWJseQorICAgIC8vIGRldmljZSBmb3IgbXVzaWMgc3RyZWFtKSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CiAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgeworICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsKKyAgICAgICAgIGN1clN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoY3VyU3RyZWFtICsgMSkpIHsKKyAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCBjdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgeworICAgICAgICBEZXZpY2VWZWN0b3IgY3VyRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oY3VyU3RyZWFtLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBkZXZpY2VzLm1lcmdlKGN1ckRldmljZXMpOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2VzKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgY3VyRGV2aWNlcyB8PSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMubWVyZ2Uob3V0cHV0RGVzYy0+ZGV2aWNlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkZXZpY2VzIHw9IGN1ckRldmljZXM7CiAgICAgfQogCisgICAgLy8gRmF2b3IgZGV2aWNlcyBzZWxlY3RlZCBvbiBhY3RpdmUgc3RyZWFtcyBpZiBhbnkgdG8gcmVwb3J0IGNvcnJlY3QgZGV2aWNlIGluIGNhc2Ugb2YKKyAgICAvLyBleHBsaWNpdCBkZXZpY2Ugc2VsZWN0aW9uCisgICAgaWYgKCFhY3RpdmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBkZXZpY2VzID0gYWN0aXZlRGV2aWNlczsKKyAgICB9CiAgICAgLypGaWx0ZXIgU1BFQUtFUl9TQUZFIG91dCBvZiByZXN1bHRzLCBhcyBBdWRpb1NlcnZpY2UgZG9lc24ndCBrbm93IGFib3V0IGl0CiAgICAgICBhbmQgZG9lc24ndCByZWFsbHkgbmVlZCB0by4qLwotICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKLSAgICAgICAgZGV2aWNlcyB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGRldmljZXMgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpOworICAgIGlmICghc3BlYWtlclNhZmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBkZXZpY2VzLm1lcmdlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7CisgICAgICAgIGRldmljZXMucmVtb3ZlKHNwZWFrZXJTYWZlRGV2aWNlcyk7CiAgICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1yb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9QQVRDSCwiZ2V0U3RyYXRlZ3koKSBjYWxsZWQgZm9yIEFVRElPX1NUUkVBTV9QQVRDSCIpOwotICAgIHJldHVybiBtRW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKLSAgICAvLyBmbGFncyB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihtRW5naW5lLT5nZXRTdHJhdGVneUZvclVzYWdlKGF0dHItPnVzYWdlKSk7CisgICAgcmV0dXJuIGRldmljZXMudHlwZXMoKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKICAgICBzd2l0Y2goc3RyZWFtKSB7CiAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9OT1RJRklDQVRJT04pKTsKICAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTUwOTQsNDAgKzUzMDMsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQotewotICAgIC8vIENoZWNrIGlmIGFuIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdCBleGlzdHMgZm9yIGEgc3RyZWFtIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAvLyBzcGVjaWZpZWQgc3RyYXRlZ3kgYW5kIHVzZSBpdCBpbiBwcmlvcml0eSBvdmVyIGRlZmF1bHQgcm91dGluZyBydWxlcy4KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmcm9tQ2FjaGUpIHsKLSAgICAgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZyb20gY2FjaGUgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldKTsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV07Ci0gICAgfQotICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci19Ci0KIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KKyAgICBtRW5naW5lLT51cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKIH0KIAogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQogewogICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgpAQCAtNTEzOCwzNCArNTMyMSwzNiBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMuc2l6ZSgpID49IDIpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICBhdXRvIHByb2R1Y3RTdHJhdGVnaWVzID0gbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBwcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPQorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGN1ckRldmljZXMgPSBjdXJEZXZpY2VzLmZpbHRlcihvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIGN1ckRldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRldmljZXMpICYmIGN1ckRldmljZXMgIT0gZGV2aWNlczsKICAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKIAotICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZG9NdXRlKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKICAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKLSAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnNBdExlYXN0T25lKG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICV6dSAoY3VyRGV2aWNlICUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCIlcygpICVzIChjdXJEZXZpY2UgJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgY3VyRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0U3RyYXRlZ3ksIG11dGUsIGRlc2MsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKQEAgLTUxODMsNyArNTM2OCw3IEBACiAKICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCiAgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcwotICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlcyAhPSBwcmV2RGV2aWNlcykpIHsKICAgICAgICAgdWludDMyX3QgdGVtcE11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOwogICAgICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiBpcyBjb25zZXJ2YXRpdmVseSBzZXQgdG8gNCB0aW1lcyB0aGUgcmVwb3J0ZWQgbGF0ZW5jeQogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZUR1cmF0aW9uTXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiA0OwpAQCAtNTE5MSwxMyArNTM3NiwxMyBAQAogICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IHRlbXBNdXRlV2FpdE1zOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IHByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0U3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0YXJ0IHRoZSB0ZW1wb3JhcnkgbXV0ZSBwZXJpb2QgdG9vIGVhcmx5IGluIGNhc2Ugb2YKICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYywgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlLCBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0U3RyYXRlZ3ksIHRydWUsIG91dHB1dERlc2MsIGRlbGF5TXMpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0U3RyYXRlZ3ksIGZhbHNlLCBvdXRwdXREZXNjLCBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTIxMSw0NiArNTM5Niw0NiBAQAogICAgIHJldHVybiAwOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrKQordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwNHggZGVsYXlNcyAlZCIsIGRldmljZSwgZGVsYXlNcyk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgQUxPR1YoIiVzIGRldmljZSAlcyBkZWxheU1zICVkIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBkZWxheU1zKTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zOwogCiAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAotICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwotICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgbnVsbHB0ciAvKiBhZGRyZXNzICovLCByZXF1aXJlc011dGVDaGVjayk7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlcywgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2VzLCBmb3JjZSwgZGVsYXlNcywKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCByZXF1aXJlc011dGVDaGVjayk7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KLSAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAotICAgIC8vIG91dHB1dCBwcm9maWxlCi0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkgPT0gQVVESU9fREVWSUNFX05PTkUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KIAogICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKLSAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXMgPSBvdXRwdXREZXNjLT5maWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpOworICAgIERldmljZVZlY3RvciBwcmV2RGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKyAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAorICAgIC8vIG91dHB1dCBwcm9maWxlIG9yIGlmIG5ldyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBBTkQgcHJldmlvdXMgZGV2aWNlKHMpIGlzKGFyZSkgc3RpbGwKKyAgICAvLyBhdmFpbGFibGUgKG90aGVyd2lzZSByZXNldCBkZXZpY2UgbXVzdCBiZSBkb25lIG9uIHRoZSBvdXRwdXQpCisgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSAmJiBmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKHByZXZEZXZpY2VzKS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCIlczogdW5zdXBwb3J0ZWQgZGV2aWNlICVzIGZvciBvdXRwdXQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAweCUwNHgiLCBwcmV2RGV2aWNlKTsKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlcygpIHByZXZEZXZpY2UgJXMiLCBwcmV2RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCi0gICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlmICghZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBvdXRwdXREZXNjLT5zZXREZXZpY2VzKGZpbHRlcmVkRGV2aWNlcyk7CiAgICAgfQogCiAgICAgLy8gaWYgdGhlIG91dHB1dHMgYXJlIG5vdCBtYXRlcmlhbGx5IGFjdGl2ZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBtdXRlLgogICAgIGlmIChyZXF1aXJlc011dGVDaGVjaykgewotICAgICAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZXMsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCIlczogc3VwcHJlc3NpbmcgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyIsIF9fZnVuY19fKTsKICAgICAgICAgbXV0ZVdhaXRNcyA9IDA7CkBAIC01MjYxLDg5ICs1NDQ2LDMyIEBACiAgICAgLy8gICAgICBPUiB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZQogICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAogICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KLSAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYKLSAgICAgICAgIWZvcmNlICYmCi0gICAgICAgIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAweCUwNHggb3IgbnVsbCBkZXZpY2UiLCBkZXZpY2UpOworICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZXMoKSB3aXRob3V0IGNvbmRpdGlvbnMKKyAgICBpZiAoKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgZmlsdGVyZWREZXZpY2VzID09IHByZXZEZXZpY2VzKSAmJgorICAgICAgICAgICAgIWZvcmNlICYmIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgeworICAgICAgICBBTE9HVigiJXMgc2V0dGluZyBzYW1lIGRldmljZSAlcyBvciBudWxsIGRldmljZSwgZm9yY2U9JWQsIHBhdGNoIGhhbmRsZT0lZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBmaWx0ZXJlZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBmb3JjZSwgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKKyAgICBBTE9HVigiJXMgY2hhbmdpbmcgZGV2aWNlIHRvICVzIiwgX19mdW5jX18sIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gZG8gdGhlIHJvdXRpbmcKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGVsYXlNcywgTlVMTCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7Ci0gICAgICAgIGlmICgoYWRkcmVzcyA9PSBOVUxMKSB8fCAoc3RybGVuKGFkZHJlc3MpID09IDApKSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG91dHB1dERlc2MpOworICAgICAgICBBTE9HX0FTU0VSVChmaWx0ZXJlZERldmljZXMuc2l6ZSgpIDw9IEFVRElPX1BBVENIX1BPUlRTX01BWCwgIlRvbyBtYW55IHNpbmsgcG9ydHMiKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZmaWx0ZXJlZERldmljZSA6IGZpbHRlcmVkRGV2aWNlcykgeworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZmlsdGVyZWREZXZpY2UpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBpbnN0YWxsUGF0Y2goX19mdW5jX18sIHBhdGNoSGFuZGxlLCBvdXRwdXREZXNjLmdldCgpLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgZGVsYXlNcyk7CiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHN0cmVhbSB2b2x1bWVzIGFjY29yZGluZyB0byBuZXcgZGV2aWNlCi0gICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIGZpbHRlcmVkRGV2aWNlcy50eXBlcygpLCBkZWxheU1zKTsKIAogICAgIHJldHVybiBtdXRlV2FpdE1zOwogfQpAQCAtNTM3Miw2MyArNTUwMCwzMCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7Ci0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpZiAoKGRldmljZSAhPSBudWxscHRyKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPmdldERldmljZSgpKSB8fCBmb3JjZSkpIHsKKyAgICAgICAgaW5wdXREZXNjLT5zZXREZXZpY2UoZGV2aWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGlucHV0RGVzYywKICAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKICAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCi0gICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICBwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0RGVzY10oY29uc3QgUGF0Y2hCdWlsZGVyOjptaXhfdXNlY2FzZV90JiB1c2VjYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IHVzZWNhc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJiAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7IH0pLgogICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdwotICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigic2V0SW5wdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShkZXZpY2UpOworICAgICAgICAgICAgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgaW5wdXREZXNjLmdldCgpLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgMCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTU0NTcsOCArNTU1Miw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCkBAIC01NDc4LDcgKzU1NzIsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKICAgICAgICAgICAgIC8vdXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgICAgICAgLyp1cGRhdGVkRm9ybWF0Ki8KQEAgLTU0ODksNyArNTU4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyovKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAorICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKQEAgLTU1MTMsNDMgKzU2MDcsMTIgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGF1ZGlvX2RldmljZXNfdCBzZWxlY3RlZERldmljZUZyb21NaXggPQotICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsIGF2YWlsYWJsZURldmljZVR5cGVzLCBwb2xpY3lNaXgpOwotCi0gICAgaWYgKHNlbGVjdGVkRGV2aWNlRnJvbU1peCAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWREZXZpY2VGcm9tTWl4OwotICAgIH0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKLXsKLSAgICAvLyBSb3V0aW5nCi0gICAgLy8gU2NhbiB0aGUgd2hvbGUgUm91dGVNYXAgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGU6Ci0gICAgLy8gaWYgdGhlIGlucHV0IHNvdXJjZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAotICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKLSAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KLSAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewotICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKChpbnB1dFNvdXJjZSA9PSByb3V0ZS0+bVNvdXJjZSkgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkgJiYKLSAgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQogZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIGZsb2F0IHZvbHVtZURCID0gbVZvbHVtZUN1cnZlcy0+dm9sSW5kZXhUb0RiKHN0cmVhbSwgVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBpbmRleCk7CisgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSk7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBjdXJ2ZXMudm9sSW5kZXhUb0RiKFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgaW5kZXgpOwogCiAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIG9mIGFjY2Vzc2liaWxpdHkgYWN0aXZlIHdoaWxlIGEgcmluZ3RvbmUgaXMgcGxheWluZzogaWYgdGhlIHJpbmd0b25lIGlzIG11Y2gKICAgICAvLyBsb3VkZXIgdGhhbiB0aGUgYWNjZXNzaWJpbGl0eSBwcm9tcHQsIHRoZSBwcm9tcHQgY2Fubm90IGJlIGhlYXJkLCB0aHVzIG1hc2tpbmcgdGhlIHRvdWNoCkBAIC01NTU5LDEyICs1NjIyLDEyIEBACiAgICAgICAgICAgICAmJiAoQVVESU9fTU9ERV9SSU5HVE9ORSA9PSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpCiAgICAgICAgICAgICAmJiBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORywgMCkpIHsKICAgICAgICAgY29uc3QgZmxvYXQgcmluZ1ZvbHVtZURCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fUklORywgaW5kZXgsIGRldmljZSk7Ci0gICAgICAgIHJldHVybiByaW5nVm9sdW1lREIgLSA0ID4gdm9sdW1lREIgPyByaW5nVm9sdW1lREIgLSA0IDogdm9sdW1lREI7CisgICAgICAgIHJldHVybiByaW5nVm9sdW1lREIgLSA0ID4gdm9sdW1lRGIgPyByaW5nVm9sdW1lREIgLSA0IDogdm9sdW1lRGI7CiAgICAgfQogCi0gICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCBlYXJwaWVjZSB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KLSAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpICYmCi0gICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgeworICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCisgICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmCisgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkpIHsKICAgICAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgpAQCAtNTU3NCwxNSArNTYzNywxNCBAQAogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOiB7Ci0gICAgICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPSBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLmdldFZvbHVtZUluZGV4KGRldmljZSk7CiAgICAgICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KLSAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKQorICAgICAgICAgICAgICAgIGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvaWNlVm9sdW1lSW5kZXgsIGRldmljZSkKICAgICAgICAgICAgICAgICArIElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREI7Ci0gICAgICAgICAgICBpZiAodm9sdW1lREIgPiBtYXhWb2ljZVZvbERiKSB7CisgICAgICAgICAgICBpZiAodm9sdW1lRGIgPiBtYXhWb2ljZVZvbERiKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUoKSBzdHJlYW0gJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSBzdHJlYW0gJWQgYXQgdm9sPSVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lREIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBtYXhWb2ljZVZvbERiKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1heFZvaWNlVm9sRGI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHZvbHVtZURiLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgbWF4Vm9pY2VWb2xEYik7CisgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtYXhWb2ljZVZvbERiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTU1OTcsNjggKzU2NTksOTQgQEAKICAgICAvLyBzcGVha2VyIGlzIHBhcnQgb2YgdGhlIHNlbGVjdCBkZXZpY2VzCiAgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKICAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CiAgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQgfAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpICYmCi0gICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQorICAgICAgICAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQUxBUk0gfHwgc3RyZWFtID09IEFVRElPX1NUUkVBTV9SSU5HKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikKICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCi0gICAgICAgICAgICAgICAgfHwgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgotICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgfHwgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0KKyAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5jYW5CZU11dGVkKCkpIHsKICAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQogICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwogICAgICAgICAvLyBqdXN0IHN0b3BwZWQKICAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8CiAgICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIHZvbHVtZURCICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHZvbHVtZURiICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOwogICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2xEQiA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX01VU0lDKS5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKICAgICAgICAgICAgIGZsb2F0IG1pblZvbERCID0gKG11c2ljVm9sREIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/CiAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sREIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOwotICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWluVm9sREIpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1pblZvbERCOworICAgICAgICAgICAgaWYgKHZvbHVtZURiID4gbWluVm9sREIpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG1pblZvbERCOwogICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERCLCBtdXNpY1ZvbERCKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKICAgICAgICAgICAgICAgICAvLyBvbiBBMkRQLCBhbHNvIGVuc3VyZSBub3RpZmljYXRpb24gdm9sdW1lIGlzIG5vdCB0b28gbG93IGNvbXBhcmVkIHRvIG1lZGlhIHdoZW4KICAgICAgICAgICAgICAgICAvLyBpbnRlbmRlZCB0byBiZSBwbGF5ZWQKLSAgICAgICAgICAgICAgICBpZiAoKHZvbHVtZURCID4gLTk2LjBmKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQiA+IHZvbHVtZURCKSkgeworICAgICAgICAgICAgICAgIGlmICgodm9sdW1lRGIgPiAtOTYuMGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lRGIpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGluY3JlYXNpbmcgdm9sdW1lIGZvciBzdHJlYW09JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lREIsIG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7Ci0gICAgICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURiLCBtdXNpY1ZvbERCIC0gU09OSUZJQ0FUSU9OX0EyRFBfTUFYX01FRElBX0RJRkZfREIpOworICAgICAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoKFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSkgIT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8fAotICAgICAgICAgICAgICAgIHN0cmVhbV9zdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgICAgIHZvbHVtZURCICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgICAgICAgICAgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fQUxBUk0gJiYgc3RyZWFtICE9IEFVRElPX1NUUkVBTV9SSU5HKSkgeworICAgICAgICAgICAgdm9sdW1lRGIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB2b2x1bWVEQjsKKyAgICByZXR1cm4gdm9sdW1lRGI7Cit9CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pCit7CisgICAgaWYgKHNyY1N0cmVhbSA9PSBkc3RTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHNyY0luZGV4OworICAgIH0KKyAgICBhdXRvICZzcmNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoc3JjU3RyZWFtKTsKKyAgICBhdXRvICZkc3RDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoZHN0U3RyZWFtKTsKKyAgICBmbG9hdCBtaW5TcmMgPSAoZmxvYXQpc3JjQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworICAgIGZsb2F0IG1pbkRzdCA9IChmbG9hdClkc3RDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICBmbG9hdCBtYXhEc3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisKKyAgICAvLyBwcmVzZXJ2ZSBtdXRlIHJlcXVlc3Qgb3IgY29ycmVjdCByYW5nZQorICAgIGlmIChzcmNJbmRleCA8IG1pblNyYykgeworICAgICAgICBpZiAoc3JjSW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3JjSW5kZXggPSBtaW5TcmM7CisgICAgfSBlbHNlIGlmIChzcmNJbmRleCA+IG1heFNyYykgeworICAgICAgICBzcmNJbmRleCA9IG1heFNyYzsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKG1pbkRzdCArICgoc3JjSW5kZXggLSBtaW5TcmMpICogKG1heERzdCAtIG1pbkRzdCkpIC8gKG1heFNyYyAtIG1pblNyYykpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCi0gICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAotICAgICAgICAgICAgICBzdHJlYW0sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKG91dHB1dERlc2MtPmlzTXV0ZWQoc3RyZWFtVG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlcygpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsIF9fZnVuY19fLCBzdHJlYW0sIG91dHB1dERlc2MtPmdldE11dGVDb3VudChzdHJlYW0pKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CkBAIC01NjcyLDcgKzU3NjAsNyBAQAogICAgIH0KIAogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwpAQCAtNTY5MCw3ICs1Nzc4LDcgQEAKICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CiAgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOwogICAgICAgICB9CkBAIC01NzEzLDcgKzU4MDEsNyBAQAogCiAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewogICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLApAQCAtNTcyMSwxOCArNTgwOSwxNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwKLSAgICAgICAgICAgc3RyYXRlZ3ksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KKyAgICBmb3IgKGF1dG8gc3RyZWFtOiBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlcygpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0sIG9uLAorICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKICAgICB9CiB9CiAKQEAgLTU3NDMsMzAgKzU4MjksMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAogICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCi0gICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOwotCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHN0cmVhbSksIGRldmljZSk7CisgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSk7CiAgICAgaWYgKG9uKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSAmJgorICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzTXV0ZWQoc3RyZWFtVG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGlmIChjdXJ2ZXMuY2FuQmVNdXRlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAogICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CiAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgICAgIG91dHB1dERlc2MtPmluY011dGVDb3VudChzdHJlYW1Ub1ZvbHVtZVNvdXJjZShzdHJlYW0pKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHN0cmVhbVRvVm9sdW1lU291cmNlKHN0cmVhbSkpKSB7CiAgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmRlY011dGVDb3VudChzdHJlYW1Ub1ZvbHVtZVNvdXJjZShzdHJlYW0pKSA9PSAwKSB7CiAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKQEAgLTU3NzQsMTA2ICs1ODYwLDkgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbVByaW1hcnlPdXRwdXQ7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQotewotICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLX0KLQogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQogewotICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmVhbSB0eXBlPwogICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTyB8IEFVRElPX0ZMQUdfQkVBQ09OKSkgIT0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC01OTA0LDM3ICs1ODkzLDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCiB7CiAgICAgcmV0dXJuIG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKQEAgLTU5NTMsMTAgKzU5MTEsMTAgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bURldmljZS0+ZXF1YWxzKGRldmljZURlc2MpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTgyLDEyOSArNTk0MCw2NyBAQAogICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MtPm1VaWQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgbUlucHV0cy5jbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CisKKyAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CiB9CiAKLS8vIE1vZGlmeSB0aGUgbGlzdCBvZiBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHN1cHBvcnRlZC4KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7Ci0gICAgRm9ybWF0VmVjdG9yICZmb3JtYXRzID0gKmZvcm1hdHNQdHI7Ci0gICAgLy8gVE9ETyBTZXQgdGhpcyBiYXNlZCBvbiBDb25maWcgcHJvcGVydGllcy4KLSAgICBjb25zdCBib29sIGFsd2F5c0ZvcmNlQUMzID0gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGVuZm9yY2VkU3Vycm91bmQoCisgICAgICAgICAgICBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gYWxsU3Vycm91bmQ7ICAvLyBBIGZsYXQgc2V0IG9mIGFsbCBrbm93biBzdXJyb3VuZCBmb3JtYXRzCisgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICBhbGxTdXJyb3VuZC5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogcGFpci5zZWNvbmQpIGFsbFN1cnJvdW5kLmluc2VydChzdWJmb3JtYXQpOworICAgIH0KIAogICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CiAgICAgQUxPR0QoIiVzOiBmb3JjZWQgdXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZvcmNlVXNlKTsKKyAgICAvLyBUaGlzIGlzIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZvcm1hdHMgZGVwZW5kaW5nIG9uIHRoZSBzdXJyb3VuZCBtb2RlOgorICAgIC8vICAgJ2FsbCBzdXJyb3VuZCcgPSBhbGxTdXJyb3VuZAorICAgIC8vICAgJ2VuZm9yY2VkIHN1cnJvdW5kJyA9IGVuZm9yY2VkU3Vycm91bmQgW21heSBpbmNsdWRlIElFQzY5MTM3IHdoaWNoIGlzbid0IHJhdyBzdXJyb3VuZCBmbXRdCisgICAgLy8gICAnbm9uLXN1cnJvdW5kJyA9IG5vdCBpbiAnYWxsIHN1cnJvdW5kJyBhbmQgbm90IGluICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyAgICdtYW51YWwgc3Vycm91bmQnID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cworICAgIC8vIEFVVE86ICAgZm9ybWF0cyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBBTFdBWVM6IGZvcm1hdHMgdiAnYWxsIHN1cnJvdW5kJyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBORVZFUjogIGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJworICAgIC8vIE1BTlVBTDogZm9ybWF0cyBeICgnbm9uLXN1cnJvdW5kJyB2ICdtYW51YWwgc3Vycm91bmQnIHYgKElFQzY5MTM3IF4gJ2VuZm9yY2VkIHN1cnJvdW5kJykpCiAKLSAgICAvLyBJZiBNQU5VQUwsIGtlZXAgdGhlIHN1cHBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIGFzIGN1cnJlbnQgZW5hYmxlZCBvbmVzLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OworICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwKKyAgICAgICAgICAgIHx8IGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7CisgICAgICAgIC8vIGZvcm1hdFNldCBpcyAoZm9ybWF0cyBeICdub24tc3Vycm91bmQnKQorICAgICAgICBmb3IgKGF1dG8gZm9ybWF0SXRlciA9IGZvcm1hdHNQdHItPmJlZ2luKCk7IGZvcm1hdEl0ZXIgIT0gZm9ybWF0c1B0ci0+ZW5kKCk7ICsrZm9ybWF0SXRlcikgeworICAgICAgICAgICAgaWYgKGFsbFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwICYmIGVuZm9yY2VkU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KCpmb3JtYXRJdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZm9ybWF0c1B0ci0+YmVnaW4oKSwgZm9ybWF0c1B0ci0+ZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzUHRyLT5jbGVhcigpOyAgLy8gUmUtZmlsbGVkIGZyb20gdGhlIGZvcm1hdFNldCBhdCB0aGUgZW5kLgorCiAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgewotICAgICAgICBmb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1TdXJyb3VuZEZvcm1hdHMuYmVnaW4oKTsgaXQgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoKml0KTsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZW5kKCkpOworICAgICAgICAvLyBFbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZSBpZiBpdCdzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgaWYgKGVuZm9yY2VkU3Vycm91bmQuY291bnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KSAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlLgotICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgIH0gZWxzZSB7IC8vIE5FVkVSLCBBVVRPIG9yIEFMV0FZUwotICAgICAgICAvLyBBbmFseXplIG9yaWdpbmFsIHN1cHBvcnQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKHNzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IChzc2l6ZV90KWZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIEFMV0FZUywgcmVtb3ZlIGFsbCBvdGhlciBzdXJyb3VuZCBmb3JtYXRzIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd2lsbCBhZGQgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeyAvLyBBVVRPIG9yIEFMV0FZUworICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGFsbFN1cnJvdW5kLmJlZ2luKCksIGFsbFN1cnJvdW5kLmVuZCgpKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIE1vZGlmeSBmb3JtYXRzIGJhc2VkIG9uIHN1cnJvdW5kIHByZWZlcmVuY2VzLgotICAgICAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgewotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCB8fCBzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7ICkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBBVVRPIG9yIEFMV0FZUwotICAgICAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCi0gICAgICAgICAgICBpZiAoKGFsd2F5c0ZvcmNlQUMzIHx8IChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNBQzMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KLSAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgICAgICAvLyB0aGVuIHRoZSByZXBvcnQgaXMgdmFsaWQgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0gICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0VfQUMzKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAvLyBUaGUgSEFMIGNvdWxkIGRvIHRoaXMgYnV0IGFkZCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuCi0gICAgICAgICAgICBpZiAoKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgJiYgIXN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcmVwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyB0byBlbmFibGVkIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzNfSk9DOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZW5mb3JjZWRTdXJyb3VuZC5iZWdpbigpLCBlbmZvcmNlZFN1cnJvdW5kLmVuZCgpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQgOiBmb3JtYXRTZXQpIHsKKyAgICAgICAgZm9ybWF0c1B0ci0+cHVzaChmb3JtYXQpOwogICAgIH0KIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKSB7CiAgICAgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyA9ICpjaGFubmVsTWFza3NQdHI7CiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKQEAgLTYxMzQsMTYgKzYwMzAsMTcgQEAKICAgICAgICAgLy8gSWYgbm90IHRoZW4gYWRkIDUuMSBzdXBwb3J0LgogICAgICAgICBpZiAoIXN1cHBvcnRzNWRvdDEpIHsKICAgICAgICAgICAgIGNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSk7Ci0gICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR0koIiVzOiBmb3JjZSBNQU5VQUwgb3IgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fZnVuY19fKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKQogewogICAgIFN0cmluZzggcmVwbHk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKIAogICAgIC8vIEZvcm1hdCBNVVNUIGJlIGNoZWNrZWQgZmlyc3QgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIEF1ZGlvUHJvZmlsZQogICAgIGlmIChwcm9maWxlcy5oYXNEeW5hbWljRm9ybWF0KCkpIHsKQEAgLTYxNTcsOCArNjA1NCw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoJmZvcm1hdHMpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKKyAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhkZXZEZXNjLCAmZm9ybWF0cyk7CiAgICAgICAgIH0KICAgICAgICAgcHJvZmlsZXMuc2V0Rm9ybWF0cyhmb3JtYXRzKTsKICAgICB9CkBAIC02MTkwLDggKzYwODgsOSBAQAogICAgICAgICAgICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCByZXBseSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3NGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSkgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYxOTksNCArNjA5OCw1OCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KAorICAgICAgICAgICAgcGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FID8KKyAgICAgICAgICAgICpwYXRjaEhhbmRsZSA6IGlvRGVzY3JpcHRvci0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaCgKKyAgICAgICAgICAgIGNhbGxlciwgaW5kZXgsIHBhdGNoSGFuZGxlLCBwYXRjaCwgZGVsYXlNcywgbVVpZENhY2hlZCwgJnBhdGNoRGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpb0Rlc2NyaXB0b3ItPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKQoreworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigiJXMoKSBBRjo6Y3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgY2FsbGVyLCBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaChwYXRjaCwgdWlkKTsKKyAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICB9CisgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorICAgIGlmIChwYXRjaERlc2NQdHIpICpwYXRjaERlc2NQdHIgPSBwYXRjaERlc2M7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA0OGUwNDcyLi42NDFhMDNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIApAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CkBAIC0zOCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8QXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CkBAIC00Niw4ICs0OSw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgotI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk1LDEyICs5NywxNCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CkBAIC0xMDksMjQgKzExMywxOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTM4LDIwICsxMzcsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaW5pdFN0cmVhbVZvbHVtZTogZXZlbiBpZiB0aGUgZW5naW5lIHZvbHVtZSBmaWxlcyBwcm92aWRlcyBtaW4gYW5kIG1heCwga2VlcCB0aGlzCisgICAgICAgICAqIGFwaSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb24uCisgICAgICAgICAqIEF1ZGlvU2VydmVyIHdpbGwgZ2V0IHRoZSBtaW4gYW5kIG1heCBhbmQgbWF5IG92ZXJ3cml0ZSB0aGVtIGlmOgorICAgICAgICAgKiAgICAgIC11c2luZyBwcm9wZXJ0eSAoaGlnaGVzdCBwcmlvcml0eSkKKyAgICAgICAgICogICAgICAtbm90IGRlZmluZWQgKC0xIGJ5IGNvbnZlbnRpb24pLCBjYXNlIHdoZW4gc3RpbGwgdXNpbmcgYXBtIHZvbHVtZSB0YWJsZXMgWE1MIGZpbGVzCisgICAgICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gaW5kZXhNaW4gdG8gc2V0CisgICAgICAgICAqIEBwYXJhbSBpbmRleE1heCB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwpAQCAtMTU5LDEwICsxNjEsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgICAgIHN0YXR1c190IHNldFZvbHVtZUdyb3VwSW5kZXgoSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzLCB2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzKTsKKworICAgICAgICBzdGF0dXNfdCBzZXRWb2x1bWVDdXJ2ZUluZGV4KHZvbHVtZV9ncm91cF90IHZvbHVtZUdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWb2x1bWVDdXJ2ZXMgJnZvbHVtZUN1cnZlcyk7CisKKyAgICAgICAgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXgoY29uc3QgSVZvbHVtZUN1cnZlcyAmY3VydmVzLCBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKwogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1Ub1N0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmVhbVRvU3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpAQCAtMTczLDE0ICsyMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKLSAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgpAQCAtMTkzLDEwICsyMTYsMTcgQEAKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICAgICAgLy8gaGVscGVycyBmb3IgZHVtcChpbnQgZmQpCisgICAgICAgIHZvaWQgZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0OworICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKworICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOwogCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjI2LDEyICsyNTYsMTUgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0yNDQsMTAgKzI3NywzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RTdHJhdGVneSAhPSBQUk9EVUNUX1NUUkFURUdZX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICB2b2x1bWVHcm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHZvbHVtZUdyb3VwICE9IFZPTFVNRV9HUk9VUF9OT05FID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgICAgIH0KIAogcHJvdGVjdGVkOgogICAgICAgICAvLyBBIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIG1vcmUgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBpbml0aWFsaXphdGlvbiBwcm9jZXNzLApAQCAtMjk0LDY1ICszNTMsNTYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gKm1Wb2x1bWVDdXJ2ZXM7IH0KICAgICAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgfQogCisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gKmN1cnZlcyA9IG1FbmdpbmUtPmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3IgYXR0cmlidXRlcyAlcyIsIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuICpjdXJ2ZXM7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3Igc3RyZWFtICVzIiwgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKLSAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKLSAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCi0gICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQotICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86Ci0gICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKLSAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgotICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECi0gICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKLQotICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KICAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KICAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CisgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CiAgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CiAgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKLQogICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCiAgICAgICAgIC8vIGRldmljZQogICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgICAgICAvLyByZXNjYWxlIHZvbHVtZSBpbmRleCBmcm9tIHNyY1N0cmVhbSB3aXRoaW4gcmFuZ2Ugb2YgZHN0U3RyZWFtCisgICAgICAgIGludCByZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0U3RyZWFtKTsKICAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtMzYzLDEyICs0MTMsMjAgQEAKICAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldFN0cmF0ZWd5TXV0ZSBNdXRlIG9yIHVubXV0ZSBhbGwgYWN0aXZlIGNsaWVudHMgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0CisgICAgICAgICAqIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICAgICAqIEBwYXJhbSBzdHJhdGVneSB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBvbiB0cnVlIGZvciBtdXRlLCBmYWxzZSBmb3IgdW5tdXRlCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUpOwogCiAgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKICAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMzc3LDEwICs0MzUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CiAKLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOwotCiAgICAgICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CiAKICAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCkBAIC0zOTQsMTUgKzQ0OCwxMyBAQAogICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKICAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KICAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgotICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CiAKLSAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzKTsKIAogICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgogICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CkBAIC00MTAsMTUgKzQ2MiwzNSBAQAogICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KICAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5Ci0gICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworICAgICAgICAvLyBydW5zIGFsbCB0aGUgY2hlY2tzIHJlcXVpcmVkIGZvciBhY2NvbW9kYXRpbmcgY2hhbmdlcyBpbiBkZXZpY2VzIGFuZCBvdXRwdXRzCisgICAgICAgIC8vIGlmICdvbk91dHB1dHNDaGVja2VkJyBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG91dHB1dHMKKyAgICAgICAgLy8gY2hlY2sgdmlhICdjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMnLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScsCisgICAgICAgIC8vIEEyRFAgc3VzcGVuZCBzdGF0dXMgaXMgcmVjaGVja2VkLgorICAgICAgICB2b2lkIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCA9IG51bGxwdHIpOwogCi0gICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgdGhlCisgICAgICAgICAqIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICAgICAqIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuCisgICAgICAgICAqIGF0dHJpYnV0ZXMgY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgICAgIGJvb2wgZm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIFNhbWUgYXMgQHNlZSBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoKQorICAgICAgICAgKiAgICAgIGJ1dCBmb3IgYSBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSBidXQgZm9yIHNlY29uZGFyeSBvdXRwdXRzLiBNYWtlIHN1cmUgaWYgYSBzZWNvbmRhcnkKKyAgICAgICAgLy8gb3V0cHV0IGNvbmRpdGlvbiBjaGFuZ2VzLCB0aGUgdHJhY2sgaXMgcHJvcGVybHkgcmVyb3V0ZWQKKyAgICAgICAgdm9pZCBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKwogICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQogICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKIApAQCAtNDI2LDE4ICs0OTgsMjEgQEAKICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCiAgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgogICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisgICAgICAgIERldmljZVZlY3RvciBnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOwogCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzOiB1cGRhdGVzIGNhY2hlIG9mIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgKiBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBpcyBjaGFuZ2VkOgorICAgICAgICAgKiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgICAqIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSgpL2dldERldmljZXNGb3JBdHRyaWJ1dGVzIGlmCisgICAgICAgICAqIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAogICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCiAgICAgICAgIHsKQEAgLTQ0OSwzNCArNTI0LDUwIEBACiAgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwogICAgICAgICB9CiAKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwotICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwogCi0gICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMKKyAgICAgICAgICogICAgICB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uLgorICAgICAgICAgKiAgICAgIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAgKiAgICAgIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjCisgICAgICAgICAqIEBwYXJhbSBwcmV2RGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDApOwogICAgICAgICAvLyBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2sgYXJlIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCi0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXNjcmlwdG9ycywgbWF5IGJlIGVtcHR5IGlmIGlnbm9yaW5nIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQKKyAgICAgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsTWFzaworICAgICAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdE9ubHkKKyAgICAgICAgICogQHJldHVybiBJT1Byb2ZpbGUgdG8gYmUgdXNlZCBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvck91dHB1dChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIApAQCAtNDg5LDYyICs1ODAsODcgQEAKICAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnJlbW92ZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIGJvb2wgaXNQcmltYXJ5TW9kdWxlKGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IDAgfHwgIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUtPmdldEhhbmRsZSgpID09IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0Rmlyc3REZXZpY2VJZCBvZiB0aGUgRGV2aWNlIFZlY3RvcgorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIElkLAorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAqLworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldEZpcnN0RGV2aWNlSWQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBnZXRGaXJzdERldmljZUFkZHJlc3MoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tTdHJhdGVneVJvdXRlOiB3aGVuIGFuIG91dHB1dCBpcyBiZWVpbmcgcmVyb3V0ZWQsIHJlY29uc2lkZXIgZWFjaCBvdXRwdXQKKyAgICAgICAgICogdGhhdCBtYXkgaG9zdCBhIHN0cmF0ZWd5IHBsYXlpbmcgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqIEBwYXJhbSBvdXB0dXRUb1NraXAgb3V0cHV0IHRoYXQgaW5pdGlhdGVkIHRoZSByZXJvdXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU4LDIwICs2NzQsMTcgQEAKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKIAotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworCiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAogICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKIAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+IG1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKICAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQogICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsgLy8gY29udGFpbnMgb25seSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIG5vcm1hbGx5IG5vdCBuZWVkZWQsIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1wcworCiAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnIG1Db25maWc7CiAKICAgICAgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1BdWRpb1BvcnRHZW5lcmF0aW9uOwpAQCAtNTg0LDcgKzY5Nyw3IEBACiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKIAogICAgICAgICBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtSHdPdXRwdXRzOwotICAgICAgICBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKKyAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCiAgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKICAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKQEAgLTYwOCwxNyArNzIxLDI3IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKIHByaXZhdGU6CiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKKyAgICAgICAgdm9pZCBtb2RpZnlTdXJyb3VuZEZvcm1hdHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CiAKLSAgICAgICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKTsKKyAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpIGNvbnN0OworICAgICAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBnZXRNc2RQYXRjaGVzKCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSA9IG51bGxwdHIpOwogCiAgICAgICAgIC8vIElmIGFueSwgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcyBvZiBhbiBBdWRpbyBQcm9maWxlcyBjb2xsZWN0aW9uCi0gICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgdm9pZCB1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKTsKIAogICAgICAgICAvLyBOb3RpZnkgdGhlIHBvbGljeSBjbGllbnQgb2YgYW55IGNoYW5nZSBvZiBkZXZpY2Ugc3RhdGUgd2l0aCBBVURJT19JT19IQU5ETEVfTk9ORSwKQEAgLTYyNiw0MiArNzQ5LDU3IEBACiAgICAgICAgIC8vIEl0IGNhbiBnaXZlIGEgY2hhbmNlIHRvIEhBTCBpbXBsZW1lbnRlciB0byByZXRyaWV2ZSBkeW5hbWljIGNhcGFiaWxpdGllcyBhc3NvY2lhdGVkCiAgICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlIGZvciBleGFtcGxlLgogICAgICAgICAvLyBUT0RPIGF2b2lkIG9wZW5pbmcgc3RyZWFtIHRvIHJldHJpZXZlIGNhcGFiaWxpdGllcyBvZiBhIHByb2ZpbGUuCi0gICAgICAgIHZvaWQgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCiAgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucwogICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgotICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCi0gICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgotICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKLSAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KLSAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKICAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgZ2V0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBmcm9tIGVpdGhlciBhIHNvdXJjZSBhdWRpb19hdHRyaWJ1dGVzX3QKKyAgICAgICAgLy8gb3IgYXVkaW9fc3RyZWFtX3R5cGVfdCwgcmVzcGVjdGl2ZWx5LgorICAgICAgICBzdGF0dXNfdCBnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSk7CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgY2FsbGVkIGJ5IGdldE91dHB1dEZvckF0dHIoKSBhbmQgY29ubmVjdEF1ZGlvU291cmNlLgorICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRySW50KGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKTsKLSAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgaW5wdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRJbnB1dEZvckRldmljZSBzZWxlY3RzIGFuIGlucHV0IGhhbmRsZSBmb3IgYSBnaXZlbiBpbnB1dCBkZXZpY2UgYW5kCisgICAgICAgICAqIHJlcXVlc3RlciBjb250ZXh0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgdXNlZCBieSByZXF1ZXN0ZXIsIHNlbGVjdGVkIGJ5IHBvbGljeSBtaXggcnVsZXMgb3IgZW5naW5lCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uIHJlcXVlc3RlciBzZXNzaW9uIGlkCisgICAgICAgICAqIEBwYXJhbSB1aWQgcmVxdWVzdGVyIHVpZAorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyByZXF1ZXN0ZXIgYXVkaW8gYXR0cmlidXRlcyAoZS5nLiBpbnB1dCBzb3VyY2UgYW5kIHRhZ3MgbWF0dGVyKQorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIHJlcXVlc3RlciBhdWRpbyBjb25maWd1cmF0aW9uIChlLmcuIHNhbXBsZSByYXRlLCBmb3JtYXQsIGNoYW5uZWwgbWFzaykuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyByZXF1ZXN0ZXIgaW5wdXQgZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIHBvbGljeU1peCBtYXkgYmUgbnVsbCwgcG9saWN5IHJ1bGVzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSByZXF1ZXN0ZXIKKyAgICAgICAgICogQHJldHVybiBpbnB1dCBpbyBoYW5kbGUgYWthIHVuaXF1ZSBpbnB1dCBpZGVudGlmaWVyIHNlbGVjdGVkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KTsKIAotICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKICAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgogICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQogICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZApAQCAtNjY5LDI1ICs4MDcsMjkgQEAKICAgICAgICAgdWludDMyX3Qgc2V0QmVhY29uTXV0ZShib29sIG11dGUpOwogICAgICAgICBib29sICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CiAKLSAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UgYW5kIHJldHVybiBhc3NvY2lhdGVkIHBvbGljeQotICAgICAgICAvLyBtaXggaWYgYW55LiBDYWxscyBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpLgotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4ID0gTlVMTCk7Ci0KICAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLgotICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZvaWQgdXBkYXRlTW9ubyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQpLCAoaW50KW1NYXN0ZXJNb25vKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgIH0KLQotICAgICAgICBib29sIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKTsKLSAgICAgICAgYm9vbCBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLSAgICAgICAgYm9vbCBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCBiMDY0ZjhjLi41NzQ4MzM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0xNTUsMTcgKzE1NSw2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdG9wVG9uZSgpCi17Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQogewogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKQEAgLTIyMCwxMiArMjA5LDIzIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKIH0KIAogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDRhMWNhYjQuLjQ5NDc3MTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzEsNyArMzIsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzE3LDYgKzMxNywyMDEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBOdWxsIHV1aWQgb3IgdHlwZSB1dWlkIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBIT1RXT1JELCBGTV9UVU5FUiBhbmQgRUNIT19SRUZFUkVOQ0UgYXJlIHNwZWNpYWwgY2FzZSBzb3VyY2VzID4gTUFYLgorICAgIGlmIChzb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCB8fAorICAgICAgICAgICAgKHNvdXJjZSA+IEFVRElPX1NPVVJDRV9NQVggJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc291cmNlIHR5cGUgJWQiLCBzb3VyY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgfHV1aWR8IG9yIHx0eXBlfCBjb3JyZXNwb25kcyB0byBhbiBlZmZlY3Qgb24gdGhlIHN5c3RlbS4KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IgPSB7fTsKKyAgICBzdGF0dXNfdCByZXMgPSBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIHV1aWQsIHR5cGUsIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IHByZS1wcm9jZXNzaW5nIGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHNvdXJjZSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRGVzaXJlZCBlZmZlY3QgY2Fubm90IGJlIGF0dGFjaGVkICIKKyAgICAgICAgICAgICAgImFzIGEgc291cmNlIGRlZmF1bHQgZWZmZWN0LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBGaW5kIHRoZSBFZmZlY3REZXNjVmVjdG9yIGZvciB0aGUgZ2l2ZW4gc291cmNlIHR5cGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoc291cmNlKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc291cmNlIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZWZmZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHZlY3Rvci4KKyAgICByZXMgPSBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoaWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogZmFpbGVkIHRvIGdldCBuZXcgdW5pcXVlIGlkLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCisKKyAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZXRyb2FjdGl2ZWx5IGF0dGFjaCB0byBhbnkgZXhpc3Rpbmcgc291cmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIHRyYWNraW5nIHRoZSBzb3VyY2UgdHlwZSBvZiBlYWNoIHNlc3Npb24gaWQgaW4gYWRkaXRpb24gdG8gd2hhdCBpcworICAgIC8vIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIodXNhZ2UpKTsKKworICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IGluc2VydCBlZmZlY3RzIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSBhcyBzdHJlYW0gZGVmYXVsdHMuCisgICAgaWYgKChkZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzdHJlYW0gZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc3RyZWFtIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMuYWRkKHN0cmVhbSwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzYyA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzdHJlYW1zIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHN0cmVhbSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHNvdXJjZSB0eXBlLgorICAgIHNpemVfdCBudW1Tb3VyY2VzID0gbUlucHV0U291cmNlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Tb3VyY2VzOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc291cmNlLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbUlucHV0U291cmNlc1tpXTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5iZWdpbigpOyBkZXNjICE9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVuZCgpOyArK2Rlc2MpIHsKKyAgICAgICAgICAgIGlmICgoKmRlc2MpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZW1vdmUgZnJvbSBhbnkgc291cmNlcyB0aGUgZWZmZWN0IHdhcyBhdHRhY2hlZCB0by4KKyAgICAgICAgICAgICAgICBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lcmFzZShkZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGVzIGFyZSB1bmlxdWU7IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXRjaCwgc28gcmV0dXJuIGVhcmx5LgorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVmZmVjdCB3YXNuJ3QgZm91bmQsIHNvIGl0J3MgYmVlbiB0cml2aWFsbHkgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHN0cmVhbSB0eXBlLgorICAgIHNpemVfdCBudW1TdHJlYW1zID0gbU91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgKytpKSB7CisgICAgICAgIC8vIENoZWNrIGVhY2ggZWZmZWN0IGZvciBlYWNoIHN0cmVhbS4KKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciogZGVzY1ZlY3RvciA9IG1PdXRwdXRTdHJlYW1zW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzdHJlYW1zIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIHZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3RWZWN0b3I6OnNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKQogewpAQCAtMzM4LDcgKzUzMyw4IEBACiAgICAgQ0FNQ09SREVSX1NSQ19UQUcsCiAgICAgVk9JQ0VfUkVDX1NSQ19UQUcsCiAgICAgVk9JQ0VfQ09NTV9TUkNfVEFHLAotICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcKKyAgICBVTlBST0NFU1NFRF9TUkNfVEFHLAorICAgIFZPSUNFX1BFUkZPUk1BTkNFX1NSQ19UQUcKIH07CiAKIC8vIHJldHVybnMgdGhlIGF1ZGlvX3NvdXJjZV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgc291cmNlIG5hbWUgb3IKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDYyMzE4MGUuLjZhZDAxZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtNjQsNyArNjQsNiBAQAogICAgIHN0YXR1c190IHJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAotCiAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBlZmZlY3QgZGVzY3JpcHRvcnMgZm9yIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMKICAgICAvLyBhc3NvY2lhdGVkIHdpdGggYXVkaW9TZXNzaW9uCiAgICAgc3RhdHVzX3QgcXVlcnlEZWZhdWx0T3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKQEAgLTgyLDE4ICs4MSw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbik7CiAKKyAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IGVmZmVjdHMgZm9yIHNvdXJjZXMgb2YgdHlwZSB8c291cmNlfC4KKyAgICBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc3RyZWFtcyBvZiBhIGdpdmVuIHVzYWdlLgorICAgIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZWZmZWN0IGZyb20gd2hlcmV2ZXIgaXQncyBhdHRhY2hlZC4KKyAgICBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBzdHJlYW0gZWZmZWN0IGZyb20gd2hlcmV2ZXIgaXQncyBhdHRhY2hlZC4KKyAgICBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKwogcHJpdmF0ZToKIAogICAgIC8vIGNsYXNzIHRvIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlZmZlY3RzIGFuZCBpdHMgcGFyYW1ldGVycwogICAgIC8vIGFzIGRlZmluZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgY2xhc3MgRWZmZWN0RGVzYyB7CiAgICAgcHVibGljOgotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChuYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZCh0eXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KHByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChpZCkgeyB9CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0RGVzYyhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRUZGRUNUX1VVSURfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsgfQogICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZVV1aWQob3JpZy5tVHlwZVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUob3JpZy5tT3BQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eShvcmlnLm1Qcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBtSWQob3JpZy5tSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107CkBAIC0xMTYsNyArMTU3LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2hhciAqbU5hbWU7CisgICAgICAgIGVmZmVjdF91dWlkX3QgbVR5cGVVdWlkOworICAgICAgICBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKICAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKKyAgICAgICAgaW50MzJfdCBtUHJpb3JpdHk7CisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG1JZDsKICAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCA3MzM3ZjA0Li5hNjcyNTIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0xNywxMiArMTcsMTEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLQogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiw3ICszMSw4IEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiB9CiAKIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKQEAgLTY2LDcgKzY2LDggQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNzksNyArODAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC0xNjUsNyArMTY2LDcgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0KHN0cmVhbSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpvcmlnaW5hbEF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC0xNzQsNyArMTc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE4MywxNiArMTg1LDIxIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKICAgICB9CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSAqb3JpZ2luYWxBdHRyOworICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCkpIHsKKyAgICAgICAgYXR0ci5mbGFncyB8PSBBVURJT19GTEFHX05PX0NBUFRVUkU7CisgICAgfQogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG9yaWdpbmFsRmxhZ3MgPSBmbGFnczsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyk7CiAKICAgICAvLyBGSVhNRTogSW50cm9kdWNlIGEgd2F5IHRvIGNoZWNrIGZvciB0aGUgdGhlIHRlbGVwaG9ueSBkZXZpY2UgYmVmb3JlIG9wZW5pbmcgdGhlIG91dHB1dAogICAgIGlmICgocmVzdWx0ID09IE5PX0VSUk9SKSAmJgpAQCAtMjAwLDEwMSArMjA3LDEyNSBAQAogICAgICAgICAhbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkLCB1aWQpKSB7CiAgICAgICAgIC8vIElmIHRoZSBhcHAgdHJpZXMgdG8gcGxheSBtdXNpYyB0aHJvdWdoIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGFuZCBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbgogICAgICAgICAvLyB0aGUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IGRldmljZS4KLSAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqb3V0cHV0LCAqc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqcG9ydElkKTsKICAgICAgICAgZmxhZ3MgPSBvcmlnaW5hbEZsYWdzOwogICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+Y2xlYXIoKTsKKyAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMpOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3AgPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBuZXcgQXVkaW9QbGF5YmFja0NsaWVudChhdHRyLCAqb3V0cHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQsICpzdHJlYW0pOworICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQocG9ydElkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKKwogICAgIC8vIGNhbGxlZCBmcm9tIGludGVybmFsIHRocmVhZDogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKLSAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTMxMywxNCArMzQ0LDE3IEBACiAgICAgfQogCiAgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJgotICAgICAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUKQorICAgICAgICAgICAgfHwgKGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUgorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM0NCw3ICszNzgsOCBAQAogCiAgICAgaWYgKChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyB8fAogICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIHx8Ci0gICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCkgJiYKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIHx8CisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpICYmCiAgICAgICAgICFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMzcyLDYgKzQwNyw5IEBACiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIC8vIGVuZm9yY2UgcGVybWlzc2lvbiAoaWYgYW55KSByZXF1aXJlZCBmb3IgZWFjaCB0eXBlIG9mIGlucHV0CiAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSzoKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHVzZSBjYXNlIGhhcyBiZWVuIHZhbGlkYXRlZCBpbiBhdWRpbyBzZXJ2aWNlIHdpdGggYSBNZWRpYVByb2plY3Rpb24gdG9rZW4sCisgICAgICAgICAgICAgICAgLy8gYW5kIGRvZXNuJ3QgcmVseSBvbiByZWd1bGFyIHBlcm1pc3Npb25zCiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTEVHQUNZOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX1RFTEVQSE9OWV9SWDoKQEAgLTM5OCwxNyArNDM2LDEzIEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKICAgICAgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dCgqaW5wdXQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dCgqcG9ydElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgICAgICBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIG9wUGFja2FnZU5hbWUsIHNlc3Npb24pOwotICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBjbGllbnQtPmlzQ29uY3VycmVudCA9IGZhbHNlOwotICAgICAgICBjbGllbnQtPmlzVmlydHVhbERldmljZSA9IGZhbHNlOyAvL1RPRE8gOiB1cGRhdGUgZnJvbSBBUE0tPmdldElucHV0Rm9yQXR0cigpCi0gICAgICAgIGNsaWVudC0+ZGV2aWNlSWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCwgb3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CiAgICAgfQogCkBAIC00MjIsNDggKzQ1NiwxNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLy8gdGhpcyBpcyByZXBsaWNhdGVkIGZyb20gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKLS8vIFhYWCAtLSBmaWd1cmUgb3V0IGhvdyB0byBwdXQgaXQgaW50byBhIGNvbW1vbiwgc2hhcmVkIGxvY2F0aW9uCi0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZVN0cmluZyhhdWRpb19zb3VyY2VfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKLSAgICBpZiAoU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHNvdXJjZSkpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db25jdXJyZW5jeVN0cmluZygKLSAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls2NF07IC8vIG92ZXJzaXplZAotICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVzJXMlcyIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpPyAiLGNhbGwiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKT8gIixjYXB0dXJlIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCk/ICIsaG90d29yZCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQpPyAiLHByZWVtcHQiOiIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLG5vbmUiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJmJ1ZmZlclsxXTsKLX0KLQogc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZVN0cjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CiAgICAgcG9ydC5pZCA9IHBvcnRJZDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRBdWRpb1BvcnQoJnBvcnQpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcG9ydC50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgZGV2aWNlVG9TdHJpbmcocG9ydC5leHQuZGV2aWNlLnR5cGUsIHR5cGVTdHIpOworICAgICAgICByZXR1cm4gdG9TdHJpbmcocG9ydC5leHQuZGV2aWNlLnR5cGUpOwogICAgIH0KLSAgICByZXR1cm4gdHlwZVN0cjsKKyAgICByZXR1cm4ge307CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4NiwxOCArNDg5LDE2IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICAvLyBJZiBVSUQgaW5hY3RpdmUgaXQgcmVjb3JkcyBzaWxlbmNlIHVudGlsIGJlY29taW5nIGFjdGl2ZQotICAgICpzaWxlbmNlZCA9ICFtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZShjbGllbnQtPnVpZCkgJiYgIWNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlOwotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5ID0KLSAgICAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKKworICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKKyAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgewogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24sICpzaWxlbmNlZCwgJmNvbmN1cnJlbmN5KTsKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChwb3J0SWQpOwogCiAgICAgfQogCkBAIC01MDYsNyArNTA3LDYgQEAKIAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5W10gPSAiYXVkaW9wb2xpY3kiOwogCi0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lSZWFzb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJlYXNvbiI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lTdGF0dXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnN0YXR1cyI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0U3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNyYyI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7CkBAIC01MjAsNjQgKzUyMCw1MiBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlW10gPQogICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOwogCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0F1ZGlvUG9saWN5KTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0F1ZGlvUG9saWN5KTsKICAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgewogCi0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJlYXNvbiwgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhjb25jdXJyZW5jeSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lTdGF0dXMsIHN0YXR1cyk7CiAKICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7Ci0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwogICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5UnFzdFNlc3Npb24sIGNsaWVudC0+c2Vzc2lvbik7Ci0KKyAgICAgICAgICAgIGlmIChjbGllbnQtPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KGNsaWVudC0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csIHN0ZDo6dG9fc3RyaW5nKGNsaWVudC0+dWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1BvbGljeVJxc3REZXZpY2UsIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoY2xpZW50LT5kZXZpY2VJZCkuY19zdHIoKSk7CiAKLSAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hvIGlzIGFjdGl2ZQotICAgICAgICAgICAgLy8gTkI6IG1pZ2h0IHRoZSBvdGhlciBwYXJ0eSBoYXZlIGdpdmVuIHVwIHRoZSBtaWNyb3Bob25lIHNpbmNlIHRoZW4/IGhvdyBzdXJlLgotICAgICAgICAgICAgLy8gcGVyaGFwcyBjb3VsZCBoYXZlIGdpdmVuIHVwIG9uIGl0LgotICAgICAgICAgICAgLy8gd2UgaG9sZCBtTG9jaywgc28gcGVyaGFwcyB3ZSdyZSBzYWZlIGZvciB0aGlzIGxvb3BpbmcKLSAgICAgICAgICAgIGlmIChjb25jdXJyZW5jeSAhPSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydElkID09IG1BdWRpb1JlY29yZENsaWVudHMua2V5QXQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBvdGhlciA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5hY3RpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhvdGhlci0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhvdGhlci0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQob3RoZXItPmRldmljZUlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhvdGhlci0+dWlkKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlbS0+c2VsZnJlY29yZCgpOwogICAgICAgICAgICAgZGVsZXRlIGl0ZW07CiAgICAgICAgICAgICBpdGVtID0gTlVMTDsKICAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjb25jdXJyZW5jeSAmIH5BdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRJbnB1dCgpOiBpbnZhbGlkIGNvbmN1cnJlbmN5IHR5cGUgJWQiLCAoaW50KWNvbmN1cnJlbmN5KTsKLQotICAgICAgICAvLyBlbmZvcmNlIHBlcm1pc3Npb24gKGlmIGFueSkgcmVxdWlyZWQgZm9yIGVhY2ggdHlwZSBvZiBjb25jdXJyZW5jeQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgaW5jYWxsIGNhcHR1cmUgcGVybWlzc2lvbgotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSkgewotICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBjb25jdXJyZW50IGNhcHR1cmUgcGVybWlzc2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOwotICAgIH0gZWxzZSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogICAgICAgICBmaW5pc2hSZWNvcmRpbmcoY2xpZW50LT5vcFBhY2thZ2VOYW1lLCBjbGllbnQtPnVpZCk7CiAgICAgfQogCkBAIC01ODksNiArNTc3LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CkBAIC01OTgsMTEgKzU4NywxNCBAQAogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogCiAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAKICAgICAvLyBmaW5pc2ggdGhlIHJlY29yZGluZyBhcHAgb3AKICAgICBmaW5pc2hSZWNvcmRpbmcoY2xpZW50LT5vcFBhY2thZ2VOYW1lLCBjbGllbnQtPnVpZCk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbik7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChwb3J0SWQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQpAQCAtNjIwLDYgKzYxMiwxNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisKKyAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgcmVsZWFzaW5nIGFjdGl2ZSBjbGllbnQgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworICAgICAgICAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOwogICAgIH0KICAgICBpZiAoY2xpZW50ID09IDApIHsKQEAgLTYyNywxNSArNjI3LDE1IEBACiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgaW5wdXQKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlvLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgY2xpZW50LT5pbnB1dCk7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW8pOwogICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbik7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgIH0KIH0KIApAQCAtNjk1LDE0ICs2OTUsNjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7Cit9CisKIHVpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiAgICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiAgICAgfQorICAgIC8vIERPIE5PVCBMT0NLLCBtYXkgYmUgY2FsbGVkIGZyb20gQXVkaW9GbGluZ2VyIHdpdGggbG9jayBoZWxkLCByZWFjaGluZyBkZWFkbG9jawogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CkBAIC04MDMsMjcgKzg1MSwxMDAgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cygKICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKIGJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtODM3LDYgKzk1OCwxNyBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtOTQwLDkgKzEwNzIsMTQgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisKKyAgICAvLyBsb29wYmFja3xyZW5kZXIgb25seSBuZWVkIGEgTWVkaWFQcm9qZWN0aW9uIChjaGVja2VkIGluIGNhbGxlciBBdWRpb1NlcnZpY2UuamF2YSkKKyAgICBib29sIG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgPSBzdGQ6OmFueV9vZihtaXhlcy5iZWdpbigpLCBtaXhlcy5lbmQoKSwgW10oYXV0byYgbWl4KSB7CisgICAgICAgICAgICByZXR1cm4gIWlzX21peF9sb29wYmFja19yZW5kZXIobWl4Lm1Sb3V0ZUZsYWdzKTsgfSk7CisgICAgaWYgKG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgJiYgIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CkBAIC05NTQsMjcgKzEwOTEsNTIgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTAyNiw2ICsxMTg4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTEwMzYsNCArMTIwOSw2NiBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHByb2R1Y3RTdHJhdGVneSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBmM2NkZGMzLi44Y2JmM2FmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgpAQCAtMzUsMTYgKzM0LDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAKLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTcwLDggKzY4LDYgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICAgICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtVG9uZSIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBvdXRwdXQgYWN0aXZpdHkgY29tbWFuZCB0aHJlYWQKQEAgLTg5LDExICs4NSwxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeSA9IG5ldyBTZW5zb3JQcml2YWN5UG9saWN5KHRoaXMpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKIH0KIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjp+QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKIHsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5leGl0KCk7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5leGl0KCk7CiAKQEAgLTEwNSw2ICsxMDMsOSBAQAogCiAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKICAgICBtVWlkUG9saWN5LmNsZWFyKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS5jbGVhcigpOwogfQogCiAvLyBBIG5vdGlmaWNhdGlvbiBjbGllbnQgaXMgYWx3YXlzIHJlZ2lzdGVyZWQgYnkgQXVkaW9TeXN0ZW0gd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MKQEAgLTExOCwxMyArMTE5LDE3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOwotICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIHBpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkLCBwaWQpOwogCi0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh1aWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh0b2tlbiwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpOwogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CkBAIC0xMzYsMjIgKzE0MSw0NyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodWlkKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih0b2tlbiktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKIH0KIAogLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpCiB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh1aWQpOworICAgICAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHRva2VuKTsKICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICBib29sIGhhc1NhbWVVaWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGhhc1NhbWVVaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyICYmICFoYXNTYW1lVWlkKSB7CiAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBiaW5kZXIgZGVhdGggbm90aWZpY2F0aW9uOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWQpOwogICAgICAgICB9CkBAIC0xODQsNiArMjE0LDE5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5jaGFuZ2VBdWRpb1ZvbHVtZUdyb3VwQ29tbWFuZChncm91cCwgZmxhZ3MpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CiAgICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsCkBAIC0xOTksMjIgKzI0MiwzNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0yMzksOSArMjk0LDEwIEBACiAKIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAotICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbVBpZChwaWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCisgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSksIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChmYWxzZSkKIHsKIH0KIApAQCAtMjU0LDcgKzMxMCw3IEBACiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOwogICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkKTsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQsIG1QaWQpOwogICAgIH0KIH0KIApAQCAtMjcyLDIyICszMjgsMzYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgfQorfQorCisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKAogICAgICAgICBjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0yOTYsNiArMzY2LDEwIEBACiAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQgPSBlbmFibGVkOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKK30KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKQEAgLTMyNSwyNCArMzk5LDE4NiBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzKCkKIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7Ci0gICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzX2woKQoreworLy8gICAgR28gb3ZlciBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIGFsbG93IGNhcHR1cmUgKGRvZXMgbm90IGZvcmNlIHNpbGVuY2UpIGluIHRoZQorLy8gICAgZm9sbG93aW5nIGNhc2VzOgorLy8gICAgVGhlIGNsaWVudCBpcyB0aGUgYXNzaXN0YW50CisvLyAgICAgICAgQU5EIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1AKKy8vICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorLy8gICAgICAgIE9SIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gQU5EIGlzIG9uIFRPUCBPUiBsYXRlc3Qgc3RhcnRlZAorLy8gICAgICAgICAgICAgICBPUiB1c2VzIEhPVFdPUkQKKy8vICAgICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIHByaXZhY3kgc2Vuc2l0aXZlIGFjdGl2ZSBjYXB0dXJlCisvLyAgICBPUiBUaGUgY2xpZW50IGlzIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZQorLy8gICAgICAgIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICBPUiB0aGUgc291cmNlIGlzIG9uZSBvZjogQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLCBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLAorLy8gICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwKKy8vICAgIE9SIEFueSBvdGhlciBjbGllbnQKKy8vICAgICAgICBBTkQgVGhlIGFzc2lzdGFudCBpcyBub3Qgb24gVE9QCisvLyAgICAgICAgQU5EIGlzIG9uIFRPUCBPUiBsYXRlc3Qgc3RhcnRlZAorLy8gICAgICAgIEFORCB0aGVyZSBpcyBubyBwcml2YWN5IHNlbnNpdGl2ZSBhY3RpdmUgY2FwdHVyZQorLy9UT0RPOiBtYW1hbmFnZSBwcmUgcHJvY2Vzc2luZyBlZmZlY3RzIGFjY29yZGluZyB0byB1c2UgY2FzZSBwcmlvcml0eQorCisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IHRvcEFjdGl2ZTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0QWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RTZW5zaXRpdmVBY3RpdmU7CisgICAgbnNlY3NfdCB0b3BTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IDA7CisgICAgYm9vbCBpc0ExMXlPblRvcCA9IG1VaWRQb2xpY3ktPmlzQTExeU9uVG9wKCk7CisgICAgYm9vbCBpc0Fzc2lzdGFudE9uVG9wID0gZmFsc2U7CisgICAgYm9vbCBpc1NlbnNpdGl2ZUFjdGl2ZSA9IGZhbHNlOworCisgICAgLy8gaWYgU2Vuc29yIFByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCByZWNvcmRpbmdzIHNob3VsZCBiZSBzaWxlbmNlZC4KKyAgICBpZiAobVNlbnNvclByaXZhY3lQb2xpY3ktPmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSkgeworICAgICAgICBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0wOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIGlmICghY3VycmVudC0+YWN0aXZlKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGlzUHJpdmFjeVNlbnNpdGl2ZVNvdXJjZShjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzU2Vuc2l0aXZlQWN0aXZlID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiB0b3BTdGFydE5zKSB7CisgICAgICAgICAgICAgICAgdG9wQWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICB0b3BTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgICAgIGlzQXNzaXN0YW50T25Ub3AgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdFN0YXJ0TnMpIHsKKyAgICAgICAgICAgIGxhdGVzdEFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICBsYXRlc3RTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodG9wQWN0aXZlID09IG51bGxwdHIgJiYgbGF0ZXN0QWN0aXZlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0b3BBY3RpdmUgIT0gbnVsbHB0cikgeworICAgICAgICBsYXRlc3RBY3RpdmUgPSBudWxscHRyOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIGNvbnRpbnVlOworCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlOworICAgICAgICBib29sIGlzT25Ub3AgPSBjdXJyZW50ID09IHRvcEFjdGl2ZTsKKyAgICAgICAgYm9vbCBpc0xhdGVzdCA9IGN1cnJlbnQgPT0gbGF0ZXN0QWN0aXZlOworICAgICAgICBib29sIGlzTGF0ZXN0U2Vuc2l0aXZlID0gY3VycmVudCA9PSBsYXRlc3RTZW5zaXRpdmVBY3RpdmU7CisgICAgICAgIGJvb2wgZm9yY2VJZGxlID0gdHJ1ZTsKKworICAgICAgICBpZiAoaXNWaXJ0dWFsU291cmNlKHNvdXJjZSkpIHsKKyAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ExMXlPblRvcCkgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgfHwgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgeworICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoKChpc09uVG9wIHx8IGlzTGF0ZXN0KSAmJiBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhaXNTZW5zaXRpdmVBY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQTExeVVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICBpZiAoKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmCisgICAgICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gfHwgc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkgeworICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpc0Fzc2lzdGFudE9uVG9wICYmIChpc09uVG9wIHx8IGlzTGF0ZXN0KSAmJgorICAgICAgICAgICAgICAgICghaXNTZW5zaXRpdmVBY3RpdmUgfHwgaXNMYXRlc3RTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsCisgICAgICAgICAgICAgICAgICAgICAgZm9yY2VJZGxlID8gQVBQX1NUQVRFX0lETEUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwbVN0YXRGcm9tQW1TdGF0ZShtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50LT51aWQpKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwgQVBQX1NUQVRFX0lETEUpOworICAgIH0KK30KKworLyogc3RhdGljICovCithcHBfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFwbVN0YXRGcm9tQW1TdGF0ZShpbnQgYW1TdGF0ZSkgeworICAgIHN3aXRjaCAoYW1TdGF0ZSkgeworICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV046CisgICAgICAgIHJldHVybiBBUFBfU1RBVEVfSURMRTsKKyAgICBjYXNlIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A6CisgICAgICAgIHJldHVybiBBUFBfU1RBVEVfVE9QOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQVBQX1NUQVRFX0ZPUkVHUk9VTkQ7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzUHJpdmFjeVNlbnNpdGl2ZVNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1ZpcnR1YWxTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKQoreworICAgIHN3aXRjaCAoc291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXBwU3RhdGVfbCh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQoreworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBcHBTdGF0ZSh1aWQsIHN0YXRlKTsKICAgICB9CiAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYpIHsKKyAgICAgICAgYm9vbCBzaWxlbmNlZCA9IHN0YXRlID09IEFQUF9TVEFURV9JRExFOwogICAgICAgICBhZi0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CiAgICAgfQogfQpAQCAtMzYyLDE0ICs1OTgsMTMgQEAKICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+ZHVtcChmZCk7CiAgICAgICAgIH0KIAorICAgICAgICBtUGFja2FnZU1hbmFnZXIuZHVtcChmZCk7CisKICAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTUwNSw3ICs3NDAsOCBAQAogICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKICAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQotICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUsCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUsCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKICAgICAgICAgICAgIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKICAgICBzdGF0dXNfdCByZXMgPSBhbS5saW5rVG9EZWF0aCh0aGlzKTsKQEAgLTUxNCw2ICs3NTAsNyBAQAogICAgICAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiVWlkUG9saWN5OjpyZWdpc3RlclNlbGYgbGlua1RvRGVhdGggZmFpbGVkOiAlZCIsIHJlcyk7CisKICAgICAgICAgYW0udW5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMpOwogICAgIH0KIH0KQEAgLTUzMiw4ICs3NjksNyBAQAogICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmNoZWNrUmVnaXN0ZXJlZCgpIHsKICAgICBib29sIG5lZWRUb1JlcmVnaXN0ZXIgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC01NDMsMTAzICs3NzksMjEyIEBACiAgICAgICAgIC8vIExvb2tzIGxpa2UgQWN0aXZpdHlNYW5hZ2VyIGhhcyBkaWVkIHByZXZpb3VzbHksIGF0dGVtcHQgdG8gcmUtcmVnaXN0ZXIuCiAgICAgICAgIHJlZ2lzdGVyU2VsZigpOwogICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CiAgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgogICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlOwogICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgfQogICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkpOwogICAgIH0KICAgICByZXR1cm4gYWN0aXZlOwogfQogCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmdldFVpZFN0YXRlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICB9CisgICAgY2hlY2tSZWdpc3RlcmVkKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdXRvIG92ZXJyaWRlSXRlciA9IG1PdmVycmlkZVVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAob3ZlcnJpZGVJdGVyICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5zZWNvbmQgIT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBJbiBhbiBhYnNlbnNlIG9mIHRoZSBBY3Rpdml0eU1hbmFnZXIsIGFzc3VtZSBldmVyeXRoaW5nIHRvIGJlIGFjdGl2ZS4KKyAgICAgICAgaWYgKCFtT2JzZXJ2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIGludCBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgc3RhdGUgPSBhbS5nZXRVaWRQcm9jZXNzU3RhdGUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIHRydWUsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIHRydWUpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEdvbmUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgZmFsc2UpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBmYWxzZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkSWRsZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCB0cnVlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIGZhbHNlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzU2VydmljZVVpZCh1aWRfdCB1aWQpIGNvbnN0IHsKLSAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgewotICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNlcnZpY2UtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgIWFjdGl2ZSk7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJvY1N0YXRlU2VxIF9fdW51c2VkKSB7CisgICAgaWYgKHByb2NTdGF0ZSAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIHRydWUsIHByb2NTdGF0ZSwgdHJ1ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzT3ZlcnJpZGRlbiA9IGZhbHNlLCB3YXNBY3RpdmUgPSBmYWxzZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgJndhc092ZXJyaWRkZW4sICZ3YXNBY3RpdmUpOwotICAgIH0KLSAgICBpZiAoIXdhc092ZXJyaWRkZW4gJiYgaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gU3RhcnRlZCB0byBvdmVycmlkZS4KLSAgICB9IGVsc2UgaWYgKHdhc092ZXJyaWRkZW4gJiYgIWluc2VydCkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgaXNVaWRBY3RpdmUodWlkKSk7ICAvLyBPdmVycmlkZSBjZWFzZWQsIG5vdGlmeSB3aXRoIGdyb3VuZCB0cnV0aC4KLSAgICB9IGVsc2UgaWYgKHdhc0FjdGl2ZSAhPSBhY3RpdmUpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBPdmVycmlkZSB1cGRhdGVkLgorICAgIHVwZGF0ZVVpZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBpbnNlcnQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKCkgeworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKLSAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgd2FzQWN0aXZlID0gaXNVaWRBY3RpdmUodWlkKTsKKyAgICBpbnQgcHJldmlvdXNTdGF0ZSA9IGdldFVpZFN0YXRlKHVpZCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1DYWNoZWRVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCBudWxscHRyLCAmd2FzQWN0aXZlKTsKLSAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBzZXJ2aWNlIGlmIGN1cnJlbnRseSBvdmVycmlkZGVuLgotICAgICAgICBpZiAobU92ZXJyaWRlVWlkcy5maW5kKHVpZCkgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgcmV0dXJuOworICAgICAgICB1cGRhdGVVaWRMb2NrZWQodWlkcywgdWlkLCBhY3RpdmUsIHN0YXRlLCBpbnNlcnQpOwogICAgIH0KLSAgICBib29sIG5vd0FjdGl2ZSA9IGFjdGl2ZSAmJiBpbnNlcnQ7Ci0gICAgaWYgKHdhc0FjdGl2ZSAhPSBub3dBY3RpdmUpIG5vdGlmeVNlcnZpY2UodWlkLCBub3dBY3RpdmUpOworICAgIGlmICh3YXNBY3RpdmUgIT0gaXNVaWRBY3RpdmUodWlkKSB8fCBzdGF0ZSAhPSBwcmV2aW91c1N0YXRlKSB7CisgICAgICAgIG5vdGlmeVNlcnZpY2UoKTsKKyAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSkgewordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgewogICAgIGF1dG8gaXQgPSB1aWRzLT5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IHVpZHMtPmVuZCgpKSB7Ci0gICAgICAgIGlmICh3YXNUaGVyZSAhPSBudWxscHRyKSAqd2FzVGhlcmUgPSB0cnVlOwotICAgICAgICBpZiAod2FzQWN0aXZlICE9IG51bGxwdHIpICp3YXNBY3RpdmUgPSBpdC0+c2Vjb25kOwogICAgICAgICBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgICAgICBpdC0+c2Vjb25kID0gYWN0aXZlOworICAgICAgICAgICAgaWYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5maXJzdCA9IGFjdGl2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpZHMtPmVyYXNlKGl0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgfSBlbHNlIGlmIChpbnNlcnQgJiYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkgeworICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsIHN0YXRlKSkpOwogICAgIH0KIH0KIAorYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5T25Ub3AoKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZ1aWQgOiBtQ2FjaGVkVWlkcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQuZmlyc3QpOworICAgICAgICBpZiAoaXQgPT0gbUExMXlVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlkLnNlY29uZC5zZWNvbmQgPj0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUAorICAgICAgICAgICAgICAgICYmIHVpZC5zZWNvbmQuc2Vjb25kIDw9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9CT1VORF9GT1JFR1JPVU5EX1NFUlZJQ0UpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5VWlkKHVpZF90IHVpZCkKK3sKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQpOworICAgIHJldHVybiBpdCAhPSBtQTExeVVpZHMuZW5kKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lTZXJ2aWNlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBzcG0ucmVtb3ZlU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpIHsKKyAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT51cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKICAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQogewotICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7CiB9CiAKIApAQCAtNjQ5LDcgKzk5NCw2IEBACiAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTY3NCw2OCArMTAxOCw1NCBAQAogICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CiAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogewpAQCAtNzQ1LDcgKzEwNzUsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPmNyZWF0ZUF1ZGlvUGF0Y2goJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CkBAIC03NTUsNyArMTA4Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+cmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BPUlRfTElTVDogewpAQCAtNzc4LDYgKzExMTIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA6IHsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvVm9sdW1lR3JvdXBEYXRhICo+KGNvbW1hbmQtPm1QYXJhbS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyB2b2x1bWUgZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChkYXRhLT5tR3JvdXAsIGRhdGEtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVRElPUE9SVF9DT05GSUc6IHsKICAgICAgICAgICAgICAgICAgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IChTZXRBdWRpb1BvcnRDb25maWdEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcG9ydCBjb25maWciKTsKQEAgLTc4NSw3ICsxMTMxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKQEAgLTgxMSw4ICsxMTU5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgZGF0YS0+bUNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1EZXZpY2VDb25maWcsIGRhdGEtPm1FZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSwgZGF0YS0+bVNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTAwLDI3ICsxMjQ5LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7Ci0gICAgc3A8VG9uZURhdGE+IGRhdGEgPSBuZXcgVG9uZURhdGEoKTsKLSAgICBkYXRhLT5tVHlwZSA9IHR5cGU7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTk2NywzMyArMTI5NSwyNSBAQAogICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwogICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKICAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCkBAIC0xMDQ4LDYgKzEzNjgsMTkgQEAKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6Y2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA7CisgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGE9IG5ldyBBdWRpb1ZvbHVtZUdyb3VwRGF0YSgpOworICAgIGRhdGEtPm1Hcm91cCA9IGdyb3VwOworICAgIGRhdGEtPm1GbGFncyA9IGZsYWdzOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBhdWRpbyB2b2x1bWUgZ3JvdXAgY2hhbmdlZCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKQogewpAQCAtMTA3Niw5ICsxNDA5LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CkBAIC0xMDg2LDggKzE0MjQsMTEgQEAKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKICAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOworICAgIGRhdGEtPm1DbGllbnRFZmZlY3RzID0gY2xpZW50RWZmZWN0czsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKKyAgICBkYXRhLT5tRWZmZWN0cyA9IGVmZmVjdHM7CiAgICAgZGF0YS0+bVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7CisgICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwogICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQgdWlkICV1IiwKICAgICAgICAgICAgIGV2ZW50LCBjbGllbnRJbmZvLT5zb3VyY2UsIGNsaWVudEluZm8tPnVpZCk7CkBAIC0xMjEyLDYgKzE1NTMsNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGF0Y2gsIDAsIHNpemVvZihwYXRjaCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CkBAIC0xMjU2LDggKzE1OTgsNiBAQAogCiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzMwLDI3ICsxNjcwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZGVsYXlNcyk7CiB9CiAKLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7Ci0gICAgfQotICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCi0gICAgICAgICAgICB0b25lKTsKLSAgICB9Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQogaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKIHsKICAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2ljZVZvbHVtZUNvbW1hbmQodm9sdW1lLCBkZWxheU1zKTsKQEAgLTE0MDYsOSArMTcyNSw2IEBACiBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7Ci1pbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CiBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggNDA3ZDdhNS4uYTJlNzVjZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zMSwxNSArMzEsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgogI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KIAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgpAQCAtNjIsMzYgKzYyLDMzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTAyLDggKzk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTExNiw2ICsxMTIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KTsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCkBAIC0xMzQsNiArMTQxLDIxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMTU5LDEwICsxODEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xODIsNiArMjA0LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CkBAIC0xOTIsMTAgKzIxNiwxNCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0yMDcsMTQgKzIzNSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtMjI0LDcgKzI2NCw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKIAotICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKTsKKyAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKQEAgLTIzMiwxMiArMjcyLDI1IEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKKyAgICAgICAgICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKKyAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CkBAIC0yNDksNyArMzAyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiBVSUQgcmVjb3JkcyBvbmx5IHNpbGVuY2UKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGVfbCh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKIAogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKQEAgLTI2NSw2ICszMTgsMTggQEAKIAogICAgIHN0ZDo6c3RyaW5nIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cyk7CisKKyAgICBhcHBfc3RhdGVfdCBhcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpOworCisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisKKyAgICB2b2lkIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKworICAgIHN0YXRpYyBib29sIGlzUHJpdmFjeVNlbnNpdGl2ZVNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgIHN0YXRpYyBib29sIGlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCiAgICAgLy8gSWYgcmVjb3JkaW5nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBVSUQgaXMgYWxsb3dlZCB0byBkbyB0aGF0LiBJZiB0aGUgVUlEIGlzIGlkbGUKICAgICAvLyB0aGVuIGl0IGNhbm5vdCByZWNvcmQgYW5kIGdldHMgYnVmZmVycyB3aXRoIHplcm9zIC0gc2lsZW5jZS4gQXMgc29vbiBhcyB0aGUgVUlECiAgICAgLy8gdHJhbnNpdGlvbnMgdG8gYW4gYWN0aXZlIHN0YXRlIHdlIHdpbGwgc3RhcnQgcmVwb3J0aW5nIGJ1ZmZlcnMgd2l0aCBkYXRhLiBUaGlzIGFwcHJvYWNoCkBAIC0yNzQsNyArMzM5LDcgQEAKICAgICBjbGFzcyBVaWRQb2xpY3kgOiBwdWJsaWMgQm5VaWRPYnNlcnZlciwgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgVWlkUG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKLSAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpLCBtQXNzaXN0YW50VWlkKDApIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwpAQCAtMjgzLDM0ICszNDgsNjMgQEAKICAgICAgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIG92ZXJyaWRlOwogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKKyAgICAgICAgaW50IGdldFVpZFN0YXRlKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyBtQXNzaXN0YW50VWlkID0gdWlkOyB9CisgICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IHJldHVybiB1aWQgPT0gbUFzc2lzdGFudFVpZDsgfQorICAgICAgICB2b2lkIHNldEExMXlVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeyBtQTExeVVpZHMuY2xlYXIoKTsgbUExMXlVaWRzID0gdWlkczsgfQorICAgICAgICBib29sIGlzQTExeVVpZCh1aWRfdCB1aWQpOworICAgICAgICBib29sIGlzQTExeU9uVG9wKCk7CiAKICAgICAgICAgLy8gQm5VaWRPYnNlcnZlciBpbXBsZW1lbnRhdGlvbgogICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSwgaW50NjRfdCBwcm9jU3RhdGVTZXEpOwogCiAgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGFjdGl2ZSwgdHJ1ZSk7IH0KICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBmYWxzZSwgZmFsc2UpOyB9CiAKLSAgICBwcml2YXRlOgotICAgICAgICBib29sIGlzU2VydmljZVVpZCh1aWRfdCB1aWQpIGNvbnN0OwotICAgICAgICB2b2lkIG5vdGlmeVNlcnZpY2UodWlkX3QgdWlkLCBib29sIGFjdGl2ZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKKworICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5vdGlmeVNlcnZpY2UoKTsKICAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7Ci0gICAgICAgIHZvaWQgdXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwotICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOworICAgICAgICB2b2lkIGNoZWNrUmVnaXN0ZXJlZCgpOwogCiAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CiAgICAgICAgIE11dGV4IG1Mb2NrOwogICAgICAgICBib29sIG1PYnNlcnZlclJlZ2lzdGVyZWQ7Ci0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbU92ZXJyaWRlVWlkczsKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtQ2FjaGVkVWlkczsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbU92ZXJyaWRlVWlkczsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbUNhY2hlZFVpZHM7CisgICAgICAgIHVpZF90IG1Bc3Npc3RhbnRVaWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBtQTExeVVpZHM7CiAgICAgfTsKIAotICAgIC8vIFRocmVhZCB1c2VkIGZvciB0b25lIHBsYXliYWNrIGFuZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCi0gICAgLy8gRm9yIHRvbmUgcGxheWJhY2ssIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jayB3aXRoIG1Mb2NrIGJlY2F1c2UKLSAgICAvLyBzdGFydFRvbmUoKSBhbmQgc3RvcFRvbmUoKSBhcmUgbm9ybWFsbHkgY2FsbGVkIHdpdGggbUxvY2sgbG9ja2VkIGFuZCByZXF1ZXN0aW5nIGEgdG9uZSBzdGFydAotICAgIC8vIG9yIHN0b3Agd2lsbCBjYXVzZSBjYWxscyB0byBBdWRpb1BvbGljeVNlcnZpY2UgYW5kIGFuIGF0dGVtcHQgdG8gbG9jayBtTG9jay4KKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIGFwcHMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBhY3RpdmUsIHNob3VsZCBiZQorICAgIC8vIHByZXZlbnRlZCBmcm9tIHJlY29yZGluZy4gVGhpcyBpcyBoYW5kbGVkIHNpbWlsYXIgdG8gaWRsZSBVSURzLCBhbnkgYXBwIHRoYXQgYXR0ZW1wdHMKKyAgICAvLyB0byByZWNvcmQgd2hpbGUgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB3aWxsIHJlY2VpdmUgYnVmZmVycyB3aXRoIHplcm9zLiBBcyBzb29uIGFzCisgICAgLy8gc2Vuc29yIHByaXZhY3kgaXMgZGlzYWJsZWQgYWN0aXZlIGFwcHMgd2lsbCByZWNlaXZlIHRoZSBleHBlY3RlZCBkYXRhIHdoZW4gcmVjb3JkaW5nLgorICAgIGNsYXNzIFNlbnNvclByaXZhY3lQb2xpY3kgOiBwdWJsaWMgaGFyZHdhcmU6OkJuU2Vuc29yUHJpdmFjeUxpc3RlbmVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZXhwbGljaXQgU2Vuc29yUHJpdmFjeVBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSkge30KKworICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKKworICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX2Jvb2wgbVNlbnNvclByaXZhY3lFbmFibGVkOworICAgIH07CisKKyAgICAvLyBUaHJlYWQgdXNlZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCiAgICAgLy8gRm9yIGF1ZGlvIGNvbmZpZyBjb21tYW5kcywgaXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYXVkaW8gZmxpbmdlciByZXF1aXJlcyB0aGF0IHRoZSBjYWxsaW5nCiAgICAgLy8gcHJvY2VzcyAodXNlcikgaGFzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGF1ZGlvIHNldHRpbmdzLgogICAgIGNsYXNzIEF1ZGlvQ29tbWFuZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewpAQCAtMzE5LDggKzQxMyw2IEBACiAKICAgICAgICAgLy8gY29tbWFuZHMgZm9yIHRvbmUgQXVkaW9Db21tYW5kCiAgICAgICAgIGVudW0gewotICAgICAgICAgICAgU1RBUlRfVE9ORSwKLSAgICAgICAgICAgIFNUT1BfVE9ORSwKICAgICAgICAgICAgIFNFVF9WT0xVTUUsCiAgICAgICAgICAgICBTRVRfUEFSQU1FVEVSUywKICAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUsCkBAIC0zMzAsNiArNDIyLDcgQEAKICAgICAgICAgICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QT1JUX0xJU1QsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QQVRDSF9MSVNULAorICAgICAgICAgICAgQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQLAogICAgICAgICAgICAgU0VUX0FVRElPUE9SVF9DT05GSUcsCiAgICAgICAgICAgICBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEUsCiAgICAgICAgICAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKQEAgLTM0NSwyMCArNDM4LDEzIEBACiAgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKIAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMzY4LDE1ICs0NTQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgIHByaXZhdGU6CiAgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7CkBAIC0zOTAsNyArNDgxLDcgQEAKIAogICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCi0gICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgorICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNFVF9WT0xVTUUsIFNFVF9QQVJBTUVURVJTLi4uCiAgICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAogICAgICAgICAgICAgTXV0ZXggbUxvY2s7ICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgdG8gbUNvbmQKICAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCkBAIC00MDYsMTIgKzQ5Nyw2IEBACiAgICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KICAgICAgICAgfTsKIAotICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgfTsKLQogICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CkBAIC00MzIsMTYgKzUxNywxMiBAQAogCiAgICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgUmVsZWFzZU91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKQEAgLTQ1NSw2ICs1MzYsMTIgQEAKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgICAgIH07CiAKKyAgICAgICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IG1Hcm91cDsKKyAgICAgICAgICAgIGludCBtRmxhZ3M7CisgICAgICAgIH07CisKICAgICAgICAgY2xhc3MgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CkBAIC00NzEsMTQgKzU1OCwxNiBAQAogICAgICAgICAgICAgaW50IG1FdmVudDsKICAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtQ2xpZW50RWZmZWN0czsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtRGV2aWNlQ29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUVmZmVjdHM7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBtU291cmNlOwogICAgICAgICB9OwogCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKLSAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCiAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gbUxhc3RDb21tYW5kOyAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKICAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTU1MywxMSArNjQyLDYgQEAKICAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAotICAgICAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKLQogICAgICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAKQEAgLTU4Miw5ICs2NjYsMTUgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKIAogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSk7CiAKQEAgLTU5NywxOCArNjg3LDI5IEBACiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1VaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtNjE5LDM0ICs3MjAsNjEgQEAKIAogICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+ICAgICAgICBtU2VydmljZTsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQ7CisgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZDsKKyAgICB9OworCisgICAgY2xhc3MgQXVkaW9DbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIGlvKGlvKSwgdWlkKHVpZCksIHBpZChwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKHNlc3Npb24pLCBkZXZpY2VJZChkZXZpY2VJZCksIGFjdGl2ZShmYWxzZSkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9DbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKworICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsgLy8gc291cmNlLCBmbGFncyAuLi4KKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW87ICAgICAgICAgIC8vIGF1ZGlvIEhBTCBzdHJlYW0gSU8gaGFuZGxlCisgICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECisgICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECisgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gUGxheWJhY2svQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKICAgICB9OwogCiAgICAgLy8gLS0tIEF1ZGlvUmVjb3JkQ2xpZW50IC0tLQogICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1JlY29yZCBjbGllbnQKICAgICAvLyAoYmV0d2VlbiBjYWxscyB0byBnZXRJbnB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZUlucHV0KCkpCi0gICAgY2xhc3MgQXVkaW9SZWNvcmRDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgY2xhc3MgQXVkaW9SZWNvcmRDbGllbnQgOiBwdWJsaWMgQXVkaW9DbGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZENsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGlucHV0KSwgdWlkKHVpZCksIHBpZChwaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBzZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUoZmFsc2UpLCBpc0NvbmN1cnJlbnQoZmFsc2UpLCBpc1ZpcnR1YWxEZXZpY2UoZmFsc2UpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkQ2xpZW50KCkge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBkZXZpY2VJZCksCisgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHN0YXJ0VGltZU5zKDApIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgotICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQotICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAotICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAogICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKLSAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCi0gICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnM7CisgICAgfTsKKworICAgIC8vIC0tLSBBdWRpb1BsYXliYWNrQ2xpZW50IC0tLQorICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1RyYWNrIGNsaWVudAorICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldE91dHB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZU91dHB1dCgpKQorICAgIGNsYXNzIEF1ZGlvUGxheWJhY2tDbGllbnQgOiBwdWJsaWMgQXVkaW9DbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9QbGF5YmFja0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKICAgICB9OwogCiAgICAgLy8gQSBjbGFzcyBhdXRvbWF0aWNhbGx5IGNsZWFyaW5nIGFuZCByZXN0b3JpbmcgYmluZGVyIGNhbGxlciBpZGVudGl0eSBpbnNpZGUKQEAgLTY3NiwyMSArODA0LDI1IEBACiAgICAgLy8gbUxvY2sgcHJvdGVjdHMgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgdGhhdCBjYW4gY2FsbCBpbnRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBhbmQgcG9zc2libHkgYmFjayBpbiB0byBhdWRpbyBwb2xpY3kgc2VydmljZSBhbmQgYWNxdWlyZSBtRWZmZWN0c0xvY2suCiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZSAqbUF1ZGlvUG9saWN5TWFuYWdlcjsKICAgICBBdWRpb1BvbGljeUNsaWVudCAqbUF1ZGlvUG9saWN5Q2xpZW50OwogCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCB1aWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50NjRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOwogICAgIE11dGV4IG1Ob3RpZmljYXRpb25DbGllbnRzTG9jazsgIC8vIHByb3RlY3RzIG1Ob3RpZmljYXRpb25DbGllbnRzCiAgICAgLy8gTWFuYWdlIGFsbCBlZmZlY3RzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsKIAogICAgIHNwPFVpZFBvbGljeT4gbVVpZFBvbGljeTsKKyAgICBzcDxTZW5zb3JQcml2YWN5UG9saWN5PiBtU2Vuc29yUHJpdmFjeVBvbGljeTsKKwogICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9SZWNvcmRDbGllbnQ+ID4gICBtQXVkaW9SZWNvcmRDbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gPiAgIG1BdWRpb1BsYXliYWNrQ2xpZW50czsKKworICAgIE1lZGlhUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOyAvLyBUbyBjaGVjayBhbGxvd1BsYXliYWNrQ2FwdHVyZQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYTQzZGFlYS4uOTdiZTQ0YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC00LDkgKzQsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcworICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQgXApAQCAtMTgsNiArMTYsMTAgQEAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAogCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMKKwogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBcCiAKQEAgLTI5LDQgKzMxLDM0IEBACiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKworIyBzeXN0ZW0vYXVkaW8uaCB1dGlsaXRpZXMgdGVzdAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmJhc2UgXAorICBsaWJsb2cgXAorICBsaWJtZWRpYV9oZWxwZXIgXAorICBsaWJ1dGlscworCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgbGlibWVkaWFfaGVhZGVycworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBzeXN0ZW1hdWRpb190ZXN0cy5jcHAgXAorCitMT0NBTF9NT0RVTEUgOj0gc3lzdGVtYXVkaW9fdGVzdHMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKKwogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAppbmRleCBlYjgyMjJjLi44ODU0ZWIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApAQCAtNjAsOSArNjAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgfQogICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCAvKmlvSGFuZGxlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qa2V5cyovKSBvdmVycmlkZSB7IHJldHVybiBTdHJpbmc4KCk7IH0KLSAgICBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCAvKnRvbmUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAvKnN0cmVhbSovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9Ci0gICAgc3RhdHVzX3Qgc3RvcFRvbmUoKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgLyp2b2x1bWUqLywgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IC8qc2Vzc2lvbiovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IC8qc3JjT3V0cHV0Ki8sCkBAIC03NiwxMyArNzMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSBvdmVycmlkZSB7IH0KICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgLypncm91cCovLCBpbnQgLypmbGFncyovKSBvdmVycmlkZSB7IH0KICAgICBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCAvKnVzZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CiAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IC8qcmVnSWQqLywgaW50MzJfdCAvKnN0YXRlKi8pIG92ZXJyaWRlIHsgfQotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCAvKmV2ZW50Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QqIC8qY2xpZW50SW5mbyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypjbGllbnRDb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qZGV2aWNlQ29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgLypwYXRjaEhhbmRsZSovKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8gX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKSBvdmVycmlkZSB7IH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCmluZGV4IGE5NTkzYjguLmRlNTY3MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcApAQCAtMTYsOSArMTYsMTUgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgogCkBAIC0xMDYsMTAgKzExMiwzOSBAQAogICAgIHN0ZDo6c2V0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBtQWN0aXZlUGF0Y2hlczsKIH07CiAKK2NsYXNzIFBhdGNoQ291bnRDaGVjayB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBQYXRjaENvdW50Q2hlY2soQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqY2xpZW50KQorICAgICAgICAgICAgOiBtQ2xpZW50e2NsaWVudH0sCisgICAgICAgICAgICAgIG1Jbml0aWFsQ291bnR7bUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCl9IHt9CisgICAgaW50IGRlbHRhRnJvbVNuYXBzaG90KCkgY29uc3QgeworICAgICAgICBzaXplX3QgY3VycmVudENvdW50ID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7CisgICAgICAgIGlmIChtSW5pdGlhbENvdW50IDw9IGN1cnJlbnRDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDb3VudCAtIG1Jbml0aWFsQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLShzdGF0aWNfY2FzdDxpbnQ+KG1Jbml0aWFsQ291bnQgLSBjdXJyZW50Q291bnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICBjb25zdCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50ICptQ2xpZW50OworICAgIGNvbnN0IHNpemVfdCBtSW5pdGlhbENvdW50OworfTsKKwogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIFNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIHsgKHZvaWQpY29uZmlnOyB9CisKKyAgICB2b2lkIGR1bXBUb0xvZygpOworICAgIHZvaWQgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIpOworICAgIFBhdGNoQ291bnRDaGVjayBzbmFwc2hvdFBhdGNoQ291bnQoKSB7IHJldHVybiBQYXRjaENvdW50Q2hlY2sobUNsaWVudC5nZXQoKSk7IH0KIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50PiBtQ2xpZW50OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1BvbGljeVRlc3RNYW5hZ2VyPiBtTWFuYWdlcjsKQEAgLTExOSw2ICsxNTQsNyBAQAogICAgIG1DbGllbnQucmVzZXQobmV3IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQpOwogICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKICAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIFNldFVwQ29uZmlnKCZtTWFuYWdlci0+Z2V0Q29uZmlnKCkpOyAgLy8gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGNvbmZpZy4KICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0aWFsaXplKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRDaGVjaygpKTsKIH0KQEAgLTEyOCwxNCArMTY0LDczIEBACiAgICAgbUNsaWVudC5yZXNldCgpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmR1bXBUb0xvZygpIHsKKyAgICBpbnQgcGlwZWZkWzJdOworICAgIEFTU0VSVF9ORSgtMSwgcGlwZShwaXBlZmQpKTsKKyAgICBwaWRfdCBjcGlkID0gZm9yaygpOworICAgIEFTU0VSVF9ORSgtMSwgY3BpZCk7CisgICAgaWYgKGNwaWQgPT0gMCkgeworICAgICAgICAvLyBDaGlsZCBwcm9jZXNzIHJlYWRzIGZyb20gdGhlIHBpcGUgYW5kIGxvZ3MuCisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIGNoYXIgYnVmOworICAgICAgICB3aGlsZSAocmVhZChwaXBlZmRbMF0sICZidWYsIHNpemVvZihidWYpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChidWYgIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGxpbmUgKz0gYnVmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGxpbmUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWxpbmUuZW1wdHkoKSkgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgY2xvc2UocGlwZWZkWzBdKTsKKyAgICAgICAgX2V4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBQYXJlbnQgZG9lcyB0aGUgZHVtcCBhbmQgY2hlY2tzIHRoZSBzdGF0dXMgY29kZS4KKyAgICAgICAgY2xvc2UocGlwZWZkWzBdKTsKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+ZHVtcChwaXBlZmRbMV0pKTsKKyAgICAgICAgY2xvc2UocGlwZWZkWzFdKTsKKyAgICAgICAgd2FpdChOVUxMKTsgIC8vIFdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0LgorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9OworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBsb2NhbFBvcnRJZDsKKyAgICBpZiAoIXBvcnRJZCkgcG9ydElkID0gJmxvY2FsUG9ydElkOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIEFTU0VSVF9FUShPSywgbU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoCisgICAgICAgICAgICAgICAgICAgICZhdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsICZzdHJlYW0sIDAgLyp1aWQqLywgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHt9KSk7CisgICAgQVNTRVJUX05FKEFVRElPX1BPUlRfSEFORExFX05PTkUsICpwb3J0SWQpOworfQorCisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBJbml0U3VjY2VzcykgewogICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KIH0KIAorVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKwogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGYWlsdXJlKSB7CiAgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gobnVsbHB0ciwgJmhhbmRsZSwgMCkpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgbnVsbHB0ciwgMCkpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOwpAQCAtMTYyLDM1ICsyNTcsMTgwIEBACiAgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaGFuZGxlIGlzIGxlZnQgdW5jaGFuZ2VkLgogICAgIEFTU0VSVF9FUShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKLSAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSwgbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkpOworICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZyb21NaXgpIHsKLSAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIHVpZF90IHVpZCA9IDQyOwotICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc3JjID0gcGF0Y2guc291cmNlc1swXTsKLSAgICAgICAgc3JjLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgICAgICBzcmMudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgICAgIHNyYy5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXS0+Z2V0SWQoKTsKLSAgICAgICAgLy8gTm90ZTogdGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzcmMuc2FtcGxlX3JhdGUgPSA0NDEwMDsKLSAgICAgICAgc3JjLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBzcmMuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIH0KLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc2luayA9IHBhdGNoLnNpbmtzWzBdOwotICAgICAgICBzaW5rLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICAgICAgc2luay50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICAgICAgc2luay5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmdldElkKCk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdKS4KKyAgICAgICAgICAgIGFkZFNpbmsobU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJmhhbmRsZSwgdWlkKSk7CiAgICAgQVNTRVJUX05FKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOwotICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlICsgMSwgbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCiAvLyBUT0RPOiBBZGQgcGF0Y2ggY3JlYXRpb24gdGVzdHMgdGhhdCBpbnZvbHZlIGFscmVhZHkgZXhpc3RpbmcgcGF0Y2gKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXBDb25maWcoQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZE91dHB1dERldmljZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtTXNkSW5wdXREZXZpY2U7Cit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIHsKKyAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBTZXJpYWxpemVyIHRvIGxvYWQgcGFydCBvZiB0aGUgY29uZmlnIGZyb20gYSBzdHJpbmcuCisgICAgbU1zZE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfQlVTKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbU91dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIHNwPEF1ZGlvUHJvZmlsZT4gYWMzT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCk7CisgICAgbU1zZE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShhYzNPdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVTKTsKKyAgICAvLyBNYXRjaCBvdXRwdXQgcHJvZmlsZSBmcm9tIEF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0LgorICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtSW5wdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX1NURVJFTywgNDQxMDApOworICAgIG1Nc2RJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKHBjbUlucHV0UHJvZmlsZSk7CisgICAgY29uZmlnLT5hZGRBdmFpbGFibGVEZXZpY2UobU1zZE91dHB1dERldmljZSk7CisgICAgY29uZmlnLT5hZGRBdmFpbGFibGVEZXZpY2UobU1zZElucHV0RGV2aWNlKTsKKworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICBId01vZHVsZUNvbGxlY3Rpb24gbW9kdWxlcyA9IGNvbmZpZy0+Z2V0SHdNb2R1bGVzKCk7CisgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKKyAgICBjb25maWctPnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hdHRhY2gobXNkTW9kdWxlKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmF0dGFjaChtc2RNb2R1bGUpOworCisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoIm1zZCBpbnB1dCIpKTsKKyAgICBtc2RPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShtc2RPdXRwdXRQcm9maWxlKTsKKyAgICBzcDxPdXRwdXRQcm9maWxlPiBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZSA9CisgICAgICAgICAgICBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJtc2QgY29tcHJlc3NlZCBpbnB1dCIpKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlLT5zZXRGbGFncygKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZSk7CisKKyAgICBzcDxJbnB1dFByb2ZpbGU+IG1zZElucHV0UHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIG91dHB1dCIpKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIG1zZElucHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisgICAgbXNkTW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUobXNkSW5wdXRQcm9maWxlKTsKKworICAgIC8vIEFkZCBhIHByb2ZpbGUgd2l0aCBhbm90aGVyIGVuY29kaW5nIHRvIHRoZSBkZWZhdWx0IGRldmljZSB0byB0ZXN0IHJvdXRpbmcKKyAgICAvLyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHRzT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCk7CisgICAgY29uZmlnLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmFkZEF1ZGlvUHJvZmlsZShkdHNPdXRwdXRQcm9maWxlKTsKKyAgICBzcDxPdXRwdXRQcm9maWxlPiBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJlbmNvZGVkIikpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShjb25maWctPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgY29uZmlnLT5nZXRId01vZHVsZXMoKS5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSktPgorICAgICAgICAgICAgYWRkT3V0cHV0UHJvZmlsZShwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlRlYXJEb3duKCkgeworICAgIG1Nc2RPdXRwdXREZXZpY2UuY2xlYXIoKTsKKyAgICBtTXNkSW5wdXREZXZpY2UuY2xlYXIoKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpUZWFyRG93bigpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgSW5pdFN1Y2Nlc3MpIHsKKyAgICBBU1NFUlRfVFJVRShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBBU1NFUlRfVFJVRShtTXNkSW5wdXREZXZpY2UpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbk9uU2V0Rm9yY2VVc2UpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRSb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUGx1c1BjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJVbnN1cHBvcnRlZEZvcm1hdEJ5cGFzc2VzTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9ORShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJGb3JtYXRTd2l0Y2hpbmcpIHsKKyAgICAvLyBTd2l0Y2ggYmV0d2VlbiBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBhbmQgbm90IHN1cHBvcnRlZCBieSBNU0QuCisgICAgeworICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNULAorICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgICAgICBtTWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9CisgICAgeworICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNULAorICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgtMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFhZTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU3lzQXVkaW9fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hJbnZhbGlkKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDA7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaFZhbGlkKSB7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIC8vIEl0J3MgT0sgbm90IHRvIGhhdmUgc2lua3MuCisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc2luayA9IHsKKyAgICAgICAgLmlkID0gMiwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLgorICAgICAgICAgICAgICAgICAgICBhZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hId0F2U3luYykgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGRldmljZV9zcmNfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKyAgICBkZXZpY2Vfc3JjX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc2lua19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5mbGFncy5pbnB1dCA9IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBtaXhfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7CisgICAgbWl4X3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEVxdWFsKSB7CisgICAgY29uc3QgYXVkaW9fcGF0Y2ggcGF0Y2gxe30sIHBhdGNoMnt9OworICAgIC8vIEludmFsaWQgcGF0Y2hlcyBhcmUgbm90IGVxdWFsLgorICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmcGF0Y2gxLCAmcGF0Y2gyKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtfaHdfYXZfc3luYyA9IHNpbms7CisgICAgc2lua19od19hdl9zeW5jLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtfaHdfYXZfc3luYy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjMGU0YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vCisvLyBsaWJjYW1lcmFzZXJ2aWNlCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2UiLAorCisgICAgLy8gQ2FtZXJhIHNlcnZpY2Ugc291cmNlCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYW1lcmFGbGFzaGxpZ2h0LmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImFwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImFwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAiLAorICAgICAgICAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIiwKKyAgICAgICAgImd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIiwKKyAgICAgICAgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIiwKKyAgICAgICAgImhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAiLAorICAgICAgICAiaGlkbC9Db252ZXJ0LmNwcCIsCisgICAgICAgICJoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCIsCisgICAgICAgICJoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUcmFjZXMuY3BwIiwKKyAgICAgICAgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCIsCisgICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1RhZ01vbml0b3IuY3BwIiwKKyAgICAgICAgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmV4aWYiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnl1diIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRlcHRocGhvdG8iLAorCisgICAgc3JjczogWworICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaW1hZ2VfaW8iLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDk2MjYxYWIuLjRjZmVjZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTQsOTEgKzE0LDkgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgbGliY2FtZXJhc2VydmljZQotIwotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDYW1lcmEgc2VydmljZSBzb3VyY2UKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICBcCi0gICAgQ2FtZXJhU2VydmljZS5jcHAgXAotICAgIENhbWVyYUZsYXNobGlnaHQuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIFwKLSAgICBjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBcCi0gICAgYXBpMS9DYW1lcmFDbGllbnQuY3BwIFwKLSAgICBhcGkxL0NhbWVyYTJDbGllbnQuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKLSAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKLSAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCi0gICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCi0gICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKLSAgICB1dGlscy9UYWdNb25pdG9yLmNwcCBcCi0gICAgdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJ1aSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlsc2NhbGxzdGFjayBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJmbXEgXAotICAgIGxpYmd1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40Ci0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIEJ1aWxkIHRlc3RzIHRvbworIyBCdWlsZCB0ZXN0cwogCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGJhMDI0NGUuLmUwNjg5N2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC00NywxMSArNDcsMTUgQEAKICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlICJoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgpAQCAtNjksNiArNzMsNyBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVHJhY2VzLmgiCiAjaW5jbHVkZSAidXRpbHMvVGFnTW9uaXRvci5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSB7CiAgICAgY29uc3QgY2hhcioga1Blcm1pc3Npb25TZXJ2aWNlTmFtZSA9ICJwZXJtaXNzaW9uIjsKQEAgLTc3LDYgKzgyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgYmluZGVyOjpTdGF0dXM7Cit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50OwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk7CkBAIC0xNDEsNiArMTQ3LDEzIEBACiAKICAgICBtVWlkUG9saWN5ID0gbmV3IFVpZFBvbGljeSh0aGlzKTsKICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeSA9IG5ldyBTZW5zb3JQcml2YWN5UG9saWN5KHRoaXMpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKyAgICBzcDxIaWRsQ2FtZXJhU2VydmljZT4gaGNzID0gSGlkbENhbWVyYVNlcnZpY2U6OmdldEluc3RhbmNlKHRoaXMpOworICAgIGlmIChoY3MtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZGVmYXVsdCBhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDEuMCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgfQogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjplbnVtZXJhdGVQcm92aWRlcnMoKSB7CkBAIC0yMTQsMTMgKzIyNywxNCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICBpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOworICAgICAgICBpLnNlY29uZC0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKICAgICB9CiB9CiAKIENhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgewogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSB7CkBAIC0zMzcsNyArMzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCiAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXN7fSk7CiAgICAgICAgICAgICAvLyBFbnN1cmUgbm90IGluIGJpbmRlciBSUEMgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgICAgICJvbkRldmljZVN0YXR1c0NoYW5nZWQgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FtZXJhIHNlcnZpY2UgcHJvY2VzcyEiKTsKICAgICAgICAgICAgIGNsaWVudFRvRGlzY29ubmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICB9CkBAIC00OTgsMTcgKzUxMiwzNyBAQAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgIH0KIAorICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdGFnc1JlbW92ZWQ7CisgICAgLy8gSWYgaXQncyBub3QgY2FsbGluZyBmcm9tIGNhbWVyYXNlcnZlciwgY2hlY2sgdGhlIHBlcm1pc3Npb24uCisgICAgaWYgKChjYWxsaW5nUGlkICE9IGdldHBpZCgpKSAmJgorICAgICAgICAgICAgIWNoZWNrUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIpLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICByZXMgPSBjYW1lcmFJbmZvLT5yZW1vdmVQZXJtaXNzaW9uRW50cmllcygKKyAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRQcm92aWRlclRhZ0lkTG9ja2VkKFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpKSwKKyAgICAgICAgICAgICAgICAmdGFnc1JlbW92ZWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBjYW1lcmFJbmZvLT5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJGYWlsZWQgdG8gcmVtb3ZlIGNhbWVyYSIKKyAgICAgICAgICAgICAgICAgICAgIiBjaGFyYWN0ZXJpc3RpY3MgbmVlZGluZyBjYW1lcmEgcGVybWlzc2lvbiBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0YWdzUmVtb3ZlZC5lbXB0eSgpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQ0hBUkFDVEVSSVNUSUNfS0VZU19ORUVESU5HX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgdGFnc1JlbW92ZWQuZGF0YSgpLCB0YWdzUmVtb3ZlZC5zaXplKCkpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBjYW1lcmFJbmZvLT5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJGYWlsZWQgdG8gaW5zZXJ0IGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAgICJrZXlzIG5lZWRpbmcgcGVybWlzc2lvbiBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IENhbWVyYVNlcnZpY2U6OmdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQotaW50IENhbWVyYVNlcnZpY2U6OmdldENhbGxpbmdVaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLX0KLQogU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpIHsKICAgICB0aW1lX3Qgbm93ID0gdGltZShudWxscHRyKTsKICAgICBjaGFyIGZvcm1hdHRlZFRpbWVbNjRdOwpAQCAtNTg5LDcgKzYyMyw3IEBACiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgewogCiAgICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgewpAQCAtNjAxLDcgKzYzNSw3IEBACiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKQEAgLTYxNCwxMiArNjQ4LDEzIEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CiAgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB0bXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MqPihjYW1lcmFDYi5nZXQoKSk7CkBAIC02NDMsNyArNjc4LDcgQEAKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CiAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIE90aGVyIGNvbWJpbmF0aW9ucyAoZS5nLiBIQUwzLnggb3BlbiBhcyBIQUwyLngpIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBIQUwgdmVyc2lvbiAleDogSEFMICV4IGRldmljZSBjYW4gb25seSBiZSIKQEAgLTczMiw3ICs3NjcsNyBAQAogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6aW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpIHsKLSAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgU3RyaW5nMTYgaW50ZXJuYWxQYWNrYWdlTmFtZSgiY2FtZXJhc2VydmVyIik7CiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CkBAIC03NDIsOCArNzc3LDcgQEAKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+e251bGxwdHJ9LCBpZCwgY2FtZXJhSWQsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQpLAogICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwgdWlkLCBVU0VfQ0FMTElOR19QSUQsCi0gICAgICAgICAgICBBUElfMSwgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLAotICAgICAgICAgICAgLypvdXQqLyB0bXApCisgICAgICAgICAgICBBUElfMSwgLypzaGltVXBkYXRlT25seSovIHRydWUsIC8qb3V0Ki8gdG1wKQogICAgICAgICAgICAgKS5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc2hpbSBtZXRhZGF0YTogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtNzgyLDkgKzgxNiw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTg0MSw3ICs4NzUsNyBAQAogICAgIH0KICNlbmRpZiAgLy8gX19CUklMTE9fXwogCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoY2FtZXJhIEhBTCBtb2R1bGUgbm90IGxvYWRlZCkiLApAQCAtODc1LDggKzkwOSw4IEBACiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDbGllbnRQZXJtaXNzaW9uc0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2xpZW50TmFtZTgsIGludCYgY2xpZW50VWlkLCBpbnQmIGNsaWVudFBpZCwKICAgICAgICAgLypvdXQqL2ludCYgb3JpZ2luYWxDbGllbnRQaWQpIGNvbnN0IHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBpbnQgY2FsbGluZ1VpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIHRydXN0IGNsaWVudFVpZAogICAgIGlmIChjbGllbnRVaWQgPT0gVVNFX0NBTExJTkdfVUlEKSB7CkBAIC05MjIsNiArOTU2LDE0IEBACiAgICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgfQogCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIHByZXZlbnQgYWNjZXNzIHRvIHRoZSBjYW1lcmEKKyAgICBpZiAobVNlbnNvclByaXZhY3lQb2xpY3ktPmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSkgeworICAgICAgICBBTE9HRSgiQWNjZXNzIERlbmlhbDogY2Fubm90IHVzZSB0aGUgY2FtZXJhIHdoZW4gc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCIpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ESVNBQkxFRCwKKyAgICAgICAgICAgICAgICAiQ2FsbGVyIFwiJXNcIiAoUElEICVkLCBVSUQgJWQpIGNhbm5vdCBvcGVuIGNhbWVyYSBcIiVzXCIgd2hlbiBzZW5zb3IgcHJpdmFjeSAiCisgICAgICAgICAgICAgICAgImlzIGVuYWJsZWQiLCBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICB9CisKICAgICAvLyBPbmx5IHVzZSBwYXNzZWQgaW4gY2xpZW50UGlkIHRvIGNoZWNrIHBlcm1pc3Npb24uIFVzZSBjYWxsaW5nIFBJRCBhcyB0aGUgY2xpZW50IFBJRCB0aGF0J3MKICAgICAvLyBjb25uZWN0ZWQgdG8gY2FtZXJhIHNlcnZpY2UgZGlyZWN0bHkuCiAgICAgb3JpZ2luYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7CkBAIC05NDUsNyArOTg3LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2hlY2tJZkRldmljZUlzVXNhYmxlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdCB7CiAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbWVyYVN0YXRlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmEgSUQgJXMpIiwgY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CkBAIC0xMTQ5LDcgKzExOTEsNyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgLy8gRGVzdHJveSBldmljdGVkIGNsaWVudHMKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkQ2xpZW50cykgewpAQCAtMTE1Nyw3ICsxMTk5LDcgQEAKICAgICAgICAgaS0+Z2V0VmFsdWUoKS0+ZGlzY29ubmVjdCgpOyAvLyBDbGllbnRzIHdpbGwgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgYWN0aXZlIGNsaWVudCBsaXN0CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBXYWl0aW5nIGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyAoUElEICUiIFBSSWQzMiAiKSIsCkBAIC0xMjA3LDExICsxMjQ5LDEwIEBACiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAotICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CisgICAgICAgICAgICAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyMzQsMTIgKzEyNzUsMTEgQEAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsIGhhbFZlcnNpb24sCi0gICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gdHJ1ZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAogICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTI0OCw2ICsxMjg4LDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlOjpzaG91bGRSZWplY3RIaWRkZW5DYW1lcmFDb25uZWN0aW9uKGNvbnN0IFN0cmluZzggJiBjYW1lcmFJZCkgeworICAgIC8vIElmIHRoZSB0aHJlYWQgc2VydmluZyB0aGlzIGNhbGwgaXMgbm90IGEgaHdiaW5kZXIgdGhyZWFkIGFuZCB0aGUgY2FsbGVyCisgICAgLy8gaXNuJ3QgdGhlIGNhbWVyYXNlcnZlciBpdHNlbGYsIGFuZCB0aGUgY2FtZXJhIGlkIGJlaW5nIHJlcXVlc3RlZCBpcyB0byBiZQorICAgIC8vIHB1YmxpY2FsbHkgaGlkZGVuLCB3ZSBzaG91bGQgcmVqZWN0IHRoZSBjb25uZWN0aW9uLgorICAgIGlmICghaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSAmJgorICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSAmJgorICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNhbWVyYUlkLmNfc3RyKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCkBAIC0xMjYwLDE1ICsxMzEyLDE0IEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZCk7CiAgICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOworCiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKICAgICAgICAgICAgIC8qYXBpMUNhbWVyYUlkKi8tMSwKICAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyODAsNyArMTMzMSw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKQEAgLTEyOTMsNiArMTM0NCwxNCBAQAogICAgICAgICAgICAgKGhhbFZlcnNpb24gPT0gLTEpID8gImRlZmF1bHQiIDogc3RkOjp0b19zdHJpbmcoaGFsVmVyc2lvbikuY19zdHIoKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZWZmZWN0aXZlQXBpTGV2ZWwpKTsKIAorICAgIGlmIChzaG91bGRSZWplY3RIaWRkZW5DYW1lcmFDb25uZWN0aW9uKGNhbWVyYUlkKSkgeworICAgICAgICBBTE9HVygiQXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIHN5c3RlbS1vbmx5IGNhbWVyYSBpZCAlcywgY29ubmVjdGlvbiByZWplY3RlZCIsCisgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICB9CiAgICAgc3A8Q0xJRU5UPiBjbGllbnQgPSBudWxscHRyOwogICAgIHsKICAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKQEAgLTEzNjUsNyArMTQyNCw3IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAogICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTQ0OSw3ICsxNTA4LDcgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZC4KICAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOwpAQCAtMTU1Niw3ICsxNjE1LDcgQEAKIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKLSAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwpAQCAtMTU2NSw3ICsxNjI0LDcgQEAKICAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKQEAgLTE1NzgsOSArMTYzNywxMCBAQAogCiAgICAgc3dpdGNoKGV2ZW50SWQpIHsKICAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNFUl9TV0lUQ0hFRDogewotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgYW5kIHNlbnNvciBwcml2YWN5IHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKICAgICAgICAgICAgIC8vIGZyb20gYSBzeXN0ZW0gc2VydmVyIGNyYXNoCiAgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNTk0LDkgKzE2NTQsNjAgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdTdGF0ZSkgeworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKKyAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcworICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAvLyBFbnN1cmUgd2UncmUgYmVpbmcgY2FsbGVkIGJ5IHN5c3RlbV9zZXJ2ZXIsIG9yIHNpbWlsYXIgcHJvY2VzcyB3aXRoCisgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBkZXZpY2UiCisgICAgICAgICAgICAgICAgICAgICIgc3RhdGUgY2hhbmdlcyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICJObyBwZXJtaXNzaW9uIHRvIHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBkZXZpY2Ugc3RhdGUiCisgICAgICAgICAgICAgICAgICAgICIgY2hhbmdlcyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKKyAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGV7fTsKKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0JBQ0tfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6QkFDS19DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZST05UX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZST05UX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRk9MREVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGT0xERUQ7CisgICAgfQorICAgIC8vIE9ubHkgbWFwIHZlbmRvciBiaXRzIGRpcmVjdGx5CisgICAgdWludDY0X3QgdmVuZG9yQml0cyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuZXdTdGF0ZSkgJiAweEZGRkZGRkZGMDAwMDAwMDBsOworICAgIG5ld0RldmljZVN0YXRlIHw9IHZlbmRvckJpdHM7CisKKyAgICBBTE9HVigiJXM6IE5ldyBkZXZpY2Ugc3RhdGUgMHglIiBQUkl4NjQsIF9fRlVOQ1RJT05fXywgbmV3RGV2aWNlU3RhdGUpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TZXJ2aWNlTG9jayk7CisgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3RGV2aWNlU3RhdGUpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVyKGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAqY2FtZXJhU3RhdHVzZXMpIHsKKyAgICByZXR1cm4gYWRkTGlzdGVuZXJIZWxwZXIobGlzdGVuZXIsIGNhbWVyYVN0YXR1c2VzKTsKK30KKworU3RhdHVzIENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVySGVscGVyKGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAqY2FtZXJhU3RhdHVzZXMsCisgICAgICAgIGJvb2wgaXNWZW5kb3JMaXN0ZW5lcikgeworCiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIEFMT0dWKCIlczogQWRkIGxpc3RlbmVyICVwIiwgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CkBAIC0xNjExLDIwICsxNzIyLDI2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKICAgICAgICAgZm9yIChhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQuc2Vjb25kKSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFRyaWVkIHRvIGFkZCBsaXN0ZW5lciAlcCB3aGljaCB3YXMgYWxyZWFkeSBzdWJzY3JpYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0FMUkVBRFlfRVhJU1RTLCAiTGlzdGVuZXIgYWxyZWFkeSByZWdpc3RlcmVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtTGlzdGVuZXJMaXN0LnB1c2hfYmFjayhsaXN0ZW5lcik7CisgICAgICAgIG1MaXN0ZW5lckxpc3QuZW1wbGFjZV9iYWNrKGlzVmVuZG9yTGlzdGVuZXIsIGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKiBDb2xsZWN0IGN1cnJlbnQgZGV2aWNlcyBhbmQgc3RhdHVzICovCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgaSA6IG1DYW1lcmFTdGF0ZXMpIHsKKyAgICAgICAgICAgIGlmICghaXNWZW5kb3JMaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShpLmZpcnN0LmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbm5vdCBhZGQgcHVibGljIGxpc3RlbmVyIGZvciBoaWRkZW4gc3lzdGVtLW9ubHkgJXMgZm9yIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgaS5maXJzdC5jX3N0cigpLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzLT5lbXBsYWNlX2JhY2soaS5maXJzdCwgbWFwVG9JbnRlcmZhY2UoaS5zZWNvbmQtPmdldFN0YXR1cygpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjU5LDcgKzE3NzYsNyBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQtPnNlY29uZCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgbUxpc3RlbmVyTGlzdC5lcmFzZShpdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgICAgIH0KQEAgLTE3MTcsNyArMTgzNCw3IEBACiAgICAgfQogCiAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGlkKTsKLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgIHN3aXRjaCAoZGV2aWNlVmVyc2lvbikgewogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgpAQCAtMTczNCw2ICsxODUxLDcgQEAKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CkBAIC0xNzU0LDYgKzE4NzIsMTggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgIC8qb3V0Ki8gYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgY29uc3QgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOworCisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGlkLnN0cmluZygpKTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKQEAgLTE5MDEsMTMgKzIwMzEsMTMgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWQpIHsKICAgICAgICAgaS0+ZGlzY29ubmVjdCgpOwogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKICAgICBtU2VydmljZUxvY2subG9jaygpOwpAQCAtMTk3NSw3ICsyMTA1LDYgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogCi0KICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKQEAgLTIwOTEsNyArMjIyMCw3IEBACiAgICAgICAgICAgICAgICAgc2VydmljZVBpZCksCiAgICAgICAgIG1DYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNhbWVyYUNsaWVudDsKQEAgLTIxNzgsNiArMjMwNyw4IEBACiAgICAgc0NhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOwogICAgIHNDYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQobUNhbWVyYUlkU3RyLCBtQ2xpZW50UGlkLAogICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+cmVtb3ZlUmVmKENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6RGV2aWNlTW9kZTo6Q0FNRVJBLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyLmNfc3RyKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CiAgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CkBAIC0yMjAwLDcgKzIzMzEsNyBAQAogICAgIC8vIE5vIGR1bXBpbmcgb2YgY2xpZW50cyBkaXJlY3RseSBvdmVyIEJpbmRlciwKICAgICAvLyBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6ZHVtcAogICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKFNOX0VWRU5UX0xPR19JRCwgIjI2MjY1NDAzIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIzMzcsNyArMjQ2OCw3IEBACiAKICAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCiAgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCiAgICAgbm90aWZ5RXJyb3IoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRCwgcmVzdWx0RXh0cmFzKTsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0yNTM4LDYgKzI2NjksNTkgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBTZW5zb3JQcml2YWN5UG9saWN5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBpZiAobVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBzcG0uaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworICAgIHN0YXR1c190IHJlcyA9IHNwbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBzcG0udW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBVbnJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKyAgICAvLyBpZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYmxvY2sgYWxsIGNsaWVudHMgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYQorICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPmJsb2NrQWxsQ2xpZW50cygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFNlbnNvclByaXZhY3lNYW5hZ2VyIGhhcyBkaWVkIik7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICBDYW1lcmFTdGF0ZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNjk4LDggKzI4ODIsOCBAQAogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKQEAgLTI4NzIsNyArMzA1Niw3IEBACiAgICAgICAqIGJpbmRlciBkcml2ZXIKICAgICAgICovCiAgICAgLy8gUElEIGhlcmUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBiZSB3cm9uZy4KLSAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOworICAgIGxvZ0NsaWVudERpZWQoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCiAgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CiAgICAgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKHdobyk7CkBAIC0yOTI4LDcgKzMxMTIsMTMgQEAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpc3RlbmVyIDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTYoY2FtZXJhSWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2tpcHBpbmcgY2FtZXJhIGRpc2NvdmVyeSBjYWxsYmFjayBmb3Igc3lzdGVtLW9ubHkgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZWNvbmQtPm9uU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNihjYW1lcmFJZCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIH0KQEAgLTMwMjMsNiArMzIxMywxOCBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpibG9ja0FsbENsaWVudHMoKSB7CisgICAgY29uc3QgYXV0byBjbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChhdXRvJiBjdXJyZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIE5PVEU6IFRoaXMgaXMgYSByZW1vdGUgQVBJIC0gbWFrZSBzdXJlIGFsbCBhcmdzIGFyZSB2YWxpZGF0ZWQKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OnNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01hbmFnZUNhbWVyYVBlcm1pc3Npb24sIG51bGxwdHIsIG51bGxwdHIpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggNjI0ZDFjYS4uY2YwY2VmOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CiAKQEAgLTE1MywxMiArMTU0LDE5IEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOworCiAgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IGFwaVZlcnNpb24sCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xNjcsNiArMTc1LDEwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgYmluZGVyOjpTdGF0dXMgICAgICBhZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4qIGNhbWVyYVN0YXR1c2VzLCBib29sIGlzVmVuZG9yID0gZmFsc2UpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIApAQCAtNTMxLDYgKzU0Myw3IEBACiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQgX191bnVzZWQsIGludDMyX3QgcHJvY1N0YXRlIF9fdW51c2VkLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSBfX3VudXNlZCkge30KIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKQEAgLTU0OCw4ICs1NjEsMzUgQEAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYS4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciwKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZXhwbGljaXQgU2Vuc29yUHJpdmFjeVBvbGljeSh3cDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQoZmFsc2UpLCBtUmVnaXN0ZXJlZChmYWxzZSkge30KKworICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKKworICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgICAgIE11dGV4IG1TZW5zb3JQcml2YWN5TG9jazsKKyAgICAgICAgICAgIGJvb2wgbVNlbnNvclByaXZhY3lFbmFibGVkOworICAgICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICB9OworCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OwogCisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKQEAgLTU4MSwxMiArNjIxLDE1IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKTsKIAorICAgIC8vIFNob3VsZCBhbiBvcGVyYXRpb24gYXR0ZW1wdCBvbiBhIGNhbWVyYUlkIGJlIHJlamVjdGVkLCBpZiB0aGUgY2FtZXJhIGlkIGlzCisgICAgLy8gYWR2ZXJ0aXNlZCBhcyBhIHB1YmxpY2FsbHkgaGlkZGVuIHNlY3VyZSBjYW1lcmEsIGJ5IHRoZSBjYW1lcmEgSEFMID8KKyAgICBib29sIHNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY29uc3QgU3RyaW5nOCAmIGNhbWVyYUlkKTsKKwogICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAogICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKQEAgLTc0OCw3ICs3OTEsOCBAQAogICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbUNhbWVyYVByb3ZpZGVyTWFuYWdlcjsKIAogICAgIC8vIEd1YXJkZWQgYnkgbVN0YXR1c0xpc3RlbmVyTXV0ZXgKLSAgICBzdGQ6OnZlY3RvcjxzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+IG1MaXN0ZW5lckxpc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJvb2wsIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPj4+IG1MaXN0ZW5lckxpc3Q7CisKICAgICBNdXRleCAgICAgICBtU3RhdHVzTGlzdGVuZXJMb2NrOwogCiAgICAgLyoqCkBAIC04MjAsNiArODY0LDkgQEAKICAgICAvLyBCbG9ja3MgYWxsIGNsaWVudHMgZnJvbSB0aGUgVUlECiAgICAgdm9pZCBibG9ja0NsaWVudHNGb3JVaWQodWlkX3QgdWlkKTsKIAorICAgIC8vIEJsb2NrcyBhbGwgYWN0aXZlIGNsaWVudHMuCisgICAgdm9pZCBibG9ja0FsbENsaWVudHMoKTsKKwogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKIApAQCAtODMyLDEwICs4NzksNiBAQAogICAgIC8vIFByaW50cyB0aGUgc2hlbGwgY29tbWFuZCBoZWxwCiAgICAgc3RhdHVzX3QgcHJpbnRIZWxwKGludCBvdXQpOwogCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC04NDQsNyArODg3LDcgQEAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRhYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCA4YmIyNGQ0Li4xNjJiNTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiAjZGVmaW5lIEFMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgQUxPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwpAQCAtNDQsMTAgKzQ1LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiBDYW1lcmEyQ2xpZW50OjpDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLApAQCAtNTgsOCArNTUsNyBAQAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKQEAgLTY5LDggKzY1LDYgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKLQotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CkBAIC00MDUsNyArMzk5LDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgY2FtZXJhc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IG1DbGllbnRQaWQgJiYgY2FsbGluZ1BpZCAhPSBtU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiByZXM7CkBAIC00NjAsOCArNDU0LDYgQEAKIAogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTQ3MiwxNCArNDY0LDE0IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpAQCAtNDkyLDE2ICs0ODQsMTYgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKICAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gRUJVU1k7CiAgICAgfQogCkBAIC01MTMsOSArNTA1LDkgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAotICAgIGlmIChtQ2xpZW50UGlkID09IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkID09IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6UkVDT1JEIHx8CiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtNTI5LDcgKzUyMSw3IEBACiAgICAgfQogCiAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICByZXR1cm4gRUJVU1k7CiB9CiAKQEAgLTE0NDcsMTMgKzE0MzksMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgLyptc2dUeXBlKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgaW50IHRha2VQaWN0dXJlQ291bnRlcjsKKyAgICBib29sIHNob3VsZFN5bmNXaXRoRGV2aWNlID0gdHJ1ZTsKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIHN3aXRjaCAobC5tUGFyYW1ldGVycy5zdGF0ZSkgewpAQCAtMTUzOSwxNCArMTUzMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIHN5bmMgd2l0aCB0aGUgZGV2aWNlIGluIGNhc2UgZmxhc2ggaXMgdHVybmVkIG9uLAorICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBzdWdnZXN0cyB0aGF0IGZsYXNoIGlzIG5lZWRlZCAoQUUgc3RhdGUgRkxBU0hfUkVRVUlSRUQpCisgICAgICAgIC8vIG9yIHdlIGFyZSBpbiBzb21lIG90aGVyIEFFIHN0YXRlIGRpZmZlcmVudCBmcm9tIENPTlZFUkdFRCB0aGF0IG1heSBuZWVkCisgICAgICAgIC8vIHByZWNhcHR1cmUgdHJpZ2dlci4KKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuZmxhc2hNb2RlICE9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT04gJiYKKyAgICAgICAgICAgICAgICAobC5tUGFyYW1ldGVycy5hZVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQpKSB7CisgICAgICAgICAgICBzaG91bGRTeW5jV2l0aERldmljZSAgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKIAotICAgIC8vIE5lZWQgSEFMIHRvIGhhdmUgY29ycmVjdCBzZXR0aW5ncyBiZWZvcmUgKHBvc3NpYmx5KSB0cmlnZ2VyaW5nIHByZWNhcHR1cmUKLSAgICBzeW5jV2l0aERldmljZSgpOworICAgIC8vIE1ha2Ugc3VyZSBIQUwgaGFzIGNvcnJlY3Qgc2V0dGluZ3MgaW4gY2FzZSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgbmVlZGVkLgorICAgIGlmIChzaG91bGRTeW5jV2l0aERldmljZSkgeworICAgICAgICBzeW5jV2l0aERldmljZSgpOworICAgIH0KIAotICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUobXNnVHlwZSk7CisgICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZSgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCBjYXB0dXJlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNTgzLDcgKzE1ODcsNyBAQAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpSZWFkTG9jayBsKG1QYXJhbWV0ZXJzKTsKIApAQCAtMTY2NiwyNyArMTY3MCw2IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNzg0LDYgKzE3NjcsNyBAQAogICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgogICAgICAgICAgICAgQUxPR1coIiVzOiBSZWNlaXZlZCByZWNvdmVyYWJsZSBlcnJvciAlZCBmcm9tIEhBTCAtIGlnbm9yaW5nLCByZXF1ZXN0SWQgJSIgUFJJZDMyLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgICAgICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5RXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CkBAIC0xOTM0LDE0ICsxOTE4LDE2IEBACiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSB7CiAgICAgQUxPR1YoIiVzOiBBdXRvZXhwb3N1cmUgc3RhdGUgbm93ICVkLCBsYXN0IHRyaWdnZXIgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKKyAgICB7CisgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICB9CiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUF1dG9FeHBvc3VyZShuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKIH0KIAogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewotICAgICh2b2lkKXJlc3VsdEV4dHJhczsKLSAgICAodm9pZCl0aW1lc3RhbXA7Ci0KICAgICBBTE9HVigiJXM6IFNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZXF1ZXN0IGlkICUiIFBSSWQzMiAiIGF0IHRpbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCB0aW1lc3RhbXApOwogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNDQ5MjljMy4uYTllYTI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTk2LDggKzk2LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKaW5kZXggZjEyMDNmOS4uZDY1YWM3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApAQCAtMjUsMjcgKzI1LDI0IEBACiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogI2RlZmluZSBMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgTE9HMiguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAyLCBfX1ZBX0FSR1NfXyk7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiBDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDbGllbnQoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpLCBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIAogICAgIG1IYXJkd2FyZSA9IE5VTEw7CkBAIC01NywxNCArNTQsMTMgQEAKICAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKDAsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7Ci0gICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyptb25pdG9yVGFncyovKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZSBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7CkBAIC0xMDUsNyArMTAxLDcgQEAKIC8vIHRlYXIgZG93biB0aGUgY2xpZW50CiBDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQoKSB7CiAgICAgbURlc3RydWN0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiAKICAgICBkaXNjb25uZWN0KCk7CkBAIC0xNDgsNyArMTQ0LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZCgpIGNvbnN0IHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgQUxPR1coImF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCkBAIC0xNTgsNyArMTU0LDggQEAKIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZEFuZEhhcmR3YXJlKCkgY29uc3QgewogICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsCisgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CkBAIC0xNjcsNyArMTY0LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpsb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJsb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0xODIsNyArMTc5LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp1bmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoInVubG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMjA0LDcgKzIwMSw3IEBACiAKIC8vIGNvbm5lY3QgYSBuZXcgY2xpZW50IHRvIHRoZSBjYW1lcmEKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNsaWVudCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTI0MCw3ICsyMzcsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImRpc2Nvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMzM0LDcgKzMzMSw3IEBACiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdUYXJnZXQoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikgewogICAgIExPRzEoInNldFByZXZpZXdUYXJnZXQoJXApIChwaWQgJWQpIiwgYnVmZmVyUHJvZHVjZXIuZ2V0KCksCi0gICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwpAQCAtMzUxLDcgKzM0OCw3IEBACiAvLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQogLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KIHZvaWQgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBjYWxsYmFja19mbGFnKSB7Ci0gICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIApAQCAtMzcyLDEzICszNjksMTMgQEAKIAogLy8gc3RhcnQgcHJldmlldyBtb2RlCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UHJldmlldygpIHsKLSAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1BSRVZJRVdfTU9ERSk7CiB9CiAKIC8vIHN0YXJ0IHJlY29yZGluZyBtb2RlCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1JFQ09SRElOR19NT0RFKTsKIH0KIApAQCAtNDYxLDcgKzQ1OCw3IEBACiAKIC8vIHN0b3AgcHJldmlldyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIApAQCAtNDc3LDcgKzQ3NCw3IEBACiAKIC8vIHN0b3AgcmVjb3JkaW5nIG1vZGUKIHZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwpAQCAtNTAzLDcgKzUwMCw3IEBACiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogICAgIGlmIChtZW0gPT0gbnVsbHB0cikgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjE2NDI3MiIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjE1LDcgKzYxMiw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpwcmV2aWV3RW5hYmxlZCgpIHsKLSAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MjMsNyArNjIwLDcgQEAKIH0KIAogYm9vbCBDYW1lcmFDbGllbnQ6OnJlY29yZGluZ0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKQEAgLTYzMSw3ICs2MjgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmF1dG9Gb2N1cygpIHsKLSAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY0MSw3ICs2MzgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNhbmNlbEF1dG9Gb2N1cygpIHsKLSAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY1Miw3ICs2NDksNyBAQAogCiAvLyB0YWtlIGEgcGljdHVyZSAtIGltYWdlIGlzIHJldHVybmVkIGluIGNhbGxiYWNrCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7Ci0gICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCk6IDB4JXgiLCBnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOworICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjgxLDcgKzY3OCw3IEBACiAKIC8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgewotICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY5NiwxNiArNjkzLDE4IEBACiBTdHJpbmc4IENhbWVyYUNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgpOworICAgIH0KIAogICAgIFN0cmluZzggcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpLmZsYXR0ZW4oKSk7Ci0gICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAgICAgcmV0dXJuIHBhcmFtczsKIH0KIAogLy8gZW5hYmxlIHNodXR0ZXIgc291bmQKIHN0YXR1c190IENhbWVyYUNsaWVudDo6ZW5hYmxlU2h1dHRlclNvdW5kKGJvb2wgZW5hYmxlKSB7Ci0gICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwpAQCAtNzE1LDMyICs3MTQsMTIgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKLSAgICBpZiAobUxlZ2FjeU1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQotICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoc3RyY21wKHZhbHVlLCAiMCIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpIHsKLSAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBpbnQgb3JpZW50YXRpb247CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCmluZGV4IDE5MTA1MzYuLjk1MzBiNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApAQCAtNjgsOCArNjgsNyBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAgICAgfkNhbWVyYUNsaWVudCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAppbmRleCA3MDM0MWM1Li44ODc5OWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCkBAIC01MCw4ICs1MCw3IEBACiAgICAgICAgIG1TdGF0ZVRyYW5zaXRpb25Db3VudCgwKSwKICAgICAgICAgbVRyaWdnZXJJZCgwKSwKICAgICAgICAgbVRpbWVvdXRDb3VudCgwKSwKLSAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSwKLSAgICAgICAgbU1zZ1R5cGUoMCkgeworICAgICAgICBtQ2FwdHVyZUlkKENhbWVyYTJDbGllbnQ6OmtDYXB0dXJlUmVxdWVzdElkU3RhcnQpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogfQogCkBAIC02NCw3ICs2Myw3IEBACiAgICAgbVpzbFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKIH0KIAotc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYXB0dXJlU2VxdWVuY2VyOjpzdGFydENhcHR1cmUoKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKQEAgLTczLDcgKzcyLDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAoIW1TdGFydENhcHR1cmUpIHsKLSAgICAgICAgbU1zZ1R5cGUgPSBtc2dUeXBlOwogICAgICAgICBtU3RhcnRDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZVNpZ25hbC5zaWduYWwoKTsKICAgICB9CkBAIC0xMTksNiArMTE3LDMxIEBACiAgICAgfQogfQogCit2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGJvb2wganBlZ0J1ZmZlckxvc3QgPSBmYWxzZTsKKyAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOworICAgICAgICBpZiAoY2xpZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY2FwdHVyZVN0cmVhbUlkID0gY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTdHJlYW1JZCA9PSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCkgeworICAgICAgICAgICAganBlZ0J1ZmZlckxvc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnJvckNvZGUgPT0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCkgeworICAgICAgICBpZiAocmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9PSBtU2h1dHRlckNhcHR1cmVJZCkgeworICAgICAgICAgICAganBlZ0J1ZmZlckxvc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGpwZWdCdWZmZXJMb3N0KSB7CisgICAgICAgIHNwPE1lbW9yeUJhc2U+IGVtcHR5QnVmZmVyOworICAgICAgICBvbkNhcHR1cmVBdmFpbGFibGUoLyp0aW1lc3RhbXAqLzAsIGVtcHR5QnVmZmVyLCAvKmNhcHR1cmVFcnJvciovdHJ1ZSk7CisgICAgfQorfQorCiB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBOZXcgcmVzdWx0IGF2YWlsYWJsZS4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzg2LDcgKzQwOSw3IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JDYXB0dXJlRW5kOwogICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFX1dBSVQ7CkBAIC02MDYsNyArNjI5LDcgQEAKICAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgewpAQCAtNzIzLDEyICs3NDYsMTEgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6OnNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpTVElMTF9DQVBUVVJFCi0gICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kCi0gICAgICAgICYmIChtc2dUeXBlICYgQ0FNRVJBX01TR19TSFVUVEVSKSkgeworICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZCkgewogICAgICAgICBjbGllbnQtPmdldENhbWVyYVNlcnZpY2UoKS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1NIVVRURVIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggZjJlMzc1MC4uNzI3ZGQ1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCBzZXRac2xQcm9jZXNzb3IoY29uc3Qgd3A8WnNsUHJvY2Vzc29yPiYgcHJvY2Vzc29yKTsKIAogICAgIC8vIEJlZ2luIHN0aWxsIGltYWdlIGNhcHR1cmUKLSAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpOworICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZSgpOwogCiAgICAgLy8gV2FpdCB1bnRpbCBjdXJyZW50IGltYWdlIGNhcHR1cmUgY29tcGxldGVzOyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIG5vCiAgICAgLy8gY2FwdHVyZSBpcyBhY3RpdmUuIFJldHVybnMgVElNRURfT1VUIGlmIGNhcHR1cmUgZG9lcyBub3QgY29tcGxldGUgZHVyaW5nCkBAIC02NSw2ICs2NSw5IEBACiAgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogCisgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBzaHV0dGVyIChjYXB0dXJlIHN0YXJ0KQorICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKICAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKQEAgLTE0NSw3ICsxNDgsNiBAQAogICAgIGJvb2wgbUFlSW5QcmVjYXB0dXJlOwogCiAgICAgaW50MzJfdCBtQ2FwdHVyZUlkOwotICAgIGludCBtTXNnVHlwZTsKIAogICAgIC8vIE1haW4gaW50ZXJuYWwgbWV0aG9kcwogCkBAIC0xNzIsNyArMTc0LDcgQEAKIAogICAgIC8vIEVtaXQgU2h1dHRlci9SYXcgY2FsbGJhY2sgdG8gamF2YSwgYW5kIG1heWJlIHBsYXkgYSBzaHV0dGVyIHNvdW5kCiAgICAgc3RhdGljIHZvaWQgc2h1dHRlck5vdGlmeUxvY2tlZChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LCBpbnQgbXNnVHlwZSk7CisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50KTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAppbmRleCAwYzczOGU3Li42ODNlODRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKQEAgLTMzLDcgKzMzLDEwIEBACiAgICAgRnJhbWVQcm9jZXNzb3JCYXNlKGRldmljZSksCiAgICAgbUNsaWVudChjbGllbnQpLAogICAgIG1MYXN0RnJhbWVOdW1iZXJPZkZhY2VzKDApLAotICAgIG1MYXN0M0FGcmFtZU51bWJlcigtMSkgeworICAgIG1MYXN0M0FGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBV0JGcmFtZU51bWJlcigtMSkgewogCiAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZCA9IGRldmljZS5wcm9tb3RlKCk7CiAgICAgbVN5bnRoZXNpemUzQU5vdGlmeSA9ICEoZC0+d2lsbE5vdGlmeTNBKCkpOwpAQCAtMjYyLDI0ICsyNjUsNzMgQEAKICAgICBib29sIGdvdEFsbFN0YXRlcyA9IHRydWU7CiAKICAgICAvLyBUT0RPOiBBbHNvIHVzZSBBRSBtb2RlLCBBRSB0cmlnZ2VyIElECi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCisgICAgYm9vbCBnb3RBRlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgIGJvb2wgZ290QVdCU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKKyAgICBib29sIGdvdEFFU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKKyAgICBnb3RBRlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKKyAgICBnb3RBV0JTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3YlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCiAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZDsKICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQ7CiAKKyAgICBpZiAoZ290QUVTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFFRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID4gbTNhU3RhdGUuYWVUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVTdGF0ZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZVN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWVUcmlnZ2VySWQgPSBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQ7CisgICAgICAgICAgICBtTGFzdEFFRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBRlN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZk1vZGUgIT0gbTNhU3RhdGUuYWZNb2RlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUYgc3RhdGUgJWQtPiVkLiBBRiBtb2RlICVkLT4lZC4gVHJpZ2dlciAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlLCBwZW5kaW5nU3RhdGUuYWZNb2RlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlID0gcGVuZGluZ1N0YXRlLmFmU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUgPSBwZW5kaW5nU3RhdGUuYWZNb2RlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQgPSBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQ7CisgICAgICAgICAgICBtTGFzdEFGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFXQlN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QVdCRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYXdiTW9kZSAhPSBtM2FTdGF0ZS5hd2JNb2RlKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUsIHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSA9IHBlbmRpbmdTdGF0ZS5hd2JNb2RlOworICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUgPSBwZW5kaW5nU3RhdGUuYXdiU3RhdGU7CisgICAgICAgICAgICBtTGFzdEFXQkZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ290QUVTdGF0ZSAmIGdvdEFGU3RhdGUgJiBnb3RBV0JTdGF0ZTsKICAgICBpZiAoIWdvdEFsbFN0YXRlcykgewogICAgICAgICAvLyBJZiBub3QgYWxsIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIHB1dCB0aGUgcGVuZGluZyBzdGF0ZSB0byBtUGVuZGluZzNBU3RhdGVzLgogICAgICAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTI5MCw0MCArMzQyLDEwIEBACiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgLy8gT25jZSBhbGwgM0Egc3RhdGVzIGFyZSByZWNlaXZlZCwgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgM0EgY2hhbmdlcy4KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAotICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID4gbTNhU3RhdGUuYWVUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVTdGF0ZSk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hZk1vZGUgIT0gbTNhU3RhdGUuYWZNb2RlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUYgc3RhdGUgJWQtPiVkLiBBRiBtb2RlICVkLT4lZC4gVHJpZ2dlciAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlLCBwZW5kaW5nU3RhdGUuYWZNb2RlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICB9Ci0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYXdiTW9kZSAhPSBtM2FTdGF0ZS5hd2JNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUsIHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KICAgICBpZiAoaW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgbVBlbmRpbmczQVN0YXRlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICB9CiAKLSAgICBtM2FTdGF0ZSA9IHBlbmRpbmdTdGF0ZTsKICAgICBtTGFzdDNBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKaW5kZXggNjJhNGU5MS4uODE4M2MxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKQEAgLTEwNCw4ICsxMDQsNyBAQAogICAgIC8vIFRyYWNrIG1vc3QgcmVjZW50IGZyYW1lIG51bWJlciBmb3Igd2hpY2ggM0Egbm90aWZpY2F0aW9ucyB3ZXJlIHNlbnQgZm9yLgogICAgIC8vIFVzZWQgdG8gZmlsdGVyIGFnYWluc3Qgc2VuZGluZyAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZQogICAgIC8vIHNldmVyYWwgdGltZXMuCi0gICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXI7Ci0KKyAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlciwgbUxhc3RBRUZyYW1lTnVtYmVyLCBtTGFzdEFGcmFtZU51bWJlciwgbUxhc3RBV0JGcmFtZU51bWJlcjsKICAgICAvLyBFbWl0IEZhY2VEZXRlY3Rpb24gZXZlbnQgdG8gamF2YSBpZiBmYWNlcyBjaGFuZ2VkCiAgICAgdm9pZCBjYWxsYmFja0ZhY2VEZXRlY3Rpb24oY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfZnJhbWVfbWV0YWRhdGEgJm1ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBiNzAyMGZlLi5kZGZlNWUzIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC02MiwyNiArNjIsNiBAQAogICAgIH0KIH0KIAotdm9pZCBKcGVnUHJvY2Vzc29yOjpvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIC8qYnVmZmVySW5mbyovKSB7Ci0gICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5Ci19Ci0KLXZvaWQgSnBlZ1Byb2Nlc3Nvcjo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBpZiAoYnVmZmVySW5mby5tRXJyb3IpIHsKLSAgICAgICAgLy8gT25seSBsb2NrIGluIGNhc2Ugb2YgZXJyb3IsIHNpbmNlIHdlIGdldCBvbmUgb2YgdGhlc2UgZm9yIGVhY2gKLSAgICAgICAgLy8gb25GcmFtZUF2YWlsYWJsZSBhcyB3ZWxsLCBhbmQgc2NoZWR1bGluZyBtYXkgZGVsYXkgdGhpcyBjYWxsIGxhdGUKLSAgICAgICAgLy8gZW5vdWdoIHRvIHJ1biBpbnRvIGxhdGVyIHByZXZpZXcgcmVzdGFydCBvcGVyYXRpb25zLCBmb3Igbm9uLWVycm9yCi0gICAgICAgIC8vIGNhc2VzLgotICAgICAgICAvLyBiLzI5NTI0NjUxCi0gICAgICAgIEFMT0dWKCIlczogSlBFRyBidWZmZXIgbG9zdCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKLSAgICAgICAgbUNhcHR1cmVEb25lID0gdHJ1ZTsKLSAgICAgICAgbUNhcHR1cmVTdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0dXJlRG9uZVNpZ25hbC5zaWduYWwoKTsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEpwZWdQcm9jZXNzb3I6OnVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xNzYsMTMgKzE1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IGRldmljZS0+YWRkQnVmZmVyTGlzdGVuZXJGb3JTdHJlYW0obUNhcHR1cmVTdHJlYW1JZCwgdGhpcyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGFkZCBidWZmZXIgbGlzdGVuZXJpOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCmluZGV4IDcxODdhZDkuLjk3N2YxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgogCiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MSw4ICs0Miw3IEBACiAgKiBTdGlsbCBpbWFnZSBjYXB0dXJlIG91dHB1dCBpbWFnZSBwcm9jZXNzaW5nCiAgKi8KIGNsYXNzIEpwZWdQcm9jZXNzb3I6Ci0gICAgICAgICAgICBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIsCi0gICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIHsKKyAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CiAgIHB1YmxpYzoKICAgICBKcGVnUHJvY2Vzc29yKHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gc2VxdWVuY2VyKTsKICAgICB+SnBlZ1Byb2Nlc3NvcigpOwpAQCAtNTAsMTUgKzUwLDE0IEBACiAgICAgLy8gQ3B1Q29uc3VtZXIgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KICAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAKLSAgICAvLyBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KLSAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7Ci0gICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CiAgICAgaW50IGdldFN0cmVhbUlkKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKworICAgIHN0YXRpYyBzaXplX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QqIGpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplKTsKKwogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKICAgICB3cDxDYW1lcmFEZXZpY2VCYXNlPiBtRGV2aWNlOwpAQCAtODIsNyArODEsNiBAQAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKICAgICBzdGF0dXNfdCBwcm9jZXNzTmV3Q2FwdHVyZShib29sIGNhcHR1cmVTdWNjZXNzKTsKLSAgICBzaXplX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QqIGpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplKTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDI4ZDE4NmEuLjE4YWRkYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICByZXMgPSBidWlsZFF1aXJrcygpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBTaXplIG1heFByZXZpZXdTaXplID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CiAgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCiAgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CkBAIC05MCwxMSArOTAsMTYgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyBUaGlzIGlzIGp1c3QgYW4gdXBwZXIgYm91bmQgYW5kIG1heSBub3QgYmUgYW4gYWN0dWFsbHkgdmFsaWQgdmlkZW8gc2l6ZQotICAgIGNvbnN0IFNpemUgVklERU9fU0laRV9VUFBFUl9CT1VORCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CisgICAgU2l6ZSB2aWRlb1NpemVVcHBlckJvdW5kID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKIAotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBtYXhQcmV2aWV3U2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkpOworICAgICAgICB2aWRlb1NpemVVcHBlckJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkpOworICAgIH0KKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMobWF4UHJldmlld1NpemUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7Ci0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhWSURFT19TSVpFX1VQUEVSX0JPVU5ELCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyh2aWRlb1NpemVVcHBlckJvdW5kLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtMjk2LDkgKzMwMSwxMyBAQAogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVKcGVnU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKICAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCkpIHJldHVybiBOT19JTklUOwogCi0gICAgLy8gVE9ETzogUGljayBtYXhpbXVtCiAgICAgcGljdHVyZVdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLndpZHRoOwogICAgIHBpY3R1cmVIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0uaGVpZ2h0OworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgU2l6ZSBzdWdnZXN0ZWRKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkpOworICAgICAgICBwaWN0dXJlV2lkdGggPSBzdWdnZXN0ZWRKcGVnU2l6ZS53aWR0aDsKKyAgICAgICAgcGljdHVyZUhlaWdodCA9IHN1Z2dlc3RlZEpwZWdTaXplLmhlaWdodDsKKyAgICB9CiAgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKICAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CiAgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKQEAgLTc1Nyw2ICs3NjYsNyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCisgICAgYWVTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9JTkFDVElWRTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKICAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOwogICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xMDEwLDYgKzEwMjAsOSBAQAogICAgICAgICBhcnJheUhlaWdodCA9IGFjdGl2ZUFycmF5U2l6ZS5kYXRhLmkzMlszXTsKICAgICB9IGVsc2UgcmV0dXJuIE5PX0lOSVQ7CiAKKyAgICBmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MgPQorICAgICAgICBpbmZvLT5leGlzdHMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisKICAgICAvLyBXZSdsbCBzZXQgdGhlIHRhcmdldCBGUFMgcmFuZ2UgZm9yIHN0aWxsIGNhcHR1cmVzIHRvIGJlIGFzIHdpZGUKICAgICAvLyBhcyBwb3NzaWJsZSB0byBnaXZlIHRoZSBIQUwgbWF4aW11bSBsYXRpdHVkZSBmb3IgZXhwb3N1cmUgc2VsZWN0aW9uCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRnBzUmFuZ2VzID0KQEAgLTEwMjEsOCArMTAzNCwxMSBAQAogICAgIC8vIEdldCBzdXBwb3J0ZWQgcHJldmlldyBmcHMgcmFuZ2VzLCB1cCB0byBkZWZhdWx0IG1heGltdW0uCiAgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFByZXZpZXdTaXplczsKICAgICBWZWN0b3I8RnBzUmFuZ2U+IHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZXM7Ci0gICAgY29uc3QgU2l6ZSBQUkVWSUVXX1NJWkVfQk9VTkQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFBSRVZJRVdfU0laRV9CT1VORCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgU2l6ZSBwcmV2aWV3U2l6ZUJvdW5kID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBwcmV2aWV3U2l6ZUJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMocHJldmlld1NpemVCb3VuZCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGcHNSYW5nZXMuY291bnQ7IGkgKz0gMikgewogICAgICAgICBpZiAoIWlzRnBzU3VwcG9ydGVkKHN1cHBvcnRlZFByZXZpZXdTaXplcywKQEAgLTMxMDYsNiArMzEyMiw2NyBAQAogICAgIHJldHVybiBqcGVnU2l6ZXM7CiB9CiAKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgICAgaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAwOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3M7CisKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPSBzdGF0aWNJbmZvKAorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IHN1cHBvcnRlZFVzZWNhc2VzID0KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkVXNlY2FzZXMgJiAoMSA8PCB1c2VjYXNlSWQpKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICAgICAgICAgIHNjcy5hZGQoc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNjczsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICAgIGludDMyX3QgZm9ybWF0KSBjb25zdCB7CisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IHNpemVzOworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyh1c2VjYXNlSWQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBzY3MpIHsKKyAgICAgICAgaWYgKGl0LmZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHNpemVzLmFkZCh7aXQud2lkdGgsIGl0LmhlaWdodH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemVzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BSRVZJRVcsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkVDT1JELAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKK30KKwogUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbiBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVDcm9wUmVnaW9uKGJvb2wgcHJldmlld09ubHkpIGNvbnN0IHsKIAogICAgIGZsb2F0IHpvb21MZWZ0LCB6b29tVG9wLCB6b29tV2lkdGgsIHpvb21IZWlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCA0MmU3YTQ3Li4zYTcwOWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTEyMiw2ICsxMjIsNyBAQAogICAgICAgICBpbnQzMl90IGhpZ2g7CiAgICAgfTsKIAorICAgIHVpbnQ4X3QgYWVTdGF0ZTsgLy9sYXRlc3QgQUUgc3RhdGUgZnJvbSBIYWwKICAgICBpbnQzMl90IGV4cG9zdXJlQ29tcGVuc2F0aW9uOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9jazsKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2tBdmFpbGFibGU7CkBAIC0yNDcsNiArMjQ4LDcgQEAKICAgICAgICAgYm9vbCB1c2VGbGV4aWJsZVl1djsKICAgICAgICAgU2l6ZSBtYXhKcGVnU2l6ZTsKICAgICAgICAgU2l6ZSBtYXhac2xTaXplOworICAgICAgICBib29sIHN1cHBvcnRzUHJlZmVycmVkQ29uZmlnczsKICAgICB9IGZhc3RJbmZvOwogCiAgICAgLy8gUXVpcmtzIGluZm9ybWF0aW9uOyB0aGVzZSBhcmUgc2hvcnQtbGl2ZWQgZmxhZ3MgdG8gZW5hYmxlIHdvcmthcm91bmRzIGZvcgpAQCAtNDE3LDYgKzQxOSw5IEBACiAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAogICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIHN1Z2dlc3RlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0OworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIGpwZWcgc2l6ZQogICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKICAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKQEAgLTQzOCw2ICs0NDMsMTUgQEAKICAgICAvLyBUaGUgbWF4aW11bSBzaXplIGlzIGRlZmluZWQgYnkgY29tcGFyaW5nIHdpZHRoIGZpcnN0LCB3aGVuIHdpZHRoIHRpZXMgY29tcGFyaW5nIGhlaWdodC4KICAgICBTaXplIGdldE1heFNpemUoY29uc3QgVmVjdG9yPFNpemU+JiBzaXplcyk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZmlsdGVyIGFuZCBzb3J0IHN1Z2dlc3RlZCBzaXplcworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKGludDMyX3QgdXNlY2FzZUlkLCBpbnQzMl90IGZvcm1hdCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIGpwZWcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHByZXZpZXcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHZpZGVvIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdDsKKwogICAgIGludCBtRGV2aWNlVmVyc2lvbjsKICAgICB1aW50OF90IG1EZWZhdWx0U2NlbmVNb2RlOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCA1NjdiMTVmLi5iNTEyZjJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtMjYsMTAgKzI3LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAKKyNpbmNsdWRlICJEZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgorI2luY2x1ZGUgIkhlaWNDb21wb3NpdGVTdHJlYW0uaCIKKwogLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKIAogI2RlZmluZSBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBlcnJvclN0cmluZykgXApAQCAtMTIyLDYgKzEyOCw3IEBACiAgICAgICAgICAgICAgICAgcGh5c2ljYWxLZXlzRW50cnkuZGF0YS5pMzIgKyBwaHlzaWNhbEtleXNFbnRyeS5jb3VudCk7CiAgICAgfQogCisgICAgbVByb3ZpZGVyTWFuYWdlciA9IHByb3ZpZGVyUHRyOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTM5LDYgKzE0Niw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgIFN1cmZhY2VNYXAqIG91dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90Piogb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90ICpjdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpbnQgY29tcG9zaXRlSWR4OwogICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CiAKICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKQEAgLTE0OCw2ICsxNTYsMTEgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIFN1cmZhY2UgdGhhdCBpcyBub3QgcGFydCBvZiBjdXJyZW50IGNhcHR1cmUgc2Vzc2lvbiIpOworICAgIH0gZWxzZSBpZiAoKGNvbXBvc2l0ZUlkeCA9IG1Db21wb3NpdGVTdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKSkKKyAgICAgICAgICAgICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJZHgpLT5pbnNlcnRHYnAob3V0U3VyZmFjZU1hcCwgb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CiAKICAgICBjb25zdCBTdHJlYW1TdXJmYWNlSWQmIHN0cmVhbVN1cmZhY2VJZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOwpAQCAtNDY5LDYgKzQ4Miw3OSBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCisgICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKG9wZXJhdGluZ01vZGUpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBFcnJvciBjb25maWd1cmluZyBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmNvbmZpZ3VyZVN0cmVhbSgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSyApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBFcnJvciBjb25maWd1cmluZyBjb21wb3NpdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbXM6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1N1cmZhY2VUeXBlTG9ja2VkKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKSBjb25zdCB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQorICAgICAgICAgICAgbVByb3ZpZGVyTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKSA9PSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3QgewogICAgIGlmIChvcGVyYXRpbmdNb2RlIDwgMCkgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKICAgICAgICAgICAgICJDYW1lcmEgJXM6IEludmFsaWQgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKQEAgLTQ3Nyw3ICs1NjMsNiBAQAogICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogCi0gICAgLy8gU2FuaXRpemUgdGhlIGhpZ2ggc3BlZWQgc2Vzc2lvbiBhZ2FpbnN0IG5lY2Vzc2FyeSBjYXBhYmlsaXR5IGJpdC4KICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPSAob3BlcmF0aW5nTW9kZSA9PSBJQ2FtZXJhRGV2aWNlVXNlcjo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFKTsKICAgICBpZiAoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgewogICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwpAQCAtNTAwLDE3ICs1ODUsMjA0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOwotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjptYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmVhbS0+djNfMi5zdHJlYW1UeXBlID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgc3RyZWFtLT52M18yLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICBzdHJlYW0tPnYzXzIuaGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgc3RyZWFtLT52M18yLmZvcm1hdCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc3RyZWFtSW5mby5mb3JtYXQpOworICAgIGF1dG8gdSA9IHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZTsKKyAgICBjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoc3RyZWFtSW5mby5mb3JtYXQsICZ1KTsKKyAgICBzdHJlYW0tPnYzXzIudXNhZ2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UodSk7CisgICAgc3RyZWFtLT52M18yLmRhdGFTcGFjZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZShzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgc3RyZWFtLT52M18yLnJvdGF0aW9uID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihyb3RhdGlvbik7CisgICAgc3RyZWFtLT5waHlzaWNhbENhbWVyYUlkID0gc3RkOjpzdHJpbmcocGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgc3RyZWFtLT5idWZmZXJTaXplID0gMDsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sIGJvb2wgKnN0YXR1cyAvKm91dCovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGJpbmRlcjo6U3RhdHVzIHJlczsKKyAgICBpZiAoIShyZXMgPSBjaGVja1BpZFN0YXR1cyhfX0ZVTkNUSU9OX18pKS5pc09rKCkpIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOworICAgIH0KKworICAgIGF1dG8gb3BlcmF0aW5nTW9kZSA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE9wZXJhdGluZ01vZGUoKTsKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBJbnZhbGlkIHN0YXR1cyEiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBFcnJvciBjb25maWd1cmluZyBzdHJlYW1zOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Q+IChvcGVyYXRpbmdNb2RlKSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJnN0cmVhbUNvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBtYXBwaW5nIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZDogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIG9wZXJhdGluZ01vZGUsIHN0cmVycm9yKC1yZXQpLCByZXQpOwogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSA+IDApOworICAgIGF1dG8gb3V0cHV0Q29uZmlncyA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisgICAgc2l6ZV90IHN0cmVhbUNvdW50ID0gb3V0cHV0Q29uZmlncy5zaXplKCk7CisgICAgc3RyZWFtQ291bnQgPSBpc0lucHV0VmFsaWQgPyBzdHJlYW1Db3VudCArIDEgOiBzdHJlYW1Db3VudDsKKyAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICBzaXplX3Qgc3RyZWFtSWR4ID0gMDsKKyAgICBpZiAoaXNJbnB1dFZhbGlkKSB7CisgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7ey8qc3RyZWFtSWQqLzAsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpJTlBVVCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkpLAorICAgICAgICAgICAgICAgIC8qdXNhZ2UqLyAwLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMH0sCisgICAgICAgICAgICAgICAgLypwaHlzaWNhbElkKi8gbnVsbHB0ciwgLypidWZmZXJTaXplKi8wfTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogb3V0cHV0Q29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGJ1ZmZlclByb2R1Y2VycyA9CisgICAgICAgICAgICBpdC5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IGl0LmlzRGVmZXJyZWQoKTsKKyAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChpdC5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgICAgICBzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKKyAgICAgICAgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCA9IGZhbHNlOworICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIHN0cmVhbUluZm87CisKKyAgICAgICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsIGl0LmdldFN1cmZhY2VUeXBlKCkpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gaXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ID0gaXQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gYW5kcm9pZF9kYXRhc3BhY2VfdDo6SEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICAgICAgICAgYXV0byBzdXJmYWNlVHlwZSA9IGl0LmdldFN1cmZhY2VUeXBlKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFOworICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkKTsKKworICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgYm9vbCBpc0hlaWNDb21wb3NpdGVTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtIHx8IGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHRha2UgaW4gdG8gYWNjb3VudCB0aGF0IGNvbXBvc2l0ZSBzdHJlYW1zIGNhbiBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMuCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+IGNvbXBvc2l0ZVN0cmVhbXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvKCksICZjb21wb3NpdGVTdHJlYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvKCksICZjb21wb3NpdGVTdHJlYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIGFkZGluZyBjb21wb3NpdGUgc3RyZWFtczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGludGVybmFsIHN0cmVhbXMgbWVhbnMgY29tcG9zaXRlIHN0cmVhbSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGVTdHJlYW1zLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNvdW50ICs9IGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjb21wb3NpdGVTdHJlYW0gOiBjb21wb3NpdGVTdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKGNvbXBvc2l0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4gKGl0LmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4gKGl0LmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXR1cyA9IGZhbHNlOworICAgIHJldCA9IG1Qcm92aWRlck1hbmFnZXItPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQobUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbiwgc3RhdHVzKTsKKyAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgLy8gRXhwZWN0ZWQsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IG5vdCBzdXBwb3J0ZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoICJDYW1lcmEgJXM6IEVycm9yOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKQEAgLTUzMiw2ICs4MDQsNyBAQAogICAgIGJvb2wgaXNJbnB1dCA9IGZhbHNlOwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBzdXJmYWNlczsKICAgICBzc2l6ZV90IGRJbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgIHNzaXplX3QgY29tcG9zaXRlSW5kZXggID0gTkFNRV9OT1RfRk9VTkQ7CiAKICAgICBpZiAobUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgJiYgbUlucHV0U3RyZWFtLmlkID09IHN0cmVhbUlkKSB7CiAgICAgICAgIGlzSW5wdXQgPSB0cnVlOwpAQCAtNTUxLDYgKzgyNCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5nZXRTdHJlYW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY29tcG9zaXRlSW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKHN1cmZhY2VzLmVtcHR5KCkgJiYgZEluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBJbnZhbGlkIHN0cmVhbSBJRCAoJWQpIHNwZWNpZmllZCwgbm8gc3VjaCIKICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gY3JlYXRlZCB5ZXQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVhbUlkKTsKQEAgLTU4MCw2ICs4NjAsMTkgQEAKICAgICAgICAgICAgIGlmIChkSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgICAgICBtRGVmZXJyZWRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQoZEluZGV4KTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZUluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmV0OworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGNvbXBvc2l0ZUluZGV4KS0+ZGVsZXRlU3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbmV4cGVjdGVkIGVycm9yICVzICglZCkgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIGNvbXBvc2l0ZSBzdHJlYW0gJWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAucmVtb3ZlSXRlbXNBdChjb21wb3NpdGVJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYwMyw0MSArODk2LDIzIEBACiAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkKCk7CiAgICAgYm9vbCBpc1NoYXJlZCA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNTaGFyZWQoKTsKICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKLQotICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPiBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSkgewotICAgICAgICBBTE9HRSgiJXM6IEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3VudCAlenUgZm9yIHN0cmVhbSBleGNlZWRzIGxpbWl0IG9mICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKLSAgICB9CiAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyT25seSA9IGRlZmVycmVkQ29uc3VtZXIgJiYgbnVtQnVmZmVyUHJvZHVjZXJzID09IDA7Ci0gICAgaW50IHN1cmZhY2VUeXBlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpOwotICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKLSAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CiAKLSAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgewotICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGlzIGludmFsaWQ6IGJ1ZmZlclByb2R1Y2VyID0gJXAsIHN1cmZhY2VUeXBlID0gJWQuIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclByb2R1Y2Vyc1swXS5nZXQoKSwgc3VyZmFjZVR5cGUpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJUYXJnZXQgU3VyZmFjZSBpcyBpbnZhbGlkIik7CisgICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsCisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCkpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIGlmICghbURldmljZS5nZXQoKSkgewogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCi0gICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQocGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9Ci0gICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEobURldmljZS0+aW5mbygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwotICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKLSAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksIHBoeXNpY2FsSWQpID09Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IENhbWVyYSBkb2Vzbid0IHN1cHBvcnQgcGh5c2ljYWxDYW1lcmFJZCAlcy4iLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQorICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gc3VyZmFjZXM7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IGJpbmRlcnM7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNjc3LDExICs5NTIsMzIgQEAKIAogICAgIGludCBzdHJlYW1JZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQ7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBzdXJmYWNlSWRzOwotICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKLSAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKLSAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgYm9vbCBpc0hlaWNDb21waXNpdGVTdHJlYW0gPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZXNbMF0pOworICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtIHx8IGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSkgeworICAgICAgICBzcDxDb21wb3NpdGVTdHJlYW0+IGNvbXBvc2l0ZVN0cmVhbTsKKyAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSA9IG5ldyBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbShtRGV2aWNlLCBnZXRSZW1vdGVDYWxsYmFjaygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSA9IG5ldyBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtKG1EZXZpY2UsIGdldFJlbW90ZUNhbGxiYWNrKCkpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29tcG9zaXRlU3RyZWFtLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKKyAgICAgICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2VzWzBdLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpLAorICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC0xMTYzLDYgKzE0NTksOCBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdHJlYW1Db25maWdzID0KICAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgPwogICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgorICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKSkgPworICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKIAogICAgIGludDMyX3QgYmVzdFdpZHRoID0gLTE7CkBAIC0xNjE1LDcgKzE5MTMsMTQgQEAKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAotICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7CisgICAgLy8gQ29tcG9zaXRlcyBjYW4gaGF2ZSBtdWx0aXBsZSBpbnRlcm5hbCBzdHJlYW1zLiBFcnJvciBub3RpZmljYXRpb25zIGNvbWluZyBmcm9tIHN1Y2ggaW50ZXJuYWwKKyAgICAvLyBzdHJlYW1zIG1heSBuZWVkIHRvIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCisgICAgYm9vbCBza2lwQ2xpZW50Tm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNraXBDbGllbnROb3RpZmljYXRpb24gfD0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vbkVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKKyAgICB9CisKKyAgICBpZiAoKHJlbW90ZUNiICE9IDApICYmICghc2tpcENsaWVudE5vdGlmaWNhdGlvbikpIHsKICAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KQEAgLTE2NDksNiArMTk1NCwxMCBAQAogICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAgICAgfQogICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uU2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSB7CkBAIC0xNzA4LDYgKzIwMTcsMTAgQEAKICAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1NZXRhZGF0YSwgcmVzdWx0Lm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgcmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25SZXN1bHRBdmFpbGFibGUocmVzdWx0KTsKKyAgICB9CiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbikgewpAQCAtMTcyNCw3ICsyMDM3LDcgQEAKIC8vIFRPRE86IG1vdmUgdG8gQ2FtZXJhMkNsaWVudEJhc2UKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewogCi0gICAgY29uc3QgaW50IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogCkBAIC0xNzYzLDcgKzIwNzYsNyBAQAogICAgICAgICBTdHJpbmcxNiBwZXJtaXNzaW9uU3RyaW5nID0KICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX0RJU0FCTEVfVFJBTlNNSVRfTEVEIik7CiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihwZXJtaXNzaW9uU3RyaW5nKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGlzYWJsZSB0cmFuc21pdCBMRUQgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBjMzA1NjFkLi4xYzVhYmIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTIwLDEzICsyMCwxNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgiCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpDb21wb3NpdGVTdHJlYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODksNiArOTIsMTIgQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CiAKKyAgICAvLyBWZXJpZnkgc3BlY2lmaWMgc2Vzc2lvbiBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIGJvb2wqIHN0cmVhbVN0YXR1cykgb3ZlcnJpZGU7CisKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUgb3IgaW4gZXJyb3Igc3RhdGUKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCkBAIC0yMzAsNiArMjM5LDEzIEBACiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdDsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsIGJvb2wgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIGludCBzdXJmYWNlVHlwZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKTsKICAgICBib29sIGVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAogICAgIC8vIEZpbmQgdGhlIHNxdWFyZSBvZiB0aGUgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cwpAQCAtMzAwLDcgKzMxNiwxMCBAQAogICAgIC8vIHN0cmVhbSBJRCAtPiBvdXRwdXRTdHJlYW1JbmZvIG1hcHBpbmcKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50MzJfdCwgT3V0cHV0U3RyZWFtSW5mbz4gbVN0cmVhbUluZm9NYXA7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDI7CisgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+IG1Db21wb3NpdGVTdHJlYW1NYXA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7CisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtUHJvdmlkZXJNYW5hZ2VyOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRlYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUNvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworQ29tcG9zaXRlU3RyZWFtOjpDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtUmVtb3RlQ2FsbGJhY2soY2IpLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCisgICAgICAgIG1FcnJvclN0YXRlKGZhbHNlKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGNhbWVyYURldmljZS0+aW5mbygpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICogaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKiBzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIHsKKyAgICBpZiAoaGFzRGVmZXJyZWRDb25zdW1lcikgeworICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVycyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdHJlYW1TZXRJZCAhPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3VyZmFjZSBncm91cHMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZXMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN1bWVycywgaGFzRGVmZXJyZWRDb25zdW1lciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCByb3RhdGlvbiwgaWQsCisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzLCBzdHJlYW1TZXRJZCwgaXNTaGFyZWQpOworfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OmRlbGV0ZVN0cmVhbSgpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuY2xlYXIoKTsKKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmNsZWFyKCk7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5jbGVhcigpOworICAgICAgICBtRXJyb3JGcmFtZU51bWJlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgLypzZXR0aW5ncyovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAoIW1FcnJvclN0YXRlICYmIChzdHJlYW1JZCA9PSBnZXRTdHJlYW1JZCgpKSkgeworICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVtcGxhY2UoZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKCFtRXJyb3JTdGF0ZSAmJiAhYnVmZmVySW5mby5tRXJyb3IpIHsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVtcGxhY2UoYnVmZmVySW5mby5tRnJhbWVOdW1iZXIsIGJ1ZmZlckluZm8ubVRpbWVzdGFtcCk7CisgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06OmVyYXNlUmVzdWx0KGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgYXV0byBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZmluZChmcmFtZU51bWJlcik7CisgICAgaWYgKGl0ID09IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpIHsKKyAgICBib29sIHJlc3VsdEVycm9yID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgICAgIGJvb2wgcmVzdWx0UmVhZHkgPSBmYWxzZTsKKyAgICAgICAgYXV0byBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZmluZChmcmFtZU51bWJlcik7CisgICAgICAgIGlmIChpdCAhPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVuZCgpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLmFwcGVuZChyZXN1bHQubU1ldGFkYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPj0gbU51bVBhcnRpYWxSZXN1bHRzKSB7CisgICAgICAgICAgICAgICAgYXV0byBlbnRyeSA9IGl0LT5zZWNvbmQuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdHMgPSBlbnRyeS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVtcGxhY2UodHMsIHN0ZDo6bWFrZV90dXBsZShmcmFtZU51bWJlciwgaXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lc3RhbXAgbWV0YWRhdGEgZW50cnkgbWlzc2luZyBmb3IgZnJhbWVOdW1iZXI6ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRSZWFkeSkgeworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0RXJyb3IpIHsKKyAgICAgICAgb25SZXN1bHRFcnJvcihyZXN1bHQubVJlc3VsdEV4dHJhcyk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6ZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBtRXJyb3JGcmFtZU51bWJlcnMuZW1wbGFjZShmcmFtZU51bWJlcik7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6cmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gcmV0ID0gZGV2aWNlLT5hZGRCdWZmZXJMaXN0ZW5lckZvclN0cmVhbShzdHJlYW1JZCwgdGhpcyk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBjb21wb3NpdGUgc3RyZWFtIGxpc3RlbmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBDb21wb3NpdGVTdHJlYW06Om9uRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGF1dG8gcmV0ID0gZmFsc2U7CisgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIG9uUmVzdWx0RXJyb3IocmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgcmV0ID0gb25TdHJlYW1CdWZmZXJFcnJvcihyZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICAgICAgLy8gSW52YWxpZCByZXF1ZXN0LCB0aGlzIHNob3VsZG4ndCBhZmZlY3QgY29tcG9zaXRlIHN0cmVhbXMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5yZWNvdmVyYWJsZSBlcnJvcjogJWQgZGV0ZWN0ZWQhIiwgX19GVU5DVElPTl9fLCBlcnJvckNvZGUpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgICAgIG1FcnJvclN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpub3RpZnlFcnJvcihpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0KKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrLnByb21vdGUoKTsKKworICAgIGlmICgoZnJhbWVOdW1iZXIgPj0gMCkgJiYgKHJlbW90ZUNiLmdldCgpICE9IG51bGxwdHIpKSB7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzOworICAgICAgICBleHRyYXMuZXJyb3JTdHJlYW1JZCA9IGdldFN0cmVhbUlkKCk7CisgICAgICAgIGV4dHJhcy5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcigKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBleHRyYXMpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAxYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIENvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgeworCitwdWJsaWM6CisgICAgQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKTsKKyAgICB2aXJ0dWFsIH5Db21wb3NpdGVTdHJlYW0oKSB7fQorCisgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCk7CisKKyAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKKworICAgIC8vIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYWxsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgPSAwOworCisgICAgLy8gUmVsZWFzZSBhbGwgaW50ZXJuYWwgc3RyZWFtcyBhbmQgY29ycmVzcG9uZGluZyByZXNvdXJjZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSA9IDA7CisKKyAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSA9IDA7CisKKyAgICAvLyBJbnNlcnQgdGhlIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW0gaWQgaW4gdGhlIHVzZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29tcG9zaXRlIHN0cmVhbSBpZC4KKyAgICB2aXJ0dWFsIGludCBnZXRTdHJlYW1JZCgpID0gMDsKKworICAgIC8vIE5vdGlmeSB3aGVuIHNodXR0ZXIgbm90aWZ5IGlzIHRyaWdnZXJlZAorICAgIHZpcnR1YWwgdm9pZCBvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgLypyZXN1bHRFeHRyYXMqLywgbnNlY3NfdCAvKnRpbWVzdGFtcCovKSB7fQorCisgICAgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOworICAgIGJvb2wgb25FcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKworICAgIC8vIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiAvKmJ1ZmZlckluZm8qLykgb3ZlcnJpZGUgeyAvKkVtcHR5IGZvciBub3cgKi8gfQorICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IFByb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgQm5Qcm9kdWNlckxpc3RlbmVyIHsKKyAgICAgICAgLy8gUHJvZHVjZXJMaXN0ZW5lciBpbXBlbWVudGF0aW9uCisgICAgICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlIHsgLypObyBpbXBsLiBmb3Igbm93Ki8gfTsKKyAgICB9OworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihpbnQzMl90IHN0cmVhbUlkKTsKKyAgICB2b2lkIGVyYXNlUmVzdWx0KGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgIHZvaWQgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIG5vdGlmeUVycm9yKGludDY0X3QgZnJhbWVOdW1iZXIpOworCisgICAgLy8gU3ViY2xhc3NlcyBzaG91bGQgY2hlY2sgZm9yIGJ1ZmZlciBlcnJvcnMgZnJvbSBpbnRlcm5hbCBzdHJlYW1zIGFuZCByZXR1cm4gJ3RydWUnIGluCisgICAgLy8gY2FzZSB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNob3VsZCByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgIHZpcnR1YWwgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOworCisgICAgLy8gU3ViY2xhc3NlcyBjYW4gZGVjaWRlIGhvdyB0byBoYW5kbGUgcmVzdWx0IGVycm9ycyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdGhlCisgICAgLy8gaW50ZXJuYWwgcHJvY2Vzc2luZyBuZWVkcyByZXN1bHQgZGF0YS4KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIERldmljZSBhbmQvb3Igc2VydmljZSBpcyBpbiB1bnJlY292ZXJhYmxlIGVycm9yIHN0YXRlLgorICAgIC8vIENvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBiZWhhdmUgYWNjb3JkaW5nbHkuCisgICAgdm9pZCBlbmFibGVFcnJvclN0YXRlKCk7CisKKyAgICB3cDxDYW1lcmFEZXZpY2VCYXNlPiAgIG1EZXZpY2U7CisgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKKworICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgbU11dGV4OworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb247CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICBtRXJyb3JTdGF0ZTsKKworICAgIC8vIEZyYW1lIG51bWJlciB0byBjYXB0dXJlIHJlc3VsdCBtYXAgb2YgcGFydGlhbCBwZW5kaW5nIHJlcXVlc3QgcmVzdWx0cy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIENhbWVyYU1ldGFkYXRhPiBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzOworCisgICAgLy8gVGltZXN0YW1wIHRvIGNhcHR1cmUgKGZyYW1lIG51bWJlciwgcmVzdWx0KSBtYXAgb2YgY29tcGxldGVkIHBlbmRpbmcgcmVxdWVzdCByZXN1bHRzLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBzdGQ6OnR1cGxlPGludDY0X3QsIENhbWVyYU1ldGFkYXRhPj4gbUNhcHR1cmVSZXN1bHRzOworCisgICAgLy8gRnJhbWUgbnVtYmVyIHRvIHRpbWVzdGFtcCBtYXAKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgaW50NjRfdD4gbUZyYW1lTnVtYmVyTWFwOworCisgICAgLy8gS2VlcHMgYSBzZXQgYnVmZmVyL3Jlc3VsdCBmcmFtZSBudW1iZXJzIGZvciBhbnkgZXJyb3JzIGRldGVjdGVkIGR1cmluZyBwcm9jZXNzaW5nLgorICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1FcnJvckZyYW1lTnVtYmVyczsKKworfTsKKworfTsgLy9uYW1lc3BhY2UgY2FtZXJhMworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNWFkMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsODIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLURlcHRoQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJkbGZjbi5oIgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgIkRlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworRGVwdGhDb21wb3NpdGVTdHJlYW06OkRlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKKyAgICAgICAgbUJsb2JTdHJlYW1JZCgtMSksCisgICAgICAgIG1CbG9iU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbURlcHRoU3RyZWFtSWQoLTEpLAorICAgICAgICBtRGVwdGhTdXJmYWNlSWQoLTEpLAorICAgICAgICBtQmxvYldpZHRoKDApLAorICAgICAgICBtQmxvYkhlaWdodCgwKSwKKyAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCisgICAgICAgIG1NYXhKcGVnU2l6ZSgtMSksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLAorICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZShudWxscHRyKSwKKyAgICAgICAgbURlcHRoUGhvdG9Qcm9jZXNzKG51bGxwdHIpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBjYW1lcmFEZXZpY2UgPSBkZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChjYW1lcmFEZXZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGF1dG8gZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU1heEpwZWdTaXplID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE1heGltdW0ganBlZyBzaXplIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTik7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSA1KSB7CisgICAgICAgICAgICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uLnJlc2VydmUoNSk7CisgICAgICAgICAgICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uLmluc2VydChtSW5zdHJpbnNpY0NhbGlicmF0aW9uLmVuZCgpLCBlbnRyeS5kYXRhLmYsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuZiArIDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnRyaW5zaWMgY2FsaWJyYXRpb24gYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0RJU1RPUlRJT04pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gNSkgeworICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uLnJlc2VydmUoNSk7CisgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb24uaW5zZXJ0KG1MZW5zRGlzdG9ydGlvbi5lbmQoKSwgZW50cnkuZGF0YS5mLCBlbnRyeS5kYXRhLmYgKyA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTGVucyBkaXN0b3J0aW9uIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKKyAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoc3RhdGljSW5mbywgJm1TdXBwb3J0ZWREZXB0aFNpemVzKTsKKworICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZSA9IGRsb3BlbihjYW1lcmEzOjprRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgICAgIGlmIChtRGVwdGhQaG90b0xpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVwdGhQaG90b1Byb2Nlc3MgPSByZWludGVycHJldF9jYXN0PGNhbWVyYTM6OnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWU+ICgKKyAgICAgICAgICAgICAgICAgICAgZGxzeW0obURlcHRoUGhvdG9MaWJIYW5kbGUsIGNhbWVyYTM6OmtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uKSk7CisgICAgICAgICAgICBpZiAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsaW5rIHRvIGRlcHRoIHBob3RvIHByb2Nlc3MgZnVuY3Rpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZGxlcnJvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGxpbmsgdG8gZGVwdGggcGhvdG8gbGlicmFyeTogJXMiLCBfX0ZVTkNUSU9OX18sIGRsZXJyb3IoKSk7CisgICAgICAgIH0KKworICAgIH0KK30KKworRGVwdGhDb21wb3NpdGVTdHJlYW06On5EZXB0aENvbXBvc2l0ZVN0cmVhbSgpIHsKKyAgICBtQmxvYkNvbnN1bWVyLmNsZWFyKCksCisgICAgbUJsb2JTdXJmYWNlLmNsZWFyKCksCisgICAgbUJsb2JTdHJlYW1JZCA9IC0xOworICAgIG1CbG9iU3VyZmFjZUlkID0gLTE7CisgICAgbURlcHRoQ29uc3VtZXIuY2xlYXIoKTsKKyAgICBtRGVwdGhTdXJmYWNlLmNsZWFyKCk7CisgICAgbURlcHRoQ29uc3VtZXIgPSBudWxscHRyOworICAgIG1EZXB0aFN1cmZhY2UgPSBudWxscHRyOworICAgIGlmIChtRGVwdGhQaG90b0xpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGRsY2xvc2UobURlcHRoUGhvdG9MaWJIYW5kbGUpOworICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZXB0aFBob3RvUHJvY2VzcyA9IG51bGxwdHI7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKSB7CisgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7CisKKyAgICB3aGlsZSAoIW1JbnB1dEpwZWdCdWZmZXJzLmVtcHR5KCkgJiYgIW1CbG9iQnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEpwZWdCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbUJsb2JDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIGJsb2IgaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcganBlZyBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiByZWNlaXZlZCBidWZmZXIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtQmxvYkNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uanBlZ0J1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1CbG9iQnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dEpwZWdCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dERlcHRoQnVmZmVycy5lbXB0eSgpICYmICFtRGVwdGhCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBhdXRvIGl0ID0gbUlucHV0RGVwdGhCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbURlcHRoQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmVjZWl2aW5nIGRlcHRoIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0RGVwdGhCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBkZXB0aCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiByZWNlaXZlZCBidWZmZXIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtRGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmRlcHRoQnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ2FwdHVyZVJlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNhcHR1cmVSZXN1bHRzLmJlZ2luKCk7CisgICAgICAgIC8vIE5lZ2F0aXZlIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNhcHR1cmUgcmVzdWx0CisgICAgICAgIC8vIGNvbGxlY3Rpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGl0LT5maXJzdCA+PSAwKSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0uZnJhbWVOdW1iZXIgPSBzdGQ6OmdldDwwPihpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5yZXN1bHQgPSBzdGQ6OmdldDwxPihpdC0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUZyYW1lTnVtYmVyTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1GcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5zZWNvbmRdLmZyYW1lTnVtYmVyID0gaXQtPmZpcnN0OworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIGF1dG8gaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUVycm9yRnJhbWVOdW1iZXJzLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZnJhbWVGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gJmlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gKml0KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5zZWNvbmQuZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYW1lRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lRm91bmQpIHsKKyAgICAgICAgICAgIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm90IGFibGUgdG8gZmluZCBmYWlsaW5nIGlucHV0IHdpdGggZnJhbWUgbnVtYmVyOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgKml0KTsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pIHsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoKCFpdC5zZWNvbmQuZXJyb3IpICYmIChpdC5zZWNvbmQuZGVwdGhCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgIChpdC5zZWNvbmQuanBlZ0J1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3SW5wdXRBdmFpbGFibGU7Cit9CisKK2ludDY0X3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLykgeworICAgIGludDY0X3QgcmV0ID0gLTE7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5lcnJvciAmJiAhaXQuc2Vjb25kLmVycm9yTm90aWZpZWQgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIHJldCA9IGl0LnNlY29uZC5mcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzSW5wdXRGcmFtZShjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFuYjsKKyAgICBpbnQgZmVuY2VGZDsKKyAgICB2b2lkICpkc3RCdWZmZXI7CisKKyAgICBhdXRvIGpwZWdTaXplID0gYW5kcm9pZDo6Y2FtZXJhMjo6SnBlZ1Byb2Nlc3Nvcjo6ZmluZEpwZWdTaXplKGlucHV0RnJhbWUuanBlZ0J1ZmZlci5kYXRhLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5qcGVnQnVmZmVyLndpZHRoKTsKKyAgICBpZiAoanBlZ1NpemUgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IEZhaWxlZCB0byBmaW5kIGlucHV0IGpwZWcgc2l6ZSwgZGVmYXVsdCB0byB1c2luZyBlbnRpcmUgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGpwZWdTaXplID0gaW5wdXRGcmFtZS5qcGVnQnVmZmVyLndpZHRoOworICAgIH0KKworICAgIHNpemVfdCBtYXhEZXB0aEpwZWdTaXplOworICAgIGlmIChtTWF4SnBlZ1NpemUgPiAwKSB7CisgICAgICAgIG1heERlcHRoSnBlZ1NpemUgPSBtTWF4SnBlZ1NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IHN0ZDo6bWF4PHNpemVfdD4gKGpwZWdTaXplLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuZGVwdGhCdWZmZXIud2lkdGggKiBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmhlaWdodCAqIDMgLyAyKTsKKyAgICB9CisgICAgdWludDhfdCBqcGVnUXVhbGl0eSA9IDEwMDsKKyAgICBhdXRvIGVudHJ5ID0gaW5wdXRGcmFtZS5yZXN1bHQuZmluZChBTkRST0lEX0pQRUdfUVVBTElUWSk7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBqcGVnUXVhbGl0eSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgfQorCisgICAgLy8gVGhlIGZpbmFsIGRlcHRoIHBob3RvIHdpbGwgY29uc2lzdCBvZiB0aGUgbWFpbiBqcGVnIGJ1ZmZlciwgdGhlIGRlcHRoIG1hcCBidWZmZXIgKGFsc28gaW4KKyAgICAvLyBqcGVnIGZvcm1hdCkgYW5kIGNvbmZpZGVuY2UgbWFwIChqcGVnIGFzIHdlbGwpLiBBc3N1bWUgd29yc3QgY2FzZSB0aGF0IGFsbCAzIGpwZWcgbmVlZAorICAgIC8vIG1heCBqcGVnIHNpemUuCisgICAgc2l6ZV90IGZpbmFsSnBlZ0J1ZmZlclNpemUgPSBtYXhEZXB0aEpwZWdTaXplICogMzsKKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGRpbWVuc2lvbnMiCisgICAgICAgICAgICAgICAgIiAlenV4JXUgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMVUsIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG91dHB1dEFOVy0+ZGVxdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgJmFuYiwgJmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZXRyaWV2aW5nIG91dHB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2IgPSBHcmFwaGljQnVmZmVyOjpmcm9tKGFuYik7CisgICAgcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKGdiLT5nZXRXaWR0aCgpIDwgZmluYWxKcGVnQnVmZmVyU2l6ZSkgfHwgKGdiLT5nZXRIZWlnaHQoKSAhPSAxKSkgeworICAgICAgICBBTE9HRSgiJXM6IEJsb2IgYnVmZmVyIHNpemUgbWlzbWF0Y2gsIGV4cGVjdGVkICVkeCVkIHJlY2VpdmVkICV6dXgldSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBnYi0+Z2V0V2lkdGgoKSwgZ2ItPmdldEhlaWdodCgpLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxVSk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgZGVwdGhQaG90bzsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChpbnB1dEZyYW1lLmpwZWdCdWZmZXIuZGF0YSk7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdXaWR0aCA9IG1CbG9iV2lkdGg7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdIZWlnaHQgPSBtQmxvYkhlaWdodDsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ1NpemUgPSBqcGVnU2l6ZTsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPiAoaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5kYXRhKTsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci53aWR0aDsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcEhlaWdodCA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuaGVpZ2h0OworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwU3RyaWRlID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5zdHJpZGU7CisgICAgZGVwdGhQaG90by5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBkZXB0aFBob3RvLm1Jc0xvZ2ljYWwgPSBtSXNMb2dpY2FsQ2FtZXJhOworICAgIGRlcHRoUGhvdG8ubU1heEpwZWdTaXplID0gbWF4RGVwdGhKcGVnU2l6ZTsKKyAgICAvLyBUaGUgY2FtZXJhIGludHJpbnNpYyBjYWxpYnJhdGlvbiBsYXlvdXQgaXMgYXMgZm9sbG93czoKKyAgICAvLyBbZm9jYWxMZW5ndGhYLCBmb2NhbExlbmd0aFksIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSwgc2tld10KKyAgICBpZiAobUluc3RyaW5zaWNDYWxpYnJhdGlvbi5zaXplKCkgPT0gNSkgeworICAgICAgICBtZW1jcHkoZGVwdGhQaG90by5tSW5zdHJpbnNpY0NhbGlicmF0aW9uLCBtSW5zdHJpbnNpY0NhbGlicmF0aW9uLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoZGVwdGhQaG90by5tSW5zdHJpbnNpY0NhbGlicmF0aW9uKSk7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQgPSAwOworICAgIH0KKyAgICAvLyBUaGUgY2FtZXJhIGxlbnMgZGlzdG9ydGlvbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlbnMgY29ycmVjdGlvbiBjb2VmZmljaWVudHMuCisgICAgLy8gW2thcHBhXzEsIGthcHBhXzIsIGthcHBhXzMga2FwcGFfNCwga2FwcGFfNV0KKyAgICBpZiAobUxlbnNEaXN0b3J0aW9uLnNpemUoKSA9PSA1KSB7CisgICAgICAgIG1lbWNweShkZXB0aFBob3RvLm1MZW5zRGlzdG9ydGlvbiwgbUxlbnNEaXN0b3J0aW9uLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoZGVwdGhQaG90by5tTGVuc0Rpc3RvcnRpb24pKTsKKyAgICAgICAgZGVwdGhQaG90by5tSXNMZW5zRGlzdG9ydGlvblZhbGlkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXB0aFBob3RvLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQgPSAwOworICAgIH0KKyAgICBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIC8vIFRoZSBjYW1lcmEganBlZyBvcmllbnRhdGlvbiB2YWx1ZXMgbXVzdCBiZSB3aXRoaW4gWzAsIDkwLCAxODAsIDI3MF0uCisgICAgICAgIHN3aXRjaCAoZW50cnkuZGF0YS5pMzJbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG8ubU9yaWVudGF0aW9uID0gc3RhdGljX2Nhc3Q8RGVwdGhQaG90b09yaWVudGF0aW9uPiAoZW50cnkuZGF0YS5pMzJbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQganBlZyBvcmllbnRhdGlvbiB2YWx1ZTogJWQsIGRlZmF1bHQgdG8gMCBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZW50cnkuZGF0YS5pMzJbMF0pOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGFjdHVhbEpwZWdTaXplID0gMDsKKyAgICByZXMgPSBtRGVwdGhQaG90b1Byb2Nlc3MoZGVwdGhQaG90bywgZmluYWxKcGVnQnVmZmVyU2l6ZSwgZHN0QnVmZmVyLCAmYWN0dWFsSnBlZ1NpemUpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIHByb2Nlc3NpbmcgZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzaXplX3QgZmluYWxKcGVnU2l6ZSA9IGFjdHVhbEpwZWdTaXplICsgc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgaWYgKGZpbmFsSnBlZ1NpemUgPiBmaW5hbEpwZWdCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogRmluYWwganBlZyBidWZmZXIgbm90IGxhcmdlIGVub3VnaCBmb3IgdGhlIGpwZWcgYmxvYiBoZWFkZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIEFMT0dWKCIlczogRmluYWwganBlZyBzaXplOiAlenUiLCBfX2Z1bmNfXywgZmluYWxKcGVnU2l6ZSk7CisgICAgdWludDhfdCogaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPiAoZHN0QnVmZmVyKSArCisgICAgICAgIChnYi0+Z2V0V2lkdGgoKSAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IpKTsKKyAgICBzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IgKmJsb2IgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYio+IChoZWFkZXIpOworICAgIGJsb2ItPmpwZWdfYmxvYl9pZCA9IENBTUVSQTNfSlBFR19CTE9CX0lEOworICAgIGJsb2ItPmpwZWdfc2l6ZSA9IGFjdHVhbEpwZWdTaXplOworICAgIG91dHB1dEFOVy0+cXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLykgeworICAgIGlmIChpbnB1dEZyYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5kZXB0aEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURlcHRoQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5kZXB0aEJ1ZmZlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5qcGVnQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtQmxvYkNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+anBlZ0J1ZmZlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmpwZWdCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1CbG9iQnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0RnJhbWUtPmVycm9yIHx8IG1FcnJvclN0YXRlKSAmJiAhaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCkgeworICAgICAgICBub3RpZnlFcnJvcihpbnB1dEZyYW1lLT5mcmFtZU51bWJlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKSB7CisgICAgYXV0byBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0IDw9IGN1cnJlbnRUcykgeworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJml0LT5zZWNvbmQpOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OnRocmVhZExvb3AoKSB7CisgICAgaW50NjRfdCBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgICAgIGlmIChtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBsYW5kZWQgaW4gZXJyb3Igc3RhdGUsIHJldHVybiBhbnkgcGVuZGluZyBidWZmZXJzIGFuZAorICAgICAgICAgICAgLy8gaGFsdCBhbGwgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IGdldE5leHRSZWFkeUlucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgaWYgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGF1dG8gZmFpbGluZ0ZyYW1lTnVtYmVyID0gZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGluZ0ZyYW1lTnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGVyYXNlICdtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcworICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgdHdvIGludGVybmFsIHN0cmVhbSBidWZmZXJzIHRvIGZhaWwuIEluIHN1Y2ggc2NlbmFyaW8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvc2l0ZSBzdHJlYW0gc2hvdWxkIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IGEgc3RyZWFtIGJ1ZmZlciBlcnJvciBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCB3aXRoaW4gJ2Vycm9yTm90aWZpZWQnLgorICAgICAgICAgICAgICAgICAgICAvLyBBbnkgcHJlc2VudCBmYWlsZWQgaW5wdXQgZnJhbWVzIHdpbGwgYmUgcmVtb3ZlZCBvbiBhIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICAgICAgICAgICAgICAgICAvLyAncmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKCknLgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF1dG8gcmV0ID0gbUlucHV0UmVhZHlDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1NdXRleCwga1dhaXREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lZCB3YWl0IG9uIGNvbmRpdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IHByb2Nlc3NJbnB1dEZyYW1lKG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHByb2Nlc3NpbmcgZnJhbWUgd2l0aCB0aW1lc3RhbXA6ICUiIFBSSXU2NCAiOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGN1cnJlbnRUcywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5lcnJvciA9IHRydWU7CisgICAgfQorCisgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IHN1cmZhY2UuZ2V0KCk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludCBmb3JtYXQ7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBkYXRhc3BhY2U7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0RBVEFTUEFDRSwgJmRhdGFzcGFjZSkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBkYXRhc3BhY2U6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSAmJiAoZGF0YXNwYWNlID09IEhBTF9EQVRBU1BBQ0VfRFlOQU1JQ19ERVBUSCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIC8qaGFzRGVmZXJyZWRDb25zdW1lciovLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgLypzdHJlYW1TZXRJZCovLCBib29sIC8qaXNTaGFyZWQqLykgeworICAgIGlmIChtU3VwcG9ydGVkRGVwdGhTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVGhpcyBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgZGVwdGggbWFwIHN0cmVhbXMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNpemVfdCBkZXB0aFdpZHRoLCBkZXB0aEhlaWdodDsKKyAgICBhdXRvIHJldCA9IGdldE1hdGNoaW5nRGVwdGhTaXplKHdpZHRoLCBoZWlnaHQsIG1TdXBwb3J0ZWREZXB0aFNpemVzLCAmZGVwdGhXaWR0aCwgJmRlcHRoSGVpZ2h0KTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgZGVwdGggc3RyZWFtIHNpemUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1CbG9iQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIC8qbWF4TG9ja2VkQnVmZmVycyovMSwgLypjb250cm9sbGVkQnlBcHAqLyB0cnVlKTsKKyAgICBtQmxvYkNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgIG1CbG9iQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1KcGVnQ29tcG9zaXRlU3RyZWFtIikpOworICAgIG1CbG9iU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIHJldCA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1CbG9iU3VyZmFjZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBrSnBlZ0RhdGFTcGFjZSwgcm90YXRpb24sCisgICAgICAgICAgICBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcyk7CisgICAgaWYgKHJldCA9PSBPSykgeworICAgICAgICBtQmxvYlN0cmVhbUlkID0gKmlkOworICAgICAgICBtQmxvYlN1cmZhY2VJZCA9ICgqc3VyZmFjZUlkcylbMF07CisgICAgICAgIG1PdXRwdXRTdXJmYWNlID0gY29uc3VtZXJzWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtRGVwdGhDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgLyptYXhMb2NrZWRCdWZmZXJzKi8gMSwgLypjb250cm9sbGVkQnlBcHAqLyB0cnVlKTsKKyAgICBtRGVwdGhDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtRGVwdGhDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLURlcHRoQ29tcG9zaXRlU3RyZWFtIikpOworICAgIG1EZXB0aFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBkZXB0aFN1cmZhY2VJZDsKKyAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtRGVwdGhTdXJmYWNlLCBkZXB0aFdpZHRoLCBkZXB0aEhlaWdodCwga0RlcHRoTWFwUGl4ZWxGb3JtYXQsCisgICAgICAgICAgICBrRGVwdGhNYXBEYXRhU3BhY2UsIHJvdGF0aW9uLCAmbURlcHRoU3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZkZXB0aFN1cmZhY2VJZCk7CisgICAgaWYgKHJldCA9PSBPSykgeworICAgICAgICBtRGVwdGhTdXJmYWNlSWQgPSBkZXB0aFN1cmZhY2VJZFswXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoZ2V0U3RyZWFtSWQoKSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBibG9iIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIobURlcHRoU3RyZWFtSWQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZGVwdGggc3RyZWFtIGxpc3RlbmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbUJsb2JXaWR0aCA9IHdpZHRoOworICAgIG1CbG9iSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNvbmZpZ3VyZVN0cmVhbSgpIHsKKyAgICBpZiAoaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgLy8gUHJvY2Vzc2luZyB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKG1EZXB0aFBob3RvTGliSGFuZGxlID09IG51bGxwdHIpIHx8IChtRGVwdGhQaG90b1Byb2Nlc3MgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBsaWJyYXJ5IGlzIG5vdCBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmFsaWQgb3V0cHV0IHN1cmZhY2Ugc2V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gcmVzID0gbU91dHB1dFN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBLCBtUHJvZHVjZXJMaXN0ZW5lcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3cgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1PdXRwdXRTdXJmYWNlLmdldCgpLCBIQUxfUElYRUxfRk9STUFUX0JMT0IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaW50IG1heFByb2R1Y2VyQnVmZmVyczsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBtQmxvYlN1cmZhY2UuZ2V0KCk7CisgICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWF4UHJvZHVjZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBBTmF0aXZlV2luZG93ICphbndDb25zdW1lciA9IG1PdXRwdXRTdXJmYWNlLmdldCgpOworICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CisgICAgaWYgKChyZXMgPSBhbndDb25zdW1lci0+cXVlcnkoYW53Q29uc3VtZXIsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKKyAgICAgICAgICAgICAgICAgICAgJm1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCisgICAgICAgICAgICAgICAgICAgIGFud0NvbnN1bWVyLCBtYXhQcm9kdWNlckJ1ZmZlcnMgKyBtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJ1bigiRGVwdGhDb21wb3NpdGVTdHJlYW1Qcm9jIik7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSB7CisgICAgLy8gVGhlICdDYW1lcmFEZXZpY2VDbGllbnQnIHBhcmVudCB3aWxsIGRlbGV0ZSB0aGUgYmxvYiBzdHJlYW0KKyAgICByZXF1ZXN0RXhpdCgpOworCisgICAgYXV0byByZXQgPSBqb2luKCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBqb2luIHdpdGggdGhlIG1haW4gcHJvY2Vzc2luZyB0aHJlYWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1EZXB0aFN0cmVhbUlkID49IDApIHsKKyAgICAgICAgcmV0ID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obURlcHRoU3RyZWFtSWQpOworICAgICAgICBtRGVwdGhTdHJlYW1JZCA9IC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CisgICAgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBrSnBlZ0RhdGFTcGFjZSkgeworICAgICAgICBBTE9HVigiJXM6IEpwZWcgYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dEpwZWdCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBrRGVwdGhNYXBEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBEZXB0aCBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0RGVwdGhCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgZGF0YSBzcGFjZTogMHgleCIsIF9fRlVOQ1RJT05fXywgaXRlbS5tRGF0YVNwYWNlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjppbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCisgICAgICAgIFZlY3RvcjxpbnQzMl90PiAqIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtRGVwdGhTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttRGVwdGhTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1EZXB0aFN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttRGVwdGhTdHJlYW1JZF0ucHVzaF9iYWNrKG1EZXB0aFN1cmZhY2VJZCk7CisKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtQmxvYlN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21CbG9iU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtQmxvYlN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttQmxvYlN0cmVhbUlkXS5wdXNoX2JhY2sobUJsb2JTdXJmYWNlSWQpOworCisgICAgaWYgKGN1cnJlbnRTdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpjdXJyZW50U3RyZWFtSWQgPSBtQmxvYlN0cmVhbUlkOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAvLyBQcm9jZXNzaW5nIGNhbiBjb250aW51ZSBldmVuIGluIGNhc2Ugb2YgcmVzdWx0IGVycm9ycy4KKyAgICAvLyBBdCB0aGUgbW9tZW50IGRlcHRoIGNvbXBvc2l0ZSBzdHJlYW0gcHJvY2Vzc2luZyByZWxpZXMgbWFpbmx5IG9uIHN0YXRpYyBjYW1lcmEKKyAgICAvLyBjaGFyYWN0ZXJpc3RpY3MgZGF0YS4gVGhlIGFjdHVhbCByZXN1bHQgZGF0YSBjYW4gYmUgdXNlZCBmb3IgdGhlIGpwZWcgcXVhbGl0eSBidXQKKyAgICAvLyBpbiBjYXNlIGl0IGlzIGFic2VudCB3ZSBjYW4gZGVmYXVsdCB0byBtYXhpbXVtLgorICAgIGVyYXNlUmVzdWx0KHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAvLyBCdWZmZXIgZXJyb3JzIGNvbmNlcm5pbmcgaW50ZXJuYWwgY29tcG9zaXRlIHN0cmVhbXMgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlIHRvCisgICAgLy8gY2FtZXJhIGNsaWVudHMuIFRoZXkgbXVzdCBvbmx5IHJlY2VpdmUgYSBzaW5nbGUgYnVmZmVyIGVycm9yIHdpdGggdGhlIHB1YmxpYyBjb21wb3NpdGUKKyAgICAvLyBzdHJlYW0gaWQuCisgICAgaWYgKChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtRGVwdGhTdHJlYW1JZCkgfHwKKyAgICAgICAgICAgIChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtQmxvYlN0cmVhbUlkKSkgeworICAgICAgICBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIHJldCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzdXBwb3JlZERlcHRoU2l6ZXMsCisgICAgICAgIHNpemVfdCAqZGVwdGhXaWR0aCAvKm91dCovLCBzaXplX3QgKmRlcHRoSGVpZ2h0IC8qb3V0Ki8pIHsKKyAgICBpZiAoKGRlcHRoV2lkdGggPT0gbnVsbHB0cikgfHwgKGRlcHRoSGVpZ2h0ID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZmxvYXQgYXJUb2wgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmtEZXB0aEFSVG9sZXJhbmNlOworICAgICpkZXB0aFdpZHRoID0gKmRlcHRoSGVpZ2h0ID0gMDsKKworICAgIGZsb2F0IGFzcGVjdFJhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+ICh3aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4gKGhlaWdodCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IHN1cHBvcmVkRGVwdGhTaXplcykgeworICAgICAgICBhdXRvIGN1cnJlbnRXaWR0aCA9IHN0ZDo6Z2V0PDA+KGl0KTsKKyAgICAgICAgYXV0byBjdXJyZW50SGVpZ2h0ID0gc3RkOjpnZXQ8MT4oaXQpOworICAgICAgICBpZiAoKGN1cnJlbnRXaWR0aCA9PSB3aWR0aCkgJiYgKGN1cnJlbnRIZWlnaHQgPT0gaGVpZ2h0KSkgeworICAgICAgICAgICAgKmRlcHRoV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICpkZXB0aEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudFJhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChjdXJyZW50V2lkdGgpIC8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+IChjdXJyZW50SGVpZ2h0KTsKKyAgICAgICAgICAgIGF1dG8gY3VycmVudFNpemUgPSBjdXJyZW50V2lkdGggKiBjdXJyZW50SGVpZ2h0OworICAgICAgICAgICAgYXV0byBvbGRTaXplID0gKCpkZXB0aFdpZHRoKSAqICgqZGVwdGhIZWlnaHQpOworICAgICAgICAgICAgaWYgKChmYWJzKGFzcGVjdFJhdGlvIC0gY3VycmVudFJhdGlvKSA8PSBhclRvbCkgJiYgKGN1cnJlbnRTaXplID4gb2xkU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAqZGVwdGhXaWR0aCA9IGN1cnJlbnRXaWR0aDsKKyAgICAgICAgICAgICAgICAqZGVwdGhIZWlnaHQgPSBjdXJyZW50SGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgoKmRlcHRoV2lkdGggPiAwKSAmJiAoKmRlcHRoSGVpZ2h0ID4gMCkpID8gT0sgOiBCQURfVkFMVUU7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldFN1cHBvcnRlZERlcHRoU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4qIGRlcHRoU2l6ZXMgLypvdXQqLykgeworICAgIGlmIChkZXB0aFNpemVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZW50cnkgPSBjaC5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAvLyBEZXB0aCBzdHJlYW0gZGltZW5zaW9ucyBoYXZlIGZvdXIgaW50MzJfdCBjb21wb25lbnRzCisgICAgICAgIC8vIChwaXhlbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgdHlwZSkKKyAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSBlbnRyeS5jb3VudCAvIDQ7CisgICAgICAgIGRlcHRoU2l6ZXMtPnJlc2VydmUoZW50cnlDb3VudCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKChlbnRyeS5kYXRhLmkzMltpXSA9PSBrRGVwdGhNYXBQaXhlbEZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGVudHJ5LmRhdGEuaTMyW2krM10gPT0KKyAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSkgeworICAgICAgICAgICAgICAgIGRlcHRoU2l6ZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoZW50cnkuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzJdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLykgeworICAgIGlmIChjb21wb3NpdGVPdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBkZXB0aFNpemVzOworICAgIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoY2gsICZkZXB0aFNpemVzKTsKKyAgICBpZiAoZGVwdGhTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHByZXNlbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBkZXB0aFdpZHRoLCBkZXB0aEhlaWdodDsKKyAgICBhdXRvIHJldCA9IGdldE1hdGNoaW5nRGVwdGhTaXplKHN0cmVhbUluZm8ud2lkdGgsIHN0cmVhbUluZm8uaGVpZ2h0LCBkZXB0aFNpemVzLCAmZGVwdGhXaWR0aCwKKyAgICAgICAgICAgICZkZXB0aEhlaWdodCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IE5vIG1hdGNoaW5nIGRlcHRoIHN0cmVhbSBzaXplIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmNsZWFyKCk7CisgICAgY29tcG9zaXRlT3V0cHV0LT5pbnNlcnQoY29tcG9zaXRlT3V0cHV0LT5lbmQoKSwgMiwgc3RyZWFtSW5mbyk7CisKKyAgICAvLyBKcGVnL0Jsb2Igc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZGF0YVNwYWNlID0ga0pwZWdEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICAvLyBEZXB0aCBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS53aWR0aCA9IGRlcHRoV2lkdGg7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmhlaWdodCA9IGRlcHRoSGVpZ2h0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5mb3JtYXQgPSBrRGVwdGhNYXBQaXhlbEZvcm1hdDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZGF0YVNwYWNlID0ga0RlcHRoTWFwRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYzMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9DT01QT1NJVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9pbWFnaW5nX21vZGVsLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9kZXB0aF9tYXAuaD4KKworI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgorCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwOwordXNpbmcgZHluYW1pY19kZXB0aDo6SXRlbTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFEZXZpY2VDbGllbnQ7CitjbGFzcyBDYW1lcmFNZXRhZGF0YTsKK2NsYXNzIFN1cmZhY2U7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgRGVwdGhDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgQ29tcG9zaXRlU3RyZWFtLCBwdWJsaWMgVGhyZWFkLAorICAgICAgICBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgeworCitwdWJsaWM6CisgICAgRGVwdGhDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKTsKKyAgICB+RGVwdGhDb21wb3NpdGVTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgLy8gQ29tcG9zaXRlU3RyZWFtIG92ZXJyaWRlcworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgb3ZlcnJpZGU7CisgICAgaW50IGdldFN0cmVhbUlkKCkgb3ZlcnJpZGUgeyByZXR1cm4gbUJsb2JTdHJlYW1JZDsgfQorCisgICAgLy8gQ3B1Q29uc3VtZXIgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm4gc3RyZWFtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLyk7CisKK3Byb3RlY3RlZDoKKworICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworICAgIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0cnVjdCBJbnB1dEZyYW1lIHsKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBkZXB0aEJ1ZmZlcjsKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBqcGVnQnVmZmVyOworICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgIHJlc3VsdDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBlcnJvck5vdGlmaWVkOworICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyOworCisgICAgICAgIElucHV0RnJhbWUoKSA6IGVycm9yKGZhbHNlKSwgZXJyb3JOb3RpZmllZChmYWxzZSksIGZyYW1lTnVtYmVyKC0xKSB7IH0KKyAgICB9OworCisgICAgLy8gSGVscGVyIG1ldGhvZHMKKyAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiogZGVwdGhTaXplcyAvKm91dCovKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWF0Y2hpbmdEZXB0aFNpemUoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzdXBwb3JlZERlcHRoU2l6ZXMsCisgICAgICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGggLypvdXQqLywgc2l6ZV90ICpkZXB0aEhlaWdodCAvKm91dCovKTsKKworICAgIC8vIER5bmFtaWMgZGVwdGggcHJvY2Vzc2luZworICAgIHN0YXR1c190IGVuY29kZUdyYXlzY2FsZUpwZWcoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCB1aW50OF90ICppbiwgdm9pZCAqb3V0LAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1heE91dFNpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksIHNpemVfdCAmYWN0dWFsU2l6ZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPERlcHRoTWFwPiBwcm9jZXNzRGVwdGhNYXBGcmFtZShjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICZkZXB0aE1hcEJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBtYXhKcGVnU2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4qIGl0ZW1zIC8qb3V0Ki8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbWFnaW5nTW9kZWw+IGdldEltYWdpbmdNb2RlbCgpOworICAgIHN0YXR1c190IHByb2Nlc3NJbnB1dEZyYW1lKGNvbnN0IElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworCisgICAgLy8gQnVmZmVyL1Jlc3VsdHMgaGFuZGxpbmcKKyAgICB2b2lkIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLyk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpOworCisgICAgLy8gRmluZCBmaXJzdCBjb21wbGV0ZSBhbmQgdmFsaWQgZnJhbWUgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAKKyAgICBib29sIGdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pOworCisgICAgLy8gRmluZCBuZXh0IGZhaWxpbmcgZnJhbWUgbnVtYmVyIHdpdGggc21hbGxlc3QgdGltZXN0YW1wIGFuZCByZXR1cm4gcmVzcGVjdGl2ZSBmcmFtZSBudW1iZXIKKyAgICBpbnQ2NF90IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLyk7CisKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0RlcHRoTWFwUGl4ZWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1kxNjsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrRGVwdGhNYXBEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0RFUFRIOworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtKcGVnRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9KRklGOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgbUJsb2JTdHJlYW1JZCwgbUJsb2JTdXJmYWNlSWQsIG1EZXB0aFN0cmVhbUlkLCBtRGVwdGhTdXJmYWNlSWQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUJsb2JXaWR0aCwgbUJsb2JIZWlnaHQ7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgICAgbUJsb2JDb25zdW1lciwgbURlcHRoQ29uc3VtZXI7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQsIG1CbG9iQnVmZmVyQWNxdWlyZWQ7CisgICAgc3A8U3VyZmFjZT4gICAgICAgICAgbURlcHRoU3VyZmFjZSwgbUJsb2JTdXJmYWNlLCBtT3V0cHV0U3VyZmFjZTsKKyAgICBzcDxQcm9kdWNlckxpc3RlbmVyPiBtUHJvZHVjZXJMaXN0ZW5lcjsKKworICAgIHNzaXplX3QgICAgICAgICAgICAgIG1NYXhKcGVnU2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gbVN1cHBvcnRlZERlcHRoU2l6ZXM7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbiwgbUxlbnNEaXN0b3J0aW9uOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgdm9pZCogICAgICAgICAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGU7CisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBtRGVwdGhQaG90b1Byb2Nlc3M7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBEZXB0aCBidWZmZXIgdGltZXN0YW1wcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXREZXB0aEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBKcGVnL0Jsb2IgYnVmZmVyIHRpbWVzdGFtcHMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0SnBlZ0J1ZmZlcnM7CisKKyAgICAvLyBNYXAgb2YgYWxsIGlucHV0IGZyYW1lcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQwZThiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDE3MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAidXRpbHMvRXhpZlV0aWxzLmgiCisjaW5jbHVkZSAiSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIgorI2luY2x1ZGUgIkhlaWNDb21wb3NpdGVTdHJlYW0uaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iSWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworSGVpY0NvbXBvc2l0ZVN0cmVhbTo6SGVpY0NvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCisgICAgICAgIG1Vc2VIZWljKGZhbHNlKSwKKyAgICAgICAgbU51bU91dHB1dFRpbGVzKDEpLAorICAgICAgICBtT3V0cHV0V2lkdGgoMCksCisgICAgICAgIG1PdXRwdXRIZWlnaHQoMCksCisgICAgICAgIG1NYXhIZWljQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbUdyaWRXaWR0aChIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZFdpZHRoKSwKKyAgICAgICAgbUdyaWRIZWlnaHQoSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRIZWlnaHQpLAorICAgICAgICBtR3JpZFJvd3MoMSksCisgICAgICAgIG1HcmlkQ29scygxKSwKKyAgICAgICAgbVVzZUdyaWQoZmFsc2UpLAorICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkKC0xKSwKKyAgICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQoLTEpLAorICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkKC0xKSwKKyAgICAgICAgbU1haW5JbWFnZVN1cmZhY2VJZCgtMSksCisgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAorICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnRlcigwKSwKKyAgICAgICAgbUdyaWRUaW1lc3RhbXBVcygwKSB7Cit9CisKK0hlaWNDb21wb3NpdGVTdHJlYW06On5IZWljQ29tcG9zaXRlU3RyZWFtKCkgeworICAgIC8vIENhbGwgZGVpbml0Q29kZWMgaW4gY2FzZSBzdHJlYW0gaGFzbid0IGJlZW4gZGVsZXRlZCB5ZXQgdG8gYXZvaWQgYW55CisgICAgLy8gbWVtb3J5L3Jlc291cmNlIGxlYWsuCisgICAgZGVpbml0Q29kZWMoKTsKKworICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5jbGVhcigpOworCisgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCA9IC0xOworICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gLTE7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci5jbGVhcigpOworICAgIG1BcHBTZWdtZW50U3VyZmFjZS5jbGVhcigpOworCisgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gLTE7CisgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IC0xOworICAgIG1NYWluSW1hZ2VDb25zdW1lci5jbGVhcigpOworICAgIG1NYWluSW1hZ2VTdXJmYWNlLmNsZWFyKCk7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50IGZvcm1hdDsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFzcGFjZTsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLCAmZGF0YXNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSAmJiAoZGF0YXNwYWNlID09IEhBTF9EQVRBU1BBQ0VfSEVJRikpOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8sIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXMgPSBpbml0aWFsaXplQ29kZWMod2lkdGgsIGhlaWdodCwgZGV2aWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgSEVJQy9IRVZDIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtQXBwU2VnbWVudFN0cmVhbSIpKTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICBtU3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOworCisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUFwcFNlZ21lbnRTdXJmYWNlLCBtQXBwU2VnbWVudE1heFNpemUsIDEsIGZvcm1hdCwKKyAgICAgICAgICAgIGtBcHBTZWdtZW50RGF0YVNwYWNlLCByb3RhdGlvbiwgJm1BcHBTZWdtZW50U3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBKUEVHIEFwcCBzZWdtZW50IHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZwcm9kdWNlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBzdXJmYWNlIGZvciBIZWljIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtSGV2Y0lucHV0WVVWU3RyZWFtIikpOworICAgIH0KKyAgICBtTWFpbkltYWdlU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIHJlcyA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IGNvZGVjOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludD4gc291cmNlU3VyZmFjZUlkOworICAgIC8vVXNlIFlVVl84ODggZm9ybWF0IGlmIGZyYW1ld29yayB0aWxpbmcgaXMgbmVlZGVkLgorICAgIGludCBzcmNTdHJlYW1GbXQgPSBtVXNlR3JpZCA/IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCA6CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obU1haW5JbWFnZVN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIHNyY1N0cmVhbUZtdCwga0hlaWZEYXRhU3BhY2UsCisgICAgICAgICAgICByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzb3VyY2VTdXJmYWNlSWQpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IHNvdXJjZVN1cmZhY2VJZFswXTsKKyAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gKmlkOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBtYWluIGltYWdlIHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICByZXMgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSEFMIG1haW4gaW1hZ2Ugc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpbml0Q29weVJvd0Z1bmN0aW9uKHdpZHRoKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSB7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBhdXRvIHJlcyA9IGpvaW4oKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGpvaW4gd2l0aCB0aGUgbWFpbiBwcm9jZXNzaW5nIHRocmVhZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBkZWluaXRDb2RlYygpOworCisgICAgaWYgKG1BcHBTZWdtZW50U3RyZWFtSWQgPj0gMCkgeworICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1BcHBTZWdtZW50U3RyZWFtSWQpOworICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaWYgKGJ1ZmZlckluZm8ubUVycm9yKSByZXR1cm47CisKKyAgICBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnB1c2goYnVmZmVySW5mby5tVGltZXN0YW1wKTsKK30KKworLy8gV2UgbmVlZCB0byBnZXQgdGhlIHNldHRpbmdzIGVhcmx5IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29kZWMgb3V0cHV0CisvLyBhcnJpdmVzIGVhcmxpZXIgdGhhbiByZXN1bHQgbWV0YWRhdGEuCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiSEVJQyBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAobUVycm9yU3RhdGUgfHwgKHN0cmVhbUlkICE9IGdldFN0cmVhbUlkKCkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVtcGxhY2UoZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpOworCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5OworCisgICAgaW50MzJfdCBvcmllbnRhdGlvbiA9IDA7CisgICAgZW50cnkgPSBzZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgb3JpZW50YXRpb24gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBpbnQzMl90IHF1YWxpdHkgPSBrRGVmYXVsdEpwZWdRdWFsaXR5OworICAgIGVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfUVVBTElUWSk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgcXVhbGl0eSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIG1TZXR0aW5nc0J5RnJhbWVOdW1iZXJbZnJhbWVOdW1iZXJdID0gc3RkOjptYWtlX3BhaXIob3JpZW50YXRpb24sIHF1YWxpdHkpOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGtBcHBTZWdtZW50RGF0YVNwYWNlKSkgeworICAgICAgICBBTE9HVigiJXM6IEpQRUcgQVBQIHNlZ21lbnRzIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0hlaWZEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBZVVZfODg4IGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFlVVl84ODggaW50ZXJuYWwgc3RyZWFtIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBIRVZDIHRpbGluZyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0WXV2QnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLykgeworICAgIGlmIChjb21wb3NpdGVPdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+Y2xlYXIoKTsKKworICAgIGJvb2wgdXNlR3JpZCwgdXNlSGVpYzsKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZCA9IGlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoCisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgJnVzZUhlaWMsICZ1c2VHcmlkLCBudWxscHRyKTsKKyAgICBpZiAoIWlzU2l6ZVN1cHBvcnRlZCkgeworICAgICAgICAvLyBTaXplIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZWl0aGVyIGVuY29kZXIuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmluc2VydChjb21wb3NpdGVPdXRwdXQtPmVuZCgpLCAyLCBzdHJlYW1JbmZvKTsKKworICAgIC8vIEpQRUcgQVBQUyBzZWdtZW50cyBCbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLndpZHRoID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNoKTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uaGVpZ2h0ID0gMTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9COworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5kYXRhU3BhY2UgPSBrQXBwU2VnbWVudERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIC8vIFlVVi9JTVBMRU1FTlRBVElPTl9ERUZJTkVEIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmZvcm1hdCA9IHVzZUdyaWQgPyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODggOgorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5kYXRhU3BhY2UgPSBrSGVpZkRhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IHVzZUhlaWMgPyBHUkFMTE9DX1VTQUdFX0hXX0lNQUdFX0VOQ09ERVIgOgorICAgICAgICAgICAgdXNlR3JpZCA/IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCkgeworICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyJiBoZWljTWFuYWdlciA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgcmV0dXJuIGhlaWNNYW5hZ2VyLmlzU2l6ZVN1cHBvcnRlZCh3aWR0aCwgaGVpZ2h0LCB1c2VIZWljLCB1c2VHcmlkLCBzdGFsbCk7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNJbk1lbW9yeVRlbXBGaWxlU3VwcG9ydGVkKCkgeworICAgIGludCBtZW1mZCA9IHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsICJIRUlGLXRyeS1tZW1mZCIsIE1GRF9DTE9FWEVDKTsKKyAgICBpZiAobWVtZmQgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVOT1NZUykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHRtcGZzIGZpbGUuIGVycm5vICVkIiwgX19GVU5DVElPTl9fLCBlcnJubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjbG9zZShtZW1mZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyYgb3V0cHV0QnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBBTE9HVigiJXM6IGluZGV4ICVkLCBvZmZzZXQgJWQsIHNpemUgJWQsIHRpbWUgJSIgUFJJZDY0ICIsIGZsYWdzIDB4JXgiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXRCdWZmZXJJbmZvLmluZGV4LCBvdXRwdXRCdWZmZXJJbmZvLm9mZnNldCwKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8uc2l6ZSwgb3V0cHV0QnVmZmVySW5mby50aW1lVXMsIG91dHB1dEJ1ZmZlckluZm8uZmxhZ3MpOworCisgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICBpZiAoKG91dHB1dEJ1ZmZlckluZm8uc2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKChvdXRwdXRCdWZmZXJJbmZvLmZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpID09IDApKSB7CisgICAgICAgICAgICBtQ29kZWNPdXRwdXRCdWZmZXJzLnB1c2hfYmFjayhvdXRwdXRCdWZmZXJJbmZvKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlckluZm8uaW5kZXgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlckluZm8uaW5kZXgpOworICAgIH0KK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNJbnB1dEZyYW1lQXZhaWxhYmxlKGludDMyX3QgaW5kZXgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICBBTE9HRSgiJXM6IENvZGVjIFlVViBpbnB1dCBtb2RlIG11c3Qgb25seSBiZSB1c2VkIGZvciBIZXZjIHRpbGluZyBtb2RlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Db2RlY0lucHV0QnVmZmVycy5wdXNoX2JhY2soaW5kZXgpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY0Zvcm1hdENoYW5nZWQoc3A8QU1lc3NhZ2U+JiBuZXdGb3JtYXQpIHsKKyAgICBpZiAobmV3Rm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBuZXdGb3JtYXQgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBBU3RyaW5nIG1pbWVIZWljKE1JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbmV3Rm9ybWF0LT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSk7CisgICAgaWYgKG1pbWUgIT0gbWltZUhlaWMpIHsKKyAgICAgICAgLy8gRm9yIEhFVkMgY29kZWMsIGJlbG93IGtleXMgbmVlZCB0byBiZSBmaWxsZWQgb3V0IG9yIG92ZXJ3cml0dGVuIHNvIHRoYXQgdGhlCisgICAgICAgIC8vIG11eGVyIGNhbiBoYW5kbGUgdGhlbSBhcyBIRUlDIG91dHB1dCBpbWFnZS4KKyAgICAgICAgbmV3Rm9ybWF0LT5zZXRTdHJpbmcoS0VZX01JTUUsIG1pbWVIZWljKTsKKyAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsIG1PdXRwdXRXaWR0aCk7CisgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0hFSUdIVCwgbU91dHB1dEhlaWdodCk7CisgICAgICAgIGlmIChtVXNlR3JpZCkgeworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9XSURUSCwgbUdyaWRXaWR0aCk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX0hFSUdIVCwgbUdyaWRIZWlnaHQpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9ST1dTLCBtR3JpZFJvd3MpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCBtR3JpZENvbHMpOworICAgICAgICB9CisgICAgfQorICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0lTX0RFRkFVTFQsIDEgLyppc1ByaW1hcnkqLyk7CisKKyAgICBpbnQzMl90IGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICBpZiAobmV3Rm9ybWF0LT5maW5kSW50MzIoS0VZX0dSSURfUk9XUywgJmdyaWRSb3dzKSAmJgorICAgICAgICAgICAgbmV3Rm9ybWF0LT5maW5kSW50MzIoS0VZX0dSSURfQ09MVU1OUywgJmdyaWRDb2xzKSkgeworICAgICAgICBtTnVtT3V0cHV0VGlsZXMgPSBncmlkUm93cyAqIGdyaWRDb2xzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1OdW1PdXRwdXRUaWxlcyA9IDE7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBtTnVtT3V0cHV0VGlsZXMgaXMgJXp1IiwgX19GVU5DVElPTl9fLCBtTnVtT3V0cHV0VGlsZXMpOworICAgIG1Gb3JtYXQgPSBuZXdGb3JtYXQ7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljQ29kZWNFcnJvcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIG1FcnJvclN0YXRlID0gdHJ1ZTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29uZmlndXJlU3RyZWFtKCkgeworICAgIGlmIChpc1J1bm5pbmcoKSkgeworICAgICAgICAvLyBQcm9jZXNzaW5nIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmFsaWQgb3V0cHV0IHN1cmZhY2Ugc2V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gcmVzID0gbU91dHB1dFN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBLCBtUHJvZHVjZXJMaXN0ZW5lcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3cgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobU91dHB1dFN1cmZhY2UuZ2V0KCksIEhBTF9QSVhFTF9GT1JNQVRfQkxPQikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3cgKmFud0NvbnN1bWVyID0gbU91dHB1dFN1cmZhY2UuZ2V0KCk7CisgICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKKyAgICBpZiAoKHJlcyA9IGFud0NvbnN1bWVyLT5xdWVyeShhbndDb25zdW1lciwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICAmbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIENhbm5vdCB1c2UgU291cmNlU3VyZmFjZSBidWZmZXIgY291bnQgc2luY2UgaXQgY291bGQgYmUgY29kZWMncyA1MTIqNTEyIHRpbGUKKyAgICAvLyBidWZmZXIgY291bnQuCisgICAgaW50IG1heFByb2R1Y2VyQnVmZmVycyA9IDE7CisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCisgICAgICAgICAgICAgICAgICAgIGFud0NvbnN1bWVyLCBtYXhQcm9kdWNlckJ1ZmZlcnMgKyBtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYW53Q29uc3VtZXIsIG1NYXhIZWljQnVmZmVyU2l6ZSwgMSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgZGltZW5zaW9uICV6dSB4IDEgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTWF4SGVpY0J1ZmZlclNpemUsIG1NYWluSW1hZ2VTdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcnVuKCJIZWljQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCisgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgeworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1BcHBTZWdtZW50U3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUFwcFNlZ21lbnRTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1BcHBTZWdtZW50U3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21BcHBTZWdtZW50U3RyZWFtSWRdLnB1c2hfYmFjayhtQXBwU2VnbWVudFN1cmZhY2VJZCk7CisKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtTWFpbkltYWdlU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbU1haW5JbWFnZVN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttTWFpbkltYWdlU3RyZWFtSWRdLnB1c2hfYmFjayhtTWFpbkltYWdlU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbU1haW5JbWFnZVN0cmVhbUlkOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVNldHRpbmdzQnlGcmFtZU51bWJlci5maW5kKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgIT0gbVNldHRpbmdzQnlGcmFtZU51bWJlci5lbmQoKSkgeworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZW1wbGFjZShyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCk7CisgICAgICAgIG1TZXR0aW5nc0J5VGltZXN0YW1wW3RpbWVzdGFtcF0gPSBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyW3Jlc3VsdEV4dHJhcy5mcmFtZU51bWJlcl07CisgICAgICAgIG1TZXR0aW5nc0J5RnJhbWVOdW1iZXIuZXJhc2UocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OmNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKSB7CisgICAgd2hpbGUgKCFtU2V0dGluZ3NCeVRpbWVzdGFtcC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtU2V0dGluZ3NCeVRpbWVzdGFtcC5iZWdpbigpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ub3JpZW50YXRpb24gPSBpdC0+c2Vjb25kLmZpcnN0OworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ucXVhbGl0eSA9IGl0LT5zZWNvbmQuc2Vjb25kOworICAgICAgICBtU2V0dGluZ3NCeVRpbWVzdGFtcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lbXB0eSgpICYmICFtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtQXBwU2VnbWVudENvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbm90IG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgocmVzICE9IE9LKSB8fCAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApKSB7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIEpQRUdfQVBQX1NFR01FTlRTIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEV4cGVjdGluZyBKUEVHX0FQUF9TRUdNRU5UUyBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5hcHBTZWdtZW50QnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0WXV2QnVmZmVycy5lbXB0eSgpICYmICFtWXV2QnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRZdXZCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbU1haW5JbWFnZUNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbm90IG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBZVVZfODg4IGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0WXV2QnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcgWVVWXzg4OCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiByZWNlaXZlZCBidWZmZXIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLnl1dkJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0WXV2QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1Db2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgLy8gQml0c3RyZWFtIGJ1ZmZlciB0aW1lc3RhbXAgZG9lc24ndCBuZWNlc3NhcmlseSBkaXJlY3RseSBjb3JyZWxhdGUgd2l0aCBpbnB1dAorICAgICAgICAvLyBidWZmZXIgdGltZXN0YW1wLiBBc3N1bWUgZW5jb2RlciBpbnB1dCB0byBvdXRwdXQgaXMgRklGTywgdXNlIGEgcXVldWUKKyAgICAgICAgLy8gdG8gbG9vayB1cCB0aW1lc3RhbXAuCisgICAgICAgIGludDY0X3QgYnVmZmVyVGltZSA9IC0xOworICAgICAgICBpZiAobUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGJ1ZmZlciB0aW1lc3RhbXAgZm9yIGNvZGVjIG91dHB1dCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERpcmVjdCBtYXBwaW5nIGJldHdlZW4gY2FtZXJhIHRpbWVzdGFtcCAoaW4gbnMpIGFuZCBjb2RlYyB0aW1lc3RhbXAgKGluIHVzKS4KKyAgICAgICAgICAgIGJ1ZmZlclRpbWUgPSBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLmZyb250KCk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnRlcisrOworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJDb3VudGVyID09IG1OdW1PdXRwdXRUaWxlcykgeworICAgICAgICAgICAgICAgIG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMucG9wKCk7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50ZXIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2J1ZmZlclRpbWVdLmNvZGVjT3V0cHV0QnVmZmVycy5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgfQorICAgICAgICBtQ29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1GcmFtZU51bWJlck1hcC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtRnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+c2Vjb25kXS5mcmFtZU51bWJlciA9IGl0LT5maXJzdDsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1DYXB0dXJlUmVzdWx0cy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2FwdHVyZVJlc3VsdHMuYmVnaW4oKTsKKyAgICAgICAgLy8gTmVnYXRpdmUgdGltZXN0YW1wIGluZGljYXRlcyB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyB0aGUgY2FwdHVyZSByZXN1bHQKKyAgICAgICAgLy8gY29sbGVjdGlvbiBwcm9jZXNzLgorICAgICAgICBpZiAoaXQtPmZpcnN0ID49IDApIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0uZnJhbWVOdW1iZXIgPT0gc3RkOjpnZXQ8MD4oaXQtPnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ucmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q2FtZXJhTWV0YWRhdGE+KHN0ZDo6Z2V0PDE+KGl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYXB0dXJlIHJlc3VsdCBmcmFtZU51bWJlci90aW1lc3RhbXAgbWFwcGluZyBjaGFuZ2VkIGJldHdlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInNodXR0ZXIgYW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICAvLyBtRXJyb3JGcmFtZU51bWJlcnMgc3RvcmVzIGZyYW1lIG51bWJlciBvZiBkcm9wcGVkIGJ1ZmZlcnMuCisgICAgYXV0byBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtRXJyb3JGcmFtZU51bWJlcnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBmcmFtZUZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byAmaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lLnNlY29uZC5mcmFtZU51bWJlciA9PSAqaXQpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLnNlY29uZC5lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgZnJhbWVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVGb3VuZCkgeworICAgICAgICAgICAgaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBOb3QgYWJsZSB0byBmaW5kIGZhaWxpbmcgaW5wdXQgd2l0aCBmcmFtZSBudW1iZXI6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAqaXQpOworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERpc3RyaWJ1dGUgY29kZWMgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgb3V0IGZyb20gWVVWIG91dHB1dAorICAgIGZvciAoYXV0byBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkgJiYgbUNvZGVjSW5wdXRCdWZmZXJzLnNpemUoKSA+IDA7IGl0KyspIHsKKyAgICAgICAgSW5wdXRGcmFtZSYgaW5wdXRGcmFtZShpdC0+c2Vjb25kKTsKKyAgICAgICAgaWYgKGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIgPCBtR3JpZFJvd3MgKiBtR3JpZENvbHMpIHsKKyAgICAgICAgICAgIC8vIEF2YWlsYWJsZSBpbnB1dCB0aWxlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIGN1cnJlbnQgaW5wdXQKKyAgICAgICAgICAgIC8vIGltYWdlLgorICAgICAgICAgICAgc2l6ZV90IG5ld0lucHV0VGlsZXMgPSBzdGQ6Om1pbihtQ29kZWNJbnB1dEJ1ZmZlcnMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBtR3JpZFJvd3MgKiBtR3JpZENvbHMgLSBpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3SW5wdXRUaWxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ29kZWNJbnB1dEJ1ZmZlckluZm8gaW5wdXRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgbUNvZGVjSW5wdXRCdWZmZXJzWzBdLCBtR3JpZFRpbWVzdGFtcFVzKyssIGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIgfTsKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbnB1dEluZm8pOworCisgICAgICAgICAgICAgICAgbUNvZGVjSW5wdXRCdWZmZXJzLmVyYXNlKG1Db2RlY0lucHV0QnVmZmVycy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLykgeworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGJvb2wgYXBwU2VnbWVudFJlYWR5ID0gKGl0LnNlY29uZC5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAhaXQuc2Vjb25kLmFwcFNlZ21lbnRXcml0dGVuICYmIGl0LnNlY29uZC5yZXN1bHQgIT0gbnVsbHB0cjsKKyAgICAgICAgYm9vbCBjb2RlY091dHB1dFJlYWR5ID0gIWl0LnNlY29uZC5jb2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKTsKKyAgICAgICAgYm9vbCBjb2RlY0lucHV0UmVhZHkgPSAoaXQuc2Vjb25kLnl1dkJ1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgKCFpdC5zZWNvbmQuY29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKSk7CisgICAgICAgIGlmICgoIWl0LnNlY29uZC5lcnJvcikgJiYKKyAgICAgICAgICAgICAgICAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSAmJgorICAgICAgICAgICAgICAgIChhcHBTZWdtZW50UmVhZHkgfHwgY29kZWNPdXRwdXRSZWFkeSB8fCBjb2RlY0lucHV0UmVhZHkpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdJbnB1dEF2YWlsYWJsZTsKK30KKworaW50NjRfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKSB7CisgICAgaW50NjRfdCByZXMgPSAtMTsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoaXQuc2Vjb25kLmVycm9yICYmICFpdC5zZWNvbmQuZXJyb3JOb3RpZmllZCAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgcmVzID0gaXQuc2Vjb25kLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBib29sIGFwcFNlZ21lbnRSZWFkeSA9IGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICFpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuICYmIGlucHV0RnJhbWUucmVzdWx0ICE9IG51bGxwdHI7CisgICAgYm9vbCBjb2RlY091dHB1dFJlYWR5ID0gaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuc2l6ZSgpID4gMDsKKyAgICBib29sIGNvZGVjSW5wdXRSZWFkeSA9IGlucHV0RnJhbWUueXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAhaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpOworCisgICAgaWYgKCFhcHBTZWdtZW50UmVhZHkgJiYgIWNvZGVjT3V0cHV0UmVhZHkgJiYgIWNvZGVjSW5wdXRSZWFkeSkgeworICAgICAgICBBTE9HVygiJXM6IE5vIHZhbGlkIGFwcFNlZ21lbnRCdWZmZXIvY29kZWMgaW5wdXQvb3V0cHV0QnVmZmVyIGF2YWlsYWJsZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGlucHV0cyBmb3IgSGV2YyB0aWxpbmcKKyAgICBpZiAoY29kZWNJbnB1dFJlYWR5KSB7CisgICAgICAgIHJlcyA9IHByb2Nlc3NDb2RlY0lucHV0RnJhbWUoaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgY29kZWMgaW5wdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgYW5kIHN0YXJ0IG11eGVyIGlmIG5vdCB5ZXQgZG9uZSBzbworICAgIGlmIChpbnB1dEZyYW1lLm11eGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmVzID0gc3RhcnRNdXhlckZvcklucHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGFuZCBzdGFydCBtdXhlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JpdGUgSlBFRyBBUFAgc2VnbWVudHMgZGF0YSB0byB0aGUgbXV4ZXIuCisgICAgaWYgKGFwcFNlZ21lbnRSZWFkeSAmJiBpbnB1dEZyYW1lLm11eGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0FwcFNlZ21lbnQodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBKUEVHIEFQUCBzZWdtZW50czogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JpdGUgbWVkaWEgY29kZWMgYml0c3RyZWFtIGJ1ZmZlcnMgdG8gbXV4ZXIuCisgICAgd2hpbGUgKCFpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJlcyA9IHByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgY29kZWMgb3V0cHV0IGZyYW1lOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiAmJiBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSB7CisgICAgICAgIHJlcyA9IHByb2Nlc3NDb21wbGV0ZWRJbnB1dEZyYW1lKHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgY29tcGxldGVkIGlucHV0IGZyYW1lOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpzdGFydE11eGVyRm9ySW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgIGlmIChpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBObyBzaW5nbGUgY29kZWMgb3V0cHV0IGJ1ZmZlciBoYXMgYmVlbiBnZW5lcmF0ZWQuIENvbnRpbnVlIHRvCisgICAgICAgIC8vIHdhaXQuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG91dHB1dEFOVy0+ZGVxdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgJmlucHV0RnJhbWUuYW5iLCAmaW5wdXRGcmFtZS5mZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmV0cmlldmluZyBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIENvbWJpbmUgY3VycmVudCB0aHJlYWQgaWQsIHN0cmVhbSBpZCBhbmQgdGltZXN0YW1wIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGltYWdlLgorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0ZW1wT3V0cHV0RmlsZTsKKyAgICB0ZW1wT3V0cHV0RmlsZSA8PCAiSEVJRi0iIDw8IHB0aHJlYWRfc2VsZigpIDw8ICItIgorICAgICAgICAgICAgPDwgZ2V0U3RyZWFtSWQoKSA8PCAiLSIgPDwgdGltZXN0YW1wOworICAgIGlucHV0RnJhbWUuZmlsZUZkID0gc3lzY2FsbChfX05SX21lbWZkX2NyZWF0ZSwgdGVtcE91dHB1dEZpbGUuc3RyKCkuY19zdHIoKSwgTUZEX0NMT0VYRUMpOworICAgIGlmIChpbnB1dEZyYW1lLmZpbGVGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGZpbGUgJXMuIEVycm9yIG5vIGlzICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRGaWxlLnN0cigpLmNfc3RyKCksIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlucHV0RnJhbWUubXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihpbnB1dEZyYW1lLmZpbGVGZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9IRUlGKTsKKyAgICBpZiAoaW5wdXRGcmFtZS5tdXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBNZWRpYU11eGVyIGZvciBmaWxlIGZkICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlucHV0RnJhbWUuZmlsZUZkKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+c2V0T3JpZW50YXRpb25IaW50KGlucHV0RnJhbWUub3JpZW50YXRpb24pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0T3JpZW50YXRpb25IaW50OiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICAvLyBTZXQgZW5jb2RlciBxdWFsaXR5CisgICAgeworICAgICAgICBzcDxBTWVzc2FnZT4gcXVhbGl0eVBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcXVhbGl0eVBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBpbnB1dEZyYW1lLnF1YWxpdHkpOworICAgICAgICByZXMgPSBtQ29kZWMtPnNldFBhcmFtZXRlcnMocXVhbGl0eVBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBjb2RlYyBxdWFsaXR5OiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzc2l6ZV90IHRyYWNrSWQgPSBpbnB1dEZyYW1lLm11eGVyLT5hZGRUcmFjayhtRm9ybWF0KTsKKyAgICBpZiAodHJhY2tJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkVHJhY2sgdG8gdGhlIG11eGVyOiAlemQiLCBfX0ZVTkNUSU9OX18sIHRyYWNrSWQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLnRyYWNrSW5kZXggPSB0cmFja0lkOworICAgIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID0gbU51bU91dHB1dFRpbGVzOworCisgICAgcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IE1lZGlhTXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzQXBwU2VnbWVudChuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHNpemVfdCBhcHAxU2l6ZSA9IDA7CisgICAgYXV0byBhcHBTZWdtZW50U2l6ZSA9IGZpbmRBcHBTZWdtZW50c1NpemUoaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEsCisgICAgICAgICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIud2lkdGggKiBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuaGVpZ2h0LAorICAgICAgICAgICAgJmFwcDFTaXplKTsKKyAgICBBTE9HVigiJXM6IGFwcFNlZ21lbnRTaXplIGlzICV6dSwgd2lkdGggJWQsIGhlaWdodCAlZCwgYXBwMVNpemUgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGFwcFNlZ21lbnRTaXplLCBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIud2lkdGgsCisgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmhlaWdodCwgYXBwMVNpemUpOworICAgIGlmIChhcHBTZWdtZW50U2l6ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgSlBFRyBBUFAgc2VnbWVudCBzaXplIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gZXhpZlV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgIGF1dG8gZXhpZlJlcyA9IGV4aWZVdGlscy0+aW5pdGlhbGl6ZShpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSwgYXBwMVNpemUpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIEV4aWZVdGlscyBvYmplY3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+c2V0RnJvbU1ldGFkYXRhKCppbnB1dEZyYW1lLnJlc3VsdCwgbVN0YXRpY0luZm8sCisgICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgRXhpZiB0YWdzIHVzaW5nIG1ldGFkYXRhIGFuZCBtYWluIGltYWdlIHNpemVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+c2V0T3JpZW50YXRpb24oaW5wdXRGcmFtZS5vcmllbnRhdGlvbik7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRXhpZlV0aWxzIGZhaWxlZCB0byBzZXQgb3JpZW50YXRpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5nZW5lcmF0ZUFwcDEoKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFeGlmVXRpbHMgZmFpbGVkIHRvIGdlbmVyYXRlIEFQUDEgc2VnbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IG5ld0FwcDFMZW5ndGggPSBleGlmVXRpbHMtPmdldEFwcDFMZW5ndGgoKTsKKyAgICBjb25zdCB1aW50OF90ICpuZXdBcHAxU2VnbWVudCA9IGV4aWZVdGlscy0+Z2V0QXBwMUJ1ZmZlcigpOworCisgICAgLy9Bc3NlbWJsZSB0aGUgQVBQMSBtYXJrZXIgYnVmZmVyIHJlcXVpcmVkIGJ5IE1lZGlhQ29kZWMKKyAgICB1aW50OF90IGtFeGlmQXBwMU1hcmtlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgMHhGRiwgMHhFMSwgMHgwMCwgMHgwMH07CisgICAga0V4aWZBcHAxTWFya2VyWzZdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3QXBwMUxlbmd0aCA+PiA4KTsKKyAgICBrRXhpZkFwcDFNYXJrZXJbN10gPSBzdGF0aWNfY2FzdDx1aW50OF90PihuZXdBcHAxTGVuZ3RoICYgMHhGRik7CisgICAgc2l6ZV90IGFwcFNlZ21lbnRCdWZmZXJTaXplID0gc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKworICAgICAgICAgICAgYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSArIG5ld0FwcDFMZW5ndGg7CisgICAgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciA9IG5ldyB1aW50OF90W2FwcFNlZ21lbnRCdWZmZXJTaXplXTsKKyAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciwga0V4aWZBcHAxTWFya2VyLCBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSk7CisgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSwgbmV3QXBwMVNlZ21lbnQsIG5ld0FwcDFMZW5ndGgpOworICAgIGlmIChhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplID4gMCkgeworICAgICAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgbmV3QXBwMUxlbmd0aCwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSArIGFwcDFTaXplLCBhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYXBwU2VnbWVudEJ1ZmZlciwgYXBwU2VnbWVudEJ1ZmZlclNpemUpOworICAgIGF1dG8gcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+d3JpdGVTYW1wbGVEYXRhKGFCdWZmZXIsIGlucHV0RnJhbWUudHJhY2tJbmRleCwKKyAgICAgICAgICAgIHRpbWVzdGFtcCwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfTVVYRVJfREFUQSk7CisgICAgZGVsZXRlW10gYXBwU2VnbWVudEJ1ZmZlcjsKKworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgSlBFRyBBUFAgc2VnbWVudHMgdG8gbXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudFdyaXR0ZW4gPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBmb3IgKGF1dG8mIGlucHV0QnVmZmVyIDogaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycykgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIGF1dG8gcmVzID0gbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlci5pbmRleCwgJmJ1ZmZlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgZ2V0dGluZyBjb2RlYyBpbnB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb25lIHRpbGUgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uCisgICAgICAgIHNpemVfdCB0aWxlWCA9IGlucHV0QnVmZmVyLnRpbGVJbmRleCAlIG1HcmlkQ29sczsKKyAgICAgICAgc2l6ZV90IHRpbGVZID0gaW5wdXRCdWZmZXIudGlsZUluZGV4IC8gbUdyaWRDb2xzOworICAgICAgICBzaXplX3QgdG9wID0gbUdyaWRIZWlnaHQgKiB0aWxlWTsKKyAgICAgICAgc2l6ZV90IGxlZnQgPSBtR3JpZFdpZHRoICogdGlsZVg7CisgICAgICAgIHNpemVfdCB3aWR0aCA9ICh0aWxlWCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1HcmlkQ29scykgLSAxKSA/CisgICAgICAgICAgICAgICAgbU91dHB1dFdpZHRoIC0gdGlsZVggKiBtR3JpZFdpZHRoIDogbUdyaWRXaWR0aDsKKyAgICAgICAgc2l6ZV90IGhlaWdodCA9ICh0aWxlWSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1HcmlkUm93cykgLSAxKSA/CisgICAgICAgICAgICAgICAgbU91dHB1dEhlaWdodCAtIHRpbGVZICogbUdyaWRIZWlnaHQgOiBtR3JpZEhlaWdodDsKKyAgICAgICAgQUxPR1YoIiVzOiBpbnB1dEJ1ZmZlciB0aWxlSW5kZXggWyV6dSwgJXp1XSwgdG9wICV6dSwgbGVmdCAlenUsIHdpZHRoICV6dSwgaGVpZ2h0ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aWxlWCwgdGlsZVksIHRvcCwgbGVmdCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgcmVzID0gY29weU9uZVl1dlRpbGUoYnVmZmVyLCBpbnB1dEZyYW1lLnl1dkJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29weSBZVVYgdGlsZSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIuaW5kZXgsIDAsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci50aW1lVXMsIDAsIG51bGxwdHIgLyplcnJvckRldGFpbE1zZyovKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWVJbnB1dEJ1ZmZlciB0byBDb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXIoaXQtPmluZGV4LCAmYnVmZmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgZ2V0dGluZyBIZWljIGNvZGVjIG91dHB1dCBidWZmZXIgYXQgaW5kZXggJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIZWljIGNvZGVjIG91dHB1dCBidWZmZXIgYXQgaW5kZXggJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT53cml0ZVNhbXBsZURhdGEoCisgICAgICAgICAgICBhQnVmZmVyLCBpbnB1dEZyYW1lLnRyYWNrSW5kZXgsIHRpbWVzdGFtcCwgMCAvKmZsYWdzKi8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgYnVmZmVyIGluZGV4ICVkIHRvIG11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGl0LT5pbmRleCk7CisgICAgaWYgKGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb2RlYyBnZW5lcmF0ZWQgbW9yZSB0aWxlcyB0aGFuIGV4cGVjdGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMtLTsKKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NDb21wbGV0ZWRJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgaW5wdXRGcmFtZS5tdXhlci0+c3RvcCgpOworCisgICAgLy8gQ29weSB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBtZW1vcnkuCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2IgPSBHcmFwaGljQnVmZmVyOjpmcm9tKGlucHV0RnJhbWUuYW5iKTsKKyAgICB2b2lkKiBkc3RCdWZmZXI7CisgICAgYXV0byByZXMgPSBnYi0+bG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZkc3RCdWZmZXIsIGlucHV0RnJhbWUuZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgb2ZmX3QgZlNpemUgPSBsc2VlayhpbnB1dEZyYW1lLmZpbGVGZCwgMCwgU0VFS19FTkQpOworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGZTaXplKSA+IG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBNZWRpYU11eGVyIG91dHB1dCBzaXplICVsZCBpcyBsYXJnZXIgdGhhbiBidWZmZXIgc2l6ZXIgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZTaXplLCBtTWF4SGVpY0J1ZmZlclNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGxzZWVrKGlucHV0RnJhbWUuZmlsZUZkLCAwLCBTRUVLX1NFVCk7CisgICAgc3NpemVfdCBieXRlc1JlYWQgPSByZWFkKGlucHV0RnJhbWUuZmlsZUZkLCBkc3RCdWZmZXIsIGZTaXplKTsKKyAgICBpZiAoYnl0ZXNSZWFkIDwgZlNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBPbmx5ICV6ZCBvZiAlbGQgYnl0ZXMgcmVhZCIsIF9fRlVOQ1RJT05fXywgYnl0ZXNSZWFkLCBmU2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY2xvc2UoaW5wdXRGcmFtZS5maWxlRmQpOworICAgIGlucHV0RnJhbWUuZmlsZUZkID0gLTE7CisKKyAgICAvLyBGaWxsIGluIEhFSUMgaGVhZGVyCisgICAgdWludDhfdCAqaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRzdEJ1ZmZlcikgKyBtTWF4SGVpY0J1ZmZlclNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYik7CisgICAgc3RydWN0IENhbWVyYUJsb2IgKmJsb2JIZWFkZXIgPSAoc3RydWN0IENhbWVyYUJsb2IgKiloZWFkZXI7CisgICAgLy8gTXVzdCBiZSBpbiBzeW5jIHdpdGggQ0FNRVJBM19IRUlDX0JMT0JfSUQgaW4gYW5kcm9pZF9tZWRpYV9VdGlscy5jcHAKKyAgICBibG9iSGVhZGVyLT5ibG9iSWQgPSBzdGF0aWNfY2FzdDxDYW1lcmFCbG9iSWQ+KDB4MDBGRSk7CisgICAgYmxvYkhlYWRlci0+YmxvYlNpemUgPSBmU2l6ZTsKKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1PdXRwdXRTdXJmYWNlLmdldCgpLCB0aW1lc3RhbXApOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ2V0U3RyZWFtSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gb3V0cHV0QU5XLT5xdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgaW5wdXRGcmFtZS5hbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWV1ZUJ1ZmZlciB0byBIZWljIHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5hbmIgPSBudWxscHRyOworCisgICAgQVRSQUNFX0FTWU5DX0VORCgiSEVJQyBjYXB0dXJlIiwgaW5wdXRGcmFtZS5mcmFtZU51bWJlcik7CisgICAgcmV0dXJuIE9LOworfQorCisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKSB7CisgICAgaWYgKGlucHV0RnJhbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlICghaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IGlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICBBTE9HVigiJXM6IHJlbGVhc2VPdXRwdXRCdWZmZXIgaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCk7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpdC0+aW5kZXgpOworICAgICAgICBpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPnl1dkJ1ZmZlcik7CisgICAgICAgIGlucHV0RnJhbWUtPnl1dkJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKCFpbnB1dEZyYW1lLT5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLT5jb2RlY0lucHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICBpbnB1dEZyYW1lLT5jb2RlY0lucHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgaWYgKChpbnB1dEZyYW1lLT5lcnJvciB8fCBtRXJyb3JTdGF0ZSkgJiYgIWlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQpIHsKKyAgICAgICAgbm90aWZ5RXJyb3IoaW5wdXRGcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+ZmlsZUZkID49IDApIHsKKyAgICAgICAgY2xvc2UoaW5wdXRGcmFtZS0+ZmlsZUZkKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZmlsZUZkID0gLTE7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmFuYiAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgaW5wdXRGcmFtZS0+YW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICBpbnB1dEZyYW1lLT5hbmIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpIHsKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPD0gY3VycmVudFRzKSB7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmaXQtPnNlY29uZCk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aW5pdGlhbGl6ZUNvZGVjKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBjYW1lcmFEZXZpY2UpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgYm9vbCB1c2VHcmlkID0gZmFsc2U7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAmbVVzZUhlaWMsICZ1c2VHcmlkLCBudWxscHRyKTsKKyAgICBpZiAoIWlzU2l6ZVN1cHBvcnRlZCkgeworICAgICAgICBBTE9HRSgiJXM6IEVuY29kZXIgZG9lc250JyBzdXBwb3J0IHNpemUgJXUgeCAldSEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIExvb3BlciBmb3IgTWVkaWFDb2RlYy4KKyAgICBhdXRvIGRlc2lyZWRNaW1lID0gbVVzZUhlaWMgPyBNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgOiBNSU1FVFlQRV9WSURFT19IRVZDOworICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLU1lZGlhQ29kZWNMb29wZXIiKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWNMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICBmYWxzZSwgICAgLy8gY2FuQ2FsbEphdmEKKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IGNvZGVjIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIEhFSUMvSEVWQyBjb2RlYy4KKyAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobUNvZGVjTG9vcGVyLCBkZXNpcmVkTWltZSwgdHJ1ZSAvKmVuY29kZXIqLyk7CisgICAgaWYgKG1Db2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGRlc2lyZWRNaW1lKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIExvb3BlciBhbmQgaGFuZGxlciBmb3IgQ29kZWMgY2FsbGJhY2suCisgICAgbUNvZGVjQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIGlmIChtQ29kZWNDYWxsYmFja0hhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgY2FsbGJhY2sgaGFuZGxlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1DYWxsYmFja0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYWxsYmFja0xvb3Blci0+c2V0TmFtZSgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLU1lZGlhQ29kZWNDYWxsYmFja0xvb3BlciIpOworICAgIHJlcyA9IG1DYWxsYmFja0xvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAgICAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgbWVkaWEgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbUNhbGxiYWNrTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjQ2FsbGJhY2tIYW5kbGVyKTsKKworICAgIG1Bc3luY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENhbGxiYWNrTm90aWZ5LCBtQ29kZWNDYWxsYmFja0hhbmRsZXIpOworICAgIHJlcyA9IG1Db2RlYy0+c2V0Q2FsbGJhY2sobUFzeW5jTm90aWZ5KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBNZWRpYUNvZGVjIGNhbGxiYWNrOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIENyZWF0ZSBvdXRwdXQgZm9ybWF0IGFuZCBjb25maWd1cmUgdGhlIENvZGVjLgorICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldFN0cmluZyhLRVlfTUlNRSwgZGVzaXJlZE1pbWUpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0JJVFJBVEVfTU9ERSwgQklUUkFURV9NT0RFX0NRKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9RVUFMSVRZLCBrRGVmYXVsdEpwZWdRdWFsaXR5KTsKKyAgICAvLyBBc2sgY29kZWMgdG8gc2tpcCB0aW1lc3RhbXAgY2hlY2sgYW5kIGVuY29kZSBhbGwgZnJhbWVzLgorICAgIG91dHB1dEZvcm1hdC0+c2V0SW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCBrTm9GcmFtZURyb3BNYXhQdHNHYXApOworCisgICAgaW50MzJfdCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICBpZiAodXNlR3JpZCB8fCBtVXNlSGVpYykgeworICAgICAgICBncmlkV2lkdGggPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZFdpZHRoOworICAgICAgICBncmlkSGVpZ2h0ID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRIZWlnaHQ7CisgICAgICAgIGdyaWRSb3dzID0gKGhlaWdodCArIGdyaWRIZWlnaHQgLSAxKS9ncmlkSGVpZ2h0OworICAgICAgICBncmlkQ29scyA9ICh3aWR0aCArIGdyaWRXaWR0aCAtIDEpL2dyaWRXaWR0aDsKKworICAgICAgICBpZiAobVVzZUhlaWMpIHsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfV0lEVEgsIGdyaWRXaWR0aCk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX0hFSUdIVCwgZ3JpZEhlaWdodCk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX0NPTFVNTlMsIGdyaWRDb2xzKTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgZ3JpZFJvd3MpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBncmlkV2lkdGggPSB3aWR0aDsKKyAgICAgICAgZ3JpZEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgZ3JpZFJvd3MgPSAxOworICAgICAgICBncmlkQ29scyA9IDE7CisgICAgfQorCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsICF1c2VHcmlkID8gd2lkdGggOiBncmlkV2lkdGgpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0hFSUdIVCwgIXVzZUdyaWQgPyBoZWlnaHQgOiBncmlkSGVpZ2h0KTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAwKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsCisgICAgICAgICAgICB1c2VHcmlkID8gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9GUkFNRV9SQVRFLCBncmlkUm93cyAqIGdyaWRDb2xzKTsKKyAgICAvLyBUaGlzIG9ubHkgc2VydmVzIGFzIGEgaGludCB0byBlbmNvZGVyIHdoZW4gZW5jb2RpbmcgaXMgbm90IHJlYWwtdGltZS4KKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9PUEVSQVRJTkdfUkFURSwgdXNlR3JpZCA/IGtHcmlkT3BSYXRlIDoga05vR3JpZE9wUmF0ZSk7CisKKyAgICByZXMgPSBtQ29kZWMtPmNvbmZpZ3VyZShvdXRwdXRGb3JtYXQsIG51bGxwdHIgLypuYXRpdmVXaW5kb3cqLywKKyAgICAgICAgICAgIG51bGxwdHIgLypjcnlwdG8qLywgQ09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYzogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtR3JpZFdpZHRoID0gZ3JpZFdpZHRoOworICAgIG1HcmlkSGVpZ2h0ID0gZ3JpZEhlaWdodDsKKyAgICBtR3JpZFJvd3MgPSBncmlkUm93czsKKyAgICBtR3JpZENvbHMgPSBncmlkQ29sczsKKyAgICBtVXNlR3JpZCA9IHVzZUdyaWQ7CisgICAgbU91dHB1dFdpZHRoID0gd2lkdGg7CisgICAgbU91dHB1dEhlaWdodCA9IGhlaWdodDsKKyAgICBtQXBwU2VnbWVudE1heFNpemUgPSBjYWxjQXBwU2VnbWVudE1heFNpemUoY2FtZXJhRGV2aWNlLT5pbmZvKCkpOworICAgIG1NYXhIZWljQnVmZmVyU2l6ZSA9IG1PdXRwdXRXaWR0aCAqIG1PdXRwdXRIZWlnaHQgKiAzIC8gMiArIG1BcHBTZWdtZW50TWF4U2l6ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpkZWluaXRDb2RlYygpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChtQ29kZWMgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29kZWMtPnN0b3AoKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtQ29kZWNMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29kZWNMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUNvZGVjTG9vcGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFja0xvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFja0xvb3Blci0+c3RvcCgpOworICAgICAgICBtQ2FsbGJhY2tMb29wZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtQXN5bmNOb3RpZnkuY2xlYXIoKTsKKyAgICBtRm9ybWF0LmNsZWFyKCk7Cit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBhcHAgc2VnbWVudCwgMCBpbmRpY2F0ZXMgZmFpbHVyZQorc2l6ZV90IEhlaWNDb21wb3NpdGVTdHJlYW06OmZpbmRBcHBTZWdtZW50c1NpemUoY29uc3QgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IG1heFNpemUsIHNpemVfdCAqYXBwMVNlZ21lbnRTaXplKSB7CisgICAgaWYgKGFwcFNlZ21lbnRCdWZmZXIgPT0gbnVsbHB0ciB8fCBhcHAxU2VnbWVudFNpemUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgYXBwU2VnbWVudEJ1ZmZlciAlcCwgYXBwMVNlZ21lbnRTaXplICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFwcFNlZ21lbnRCdWZmZXIsIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSAwOworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBFWElGIHRyYW5zcG9ydCBoZWFkZXIgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gYXBwU2VnbWVudEJ1ZmZlciArIChtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSk7CisgICAgY29uc3Qgc3RydWN0IENhbWVyYUJsb2IgKmJsb2IgPSAoY29uc3Qgc3RydWN0IENhbWVyYUJsb2IqKShoZWFkZXIpOworICAgIGlmIChibG9iLT5ibG9iSWQgIT0gQ2FtZXJhQmxvYklkOjpKUEVHX0FQUF9TRUdNRU5UUykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgRVhJRiBibG9iSWQgJWh1IiwgX19GVU5DVElPTl9fLCBibG9iLT5ibG9iSWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBleHBlY3RlZFNpemUgPSBibG9iLT5ibG9iU2l6ZTsKKyAgICBpZiAoZXhwZWN0ZWRTaXplID09IDAgfHwgZXhwZWN0ZWRTaXplID4gbWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGJsb2JTaXplICV6dS4iLCBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IDA7CisKKyAgICAvLyBWZXJpZnkgQVBQMSBtYXJrZXIgKG1hbmRhdG9yeSkKKyAgICB1aW50OF90IGFwcDFNYXJrZXJbXSA9IHsweEZGLCAweEUxfTsKKyAgICBpZiAobWVtY21wKGFwcFNlZ21lbnRCdWZmZXIsIGFwcDFNYXJrZXIsIHNpemVvZihhcHAxTWFya2VyKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEFQUDEgbWFya2VyOiAleCwgJXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclswXSwgYXBwU2VnbWVudEJ1ZmZlclsxXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0b3RhbFNpemUgKz0gc2l6ZW9mKGFwcDFNYXJrZXIpOworCisgICAgdWludDE2X3QgYXBwMVNpemUgPSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSkgPDwgOCkgKworICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV07CisgICAgdG90YWxTaXplICs9IGFwcDFTaXplOworCisgICAgQUxPR1YoIiVzOiBFeHBlY3RlZCBBUFAgc2VnbWVudHMgc2l6ZSAlenUsIEFQUDEgc2VnbWVudCBzaXplICV1IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXhwZWN0ZWRTaXplLCBhcHAxU2l6ZSk7CisgICAgd2hpbGUgKHRvdGFsU2l6ZSA8IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICBpZiAoYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdICE9IDB4RkYgfHwKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSA8PSAweEUxIHx8CisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0gPiAweEVGKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIEFQUG4gbWFya2VyCisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgQVBQbiBtYXJrZXI6ICV4LCAleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdLCBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbFNpemUgKz0gMjsKKworICAgICAgICB1aW50MTZfdCBhcHBuU2l6ZSA9IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV07CisgICAgICAgIHRvdGFsU2l6ZSArPSBhcHBuU2l6ZTsKKyAgICB9CisKKyAgICBpZiAodG90YWxTaXplICE9IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSlBFRyBBUFAgc2VnbWVudHM6IHRvdGFsU2l6ZSAldSB2cyBleHBlY3RlZCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0b3RhbFNpemUsIGV4cGVjdGVkU2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICphcHAxU2VnbWVudFNpemUgPSBhcHAxU2l6ZSArIHNpemVvZihhcHAxTWFya2VyKTsKKyAgICByZXR1cm4gZXhwZWN0ZWRTaXplOworfQorCitpbnQ2NF90IEhlaWNDb21wb3NpdGVTdHJlYW06OmZpbmRUaW1lc3RhbXBJbk5zTG9ja2VkKGludDY0X3QgdGltZUluVXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZuIDogbUZyYW1lTnVtYmVyTWFwKSB7CisgICAgICAgIGlmICh0aW1lSW5VcyA9PSBuczJ1cyhmbi5zZWNvbmQpKSB7CisgICAgICAgICAgICByZXR1cm4gZm4uc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKHRpbWVJblVzID09IG5zMnVzKGlucHV0RnJhbWUuZmlyc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRGcmFtZS5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNvcHlPbmVZdXZUaWxlKHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBjb2RlY0J1ZmZlciwKKyAgICAgICAgY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciYgeXV2QnVmZmVyLAorICAgICAgICBzaXplX3QgdG9wLCBzaXplX3QgbGVmdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIC8vIEdldCBzdHJpZGUgaW5mb3JtYXRpb24gZm9yIGNvZGVjQnVmZmVyCisgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgIGlmICghY29kZWNCdWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29kZWMgaW5wdXQgYnVmZmVyIGlzIG5vdCBmb3IgaW1hZ2UgZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaW1hZ2VEYXRhLT5zaXplKCkgIT0gc2l6ZW9mKE1lZGlhSW1hZ2UyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29kZWMgaW5wdXQgaW1hZ2Ugc2l6ZSAlenUsIGV4cGVjdGVkICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbWFnZURhdGEtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE1lZGlhSW1hZ2UyKiBpbWFnZUluZm8gPSByZWludGVycHJldF9jYXN0PE1lZGlhSW1hZ2UyKj4oaW1hZ2VEYXRhLT5kYXRhKCkpOworICAgIGlmIChpbWFnZUluZm8tPm1UeXBlICE9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGggIT0gOCB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGhBbGxvY2F0ZWQgIT0gOCB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tTnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvZGVjIGlucHV0IGltYWdlIGluZm86IG1UeXBlICVkLCBtQml0RGVwdGggJWQsICIKKyAgICAgICAgICAgICAgICAibUJpdERlcHRoQWxsb2NhdGVkICVkLCBtTnVtUGxhbmVzICVkISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1UeXBlLCBpbWFnZUluZm8tPm1CaXREZXB0aCwKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aEFsbG9jYXRlZCwgaW1hZ2VJbmZvLT5tTnVtUGxhbmVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IHl1dkJ1ZmZlciBjaHJvbWFTdGVwICVkLCBjaHJvbWFTdHJpZGUgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB5dXZCdWZmZXIuY2hyb21hU3RlcCwgeXV2QnVmZmVyLmNocm9tYVN0cmlkZSk7CisgICAgQUxPR1YoIiVzOiBVIG9mZnNldCAldSwgViBvZmZzZXQgJXUsIFUgcm93SW5jICVkLCBWIHJvd0luYyAlZCwgVSBjb2xJbmMgJWQsIFYgY29sSW5jICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jKTsKKworICAgIC8vIFkKKyAgICBmb3IgKGF1dG8gcm93ID0gdG9wOyByb3cgPCB0b3AraGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldLm1PZmZzZXQgKworICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXS5tUm93SW5jICogKHJvdyAtIHRvcCk7CisgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGErcm93Knl1dkJ1ZmZlci5zdHJpZGUrbGVmdCwgZHN0LCB3aWR0aCk7CisgICAgfQorCisgICAgLy8gVSBpcyBDYiwgViBpcyBDcgorICAgIGJvb2wgY29kZWNVUGxhbmVGaXJzdCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ID4KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0OworICAgIHVpbnQzMl90IGNvZGVjVXZPZmZzZXREaWZmID0gY29kZWNVUGxhbmVGaXJzdCA/CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCAtIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0IDoKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0IC0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQ7CisgICAgYm9vbCBpc0NvZGVjVXZTZW1pcGxhbm5hciA9IChjb2RlY1V2T2Zmc2V0RGlmZiA9PSAxKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jID09CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYykgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyA9PSAyKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jID09IDIpOworICAgIGJvb2wgaXNDb2RlY1V2UGxhbm5hciA9CisgICAgICAgICAgICAoKGNvZGVjVVBsYW5lRmlyc3QgJiYgY29kZWNVdk9mZnNldERpZmYgPj0KKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiBpbWFnZUluZm8tPm1IZWlnaHQvMikgfHwKKyAgICAgICAgICAgICgoIWNvZGVjVVBsYW5lRmlyc3QgJiYgY29kZWNVdk9mZnNldERpZmYgPj0KKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiBpbWFnZUluZm8tPm1IZWlnaHQvMikpKSAmJgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgPT0gMTsKKyAgICBib29sIGNhbWVyYVVQbGFuZUZpcnN0ID0geXV2QnVmZmVyLmRhdGFDciA+IHl1dkJ1ZmZlci5kYXRhQ2I7CisKKyAgICBpZiAoaXNDb2RlY1V2U2VtaXBsYW5uYXIgJiYgeXV2QnVmZmVyLmNocm9tYVN0ZXAgPT0gMiAmJgorICAgICAgICAgICAgKGNvZGVjVVBsYW5lRmlyc3QgPT0gY2FtZXJhVVBsYW5lRmlyc3QpKSB7CisgICAgICAgIC8vIFVWIHNlbWlwbGFubmFyCisgICAgICAgIC8vIFRoZSBjaHJvbWUgcGxhbmUgY291bGQgYmUgZWl0aGVyIENiIGZpcnN0LCBvciBDciBmaXJzdC4gVGFrZSB0aGUKKyAgICAgICAgLy8gc21hbGxlciBhZGRyZXNzLgorICAgICAgICB1aW50OF90ICpzcmMgPSBzdGQ6Om1pbih5dXZCdWZmZXIuZGF0YUNiLCB5dXZCdWZmZXIuZGF0YUNyKTsKKyAgICAgICAgTWVkaWFJbWFnZTI6OlBsYW5lSW5kZXggZHN0UGxhbmUgPSBjb2RlY1V2T2Zmc2V0RGlmZiA+IDAgPyBNZWRpYUltYWdlMjo6VSA6IE1lZGlhSW1hZ2UyOjpWOworICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW2RzdFBsYW5lXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbZHN0UGxhbmVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyhzcmMrcm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdCwgZHN0LCB3aWR0aCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzQ29kZWNVdlBsYW5uYXIgJiYgeXV2QnVmZmVyLmNocm9tYVN0ZXAgPT0gMSkgeworICAgICAgICAvLyBVIHBsYW5lCisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhQ2Ircm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdC8yLCBkc3QsIHdpZHRoLzIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gViBwbGFuZQorICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YUNyK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQvMiwgZHN0LCB3aWR0aC8yKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBzZW1pcGxhbm5hciBhbmQgcGxhbm5hciwgb3Igd2hlbiBVViBvcmRlcnMgYXJlCisgICAgICAgIC8vIGRpZmZlcmVudC4KKyAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKTsKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb2wgPSBsZWZ0LzI7IGNvbCA8IChsZWZ0K3dpZHRoKS8yOyBjb2wrKykgeworICAgICAgICAgICAgICAgIC8vIFUvQ2IKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRzdEluZGV4ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jICogKGNvbCAtIGxlZnQvMik7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNJbmRleCA9IHJvdyAqIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUgKyB5dXZCdWZmZXIuY2hyb21hU3RlcCAqIGNvbDsKKyAgICAgICAgICAgICAgICBkc3RbZHN0SW5kZXhdID0geXV2QnVmZmVyLmRhdGFDYltzcmNJbmRleF07CisKKyAgICAgICAgICAgICAgICAvLyBWL0NyCisgICAgICAgICAgICAgICAgZHN0SW5kZXggPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIChyb3cgLSB0b3AvMikgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgKiAoY29sIC0gbGVmdC8yKTsKKyAgICAgICAgICAgICAgICBzcmNJbmRleCA9IHJvdyAqIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUgKyB5dXZCdWZmZXIuY2hyb21hU3RlcCAqIGNvbDsKKyAgICAgICAgICAgICAgICBkc3RbZHN0SW5kZXhdID0geXV2QnVmZmVyLmRhdGFDcltzcmNJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRDb3B5Um93RnVuY3Rpb24oaW50MzJfdCB3aWR0aCkKK3sKKyAgICB1c2luZyBuYW1lc3BhY2UgbGlieXV2OworCisgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfQzsKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX1NTRTIpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNTU0UyKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgMzIpID8gQ29weVJvd19TU0UyIDogQ29weVJvd19BbnlfU1NFMjsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX0FWWCkKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc0FWWCkpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDY0KSA/IENvcHlSb3dfQVZYIDogQ29weVJvd19BbnlfQVZYOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfRVJNUykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc0VSTVMpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X0VSTVM7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19ORU9OKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzTkVPTikpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDMyKSA/IENvcHlSb3dfTkVPTiA6IENvcHlSb3dfQW55X05FT047CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19NSVBTKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzTUlQUykpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfTUlQUzsKKyAgICB9CisjZW5kaWYKK30KKworc2l6ZV90IEhlaWNDb21wb3NpdGVTdHJlYW06OmNhbGNBcHBTZWdtZW50TWF4U2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbykgeworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gaW5mby5maW5kKEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCk7CisgICAgc2l6ZV90IG1heEFwcHNTZWdtZW50ID0gMTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIG1heEFwcHNTZWdtZW50ID0gZW50cnkuZGF0YS51OFswXSA8IDEgPyAxIDoKKyAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID4gMTYgPyAxNiA6IGVudHJ5LmRhdGEudThbMF07CisgICAgfQorICAgIHJldHVybiBtYXhBcHBzU2VnbWVudCAqICgyICsgMHhGRkZGKSArIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYik7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6dGhyZWFkTG9vcCgpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmIChtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBsYW5kZWQgaW4gZXJyb3Igc3RhdGUsIHJldHVybiBhbnkgcGVuZGluZyBidWZmZXJzIGFuZAorICAgICAgICAgICAgLy8gaGFsdCBhbGwgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworCisgICAgICAgIHdoaWxlICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZhaWxpbmdGcmFtZU51bWJlciA9IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxpbmdGcmFtZU51bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBlcmFzZSAnbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdJyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHR3byBpbnRlcm5hbCBzdHJlYW0gYnVmZmVycyB0byBmYWlsLiBJbiBzdWNoIHNjZW5hcmlvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgc3RyZWFtIHNob3VsZCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCBhIHN0cmVhbSBidWZmZXIgZXJyb3Igb25seQorICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgd2l0aGluICdlcnJvck5vdGlmaWVkJy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHByZXNlbnQgZmFpbGVkIGlucHV0IGZyYW1lcyB3aWxsIGJlIHJlbW92ZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gJ3JlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpJy4KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJm1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHJldCA9IG1JbnB1dFJlYWR5Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtXYWl0RHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgd2FpdCBvbiBjb25kaXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBwcm9jZXNzSW5wdXRGcmFtZShjdXJyZW50VHMsIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHByb2Nlc3NpbmcgZnJhbWUgd2l0aCB0aW1lc3RhbXA6ICUiIFBSSXU2NCAiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGN1cnJlbnRUcywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5lcnJvciA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5lcnJvciB8fAorICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5hcHBTZWdtZW50V3JpdHRlbiAmJgorICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSkgeworICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmVzID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUFwcFNlZ21lbnRTdHJlYW1JZCkgfHwKKyAgICAgICAgICAgIChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtTWFpbkltYWdlU3RyZWFtSWQpKSB7CisgICAgICAgIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmVzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gRm9yIHJlc3VsdCBlcnJvciwgc2luY2UgdGhlIEFQUFNfU0VHTUVOVCBidWZmZXIgYWxyZWFkeSBjb250YWlucyBFWElGLAorICAgIC8vIHNpbXBseSBza2lwIHVzaW5nIHRoZSBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSB0byBvdmVycmlkZSBFWElGLgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IC0xOworICAgIGZvciAoY29uc3QgYXV0byYgZm4gOiBtRnJhbWVOdW1iZXJNYXApIHsKKyAgICAgICAgaWYgKGZuLmZpcnN0ID09IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgeworICAgICAgICAgICAgdGltZXN0YW1wID0gZm4uc2Vjb25kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gaW5wdXRGcmFtZS5maXJzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lc3RhbXAgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBzaHV0dGVyIHRpbWVzdGFtcCBmb3IgcmVzdWx0IGVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZSh0aW1lc3RhbXAsIHN0ZDo6bWFrZV90dXBsZShyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpKTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpDb2RlY0NhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxIZWljQ29tcG9zaXRlU3RyZWFtPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHJldHVybjsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENhbGxiYWNrTm90aWZ5OiB7CisgICAgICAgICAgICAgaW50MzJfdCBjYklEOworICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNhbGxiYWNrSUQiLCAmY2JJRCkpIHsKKyAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNhbGxiYWNrSUQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIEFMT0dWKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYklEID0gJWQiLCBjYklEKTsKKworICAgICAgICAgICAgIHN3aXRjaCAoY2JJRCkgeworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0lOUFVUX0FWQUlMQUJMRTogeworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9JTlBVVF9BVkFJTEFCTEU6IGluZGV4IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNJbnB1dEZyYW1lQXZhaWxhYmxlKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IG9mZnNldCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBzaXplIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogdGltZVVzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGZsYWdzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBDb2RlY091dHB1dEJ1ZmZlckluZm8gYnVmZmVySW5mbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZsYWdzfTsKKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNPdXRwdXRGcmFtZUF2YWlsYWJsZShidWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDogZm9ybWF0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0Zvcm1hdENoYW5nZWQoZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9FUlJPUjogeworICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlOworICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogZXJyIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWN0aW9uIiwgJmFjdGlvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBhY3Rpb24gaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVycm9yKDB4JXgpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0NvZGVjRXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNhbGxiYWNrSUQoJWQpIGlzIHVuZXhwZWN0ZWQuIiwgY2JJRCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2hvdWxkbid0IGJlIGhlcmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTNjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8cXVldWU+CisKKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBIZWljQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBIZWljQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkhlaWNDb21wb3NpdGVTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdm9pZCBvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgZ2V0U3RyZWFtSWQoKSBvdmVycmlkZSB7IHJldHVybiBtTWFpbkltYWdlU3RyZWFtSWQ7IH0KKworICAgIC8vIFVzZSBvblNodXR0ZXIgdG8ga2VlcCB0cmFjayBvZiBmcmFtZSBudW1iZXIgPC0+IHRpbWVzdGFtcCBtYXBwaW5nLgorICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCisgICAgLy8gQ3B1Q29uc3VtZXIgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm4gc3RyZWFtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLyk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpOworICAgIHN0YXRpYyBib29sIGlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8KKyAgICAvLyBIRUlDL0hFVkMgQ29kZWMgcmVsYXRlZCBzdHJ1Y3R1cmVzLCB1dGlsaXR5IGZ1bmN0aW9ucywgYW5kIGNhbGxiYWNrcworICAgIC8vCisgICAgc3RydWN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICB9OworCisgICAgc3RydWN0IENvZGVjSW5wdXRCdWZmZXJJbmZvIHsKKyAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHNpemVfdCB0aWxlSW5kZXg7CisgICAgfTsKKworICAgIGNsYXNzIENvZGVjQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCkgeworICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHByaXZhdGU6CisgICAgICAgIHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IG1QYXJlbnQ7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdENhbGxiYWNrTm90aWZ5LAorICAgIH07CisKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSGVpYzsKKyAgICBzcDxNZWRpYUNvZGVjPiAgICBtQ29kZWM7CisgICAgc3A8QUxvb3Blcj4gICAgICAgbUNvZGVjTG9vcGVyLCBtQ2FsbGJhY2tMb29wZXI7CisgICAgc3A8Q29kZWNDYWxsYmFja0hhbmRsZXI+IG1Db2RlY0NhbGxiYWNrSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gICAgICBtQXN5bmNOb3RpZnk7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICAgICAgICBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICBpbnQzMl90ICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplOworICAgIGludDMyX3QgICAgICAgICAgIG1HcmlkV2lkdGgsIG1HcmlkSGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1HcmlkUm93cywgbUdyaWRDb2xzOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VHcmlkOyAvLyBXaGV0aGVyIHRvIHVzZSBmcmFtZXdvcmsgWVVWIGZyYW1lIHRpbGluZy4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtOb0ZyYW1lRHJvcE1heFB0c0dhcCA9IC0xMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOb0dyaWRPcFJhdGUgPSAzMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrR3JpZE9wUmF0ZSA9IDEyMDsKKworICAgIHZvaWQgb25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBidWZmZXJJbmZvKTsKKyAgICB2b2lkIG9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7ICAvLyBPbmx5IGNhbGxlZCBmb3IgWVVWIGlucHV0IG1vZGUuCisgICAgdm9pZCBvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KTsKKyAgICB2b2lkIG9uSGVpY0NvZGVjRXJyb3IoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSk7CisgICAgdm9pZCBkZWluaXRDb2RlYygpOworCisgICAgLy8KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrcy4KKyAgICAvLworICAgIHN0cnVjdCBJbnB1dEZyYW1lIHsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBxdWFsaXR5OworCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBjb2RlY091dHB1dEJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFNZXRhZGF0YT4gICAgcmVzdWx0OworCisgICAgICAgIC8vIEZpZWxkcyB0aGF0IGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEVWQyB0aWxpbmcuCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgeXV2QnVmZmVyOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0lucHV0QnVmZmVySW5mbz4gIGNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBzcDxNZWRpYU11eGVyPiAgICAgICAgICAgIG11eGVyOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlRmQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsZUZkOworICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXg7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgICAgICAgKmFuYjsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRXcml0dGVuOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdPdXRwdXRUaWxlczsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBjb2RlY0lucHV0Q291bnRlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBvcmllbnRhdGlvbigwKSwgcXVhbGl0eShrRGVmYXVsdEpwZWdRdWFsaXR5KSwgZXJyb3IoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5vdGlmaWVkKGZhbHNlKSwgZnJhbWVOdW1iZXIoLTEpLCBmZW5jZUZkKC0xKSwgZmlsZUZkKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleCgtMSksIGFuYihudWxscHRyKSwgYXBwU2VnbWVudFdyaXR0ZW4oZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXMoMCksIGNvZGVjSW5wdXRDb3VudGVyKDApIHsgfQorICAgIH07CisKKyAgICB2b2lkIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAvLyBGaW5kIGZpcnN0IGNvbXBsZXRlIGFuZCB2YWxpZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcAorICAgIGJvb2wgZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pOworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKworICAgIHN0YXR1c190IHByb2Nlc3NJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQXBwU2VnbWVudChuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NDb21wbGV0ZWRJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcyk7CisKKyAgICBzaXplX3QgZmluZEFwcFNlZ21lbnRzU2l6ZShjb25zdCB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCogYXBwMVNlZ21lbnRTaXplKTsKKyAgICBpbnQ2NF90IGZpbmRUaW1lc3RhbXBJbk5zTG9ja2VkKGludDY0X3QgdGltZUluVXMpOworICAgIHN0YXR1c190IGNvcHlPbmVZdXZUaWxlKHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBjb2RlY0J1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCB0b3AsIHNpemVfdCBsZWZ0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOworICAgIHZvaWQgaW5pdENvcHlSb3dGdW5jdGlvbihpbnQzMl90IHdpZHRoKTsKKyAgICBzdGF0aWMgc2l6ZV90IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbyk7CisKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRKcGVnUXVhbGl0eSA9IDk5OworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtKcGVnRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9KRklGOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrQXBwU2VnbWVudERhdGFTcGFjZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUyk7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtIZWlmRGF0YVNwYWNlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpOworCisgICAgaW50ICAgICAgICAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCwgbUFwcFNlZ21lbnRTdXJmYWNlSWQ7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbUFwcFNlZ21lbnRDb25zdW1lcjsKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtQXBwU2VnbWVudFN1cmZhY2U7CisgICAgYm9vbCAgICAgICAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZDsKKyAgICBzaXplX3QgICAgICAgICAgICBtQXBwU2VnbWVudE1heFNpemU7CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgbVN0YXRpY0luZm87CisKKyAgICBpbnQgICAgICAgICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQsIG1NYWluSW1hZ2VTdXJmYWNlSWQ7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbU1haW5JbWFnZVN1cmZhY2U7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbU1haW5JbWFnZUNvbnN1bWVyOyAvLyBPbmx5IGFwcGxpY2FibGUgZm9yIEhFVkMgY29kZWMuCisgICAgYm9vbCAgICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkOyAvLyBPbmx5IGFwcGxpY2FibGUgdG8gSEVWQyBjb2RlYworCisgICAgc3A8U3VyZmFjZT4gICAgICAgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKworICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byBKUEVHIHNldHRpbmcgb2Ygb3JpZW50YXRpb24rcXVhbGl0eQorICAgIHN0ZDo6bWFwPGludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gbVNldHRpbmdzQnlGcmFtZU51bWJlcjsKKyAgICAvLyBNYXAgZnJvbSB0aW1lc3RhbXAgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5VGltZXN0YW1wOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgQVBQIHNlZ21lbnQgQmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBIRUlDIGJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gbUNvZGVjT3V0cHV0QnVmZmVyczsKKyAgICBzdGQ6OnF1ZXVlPGludDY0X3Q+IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHM7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudGVyOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgWXV2IGJ1ZmZlciBwZW5kaW5nIHRpbGluZyBhbmQgZW5jb2RpbmcgKGZvciBIRVZDIFlVViB0aWxpbmcgb25seSkKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRZdXZCdWZmZXJzOworICAgIC8vIEtlZXAgYWxsIGNvZGVjIGlucHV0IGJ1ZmZlcnMgcmVhZHkgdG8gYmUgZmlsbGVkIG91dCAoZm9yIEhFVkMgWVVWIHRpbGluZyBvbmx5KQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1Db2RlY0lucHV0QnVmZmVyczsKKworICAgIC8vIEFydGlmaWNpYWwgc3RyaWN0bHkgaW5jcmVtZW50YWwgWVVWIGdyaWQgdGltZXN0YW1wIHRvIG1ha2UgZW5jb2RlciBoYXBweS4KKyAgICBpbnQ2NF90IG1HcmlkVGltZXN0YW1wVXM7CisKKyAgICAvLyBJbiBtb3N0IGNvbW1vbiB1c2UgY2FzZSwgZW50cmllcyBhcmUgYWNjZXNzZWQgaW4gb3JkZXIuCisgICAgc3RkOjptYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKKworICAgIC8vIEZ1bmN0aW9uIHBvaW50ZXIgb2YgbGlieXV2IHJvdyBjb3B5LgorICAgIHZvaWQgKCptRm5Db3B5Um93KShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHdpZHRoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIZWljRW5jb2RlckluZm9NYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxyZWdleD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpIDoKKyAgICAgICAgbUlzSW5pdGVkKGZhbHNlKSwKKyAgICAgICAgbU1pblNpemVIZWljKDAsIDApLAorICAgICAgICBtTWF4U2l6ZUhlaWMoSU5UMzJfTUFYLCBJTlQzMl9NQVgpLAorICAgICAgICBtSGFzSEVWQyhmYWxzZSksCisgICAgICAgIG1IYXNIRUlDKGZhbHNlKSwKKyAgICAgICAgbURpc2FibGVHcmlkKGZhbHNlKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSA9PSBPSykgeworICAgICAgICBtSXNJbml0ZWQgPSB0cnVlOworICAgIH0KK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6fkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKSB7Cit9CisKK2Jvb2wgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6aXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBib29sKiB1c2VIZWljLAorICAgICAgICBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCkgY29uc3QgeworICAgIGlmICh1c2VIZWljID09IG51bGxwdHIgfHwgdXNlR3JpZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBwYXJhbWV0ZXJzOiB1c2VIZWljICVwLCB1c2VHcmlkICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVzZUhlaWMsIHVzZUdyaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbUlzSW5pdGVkKSByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGNob29zZUhlaWMgPSBmYWxzZSwgZW5hYmxlR3JpZCA9IHRydWU7CisgICAgaWYgKG1IYXNIRUlDICYmIHdpZHRoID49IG1NaW5TaXplSGVpYy5maXJzdCAmJgorICAgICAgICAgICAgaGVpZ2h0ID49IG1NaW5TaXplSGVpYy5zZWNvbmQgJiYgd2lkdGggPD0gbU1heFNpemVIZWljLmZpcnN0ICYmCisgICAgICAgICAgICBoZWlnaHQgPD0gbU1heFNpemVIZWljLnNlY29uZCkgeworICAgICAgICBjaG9vc2VIZWljID0gdHJ1ZTsKKyAgICAgICAgZW5hYmxlR3JpZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAobUhhc0hFVkMpIHsKKyAgICAgICAgYm9vbCBmdWxsU2l6ZVN1cHBvcnRlZEJ5SGV2YyA9ICh3aWR0aCA+PSBtTWluU2l6ZUhldmMuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPj0gbU1pblNpemVIZXZjLnNlY29uZCAmJgorICAgICAgICAgICAgICAgIHdpZHRoIDw9IG1NYXhTaXplSGV2Yy5maXJzdCAmJgorICAgICAgICAgICAgICAgIGhlaWdodCA8PSBtTWF4U2l6ZUhldmMuc2Vjb25kKTsKKyAgICAgICAgaWYgKGZ1bGxTaXplU3VwcG9ydGVkQnlIZXZjICYmIChtRGlzYWJsZUdyaWQgfHwKKyAgICAgICAgICAgICAgICAod2lkdGggPD0gMTkyMCAmJiBoZWlnaHQgPD0gMTA4MCkpKSB7CisgICAgICAgICAgICBlbmFibGVHcmlkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBlbmNvZGVyIGF2YWlsYWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YWxsICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRmluZCBwcmVmZXJyZWQgZW5jb2RlciB3aGljaCBhZHZlcnRpc2UKKyAgICAgICAgLy8gIm1lYXN1cmVkLWZyYW1lLXJhdGUtV0lEVEh4SEVJR0hULXJhbmdlIiBrZXkuCisgICAgICAgIGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMgPQorICAgICAgICAgICAgICAgIChjaG9vc2VIZWljICYmIG1IZWljRnJhbWVSYXRlTWFwcy5zaXplKCkgPiAwKSA/CisgICAgICAgICAgICAgICAgbUhlaWNGcmFtZVJhdGVNYXBzIDogbUhldmNGcmFtZVJhdGVNYXBzOworICAgICAgICBjb25zdCBhdXRvJiBjbG9zZXN0U2l6ZSA9IGZpbmRDbG9zZXN0U2l6ZShtYXBzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGNsb3Nlc3RTaXplID09IG1hcHMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSAibWVhc3VyZWQtZnJhbWUtcmF0ZS1XSURUSHhIRUlHSFQtcmFuZ2UiIGtleSBpcyBvcHRpb25hbC4KKyAgICAgICAgICAgIC8vIEhhcmRjb2RlIHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSAoMy4zM21zICogdGlsZSBjb3VudCkgYmFzZWQgb24gcmVzb2x1dGlvbi4KKyAgICAgICAgICAgICpzdGFsbCA9IDMzMzMzMzNMTCAqIHdpZHRoICogaGVpZ2h0IC8gKGtHcmlkV2lkdGggKiBrR3JpZEhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcml2ZSBzdGFsbCBkdXJhdGlvbnMgYmFzZWQgb24gYXZlcmFnZSBmcHMgb2YgdGhlIGNsb3Nlc3Qgc2l6ZS4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgTlNFQ19QRVJfU0VDID0gMTAwMDAwMDAwMExMOworICAgICAgICBpbnQzMl90IGF2Z0ZwcyA9IChjbG9zZXN0U2l6ZS0+c2Vjb25kLmZpcnN0ICsgY2xvc2VzdFNpemUtPnNlY29uZC5zZWNvbmQpLzI7CisgICAgICAgIGZsb2F0IHJhdGlvID0gMS4wZiAqIHdpZHRoICogaGVpZ2h0IC8KKyAgICAgICAgICAgICAgICAoY2xvc2VzdFNpemUtPmZpcnN0LmZpcnN0ICogY2xvc2VzdFNpemUtPmZpcnN0LnNlY29uZCk7CisgICAgICAgICpzdGFsbCA9IHJhdGlvICogTlNFQ19QRVJfU0VDIC8gYXZnRnBzOworICAgIH0KKworICAgICp1c2VIZWljID0gY2hvb3NlSGVpYzsKKyAgICAqdXNlR3JpZCA9IGVuYWJsZUdyaWQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmluaXRpYWxpemUoKSB7CisgICAgbURpc2FibGVHcmlkID0gcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5oZWljLmRpc2FibGVfZ3JpZCIsIGZhbHNlKTsKKyAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoY29kZWNzTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIE5vIG1lZGlhIGNvZGVjIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBoZWljRGV0YWlscyA9IGdldENvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIHNwPEFNZXNzYWdlPiBoZXZjRGV0YWlscyA9IGdldENvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKworICAgIGlmIChoZXZjRGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSBtdXN0IHN1cHBvcnQgSEVWQyBjb2RlYyBpZiBIRUlDIGNvZGVjIGlzIGF2YWlsYWJsZSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gQ2hlY2sgQ1EgbW9kZSBmb3IgSEVWQyBjb2RlYworICAgIHsKKyAgICAgICAgQVN0cmluZyBiaXRyYXRlTW9kZXM7CisgICAgICAgIGF1dG8gaGFzSXRlbSA9IGhldmNEZXRhaWxzLT5maW5kU3RyaW5nKCJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCAmYml0cmF0ZU1vZGVzKTsKKyAgICAgICAgaWYgKCFoYXNJdGVtKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWVyeSBiaXRyYXRlIG1vZGVzIGZvciBIRVZDIGNvZGVjIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiBIRVZDIGNvZGVjJ3MgZmVhdHVyZS1iaXRyYXRlLW1vZGVzIHZhbHVlIGlzICVkLCAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoYXNJdGVtLCBiaXRyYXRlTW9kZXMuY19zdHIoKSk7CisgICAgICAgIHN0ZDo6cmVnZXggcGF0dGVybigiKF58LClDUSgkfCwpIiwgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgaWYgKCFzdGQ6OnJlZ2V4X3NlYXJjaChiaXRyYXRlTW9kZXMuY19zdHIoKSwgcGF0dGVybikpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEhFSUMgc2l6ZSByYW5nZQorICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICAgICAgICAgIGhlaWNEZXRhaWxzLCAmbU1pblNpemVIZWljLCAmbU1heFNpemVIZWljLCAmbUhlaWNGcmFtZVJhdGVNYXBzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEhFSUMgY29kZWMgc2l6ZSByYW5nZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1IYXNIRUlDID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBIRVZDIHNpemUgcmFuZ2UKKyAgICB7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICAgICBoZXZjRGV0YWlscywgJm1NaW5TaXplSGV2YywgJm1NYXhTaXplSGV2YywgJm1IZXZjRnJhbWVSYXRlTWFwcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBIRVZDIGNvZGVjIHNpemUgcmFuZ2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIG1IYXNIRVZDID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEZyYW1lUmF0ZU1hcHMoc3A8QU1lc3NhZ2U+IGRldGFpbHMsIEZyYW1lUmF0ZU1hcHMqIG1hcHMpIHsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyIHx8IG1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IGRldGFpbHM6ICVwLCBtYXBzOiAlcCIsIF9fRlVOQ1RJT05fXywgZGV0YWlscy5nZXQoKSwgbWFwcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXRhaWxzLT5jb3VudEVudHJpZXMoKTsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5TmFtZSA9IGRldGFpbHMtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gQU1lc3NhZ2U6OmtUeXBlU3RyaW5nKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVOYW1lUGF0dGVybigibWVhc3VyZWQtZnJhbWUtcmF0ZS0oWzAtOV0rKVsqeF0oWzAtOV0rKS1yYW5nZSIsCisgICAgICAgICAgICAgICAgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgc3RkOjpjbWF0Y2ggc2l6ZU1hdGNoOworICAgICAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChlbnRyeU5hbWUsIHNpemVNYXRjaCwgZnJhbWVSYXRlTmFtZVBhdHRlcm4pICYmCisgICAgICAgICAgICAgICAgc2l6ZU1hdGNoLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbSA9IGRldGFpbHMtPmdldEVudHJ5QXQoaSk7CisgICAgICAgICAgICBBU3RyaW5nIGZwc1JhbmdlU3RyOworICAgICAgICAgICAgaWYgKGl0ZW0uZmluZCgmZnBzUmFuZ2VTdHIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyIsIGVudHJ5TmFtZSwgZnBzUmFuZ2VTdHIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVQYXR0ZXJuKCIoWzAtOV0rKS0oWzAtOV0rKSIpOworICAgICAgICAgICAgICAgIHN0ZDo6Y21hdGNoIGZwc01hdGNoOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGZwc1JhbmdlU3RyLmNfc3RyKCksIGZwc01hdGNoLCBmcmFtZVJhdGVQYXR0ZXJuKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZnBzTWF0Y2guc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcy0+ZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdG9pKHNpemVNYXRjaFsxXSksIHN0b2koc2l6ZU1hdGNoWzJdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RvaShmcHNNYXRjaFsxXSksIHN0b2koZnBzTWF0Y2hbMl0pKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY1NpemVSYW5nZSgKKyAgICAgICAgY29uc3QgY2hhciogY29kZWNOYW1lLAorICAgICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscywKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLAorICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgIEZyYW1lUmF0ZU1hcHMqIGZyYW1lUmF0ZU1hcHMpIHsKKyAgICBpZiAoY29kZWNOYW1lID09IG51bGxwdHIgfHwgbWluU2l6ZSA9PSBudWxscHRyIHx8IG1heFNpemUgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgZGV0YWlscyA9PSBudWxscHRyIHx8IGZyYW1lUmF0ZU1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFTdHJpbmcgc2l6ZVJhbmdlOworICAgIGF1dG8gaGFzSXRlbSA9IGRldGFpbHMtPmZpbmRTdHJpbmcoInNpemUtcmFuZ2UiLCAmc2l6ZVJhbmdlKTsKKyAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVlcnkgc2l6ZSByYW5nZSBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgY29kZWMncyBzaXplIHJhbmdlIGlzICVzIiwgX19GVU5DVElPTl9fLCBjb2RlY05hbWUsIHNpemVSYW5nZS5jX3N0cigpKTsKKyAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIihbMC05XSspWyp4XShbMC05XSspLShbMC05XSspWyp4XShbMC05XSspIik7CisgICAgc3RkOjpjbWF0Y2ggbWF0Y2g7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goc2l6ZVJhbmdlLmNfc3RyKCksIG1hdGNoLCBwYXR0ZXJuKSkgeworICAgICAgICBpZiAobWF0Y2guc2l6ZSgpID09IDUpIHsKKyAgICAgICAgICAgIG1pblNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFsxXSk7CisgICAgICAgICAgICBtaW5TaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzJdKTsKKyAgICAgICAgICAgIG1heFNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFszXSk7CisgICAgICAgICAgICBtYXhTaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzRdKTsKKyAgICAgICAgICAgIGlmIChtaW5TaXplLT5maXJzdCA+IG1heFNpemUtPmZpcnN0IHx8CisgICAgICAgICAgICAgICAgICAgIG1pblNpemUtPnNlY29uZCA+IG1heFNpemUtPnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyBjb2RlIHNpemUgcmFuZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lLCBzaXplUmFuZ2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IGdldEZyYW1lUmF0ZU1hcHMoZGV0YWlscywgZnJhbWVSYXRlTWFwcyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6RnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6ZmluZENsb3Nlc3RTaXplKAorICAgICAgICBjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIGludDMyX3QgbWluRGlmZiA9IElOVDMyX01BWDsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBjbG9zZXN0SXRlciA9IG1hcHMuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXRlciA9IG1hcHMuYmVnaW4oKTsgaXRlciAhPSBtYXBzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgLy8gVXNlIGFyZWEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzaXplcyB0byBhcHByb3hpbWF0ZSBzaXplCisgICAgICAgIC8vIGRpZmZlcmVuY2UuCisgICAgICAgIGludDMyX3QgZGlmZiA9IGFicyhpdGVyLT5maXJzdC5maXJzdCAqIGl0ZXItPmZpcnN0LnNlY29uZCAtIHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgaWYgKGRpZmYgPCBtaW5EaWZmKSB7CisgICAgICAgICAgICBjbG9zZXN0SXRlciA9IGl0ZXI7CisgICAgICAgICAgICBtaW5EaWZmID0gZGlmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xvc2VzdEl0ZXI7Cit9CisKK3NwPEFNZXNzYWdlPiBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY0RldGFpbHMoCisgICAgICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaWR4ID0gY29kZWNzTGlzdC0+ZmluZENvZGVjQnlUeXBlKG5hbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gY29kZWNzTGlzdC0+Z2V0Q29kZWNJbmZvKGlkeCk7CisgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY29kZWMgaW5mbyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9CisgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobmFtZSk7CisgICAgaWYgKGNhcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY2FwYWJpbGl0aWVzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcHMtPmdldERldGFpbHMoKTsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBkZXRhaWxzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBkZXRhaWxzOworfQorfSAvL25hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGI5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0VuY29kZXJJbmZvTWFuYWdlciB7CitwdWJsaWM6CisgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXImIGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciBpbnN0YW5jZTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRXaWR0aCA9IDUxMjsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZEhlaWdodCA9IDUxMjsKK3ByaXZhdGU6CisgICAgc3RydWN0IFNpemVQYWlySGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yICgpIChjb25zdCBzdGQ6OnBhaXI8aW50MzJfdCxpbnQzMl90PiAmcCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHAuZmlyc3QgKiAzMSArIHAuc2Vjb25kOworICAgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwgU2l6ZVBhaXJIYXNoPiBGcmFtZVJhdGVNYXBzOworCisgICAgSGVpY0VuY29kZXJJbmZvTWFuYWdlcigpOworICAgIHZpcnR1YWwgfkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKyAgICBzdGF0dXNfdCBnZXRGcmFtZVJhdGVNYXBzKHNwPEFNZXNzYWdlPiBkZXRhaWxzLCBGcmFtZVJhdGVNYXBzKiBtYXBzKTsKKyAgICBzdGF0dXNfdCBnZXRDb2RlY1NpemVSYW5nZShjb25zdCBjaGFyKiBjb2RlY05hbWUsIHNwPEFNZXNzYWdlPiBkZXRhaWxzLAorICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgICAgICBGcmFtZVJhdGVNYXBzKiBmcmFtZVJhdGVNYXBzKTsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBmaW5kQ2xvc2VzdFNpemUoY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcywKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0Q29kZWNEZXRhaWxzKHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSk7CisKKyAgICBib29sIG1Jc0luaXRlZDsKKyAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbU1pblNpemVIZWljLCBtTWF4U2l6ZUhlaWM7CisgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1NaW5TaXplSGV2YywgbU1heFNpemVIZXZjOworICAgIGJvb2wgbUhhc0hFVkMsIG1IYXNIRUlDOworICAgIEZyYW1lUmF0ZU1hcHMgbUhlaWNGcmFtZVJhdGVNYXBzLCBtSGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgYm9vbCBtRGlzYWJsZUdyaWQ7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IGNlMDA2YTcuLjc4ZmViM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMzIsMTQgKzMyLDExIEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC01NywxMyArNTQsMTMgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCiAgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAorICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIG1EZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KIApAQCAtNzEsNyArNjgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpjaGVja1BpZChjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKQogICAgICAgICBjb25zdCB7CiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dFKCIlczogYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE4Niw3ICsxODMsNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBtZWRpYSBzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQgJiYKICAgICAgICAgY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKQEAgLTIwNiw4ICsyMDMsNiBAQAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBBTE9HVigiQ2FtZXJhICVzOiBEZXRhY2ggY29tcGxldGUiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIH0KIApAQCAtMjE5LDE4ICsyMTQsMTggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoVENsaWVudEJhc2U6Om1DbGllbnRQaWQgIT0gMCAmJgotICAgICAgICBnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgewogCiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgVENsaWVudEJhc2U6Om1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBlNzRmYmRmLi42NjkzODQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTMwLDcgKzEzMCwxMCBAQAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDMrIGVudHJ5ICovCiAKICAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247Ci0gICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisKKyAgICAvLyBTZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcKKyAgICAvLyBkdW1wRGV2aWNlICh3aGljaCBpcyBpbXBvcnRhbnQgdG8gYmUgbG9jayBmcmVlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkKKyAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCAwY2U0MzE4Li5kNjc4OWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMjcgKzIwLDQyIEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZS5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZnV0dXJlPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKK3VzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiAKIG5hbWVzcGFjZSB7CiAvLyBIYXJkY29kZWQgbmFtZSBmb3IgdGhlIHBhc3N0aHJvdWdoIEhBTCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgY2FuJ3QgYmUgZGlzY292ZXJlZCB2aWEgdGhlCiAvLyBzZXJ2aWNlIG1hbmFnZXIKIGNvbnN0IHN0ZDo6c3RyaW5nIGtMZWdhY3lQcm92aWRlck5hbWUoImxlZ2FjeS8wIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrRXh0ZXJuYWxQcm92aWRlck5hbWUoImV4dGVybmFsLzAiKTsKLQorY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKK2NvbnN0IGZsb2F0IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2UgPSAuMWY7CisKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eXt9OwogCkBAIC01Niw2ICs3MSw4IEBACiAgICAgfQogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgIG1TZXJ2aWNlUHJveHkgPSBwcm94eTsKKyAgICBtRGV2aWNlU3RhdGUgPSBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+PigKKyAgICAgICAgcHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOjpOT1JNQUwpOwogCiAgICAgLy8gUmVnaXN0ZXJpbmcgd2lsbCB0cmlnZ2VyIG5vdGlmaWNhdGlvbnMgZm9yIGFsbCBhbHJlYWR5LWtub3duIHByb3ZpZGVycwogICAgIGJvb2wgc3VjY2VzcyA9IG1TZXJ2aWNlUHJveHktPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKQEAgLTcxLDYgKzg4LDggQEAKICAgICBhZGRQcm92aWRlckxvY2tlZChrTGVnYWN5UHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtFeHRlcm5hbFByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTc0LDYgKzE5MywxOSBAQAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKGluZm8pOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwpAQCAtMjAzLDI2ICsyMzUsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBib29sIHN1cHBvcnQgPSBmYWxzZTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGF1dG8gcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIFsmc3VwcG9ydF0oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCA9IHN1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdXBwb3J0OworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpIHsKQEAgLTIzMSw2ICsyNTIsMTUgQEAKICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCisgICAgLy8gUGFzcyB0aGUgY2FtZXJhIElEIHRvIHN0YXJ0IGludGVyZmFjZSBzbyB0aGF0IGl0IHdpbGwgc2F2ZSBpdCB0byB0aGUgbWFwIG9mIElDYW1lcmFQcm92aWRlcnMKKyAgICAvLyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlLgorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGludGVyZmFjZSk7CisKICAgICByZXR1cm4gZGV2aWNlSW5mby0+c2V0VG9yY2hNb2RlKGVuYWJsZWQpOwogfQogCkBAIC0yMzgsMzcgKzI2OCw3IEBACiAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB0YWdDYWNoZSA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUoKTsKIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgc3RhdHVzX3QgcmVzOwotICAgICAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovZGVzYykpCi0gICAgICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgotICAgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgZGVzYyk7CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgcHJvdmlkZXItPm1WZW5kb3JUYWdEZXNjcmlwdG9yKTsKICAgICB9CiAKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OnNldEFzR2xvYmFsVmVuZG9yVGFnQ2FjaGUodGFnQ2FjaGUpOwpAQCAtMjc2LDEwICsyNzYsMzAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld1N0YXRlOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogTm90aWZ5aW5nICVzIGZvciBuZXcgc3RhdGUgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCBuZXdTdGF0ZSk7CisgICAgICAgIHN0YXR1c190IHNpbmdsZVJlcyA9IHByb3ZpZGVyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICBpZiAoc2luZ2xlUmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBub3RpZnkgcHJvdmlkZXIgJXMgYWJvdXQgZGV2aWNlIHN0YXRlIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXMgPSBzaW5nbGVSZXM7CisgICAgICAgICAgICAvLyBjb250aW51ZSB0byBkbyB0aGUgcmVzdCBvZiB0aGUgcHJvdmlkZXJzIGluc3RlYWQgb2YgcmV0dXJuaW5nIG5vdworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0yODgsMTAgKzMwOCwyMiBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGRldmljZUluZm8zLT5tSW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIFsmc3RhdHVzLCAmc2Vzc2lvbl0KICAgICAgICAgICAgIChTdGF0dXMgcywgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4mIGNhbWVyYVNlc3Npb24pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewpAQCAtMjk5LDYgKzMzMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKQEAgLTMwNyw5ICszNDAsOSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTMxOCwyNCArMzUxLDkxIEBACiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgYXV0byAqZGV2aWNlSW5mbzEgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8xKj4oZGV2aWNlSW5mbyk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKIAotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBkZXZpY2VJbmZvMS0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMS0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICpzZXNzaW9uID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2U7CisgICAgICAgICpzZXNzaW9uID0gaW50ZXJmYWNlOwogICAgIH0KICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJTYXZpbmcgY2FtZXJhIHByb3ZpZGVyICVzIGZvciBjYW1lcmEgZGV2aWNlICVzIiwgcHJvdmlkZXItPmRlc2NyaXB0b3IsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm92aWRlckludGVyZmFjZU1hcExvY2spOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcmltYXJ5TWFwLCAqYWx0ZXJuYXRlTWFwOworICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKKyAgICAgICAgcHJpbWFyeU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICAgICAgYWx0ZXJuYXRlTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgYXV0byBpZCA9IGNhbWVyYUlkLmNfc3RyKCk7CisgICAgKCpwcmltYXJ5TWFwKVtpZF0gPSBwcm92aWRlcjsKKyAgICBhdXRvIHNlYXJjaCA9IGFsdGVybmF0ZU1hcC0+ZmluZChpZCk7CisgICAgaWYgKHNlYXJjaCAhPSBhbHRlcm5hdGVNYXAtPmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyB1c2luZyBib3RoIHRvcmNoIG1vZGUgYW5kIGNhbWVyYSBtb2RlIHNpbXVsdGFuZW91c2x5LiAiCisgICAgICAgICAgICAgICAgIlRoYXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgIH0KKyAgICBBTE9HVigiJXM6IENhbWVyYSBkZXZpY2UgJXMgY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBpZCk7Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCkgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiUmVtb3ZpbmcgY2FtZXJhIGRldmljZSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcm92aWRlck1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByb3ZpZGVyTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBhdXRvIHNlYXJjaCA9IHByb3ZpZGVyTWFwLT5maW5kKGNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChzZWFyY2ggIT0gcHJvdmlkZXJNYXAtPmVuZCgpKSB7CisgICAgICAgIC8vIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGlzIElDYW1lcmFQcm92aWRlci4gVGhpcyBpcyBzYWZlIHRvIGRvIGltbWVkaWF0ZWx5ICh3aXRob3V0IGFuCisgICAgICAgIC8vIGFkZGVkIGRlbGF5KSBiZWNhdXNlIGh3c2VydmljZW1hbmFnZXIgZ3VhcmFudGVlcyB0byBob2xkIHRoZSByZWZlcmVuY2UgZm9yIGF0IGxlYXN0IGZpdmUKKyAgICAgICAgLy8gbW9yZSBzZWNvbmRzLiAgV2UgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3Igc28gdGhhdCBpZiB0aGUgcHJvdmlkZXIgaXMgdW5yZWZlcmVuY2VkIGFuZAorICAgICAgICAvLyB0aGVuIHJlZmVyZW5jZWQgYWdhaW4gcXVpY2tseSwgd2UgZG8gbm90IGxldCB0aGUgSEFMIGV4aXQgYW5kIHRoZW4gbmVlZCB0byBpbW1lZGlhdGVseQorICAgICAgICAvLyByZXN0YXJ0IGl0LiBBbiBleGFtcGxlIHdoZW4gdGhpcyBjb3VsZCBoYXBwZW4gaXMgc3dpdGNoaW5nIGZyb20gYSBmcm9udC1mYWNpbmcgdG8gYQorICAgICAgICAvLyByZWFyLWZhY2luZyBjYW1lcmEuIElmIHRoZSBIQUwgd2VyZSB0byBleGl0IGR1cmluZyB0aGUgY2FtZXJhIHN3aXRjaCwgdGhlIGNhbWVyYSBjb3VsZAorICAgICAgICAvLyBhcHBlYXIgamFua3kgdG8gdGhlIHVzZXIuCisgICAgICAgIHByb3ZpZGVyTWFwLT5lcmFzZShjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQXNrZWQgdG8gcmVtb3ZlIHJlZmVyZW5jZSBmb3IgY2FtZXJhICVzLCBidXQgbm8gcmVmZXJlbmNlIHRvIGl0IHdhcyBmb3VuZC4gVGhpcyAiCisgICAgICAgICAgICAgICAgImNvdWxkIG1lYW4gcmVtb3ZlUmVmIHdhcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNhbWVyYSBJRC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgfQorfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25SZWdpc3RyYXRpb24oCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zNDcsNiArNDQ3LDggQEAKICAgICAgICAgbGlzdGVuZXItPm9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCk7CiAgICAgfQogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4oKTsKIH0KIApAQCAtMzkyLDM1ICs0OTQsNTk3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgewotICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cXVlcnlQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUNhcDsKIAotICAgIGVudHJ5Q2FwID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBlbnRyeUNhcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CiAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7Ci0gICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWlzTG9naWNhbENhbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUlkcyA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlJZHMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoCisgICAgICAgICAgICBBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CiAgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnlJZHMuZGF0YS51ODsKICAgICBzaXplX3Qgc3RhcnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlJZHMuY291bnQ7ICsraSkgewogICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKICAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMtPnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxJZHMucHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnQgPSBpKzE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGlmIChlbnRyeUNhcC5jb3VudCAhPSAxKSB7CisgICAgICAgIC8vIERvIE5PVCBoaWRlIHRoaXMgY2FtZXJhIGRldmljZSBpZiB0aGUgY2FwYWJpbGl0aWVzIHNwZWNpZnkgYW55dGhpbmcgbW9yZQorICAgICAgICAvLyB0aGFuIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlbnRyeUNhcC5kYXRhLnU4WzBdID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkU2l6ZXMoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcy8qb3V0Ki8pIHsKKyAgICBpZiAoc2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzY2FsZXJEaW1zID0gY2guZmluZCh0YWcpOworICAgIGlmIChzY2FsZXJEaW1zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBTY2FsZXIgZW50cnkgY29udGFpbnMgNCBlbGVtZW50cyAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNjYWxlckRpbXMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKChzY2FsZXJEaW1zLmRhdGEuaTMyW2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNjYWxlckRpbXMuZGF0YS5pMzJbaSszXSA9PQorICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc2NhbGVyRGltcy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckRpbXMuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHVyYXRpb25zKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKSB7CisgICAgaWYgKGR1cmF0aW9ucyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGF2YWlsYWJsZUR1cmF0aW9ucyA9IGNoLmZpbmQodGFnKTsKKyAgICBpZiAoYXZhaWxhYmxlRHVyYXRpb25zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBEdXJhdGlvbiBlbnRyeSBjb250YWlucyA0IGVsZW1lbnRzIChmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUR1cmF0aW9ucy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNpemUgOiBzaXplcykgeworICAgICAgICAgICAgICAgIGludDY0X3Qgd2lkdGggPSBzdGQ6OmdldDwwPihzaXplKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGhlaWdodCA9IHN0ZDo6Z2V0PDE+KHNpemUpOworICAgICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsxXSA9PSB3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsyXSA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy0+cHVzaF9iYWNrKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpKzNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgZGVwdGhEdXJhdGlvbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBibG9iRHVyYXRpb25zLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHluYW1pY0RlcHRoRHVyYXRpb25zIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGR5bmFtaWNEZXB0aER1cmF0aW9ucyA9PSBudWxscHRyKSB8fCAoZGVwdGhEdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBkaXJlY3Qgd2F5IHRvIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBkZXB0aCBzdHJlYW0gZHVyYXRpb24uCisgICAgLy8gUHJvY2Vzc2luZyB0aW1lIG9uIGNhbWVyYSBzZXJ2aWNlIHNpZGUgY2FuIHZhcnkgZ3JlYXRseSBkZXBlbmRpbmcgb24gbXVsdGlwbGUKKyAgICAvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIG5vdCB1bmRlciBvdXIgY29udHJvbC4gTWFrZSBhIGd1ZXNzdGltYXRlIGJ5IHRha2luZyB0aGUgbWF4aW11bQorICAgIC8vIGNvcnJlc3BvbmRpbmcgZHVyYXRpb24gdmFsdWUgZnJvbSBkZXB0aCBhbmQgYmxvYi4KKyAgICBhdXRvIGRlcHRoRHVyYXRpb24gPSBkZXB0aER1cmF0aW9ucy5iZWdpbigpOworICAgIGF1dG8gYmxvYkR1cmF0aW9uID0gYmxvYkR1cmF0aW9ucy5iZWdpbigpOworICAgIGR5bmFtaWNEZXB0aER1cmF0aW9ucy0+cmVzZXJ2ZShkZXB0aER1cmF0aW9ucy5zaXplKCkpOworICAgIHdoaWxlICgoZGVwdGhEdXJhdGlvbiAhPSBkZXB0aER1cmF0aW9ucy5lbmQoKSkgJiYgKGJsb2JEdXJhdGlvbiAhPSBibG9iRHVyYXRpb25zLmVuZCgpKSkgeworICAgICAgICBkeW5hbWljRGVwdGhEdXJhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1heCgqZGVwdGhEdXJhdGlvbiwgKmJsb2JEdXJhdGlvbikpOworICAgICAgICBkZXB0aER1cmF0aW9uKys7IGJsb2JEdXJhdGlvbisrOworICAgIH0KK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGJsb2JTaXplcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBkZXB0aFNpemVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmR5bmFtaWNEZXB0aFNpemVzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqaW50ZXJuYWxEZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZHluYW1pY0RlcHRoU2l6ZXMgPT0gbnVsbHB0ciB8fCBpbnRlcm5hbERlcHRoU2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGR5bmFtaWMgZGVwdGggc3BlYy4gZG9lcyBub3QgbWVudGlvbiBob3cgY2xvc2UgdGhlIEFSIHJhdGlvIHNob3VsZCBiZS4KKyAgICAvLyBUcnkgdXNpbmcgc29tZXRoaW5nIGFwcHJvcHJpYXRlLgorICAgIGZsb2F0IEFSVG9sZXJhbmNlID0ga0RlcHRoQVJUb2xlcmFuY2U7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJsb2JTaXplIDogYmxvYlNpemVzKSB7CisgICAgICAgIGZsb2F0IGpwZWdBUiA9IHN0YXRpY19jYXN0PGZsb2F0PiAoc3RkOjpnZXQ8MD4oYmxvYlNpemUpKSAvCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGJsb2JTaXplKSk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXB0aFNpemUgOiBkZXB0aFNpemVzKSB7CisgICAgICAgICAgICBpZiAoZGVwdGhTaXplID09IGJsb2JTaXplKSB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsb2F0IGRlcHRoQVIgPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHN0ZDo6Z2V0PDA+KGRlcHRoU2l6ZSkpIC8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGRlcHRoU2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZhYnMoanBlZ0FSIC0gZGVwdGhBUikgPD0gQVJUb2xlcmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aFNpemVzLT5wdXNoX2JhY2soYmxvYlNpemUpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNEZXB0aFBob3RvTGlicmFyeVByZXNlbnQoKSB7CisgICAgc3RhdGljIGJvb2wgbGlicmFyeVByZXNlbnQgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gbGlicmFyeVByZXNlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQqIGRlcHRoTGliSGFuZGxlID0gZGxvcGVuKGNhbWVyYTM6OmtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoZGVwdGhMaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBwcm9jZXNzRnVuYyA9IGRsc3ltKGRlcHRoTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbik7CisgICAgaWYgKHByb2Nlc3NGdW5jICE9IG51bGxwdHIpIHsKKyAgICAgICAgbGlicmFyeVByZXNlbnQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYnJhcnlQcmVzZW50ID0gZmFsc2U7CisgICAgfQorICAgIGRsY2xvc2UoZGVwdGhMaWJIYW5kbGUpOworCisgICAgcmV0dXJuIGxpYnJhcnlQcmVzZW50OworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmFkZER5bmFtaWNEZXB0aFRhZ3MoKSB7CisgICAgdWludDMyX3QgZGVwdGhFeGNsVGFnID0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkU7CisgICAgdWludDMyX3QgZGVwdGhTaXplc1RhZyA9IEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gc3VwcG9ydGVkQmxvYlNpemVzLCBzdXBwb3J0ZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsIGludGVybmFsRGVwdGhTaXplczsKKyAgICBhdXRvIGNoVGFncyA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICBpZiAoY2hUYWdzLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdXBwb3J0ZWQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGJvb2wgaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgPSBzdGQ6OmZpbmQoY2hUYWdzLmRhdGEuaTMyLCBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQsCisgICAgICAgICAgICBkZXB0aEV4Y2xUYWcpICE9IChjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIGJvb2wgaXNEZXB0aFNpemVQcmVzZW50ID0gc3RkOjpmaW5kKGNoVGFncy5kYXRhLmkzMiwgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50LAorICAgICAgICAgICAgZGVwdGhTaXplc1RhZykgIT0gKGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCk7CisgICAgaWYgKCEoaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgJiYgaXNEZXB0aFNpemVQcmVzZW50KSkgeworICAgICAgICAvLyBObyBkZXB0aCBzdXBwb3J0LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBhdXRvIGRlcHRoRXhjbHVzaXZlRW50cnkgPSBjLmZpbmQoZGVwdGhFeGNsVGFnKTsKKyAgICBpZiAoZGVwdGhFeGNsdXNpdmVFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgaWYgKGRlcHRoRXhjbHVzaXZlRW50cnkuZGF0YS51OFswXSAhPSBBTkRST0lEX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRV9GQUxTRSkgeworICAgICAgICAgICAgLy8gRGVwdGggc3VwcG9ydCBpcyBleGNsdXNpdmUsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQWR2ZXJ0aXNlZCBkZXB0aCBleGNsdXNpdmUgdGFnIGJ1dCB2YWx1ZSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKKyAgICAgICAgICAgICZzdXBwb3J0ZWRCbG9iU2l6ZXMpOworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIGRlcHRoU2l6ZXNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCAmc3VwcG9ydGVkRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZEJsb2JTaXplcy5lbXB0eSgpIHx8IHN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKKyAgICAgICAgICAgICZzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmludGVybmFsRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYoIWlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCkpIHsKKyAgICAgICAgLy8gRGVwdGggcGhvdG8gcHJvY2Vzc2luZyBsaWJyYXJ5IGlzIG5vdCBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkeW5hbWljRGVwdGhFbnRyaWVzOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcykgeworICAgICAgICBpbnQzMl90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KGl0KSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KGl0KSksCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgfTsKKyAgICAgICAgZHluYW1pY0RlcHRoRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoRW50cmllcy5lbmQoKSwgZW50cnksIGVudHJ5ICsgNCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZGVwdGhNaW5EdXJhdGlvbnMsIGRlcHRoU3RhbGxEdXJhdGlvbnM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYmxvYk1pbkR1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucywgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnM7CisKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmJsb2JNaW5EdXJhdGlvbnMpOworICAgIGlmIChibG9iTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGRlcHRoTWluRHVyYXRpb25zLnNpemUoKSAhPSBibG9iTWluRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpLCBibG9iTWluRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZibG9iU3RhbGxEdXJhdGlvbnMpOworICAgIGlmIChibG9iU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fCBkZXB0aFN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSAhPSBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXB0aCBzdGFsbCBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpLCBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhNaW5EdXJhdGlvbnMsIGJsb2JNaW5EdXJhdGlvbnMsCisgICAgICAgICAgICAmZHluYW1pY0RlcHRoTWluRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhTdGFsbER1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgJmR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBpZiAoZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5zaXplKCkgIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGR5bmFtaWMgZGVwdGggc3RhbGwvbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLnNpemUoKSwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXM7CisgICAgYXV0byBpdER1cmF0aW9uID0gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmJlZ2luKCk7CisgICAgYXV0byBpdFNpemUgPSBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5iZWdpbigpOworICAgIHdoaWxlIChpdER1cmF0aW9uICE9IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5lbmQoKSkgeworICAgICAgICBpbnQ2NF90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KCppdFNpemUpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MT4oKml0U2l6ZSkpLCAqaXREdXJhdGlvbn07CisgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmVuZCgpLCBlbnRyeSwKKyAgICAgICAgICAgICAgICBlbnRyeSArIDQpOworICAgICAgICBpdER1cmF0aW9uKys7IGl0U2l6ZSsrOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzOworICAgIGl0RHVyYXRpb24gPSBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5iZWdpbigpOworICAgIGl0U2l6ZSA9IHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0RHVyYXRpb24gIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaW50NjRfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPigqaXRTaXplKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KCppdFNpemUpKSwgKml0RHVyYXRpb259OworICAgICAgICBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZW5kKCksIGVudHJ5LAorICAgICAgICAgICAgICAgIGVudHJ5ICsgNCk7CisgICAgICAgIGl0RHVyYXRpb24rKzsgaXRTaXplKys7CisgICAgfQorCisgICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhFbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5zaXplKCkpOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3VwcG9ydGVkQ2hUYWdzOworICAgIHN1cHBvcnRlZENoVGFncy5yZXNlcnZlKGNoVGFncy5jb3VudCArIDMpOworICAgIHN1cHBvcnRlZENoVGFncy5pbnNlcnQoc3VwcG9ydGVkQ2hUYWdzLmVuZCgpLCBjaFRhZ3MuZGF0YS5pMzIsCisgICAgICAgICAgICBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBzdXBwb3J0ZWRDaFRhZ3MuZGF0YSgpLAorICAgICAgICAgICAgc3VwcG9ydGVkQ2hUYWdzLnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Zml4dXBNb25vY2hyb21lVGFncygpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKworICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgorICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgY2FwID0gYy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXAuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhcC5kYXRhLnU4W2ldID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2ZhID0gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTzsKKyAgICAgICAgICAgICAgICByZXMgPSBjLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCwgJmNmYSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgc0tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXFLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXFLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVzS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gYy5maW5kKEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4pOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAxOyBqIDwgYmxFbnRyeS5jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsRW50cnkuZGF0YS5pMzJbal0gPSBibEVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnJlbW92ZUF2YWlsYWJsZUtleXMoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsIHVpbnQzMl90IGtleVRhZykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGtleXNFbnRyeSA9IGMuZmluZChrZXlUYWcpOworICAgIGlmIChrZXlzRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHRhZyAldTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywga2V5VGFnLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdktleXM7CisgICAgdktleXMucmVzZXJ2ZShrZXlzRW50cnkuY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5c0VudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCksIGtleXNFbnRyeS5kYXRhLmkzMltpXSkgPT0ga2V5cy5lbmQoKSkgeworICAgICAgICAgICAgdktleXMucHVzaF9iYWNrKGtleXNFbnRyeS5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gYy51cGRhdGUoa2V5VGFnLCB2S2V5cy5kYXRhKCksIHZLZXlzLnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dHB1dHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBkdXJhdGlvbnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBzdGFsbER1cmF0aW9ucywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1Db25maWdzLAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUR1cmF0aW9ucykgeworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIgfHwgZHVyYXRpb25zID09IG51bGxwdHIgfHwgc3RhbGxEdXJhdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXRpYyBib29sIHN1cHBvcnRJbk1lbW9yeVRlbXBGaWxlID0KKyAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworICAgIGlmICghc3VwcG9ydEluTWVtb3J5VGVtcEZpbGUpIHsKKyAgICAgICAgQUxPR0koIiVzOiBObyBIRUlDIHN1cHBvcnQgZHVlIHRvIGFic2VuY2Ugb2YgaW4gbWVtb3J5IHRlbXAgZmlsZSBzdXBwb3J0IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxTdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOworICAgICAgICAvLyBPbmx5IElNUExFTUVOVEFUSU9OX0RFRklORUQgYW5kIFlVVl84ODggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSEVJQworICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICBmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc2l6ZUF2YWlsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgb3V0cHV0cy0+c2l6ZSgpOyBqKz0gNCkgeworICAgICAgICAgICAgaWYgKCgqb3V0cHV0cylbaisxXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgKCpvdXRwdXRzKVtqKzJdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSkgeworICAgICAgICAgICAgICAgIHNpemVBdmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemVBdmFpbCkgY29udGludWU7CisKKyAgICAgICAgaW50NjRfdCBzdGFsbCA9IDA7CisgICAgICAgIGJvb2wgdXNlSGVpYywgdXNlR3JpZDsKKyAgICAgICAgaWYgKGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoCisgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sCisgICAgICAgICAgICAgICAgJnVzZUhlaWMsICZ1c2VHcmlkLCAmc3RhbGwpKSB7CisgICAgICAgICAgICBpZiAodXNlR3JpZCAhPSAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpbnQzMl90IGNvbmZpZ1tdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIDAgLyppc0lucHV0Ki99OworICAgICAgICAgICAgb3V0cHV0cy0+aW5zZXJ0KG91dHB1dHMtPmVuZCgpLCBjb25maWcsIGNvbmZpZyArIDQpOworCisgICAgICAgICAgICAvLyBIRUlDIG1pbkZyYW1lRHVyYXRpb24KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGFsU3RyZWFtRHVyYXRpb25zLmNvdW50OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2pdID09IGZvcm1hdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orMV0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbaisyXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbltdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orM119OworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMtPmluc2VydChkdXJhdGlvbnMtPmVuZCgpLCBkdXJhdGlvbiwgZHVyYXRpb24rNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBzdGFsbER1cmF0aW9uCisgICAgICAgICAgICBpbnQ2NF90IHN0YWxsRHVyYXRpb25bXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCBzdGFsbH07CisgICAgICAgICAgICBzdGFsbER1cmF0aW9ucy0+aW5zZXJ0KHN0YWxsRHVyYXRpb25zLT5lbmQoKSwgc3RhbGxEdXJhdGlvbiwgc3RhbGxEdXJhdGlvbis0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZGVyaXZlSGVpY1RhZ3MoKSB7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsSGVpY1N1cHBvcnQgPSBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEKTsKKyAgICBpZiAoaGFsSGVpY1N1cHBvcnQuY291bnQgPiAxKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBlbnRyeSBjb3VudCAlenUgZm9yIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoYWxIZWljU3VwcG9ydC5jb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChoYWxIZWljU3VwcG9ydC5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICBoYWxIZWljU3VwcG9ydC5kYXRhLnU4WzBdID09IEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRF9GQUxTRSkgeworICAgICAgICAvLyBDYW1lcmEgSEFMIGRvZXNuJ3Qgc3VwcG9ydCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgSEVJQy4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBtYXhKcGVnQXBwc1NlZ21lbnRzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIGlmIChtYXhKcGVnQXBwc1NlZ21lbnRzLmNvdW50ICE9IDEgfHwgbWF4SnBlZ0FwcHNTZWdtZW50cy5kYXRhLnU4WzBdID09IDAgfHwKKyAgICAgICAgICAgIG1heEpwZWdBcHBzU2VnbWVudHMuZGF0YS51OFswXSA+IDE2KSB7CisgICAgICAgIEFMT0dFKCIlczogQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UIG11c3QgYmUgd2l0aGluIFsxLCAxNl0iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gUG9wdWxhdGUgSEVJQyBvdXRwdXQgY29uZmlndXJhdGlvbnMgYW5kIGl0cyByZWxhdGVkIG1pbiBmcmFtZSBkdXJhdGlvbgorICAgIC8vIGFuZCBzdGFsbCBkdXJhdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBoZWljT3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBoZWljRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGhlaWNTdGFsbER1cmF0aW9uczsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBoYWxTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRnJhbWVEdXJhdGlvbnMgPQorICAgICAgICAgICAgYy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKCZoZWljT3V0cHV0cywgJmhlaWNEdXJhdGlvbnMsICZoZWljU3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLCBtaW5GcmFtZUR1cmF0aW9ucyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaWxsIEhFSUMgc3RyZWFtIGNvbWJpbmF0aW9uczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICBoZWljT3V0cHV0cy5kYXRhKCksIGhlaWNPdXRwdXRzLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljRHVyYXRpb25zLmRhdGEoKSwgaGVpY0R1cmF0aW9ucy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljU3RhbGxEdXJhdGlvbnMuZGF0YSgpLCBoZWljU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhICYmIHBoeXNpY2FsQ2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSB7CisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2FtZXJhSWQgaXMgZm91bmQgaW4gcHVibGljIGNhbWVyYSBJRHMgYWR2ZXJ0aXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBwcm92aWRlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIGluZm87CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoJmluZm8pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxJZHM7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmJlZ2luKCksIGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKSAhPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9taW5vcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBXcm9uZyBkZXZpY2VWZXJzaW9uICV4IGZvciBoaWRkZW5QaHlzaWNhbENhbWVyYUlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VWZXJzaW9uLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBleHBlY3RlZCkgewpAQCAtNDQ1LDkgKzExMDksOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPQotICAgICAgICAgICAgbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgaW50ZXJmYWNlLCB0aGlzKTsKLSAgICBzdGF0dXNfdCByZXMgPSBwcm92aWRlckluZm8tPmluaXRpYWxpemUoKTsKKyAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHRoaXMpOworICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZShpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTQ1OCw2ICsxMTIxLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVQcm92aWRlcihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHJlbW92ZWREZXZpY2VJZHM7CiAgICAgc3RhdHVzX3QgcmVzID0gTkFNRV9OT1RfRk9VTkQ7CkBAIC00OTgsMjcgKzExNjIsMzYgQEAKIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OlByb3ZpZGVySW5mbygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKSA6CiAgICAgICAgIG1Qcm92aWRlck5hbWUocHJvdmlkZXJOYW1lKSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpLAogICAgICAgICBtUHJvdmlkZXJUYWdpZChnZW5lcmF0ZVZlbmRvclRhZ0lkKHByb3ZpZGVyTmFtZSkpLAogICAgICAgICBtVW5pcXVlRGV2aWNlQ291bnQoMCksCiAgICAgICAgIG1NYW5hZ2VyKG1hbmFnZXIpIHsKICAgICAodm9pZCkgbU1hbmFnZXI7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKCkgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gY3VycmVudERldmljZVN0YXRlKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKworICAgIC8vIERldGVybWluZSBtaW5vciB2ZXJzaW9uCisgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDQ7CisgICAgfQorCiAgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKICAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNTMwLDcgKzEyMDMsNyBAQAogICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgfQogCi0gICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBtSW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNTQwLDE1ICsxMjEzLDQyIEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwogICAgIH0KIAorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFNldHRpbmcgZGV2aWNlIHN0YXRlIGZvciAlczogMHglIiBQUkl4NjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgcmVzID0gc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsICZkZXZpY2VzXSgKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCB0aGlzLCAmZGV2aWNlc10oCiAgICAgICAgICAgICBTdGF0dXMgaWRTdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpIHsKICAgICAgICAgc3RhdHVzID0gaWRTdGF0dXM7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW1lcmFEZXZpY2VOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKGNhbWVyYURldmljZU5hbWVzW2ldKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKQEAgLTU2MiwxMSArMTI2MiwyNCBAQAogICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgfQogCisgICAgcmV0ID0gaW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKKyAgICAgICAgW3RoaXNdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7CisKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgaWQ7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGFkZERldmljZShkZXZpY2UsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFkZERldmljZShkZXZpY2UsIGNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBlbnVtZXJhdGUgY2FtZXJhIGRldmljZSAnJXMnOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC01ODEsNiArMTI5NCw1MyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4KK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIlJlcXVlc3QgdG8gc3RhcnQgY2FtZXJhIHByb3ZpZGVyOiAlcyIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBwcm92aWRlciBzdGF0ZSEgU2hvdWxkIG5vdCBiZSBoZXJlIG9uIGEgbm9uLWxhenkgSEFMISIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HSSgiQ2FtZXJhIEhBTCBwcm92aWRlciBuZWVkcyByZXN0YXJ0LCBjYWxsaW5nIGdldFNlcnZpY2UoJXMpIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1TZXJ2aWNlUHJveHktPmdldFNlcnZpY2UobVByb3ZpZGVyTmFtZSk7CisgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgICAgIGlmICghbGlua2VkLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBJbml0aWFsIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4ICUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKwogY29uc3Qgc3RkOjpzdHJpbmcmIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBtVHlwZTsKIH0KQEAgLTY2MSw4ICsxNDIxLDEwIEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIGNvbnN0IHsKLSAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuNCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCisgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLiVkLCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1NaW5vclZlcnNpb24sCisgICAgICAgICAgICBtSXNSZW1vdGUgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCiAgICAgICAgICAgICBtRGV2aWNlcy5zaXplKCkpOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBtRGV2aWNlcykgewpAQCAtNzAzLDYgKzE0NjUsMjQgQEAKICAgICAgICAgICAgIGluZm8yLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gRHVtcCBjaGFyYWN0ZXJpc3RpY3Mgb2Ygbm9uLXN0YW5kYWxvbmUgcGh5c2ljYWwgY2FtZXJhCisgICAgICAgIGlmIChkZXZpY2UtPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2UtPm1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcGh5c2ljYWwgaWQgaXMgYW4gaW5kZXBlbmRlbnQgY2FtZXJhCisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbEluZm87CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgJnBoeXNpY2FsSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBQaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOlxuIiwgaWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSW5mby5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIEhBTCBkZXZpY2UgJXMgKHYlZC4lZCkgZHVtcFN0YXRlOiA9PVxuIiwgZGV2aWNlLT5tTmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgIGRldmljZS0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZS0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmR1bXBTdGF0ZShmZCk7CkBAIC03NzIsNiArMTU1Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0b3JjaFN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOwogICAgICAgICAgICAgICAgIGlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT04gIT0gbmV3U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgwMCwxNSArMTU4Myw3NSBAQAogICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICBpZiAobVZlbmRvclRhZ0Rlc2NyaXB0b3IgIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIE9LOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCisgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKKyAgICAgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGUpIHsKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdEZXZpY2VTdGF0ZTsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKICAgICBTdGF0dXMgc3RhdHVzOwogCiAgICAgYXV0byBjYW1lcmFJbnRlcmZhY2UgPQotICAgICAgICAgICAgZ2V0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKKyAgICAgICAgICAgIHN0YXJ0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKICAgICBpZiAoY2FtZXJhSW50ZXJmYWNlID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwogCiAgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKQEAgLTgzNSwxMyArMTY3OCwxMyBAQAogICAgIH0KIAogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCi0gICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSkpOworICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgdGhpcywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3A8SW50ZXJmYWNlVD4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbmtub3duIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgSW50ZXJmYWNlVDo6dmVyc2lvbi5nZXRfbWFqb3IoKSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC04NDksMTIgKzE2OTIsMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtODc0LDEyICsxNzIxLDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTkwMCw2ICsxNzUxLDE4IEBACiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6fkRldmljZUluZm8oKSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorc3A8SW50ZXJmYWNlVD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIHNwPEludGVyZmFjZVQ+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXZpY2UgPSBtUGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KG1OYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSAoSW50ZXJmYWNlVCAqKSBtU2F2ZWRJbnRlcmZhY2UuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwKICAgICAgICAgYm9vbCBlbmFibGVkKSB7CiAgICAgU3RhdHVzIHMgPSBpbnRlcmZhY2UtPnNldFRvcmNoTW9kZShlbmFibGVkID8gVG9yY2hNb2RlOjpPTiA6IFRvcmNoTW9kZTo6T0ZGKTsKQEAgLTkxMCwzMCArMTc3MywzMSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgLy8gUmVxdWlyZXMgcG93ZXJpbmcgb24gdGhlIGNhbWVyYSBkZXZpY2UKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbUludGVyZmFjZS0+b3BlbihudWxscHRyKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3BlbiBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOworICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgewogICAgICAgICAgICAgICAgIG1EZWZhdWx0UGFyYW1ldGVycy51bmZsYXR0ZW4oU3RyaW5nOChwYXJtcy5jX3N0cigpKSk7CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciByZWFkaW5nIGNhbWVyYSBkZXZpY2UgJXMgcGFyYW1zIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSA9CkBAIC05NDIsMjcgKzE4MDYsNDMgQEAKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7CiAgICAgfQogCi0gICAgcmV0ID0gbUludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBjYWNoZUNhbWVyYUluZm8oaW50ZXJmYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNhY2hlIENhbWVyYUluZm8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5jbG9zZSgpOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNsb3NpbmcgY2FtZXJhIGRldmljZSAlcyBhZnRlciBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwogICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjp+RGV2aWNlSW5mbzEoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Z2V0Q2FtZXJhSW5mbygKICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IHsKICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgICppbmZvID0gbUluZm87CisgICAgcmV0dXJuIE9LOworfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmNhY2hlQ2FtZXJhSW5mbygKKyAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjSW5mbzsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNJbmZvID0gY2FtSW5mbzsKICAgICAgICAgICAgIH0pOwpAQCAtOTc3LDI3ICsxODU3LDMxIEBACiAKICAgICBzd2l0Y2goY0luZm8uZmFjaW5nKSB7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkJBQ0s6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpFWFRFUk5BTDoKICAgICAgICAgICAgIC8vIE1hcCBleHRlcm5hbCB0byBmcm9udCBmb3IgbGVnYWN5IEFQSQogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpGUk9OVDoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCIlczogRGV2aWNlICVzOiBVbmtub3duIGNhbWVyYSBmYWNpbmc6ICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgY0luZm8uZmFjaW5nKTsKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgIH0KLSAgICBpbmZvLT5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOworICAgIG1JbmZvLm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXMuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEwMDksMTQgKzE4OTMsMTUgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAogICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CkBAIC0xMDM1LDE1ICsxOTIwLDM1IEBACiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlcyIKLSAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLAogICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhID0gaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBmaXggdXAgbW9ub2Nocm9tZSB0YWdzIGJhc2VkIGZvciBvbGRlciBIQUwgdmVyc2lvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdXRvIHN0YXQgPSBhZGREeW5hbWljRGVwdGhUYWdzKCk7CisgICAgaWYgKE9LICE9IHN0YXQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXQpLAorICAgICAgICAgICAgICAgIHN0YXQpOworICAgIH0KKyAgICByZXMgPSBkZXJpdmVIZWljVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQogICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOwogICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmCkBAIC0xMDUyLDEyICsxOTU3LDcxIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOwogICAgIH0KKworICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKworICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOworICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjp+RGV2aWNlSW5mbzMoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhSW5mbygKQEAgLTExMDgsMTAgKzIwNzIsMTQgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gcmV0ID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTEyNyw2ICsyMDk1LDYxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAobVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQocGh5c2ljYWxDYW1lcmFJZCkgPT0KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5hdChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgeworCisgICAgY29uc3Qgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgdGhpcy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlczsKKyAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICBhdXRvIHJldCA9ICBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKnR5cGUsIHVpbnQzMl90ICppZCkgewogICAgIC8vIEZvcm1hdCBtdXN0IGJlICI8dHlwZT4vPGlkPiIKQEAgLTEzNjksNyArMjM5Miw3IEBACiAKIAogc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgewogCkBAIC0xMzk3LDcgKzI0MjAsNyBAQAogCiAgICAgaW50IGlkeCA9IDA7CiAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CiAgICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwogICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwpAQCAtMTQ1OCwxMCArMjQ4MSwyMCBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCkgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlckxvZ2ljYWxDYW1lcmFJZHNMb2NrZWQoCkBAIC0xNDcwLDIwICsyNTAzLDE0IEBACiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoZGV2aWNlSWQpOworICAgICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSBjb250aW51ZTsKIAotICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOwogICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CiAKICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGI4YjhiOGMuLmE0MmZiNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTI3LDggKzI4LDggQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyLmg+Ci0vLyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi41L0lDYW1lcmFQcm92aWRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCkBAIC0xMTAsNiArMTExLDE0IEBACiAgICAgfTsKIAogICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIG1vZGUgYSBjYW1lcmEgZGV2aWNlIGlzIGN1cnJlbnRseSBpbgorICAgICAqLworICAgIGVudW0gY2xhc3MgRGV2aWNlTW9kZSB7CisgICAgICAgIFRPUkNILAorICAgICAgICBDQU1FUkEKKyAgICB9OworCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgbWFuYWdlciBhbmQgZ2l2ZSBpdCBhIHN0YXR1cyBsaXN0ZW5lcjsgb3B0aW9uYWxseSBhY2NlcHRzIGEgc2VydmljZQogICAgICAqIGludGVyYWN0aW9uIHByb3h5LgogICAgICAqCkBAIC0xNjYsNiArMTc1LDEzIEBACiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIENoZWNrIGZvciBkZXZpY2Ugc3VwcG9ydCBvZiBzcGVjaWZpYyBzdHJlYW0gY29tYmluYXRpb24uCisgICAgICovCisgICAgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGRldmljZSBpbnRlcmZhY2UgdmVyc2lvbiBmb3IgdGhpcyBJRAogICAgICAqLwogICAgIHN0YXR1c190IGdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKQEAgLTE3NCw3ICsxOTAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gY2FtZXJhIGRldmljZSBzdXBwb3J0IHNldFRvcmNoTW9kZSBBUEkuCiAgICAgICovCi0gICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCk7CisgICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBUdXJuIG9uIG9yIG9mZiB0aGUgZmxhc2hsaWdodCBvbiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UuCkBAIC0xODksNiArMjA1LDEyIEBACiAgICAgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCk7CiAKICAgICAvKioKKyAgICAgKiBJbmZvcm0gcmVnaXN0ZXJlZCBwcm92aWRlcnMgYWJvdXQgYSBkZXZpY2Ugc3RhdGUgY2hhbmdlLCBzdWNoIGFzIGZvbGRpbmcgb3IgdW5mb2xkaW5nCisgICAgICovCisgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpOworCisgICAgLyoqCiAgICAgICogT3BlbiBhbiBhY3RpdmUgc2Vzc2lvbiB0byBhIGNhbWVyYSBkZXZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGZ1bGx5IHBvd2VycyBvbiB0aGUgY2FtZXJhIGRldmljZSBoYXJkd2FyZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYQpAQCAtMjA1LDYgKzIyNywxNyBAQAogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7CiAKICAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGF0IHRoZSBjYW1lcmEgb3IgdG9yY2ggaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgY2xpZW50CisgICAgICovCisgICAgdm9pZCByZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKKyAgICAvKioKICAgICAgKiBJU2VydmljZU5vdGlmaWNhdGlvbjo6b25SZWdpc3RyYXRpb24KICAgICAgKiBJbnZva2VkIGJ5IHRoZSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgd2hlbiBhIG5ldyBjYW1lcmEgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZAogICAgICAqLwpAQCAtMjMxLDEyICsyNjQsMTUgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CiAKICAgICAvKgotICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIHdpdGggc3RhdGljSW5mbyBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KKyAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KICAgICAgKiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkcy4KICAgICAgKi8KLSAgICBzdGF0aWMgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCisgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKyAgICBib29sIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrRGVwdGhBUlRvbGVyYW5jZTsKIHByaXZhdGU6CiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CkBAIC0yNDYsMjIgKzI4Miw1NyBAQAogICAgIHdwPFN0YXR1c0xpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIG1TZXJ2aWNlUHJveHk7CiAKKyAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisKKyAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CisKICAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKIAorICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQorICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgY2FtZXJhCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIHRvcmNoCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKworICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkIGFuZCBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQKKyAgICBzdGQ6Om11dGV4IG1Qcm92aWRlckludGVyZmFjZU1hcExvY2s7CisKICAgICBzdHJ1Y3QgUHJvdmlkZXJJbmZvIDoKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaywKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudAogICAgIHsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVyTmFtZTsKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUludGVyZmFjZTsKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgIGludCBtTWlub3JWZXJzaW9uOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKKyAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOworICAgICAgICBib29sIG1Jc1JlbW90ZTsKKworICAgICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgICAgIC8vIFRoaXMgcG9pbnRlciBpcyB1c2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIElDYW1lcmFQcm92aWRlciB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkLgorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKIAogICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKLSAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CiAgICAgICAgIH5Qcm92aWRlckluZm8oKTsKIAotICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlKCkgY29uc3Q7CiAKQEAgLTI4Myw4NCArMzU0LDE3MyBAQAogICAgICAgICAvLyBoaWRsX2RlYXRoX3JlY2lwaWVudCBpbnRlcmZhY2UgLSB0aGlzIGxvY2tzIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSBvdmVycmlkZTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIHRoaXMgcHJvdmlkZXIKKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZnkgcHJvdmlkZXIgYWJvdXQgdG9wLWxldmVsIGRldmljZSBwaHlzaWNhbCBzdGF0ZSBjaGFuZ2VzCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZVN0YXRlKTsKKwogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb247CiAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgICAgIGJvb2wgbUlzTG9naWNhbENhbWVyYTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7CisgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBtSW5mbzsKKyAgICAgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgICAgICAgICBib29sIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBmYWxzZTsKIAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKIAorICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBtUGFyZW50UHJvdmlkZXI7CisKICAgICAgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KCkgY29uc3QgeyByZXR1cm4gbUhhc0ZsYXNoVW5pdDsgfQogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAodm9pZCkgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBib29sICogLypzdGF0dXMqLykgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KKyAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CiAKICAgICAgICAgICAgIERldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24mIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIpIDoKICAgICAgICAgICAgICAgICAgICAgbU5hbWUobmFtZSksIG1JZChpZCksIG1WZXJzaW9uKHZlcnNpb24pLCBtUHJvdmlkZXJUYWdpZCh0YWdJZCksCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCksCi0gICAgICAgICAgICAgICAgICAgIG1IYXNGbGFzaFVuaXQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnRQcm92aWRlcihwYXJlbnRQcm92aWRlciksIG1IYXNGbGFzaFVuaXQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzKHB1YmxpY0NhbWVyYUlkcykge30KICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8oKTsKICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgYm9vbCBtSGFzRmxhc2hVbml0OworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBtUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVGb3JEZXZpY2UoYm9vbCBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhpcyB3YXMKKyAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZSgpLCB3aGljaCBkb2VzIHNhdmUgaXQuCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKGludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbVVuaXF1ZUNhbWVyYUlkczsKICAgICAgICAgaW50IG1VbmlxdWVEZXZpY2VDb3VudDsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKKyAgICAgICAgLy8gVGhlIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMgcHVibGlzaGVkIGJ5IHRoZSBjYW1lcmEgcHJvdmlkZXIuCisgICAgICAgIC8vIEN1cnJlbnRseSBsb2dpY2FsIG11bHRpLWNhbWVyYSBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QtcGx1ZyBjYW1lcmEuCisgICAgICAgIC8vIEFuZCB3ZSB1c2UgdGhpcyBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcworICAgICAgICAvLyBhZHZlcnRpc2VkIGJ5IHRoZSBwcm92aWRlciwgYW5kIHRvIGRpc3Rpbmd1aXNoIGFnYWluc3QgImhpZGRlbiIKKyAgICAgICAgLy8gcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAvLyBIQUx2MS1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMSA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIC8vSW4gY2FzZSBvZiBEZXZpY2UxSW5mbyBhc3N1bWUgdGhhdCB3ZSBhcmUgYWx3YXlzIEFQSTEgY29tcGF0aWJsZQogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIERldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzEoKTsKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMyIG1EZWZhdWx0UGFyYW1ldGVyczsKKyAgICAgICAgICAgIHN0YXR1c190IGNhY2hlQ2FtZXJhSW5mbyhzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICB9OwogCiAgICAgICAgIC8vIEhBTHYzLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8zIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLSAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IG1JbnRlcmZhY2U7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgdm9pZCBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKnNpemVzIC8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR1cmF0aW9ucy8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXRpYyBib29sIGlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCk7CisgICAgICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBibG9iU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgZGVwdGhTaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpkeW5hbWljRGVwdGhTaXplcyAvKm91dCovLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmludGVybmFsRGVwdGhTaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF2YWlsYWJsZUtleXMoQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5VGFnKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogZHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogc3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVyaXZlSGVpY1RhZ3MoKTsKICAgICAgICAgfTsKIAogICAgIHByaXZhdGU6CkBAIC0zNzgsMTEgKzUzOCwxMSBAQAogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwogCiAgICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLApAQCAtNDE2LDYgKzU3NiwxNCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAorICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAorICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOworICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRldmljZVN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyYpOwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTYxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGVwdGhQaG90b1Byb2Nlc3NvciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8KKworI2luY2x1ZGUgIkRlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jYW1lcmFzLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RldmljZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGltZW5zaW9uLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9keW5hbWljX2RlcHRoLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wb2ludC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9zZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtc3lzdGVtLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXhpZlV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8eG1wbWV0YS94bXBfZGF0YS5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX3dyaXRlci5oPgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmE7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFzOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q29udGFpbmVyOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhGb3JtYXQ7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhVbml0czsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRpbWVuc2lvbjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdlOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6SXRlbTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlBvc2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQcm9maWxlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworRXhpZk9yaWVudGF0aW9uIGdldEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUpIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXJTaXplID09IDApKSB7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBhdXRvIGV4aWZEYXRhID0gZXhpZl9kYXRhX25ldygpOworICAgIGV4aWZfZGF0YV9sb2FkX2RhdGEoZXhpZkRhdGEsIGpwZWdCdWZmZXIsIGpwZWdCdWZmZXJTaXplKTsKKyAgICBFeGlmRW50cnkgKm9yaWVudGF0aW9uID0gZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLAorICAgICAgICAgICAgRVhJRl9UQUdfT1JJRU5UQVRJT04pOworICAgIGlmICgob3JpZW50YXRpb24gPT0gbnVsbHB0cikgfHwgKG9yaWVudGF0aW9uLT5zaXplICE9IHNpemVvZihFeGlmU2hvcnQpKSkgeworICAgICAgICBBTE9HVigiJXM6IE9yaWVudGF0aW9uIEVYSUYgZW50cnkgaW52YWxpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX2RhdGFfdW5yZWYoZXhpZkRhdGEpOworICAgICAgICByZXR1cm4gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgYXV0byBvcmllbnRhdGlvblZhbHVlID0gZXhpZl9nZXRfc2hvcnQob3JpZW50YXRpb24tPmRhdGEsIGV4aWZfZGF0YV9nZXRfYnl0ZV9vcmRlcihleGlmRGF0YSkpOworICAgIEV4aWZPcmllbnRhdGlvbiByZXQ7CisgICAgc3dpdGNoIChvcmllbnRhdGlvblZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJldCA9IHN0YXRpY19jYXN0PEV4aWZPcmllbnRhdGlvbj4gKG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgRVhJRiBvcmllbnRhdGlvbiB2YWx1ZTogJWQsIGRlZmF1bHRpbmcgdG8gMCBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIH0KKworICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1heE91dFNpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24sCisgICAgICAgIHNpemVfdCAmYWN0dWFsU2l6ZSkgeworICAgIHN0YXR1c190IHJldDsKKyAgICAvLyBsaWJqcGVnIGlzIGEgQyBsaWJyYXJ5IHNvIHdlIHVzZSBDLXN0eWxlICJpbmhlcml0YW5jZSIgYnkKKyAgICAvLyBwdXR0aW5nIGxpYmpwZWcncyBqcGVnX2Rlc3RpbmF0aW9uX21nciBmaXJzdCBpbiBvdXIgY3VzdG9tCisgICAgLy8gc3RydWN0LiBUaGlzIGFsbG93cyB1cyB0byBjYXN0IGpwZWdfZGVzdGluYXRpb25fbWdyKiB0bworICAgIC8vIEN1c3RvbUpwZWdEZXN0TWdyKiB3aGVuIHdlIGdldCBpdCBwYXNzZWQgdG8gdXMgaW4gYSBjYWxsYmFjay4KKyAgICBzdHJ1Y3QgQ3VzdG9tSnBlZ0Rlc3RNZ3IgOiBwdWJsaWMganBlZ19kZXN0aW5hdGlvbl9tZ3IgeworICAgICAgICBKT0NURVQgKm1CdWZmZXI7CisgICAgICAgIHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICAgICAgc2l6ZV90IG1FbmNvZGVkU2l6ZTsKKyAgICAgICAgYm9vbCBtU3VjY2VzczsKKyAgICB9IGRtZ3I7CisKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbyA9IHt9OworICAgIGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsaW5nIHdpdGggc3RhbmRhcmQgY2FsbGJhY2tzLCBidXQKKyAgICAvLyB0aGVuIG92ZXJyaWRlIG91dHB1dF9tZXNzYWdlICh0byBwcmludCB0byBBTE9HKSBhbmQKKyAgICAvLyBlcnJvcl9leGl0IHRvIHNldCBhIGZsYWcgYW5kIHByaW50IGEgbWVzc2FnZSBpbnN0ZWFkCisgICAgLy8gb2Yga2lsbGluZyB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisKKyAgICBjaW5mby5lcnItPm91dHB1dF9tZXNzYWdlID0gW10oal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgICAgIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCisgICAgICAgICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLCBidWZmZXIpOworICAgICAgICBBTE9HRSgibGlianBlZyBlcnJvcjogJXMiLCBidWZmZXIpOworICAgIH07CisKKyAgICBjaW5mby5lcnItPmVycm9yX2V4aXQgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkoY2luZm8pOworICAgICAgICBpZihjaW5mby0+Y2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGF1dG8gJiBkbWdyID0gKnN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyKj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgICAgICAgICAgIGRtZ3IubVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBpbml0aWFsaXplZCBzb21lIGNhbGxiYWNrcywgbGV0J3MgY3JlYXRlIG91ciBjb21wcmVzc29yCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgICBkbWdyLm1CdWZmZXIgPSBzdGF0aWNfY2FzdDxKT0NURVQqPihvdXQpOworICAgIGRtZ3IubUJ1ZmZlclNpemUgPSBtYXhPdXRTaXplOworICAgIGRtZ3IubUVuY29kZWRTaXplID0gMDsKKyAgICBkbWdyLm1TdWNjZXNzID0gdHJ1ZTsKKyAgICBjaW5mby5jbGllbnRfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmZG1ncik7CisKKyAgICAvLyBUaGVzZSBsYW1iZGFzIGJlY29tZSBDLXN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcyBwZXIgQysrMTEgc3BlYworICAgIC8vIG1heSBub3QgY2FwdHVyZSBhbnl0aGluZy4KKyAgICBkbWdyLmluaXRfZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5uZXh0X291dHB1dF9ieXRlID0gZG1nci5tQnVmZmVyOworICAgICAgICBkbWdyLmZyZWVfaW5fYnVmZmVyID0gZG1nci5tQnVmZmVyU2l6ZTsKKyAgICAgICAgQUxPR1YoIiVzOiVkIGpwZWcgc3RhcnQ6ICVwIFslenVdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tQnVmZmVyLCBkbWdyLm1CdWZmZXJTaXplKTsKKyAgICB9OworCisgICAgZG1nci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gW10oal9jb21wcmVzc19wdHIgY2luZm8gX191bnVzZWQpIHsKKyAgICAgICAgQUxPR1YoIiVzOiVkIE91dCBvZiBidWZmZXIiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIGRtZ3IudGVybV9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IGRtZ3IubUJ1ZmZlclNpemUgLSBkbWdyLmZyZWVfaW5fYnVmZmVyOworICAgICAgICBBTE9HVigiJXM6JWQgRG9uZSB3aXRoIGpwZWc6ICV6dSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUVuY29kZWRTaXplKTsKKyAgICB9OworICAgIGNpbmZvLmRlc3QgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21ncio+KCZkbWdyKTsKKyAgICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKyAgICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHRzIGFuZCB0aGVuIG92ZXJyaWRlIHdoYXQgd2Ugd2FudAorICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisKKyAgICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywganBlZ1F1YWxpdHksIDEpOworICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoJmNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICBjaW5mby5yYXdfZGF0YV9pbiA9IDA7CisgICAgY2luZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisKKyAgICBjaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworICAgIGlmIChleGlmT3JpZW50YXRpb24gIT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgICAgIHV0aWxzLT5pbml0aWFsaXplRW1wdHkoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlV2lkdGgod2lkdGgpOworICAgICAgICB1dGlscy0+c2V0SW1hZ2VIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgdXRpbHMtPnNldE9yaWVudGF0aW9uVmFsdWUoZXhpZk9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAodXRpbHMtPmdlbmVyYXRlQXBwMSgpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBleGlmQnVmZmVyID0gdXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemVfdCBleGlmQnVmZmVyU2l6ZSA9IHV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgICAgICAgICBqcGVnX3dyaXRlX21hcmtlcigmY2luZm8sIEpQRUdfQVBQMCArIDEsIHN0YXRpY19jYXN0PGNvbnN0IEpPQ1RFVCo+KGV4aWZCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBleGlmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBBcHAxIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNpbmZvLmltYWdlX2hlaWdodDsgaSsrKSB7CisgICAgICAgIGF1dG8gY3VycmVudFJvdyAgPSBzdGF0aWNfY2FzdDxKU0FNUFJPVz4oaW4gKyBpKndpZHRoKTsKKyAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmY3VycmVudFJvdywgLypudW1fbGluZXMqLzEpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgICBhY3R1YWxTaXplID0gZG1nci5tRW5jb2RlZFNpemU7CisgICAgaWYgKGRtZ3IubVN1Y2Nlc3MpIHsKKyAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbmxpbmUgdm9pZCB1bnBhY2tEZXB0aDE2KHVpbnQxNl90IHZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgLy8gQW5kcm9pZCBkZW5zZWx5IHBhY2tlZCBkZXB0aCBtYXAuIFRoZSB1bml0cyBmb3IgdGhlIHJhbmdlIGFyZSBpbgorICAgIC8vIG1pbGxpbWV0ZXJzIGFuZCBuZWVkIHRvIGJlIHNjYWxlZCB0byBtZXRlcnMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgMyBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgZGF0YSBuZWVkcyB0byBiZSBhZGRpdGlvbmFsbHkgbm9ybWFsaXplZCB3aXRoCisgICAgLy8gdmFsdWVzIDEuMGYsIDAuMGYgcmVwcmVzZW50aW5nIG1heGltdW0gYW5kIG1pbmltdW0gY29uZmlkZW5jZQorICAgIC8vIHJlc3BlY3RpdmVseS4KKyAgICBhdXRvIHBvaW50ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlICYgMHgxRkZGKSAvIDEwMDAuZjsKKyAgICBwb2ludHMtPnB1c2hfYmFjayhwb2ludCk7CisKKyAgICBhdXRvIGNvbmYgPSAodmFsdWUgPj4gMTMpICYgMHg3OworICAgIGZsb2F0IG5vcm1Db25maWRlbmNlID0gKGNvbmYgPT0gMCkgPyAxLmYgOiAoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmYpIC0gMSkgLyA3LmY7CisgICAgY29uZmlkZW5jZS0+cHVzaF9iYWNrKG5vcm1Db25maWRlbmNlKTsKKworICAgIGlmICgqbmVhciA+IHBvaW50KSB7CisgICAgICAgICpuZWFyID0gcG9pbnQ7CisgICAgfQorICAgIGlmICgqZmFyIDwgcG9pbnQpIHsKKyAgICAgICAgKmZhciA9IHBvaW50OworICAgIH0KK30KKworLy8gVHJpdmlhbCBjYXNlLCByZWFkIGZvcndhcmQgZnJvbSB0b3AsbGVmdCBjb3JuZXIuCit2b2lkIHJvdGF0ZTBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7IGorKykgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltpKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgal0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gOTAgZGVncmVlcyBDVyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGZyb20gYm90dG9tLCBsZWZ0IGNvcm5lcgorLy8gdHJhbnNwb3Npbmcgcm93cyBhbmQgY29sdW1ucy4KK3ZvaWQgcm90YXRlOTBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsgaSsrKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBqID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQtMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaippbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGldLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDE4MCBDVyBkZWdyZWVzIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgYmFja3dhcmRzIGZyb20gYm90dG9tLCByaWdodCBjb3JuZXIuCit2b2lkIHJvdGF0ZTE4MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodC0xOyBpID49IDA7IGktLSkgeworICAgICAgICBmb3IgKHNzaXplX3QgaiA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGgtMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaSppbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGpdLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDI3MCBkZWdyZWVzIENXIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgZnJvbSB0b3AsIHJpZ2h0IGNvcm5lcgorLy8gdHJhbnNwb3Npbmcgcm93cyBhbmQgY29sdW1ucy4KK3ZvaWQgcm90YXRlMjcwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGgtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsgaisrKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2oqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBpXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIHJvdGF0ZUFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgc3dpdGNoIChpbnB1dEZyYW1lLm1PcmllbnRhdGlvbikgeworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlOTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTE4MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTI3MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5zdXBwb3J0ZWQgZGVwdGggcGhvdG8gcm90YXRpb246ICVkLCBkZWZhdWx0IHRvIDAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubU9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp1bmlxdWVfcHRyPGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwPiBwcm9jZXNzRGVwdGhNYXBGcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLAorICAgICAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+ICppdGVtcyAvKm91dCovLAorICAgICAgICBib29sICpzd2l0Y2hEaW1lbnNpb25zIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGl0ZW1zID09IG51bGxwdHIpIHx8IChzd2l0Y2hEaW1lbnNpb25zID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwb2ludHMsIGNvbmZpZGVuY2U7CisKKyAgICBzaXplX3QgcG9pbnRDb3VudCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggKiBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICBwb2ludHMucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBjb25maWRlbmNlLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgZmxvYXQgbmVhciA9IFVJTlQxNl9NQVg7CisgICAgZmxvYXQgZmFyID0gLjBmOworICAgICpzd2l0Y2hEaW1lbnNpb25zID0gZmFsc2U7CisgICAgLy8gUGh5c2ljYWwgcm90YXRpb24gb2YgZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBtYXkgYmUgbmVlZGVkIGluIGNhc2UKKyAgICAvLyB0aGUgRVhJRiBvcmllbnRhdGlvbiBpcyBzZXQgdG8gMCBkZWdyZWVzIGFuZCB0aGUgZGVwdGggcGhvdG8gb3JpZW50YXRpb24KKyAgICAvLyAoc291cmNlIGNvbG9yIGltYWdlKSBoYXMgc29tZSBkaWZmZXJlbnQgdmFsdWUuCisgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUykgeworICAgICAgICAqc3dpdGNoRGltZW5zaW9ucyA9IHJvdGF0ZUFuZFVucGFjayhpbnB1dEZyYW1lLCAmcG9pbnRzLCAmY29uZmlkZW5jZSwgJm5lYXIsICZmYXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgJnBvaW50cywgJmNvbmZpZGVuY2UsICZuZWFyLCAmZmFyKTsKKyAgICB9CisKKyAgICBzaXplX3Qgd2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOworICAgIHNpemVfdCBoZWlnaHQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICBpZiAoKnN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgd2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICAgICAgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsKKyAgICB9CisKKyAgICBpZiAobmVhciA9PSBmYXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOZWFyIGFuZCBmYXIgcmFuZ2UgdmFsdWVzIG11c3Qgbm90IG1hdGNoISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBvaW50c1F1YW50aXplZCwgY29uZmlkZW5jZVF1YW50aXplZDsKKyAgICBwb2ludHNRdWFudGl6ZWQucmVzZXJ2ZShwb2ludENvdW50KTsgY29uZmlkZW5jZVF1YW50aXplZC5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGF1dG8gcG9pbnRJdCA9IHBvaW50cy5iZWdpbigpOworICAgIGF1dG8gY29uZmlkZW5jZUl0ID0gY29uZmlkZW5jZS5iZWdpbigpOworICAgIHdoaWxlICgocG9pbnRJdCAhPSBwb2ludHMuZW5kKCkpICYmIChjb25maWRlbmNlSXQgIT0gY29uZmlkZW5jZS5lbmQoKSkpIHsKKyAgICAgICAgcG9pbnRzUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKChmYXIgKiAoKnBvaW50SXQgLSBuZWFyKSkgLworICAgICAgICAgICAgICAgICgqcG9pbnRJdCAqIChmYXIgLSBuZWFyKSkpICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VRdWFudGl6ZWQucHVzaF9iYWNrKGZsb29yZigqY29uZmlkZW5jZUl0ICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VJdCsrOyBwb2ludEl0Kys7CisgICAgfQorCisgICAgRGVwdGhNYXBQYXJhbXMgZGVwdGhQYXJhbXMoRGVwdGhGb3JtYXQ6OmtSYW5nZUludmVyc2UsIG5lYXIsIGZhciwgRGVwdGhVbml0czo6a01ldGVycywKKyAgICAgICAgICAgICJhbmRyb2lkL2RlcHRobWFwIik7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV91cmkgPSAiYW5kcm9pZC9jb25maWRlbmNlbWFwIjsKKyAgICBkZXB0aFBhcmFtcy5taW1lID0gImltYWdlL2pwZWciOworICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemU7CisgICAgYXV0byByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIHBvaW50c1F1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBjb21wcmVzc2lvbiBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldCA9IGVuY29kZUdyYXlzY2FsZUpwZWcod2lkdGgsIGhlaWdodCwgY29uZmlkZW5jZVF1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEuZGF0YSgpLCBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIGFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29uZmlkZW5jZSBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldHVybiBEZXB0aE1hcDo6RnJvbURhdGEoZGVwdGhQYXJhbXMsIGl0ZW1zKTsKK30KKworZXh0ZXJuICJDIiBpbnQgcHJvY2Vzc0RlcHRoUGhvdG9GcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzaXplX3QgZGVwdGhQaG90b0J1ZmZlclNpemUsCisgICAgICAgIHZvaWQqIGRlcHRoUGhvdG9CdWZmZXIgLypvdXQqLywgc2l6ZV90KiBkZXB0aFBob3RvQWN0dWFsU2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyID09IG51bGxwdHIpIHx8IChkZXB0aFBob3RvQWN0dWFsU2l6ZSA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gaXRlbXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENhbWVyYT4+IGNhbWVyYUxpc3Q7CisgICAgYXV0byBpbWFnZSA9IEltYWdlOjpGcm9tRGF0YUZvclByaW1hcnlJbWFnZSgiYW5kcm9pZC9tYWluaW1hZ2UiLCAmaXRlbXMpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQYXJhbXM+IGNhbWVyYVBhcmFtcyhuZXcgQ2FtZXJhUGFyYW1zKHN0ZDo6bW92ZShpbWFnZSkpKTsKKyAgICBpZiAoY2FtZXJhUGFyYW1zID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiA9IGdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciksCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUpOworICAgIGJvb2wgc3dpdGNoRGltZW5zaW9uczsKKyAgICBjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9IHByb2Nlc3NEZXB0aE1hcEZyYW1lKGlucHV0RnJhbWUsIGV4aWZPcmllbnRhdGlvbiwgJml0ZW1zLAorICAgICAgICAgICAgJnN3aXRjaERpbWVuc2lvbnMpOworICAgIGlmIChjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggbWFwIHByb2Nlc3NpbmcgZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGdlbmVyYXRlIGFuIGltYWdpbmcgbW9kZWwgd2l0aG91dCBpbnN0cmluc2ljIGNhbGlicmF0aW9uLgorICAgIGlmIChpbnB1dEZyYW1lLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkKSB7CisgICAgICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgorICAgICAgICAvLyBbZm9jYWxMZW5ndGhYLCBmb2NhbExlbmd0aFksIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSwgc2tld10KKyAgICAgICAgY29uc3QgZHluYW1pY19kZXB0aDo6UG9pbnQ8ZG91YmxlPiBmb2NhbExlbmd0aChpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bMF0sCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzFdKTsKKyAgICAgICAgc2l6ZV90IHdpZHRoID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aDsKKyAgICAgICAgc2l6ZV90IGhlaWdodCA9IGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0OworICAgICAgICBpZiAoc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICAgICAgd2lkdGggPSBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodDsKKyAgICAgICAgICAgIGhlaWdodCA9IGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRGltZW5zaW9uIGltYWdlU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgSW1hZ2luZ01vZGVsUGFyYW1zIGltYWdpbmdQYXJhbXMoZm9jYWxMZW5ndGgsIGltYWdlU2l6ZSk7CisgICAgICAgIGltYWdpbmdQYXJhbXMucHJpbmNpcGFsX3BvaW50LnggPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bMl07CisgICAgICAgIGltYWdpbmdQYXJhbXMucHJpbmNpcGFsX3BvaW50LnkgPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bM107CisgICAgICAgIGltYWdpbmdQYXJhbXMuc2tldyA9IGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvbls0XTsKKworICAgICAgICAvLyBUaGUgY2FtZXJhIGxlbnMgZGlzdG9ydGlvbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlbnMgY29ycmVjdGlvbiBjb2VmZmljaWVudHMuCisgICAgICAgIC8vIFtrYXBwYV8xLCBrYXBwYV8yLCBrYXBwYV8zIGthcHBhXzQsIGthcHBhXzVdCisgICAgICAgIGlmIChpbnB1dEZyYW1lLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQpIHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uIHRoZSBsZW5zIGRpc3RvcnRpb24gY29lZmZpY2llbnRzIHNob3VsZCBiZSBvcmRlcmVkCisgICAgICAgICAgICAvLyBhcyBbMSwga2FwcGFfNCwga2FwcGFfMSwga2FwcGFfNSwga2FwcGFfMiwgMCwga2FwcGFfMywgMF0KKyAgICAgICAgICAgIGZsb2F0IGRpc3RvcnRpb25EYXRhW10gPSB7MS5mLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblszXSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMF0sIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzRdLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblsxXSwgMC5mLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblsyXSwgMC5mfTsKKyAgICAgICAgICAgIGF1dG8gZGlzdG9ydGlvbkRhdGFMZW5ndGggPSBzaXplb2YoZGlzdG9ydGlvbkRhdGEpIC8gc2l6ZW9mKGRpc3RvcnRpb25EYXRhWzBdKTsKKyAgICAgICAgICAgIGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5yZXNlcnZlKGRpc3RvcnRpb25EYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5pbnNlcnQoaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLmVuZCgpLCBkaXN0b3J0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGlvbkRhdGEgKyBkaXN0b3J0aW9uRGF0YUxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmFQYXJhbXMtPmltYWdpbmdfbW9kZWwgPSBJbWFnaW5nTW9kZWw6OkZyb21EYXRhKGltYWdpbmdQYXJhbXMpOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLm1Jc0xvZ2ljYWwpIHsKKyAgICAgICAgY2FtZXJhUGFyYW1zLT50cmFpdCA9IGR5bmFtaWNfZGVwdGg6OkNhbWVyYVRyYWl0OjpMT0dJQ0FMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYVBhcmFtcy0+dHJhaXQgPSBkeW5hbWljX2RlcHRoOjpDYW1lcmFUcmFpdDo6UEhZU0lDQUw7CisgICAgfQorCisgICAgY2FtZXJhTGlzdC5lbXBsYWNlX2JhY2soQ2FtZXJhOjpGcm9tRGF0YShzdGQ6Om1vdmUoY2FtZXJhUGFyYW1zKSkpOworCisgICAgYXV0byBkZXZpY2VQYXJhbXMgPSBzdGQ6Om1ha2VfdW5pcXVlPERldmljZVBhcmFtcz4gKENhbWVyYXM6OkZyb21DYW1lcmFBcnJheSgmY2FtZXJhTGlzdCkpOworICAgIGRldmljZVBhcmFtcy0+Y29udGFpbmVyID0gQ29udGFpbmVyOjpGcm9tSXRlbXMoJml0ZW1zKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZT4+IHByb2ZpbGVMaXN0OworICAgIHByb2ZpbGVMaXN0LmVtcGxhY2VfYmFjayhQcm9maWxlOjpGcm9tRGF0YSgiRGVwdGhQaG90byIsIHswfSkpOworICAgIGRldmljZVBhcmFtcy0+cHJvZmlsZXMgPSBQcm9maWxlczo6RnJvbVByb2ZpbGVBcnJheSgmcHJvZmlsZUxpc3QpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2U+IGRldmljZSA9IERldmljZTo6RnJvbURhdGEoc3RkOjptb3ZlKGRldmljZVBhcmFtcykpOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpbnB1dEpwZWdTdHJlYW0oCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciwgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplKSk7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dHB1dEpwZWdTdHJlYW07CisgICAgaWYgKCFXcml0ZUltYWdlQW5kTWV0YWRhdGFBbmRDb250YWluZXIoJmlucHV0SnBlZ1N0cmVhbSwgZGV2aWNlLmdldCgpLCAmb3V0cHV0SnBlZ1N0cmVhbSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgd3JpdGluZyBkZXB0aCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpkZXB0aFBob3RvQWN0dWFsU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4gKG91dHB1dEpwZWdTdHJlYW0udGVsbHAoKSk7CisgICAgaWYgKCpkZXB0aFBob3RvQWN0dWFsU2l6ZSA+IGRlcHRoUGhvdG9CdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gb3V0cHV0IGJ1ZmZlciBub3Qgc3VmZmljaWVudCwgbmVlZGVkICV6dSBhY3R1YWwgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICpkZXB0aFBob3RvQWN0dWFsU2l6ZSwgZGVwdGhQaG90b0J1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbWNweShkZXB0aFBob3RvQnVmZmVyLCBvdXRwdXRKcGVnU3RyZWFtLnN0cigpLmNfc3RyKCksICpkZXB0aFBob3RvQWN0dWFsU2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJmYmZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfUFJPQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitlbnVtIERlcHRoUGhvdG9PcmllbnRhdGlvbiB7CisgICAgREVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTICAgPSAwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMgID0gOTAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMgPSAxODAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgPSAyNzAsCit9OworCitzdHJ1Y3QgRGVwdGhQaG90b0lucHV0RnJhbWUgeworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICBtTWFpbkpwZWdCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYWluSnBlZ1NpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYWluSnBlZ1dpZHRoLCBtTWFpbkpwZWdIZWlnaHQ7CisgICAgdWludDE2X3QqICAgICAgICAgICAgIG1EZXB0aE1hcEJ1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbURlcHRoTWFwV2lkdGgsIG1EZXB0aE1hcEhlaWdodCwgbURlcHRoTWFwU3RyaWRlOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1KcGVnUXVhbGl0eTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzTG9naWNhbDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZDsKKyAgICBEZXB0aFBob3RvT3JpZW50YXRpb24gbU9yaWVudGF0aW9uOworCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUoKSA6CisgICAgICAgICAgICBtTWFpbkpwZWdCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtTWFpbkpwZWdTaXplKDApLAorICAgICAgICAgICAgbU1haW5KcGVnV2lkdGgoMCksCisgICAgICAgICAgICBtTWFpbkpwZWdIZWlnaHQoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtRGVwdGhNYXBXaWR0aCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcEhlaWdodCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcFN0cmlkZSgwKSwKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSgwKSwKKyAgICAgICAgICAgIG1KcGVnUXVhbGl0eSgxMDApLAorICAgICAgICAgICAgbUlzTG9naWNhbCgwKSwKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb257MC5mfSwKKyAgICAgICAgICAgIG1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkKDApLAorICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNMZW5zRGlzdG9ydGlvblZhbGlkKDApLAorICAgICAgICAgICAgbU9yaWVudGF0aW9uKERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTKSB7fQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmtEZXB0aFBob3RvTGlicmFyeSA9ICJsaWJkZXB0aHBob3RvLnNvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbiA9ICJwcm9jZXNzRGVwdGhQaG90b0ZyYW1lIjsKK3R5cGVkZWYgaW50ICgqcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSkgKERlcHRoUGhvdG9JbnB1dEZyYW1lIC8qaW5wdXRGcmFtZSovLAorICAgICAgICBzaXplX3QgLypkZXB0aFBob3RvQnVmZmVyU2l6ZSovLCB2b2lkKiAvKmRlcHRoUGhvdG9CdWZmZXIgb3V0Ki8sCisgICAgICAgIHNpemVfdCogLypkZXB0aFBob3RvQWN0dWFsU2l6ZSBvdXQqLyk7CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGIyMDExMTkuLjI3OTQzMjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNTYsNiArNTYsOSBAQAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCisKKyNpbmNsdWRlIDx0dXBsZT4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKQEAgLTc4LDExICs4MSwxMCBAQAogICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxpc3RlbmVyKE5VTEwpLAogICAgICAgICBtVmVuZG9yVGFnSWQoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEKSwKLSAgICAgICAgbUxhc3RUZW1wbGF0ZUlkKC0xKQorICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpLAorICAgICAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MoZmFsc2UpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6bm90aWZ5ID0gJnNOb3RpZnk7Ci0gICAgY2FtZXJhM19jYWxsYmFja19vcHM6OnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgPSAmc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OwogICAgIEFMT0dWKCIlczogQ3JlYXRlZCBkZXZpY2UgZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIH0KIApAQCAtOTAsNyArOTIsNyBAQAogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKLSAgICBkaXNjb25uZWN0KCk7CisgICAgZGlzY29ubmVjdEltcGwoKTsKIH0KIAogY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0RldmljZTo6Z2V0SWQoKSBjb25zdCB7CkBAIC0xMjcsNyArMTI5LDcgQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgYm9vbCBpc0xvZ2ljYWwgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlSW5mbywgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgaWYgKGlzTG9naWNhbCkgewogICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgewogICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKHBoeXNpY2FsSWQsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKQEAgLTE4MSw3ICsxODMsMTQgQEAKICAgICAgICAgICAgIH0pOwogICAgIH0KIAotICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYnVmTWdyTW9kZSA9CisgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTik7CisgICAgaWYgKGJ1Zk1nck1vZGUuY291bnQgPiAwKSB7CisgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciA9IChidWZNZ3JNb2RlLmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTl9ISURMX0RFVklDRV8zXzUpOworICAgIH0KKworICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOwogICAgIG1WZW5kb3JUYWdJZCA9IG1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQobUlkLnN0cmluZygpKTsKICAgICBtVGFnTW9uaXRvci5pbml0aWFsaXplKG1WZW5kb3JUYWdJZCk7CkBAIC0xODksNiArMTk4LDI4IEBACiAgICAgICAgIG1UYWdNb25pdG9yLnBhcnNlVGFnc1RvTW9uaXRvcihTdHJpbmc4KG1vbml0b3JUYWdzKSk7CiAgICAgfQogCisgICAgLy8gTWV0YWRhdGEgdGFncyBuZWVkcyBmaXh1cCBmb3IgbW9ub2Nocm9tZSBjYW1lcmEgZGV2aWNlIHZlcnNpb24gbGVzcworICAgIC8vIHRoYW4gMy41LgorICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbnswLDB9OworICAgIHJlcyA9IG1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKG1JZC5zdHJpbmcoKSwgJm1heFZlcnNpb24pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBpZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICBtYXhWZXJzaW9uLmdldF9tYWpvcigpLCBtYXhWZXJzaW9uLmdldF9taW5vcigpKTsKKworICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgaXNNb25vY2hyb21lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MgPSAoaXNNb25vY2hyb21lICYmIGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSk7CisKICAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOwogfQogCkBAIC0yMDgsNiArMjM5LDE3IEBACiAgICAgLyoqIFJlZ2lzdGVyIGluLWZsaWdodCBtYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyICovCiAgICAgbUluRmxpZ2h0U3RhdHVzSWQgPSBtU3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiAKKyAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RCdWZmZXJTTS5pbml0aWFsaXplKG1TdGF0dXNUcmFja2VyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBidWZmZXIgc3RhdGUgbWFjaGluZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbUludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIENyZWF0ZSBidWZmZXIgbWFuYWdlciAqLwogICAgIG1CdWZmZXJNYW5hZ2VyID0gbmV3IENhbWVyYTNCdWZmZXJNYW5hZ2VyKCk7CiAKQEAgLTIxNyw4ICsyNTksMTAgQEAKICAgICBpZiAoc2Vzc2lvbktleXNFbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgc2Vzc2lvblBhcmFtS2V5cy5pbnNlcnRBcnJheUF0KHNlc3Npb25LZXlzRW50cnkuZGF0YS5pMzIsIDAsIHNlc3Npb25LZXlzRW50cnkuY291bnQpOwogICAgIH0KKwogICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLwotICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMpOworICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQoCisgICAgICAgICAgICB0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cywgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lcy1SZXFRdWV1ZSIsIG1JZC5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBxdWV1ZSB0aHJlYWQ6ICVzICglZCkiLApAQCAtMjcwLDExICszMTQsMTQgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgcmV0dXJuIGRpc2Nvbm5lY3RJbXBsKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3RJbXBsKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKIApAQCAtMzQxLDYgKzM4OCw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLmNsZWFyKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBzdExvY2sobVRyYWNrZXJMb2NrKTsKICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKICAgICAgICAgaW50ZXJmYWNlID0gbUludGVyZmFjZS5nZXQoKTsKICAgICB9CkBAIC04MzksMTQgKzg4NywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+IHJlcXVlc3RzTGlzdDsKICAgICBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gc3VyZmFjZU1hcHM7CiAgICAgY29udmVydFRvUmVxdWVzdExpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgcmVxdWVzdCk7CiAKLSAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOworICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCBsYXN0RnJhbWVOdW1iZXIpOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OmNvbnZlcnRUb1JlcXVlc3RMaXN0KExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+JiByZXF1ZXN0c0xpc3QsCkBAIC05MTMsNiArOTYxLDIzMiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJldDsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jayk7CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkczsKKyAgICBzc2l6ZV90IHN6ID0gc3RyZWFtSWRzLnNldENhcGFjaXR5KGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBpZiAoc3ogPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oc3opICE9IGJ1ZlJlcXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXp1IGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGlmIChidWZSZXFzLnNpemUoKSA+IG1PdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHRvbyBtYW55IGJ1ZmZlciByZXF1ZXN0cyAoJXp1ID4gIyBvZiBvdXRwdXQgc3RyZWFtcyAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpLCBtT3V0cHV0U3RyZWFtcy5zaXplKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgc3RyZWFtSWQKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZlJlcSA6IGJ1ZlJlcXMpIHsKKyAgICAgICAgaWYgKHN0cmVhbUlkcy5pbmRleE9mKGJ1ZlJlcS5zdHJlYW1JZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiBidWZmZXIgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtSWRzLmFkZChidWZSZXEuc3RyZWFtSWQpOworICAgIH0KKworICAgIGlmICghbVJlcXVlc3RCdWZmZXJTTS5zdGFydFJlcXVlc3RCdWZmZXIoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgYnVmZmVyIGRpc2FsbG93ZWQgd2hpbGUgY2FtZXJhIHNlcnZpY2UgaXMgY29uZmlndXJpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9DT05GSUdVUklORywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGJ1ZlJldHMucmVzaXplKGJ1ZlJlcXMuc2l6ZSgpKTsKKworICAgIGJvb2wgYWxsUmVxc1N1Y2NlZWRzID0gdHJ1ZTsKKyAgICBib29sIG9uZVJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZSZXFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGJ1ZlJlcSA9IGJ1ZlJlcXNbaV07CisgICAgICAgIGF1dG8mIGJ1ZlJldCA9IGJ1ZlJldHNbaV07CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBidWZSZXEuc3RyZWFtSWQ7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGVtcHR5QnVmUmV0czsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgZW1wdHlCdWZSZXRzKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00uZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CisgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmUmV0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgIHNpemVfdCBoYW5kT3V0QnVmZmVyQ291bnQgPSBvdXRwdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCk7CisgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBidWZSZXEubnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgc2l6ZV90IHRvdGFsSGFuZG91dCA9IGhhbmRPdXRCdWZmZXJDb3VudCArIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIHVpbnQzMl90IG1heEJ1ZmZlcnMgPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCktPm1heF9idWZmZXJzOworICAgICAgICBpZiAodG90YWxIYW5kb3V0ID4gbWF4QnVmZmVycykgeworICAgICAgICAgICAgLy8gTm90IGFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIGJ1ZmZlci4gRXhpdCBlYXJseSBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCB0b28gbXVjaCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6IGF0IEhBTDogJXp1ICsgcmVxdWVzdGluZzogJWQiCisgICAgICAgICAgICAgICAgICAgICIgPiBtYXg6ICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgaGFuZE91dEJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJzUmVxdWVzdGVkLCBtYXhCdWZmZXJzKTsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyPiB0bXBSZXRCdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOworICAgICAgICBib29sIGN1cnJlbnRSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBzdHJlYW1CdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOworICAgICAgICBzaXplX3QgbnVtQWxsb2NhdGVkQnVmZmVycyA9IDA7CisgICAgICAgIHNpemVfdCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGIrKykgeworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGNhbiBydW4gY29uY3VycmVudGx5IHdpdGggcmVxdWVzdCB0aHJlYWQKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSB3YWl0IGR1cmF0aW9uIGV2ZXJ5dGltZSB3ZSBjYWxsIGdldGJ1ZmZlcgorICAgICAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSBrQmFzZUdldEJ1ZmZlcldhaXQgKyBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZzYiwgd2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gVElNRURfT1VUIHx8IHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1BbGxvY2F0ZWRCdWZmZXJzKys7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gc2IuYnVmZmVyOworICAgICAgICAgICAgYXV0byBwYWlyID0gbUludGVyZmFjZS0+Z2V0QnVmZmVySWQoKmJ1ZmZlciwgc3RyZWFtSWQpOworICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKworICAgICAgICAgICAgaEJ1Zi5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgaEJ1Zi5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gKmJ1ZmZlciA6IG51bGxwdHI7CisgICAgICAgICAgICBoQnVmLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzYi5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzYi5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEJ1Zi5hY3F1aXJlRmVuY2Uuc2V0VG8oYWNxdWlyZUZlbmNlLCAvKnNob3VsZE93biovdHJ1ZSk7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IHJlZ2lzdGVyIHJlcXVlc3QgYnVmZmVycyBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycysrOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50UmVxU3VjY2VlZHMpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuYnVmZmVycyhzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOworICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgc2IuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIHNiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RyZWFtQnVmZmVycy5kYXRhKCksIG51bUFsbG9jYXRlZEJ1ZmZlcnMsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgX2hpZGxfY2IoYWxsUmVxc1N1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6T0sgOgorICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfUEFSVElBTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9VTktOT1dOLAorICAgICAgICAgICAgYnVmUmV0cyk7CisgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZXJtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgYnVmIDogYnVmZmVycykgeworICAgICAgICBpZiAoYnVmLmJ1ZmZlcklkID09IEhhbEludGVyZmFjZTo6QlVGRkVSX0lEX05PX0JVRkZFUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIHdpdGhvdXQgYnVmZmVySWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCAiIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5idWZmZXJJZCwgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOworICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOworICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBzdHJlYW1CdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworCisgICAgICAgIGlmIChidWYucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGJ1Zi5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKCZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewpAQCAtMTA2MSwyNyArMTMzNSw1MSBAQAogICAgICAgICBhdXRvJiBiRHN0ID0gb3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgY29uc3QgU3RyZWFtQnVmZmVyICZiU3JjID0gcmVzdWx0Lm91dHB1dEJ1ZmZlcnNbaV07CiAKLSAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGJTcmMuc3RyZWFtSWQpOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBJbnZhbGlkIG91dHB1dCBzdHJlYW0gaWQgJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYkRzdC5zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIGJEc3Quc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyOwotICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOworICAgICAgICBib29sIG5vQnVmZmVyUmV0dXJuZWQgPSBmYWxzZTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgc3VzcGljaW91cyBtb3N0IG9mIHRoZSB0aW1lIGJ1dCBjYW4gYmUgY29ycmVjdCBkdXJpbmcgZmx1c2ggd2hlcmUgSEFMCisgICAgICAgICAgICAvLyBoYXMgdG8gcmV0dXJuIGNhcHR1cmUgcmVzdWx0IGJlZm9yZSBhIGJ1ZmZlciBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChiU3JjLmJ1ZmZlcklkID09IEhhbEludGVyZmFjZTo6QlVGRkVSX0lEX05PX0JVRkZFUikgeworICAgICAgICAgICAgICAgIGlmIChiU3JjLnN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYlNyYy5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKICAgICAgICAgYkRzdC5idWZmZXIgPSBidWZmZXI7CiAgICAgICAgIGJEc3Quc3RhdHVzID0gbWFwSGlkbEJ1ZmZlclN0YXR1cyhiU3JjLnN0YXR1cyk7CiAgICAgICAgIGJEc3QuYWNxdWlyZV9mZW5jZSA9IC0xOwogICAgICAgICBpZiAoYlNyYy5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gLTE7CiAgICAgICAgIH0gZWxzZSBpZiAoYlNyYy5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZ290IHJlbGVhc2VGZW5jZSB3aXRob3V0IG91dHB1dCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IGR1cChiU3JjLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UgZm9yIGJ1ZmZlciAlenUsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCkBAIC0xMTU3LDEzICsxNDU1LDEzIEBACiAgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkEzX01TR19FUlJPUjsKICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOwogICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7CiAgICAgICAgICAgICB9CkBAIC0xMzQ0LDYgKzE2NDIsNTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6YWRkKAorICAgICAgICBpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSkgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBhZGQgbnVsbCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmFkZChzdHJlYW1JZCwgc3RyZWFtKTsKK30KKworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OnJlbW92ZShpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLnJlbW92ZUl0ZW0oc3RyZWFtSWQpOworfQorCitzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPgorQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpnZXQoaW50IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHNzaXplX3QgaWR4ID0gbURhdGEuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1EYXRhLmVkaXRWYWx1ZUF0KGlkeCk7Cit9CisKK3NwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+CitDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6Om9wZXJhdG9yW10gKHNpemVfdCBpbmRleCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuZWRpdFZhbHVlQXQoaW5kZXgpOworfQorCitzaXplX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpzaXplKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuc2l6ZSgpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Y2xlYXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5jbGVhcigpOworfQorCitzdGQ6OnZlY3RvcjxpbnQ+IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Z2V0U3RyZWFtSWRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN0cmVhbUlkcyhtRGF0YS5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RyZWFtSWRzW2ldID0gbURhdGEua2V5QXQoaSk7CisgICAgfQorICAgIHJldHVybiBzdHJlYW1JZHM7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCkBAIC0xNDIyLDE4ICsxNzcwLDIwIEBACiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBzc2l6ZV90IGJsb2JCdWZmZXJTaXplOwotICAgICAgICBpZiAoZGF0YVNwYWNlICE9IEhBTF9EQVRBU1BBQ0VfREVQVEgpIHsKLSAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpIHsKICAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKTsKICAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIHBvaW50IGNsb3VkIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUykpIHsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYmxvYkJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKQEAgLTE0NTAsNyArMTgwMCw4IEBACiAgICAgfSBlbHNlIGlmIChpc1NoYXJlZCkgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnMsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgfSBlbHNlIGlmIChjb25zdW1lcnMuc2l6ZSgpID09IDAgJiYgaGFzRGVmZXJyZWRDb25zdW1lcikgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKQEAgLTE1MjcsMjAgKzE4NzgsMjAgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBpZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtSW5mby0+d2lkdGggID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0V2lkdGgoKTsKLSAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRIZWlnaHQoKTsKLSAgICBzdHJlYW1JbmZvLT5mb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXREYXRhU3BhY2UoKTsKLSAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNGb3JtYXRPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbEZvcm1hdCgpOwotICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZU92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKLSAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+d2lkdGggID0gc3RyZWFtLT5nZXRXaWR0aCgpOworICAgIHN0cmVhbUluZm8tPmhlaWdodCA9IHN0cmVhbS0+Z2V0SGVpZ2h0KCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gc3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2UgPSBzdHJlYW0tPmdldERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdE92ZXJyaWRkZW4gPSBzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZU92ZXJyaWRkZW4gPSBzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRGF0YVNwYWNlID0gc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTU2NywxNCArMTkxOCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwKLSAgICAgICAgICAgICAgICBpZCk7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICByZXR1cm4gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgcmV0dXJuIHN0cmVhbS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRlbGV0ZVN0cmVhbShpbnQgaWQpIHsKQEAgLTE1OTksMjEgKzE5NDgsMjEgQEAKICAgICB9CiAKICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CiAgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtSW5wdXRTdHJlYW07CiAgICAgICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIERlbGV0ZSBvdXRwdXQgc3RyZWFtIG9yIHRoZSBvdXRwdXQgcGFydCBvZiBhIGJpLWRpcmVjdGlvbmFsIHN0cmVhbS4KLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtKGlkKTsKKyAgICBpZiAoc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlZFN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKGlkKTsKICAgICB9CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQpAQCAtMTY5Niw3ICsyMDQ1LDcgQEAKIAogICAgIGlmICh0ZW1wbGF0ZUlkIDw9IDAgfHwgdGVtcGxhdGVJZCA+PSBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2ODY2MTEwIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTg1NCw2ICsyMjAzLDE0IEBACiAKICAgICBtU3RhdHVzV2FpdGVycysrOwogCisgICAgaWYgKCFhY3RpdmUgJiYgbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgYXV0byBzdHJlYW1JZHMgPSBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPnNpZ25hbFBpcGVsaW5lRHJhaW4oc3RyZWFtSWRzKTsKKyAgICAgICAgfQorICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uV2FpdFVudGlsSWRsZSgpOworICAgIH0KKwogICAgIGJvb2wgc3RhdGVTZWVuID0gZmFsc2U7CiAgICAgZG8gewogICAgICAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7CkBAIC0yMDEzLDYgKzIzNzAsMTMgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgICAgIC8vIGIvMTE2NTE0MTA2ICJkaXNjb25uZWN0KCkiIGNhbiBnZXQgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBkZXZpY2UuIFRoZQorICAgICAgICAvLyBjYW1lcmEgZGV2aWNlIHdpbGwgbm90IGJlIGluaXRpYWxpemVkIGR1cmluZyB0aGUgc2Vjb25kIHJ1bi4KKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcigvKm91dCovZnJhbWVOdW1iZXIpOwogICAgIH0KIApAQCAtMjAyOSwxNSArMjM5MywxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLQogICAgIGlmIChzdHJlYW0tPmlzVW5wcmVwYXJhYmxlKCkgfHwgc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSApIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBoYXMgYWxyZWFkeSBiZWVuIGEgcmVxdWVzdCB0YXJnZXQiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMDU3LDE1ICsyNDE4LDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotCiAgICAgaWYgKHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgfHwgbVJlcXVlc3RUaHJlYWQtPmlzU3RyZWFtUGVuZGluZyhzdHJlYW0pKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgYSB0YXJnZXQgb2YgYSBpbi1wcm9ncmVzcyByZXF1ZXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjA4MSwxNCArMjQzOSwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKICAgICBzdHJlYW0tPmFkZEJ1ZmZlckxpc3RlbmVyKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTIxNDcsMTIgKzI1MDIsMTEgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5zZXRDb25zdW1lcnMoY29uc3VtZXJzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgc2V0IGNvbnN1bWVyIGZhaWxlZCAoZXJyb3IgJWQgJXMpICIsIHN0cmVhbUlkLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKQEAgLTIxOTcsMTAgKzI1NTEsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogcmVtb3ZlZFN1cmZhY2VJZHMpIHsKQEAgLTIyMTAsNyArMjU2NCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOwogICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+dXBkYXRlU3RyZWFtKG5ld1N1cmZhY2VzLCBvdXRwdXRJbmZvLCByZW1vdmVkU3VyZmFjZUlkcywgb3V0cHV0TWFwKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZmFpbGVkIHRvIHVwZGF0ZSBzdHJlYW0gKGVycm9yICVkICVzKSAiLApAQCAtMjIyOSwxMyArMjU4MiwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBpcyBub3QgZm91bmQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKICAgICByZXR1cm4gc3RyZWFtLT5kcm9wQnVmZmVycyhkcm9wcGluZyk7CiB9CiAKQEAgLTIyODksMTUgKzI2NDAsMTIgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbXMuY291bnQ7IGkrKykgewotICAgICAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1zLmRhdGEuaTMyW2ldKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyB1bmtub3duIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS51OFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KLSAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwotCiAgICAgICAgIC8vIEl0IGlzIGlsbGVnYWwgdG8gaW5jbHVkZSBhIGRlZmVycmVkIGNvbnN1bWVyIG91dHB1dCBzdHJlYW0gaW50byBhIHJlcXVlc3QKICAgICAgICAgYXV0byBpdGVyID0gc3VyZmFjZU1hcC5maW5kKHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICBpZiAoaXRlciAhPSBzdXJmYWNlTWFwLmVuZCgpKSB7CkBAIC0yMzA5LDcgKzI2NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbaV0gPSBzdXJmYWNlczsKKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1zLmRhdGEuaTMyW2ldXSA9IHN1cmZhY2VzOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTGF6eSBjb21wbGV0aW9uIG9mIHN0cmVhbSBjb25maWd1cmF0aW9uIChhbGxvY2F0aW9uL3JlZ2lzdHJhdGlvbikKQEAgLTIzNTgsNyArMjcwNiw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNDkzLDcgKzI4NDEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqb3V0cHV0U3RyZWFtOwotICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3Qgc3RhcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgICBjYW5jZWxTdHJlYW1zQ29uZmlndXJhdGlvbkxvY2tlZCgpOwpAQCAtMjUwMSwxMiArMjg0OSwxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbXMuYWRkKG91dHB1dFN0cmVhbSk7CiAKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICAgICAgc2l6ZV90IGsgPSBpICsgKChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyAxIDogMCk7IC8vIElucHV0IHN0cmVhbSBpZiBwcmVzZW50IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBvY2N1cHkgdGhlIGluaXRpYWwgZW50cnkuCi0gICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBvdXRwdXRTdHJlYW0tPndpZHRoICogb3V0cHV0U3RyZWFtLT5oZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQmxvYiBkYXRhU3BhY2UgJWQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1NTEsOCArMjkwNiw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkgJiYgIW91dHB1dFN0cmVhbS0+aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZCgpKSB7CiAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI2MTUsNiArMjk2OSwxMCBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI2NTksMTUgKzMwMTcsMTIgQEAKICAgICAvLyBPaywgaGF2ZSBhIGR1bW15IHN0cmVhbSBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgb3RoZXIgb3V0cHV0IHN0cmVhbSwKICAgICAvLyBzbyByZW1vdmUgdGhlIGR1bW15CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtRHVtbXlTdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChkZWxldGVkU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCi0gICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRHVtbXlTdHJlYW1JZCk7CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQogICAgIHJlcyA9IGRlbGV0ZWRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKQEAgLTI3NDEsMTggKzMwOTYsMjEgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKLSAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1JbkZsaWdodFN0YXR1c0lkKTsKICAgICAgICAgfQpAQCAtMjc2NCwxNyArMzEyMiw2OCBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzKSB7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykKICAgICB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXApOworICAgICAgICBpZiAob3V0cHV0QnVmZmVyc1tpXS5idWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIFdpdGggSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSwgSEFMIHNvbWV0aW1lcyB3aWxsIGhhdmUgdG8gcmV0dXJuIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKKyAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbUludGVyZmFjZSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IHN0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgY29uc3QgYXV0byYgaXQgPSBvdXRwdXRTdXJmYWNlcy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgaXQtPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIExvbmcgcHJvY2Vzc2luZyBjb25zdW1lcnMgY2FuIGNhdXNlIHJldHVybkJ1ZmZlciB0aW1lb3V0IGZvciBzaGFyZWQgc3RyZWFtCisgICAgICAgIC8vIElmIHRoYXQgaGFwcGVucywgY2FuY2VsIHRoZSBidWZmZXIgYW5kIHNlbmQgYSBidWZmZXIgZXJyb3IgdG8gY2xpZW50CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSAmJiByZXMgPT0gVElNRURfT1VUICYmCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXS5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOworICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgYnVmZmVyIGVycm9yCisgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcyA9IGluUmVzdWx0RXh0cmFzOworICAgICAgICAgICAgICAgIGV4dHJhcy5lcnJvclN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC0yNzg1LDggKzMxOTQsMTAgQEAKIAogICAgIC8vIEluZGljYXRlIGlkbGUgaW5GbGlnaHRNYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uSW5mbGlnaHRNYXBFbXB0eSgpOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtSW5GbGlnaHRTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQpAQCAtMjgxMSw2ICszMjIyLDEwIEBACiAgICAgaWYgKHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCAmJgogICAgICAgICAgICAgKHJlcXVlc3Quc2tpcFJlc3VsdE1ldGFkYXRhIHx8CiAgICAgICAgICAgICAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgc2h1dHRlclRpbWVzdGFtcCAhPSAwKSkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdGlsbCBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgiZnJhbWUgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiBzZW5zb3IgdGltZXN0YW1wIG1hdGNoZXMgc2h1dHRlciB0aW1lc3RhbXAgaW4gdGhlCkBAIC0yODI3LDcgKzMyNDIsOCBAQAogICAgICAgICBhc3NlcnQocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LIHx8CiAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSA9PSAwKTsKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoaWR4KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVtb3ZlZCBmcmFtZSAlZCBmcm9tIEluRmxpZ2h0TWFwIiwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CkBAIC0yODUxLDcgKzMyNjcsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpZHgrKykgewogICAgICAgICAgICAgY29uc3QgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAgICAgICAgIG1JbkZsaWdodE1hcC5jbGVhcigpOwogICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKQEAgLTI4NjEsNyArMzI3OSwxNSBAQAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gaW5mbGlnaHRLZXlzOwogICAgIG1JbnRlcmZhY2UtPmdldEluZmxpZ2h0QnVmZmVyS2V5cygmaW5mbGlnaHRLZXlzKTsKIAotICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICAvLyBJbmZsaWdodCBidWZmZXJzIGZvciBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5czsKKyAgICBtSW50ZXJmYWNlLT5nZXRJbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKCZpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKTsKKworICAgIC8vIChzdHJlYW1JZCwgZnJhbWVOdW1iZXIsIGJ1ZmZlcl9oYW5kbGVfdCopIHR1cGxlIGZvciBhbGwgaW5mbGlnaHQgYnVmZmVycy4KKyAgICAvLyBmcmFtZU51bWJlciB3aWxsIGJlIC0xIGZvciBidWZmZXJzIGZyb20gSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxpbnQzMl90LCBpbnQzMl90LCBidWZmZXJfaGFuZGxlX3QqPj4gaW5mbGlnaHRCdWZmZXJzOworICAgIGluZmxpZ2h0QnVmZmVycy5yZXNlcnZlKGluZmxpZ2h0S2V5cy5zaXplKCkgKyBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzLnNpemUoKSk7CisKICAgICBmb3IgKGF1dG8mIHBhaXIgOiBpbmZsaWdodEtleXMpIHsKICAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHBhaXIuZmlyc3Q7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBwYWlyLnNlY29uZDsKQEAgLTI4NzIsNiArMzI5OCwyNiBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBpbmZsaWdodEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdHJlYW1JZCwgZnJhbWVOdW1iZXIsIGJ1ZmZlcikpOworICAgIH0KKworICAgIGZvciAoYXV0byYgYnVmZmVySWQgOiBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIgPSBudWxscHRyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsICZidWZmZXIsICZzdHJlYW1JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQsIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5mbGlnaHRCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc3RyZWFtSWQsIC8qZnJhbWVOdW1iZXIqLy0xLCBidWZmZXIpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7CisgICAgZm9yIChhdXRvJiB0dXBsZSA6IGluZmxpZ2h0QnVmZmVycykgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHN0ZDo6Z2V0PDA+KHR1cGxlKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHN0ZDo6Z2V0PDE+KHR1cGxlKTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIgPSBzdGQ6OmdldDwyPih0dXBsZSk7CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOwogICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOwpAQCAtMjg4OSw3ICszMzM1LDggQEAKICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gaGFsU3RyZWFtOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHJldHVybiBvdXRwdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0cmVhbSAlZDogJXMgKCVkKSIsICBfX0ZVTkNUSU9OX18sCkBAIC0yOTI2LDEyICszMzczLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTc5LDYgKzM0MjYsMTMgQEAKICAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CiAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBwYXJ0aWFsUmVzdWx0OwogCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtRGV2aWNlSW5mbywgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKCZjYXB0dXJlUmVzdWx0LCBmcmFtZU51bWJlcik7CiB9CiAKQEAgLTMwNTAsNiArMzUwNCwyMSBAQAogICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlcnJvcihyZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiBjYXB0dXJlUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkOChwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLmF0KGNhbWVyYUlkOC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCiAgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFU1VMVCwKICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAuZGF0YS5pNjRbMF0sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKQEAgLTMyMDcsOCArMzY3NiwxMCBAQAogICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcHBlbmRBcnJheShyZXN1bHQtPm91dHB1dF9idWZmZXJzLAogICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEocmVxdWVzdC56c2xDYXB0dXJlIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXN1bHQtPm91dHB1dF9idWZmZXJzLAotICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzLCBzaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhaXNQYXJ0aWFsUmVzdWx0KSB7CkBAIC0zMjIxLDcgKzM2OTIsNyBAQAogICAgICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ01ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0ID0gY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKQEAgLTMzNDEsNiArMzgxMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1pc3NpbmcgcmVzdWx0IGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlcnMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkLiBJZiB0aGV5IHJldHVybmVkLCB0aGVuIHJlbW92ZSBpbmZsaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjYWxsIHRoaXMgZm9yIEVSUk9SX0NBTUVSQV9SRVFVRVNUIGFzIHdlbGw/CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvdGhlcndpc2Ugd2UgYXJlIGRlcGVuZGluZyBvbiBIQUwgdG8gc2VuZCB0aGUgYnVmZmVycyBiYWNrIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxsaW5nIG5vdGlmeUVycm9yLiBOb3Qgc3VyZSBpZiB0aGF0J3MgaW4gdGhlIHNwZWMuCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzQxNCw4ICszODg4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHIuY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgbXNnLmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHIuenNsQ2FwdHVyZSB8fCByLmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoci5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICByLm91dHB1dFN1cmZhY2VzLCByLnJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CiAKICAgICAgICAgICAgIHJlbW92ZUluRmxpZ2h0UmVxdWVzdElmUmVhZHlMb2NrZWQoaWR4KTsKQEAgLTM0NTEsMTEgKzM5MjcsMTggQEAKIAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpLAorICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCh0cnVlKSB7CiAgICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKICAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CiAgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CiAgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewogICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CkBAIC0zNDY2LDE3ICszOTQ5LDE5IEBACiAgICAgfQogfQogCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIHt9CitDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIDogbVVzZUhhbEJ1Zk1hbmFnZXIoZmFsc2UpIHt9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvdGhlci5tVXNlSGFsQnVmTWFuYWdlcikge30KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewogICAgIHJldHVybiAobUhpZGxTZXNzaW9uICE9IG51bGxwdHIpOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xlYXIoKSB7CisgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CkBAIC0zNTUzLDYgKzQwMzgsNTIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpIHsKKyAgICAvLyBXZSBkbyByZWNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdDsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgaWYgKChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpICYmIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBvbGRQYXJhbXMsIG5ld1BhcmFtczsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG9sZFNlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIG9sZFBhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9NZXRhKSk7CisgICAgICAgIG5ld1BhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG5ld1Nlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShuZXdTZXNzaW9NZXRhKSk7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIGNhbGxTdGF0dXM7CisgICAgICAgIGJvb2wgcmVxdWlyZWQ7CisgICAgICAgIGF1dG8gaGlkbENiID0gWyZjYWxsU3RhdHVzLCAmcmVxdWlyZWRdIChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBzLAorICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZWRGbGFnKSB7CisgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcmVxdWlyZWRGbGFnOworICAgICAgICB9OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsIGhpZGxDYik7CisgICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb01ldGEpOworICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9NZXRhKTsKKyAgICAgICAgaWYgKGVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKICAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSB7CiAgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOwpAQCAtMzYzMiwyNiArNDE2Myw0OSBAQAogCiAgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOworICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CiAgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOwogCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAotICAgIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAotICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNChyZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LAotICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgYXV0byBjb25maWdTdHJlYW0zNENiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCiAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM180ID0gaGFsQ29uZmlndXJhdGlvbjsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My40IG9yIHYzLjMgSEFMCisgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjUgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmNvbmZpZ3VyZVN0cmVhbXNfM181KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCkBAIC0zNzYzLDE0ICs0MzE3LDE0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OndyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OndyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9kZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCkgYW5kIGhhbmRsZXNDcmVhdGVkICglcCkgbXVzdCBub3QgYmUgbnVsbCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyID0gcmVxdWVzdC0+ZnJhbWVfbnVtYmVyOwpAQCAtMzgxMSwyNiArNDM2NSwzNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7Ci0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7Ci0gICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7Ci0gICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3Qgc2VuZCBhIG51bGwgYnVmZmVyIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKICAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwogCiAgICAgICAgICAgICBwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAgICAgc3JjLT5idWZmZXIsIHNyYy0+YWNxdWlyZV9mZW5jZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKQEAgLTM4NTQsMTIgKzQ0MTksMTcgQEAKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CiAKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAogICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5NDEsMTggKzQ1MTEsMTcgQEAKICAgICB9CiAKICAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOworICAgICAgICB9OwogICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewogICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfQogICAgIGlmICghZXJyLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC00MDIzLDYgKzQ1OTIsMjAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CkBAIC00MDM3LDYgKzQ2MjAsMTcgQEAKICAgICByZXR1cm47CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG91dCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgb3V0LT5jbGVhcigpOworICAgIG91dC0+cmVzZXJ2ZShtUmVxdWVzdGVkQnVmZmVycy5zaXplKCkpOworICAgIGZvciAoYXV0byYgcGFpciA6IG1SZXF1ZXN0ZWRCdWZmZXJzKSB7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKHBhaXIuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKAogICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgaW50IGFjcXVpcmVGZW5jZSkgewogICAgIHVpbnQ2NF90IGtleSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZU51bWJlcikgPDwgMzIgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RyZWFtSWQpOwpAQCAtNDA2Myw2ICs0NjU3LDQyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBwYWlyID0gbVJlcXVlc3RlZEJ1ZmZlcnMuaW5zZXJ0KHtidWZmZXJJZCwge3N0cmVhbUlkLCBidWZ9fSk7CisgICAgaWYgKCFwYWlyLnNlY29uZCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIGFscmVhZHkgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBGaW5kIGFuZCBwb3AgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwKKyAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgIC8qb3B0aW9uYWwgb3V0Ki8gaW50MzJfdCogc3RyZWFtSWQpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZmZXIgKCVwKSBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fLCBidWZmZXIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gaXQgPSBtUmVxdWVzdGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBpZiAoaXQgPT0gbVJlcXVlc3RlZEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBub3QgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmJ1ZmZlciA9IGl0LT5zZWNvbmQuc2Vjb25kOworICAgIGlmIChzdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW1JZCA9IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgfQorICAgIG1SZXF1ZXN0ZWRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRCdWZmZXJJZCgKICAgICAgICAgY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwpAQCAtNDExMSw3ICs0NzQxLDggQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpIDoKKyAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksCiAgICAgICAgIG1QYXJlbnQocGFyZW50KSwKICAgICAgICAgbVN0YXR1c1RyYWNrZXIoc3RhdHVzVHJhY2tlciksCkBAIC00MTIxLDYgKzQ3NTIsNyBAQAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLAorICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbihmYWxzZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCiAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQoMCksCkBAIC00MTMxLDcgKzQ3NjMsOCBAQAogICAgICAgICBtQ29uc3RyYWluZWRNb2RlKGZhbHNlKSwKICAgICAgICAgbVJlcXVlc3RMYXRlbmN5KGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUpLAogICAgICAgICBtU2Vzc2lvblBhcmFtS2V5cyhzZXNzaW9uUGFyYW1LZXlzKSwKLSAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpIHsKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKQEAgLTQ1ODIsOSArNTIxNSwxMCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgYm9vbCB1cGRhdGVzRGV0ZWN0ZWQgPSBmYWxzZTsKIAorICAgIENhbWVyYU1ldGFkYXRhIHVwZGF0ZWRQYXJhbXMobUxhdGVzdFNlc3Npb25QYXJhbXMpOwogICAgIGZvciAoYXV0byB0YWcgOiBtU2Vzc2lvblBhcmFtS2V5cykgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzZXR0aW5ncy5maW5kKHRhZyk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSBtTGF0ZXN0U2Vzc2lvblBhcmFtcy5maW5kKHRhZyk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSB1cGRhdGVkUGFyYW1zLmZpbmQodGFnKTsKIAogICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICBib29sIGlzRGlmZmVyZW50ID0gZmFsc2U7CkBAIC00NjEzLDE3ICs1MjQ3LDI2IEBACiAgICAgICAgICAgICAgICAgaWYgKCFza2lwSEZSVGFyZ2V0RlBTVXBkYXRlKHRhZywgZW50cnksIGxhc3RFbnRyeSkpIHsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RldGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMudXBkYXRlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVkUGFyYW1zLnVwZGF0ZShlbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAgICAgLy8gVmFsdWUgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICAgQUxPR1YoIiVzOiBTZXNzaW9uIHBhcmFtZXRlciB0YWcgaWQgJWQgcmVtb3ZlZCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zLmVyYXNlKHRhZyk7CisgICAgICAgICAgICB1cGRhdGVkUGFyYW1zLmVyYXNlKHRhZyk7CiAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHVwZGF0ZXNEZXRlY3RlZDsKKyAgICBib29sIHJlY29uZmlndXJlUmVxdWlyZWQ7CisgICAgaWYgKHVwZGF0ZXNEZXRlY3RlZCkgeworICAgICAgICByZWNvbmZpZ3VyZVJlcXVpcmVkID0gbUludGVyZmFjZS0+aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChtTGF0ZXN0U2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICB1cGRhdGVkUGFyYW1zKTsKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMgPSB1cGRhdGVkUGFyYW1zOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVjb25maWd1cmVSZXF1aXJlZDsKIH0KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp0aHJlYWRMb29wKCkgewpAQCAtNDczNiw2ICs1Mzc5LDExIEBACiAgICAgQUxPR1ZWKCIlczogJWQ6IHN1Ym1pdHRpbmcgJXp1IHJlcXVlc3RzIGluIGEgYmF0Y2guIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKICAgICAgICAgICAgIG1OZXh0UmVxdWVzdHMuc2l6ZSgpKTsKIAorICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25TdWJtaXR0aW5nUmVxdWVzdCgpOworICAgIH0KKwogICAgIGJvb2wgc3VibWl0UmVxdWVzdFN1Y2Nlc3MgPSBmYWxzZTsKICAgICBuc2Vjc190IHRSZXF1ZXN0U3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgaWYgKG1JbnRlcmZhY2UtPnN1cHBvcnRCYXRjaFJlcXVlc3QoKSkgewpAQCAtNDc2Miw2ICs1NDEwLDcgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnByZXBhcmVIYWxSZXF1ZXN0cygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCisgICAgYm9vbCBiYXRjaGVkUmVxdWVzdCA9IG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1CYXRjaFNpemUgPiAxOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5leHRSZXF1ZXN0cy5zaXplKCk7IGkrKykgewogICAgICAgICBhdXRvJiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0ID0gbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3Q7CkBAIC00Nzg1LDcgKzU0MzQsMTAgQEAKICAgICAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAogICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyBsYXN0LCBvciB3ZSBoYWQgdHJpZ2dlcnMgbGFzdCB0aW1lCi0gICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW47CisgICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IChtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluKSAmJgorICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgc2V0dGluZ3MgYXJlIGFsbCB0aGUgc2FtZSB3aXRoaW4gb25lIGJhdGNoLCBzbyBvbmx5IHRyZWF0IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgaW4gYSBiYXRjaCBhcyBuZXcKKyAgICAgICAgICAgICAgICAhKGJhdGNoZWRSZXF1ZXN0ICYmIGkgPiAwKTsKICAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSEFMIHdvcmthcm91bmQ6CkBAIC00ODg2LDggKzU1MzgsMTEgQEAKICAgICAgICAgfQogICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIHBhcmVudC0+Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAKKyAgICAgICAgU3VyZmFjZU1hcCB1bmlxdWVTdXJmYWNlSWRNYXA7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gb3V0cHV0U3RyZWFtLT5nZXRJZCgpOwogCiAgICAgICAgICAgICAvLyBQcmVwYXJlIHZpZGVvIGJ1ZmZlcnMgZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nIG9uIHRoZSBmaXJzdCB2aWRlbyByZXF1ZXN0LgogICAgICAgICAgICAgaWYgKG1QcmVwYXJlVmlkZW9TdHJlYW0gJiYgb3V0cHV0U3RyZWFtLT5pc1ZpZGVvU3RyZWFtKCkpIHsKQEAgLTQ5MDYsMTcgKzU1NjEsNjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAotICAgICAgICAgICAgICAgICAgICB3YWl0RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbal0pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAotICAgICAgICAgICAgICAgIC8vIGVycm9yCi0gICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiB1bmlxdWVTdXJmYWNlSWRzOworICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSwKKyAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZVN1cmZhY2VJZHMpOworICAgICAgICAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaXMgbm9ybWFsIG91dHB1dCBmb3Igc3RyZWFtcyBub3Qgc3VwcG9ydGluZyBzdXJmYWNlSWRzCisgICAgICAgICAgICBpZiAocmVzICE9IE9LICYmIHJlcyAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHF1ZXJ5IHN0cmVhbSAlZCB1bmlxdWUgc3VyZmFjZSBJRHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB1bmlxdWVTdXJmYWNlSWRNYXAuaW5zZXJ0KHtzdHJlYW1JZCwgc3RkOjptb3ZlKHVuaXF1ZVN1cmZhY2VJZHMpfSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBpcyBhYmFuZG9uZWQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhBTCB3aWxsIHJlcXVlc3QgYnVmZmVyIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgYnVmZmVyID0gb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RyZWFtID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBzdHJlYW1DYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNldHRpbmdzIDogY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtQ2FtZXJhSWQuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+Z2V0SWQoKSA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DYW1lcmFJZCA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5maXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOwpAQCAtNDkzOCwxNSArNTYzNywzMiBAQAogICAgICAgICAvLyBwcmV2aWV3KSwgYW5kIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgbm90IHRoZSBsYXN0IG9uZSBpbiB0aGUgYmF0Y2gsCiAgICAgICAgIC8vIGRvIG5vdCBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAuCiAgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgPSB0cnVlOwotICAgICAgICBpZiAobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDEgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CisgICAgICAgIGlmIChiYXRjaGVkUmVxdWVzdCAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKICAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBpZiAoIW1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpKSB7CisgICAgICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RpbGwgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0wsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0xfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAvKmhhc0lucHV0Ki9oYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CiAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCkBAIC01MDIyLDcgKzU3MzgsNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwMzMsNyArNTc0OSw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA0Miw2ICs1NzU4LDIyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGZvciBjYW1lcmEgZGV2aWNlIG5vdCBzdXBwb3J0aW5nIEhBTCBidWZmZXIgbWFuYWdlbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgcGwobVBhdXNlTG9jayk7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElmIHJlcXVlc3QgdGhyZWFkIGlzIHN0aWxsIGJ1c3ksIHdhaXQgdW50aWwgcGF1c2VkIHRoZW4gbm90aWZ5IEhBTAorICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gdHJ1ZTsKKyAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQgPSBzdHJlYW1JZHM7Cit9CisKIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1JbkZsaWdodExvY2spOwpAQCAtNTA5OSwxNiArNTgzMSwyMSBAQAogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAvL0J1ZmZlcnMgdGhhdCBmYWlsZWQgcHJvY2Vzc2luZyBjb3VsZCBzdGlsbCBoYXZlCi0gICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCi0gICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgaWYgKDAgPD0gYWNxdWlyZUZlbmNlKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgLy8gTm8gb3V0cHV0IGJ1ZmZlciBjYW4gYmUgcmV0dXJuZWQgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKKyAgICAgICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCisgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVGZW5jZSA9ICgqb3V0cHV0QnVmZmVycylbaV0uYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzZW5kUmVxdWVzdEVycm9yKSB7CkBAIC01MjE0LDExICs1OTUxLDIwIEBACiAgICAgICAgICAgICBpZiAobVBhdXNlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogR29pbmcgaWRsZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIExldCB0aGUgdHJhY2tlciBrbm93CiAgICAgICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01Mjk4LDExICs2MDQ0LDIwIEBACiAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogUGF1c2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBtRG9QYXVzZVNpZ25hbC53YWl0UmVsYXRpdmUobVBhdXNlTG9jaywga1JlcXVlc3RUaW1lb3V0KTsKQEAgLTU3NTgsMjMgKzY1MTMsMTc0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qKgotICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICovCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjppbml0aWFsaXplKAorICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHN0YXR1c1RyYWNrZXIgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNQcm9jZXNzQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0KLSAgICBkLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzVHJhY2tlciA9IHN0YXR1c1RyYWNrZXI7CisgICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzTm90aWZ5KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotICAgIGQtPm5vdGlmeShtc2cpOworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpzdGFydFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19SRUFEWSB8fCBtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6ZW5kUmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBzdGFydFJlcXVlc3RCdWZmZXIgY2FsbCBmaXJzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovZmFsc2UpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3RyZWFtc0NvbmZpZ3VyZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3VibWl0dGluZ1JlcXVlc3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gZmFsc2U7CisgICAgLy8gaW5mbGlnaHQgbWFwIHJlZ2lzdGVyIGFjdHVhbGx5IGhhcHBlbnMgaW4gcHJlcGFyZUhhbFJlcXVlc3Qgbm93LCBidXQgaXQgaXMgY2xvc2UgZW5vdWdoCisgICAgLy8gYXBwcm94aW1hdGlvbi4KKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19TVE9QUEVEKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblJlcXVlc3RUaHJlYWRQYXVzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbkluZmxpZ2h0TWFwRW1wdHkoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbldhaXRVbnRpbElkbGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpIHsKKyAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOworICAgIGlmIChzdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6Y2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSB7CisgICAgaWYgKG1JbmZsaWdodE1hcEVtcHR5ICYmIG1SZXF1ZXN0VGhyZWFkUGF1c2VkICYmICFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIW1OZWVkRml4dXBNb25vY2hyb21lVGFncykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0YWdzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGludDMyX3QgdGFnc1RvUmVtb3ZlW10gPSB7CisgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgIH07CisgICAgZm9yIChhdXRvIHRhZyA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS5lcmFzZSh0YWcpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZW1vdmUgdGFnICVkIGZvciBtb25vY2hyb21lIGNhbWVyYSIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYmxFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGJsRW50cnkuZGF0YS5mW2ldID0gYmxFbnRyeS5kYXRhLmZbMF07CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRQorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBucEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFKTsKKyAgICBpZiAobnBFbnRyeS5jb3VudCA+IDAgJiYgbnBFbnRyeS5jb3VudCAlIDIgPT0gMCkgeworICAgICAgICBkb3VibGUgbnBbXSA9IHtucEVudHJ5LmRhdGEuZFswXSwgbnBFbnRyeS5kYXRhLmRbMV19OworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSwgbnAsIDIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFNFTlNPUl9OT0lTRV9QUk9GSUxFOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUAorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBsc1NpemVFbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbHNFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVApOworICAgIGlmIChsc1NpemVFbnRyeS5jb3VudCA9PSAyICYmIGxzRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiAoaW50MzJfdClsc0VudHJ5LmNvdW50ID09IDQgKiBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV07IGkrKykgeworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzFdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsyXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrM10gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4KKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVECisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjYkVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjZ0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4pOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y3JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCk7CisgICAgaWYgKHRjYkVudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNnRW50cnkuY291bnQKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjckVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGNiRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgdGNiRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICAgICAgdGNnRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggMTMxZDYyZi4uZDNiYjIxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMzLDEwICszMywxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIApAQCAtNTAsMjAgKzUxLDYgQEAKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIAotLyoqCi0gKiBGdW5jdGlvbiBwb2ludGVyIHR5cGVzIHdpdGggQyBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAqIHVzZSBmb3IgSEFMIGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuICJDIiB7Ci0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCAqKTsKLQotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX25vdGlmeV90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZ190ICopOwotfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTgwLDggKzY3LDcgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrLAotICAgICAgICAgICAgcHJpdmF0ZSBjYW1lcmEzX2NhbGxiYWNrX29wcyB7CisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CiAgIHB1YmxpYzoKIAogICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQpOwpAQCAtMjA4LDggKzE5NCwzMiBAQAogICAgICAqLwogICAgIHN0YXR1c190IGRyb3BTdHJlYW1CdWZmZXJzKGJvb2wgZHJvcHBpbmcsIGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgorICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOworICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKKyAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7CisgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisKICAgcHJpdmF0ZToKIAorICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisKICAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwogICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CiAgICAgdXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSAgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKQEAgLTI2OCw3ICsyNzgsOCBAQAogICAgIGNsYXNzIEhhbEludGVyZmFjZSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lciB7CiAgICAgICBwdWJsaWM6CiAgICAgICAgIEhhbEludGVyZmFjZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUpOworICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcik7CiAgICAgICAgIEhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UgJm90aGVyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKCk7CiAKQEAgLTI5NywxNCArMzA4LDM1IEBACiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKICAgICAgICAgc3RhdHVzX3QgY2xvc2UoKTsKIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKyAgICAgICAgYm9vbCBpc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKTsKKworICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKKyAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQorICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpOworCiAgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gZnJhbWUgbnVtYmVyIGFuZCBzdHJlYW0gSUQKICAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRCdWZmZXIoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcik7CiAKKyAgICAgICAgLy8gUmVnaXN0ZXIgYSBidWZJZCAoc3RyZWFtSWQsIGJ1ZmZlcl9oYW5kbGVfdCkgdG8gaW5mbGlnaHQgcmVxdWVzdCBidWZmZXIKKyAgICAgICAgc3RhdHVzX3QgcHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwgYnVmZmVyX2hhbmRsZV90KiBidWYsIGludDMyX3Qgc3RyZWFtSWQpOworCisgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKKyAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyLAorICAgICAgICAgICAgICAgIC8qb3B0aW9uYWwgb3V0Ki8gaW50MzJfdCogc3RyZWFtSWQgPSBudWxscHRyKTsKKwogICAgICAgICAvLyBHZXQgYSB2ZWN0b3Igb2YgKGZyYW1lTnVtYmVyLCBzdHJlYW1JZCkgcGFpciBvZiBjdXJyZW50bHkgaW5mbGlnaHQKICAgICAgICAgLy8gYnVmZmVycwogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCisgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiBidWZmZXJJZCBvZiBjdXJyZW50bHkgaW5mbGlnaHQgYnVmZmVycworICAgICAgICB2b2lkIGdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBvdXQpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTIsNiArMzQ0LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMxOSw3ICszNTMsNyBAQAogCiAgICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdAogICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHZvaWQgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAogICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBvdXQsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCk7CiAKQEAgLTM2MywxOSArMzk3LDE5IEBACiAgICAgICAgIC8vIHN0cmVhbSBJRCAtPiBwZXIgc3RyZWFtIGJ1ZmZlciBJRCBtYXAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgQnVmZmVySWRNYXA+IG1CdWZmZXJJZE1hcHM7CiAgICAgICAgIHVpbnQ2NF90IG1OZXh0QnVmZmVySWQgPSAxOyAvLyAwIG1lYW5zIG5vIGJ1ZmZlcgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECi0gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBzd2l0Y2ggdG8gdXNlIGdyYWxsb2MgbWFwcGVyJ3MgZ2V0QmFja2luZ1N0b3JlIEFQSQotICAgICAgICAvLyAgICAgICBvbmNlIHdlIHJhbiBpbiBiaW5kZXJpemVkIGdyYWxsb2MgbW9kZSwgYnV0IGJlZm9yZSB0aGF0IGlzIHJlYWR5LAotICAgICAgICAvLyAgICAgICB3ZSBuZWVkIHRvIHJlbHkgb24gdGhlIGNvbnZlbnRpb25hbCBidWZmZXIgcXVldWUgYmVoYXZpb3Igd2hlcmUKLSAgICAgICAgLy8gICAgICAgYnVmZmVyX2hhbmRsZV90J3MgRkQgd29uJ3QgY2hhbmdlLgotICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCi0gICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRnJlZWQoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgdWludDY0X3Q+PiBtRnJlZWRCdWZmZXJzOworCisgICAgICAgIC8vIEJ1ZmZlcnMgZ2l2ZW4gdG8gSEFMIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgc3RkOjptdXRleCBtUmVxdWVzdGVkQnVmZmVyc0xvY2s7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjpwYWlyPGludDMyX3QsIGJ1ZmZlcl9oYW5kbGVfdCo+PiBtUmVxdWVzdGVkQnVmZmVyczsKKworICAgICAgICB1aW50MzJfdCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgPSAxOworCisgICAgICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CisgICAgICAgIGJvb2wgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQ7CiAgICAgfTsKIAogICAgIHNwPEhhbEludGVyZmFjZT4gbUludGVyZmFjZTsKQEAgLTQxMCw5ICs0NDQsMjIgQEAKICAgICAvLyBUcmFja2luZyBjYXVzZSBvZiBmYXRhbCBlcnJvcnMgd2hlbiBpbiBTVEFUVVNfRVJST1IKICAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICBtRXJyb3JDYXVzZTsKIAotICAgIC8vIE1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCi0gICAgdHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KLSAgICAgICAgICAgIFN0cmVhbVNldDsKKyAgICAvLyBTeW5jaHJvbml6ZWQgbWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKKyAgICBjbGFzcyBTdHJlYW1TZXQgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPik7CisgICAgICAgIHNzaXplX3QgcmVtb3ZlKGludCBzdHJlYW1JZCk7CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IGdldChpbnQgc3RyZWFtSWQpOworICAgICAgICAvLyBnZXQgYnkgKHVuZGVybHlpbmcpIHZlY3RvciBpbmRleAorICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpOworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldFN0cmVhbUlkcygpOworICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPj4gbURhdGE7CisgICAgfTsKIAogICAgIFN0cmVhbVNldCAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOwogICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IG1JbnB1dFN0cmVhbTsKQEAgLTQ4MSw4ICs1MjgsOSBAQAogCiAKICAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCiAgICAgICovCisKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CkBAIC00OTMsNiArNTQxLDE1IEBACiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CiAKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKQEAgLTY1MywyNyArNzEwLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgbnNlY3NfdCBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKLSAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KLSAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLQogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CiAgICAgICAgIC8vIE1ldGFkYXRhIHRhZyBudW1iZXIsIGUuZy4gYW5kcm9pZC5jb250cm9sLmFlUHJlY2FwdHVyZVRyaWdnZXIKICAgICAgICAgdWludDMyX3QgbWV0YWRhdGFUYWc7CkBAIC03MDAsNyArNzM2LDkgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC03ODgsNiArODI2LDggQEAKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTg5NywxMiArOTM3LDEzIEBACiAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZWNvbmZpZ3VyZWQ7CiAKLSAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgYW5kIHdhaXRVbnRpbFBhdXNlZAorICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCB3YWl0VW50aWxQYXVzZWQsIGFuZCBzaWduYWxQaXBlbGluZURyYWluCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICBtUGF1c2VMb2NrOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbURvUGF1c2U7CiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtRG9QYXVzZVNpZ25hbDsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1QYXVzZWQ7Ci0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUGF1c2VkU2lnbmFsOworICAgICAgICBib29sICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW47CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gICBtU3RyZWFtSWRzVG9CZURyYWluZWQ7CiAKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG1QcmV2UmVxdWVzdDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG1QcmV2VHJpZ2dlcnM7CkBAIC05MzUsNiArOTc2LDggQEAKIAogICAgICAgICBWZWN0b3I8aW50MzJfdD4gICAgbVNlc3Npb25QYXJhbUtleXM7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtczsKKworICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtOTk1LDYgKzEwMzgsMTUgQEAKICAgICAgICAgLy8gTWFwIG9mIHBoeXNpY2FsQ2FtZXJhSWQgPC0+IE1ldGFkYXRhCiAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsTWV0YWRhdGFzOwogCisgICAgICAgIC8vIEluZGljYXRlcyBhIHN0aWxsIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgYm9vbCBzdGlsbENhcHR1cmU7CisKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBib29sIHpzbENhcHR1cmU7CisKKyAgICAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bworICAgICAgICBTdXJmYWNlTWFwIG91dHB1dFN1cmZhY2VzOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtMTAwNSwxMiArMTA1NywxNiBAQAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCkgOgorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xMDIxLDcgKzEwNzcsMTAgQEAKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGlzU3RpbGxDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTEwMzUsMTAgKzEwOTQsMTEgQEAKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0U3RhdHVzSWQ7CiAKLQogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtMTE0OCw3ICsxMjA4LDExIEBACiAKICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVycyB0byB0aGUgc3RyZWFtcy4KICAgICB2b2lkIHJldHVybk91dHB1dEJ1ZmZlcnMoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycywgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9ubHkgbWVhbnQgZm9yIHN1cmZhY2Ugc2hhcmluZyB1c2UgY2FzZQorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30sCisgICAgICAgICAgICAvLyBVc2VkIHRvIHNlbmQgYnVmZmVyIGVycm9yIGNhbGxiYWNrIHdoZW4gZmFpbGluZyB0byByZXR1cm4gYnVmZmVyCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMgPSBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogCiAgICAgLy8gU2VuZCBhIHBhcnRpYWwgY2FwdHVyZSByZXN1bHQuCiAgICAgdm9pZCBzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LApAQCAtMTIwNCwxMyArMTI2OCw4OCBAQAogICAgIC8vIENhY2hlZCBsYXN0IHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZAogICAgIGludCBtTGFzdFRlbXBsYXRlSWQ7CiAKLSAgICAvKioKLSAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gICAgICovCi0gICAgc3RhdGljIGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3Qgc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OworICAgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gc3RhdHVzIHRyYWNrZXIgYmV0d2VlbiBpbmZsaWdodCB1cGRhdGVzIGFuZCBkaXNjb25uZWN0LgorICAgIC8vIGIvNzk5NzI4NjUKKyAgICBNdXRleCBtVHJhY2tlckxvY2s7CiAKLSAgICBzdGF0aWMgY2FsbGJhY2tzX25vdGlmeV90IHNOb3RpZnk7CisgICAgLy8gV2hldGhlciBIQUwgcmVxdWVzdCBidWZmZXJzIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgQVBJCisgICAgYm9vbCBtVXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlOwogCisgICAgLy8gTG9jayB0byBlbnN1cmUgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoKSBjYWxsYmFja3MgYXJlIHNlcmlhbGl6ZWQKKyAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jazsKKworICAgIC8vIFRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNvbnRyb2wgd2hlbiByZXF1ZXN0U3RyZWFtQnVmZmVycyBzaG91bGQgYWxsb3cKKyAgICAvLyBIQUwgdG8gcmVxdWVzdCBidWZmZXJzLgorICAgIGVudW0gUmVxdWVzdEJ1ZmZlclN0YXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCByZXR1cm4gRkFJTEVEX0NPTkZJR1VSSU5HIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFdpbGwgc3dpdGNoIHRvIFJCX1NUQVRVU19SRUFEWSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29uZmlndXJlU3RyZWFtcyBvcgorICAgICAgICAgKiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19TVE9QUEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcHJvY2VlZCBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaGVuIGRldmljZSBpcyBhc2tlZCB0byBzdGF5IGlkbGUgdmlhIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpIGNhbGw6CisgICAgICAgICAqICAgICAtIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCBpZiB0aGVyZSBpcyBubyBpbmZsaWdodCByZXF1ZXN0cyBhbmQKKyAgICAgICAgICogICAgICAgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkLgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19SRUFEWSwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogU3dpdGNoIHRvIFJCX1NUQVRVU19TVE9QUEVEIHdoZW4gYWxsIGluZmxpZ2h0IHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQKKyAgICAgICAgICogYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCwKKyAgICB9OworCisgICAgY2xhc3MgUmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcik7CisKKyAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnRseSBhbGxvd3MgZm9yIHJlcXVlc3RCdWZmZXJzCisgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBhbGxvd3MgZm9yIGl0LCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAgICAvLyBhbmQgY2FsbGVyIG11c3QgY2FsbCBlbmRSZXF1ZXN0QnVmZmVyKCkgbGF0ZXIgdG8gdW5zZXQgdGhlIGZsYWcKKyAgICAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgdm9pZCBlbmRSZXF1ZXN0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBhcHBsaWNhdGlvbiBBUEkgY2FsbAorICAgICAgICB2b2lkIG9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICAgICAgdm9pZCBvbldhaXRVbnRpbElkbGUoKTsKKworICAgICAgICAvLyBFdmVudHMgdXN1YWxseSB0cmlnZ2VyZWQgYnkgaHdCaW5kZXIgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgIC8vIEJ1dCBjYW4gYWxzbyBiZSB0cmlnZ2VyZWQgb24gcmVxdWVzdCB0aHJlYWQgZm9yIGZhaWxlZCByZXF1ZXN0LCBvciBvbgorICAgICAgICAvLyBod2JpbmRlciBub3RpZnkgY2FsbGJhY2sgdGhyZWFkIGZvciBzaHV0dGVyL2Vycm9yIGNhbGxiYWNrcworICAgICAgICB2b2lkIG9uSW5mbGlnaHRNYXBFbXB0eSgpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgUmVxdWVzdFRocmVhZAorICAgICAgICB2b2lkIG9uU3VibWl0dGluZ1JlcXVlc3QoKTsKKyAgICAgICAgdm9pZCBvblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gU1RPUFBFRCBzdGF0ZSBhbmQgcmV0dXJuIHRydWUgaWYgYWxsIGNvbmRpdGlvbnMgYWxsb3dzIGZvciBpdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgYm9vbCBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworCisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIFJlcXVlc3RCdWZmZXJTdGF0ZSBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisKKyAgICAgICAgYm9vbCBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgICAgICBib29sIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworCisgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOworICAgICAgICBpbnQgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQ7CisgICAgfSBtUmVxdWVzdEJ1ZmZlclNNOworCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgYm9vbCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3M7CisgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKTsKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCBmYjFmZjc3Li5iNjM3MTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCkgeworICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAogICAgICAgICAgICAgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggNDYyNzU0OC4uNGI2N2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggM2MxZTQzZC4uMmU5MDlhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKLXNpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgewogICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogfQogCkBAIC0yMTksNyArMjE5LDggQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBib29sIG91dHB1dCkgeworICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICAvLyByZXR1cm5CdWZmZXIgbWF5IGJlIGNhbGxlZCBmcm9tIGEgcmF3IHBvaW50ZXIsIG5vdCBhIHNwPD4sIGFuZCB3ZSdsbCBiZQpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDBhMzFkNDQuLjc1MGY2NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC02NiwxMiArNjYsMTQgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpID0gMDsKIApAQCAtODIsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMDE3ZDdiZS4uZmM4MzY4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCAwNzMyNDY0Li45N2E2MjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCAyYzAyMGEyLi44Y2Q1NzVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTE4NywxNiArMTg3LDE3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgcmV0dXJuIGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjEyLDYgKzIxMyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKQEAgLTIzNywxMiArMjM5LDE0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGJ1ZmZlciBiYWNrIHRvIEFOYXRpdmVXaW5kb3cKICAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgc2hvdWxkbid0IGJlIDAiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCkBAIC0yNzksNyArMjgzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzogIgogICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC02NTksMTIgKzY2MywxMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgdWludDY0X3QgdSA9IDA7Cit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pIHsKKyAgICBpZiAoY29uc3VtZXJVc2FnZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKICAgICAvLyBJZiBhbiBvcGFxdWUgb3V0cHV0IHN0cmVhbSdzIGVuZHBvaW50IGlzIEltYWdlUmVhZGVyLCBhZGQKICAgICAvLyBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgdG8gdGhlIHVzYWdlIHNvIEhBTCBrbm93cyBpdCB3aWxsIGJlIHVzZWQKICAgICAvLyBmb3IgdGhlIFpTTCB1c2UgY2FzZS4KQEAgLTY3MywxMiArNjc2LDIwIEBACiAgICAgLy8gICAgIDIuIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSCiAgICAgLy8gICAgIDMuIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIKICAgICAvLyAgICAgNC4gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSCi0gICAgaWYgKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCi0gICAgICAgICAgICAodSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICgqY29uc3VtZXJVc2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKSkgPT0gMCkgewotICAgICAgICB1IHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKKyAgICAgICAgKmNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOwogICAgIH0KK30KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgeworICAgIHN0YXR1c190IHJlczsKKyAgICB1aW50NjRfdCB1ID0gMDsKKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOworICAgIGFwcGx5WlNMVXNhZ2VRdWlyayhjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCAmdSk7CiAgICAgKnVzYWdlID0gdTsKICAgICByZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2ZjM2ZjkyLi4yMTI4ZGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMTkwLDYgKzE5MCw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xOTgsNiArMjAxLDExIEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKICAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKIAorICAgIC8qKgorICAgICAqIEFwcGx5IFpTTCByZWxhdGVkIGNvbnN1bWVyIHVzYWdlIHF1aXJrLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pOworCiAgIHByb3RlY3RlZDoKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LApAQCAtMjEzLDYgKzIyMSw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMjg1LDEwICsyOTQsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCBhNzExYTZkLi4yYmRlOTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtNjcsNiArNjcsMTggQEAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqCisgICAgICogUmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGlmIGFuZCBvbmx5IGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHN1cmZhY2Ugc2hhcmluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpID0gMDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggZmIzY2U0Yy4uZTNiNzRkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVNoYXJlZE91U3RybSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCiAjaW5jbHVkZSAiQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yOCwxNiArMzIsMTcgQEAKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgaW50IHNldElkKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBzdGQ6Om1pbihzdXJmYWNlcy5zaXplKCksIGtNYXhPdXRwdXRzKTsKICAgICBpZiAoc3VyZmFjZXMuc2l6ZSgpID4gY29uc3VtZXJDb3VudCkgewogICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgbW9yZSBjb25zdW1lcnMgdGhhbiB0aGUgbWF4aW11bSAiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgIG1TdXJmYWNlc1tpXSA9IHN1cmZhY2VzW2ldOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2VzW2ldLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiB9CiAKQEAgLTQ4LDE1ICs1MywxNSBAQAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Y29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOworICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIobVVzZUhhbEJ1Zk1hbmFnZXIpOwogCiAgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MSw2ICs3NiwzMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoCisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCisgICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQorICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KKyAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7CisgICAgbUxvY2subG9jaygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAorICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCisgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6bm90aWZ5QnVmZmVyUmVsZWFzZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW53QnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwpAQCAtODksNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIChtU3VyZmFjZXNbc3VyZmFjZV9pZF0gPT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlX2lkXS5maXJzdCA9PSBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMpIHsKQEAgLTExMiw3ICsxNDIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogCi0gICAgICAgIG1TdXJmYWNlc1tpZF0gPSBzdXJmYWNlOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKIAogICAgICAgICAvLyBPbmx5IGNhbGwgYWRkT3V0cHV0IGlmIHRoZSBzcGxpdHRlciBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgewpAQCAtMTI4LDcgKzE1OCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogCkBAIC0xMzgsMjMgKzE2OCwxMSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCi0gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQotICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KLSAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7Ci0gICAgbUxvY2subG9jaygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCi0gICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChhbmIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCw4ICsxODYsMzggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgewotICAgIHN0YXR1c190IHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBpZiAodW5pcXVlU3VyZmFjZUlkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmlxdWVTdXJmYWNlSWRzIG11c3Qgbm90IGJlIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzdXJmYWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHVuaXF1ZUlkIDogdW5pcXVlU3VyZmFjZUlkcykgeworICAgICAgICAgICAgYm9vbCB1bmlxdWVJZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uc2Vjb25kID09IHVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VJZHMucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1bmlxdWVJZEZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiB1bmtub3duIHVuaXF1ZSBzdXJmYWNlIElEICV6dSBmb3Igc3RyZWFtICVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVuaXF1ZUlkLCBtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYnVmZmVyLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogCiAgICAgLy8gQWZ0ZXIgcXVldWluZyBidWZmZXIgdG8gdGhlIGludGVybmFsIGNvbnN1bWVyIHF1ZXVlLCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgaXMKICAgICAvLyBzdWNjZXNzZnVsbHkgcXVldWVkIHRvIHRoZSBvdXRwdXQgcXVldWVzLgpAQCAtMjI4LDggKzI3Niw4IEBACiAgICAgICAgICp1c2FnZSA9IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwga01heE91dHB1dHM7IGlkKyspIHsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZXNbaWRdICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VzW2lkXSk7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0KTsKICAgICAgICAgICAgICAgICAqdXNhZ2UgfD0gdTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQ1LDcgKzI5Myw3IEBACiBzc2l6ZV90IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldE5leHRTdXJmYWNlSWRMb2NrZWQoKSB7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTgsNyArMzA2LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IHN1cmZhY2UpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IHN1cmZhY2UpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjcsNiArMzE1LDI2IEBACiAgICAgcmV0dXJuIGlkOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChvdXRVbmlxdWVJZHMgPT0gbnVsbHB0ciB8fCBzdXJmYWNlSWRzLnNpemUoKSA+IGtNYXhPdXRwdXRzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb3V0VW5pcXVlSWRzLT5jbGVhcigpOworICAgIG91dFVuaXF1ZUlkcy0+cmVzZXJ2ZShzdXJmYWNlSWRzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1cmZhY2VJZCA6IHN1cmZhY2VJZHMpIHsKKyAgICAgICAgaWYgKHN1cmZhY2VJZCA+PSBrTWF4T3V0cHV0cykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBvdXRVbmlxdWVJZHMtPnB1c2hfYmFjayhtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdLnNlY29uZCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZCgKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpIHsKQEAgLTI4MCw3ICszNDgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSBudWxscHRyOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWRTdXJmYWNlcy5zaXplKCk7IGkrKykgewpAQCAtMjkxLDcgKzM1OSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtMzQzLDggKzQxMiw4IEBACiAKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaXRdID0gbnVsbHB0cjsKLSAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZXNbaXRdLCBpdCk7CisgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VVbmlxdWVJZHNbaXRdLmZpcnN0LCBpdCk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2l0XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIC8vTmV4dCBhZGQgdGhlIG5ldyBvdXRwdXRzCkBAIC0zNjksNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tzdXJmYWNlSWRdID0gaXQ7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0gPSBzdGQ6Om1ha2VfcGFpcihpdCwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgICAgIG91dHB1dE1hcC0+YWRkKGl0LCBzdXJmYWNlSWQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCAwMmIxYzA5Li5iNWUzN2MyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1TcGxpdHRlci5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKIApAQCAtMzcsNyArMzgsOCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTQ5LDYgKzUxLDE1IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLApAQCAtNTgsOCArNjksMTcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE91dHB1dHMgPSA0OwogCi0gICAgLy8gTWFwIHN1cmZhY2VJZCAtPiBvdXRwdXQgc3VyZmFjZXMKLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZXNba01heE91dHB1dHNdOworICAgIC8vIFdoZXRoZXIgSEFMIGlzIGluIGNvbnRyb2wgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50LiBTdXJmYWNlIHNoYXJpbmcgYmVoYXZpb3IKKyAgICAvLyBkZXBlbmRzIG9uIHRoaXMgZmxhZy4KKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworCisgICAgLy8gUGFpciBvZiBhbiBvdXRwdXQgU3VyZmFjZSBhbmQgaXRzIHVuaXF1ZSBJRAorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNwPFN1cmZhY2U+LCBzaXplX3Q+IFN1cmZhY2VVbmlxdWVJZDsKKworICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gKG91dHB1dCBzdXJmYWNlLCB1bmlxdWUgc3VyZmFjZSBJRCkKKyAgICBzdGQ6OmFycmF5PFN1cmZhY2VVbmlxdWVJZCwga01heE91dHB1dHM+IG1TdXJmYWNlVW5pcXVlSWRzOworCisgICAgc2l6ZV90IG1OZXh0VW5pcXVlU3VyZmFjZUlkID0gMDsKIAogICAgIHNzaXplX3QgZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOwogCkBAIC03OCwxMyArOTgsMjQgQEAKICAgICBzdGF0dXNfdCBjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byBzdHJlYW0gc3BsaXR0ZXIuCisgICAgICogV2hlbiBjYW1lcmEgc2VydmljZSBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBoYW5kZWQgb3V0IHRvIEhBTCBpbiByZXF1ZXN0IHRocmVhZC4KKyAgICAgKiBXaGVuIEhBTCBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAqIHRoZSBidWZmZXIgaXMgcmV0dXJuZWQgZnJvbSBIQUwgaW4gaHdiaW5kZXIgY2FsbGJhY2sgdGhyZWFkLgorICAgICAqLworICAgIHN0YXR1c190IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworCisgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggN2ViYzI5OS4uMDU3MTc0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAogICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeworICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAorICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIAogICAgIGNhbWVyYTNfc3RyZWFtOjpzdHJlYW1fdHlwZSA9IHR5cGU7CiAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoID0gd2lkdGg7CkBAIC01ODcsNyArNTg4LDExIEBACiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUJBTkRPTkVEKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCkBAIC02NTQsNyArNjU5LDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTY2Niw2ICs2NzIsMTUgQEAKIAogICAgIHJlbW92ZU91dHN0YW5kaW5nQnVmZmVyKGJ1ZmZlcik7CiAKKyAgICAvLyBCdWZmZXIgc3RhdHVzIG1heSBiZSBjaGFuZ2VkLCBzbyBtYWtlIGEgY29weSBvZiB0aGUgc3RyZWFtX2J1ZmZlciBzdHJ1Y3QuCisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyIGIgPSBidWZmZXI7CisgICAgaWYgKHRpbWVzdGFtcEluY3JlYXNpbmcgJiYgdGltZXN0YW1wICE9IDAgJiYgdGltZXN0YW1wIDw9IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgaXMgbm90IGluY3JlYXNpbmcuIFByZXYgdGltZXN0YW1wICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgdGltZXN0YW1wLCBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIGIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwogICAgIC8qKgogICAgICAqIFRPRE86IENoZWNrIHRoYXQgdGhlIHN0YXRlIGlzIHZhbGlkIGZpcnN0LgogICAgICAqCkBAIC02NzQsOSArNjg5LDkgQEAKICAgICAgKgogICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgogICAgICAqLwotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgc3VyZmFjZV9pZHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYiwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlLCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKICAgICB9CiAKICAgICAvLyBFdmVuIGlmIHJldHVybmluZyB0aGUgYnVmZmVyIGZhaWxlZCwgd2Ugc3RpbGwgd2FudCB0byBzaWduYWwgd2hvZXZlciBpcyB3YWl0aW5nIGZvciB0aGUKQEAgLTc1Miw4ICs3NjcsMjIgQEAKICAgICByZXR1cm4gZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChwcm9kdWNlcik7CiB9CiAKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6ZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBmb3IgKGF1dG8gJml0IDogbUJ1ZmZlckxpc3RlbmVyTGlzdCkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyID0gaXQucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyLCBnZXRJZCgpLCBzZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6ZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgKLSAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCwgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CiAKICAgICAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50aW5nCkBAIC03NjIsNiArNzkxLDggQEAKICAgICAgICAgQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyOjpCdWZmZXJJbmZvKCk7CiAgICAgaW5mby5tT3V0cHV0ID0gb3V0cHV0OwogICAgIGluZm8ubUVycm9yID0gKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKTsKKyAgICBpbmZvLm1GcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIGluZm8ubVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgICAvLyBUT0RPOiByZXN0IG9mIGZpZWxkcwogCiAgICAgZm9yIChpdCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuYmVnaW4oKSwgZW5kID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5lbmQoKTsKQEAgLTc4NSw2ICs4MTYsMTIgQEAKICAgICByZXR1cm4gaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCk7CiB9CiAKK3NpemVfdCBDYW1lcmEzU3RyZWFtOjpnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0IHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnNldFN0YXR1c1RyYWNrZXIoc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzcDxTdGF0dXNUcmFja2VyPiBvbGRUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwpAQCAtODI3LDcgKzg2NCw3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCAwMzU1OTc4Li41ZWI2YTIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtMzIyLDExICszMjIsMTggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMzYwLDYgKzM2NywxMSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0OworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC00MTksNiArNDMxLDEyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXN0b3JlQ29uZmlndXJlZFN0YXRlKCk7CiAKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYnVmZmVyIHN0cmVhbSBsaXN0ZW5lcnMgYWJvdXQgaW5jb21pbmcgcmVxdWVzdCB3aXRoIHBhcnRpY3VsYXIgZnJhbWUgbnVtYmVyLgorICAgICAqLworICAgIHZvaWQgZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKICAgcHJvdGVjdGVkOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgLyoqCkBAIC00NzMsNyArNDkxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CkBAIC00OTUsNyArNTE0LDcgQEAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KLSAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0ID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwpAQCAtNTI2LDcgKzU0NSw3IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiA9IDMwMDAwMDAwMDBMTDsgLy8gMzAwMCBtcwogCiAgICAgdm9pZCBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KTsKKyAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0LCBuc2Vjc190IHRpbWVzdGFtcCA9IDAsIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID4gbUJ1ZmZlckxpc3RlbmVyTGlzdDsKIAogICAgIHN0YXR1c190ICAgICAgICBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7CkBAIC01NjYsNiArNTg1LDcgQEAKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAppbmRleCAyZGIzMzNkLi5kMGFlZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtNDEsNiArNDIsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKICAgICAvLyBCdWZmZXIgd2FzIHJlbGVhc2VkIGJ5IHRoZSBIQUwKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CisgICAgLy8gTm90aWZ5IGFib3V0IGluY29taW5nIGJ1ZmZlciByZXF1ZXN0IGZyYW1lIG51bWJlcgorICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9OyAvL25hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDNkNDVjODkuLjVjZDExYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKIApAQCAtMjQ4LDExICsyNTAsMTkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgKiBzdHJlYW0sIHN1cmZhY2VfaWRzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0LgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTI4OSw2ICsyOTksMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgPSAwOworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC0zMjksNiArMzQ0LDEyIEBACiAgICAgICogQ2FtZXJhM1N0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbGlzdGVuZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBidWZmZXIgc3RyZWFtIGxpc3RlbmVycyBhYm91dCBpbmNvbWluZyByZXF1ZXN0IHdpdGggcGFydGljdWxhciBmcmFtZSBudW1iZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCBlY2I5ODBhLi44NGMyZWM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0xNTIsNiArMTUyLDggQEAKICAgICBTUF9MT0dWKCIlczogRGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fKTsKIH0KIAorQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6fkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpIHsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0yNDEsNyArMjQzLDkgQEAKICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKLSAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIG5zZWNzX3QgdGltZW91dCA9IG1Vc2VIYWxCdWZNYW5hZ2VyID8KKyAgICAgICAgICAgICAgICBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgOiBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQ7CisgICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0KTsKICAgICB9CiAKICAgICByZXMgPSBnYnAtPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CkBAIC00MzYsOCArNDQwLDkgQEAKICAgICAgICAgcmVzID0gZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGdiKTsKICAgICAgICAgbU11dGV4LmxvY2soKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhY3F1aXJlQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBDYW5ub3QgYXR0YWNoQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnYnAuZ2V0KCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgLy8gVE9ETzogbWlnaHQgbmVlZCB0byBkZXRhY2gvY2xlYW51cCB0aGUgYWxyZWFkeSBhdHRhY2hlZCBidWZmZXJzIGJlZm9yZSByZXR1cm4/CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIGlmICgoc2xvdCA8IDApIHx8IChzbG90ID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCAxZWFmMmJkLi45NjBmN2FhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIENvbnN0cnVjdG9yCi0gICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgPSBkZWZhdWx0OworICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICAvLyBDb25uZWN0IHRvIHRoZSBzdHJlYW0gc3BsaXR0ZXIgYnkgY3JlYXRpbmcgYnVmZmVyIHF1ZXVlIGFuZCBjb25uZWN0aW5nIGl0CiAgICAgLy8gd2l0aCBvdXRwdXQgc3VyZmFjZXMuCkBAIC0yMjYsNyArMjI2LDEwIEBACiAgICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgbUZvcm1hdCA9IGFuZHJvaWQ6OlBJWEVMX0ZPUk1BVF9OT05FOwogICAgIHVpbnQ2NF90IG1Qcm9kdWNlclVzYWdlID0gMDsKIAotICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZXF1ZXVlQnVmZmVyVGltZW91dCAgID0gczJucygxKTsgLy8gMSBzZWMKKyAgICAvLyBUaGUgYXR0YWNoQnVmZmVyIGNhbGwgd2lsbCBoYXBwZW4gb24gZGlmZmVyZW50IHRocmVhZCBhY2NvcmRpbmcgdG8gbVVzZUhhbEJ1Zk1hbmFnZXIgYW5kIGhhdmUKKyAgICAvLyBkaWZmZXJlbnQgdGltaW5nIGNvbnN0cmFpbnQuCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga05vcm1hbERlcXVldWVCdWZmZXJUaW1lb3V0ICAgID0gczJucygxKTsgIC8vIDEgc2VjCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0hhbEJ1Zk1nckRlcXVldWVCdWZmZXJUaW1lb3V0ID0gbXMybnMoMSk7IC8vIDEgbXNlYwogCiAgICAgTXV0ZXggbU11dGV4OwogCkBAIC0yNzMsNiArMjc2LDggQEAKICAgICBzaXplX3QgbUFjcXVpcmVkSW5wdXRCdWZmZXJzOwogCiAgICAgU3RyaW5nOCBtQ29uc3VtZXJOYW1lOworCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDRkYWZlZmQuLmFlN2FmOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMzEyLDggKzMxMiw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcFJhd1RvQ29ycmVjdGVkKGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC0zMjEsOCArMzIxLDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTQwMCw4ICs0MDAsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBDb3JyZWN0ZWRUb1Jhdyhjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtNDA5LDggKzQwOSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDYzNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKKworY29uc3QgY2hhciAqSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjprUmVzdWx0S2V5ID0gIkNhcHR1cmVSZXN1bHQiOworCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCitib29sIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6aW5pdGlhbGl6ZUxvb3BlcigpIHsKKyAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2JMb29wZXItPnNldE5hbWUoImNzLWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoLypydW5PbkNhbGxpbmdUaHJlYWQqLyBmYWxzZSwgLypjYW5DYWxsSmF2YSovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgaWYgKGVyciAhPU9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6On5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSB7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUVycm9yKAorICAgIGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VFcnJvcihjb252ZXJ0VG9IaWRsKGVycm9yQ29kZSksIGhDYXB0dXJlUmVzdWx0RXh0cmFzKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlRXJyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUlkbGUoKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VJZGxlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkNhcHR1cmVTdGFydGVkKGhDYXB0dXJlUmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25DYXB0dXJlQ2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKmhSZXN1bHRNZXRhZGF0YSkgeworICAgIC8vIEZpcnN0IHRyeSB3cml0aW5nIHRvIGZtcS4KKyAgICBzaXplX3QgbWV0YWRhdGFfc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSk7CisgICAgaWYgKChtZXRhZGF0YV9zaXplID4gMCkgJiYKKyAgICAgICAgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+Zm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPFJlZkJhc2U+IG9iaiA9IG51bGxwdHI7CisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG51bGxwdHI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VsdFJlY2VpdmVkOgorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Jlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHJlc3VsdCBvYmplY3QgaW4gY2FsbGJhY2sgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFdyYXBwZXIgPSBzdGF0aWNfY2FzdDxSZXN1bHRXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBwcm9jZXNzUmVzdWx0TWVzc2FnZShyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FsbGJhY2sgc2VudCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6cHJvY2Vzc1Jlc3VsdE1lc3NhZ2UoCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpIHsKKyAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNvbnZlcnRlciA9IG1Db252ZXJ0ZXIucHJvbW90ZSgpOworICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FsbGJhY2sgd3JhcHBlciBoYXMgZGllZCwgcmVzdWx0IGNhbGxiYWNrIGNhbm5vdCBiZSBtYWRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHQ7CisgICAgYXV0byByZXN1bHRFeHRyYXMgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0RXh0cmFzOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhSZXN1bHRFeHRyYXMgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisKKyAgICAvLyBDb252ZXJ0IE1ldGFkYXRhIGludG8gSENhbWVyYU1ldGFkYXRhOworICAgIEZtcVNpemVPck1ldGFkYXRhIGhSZXN1bHQ7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gcmVzdWx0LmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0ZXItPmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChyYXdNZXRhZGF0YSwgJmhSZXN1bHQpOworICAgIHJlc3VsdC51bmxvY2socmF3TWV0YWRhdGEpOworICAgIGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zID0gcmVzdWx0V3JhcHBlci0+bVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywgY29udmVydGVyLT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgIGF1dG8gcmV0ID0gY29udmVydGVyLT5tQmFzZS0+b25SZXN1bHRSZWNlaXZlZChoUmVzdWx0LCBoUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgIC8vIFdyYXAgQ2FtZXJhTWV0YWRhdGEsIHJlc3VsdEV4dHJhcyBhbmQgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgaW4gb24KKyAgICAvLyBzcDxSZWZCYXNlPi1hYmxlIHN0cnVjdHVyZSBhbmQgcG9zdCBpdC4KKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbmV3IFJlc3VsdFdyYXBwZXIoY29uc3RfY2FzdDxDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmPihyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMsIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdWx0UmVjZWl2ZWQsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldE9iamVjdChrUmVzdWx0S2V5LCByZXN1bHRXcmFwcGVyKTsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgLy8gVG8gc2lsZW5jZSBXdW51c2VkLXBhcmFtZXRlci4KKyAgICAodm9pZCkgc3RyZWFtSWQ7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSB7CisgICAgYXV0byByZXQgPQorICAgICAgICBtQmFzZS0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCByZXBlYXRpbmdSZXF1ZXN0SWQpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25SZXBlYXRpbmdSZXF1ZXN0RXJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXF1ZXN0UXVldWVFbXB0eSgpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmNTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmU7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitzdHJ1Y3QgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFEZXZpY2VDYWxsYmFjaywgSUNhbWVyYURldmljZUNhbGxiYWNrcywgQm5DYW1lcmFEZXZpY2VDYWxsYmFja3M+IHsKKyAgICBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSk7CisKKyAgICB+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCk7CisKKyAgICBib29sIGluaXRpYWxpemVMb29wZXIoKTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVxdWVzdFF1ZXVlRW1wdHkoKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtZXRhZGF0YVF1ZXVlKSB7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICAvLyBXcmFwcGVyIHN0cnVjdCBzbyB0aGF0IHBhcmFtZXRlcnMgdG8gb25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBtYXkgYmUKKyAgICAvLyBzZW50IHRocm91Z2ggYW4gQU1lc3NhZ2UuCisgICAgc3RydWN0IFJlc3VsdFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlIG1SZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgbVJlc3VsdEV4dHJhczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgICAgICBSZXN1bHRXcmFwcGVyKENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSA6CisgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc3RkOjptb3ZhYmxlCisgICAgICBtUmVzdWx0KHJlc3VsdCksIG1SZXN1bHRFeHRyYXMocmVzdWx0RXh0cmFzKSwgbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7IH0KKyAgICB9OworCisgICAgc3RydWN0IENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyAqY29udmVydGVyKSA6IG1Db252ZXJ0ZXIoY29udmVydGVyKSB7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2Uoc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgd3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIE11dGV4IG1NZXRhZGF0YVF1ZXVlTG9jazsKKyAgICB9OworCisgICAgdm9pZCBjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqcmVzdWx0TWV0YWRhdGEpOworICAgIGVudW0geworICAgICAgICBrV2hhdFJlc3VsdFJlY2VpdmVkLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa1Jlc3VsdEtleTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyID0gbnVsbHB0cjsKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXIgPSBudWxscHRyOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlZjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXM7CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgeworICBIQ2FtZXJhRGV2aWNlU3RhdHVzIGhDYW1lcmFEZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1cyk7CisgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICBjYW1lcmFTdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXMgPSBoQ2FtZXJhRGV2aWNlU3RhdHVzOworICBjYW1lcmFTdGF0dXNBbmRJZC5jYW1lcmFJZCA9IFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpOworICBhdXRvIHJldCA9IG1CYXNlLT5vblN0YXR1c0NoYW5nZWQoY2FtZXJhU3RhdHVzQW5kSWQpOworICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlcyBPblN0YXR1c0NoYW5nZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYpIHsKKyAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IG9uVG9yY2hTdGF0dXNDaGFuZ2VkCisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGNvbW1vbgorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkxNDNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CcENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Qm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6QnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit0eXBlZGVmIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgSENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworc3RydWN0IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lciA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4geworICAgIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCisgICAgfkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcigpIHsgfQorCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBzZXJ2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYwMTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmFoeWJyaWQgewordHlwZWRlZiA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIEhJbnRlcmZhY2U7CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRSA+CitjbGFzcyBIMkJDb252ZXJ0ZXIgOiBwdWJsaWMgQk5JTlRFUkZBQ0UgeworcHVibGljOgorICAgIHR5cGVkZWYgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+IENCYXNlOyAvLyBDb252ZXJ0ZXIgQmFzZQorICAgIHR5cGVkZWYgSU5URVJGQUNFIEJhc2VJbnRlcmZhY2U7CisgICAgdHlwZWRlZiBISU5URVJGQUNFIEhhbEludGVyZmFjZTsKKworICAgIEgyQkNvbnZlcnRlcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IG1CYXNlKGJhc2UpIHt9CisgICAgdmlydHVhbCBzcDxIYWxJbnRlcmZhY2U+IGdldEhhbEludGVyZmFjZSgpIHsgcmV0dXJuIG1CYXNlOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAorICAgICAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQgPSBudWxscHRyKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEhhbEludGVyZmFjZT4gbUJhc2U7CisgICAgc3RydWN0IE9iaXR1YXJ5IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQ7CisgICAgICAgIHZvaWQqIGNvb2tpZTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgIHdwPElCaW5kZXI+IHdobzsKKyAgICAgICAgT2JpdHVhcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByLAorICAgICAgICAgICAgICAgIHZvaWQqIGMsIHVpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIHcpIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChyKSwgY29va2llKGMpLCBmbGFncyhmKSwgd2hvKHcpIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeShjb25zdCBPYml0dWFyeSYgbykgOgorICAgICAgICAgICAgcmVjaXBpZW50KG8ucmVjaXBpZW50KSwKKyAgICAgICAgICAgIGNvb2tpZShvLmNvb2tpZSksCisgICAgICAgICAgICBmbGFncyhvLmZsYWdzKSwKKyAgICAgICAgICAgIHdobyhvLndobykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5JiBvcGVyYXRvcj0oY29uc3QgT2JpdHVhcnkmIG8pIHsKKyAgICAgICAgICAgIHJlY2lwaWVudCA9IG8ucmVjaXBpZW50OworICAgICAgICAgICAgY29va2llID0gby5jb29raWU7CisgICAgICAgICAgICBmbGFncyA9IG8uZmxhZ3M7CisgICAgICAgICAgICB3aG8gPSBvLndobzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90LCBjb25zdCB3cDxISW50ZXJmYWNlPiYpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiBkciA9IHJlY2lwaWVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGRyLT5iaW5kZXJEaWVkKHdobyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIHN0ZDo6bXV0ZXggbU9iaXR1YXJpZXNMb2NrOworICAgIHN0ZDo6dmVjdG9yPHNwPE9iaXR1YXJ5PiA+IG1PYml0dWFyaWVzOworfTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgbGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZWNpcGllbnQgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICJsaW5rVG9EZWF0aCgpOiByZWNpcGllbnQgbXVzdCBiZSBub24tbnVsbHB0ciIpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICAgICAgbU9iaXR1YXJpZXMucHVzaF9iYWNrKG5ldyBPYml0dWFyeShyZWNpcGllbnQsIGNvb2tpZSwgZmxhZ3MsIHRoaXMpKTsKKyAgICAgICAgaWYgKCFtQmFzZS0+bGlua1RvRGVhdGgobU9iaXR1YXJpZXMuYmFjaygpLCAwKSkgeworICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICB1bmxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgIGZvciAoYXV0byBpID0gbU9iaXR1YXJpZXMuYmVnaW4oKTsgaSAhPSBtT2JpdHVhcmllcy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgoZmxhZ3MgPSAoKmkpLT5mbGFncykgJiYgKAorICAgICAgICAgICAgICAgIChyZWNpcGllbnQgPT0gKCppKS0+cmVjaXBpZW50KSB8fAorICAgICAgICAgICAgICAgICgocmVjaXBpZW50ID09IG51bGxwdHIpICYmIChjb29raWUgPT0gKCppKS0+Y29va2llKSkpKSB7CisgICAgICAgICAgICBpZiAob3V0UmVjaXBpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqb3V0UmVjaXBpZW50ID0gKCppKS0+cmVjaXBpZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbUJhc2UtPnVubGlua1RvRGVhdGgoKmkpOworICAgICAgICAgICAgbU9iaXR1YXJpZXMuZXJhc2UoaSk7CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcyA/IE5PX0VSUk9SIDogREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmFoeWJyaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzgxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOmF0dGVtcHQgdG8gY29udmVydCBlbXB0eSBtZXRhZGF0YSB0byBIaWRsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgc3dpdGNoIChzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9STUFMX01PREU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBUT0RPOiBGaXggdGhpcworICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpWRU5ET1JfTU9ERV9TVEFSVDsKKyAgICB9Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpQUkVWSUVXOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9QUkVWSUVXOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9TVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpSRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1JFQ09SRDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpNQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX01BTlVBTDsKKyAgICB9Cit9CisKK2ludCBjb252ZXJ0RnJvbUhpZGwoSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uIHJvdGF0aW9uKSB7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjkwOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMTgwOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMjcwOgorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgfQorfQorCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gaUdCUHM7CisgICAgYXV0byAmd2luZG93SGFuZGxlcyA9IGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgaUdCUHMucmVzZXJ2ZSh3aW5kb3dIYW5kbGVzLnNpemUoKSk7CisgICAgZm9yIChhdXRvICZoYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgIGlHQlBzLnB1c2hfYmFjayhuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShoYW5kbGUpKSk7CisgICAgfQorICAgIFN0cmluZzE2IHBoeXNpY2FsQ2FtZXJhSWQxNihoT3V0cHV0Q29uZmlndXJhdGlvbi5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaUdCUHMsIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbi5yb3RhdGlvbiksIHBoeXNpY2FsQ2FtZXJhSWQxNiwKKyAgICAgICAgaE91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCwgT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIDAsIDAsCisgICAgICAgICh3aW5kb3dIYW5kbGVzLnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gb3V0cHV0Q29uZmlndXJhdGlvbjsKK30KKworLy8gVGhlIGNhbWVyYSBtZXRhZGF0YSBoZXJlIGlzIGNsb25lZC4gU2luY2Ugd2UncmUgcmVhZGluZyBtZXRhZGF0YSBvdmVyCisvLyBod2JpbmRlciB3ZSB3b3VsZCBuZWVkIHRvIGNsb25lIGl0IGluIG9yZGVyIHRvIGF2b2lkIGFsaWdtZW50IGlzc3Vlcy4KK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihzcmMuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gc3JjLnNpemUoKTsKKyAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgKmRzdCA9IGJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIEhDYW1lcmFEZXZpY2VTdGF0dXMgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1VOS05PV047CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VTdGF0dXM7Cit9CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcykgeworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50OworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworfQorCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICBzd2l0Y2goZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0FCTEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9JTlZBTElEX0VSUk9SOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9VTktOT1dOX0VSUk9SOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KSB7CisgICAgZHN0LT5yZXNpemUoc3JjLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmc3RhdHVzQW5kSWQgOiBzcmMpIHsKKyAgICAgICAgYXV0byAmYSA9ICgqZHN0KVtpKytdOworICAgICAgICBhLmNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgYS5kZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1c0FuZElkLnN0YXR1cyk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKSB7CisgICAgaFN1Ym1pdEluZm8tPnJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBoU3VibWl0SW5mby0+bGFzdEZyYW1lTnVtYmVyID0gc3VibWl0SW5mby5tTGFzdEZyYW1lTnVtYmVyOworfQorCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cykgeworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKGJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIC8vIE5PIEVycm9yIGhlcmUKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoKGJTdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfQ0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkNBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRFUFJFQ0FURURfSEFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNBQkxFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gc3RhdHVzOworfQorCitIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYUlkID0KKyAgICAgICAgU3RyaW5nOChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPQorICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAvLyBUcnkgdXNpbmcgZm1xIGF0IGZpcnN0LgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworfQorCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5yZXNpemUocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zW2krK10gPSBjb252ZXJ0VG9IaWRsKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgfQorICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7Cit9CisKK30gLy9jb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisjZGVmaW5lIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIEhUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpOworCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pOworCitIQ2FtZXJhRGV2aWNlU3RhdHVzIGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoaW50MzJfdCBzdGF0dXMpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgICAgICAgICAgICAgICAgIEhTdWJtaXRJbmZvICpoU3VibWl0SW5mbyk7CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSk7CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcyk7CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKTsKKworfSAvLyBjb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gaGFyZHdhcmUKK30gLy9hbmRyb2lkCisKKyNlbmRpZiAvL0NBTUVSQVNFUlZFUl9DT05WRVJUX1RPX0hJREwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0RnJvbUhpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmRpc2Nvbm5lY3QoKSB7CisgICAgbURldmljZVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0hpZGxDYW1lcmFEZXZpY2VVc2VyOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcigKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpCisgIDogbURldmljZVJlbW90ZShkZXZpY2VSZW1vdGUpIHsKKyAgICBtSW5pdFN1Y2Nlc3MgPSBpbml0RGV2aWNlKCk7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmluaXREZXZpY2UoKSB7CisgICAgLy8gVE9ETzogR2V0IHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBzaXplIGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgaW50MzJfdCByZXFGTVFTaXplID0gQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRTsKKworICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXFGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlcXVlc3QgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgcmVzRk1RU2l6ZSA9IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRTsKKyAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlc0ZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlc3VsdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvKioKKyAqIFRvIGJlIHVzZWQgb25seSBieSBzdWJtaXRSZXF1ZXN0TGlzdCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgcmVxdWlyZXMKKyAqIGNsaWVudHMgdG8gY2FsbCB0aGlzIG1ldGhvZCBzZXJpYWxseSwgaW5jYXNlIGZtcSBpcyB1c2VkIHRvIHNlbmQgbWV0YWRhdGEuCisgKi8KK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gJmUgOiBoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgQ2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZyA9CisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5iYWNrKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZy5pZCA9IGUuaWQuY19zdHIoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXR0aW5ncyBlaXRoZXIgZnJvbSB0aGUgZm1xIG9yIHN0cmFpZ2h0YXdheSBmcm9tIHRoZQorICAgICAgICAvLyByZXF1ZXN0LiBXZSBkb24ndCBuZWVkIGFueSBzeW5jaHJvbml6YXRpb24sIHNpbmNlIHN1Ym1pdFJlcXVlc3RMaXN0CisgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcmlhbGx5IGJ5IHRoZSBjbGllbnQgaWYgaXQgZGVjaWRlcyB0bworICAgICAgICAvLyB1c2UgZm1xLgorICAgICAgICBpZiAoZS5zZXR0aW5ncy5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgZm1xLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3NGbXE7CisgICAgICAgICAgICBzZXR0aW5nc0ZtcS5yZXNpemUoZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBib29sIHJlYWQgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5yZWFkKHNldHRpbmdzRm1xLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0RnJvbUhpZGwoc2V0dGluZ3NGbXEsICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc2V0dGluZ3MgbWV0YWRhdGEgaXMgY29udGFpbmVkIGluIHJlcXVlc3Qgc2V0dGluZ3MgZmllbGQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnZlcnRlZCA9CisgICAgICAgICAgICAgICAgY29udmVydEZyb21IaWRsKGUuc2V0dGluZ3MubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb252ZXJ0IHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgZnJvbSBISURMIHRvIEFJREwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpIHsKKyAgICAvLyBObyByZXByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICByZXF1ZXN0LT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbUFuZFdpbmRvd0lkIDogaFJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgIHJlcXVlc3QtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC5zdHJlYW1JZCk7CisgICAgICAgIHJlcXVlc3QtPm1TdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQpOworICAgIH0KKyAgICByZXR1cm4gY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoaFJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihyZXF1ZXN0LT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OnN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIGhSZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIHN1Ym1pdEluZm87CisgICAgSFN1Ym1pdEluZm8gaFN1Ym1pdEluZm87CisgICAgLyoqCisgICAgICogQ3JlYXRlIEFJREwgQ2FwdHVyZVJlcXVlc3QgZnJvbSByZXF1ZXN0TGlzdCBhbmQgZ3JhcGhpY0J1ZmZlclByb2R1Y2Vycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RzOworICAgIGZvciAoYXV0byAmaFJlcXVlc3QgOiBoUmVxdWVzdExpc3QpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF1dG8gJnJlcXVlc3QgPSByZXF1ZXN0cy5iYWNrKCk7CisgICAgICAgIGlmICghY29udmVydFJlcXVlc3RGcm9tSGlkbChoUmVxdWVzdCwgJnJlcXVlc3QpKSB7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCBoU3VibWl0SW5mbyk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIG1EZXZpY2VSZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdHJlYW1pbmcsICZzdWJtaXRJbmZvKTsKKyAgICBtUmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGNvbnZlcnRUb0hpZGwoc3VibWl0SW5mbywgJmhTdWJtaXRJbmZvKTsKKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFN1Ym1pdEluZm8pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNhbmNlbFJlcXVlc3QobVJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksIGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpiZWdpbkNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKCFjb252ZXJ0RnJvbUhpZGwoc2Vzc2lvblBhcmFtcywgJmNhbWVyYU1ldGFkYXRhKSkgeworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5lbmRDb25maWd1cmUoY29udmVydEZyb21IaWRsKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNZXRhZGF0YSk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBoaWRsX2NiXykgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9CisgICAgICAgIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgaW50MzJfdCBuZXdTdHJlYW1JZCA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dENvbmZpZ3VyYXRpb24sICZuZXdTdHJlYW1JZCk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBoaWRsX2NiXyhzdGF0dXMsIG5ld1N0cmVhbUlkKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChjb252ZXJ0RnJvbUhpZGwodGVtcGxhdGVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIU3RhdHVzIGhTdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihoU3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp3YWl0VW50aWxJZGxlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Zmx1c2goJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgaW50MzJfdCBzdHJlYW1JZCwKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGYxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIGhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gY2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFJFUVVFU1RfSURfTk9ORSA9IC0xOworCitzdHJ1Y3QgSGlkbENhbWVyYURldmljZVVzZXIgZmluYWwgOiBwdWJsaWMgSENhbWVyYURldmljZVVzZXIgeworICAgIEhpZGxDYW1lcmFEZXZpY2VVc2VyKGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSk7CisKKyAgICB+SGlkbENhbWVyYURldmljZVVzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGJlZ2luQ29uZmlndXJlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gd2FpdFVudGlsSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCwgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgYm9vbCBpbml0U3RhdHVzKCkgeyByZXR1cm4gbUluaXRTdWNjZXNzOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgYm9vbCBpbml0RGV2aWNlKCk7CisKKyAgICBib29sIGNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgYm9vbCBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKTsKKworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gbURldmljZVJlbW90ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgYm9vbCBtSW5pdFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpbnQzMl90IG1SZXF1ZXN0SWQgPSBSRVFVRVNUX0lEX05PTkU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRU9XT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2ZlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYURldmljZVVzZXI7Cit1c2luZyBzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhVHlwZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwordXNpbmcgSFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnSGlkbENhbWVyYVNlcnZpY2U7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIHsKKyAgICBnSGlkbENhbWVyYVNlcnZpY2UgPSBuZXcgSGlkbENhbWVyYVNlcnZpY2UoY3MpOworICAgIHJldHVybiBnSGlkbENhbWVyYVNlcnZpY2U7Cit9CisKK1JldHVybjx2b2lkPgorSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoKHNlcnZpY2VSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgc2luY2Ugd2UncmUgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIElEICVzIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGhDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgeworICAgIC8vIEhlcmUsIHdlIGZpcnN0IGdldCBJQ2FtZXJhRGV2aWNlVXNlciBmcm9tIG1BaWRsSUNhbWVyYVNlcnZpY2UsIHRoZW4gc2F2ZQorICAgIC8vIHRoYXQgaW50ZXJmYWNlIGluIHRoZSBuZXdseSBjcmVhdGVkIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGltcGwgY2xhc3MuCisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGUgPSBudWxscHRyOworICAgIC8vIENyZWF0ZSBhIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgb2JqZWN0IHdoaWNoIGludGVybmFsbHkKKyAgICAvLyBjYWxscyBjYWxsYmFjayBmdW5jdGlvbnMgcGFzc2VkIHRocm91Z2ggaENhbGxiYWNrLgorICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gaHlicmlkQ2FsbGJhY2tzID0gbmV3IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhoQ2FsbGJhY2spOworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIC8vIE5vdyB3ZSBjcmVhdGUgYSBIaWRsQ2FtZXJhRGV2aWNlVXNlciBjbGFzcywgc3RvcmUgdGhlIGRldmljZVJlbW90ZSBpbiBpdCwKKyAgICAvLyBhbmQgcmV0dXJuIHRoYXQgYmFjay4gQWxsIGNhbGxzIG9uIHRoYXQgaW50ZXJmYWNlIHdpbGwgYmUgZm9yd2FyZGVkIHRvCisgICAgLy8gdGhlIEFJREwgaW50ZXJmYWNlLgorICAgIHNwPEhpZGxDYW1lcmFEZXZpY2VVc2VyPiBoRGV2aWNlUmVtb3RlID0gbmV3IEhpZGxDYW1lcmFEZXZpY2VVc2VyKGRldmljZVJlbW90ZSk7CisgICAgaWYgKCFoRGV2aWNlUmVtb3RlLT5pbml0U3RhdHVzKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIEhJREwgd3JhcHBlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoeWJyaWRDYWxsYmFja3MtPnNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKGhEZXZpY2VSZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaERldmljZVJlbW90ZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBIaWRsQ2FtZXJhU2VydmljZTo6YWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXJzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihoTGlzdGVuZXIsIGNzTGlzdGVuZXIpKTsKK30KKworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+CitIaWRsQ2FtZXJhU2VydmljZTo6c2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3VsZFJlbW92ZSkgeworICAgIC8vIEdvIHRocm91Z2ggdGhlIG1MaXN0ZW5lcnMgbGlzdCBhbmQgY29tcGFyZSB0aGUgbGlzdGVuZXIgd2l0aCB0aGUgSElETAorICAgIC8vIGxpc3RlbmVyIHJlZ2lzdGVyZWQuCisgICAgYXV0byBpdCA9IG1MaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICBmb3IgKDtpdCAhPSBtTGlzdGVuZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChoYXJkd2FyZTo6aW50ZXJmYWNlc0VxdWFsKGl0LT5maXJzdCwgaExpc3RlbmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl0ICE9IG1MaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgY3NMaXN0ZW5lciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHsKKyAgICAgICAgICBtTGlzdGVuZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3NMaXN0ZW5lcjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZvciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKGNzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gV3JhcCBhbiBoQ3NMaXN0ZW5lciB3aXRoIEFpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgYW5kIHBhc3MgaXQgdG8KKyAgICAgICAgICAgIC8vIENhbWVyYVNlcnZpY2UuCisgICAgICAgICAgICBjc0xpc3RlbmVyID0gbmV3IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihoQ3NMaXN0ZW5lcik7CisgICAgICAgICAgICAvLyBBZGQgdG8gY2FjaGUKKyAgICAgICAgICAgIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgY3NMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgYSBsaXN0ZW5lciAlcCBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+IGNhbWVyYVN0YXR1c0FuZElkc3t9OworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQorICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lckhlbHBlcihjc0xpc3RlbmVyLCAmY2FtZXJhU3RhdHVzQW5kSWRzLCB0cnVlKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBjYW1lcmEgZGV2aWNlIHN0YXR1cyBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICBfaGlkbF9jYihzdGF0dXMsIHt9KTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4gaENhbWVyYVN0YXR1c0FuZElkczsKKyAgICAvL0NvbnZlcnQgY2FtZXJhU3RhdHVzQW5kSWRzIHRvIEhJREwgYW5kIGNhbGwgY2FsbGJhY2sKKyAgICBjb252ZXJ0VG9IaWRsKGNhbWVyYVN0YXR1c0FuZElkcywgJmhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFTZXJ2aWNlOjpyZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIpIHsKKyAgICBpZiAoaENzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbGlzdGVuZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIsIC8qcmVtb3ZlSWZGb3VuZCovdHJ1ZSk7CisgICAgfQorICAgIGlmIChjc0xpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5yZW1vdmVMaXN0ZW5lcihjc0xpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgUmVtb3ZpbmcgdW5yZWdpc3RlcmVkIGxpc3RlbmVyICVwIiwgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICByZXR1cm4gSFN0YXR1czo6Tk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IGdDYWNoZSA9IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKTsKKyAgICBpZiAoZ0NhY2hlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8bWV0YWRhdGFfdmVuZG9yX2lkX3QsIHNwPGFuZHJvaWQ6OlZlbmRvclRhZ0Rlc2NyaXB0b3I+PgorICAgICAgICAgICAgJnZlbmRvcklkc0FuZFRhZ0Rlc2NzID0gZ0NhY2hlLT5nZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpOworICAgIGlmICh2ZW5kb3JJZHNBbmRUYWdEZXNjcy5zaXplKCkgPT0gMCkgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgaGlkbF92ZWM8SFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucz4gaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zOworICAgIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUodmVuZG9ySWRzQW5kVGFnRGVzY3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChhdXRvICZ2ZW5kb3JJZEFuZFRhZ0Rlc2NzIDogdmVuZG9ySWRzQW5kVGFnRGVzY3MpIHsKKyAgICAgICAgaGlkbF92ZWM8SFZlbmRvclRhZ1NlY3Rpb24+IGhWZW5kb3JUYWdTZWN0aW9uczsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IHZlbmRvcklkQW5kVGFnRGVzY3Muc2Vjb25kOworICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4qIHNlY3Rpb25OYW1lcyA9IGRlc2MtPmdldEFsbFNlY3Rpb25OYW1lcygpOworICAgICAgICBzaXplX3QgbnVtU2VjdGlvbnMgPSBzZWN0aW9uTmFtZXMtPnNpemUoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SFZlbmRvclRhZz4+IHRhZ3NCeVNlY3Rpb24obnVtU2VjdGlvbnMpOworICAgICAgICBpbnQgdGFnQ291bnQgPSBkZXNjLT5nZXRUYWdDb3VudCgpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdGFncyh0YWdDb3VudCk7CisgICAgICAgIGRlc2MtPmdldFRhZ0FycmF5KHRhZ3MuZGF0YSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBIVmVuZG9yVGFnIHZ0OworICAgICAgICAgICAgdnQudGFnSWQgPSB0YWdzW2ldOworICAgICAgICAgICAgdnQudGFnTmFtZSA9IGRlc2MtPmdldFRhZ05hbWUodGFnc1tpXSk7CisgICAgICAgICAgICB2dC50YWdUeXBlID0gKEhDYW1lcmFNZXRhZGF0YVR5cGUpIGRlc2MtPmdldFRhZ1R5cGUodGFnc1tpXSk7CisgICAgICAgICAgICBzc2l6ZV90IHNlY3Rpb25JZHggPSBkZXNjLT5nZXRTZWN0aW9uSW5kZXgodGFnc1tpXSk7CisgICAgICAgICAgICB0YWdzQnlTZWN0aW9uW3NlY3Rpb25JZHhdLnB1c2hfYmFjayh2dCk7CisgICAgICAgIH0KKyAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zLnJlc2l6ZShudW1TZWN0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgbnVtU2VjdGlvbnM7IHMrKykgeworICAgICAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zW3NdLnNlY3Rpb25OYW1lID0gKCpzZWN0aW9uTmFtZXMpW3NdLnN0cmluZygpOworICAgICAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zW3NdLnRhZ3MgPSB0YWdzQnlTZWN0aW9uW3NdOworICAgICAgICB9CisgICAgICAgIEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgJmhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgPQorICAgICAgICAgICAgICAgIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9uc1tqXTsKKyAgICAgICAgaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucy5wcm92aWRlcklkID0gdmVuZG9ySWRBbmRUYWdEZXNjcy5maXJzdDsKKyAgICAgICAgaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucy52ZW5kb3JUYWdTZWN0aW9ucyA9IHN0ZDo6bW92ZShoVmVuZG9yVGFnU2VjdGlvbnMpOworICAgICAgICBqKys7CisgICAgfQorICAgIF9oaWRsX2NiKEhTdGF0dXM6Ok5PX0VSUk9SLCBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBzZXJ2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFkMGJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKKwordXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBIQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIEhDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOworCitzdHJ1Y3QgSGlkbENhbWVyYVNlcnZpY2UgZmluYWwgOiBwdWJsaWMgSENhbWVyYVNlcnZpY2UgeworCisgICAgfkhpZGxDYW1lcmFTZXJ2aWNlKCkgeyB9OworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjIuMDo6SUNhbWVyYVNlcnZpY2UgZm9sbG93LgorCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3REZXZpY2UoY29uc3Qgc3A8SENhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLCBjb25uZWN0RGV2aWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBhZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxIU3RhdHVzPiByZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY2FtZXJhc2VydmVycyBtYWluIHRocmVhZCB0bworICAgIC8vIGluc3RhbnRpYXRlIHRoZSBoaWRsIGNhbWVyYXNlcnZlci4KKyAgICBzdGF0aWMgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdldEluc3RhbmNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKTsKKworcHJpdmF0ZToKKyAgICBIaWRsQ2FtZXJhU2VydmljZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgOiBtQWlkbElDYW1lcmFTZXJ2aWNlKGNzKSB7IH07CisKKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZCgKKyAgICAgICAgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIsIC8qcmVtb3ZlSWZGb3VuZCovIGJvb2wgc2hvdWxkUmVtb3ZlID0gZmFsc2UpOworCisgICAgdm9pZCBhZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyKTsKKworICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNvbnN0IG1BaWRsSUNhbWVyYVNlcnZpY2UgPSBudWxscHRyOworCisgICAgTXV0ZXggbUxpc3RlbmVyTGlzdExvY2s7CisKKyAgICB1c2luZyBISUxpc3RlbmVycyA9CisgICAgICAgIHN0ZDo6cGFpcjxzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiwgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+OworICAgIHN0ZDo6bGlzdDxISUxpc3RlbmVycz4gbUxpc3RlbmVyczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBzZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgY2FtZXJhc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGZyYW1ld29ya3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGY3NzA2OWMuLmI0ZTdjMzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawpAQCAtMjcsMTcgKzI3LDI0IEBACiAgICAgbGliY2FtZXJhX2NsaWVudCBcCiAgICAgbGliY2FtZXJhX21ldGFkYXRhIFwKICAgICBsaWJ1dGlscyBcCisgICAgbGlianBlZyBcCisgICAgbGliZXhpZiBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40CiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIFwKKyAgICBleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIFwKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2aWNlX3Rlc3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCmluZGV4IGVmOTNkOWEuLmY0N2U1YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCkBAIC0zMyw2ICszMyw3IEBACiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYU1ldGFkYXRhVHlwZTsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKIAogLyoqCiAgKiBCYXNpYyB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIGEgY2FtZXJhIHZlci4gMy4yIGRldmljZSBpbnRlcmZhY2UKQEAgLTg3LDcgKzg4LDcgQEAKIC8qKgogICogQmFzaWMgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhbWVyYSBwcm92aWRlcgogICovCi1zdHJ1Y3QgVGVzdElDYW1lcmFQcm92aWRlciA6IHZpcnR1YWwgcHVibGljIHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXIgeworc3RydWN0IFRlc3RJQ2FtZXJhUHJvdmlkZXIgOiB2aXJ0dWFsIHB1YmxpYyBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyIHsKICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2s+IG1DYWxsYmFja3M7CiAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBtRGV2aWNlTmFtZXM7CiAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBtRGV2aWNlSW50ZXJmYWNlOwpAQCAtMTAxLDYgKzEwMiw3IEBACiAKICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzZXRDYWxsYmFjaygKICAgICAgICAgICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaz4mIGNhbGxiYWNrcykgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltTRVRfQ0FMTEJBQ0tdKys7CiAgICAgICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4oU3RhdHVzOjpPSyk7CiAgICAgfQpAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgdXNpbmcgZ2V0VmVuZG9yVGFnc19jYiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChTdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHNlY3Rpb25zKT47CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBnZXRWZW5kb3JUYWdzKGdldFZlbmRvclRhZ3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbR0VUX1ZFTkRPUl9UQUdTXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBtVmVuZG9yVGFnU2VjdGlvbnMpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xMTcsNiArMTIwLDcgQEAKICAgICAgICAgICAgICBib29sIHN1cHBvcnQpPjsKICAgICB2aXJ0dWFsIDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBpc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKICAgICAgICAgICAgIGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0lTX1NFVF9UT1JDSF9NT0RFX1NVUFBPUlRFRF0rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgZmFsc2UpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xMjQsNiArMTI4LDcgQEAKICAgICB1c2luZyBnZXRDYW1lcmFJZExpc3RfY2IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcyk+OwogICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBnZXRDYW1lcmFJZExpc3QoZ2V0Q2FtZXJhSWRMaXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0dFVF9DQU1FUkFfSURfTElTVF0rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgbURldmljZU5hbWVzKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTQ4LDYgKzE1MywyNSBAQAogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbTk9USUZZX0RFVklDRV9TVEFURV0rKzsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBlbnVtIE1ldGhvZE5hbWVzIHsKKyAgICAgICAgU0VUX0NBTExCQUNLLAorICAgICAgICBHRVRfVkVORE9SX1RBR1MsCisgICAgICAgIElTX1NFVF9UT1JDSF9NT0RFX1NVUFBPUlRFRCwKKyAgICAgICAgTk9USUZZX0RFVklDRV9TVEFURSwKKyAgICAgICAgR0VUX0NBTUVSQV9JRF9MSVNULAorCisgICAgICAgIE1FVEhPRF9OQU1FX0NPVU5UCisgICAgfTsKKyAgICBpbnQgbUNhbGxlZENvdW50ZXJbTUVUSE9EX05BTUVfQ09VTlRdIHswfTsKKworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBtQ3VycmVudFN0YXRlID0gMHhGRkZGRkZGRjsgLy8gVW5saWtlbHkgdG8gYmUgYSByZWFsIHN0YXRlCiB9OwogCiAvKioKQEAgLTE2Myw3ICsxODcsNyBAQAogICAgICAgICBtVGVzdENhbWVyYVByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXM7CiAKICAgICB2aXJ0dWFsIH5UZXN0SW50ZXJhY3Rpb25Qcm94eSgpIHt9CiAKQEAgLTE3Nyw3ICsyMDEsNyBAQAogCiAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMucHVzaF9iYWNrKHNlcnZpY2VOYW1lKTsKICAgICAgICAgcmV0dXJuIG1UZXN0Q2FtZXJhUHJvdmlkZXI7CiAgICAgfQogCkBAIC0yMDksMTAgKzIzMywzNCBAQAogCiAgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKICAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOworICAgIC8vIENoZWNrIHRoYXQgYm90aCAibGVnYWN5IiBhbmQgImV4dGVybmFsIiBwcm92aWRlcnMgKHJlYWxseSB0aGUgc2FtZSBvYmplY3QpIGFyZSBjYWxsZWQKKyAgICAvLyBvbmNlIGZvciBhbGwgdGhlIGluaXQgbWV0aG9kcworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6U0VUX0NBTExCQUNLXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIHNldENhbGxiYWNrIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpHRVRfVkVORE9SX1RBR1NdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gZ2V0VmVuZG9yVGFncyBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6SVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVEXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpHRVRfQ0FNRVJBX0lEX0xJU1RdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gZ2V0Q2FtZXJhSWRMaXN0IHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpOT1RJRllfREVWSUNFX1NUQVRFXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIG5vdGlmeURldmljZVN0YXRlIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CiAKLSAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIGxlZ2FjeUluc3RhbmNlTmFtZSkgPDwKKyAgICBzdGQ6OnN0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOworICAgIHN0ZDo6c3RyaW5nIGV4dGVybmFsSW5zdGFuY2VOYW1lID0gImV4dGVybmFsLzAiOworICAgIGJvb2wgZ290TGVnYWN5ID0gZmFsc2U7CisgICAgYm9vbCBnb3RFeHRlcm5hbCA9IGZhbHNlOworICAgIEVYUEVDVF9FUSgydSwgc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLnNpemUoKSkgPDwKKyAgICAgICAgICAgICJPbmx5IHR3byBzZXJ2aWNlIHF1ZXJpZXMgZXhwZWN0ZWQgdG8gYmUgc2VlbiBieSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIiOworCisgICAgZm9yIChhdXRvJiBzZXJ2aWNlTmFtZSA6IHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcykgeworICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbGVnYWN5SW5zdGFuY2VOYW1lKSBnb3RMZWdhY3kgPSB0cnVlOworICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gZXh0ZXJuYWxJbnN0YW5jZU5hbWUpIGdvdEV4dGVybmFsID0gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUoZ290TGVnYWN5KSA8PAogICAgICAgICAgICAgIkxlZ2FjeSBpbnN0YW5jZSBub3QgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKKyAgICBBU1NFUlRfVFJVRShnb3RFeHRlcm5hbCkgPDwKKyAgICAgICAgICAgICJFeHRlcm5hbCBpbnN0YW5jZSBub3QgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNDo6SUNhbWVyYVByb3ZpZGVyIjsKQEAgLTIyMSw3ICsyNjksNyBAQAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLAogICAgICAgICAgICAgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lLCBmYWxzZSk7CiAKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogfQogCkBAIC0yNTUsNyArMzAzLDcgQEAKICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CiAgICAgc2VydmljZVByb3h5Lm1NYW5hZ2VyTm90aWZpY2F0aW9uSW50ZXJmYWNlLT5vblJlZ2lzdHJhdGlvbigKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lLCBmYWxzZSk7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBzZWN0aW9uTmFtZVNlY29uZCA9ICJTZWNvbmRWZW5kb3JUZXN0U2VjdGlvbiI7CkBAIC0yNzMsNyArMzIxLDcgQEAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lID0gInRlc3QyLzAiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwKICAgICAgICAgICAgICAgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCkBAIC0zNjYsMyArNDE0LDM1IEBACiAgICAgbWV0YWRhdGFDb3B5LmR1bXAoMSwgMik7CiAgICAgc2Vjb25kTWV0YWRhdGEuZHVtcCgxLCAyKTsKIH0KKworVEVTVChDYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LCBOb3RpZnlTdGF0ZUNoYW5nZVRlc3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGRldmljZU5hbWVzIHsKKyAgICAgICAgImRldmljZUAzLjIvdGVzdC8wIiwKKyAgICAgICAgImRldmljZUAxLjAvdGVzdC8wIiwKKyAgICAgICAgImRldmljZUAzLjIvdGVzdC8xIn07CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiB2ZW5kb3JTZWN0aW9uOworICAgIHN0YXR1c190IHJlczsKKyAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IHByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKKyAgICBzcDxUZXN0U3RhdHVzTGlzdGVuZXI+IHN0YXR1c0xpc3RlbmVyID0gbmV3IFRlc3RTdGF0dXNMaXN0ZW5lcigpOworICAgIFRlc3RJbnRlcmFjdGlvblByb3h5IHNlcnZpY2VQcm94eTsKKyAgICBzcDxUZXN0SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9ICBuZXcgVGVzdElDYW1lcmFQcm92aWRlcihkZXZpY2VOYW1lcywKKyAgICAgICAgICAgIHZlbmRvclNlY3Rpb24pOworICAgIHNlcnZpY2VQcm94eS5zZXRQcm92aWRlcihwcm92aWRlcik7CisKKyAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CisKKyAgICBBU1NFUlRfRVEocHJvdmlkZXItPm1DdXJyZW50U3RhdGUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpOT1JNQUwpKQorICAgICAgICAgICAgPDwgIkluaXRpYWwgZGV2aWNlIHN0YXRlIG5vdCBzZXQiOworCisgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Rk9MREVEKSk7CisKKyAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBjYWxsIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlIjsKKyAgICBBU1NFUlRfRVEocHJvdmlkZXItPm1DdXJyZW50U3RhdGUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpGT0xERUQpKQorICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBjaGFuZ2UgZGV2aWNlIHN0YXRlIjsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEZXB0aFByb2Nlc3NvclRlc3QiCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxyYW5kb20+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICIuLi9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL0V4aWZVdGlscy5oIgorI2luY2x1ZGUgIk5WMTJDb21wcmVzc29yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyTlYxMlNpemUgKCgoKGtUZXN0QnVmZmVyV2lkdGgpICogKGtUZXN0QnVmZmVySGVpZ2h0KSkgKiAzKSAvIDIpOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZSAoa1Rlc3RCdWZmZXJXaWR0aCAqIGtUZXN0QnVmZmVySGVpZ2h0KTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1NlZWQgPSAxMjM0OworCit2b2lkIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KHZvaWQgKipsaWJIYW5kbGUgLypvdXQqLywKKyAgICAgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSAqcHJvY2Vzc0ZyYW1lRnVuYyAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGxpYkhhbmRsZSwgbnVsbHB0cik7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGcmFtZUZ1bmMsIG51bGxwdHIpOworCisgICAgKmxpYkhhbmRsZSA9IGRsb3BlbihrRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgaWYgKCpsaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqcHJvY2Vzc0ZyYW1lRnVuYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhMzo6cHJvY2Vzc19kZXB0aF9waG90b19mcmFtZT4gKAorICAgICAgICAgICAgICAgIGRsc3ltKCpsaWJIYW5kbGUsIGtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uKSk7CisgICAgICAgIEFTU0VSVF9ORSgqcHJvY2Vzc0ZyYW1lRnVuYywgbnVsbHB0cik7CisgICAgfQorfQorCit2b2lkIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGludCBqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUsIGJvb2wgaW5jbHVkZUV4aWYsCisgICAgICAgIGJvb2wgc3dpdGNoRGltZW5zaW9ucywgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmNvbG9ySnBlZ0J1ZmZlciAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGNvbG9ySnBlZ0J1ZmZlciwgbnVsbHB0cik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIGtUZXN0QnVmZmVyTlYxMlNpemU+IGNvbG9yU291cmNlQnVmZmVyOworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihrU2VlZCk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB1bmlEaXN0KDAsIFVJTlQ4X01BWCAtIDEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29sb3JTb3VyY2VCdWZmZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29sb3JTb3VyY2VCdWZmZXJbaV0gPSB1bmlEaXN0KGdlbik7CisgICAgfQorCisgICAgc2l6ZV90IHdpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBzaXplX3QgaGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaWYgKHN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgd2lkdGggPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaGVpZ2h0ID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICB9CisKKyAgICBOVjEyQ29tcHJlc3NvciBqcGVnQ29tcHJlc3NvcjsKKyAgICBpZiAoaW5jbHVkZUV4aWYpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoanBlZ0NvbXByZXNzb3IuY29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChjb2xvclNvdXJjZUJ1ZmZlci5kYXRhKCkpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5LCBvcmllbnRhdGlvblZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoanBlZ0NvbXByZXNzb3IuY29tcHJlc3MoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGNvbG9yU291cmNlQnVmZmVyLmRhdGEoKSksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAganBlZ1F1YWxpdHkpKTsKKyAgICB9CisKKyAgICAqY29sb3JKcGVnQnVmZmVyID0gc3RkOjptb3ZlKGpwZWdDb21wcmVzc29yLmdldENvbXByZXNzZWREYXRhKCkpOworICAgIEFTU0VSVF9GQUxTRShjb2xvckpwZWdCdWZmZXItPmVtcHR5KCkpOworfQorCit2b2lkIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcihzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gKmRlcHRoMTZCdWZmZXIgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShkZXB0aDE2QnVmZmVyLCBudWxscHRyKTsKKyAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oa1NlZWQrMSk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB1bmlEaXN0KDAsIFVJTlQxNl9NQVggLSAxKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlcHRoMTZCdWZmZXItPnNpemUoKTsgaSsrKSB7CisgICAgICAgICgqZGVwdGgxNkJ1ZmZlcilbaV0gPSB1bmlEaXN0KGdlbik7CisgICAgfQorfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgTGlua1RvTGlicmF5KSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgIH0KK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIEJhZElucHV0KSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIC8qaW5jbHVkZUV4aWYqLyBmYWxzZSwgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIG51bGxwdHIpLAorICAgICAgICAgICAgMCk7CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBCYXNpY0RlcHRoUGhvdG9WYWxpZGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIC8qaW5jbHVkZUV4aWYqLyBmYWxzZSwgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJiAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byBtdXN0IGNvbnNpc3Qgb2YgdGhyZWUganBlZyBpbWFnZXM6CisgICAgLy8gIC0gdGhlIG1haW4gY29sb3IgaW1hZ2UKKyAgICAvLyAgLSB0aGUgZGVwdGggbWFwIGltYWdlCisgICAgLy8gIC0gdGhlIGNvbmZpZGVuY2UgbWFwIGltYWdlCisgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgVGVzdERlcHRoUGhvdG9FeGlmT3JpZW50YXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uc1tdID0geyBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVMsCisgICAgICAgICAgICBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTIH07CisgICAgZm9yIChhdXRvIGV4aWZPcmllbnRhdGlvbiA6IGV4aWZPcmllbnRhdGlvbnMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgICAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCAvKmluY2x1ZGVFeGlmKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gIT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGF1dG8ganBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oY29sb3JKcGVnQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgY29sb3JKcGVnQnVmZmVyLnNpemUoKSwgJmpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXhpZk9yaWVudGF0aW9uLCBqcGVnRXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgICAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgICAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwU2l6ZSA9IGFjdHVhbERlcHRoUGhvdG9TaXplIC0gKG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSk7CisKKyAgICAgICAgLy9EZXB0aCBhbmQgY29uZmlkZW5jZSBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIEVYSUYgb3JpZW50YXRpb24gYXMgdGhlIHNvdXJjZQorICAgICAgICBhdXRvIGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHVuZGVmaW5lZCBvciBtaXNzaW5nIEVYSUYgb3JpZW50YXRpb24sIGFsd2F5cyBleHBlY3QgMCBkZWdyZWVzIGluIHRoZQorICAgICAgICAgICAgLy8gZGVwdGggbWFwLgorICAgICAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZU1hcFNpemUsICZjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgdW5kZWZpbmVkIG9yIG1pc3NpbmcgRVhJRiBvcmllbnRhdGlvbiwgYWx3YXlzIGV4cGVjdCAwIGRlZ3JlZXMgaW4gdGhlCisgICAgICAgICAgICAvLyBjb25maWRlbmNlIG1hcC4KKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgVGVzdERlcGh0UGhvdG9QaHlzaWNhbFJvdGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gY2FzZSBvZiBwaHlzaWNhbCByb3RhdGlvbiwgdGhlIEVYSUYgb3JpZW50YXRpb24gbXVzdCBhbHdheXMgYmUgMC4KKyAgICBhdXRvIGV4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbiBkZXB0aE9yaWVudGF0aW9uc1tdID0geworICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUyB9OworICAgIGZvciAoYXV0byBkZXB0aE9yaWVudGF0aW9uIDogZGVwdGhPcmllbnRhdGlvbnMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgICAgICBib29sIHN3aXRjaERpbWVuc2lvbnMgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBzaXplX3QgZXhwZWN0ZWRIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaWYgKChkZXB0aE9yaWVudGF0aW9uID09IERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUykgfHwKKyAgICAgICAgICAgICAgICAoZGVwdGhPcmllbnRhdGlvbiA9PSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTKSkgeworICAgICAgICAgICAgc3dpdGNoRGltZW5zaW9ucyA9IHRydWU7CisgICAgICAgICAgICBleHBlY3RlZFdpZHRoID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgICAgICBleHBlY3RlZEhlaWdodCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgLyppbmNsdWRlRXhpZiovIHRydWUsCisgICAgICAgICAgICAgICAgc3dpdGNoRGltZW5zaW9ucywgJmNvbG9ySnBlZ0J1ZmZlcik7CisgICAgICAgIGF1dG8ganBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihjb2xvckpwZWdCdWZmZXIuZGF0YSgpLCBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICZqcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZXhpZk9yaWVudGF0aW9uLCBqcGVnRXhpZk9yaWVudGF0aW9uKTsKKworICAgICAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgICAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgICAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1PcmllbnRhdGlvbiA9IGRlcHRoT3JpZW50YXRpb247CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwU2l6ZSA9IGFjdHVhbERlcHRoUGhvdG9TaXplIC0gKG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSk7CisKKyAgICAgICAgLy9EZXB0aCBhbmQgY29uZmlkZW5jZSBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIEVYSUYgb3JpZW50YXRpb24gYXMgdGhlIHNvdXJjZQorICAgICAgICBhdXRvIGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFdpZHRoLCBkZXB0aE1hcEhlaWdodDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoTWFwV2lkdGgsICZkZXB0aE1hcEhlaWdodCksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoTWFwV2lkdGgsIGV4cGVjdGVkV2lkdGgpOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhNYXBIZWlnaHQsIGV4cGVjdGVkSGVpZ2h0KTsKKworICAgICAgICBhdXRvIGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLCBjb25maWRlbmNlTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAmY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBXaWR0aCwgY29uZmlkZW5jZU1hcEhlaWdodDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLCBjb25maWRlbmNlTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAmY29uZmlkZW5jZU1hcFdpZHRoLCAmY29uZmlkZW5jZU1hcEhlaWdodCksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VNYXBXaWR0aCwgZXhwZWN0ZWRXaWR0aCk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlTWFwSGVpZ2h0LCBleHBlY3RlZEhlaWdodCk7CisgICAgfQorCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCmluZGV4IDJhNjg5YzYuLjU0OTM1YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKQEAgLTE2Nyw2ICsxNjcsMzAgQEAKICAgICB9CiB9CiAKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIENsYW1wQ29uc2lzdGVuY3kpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDQ+IGFjdGl2ZUFycmF5ID0gezAsIDAsIDQwMzIsIDMwMjR9OworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGlkZW50aXR5RGlzdG9ydGlvbiwgdGVzdElDYWwsIC8qYWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCksCisgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSk7CisKKyAgICBhdXRvIHJlY3RzT3JpZyA9IGFjdGl2ZUFycmF5OworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9CisKKyAgICByZXMgPSBtLm1hcFJhd1JlY3RUb0NvcnJlY3RlZChhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorfQorCiBURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBTaW1wbGVUcmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXM7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUZXN0X05WMTJDb21wcmVzc29yIgorCisjaW5jbHVkZSAiTlYxMkNvbXByZXNzb3IuaCIKKworI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkVudHJ5PiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRW50cnkqIGVudHJ5KSBjb25zdCB7IGV4aWZfZW50cnlfdW5yZWYoZW50cnkpOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRlZmF1bHRfZGVsZXRlPEV4aWZEYXRhPiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRGF0YSogZGF0YSkgY29uc3QgeyBleGlmX2RhdGFfdW5yZWYoZGF0YSk7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSkgeworICAgIGlmICghY29uZmlndXJlQ29tcHJlc3Nvcih3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5KSkgeworICAgICAgICAvLyB0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgYSBtb3JlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2UgdGhhbiB3ZSBjYW4KKyAgICAgICAgLy8gcHJvdmlkZSBoZXJlIHNvIGp1c3QgcmV0dXJuLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXByZXNzRGF0YShkYXRhLCAvKmV4aWZEYXRhKi8gbnVsbHB0cik7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGludCBxdWFsaXR5LCBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gZXhpZlZhbHVlKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZEYXRhPiBleGlmRGF0YShleGlmX2RhdGFfbmV3KCkpOworICAgIGlmIChleGlmRGF0YS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBleGlmX2RhdGFfc2V0X29wdGlvbihleGlmRGF0YS5nZXQoKSwgRVhJRl9EQVRBX09QVElPTl9GT0xMT1dfU1BFQ0lGSUNBVElPTik7CisgICAgZXhpZl9kYXRhX3NldF9kYXRhX3R5cGUoZXhpZkRhdGEuZ2V0KCksIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmRGF0YS5nZXQoKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBleGlmRW50cnkoZXhpZl9lbnRyeV9uZXcoKSk7CisgICAgaWYgKGV4aWZFbnRyeS5nZXQoKSA9PSAgbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZXhpZkVudHJ5LT50YWcgPSBFWElGX1RBR19PUklFTlRBVElPTjsKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sIGV4aWZFbnRyeS5nZXQoKSk7CisgICAgZXhpZl9lbnRyeV9pbml0aWFsaXplKGV4aWZFbnRyeS5nZXQoKSwgZXhpZkVudHJ5LT50YWcpOworICAgIGV4aWZfc2V0X3Nob3J0KGV4aWZFbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCBleGlmVmFsdWUpOworCisgICAgaWYgKCFjb25maWd1cmVDb21wcmVzc29yKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcHJlc3NEYXRhKGRhdGEsIGV4aWZEYXRhLmdldCgpKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIE5WMTJDb21wcmVzc29yOjpnZXRDb21wcmVzc2VkRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURlc3RNYW5hZ2VyLm1CdWZmZXI7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbmZpZ3VyZUNvbXByZXNzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSkgeworICAgIG1Db21wcmVzc0luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJm1FcnJvck1hbmFnZXIpOworICAgIC8vIE5PVEUhIERBTkdFUiEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBiZWxvdyBzZXRqbXAhCisgICAgLy8gVGhlIGNvbXBpbGVyIHdpbGwgbm90IGdlbmVyYXRlIGNvZGUgdG8gZGVzdHJveSB0aGVtIGR1cmluZyB0aGUgcmV0dXJuCisgICAgLy8gYmVsb3cgc28gdGhleSB3aWxsIGxlYWsuIEFkZGl0aW9uYWxseSwgZG8gbm90IHBsYWNlIGFueSBjYWxscyB0byBsaWJqcGVnCisgICAgLy8gdGhhdCBjYW4gZmFpbCBhYm92ZSB0aGlzIGxpbmUgb3IgYW55IGVycm9yIHdpbGwgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGlmIChzZXRqbXAobUVycm9yTWFuYWdlci5tSnVtcEJ1ZmZlcikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGp1bXAgaW4gY2FzZSBzZXR1cCBmYWlscworICAgICAgICAvLyBUaGUgZXJyb3IgbWFuYWdlciB3aWxsIEFMT0cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworCisgICAgbUNvbXByZXNzSW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworICAgIG1Db21wcmVzc0luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgbUNvbXByZXNzSW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKyAgICBqcGVnX3NldF9kZWZhdWx0cygmbUNvbXByZXNzSW5mbyk7CisKKyAgICBqcGVnX3NldF9xdWFsaXR5KCZtQ29tcHJlc3NJbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgICAvLyBJdCBtYXkgc2VlbSB3ZWlyZCB0byBzZXQgY29sb3Igc3BhY2UgaGVyZSBhZ2FpbiBidXQgdGhpcyB3aWxsIGFsc28gc2V0CisgICAgLy8gb3RoZXIgZmllbGRzLiBUaGVzZSBmaWVsZHMgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkganBlZ19zZXRfZGVmYXVsdHMKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKCZtQ29tcHJlc3NJbmZvLCBKQ1NfWUNiQ3IpOworICAgIG1Db21wcmVzc0luZm8ucmF3X2RhdGFfaW4gPSBUUlVFOworICAgIG1Db21wcmVzc0luZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgLy8gU2V0IHNhbXBsaW5nIGZhY3RvcnMKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMjsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMjsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICAgIG1Db21wcmVzc0luZm8uZGVzdCA9ICZtRGVzdE1hbmFnZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZGVpbnRlcmxlYXZlKGNvbnN0IHVpbnQ4X3QqIHZ1UGxhbmFyLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdVJvd3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2Um93cywgaW50IHJvd0luZGV4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgICBpbnQgbnVtUm93cyA9IChoZWlnaHQgLSByb3dJbmRleCkgLyAyOworICAgIGlmIChudW1Sb3dzID4gOCkgbnVtUm93cyA9IDg7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgKytyb3cpIHsKKyAgICAgICAgaW50IG9mZnNldCA9ICgocm93SW5kZXggPj4gMSkgKyByb3cpICogc3RyaWRlOworICAgICAgICBjb25zdCB1aW50OF90KiB2dSA9IHZ1UGxhbmFyICsgb2Zmc2V0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgKytpKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAod2lkdGggPj4gMSkgKyBpOworICAgICAgICAgICAgdVJvd3NbaW5kZXhdID0gdnVbMV07CisgICAgICAgICAgICB2Um93c1tpbmRleF0gPSB2dVswXTsKKyAgICAgICAgICAgIHZ1ICs9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzRGF0YShjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBFeGlmRGF0YSogZXhpZkRhdGEpIHsKKyAgICBjb25zdCB1aW50OF90KiB5WzE2XTsKKyAgICBjb25zdCB1aW50OF90KiBjYls4XTsKKyAgICBjb25zdCB1aW50OF90KiBjcls4XTsKKyAgICBjb25zdCB1aW50OF90KiogcGxhbmVzWzNdID0geyB5LCBjYiwgY3IgfTsKKworICAgIGludCBpLCBvZmZzZXQ7CisgICAgaW50IHdpZHRoID0gbUNvbXByZXNzSW5mby5pbWFnZV93aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCogeVBsYW5hciA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCogdnVQbGFuYXIgPSBkYXRhICsgKHdpZHRoICogaGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1Um93cyg4ICogKHdpZHRoID4+IDEpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2Um93cyg4ICogKHdpZHRoID4+IDEpKTsKKworICAgIC8vIE5PVEUhIERBTkdFUiEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBiZWxvdyBzZXRqbXAhCisgICAgLy8gVGhlIGNvbXBpbGVyIHdpbGwgbm90IGdlbmVyYXRlIGNvZGUgdG8gZGVzdHJveSB0aGVtIGR1cmluZyB0aGUgcmV0dXJuCisgICAgLy8gYmVsb3cgc28gdGhleSB3aWxsIGxlYWsuIEFkZGl0aW9uYWxseSwgZG8gbm90IHBsYWNlIGFueSBjYWxscyB0byBsaWJqcGVnCisgICAgLy8gdGhhdCBjYW4gZmFpbCBhYm92ZSB0aGlzIGxpbmUgb3IgYW55IGVycm9yIHdpbGwgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGlmIChzZXRqbXAobUVycm9yTWFuYWdlci5tSnVtcEJ1ZmZlcikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGp1bXAgaW4gY2FzZSBjb21wcmVzc2lvbiBmYWlscworICAgICAgICAvLyBUaGUgZXJyb3IgbWFuYWdlciB3aWxsIEFMT0cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ19zdGFydF9jb21wcmVzcygmbUNvbXByZXNzSW5mbywgVFJVRSk7CisKKyAgICBhdHRhY2hFeGlmRGF0YShleGlmRGF0YSk7CisKKyAgICAvLyBwcm9jZXNzIDE2IGxpbmVzIG9mIFkgYW5kIDggbGluZXMgb2YgVS9WIGVhY2ggdGltZS4KKyAgICB3aGlsZSAobUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lIDwgbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQpIHsKKyAgICAgICAgLy9kZWludGVybGVhdmUgdSBhbmQgdgorICAgICAgICBkZWludGVybGVhdmUodnVQbGFuYXIsIHVSb3dzLCB2Um93cywgbUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgd2lkdGgpOworCisgICAgICAgIC8vIEpwZWcgbGlicmFyeSBpZ25vcmVzIHRoZSByb3dzIHdob3NlIGluZGljZXMgYXJlIGdyZWF0ZXIgdGhhbiBoZWlnaHQuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAvLyB5IHJvdworICAgICAgICAgICAgeVtpXSA9IHlQbGFuYXIgKyAobUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lICsgaSkgKiB3aWR0aDsKKworICAgICAgICAgICAgLy8gY29uc3RydWN0IHUgcm93IGFuZCB2IHJvdworICAgICAgICAgICAgaWYgKChpICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIGJvdGggaGFsdmVkIGJlY2F1c2Ugb2YgZG93bnNhbXBsaW5nCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGkgPj4gMSkgKiAod2lkdGggPj4gMSk7CisgICAgICAgICAgICAgICAgY2JbaS8yXSA9ICZ1Um93c1tvZmZzZXRdOworICAgICAgICAgICAgICAgIGNyW2kvMl0gPSAmdlJvd3Nbb2Zmc2V0XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGpwZWdfd3JpdGVfcmF3X2RhdGEoJm1Db21wcmVzc0luZm8sIGNvbnN0X2Nhc3Q8SlNBTVBJTUFHRT4ocGxhbmVzKSwgMTYpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKyAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmF0dGFjaEV4aWZEYXRhKEV4aWZEYXRhKiBleGlmRGF0YSkgeworICAgIGlmIChleGlmRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGFuIGVycm9yLCB3ZSBkb24ndCByZXF1aXJlIEVYSUYgZGF0YQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBFWElGIGRhdGEgdG8gbWVtb3J5CisgICAgdW5zaWduZWQgY2hhciogcmF3RGF0YSA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgaW50IHNpemUgPSAwOworICAgIGV4aWZfZGF0YV9zYXZlX2RhdGEoZXhpZkRhdGEsICZyYXdEYXRhLCAmc2l6ZSk7CisgICAgaWYgKHJhd0RhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBFWElGIGRhdGEgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfd3JpdGVfbWFya2VyKCZtQ29tcHJlc3NJbmZvLCBKUEVHX0FQUDAgKyAxLCByYXdEYXRhLCBzaXplKTsKKyAgICBmcmVlKHJhd0RhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCitOVjEyQ29tcHJlc3Nvcjo6RXJyb3JNYW5hZ2VyOjpFcnJvck1hbmFnZXIoKSB7CisgICAgZXJyb3JfZXhpdCA9ICZvbkpwZWdFcnJvcjsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RXJyb3JNYW5hZ2VyOjpvbkpwZWdFcnJvcihqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAvLyBOT1RFISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGluIHRoaXMgbWV0aG9kIGF0IHRoZSB0b3AKKyAgICAvLyBzY29wZS4gVGhlaXIgZGVzdHJ1Y3RvcnMgd2lsbCBub3QgYmUgY2FsbGVkLiBJZiB5b3UgZG8gbmVlZCBzdWNoIGFuCisgICAgLy8gb2JqZWN0IGNyZWF0ZSBhIGxvY2FsIHNjb3BlIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgbG9uZ2ptcCBjYWxsLAorICAgIC8vIHRoYXQgZW5zdXJlcyB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBiZWZvcmUgbG9uZ2ptcCBpcyBjYWxsZWQuCisgICAgRXJyb3JNYW5hZ2VyKiBlcnJvck1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PEVycm9yTWFuYWdlcio+KGNpbmZvLT5lcnIpOworCisgICAgLy8gRm9ybWF0IGFuZCBsb2cgZXJyb3IgbWVzc2FnZQorICAgIGNoYXIgZXJyb3JNZXNzYWdlW0pNU0dfTEVOR1RIX01BWF07CisgICAgKCplcnJvck1hbmFnZXItPmZvcm1hdF9tZXNzYWdlKShjaW5mbywgZXJyb3JNZXNzYWdlKTsKKyAgICBlcnJvck1lc3NhZ2Vbc2l6ZW9mKGVycm9yTWVzc2FnZSkgLSAxXSA9ICdcMCc7CisgICAgQUxPR0UoIkpQRUcgY29tcHJlc3Npb24gZXJyb3I6ICVzIiwgZXJyb3JNZXNzYWdlKTsKKyAgICBqcGVnX2Rlc3Ryb3koY2luZm8pOworCisgICAgLy8gQW5kIHRocm91Z2ggdGhlIGxvb2tpbmcgZ2xhc3Mgd2UgZ28KKyAgICBsb25nam1wKGVycm9yTWFuYWdlci0+bUp1bXBCdWZmZXIsIDEpOworfQorCitOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjpEZXN0aW5hdGlvbk1hbmFnZXIoKSB7CisgICAgaW5pdF9kZXN0aW5hdGlvbiA9ICZpbml0RGVzdGluYXRpb247CisgICAgZW1wdHlfb3V0cHV0X2J1ZmZlciA9ICZlbXB0eU91dHB1dEJ1ZmZlcjsKKyAgICB0ZXJtX2Rlc3RpbmF0aW9uID0gJnRlcm1EZXN0aW5hdGlvbjsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjppbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIFN0YXJ0IG91dCB3aXRoIHNvbWUgYXJiaXRyYXJ5IGJ1dCBub3QgdG9vIGxhcmdlIGJ1ZmZlciBzaXplCisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUoMTYgKiAxMDI0KTsKKyAgICBtYW5hZ2VyLT5uZXh0X291dHB1dF9ieXRlID0gJm1hbmFnZXItPm1CdWZmZXJbMF07CisgICAgbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKTsKK30KKworYm9vbGVhbiBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjplbXB0eU91dHB1dEJ1ZmZlcigKKyAgICAgICAgal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIEtlZXAgZG91YmxpbmcgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgYSB2ZXJ5IGxvdywgYW1vcnRpemVkCisgICAgLy8gcGVyZm9ybWFuY2UgY29zdCBvZiB0aGUgYWxsb2NhdGlvbnMKKyAgICBzaXplX3Qgb2xkU2l6ZSA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpOworICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKG9sZFNpemUgKiAyKTsKKyAgICBtYW5hZ2VyLT5uZXh0X291dHB1dF9ieXRlID0gJm1hbmFnZXItPm1CdWZmZXJbb2xkU2l6ZV07CisgICAgbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKSAtIG9sZFNpemU7CisgICAgcmV0dXJuIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyICE9IDA7Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6dGVybURlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBSZXNpemUgZG93biB0byB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb3V0cHV0LCB0aGF0IGlzIHJlbW92ZSBhcyBtYW55CisgICAgLy8gYnl0ZXMgYXMgdGhlcmUgYXJlIGxlZnQgaW4gdGhlIGJ1ZmZlcgorICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpIC0gbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIpOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplLCBzaXplX3QgKnNpemUgLypvdXQqLykgeworICAgIGlmICgoc2l6ZSA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlciA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChjaGVja0pwZWdTdGFydChqcGVnQnVmZmVyKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gUmVhZCBKRklGIHNlZ21lbnQgbWFya2Vycywgc2tpcCBvdmVyIHNlZ21lbnQgZGF0YQorICAgICpzaXplID0ga01hcmtlckxlbmd0aDsgLy9qdW1wIHRvIFN0YXJ0IE9mIEltYWdlCisgICAgd2hpbGUgKCpzaXplIDw9IG1heFNpemUgLSBrTWFya2VyTGVuZ3RoKSB7CisgICAgICAgIHNlZ21lbnRfdCAqc2VnbWVudCA9IChzZWdtZW50X3QqKShqcGVnQnVmZmVyICsgKnNpemUpOworICAgICAgICB1aW50OF90IHR5cGUgPSBjaGVja0pwZWdNYXJrZXIoc2VnbWVudC0+bWFya2VyKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gMCkgeyAvLyBpbnZhbGlkIG1hcmtlciwgbm8gbW9yZSBzZWdtZW50cywgYmVnaW4gSlBFRyBkYXRhCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBrRW5kT2ZJbWFnZSB8fCAqc2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc2VnbWVudF90KSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW5ndGggPSBudG9ocyhzZWdtZW50LT5sZW5ndGgpOworICAgICAgICAqc2l6ZSArPSBsZW5ndGggKyBrTWFya2VyTGVuZ3RoOworICAgIH0KKworICAgIC8vIEZpbmQgRW5kIG9mIEltYWdlCisgICAgLy8gU2NhbiBKUEVHIGJ1ZmZlciB1bnRpbCBFbmQgb2YgSW1hZ2UKKyAgICBib29sIGZvdW5kRW5kID0gZmFsc2U7CisgICAgZm9yICggOyAqc2l6ZSA8PSBtYXhTaXplIC0ga01hcmtlckxlbmd0aDsgKCpzaXplKSsrKSB7CisgICAgICAgIGlmIChjaGVja0pwZWdFbmQoanBlZ0J1ZmZlciArICpzaXplKSkgeworICAgICAgICAgICAgZm91bmRFbmQgPSB0cnVlOworICAgICAgICAgICAgKnNpemUgKz0ga01hcmtlckxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZEVuZCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgqc2l6ZSA+IG1heFNpemUpIHsKKyAgICAgICAgKnNpemUgPSBtYXhTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnModWludDhfdCAqanBlZ0J1ZmZlciwKKyAgICAgICAgc2l6ZV90IGpwZWdCdWZmZXJTaXplLCBzaXplX3QgKndpZHRoIC8qb3V0Ki8sIHNpemVfdCAqaGVpZ2h0IC8qb3V0Ki8pIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKHdpZHRoID09IG51bGxwdHIpIHx8IChoZWlnaHQgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChqcGVnQnVmZmVyU2l6ZSA9PSAwdSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTY2FuIEpQRUcgYnVmZmVyIHVudGlsIFN0YXJ0IG9mIEZyYW1lCisgICAgYm9vbCBmb3VuZFNPRiA9IGZhbHNlOworICAgIHNpemVfdCBjdXJyZW50UG9zOworICAgIGZvciAoY3VycmVudFBvcyA9IDA7IGN1cnJlbnRQb3MgPD0ganBlZ0J1ZmZlclNpemUgLSBrTWFya2VyTGVuZ3RoOyBjdXJyZW50UG9zKyspIHsKKyAgICAgICAgaWYgKGNoZWNrU3RhcnRPZkZyYW1lKGpwZWdCdWZmZXIgKyBjdXJyZW50UG9zKSkgeworICAgICAgICAgICAgZm91bmRTT0YgPSB0cnVlOworICAgICAgICAgICAgY3VycmVudFBvcyArPSBrTWFya2VyTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kU09GKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RhcnQgb2YgRnJhbWUgbm90IGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNvZl90ICpzdGFydE9mRnJhbWUgPSByZWludGVycHJldF9jYXN0PHNvZl90ICo+IChqcGVnQnVmZmVyICsgY3VycmVudFBvcyk7CisgICAgKndpZHRoID0gbnRvaHMoc3RhcnRPZkZyYW1lLT53aWR0aCk7CisgICAgKmhlaWdodCA9IG50b2hzKHN0YXJ0T2ZGcmFtZS0+aGVpZ2h0KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbih1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUsCisgICAgICAgIEV4aWZPcmllbnRhdGlvbiAqZXhpZlZhbHVlIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGV4aWZWYWx1ZSA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlclNpemUgPT0gMHUpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZEYXRhPiBleGlmRGF0YShleGlmX2RhdGFfbmV3KCkpOworICAgIGV4aWZfZGF0YV9sb2FkX2RhdGEoZXhpZkRhdGEuZ2V0KCksIGpwZWdCdWZmZXIsIGpwZWdCdWZmZXJTaXplKTsKKyAgICBFeGlmRW50cnkgKm9yaWVudGF0aW9uID0gZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLAorICAgICAgICAgICAgRVhJRl9UQUdfT1JJRU5UQVRJT04pOworICAgIGlmICgob3JpZW50YXRpb24gPT0gbnVsbHB0cikgfHwgKG9yaWVudGF0aW9uLT5zaXplICE9IHNpemVvZihFeGlmU2hvcnQpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGF1dG8gb3JpZW50YXRpb25WYWx1ZSA9IGV4aWZfZ2V0X3Nob3J0KG9yaWVudGF0aW9uLT5kYXRhLAorICAgICAgICAgICAgZXhpZl9kYXRhX2dldF9ieXRlX29yZGVyKGV4aWZEYXRhLmdldCgpKSk7CisgICAgc3RhdHVzX3QgcmV0OworICAgIHN3aXRjaCAob3JpZW50YXRpb25WYWx1ZSkgeworICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICAqZXhpZlZhbHVlID0gc3RhdGljX2Nhc3Q8RXhpZk9yaWVudGF0aW9uPiAob3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIEVYSUYgb3JpZW50YXRpb24gdmFsdWU6ICV1IiwgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorI2RlZmluZSBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGplcnJvci5oPgorfQorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiLi4vdXRpbHMvRXhpZlV0aWxzLmgiCisKK3N0cnVjdCBfRXhpZkRhdGE7Cit0eXBlZGVmIF9FeGlmRGF0YSBFeGlmRGF0YTsKKworY2xhc3MgTlYxMkNvbXByZXNzb3IgeworcHVibGljOgorICAgIE5WMTJDb21wcmVzc29yKCkge30KKworICAgIC8qIENvbXByZXNzIHxkYXRhfCB3aGljaCByZXByZXNlbnRzIHJhdyBOVjIxIGVuY29kZWQgZGF0YSBvZiBkaW1lbnNpb25zCisgICAgICogfHdpZHRofCAqIHxoZWlnaHR8LgorICAgICAqLworICAgIGJvb2wgY29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSk7CisgICAgYm9vbCBjb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiBleGlmVmFsdWUpOworCisgICAgLyogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wcmVzc2VkIGRhdGEsIHRoaXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgdmVjdG9yCisgICAgICogaWYgY29tcHJlc3MgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgZ2V0Q29tcHJlc3NlZERhdGEoKSBjb25zdDsKKworICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBmaW5kSnBlZ1NpemUodWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUsCisgICAgICAgICAgICBzaXplX3QgKnNpemUgLypvdXQqLyk7CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0RXhpZk9yaWVudGF0aW9uKHVpbnQ4X3QgKmpwZWdCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QganBlZ0J1ZmZlclNpemUsIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiAqZXhpZlZhbHVlIC8qb3V0Ki8pOworCisgICAgLyogR2V0IEpwZWcgaW1hZ2UgZGltZW5zaW9ucyBmcm9tIHRoZSBmaXJzdCBTdGFydCBPZiBGcmFtZS4gUGxlYXNlIG5vdGUgdGhhdCBkdWUgdG8gdGhlCisgICAgICogd2F5IHRoZSBqcGVnIGJ1ZmZlciBpcyBzY2FubmVkIGlmIHRoZSBpbWFnZSBjb250YWlucyBhIHRodW1ibmFpbCwgdGhlbiB0aGUgc2l6ZSByZXR1cm5lZAorICAgICAqIHdpbGwgYmUgb2YgdGhlIHRodW1ibmFpbCBhbmQgbm90IHRoZSBtYWluIGltYWdlLgorICAgICAqLworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCAqd2lkdGggLypvdXQqLywgc2l6ZV90ICpoZWlnaHQgLypvdXQqLyk7CisKK3ByaXZhdGU6CisKKyAgICBzdHJ1Y3QgRGVzdGluYXRpb25NYW5hZ2VyIDoganBlZ19kZXN0aW5hdGlvbl9tZ3IgeworICAgICAgICBEZXN0aW5hdGlvbk1hbmFnZXIoKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBpbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pOworICAgICAgICBzdGF0aWMgYm9vbGVhbiBlbXB0eU91dHB1dEJ1ZmZlcihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisgICAgICAgIHN0YXRpYyB2b2lkIHRlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgc3RydWN0IEVycm9yTWFuYWdlciA6IGpwZWdfZXJyb3JfbWdyIHsKKyAgICAgICAgRXJyb3JNYW5hZ2VyKCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgb25KcGVnRXJyb3Ioal9jb21tb25fcHRyIGNpbmZvKTsKKworICAgICAgICBqbXBfYnVmIG1KdW1wQnVmZmVyOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXJrZXJMZW5ndGggPSAyOyAvLyBsZW5ndGggb2YgYSBtYXJrZXIKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrTWFya2VyID0gMHhGRjsgLy8gRmlyc3QgYnl0ZSBvZiBtYXJrZXIKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhcnRPZkltYWdlID0gMHhEODsgLy8gU3RhcnQgb2YgSW1hZ2UKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRW5kT2ZJbWFnZSA9IDB4RDk7IC8vIEVuZCBvZiBJbWFnZQorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGFydE9mRnJhbWUgPSAweEMwOyAvLyBTdGFydCBvZiBGcmFtZQorCisgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNlZ21lbnRfdCB7CisgICAgICAgIHVpbnQ4X3QgbWFya2VyW2tNYXJrZXJMZW5ndGhdOworICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgfTsKKworICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzb2ZfdCB7CisgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgdWludDhfdCBwcmVjaXNpb247CisgICAgICAgIHVpbnQxNl90IGhlaWdodDsKKyAgICAgICAgdWludDE2X3Qgd2lkdGg7CisgICAgfTsKKworICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBpbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja1N0YXJ0T2ZGcmFtZSh1aW50OF90KiBidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrU3RhcnRPZkZyYW1lOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBpbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja0pwZWdTdGFydCh1aW50OF90KiBidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrU3RhcnRPZkltYWdlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBFbmQgb2YgSW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tKcGVnRW5kKHVpbnQ4X3QgKmJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtFbmRPZkltYWdlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBhcmJpdHJhcnkgbWFya2VyLCByZXR1cm5zIG1hcmtlciB0eXBlIChzZWNvbmQgYnl0ZSkKKyAgICAvLyByZXR1cm5zIDAgaWYgbm8gbWFya2VyIGZvdW5kLiBOb3RlOiAweDAwIGlzIG5vdCBhIHZhbGlkIG1hcmtlciB0eXBlCisgICAgc3RhdGljIHVpbnQ4X3QgY2hlY2tKcGVnTWFya2VyKHVpbnQ4X3QgKmJ1ZikgeworICAgICAgICByZXR1cm4gKGJ1ZlswXSA9PSBrTWFya2VyKSA/IGJ1ZlsxXSA6IDA7CisgICAgfQorCisgICAganBlZ19jb21wcmVzc19zdHJ1Y3QgbUNvbXByZXNzSW5mbzsKKyAgICBEZXN0aW5hdGlvbk1hbmFnZXIgbURlc3RNYW5hZ2VyOworICAgIEVycm9yTWFuYWdlciBtRXJyb3JNYW5hZ2VyOworCisgICAgYm9vbCBjb25maWd1cmVDb21wcmVzc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpOworICAgIGJvb2wgY29tcHJlc3NEYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIEV4aWZEYXRhKiBleGlmRGF0YSk7CisgICAgYm9vbCBhdHRhY2hFeGlmRGF0YShFeGlmRGF0YSogZXhpZkRhdGEpOworfTsKKworI2VuZGlmICAvLyBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworfQorCitpbnQgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Cit9CisKK2ludDY0X3QgQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Cit9CisKK3ZvaWQgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbikgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTcwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIENhbWVyYVRocmVhZFN0YXRlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGludDY0X3QgY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKworICBzdGF0aWMgdm9pZCByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pOworCisgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOworCisgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOworfTsKKworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFmZGMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApAQCAtMCwwICsxLDExMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZlckV4aWZVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkV4aWZVdGlscy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtZGF0YS5oPgorfQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRW50cnk+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZFbnRyeSogZW50cnkpIGNvbnN0IHsgZXhpZl9lbnRyeV91bnJlZihlbnRyeSk7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKKworY2xhc3MgRXhpZlV0aWxzSW1wbCA6IHB1YmxpYyBFeGlmVXRpbHMgeworcHVibGljOgorICAgIEV4aWZVdGlsc0ltcGwoKTsKKworICAgIHZpcnR1YWwgfkV4aWZVdGlsc0ltcGwoKTsKKworICAgIC8vIEluaXRpYWxpemUoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUgc2V0dGluZyBvZiBFeGlmIHRhZ3Mgd2lsbCBiZQorICAgIC8vIGNsZWFyZWQuCisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpOworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplRW1wdHkoKTsKKworICAgIC8vIHNldCBhbGwga25vd24gZmllbGRzIGZyb20gYSBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpOworCisgICAgLy8gc2V0cyB0aGUgbGVuIGFwZXJ0dXJlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKTsKKworICAgIC8vIHNldHMgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpOworCisgICAgLy8gc2V0cyB0aGUgZGF0ZSBhbmQgdGltZSBvZiBpbWFnZSBsYXN0IG1vZGlmaWVkLiBJdCB0YWtlcyBsb2NhbCB0aW1lLiBUaGUKKyAgICAvLyBuYW1lIG9mIHRoZSB0YWcgaXMgRGF0ZVRpbWUgaW4gSUZEMC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpOworCisgICAgLy8gc2V0cyB0aGUgZGlnaXRhbCB6b29tIHJhdGlvLiBJZiB0aGUgbnVtZXJhdG9yIGlzIDAsIGl0IG1lYW5zIGRpZ2l0YWwgem9vbQorICAgIC8vIHdhcyBub3QgdXNlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREaWdpdGFsWm9vbVJhdGlvKAorICAgICAgICAgICAgdWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBzZW5zb3Jfd2lkdGgsIHVpbnQzMl90IHNlbnNvcl9oZWlnaHQpOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgYmlhcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKTsKKworICAgIC8vIHNldHMgdGhlIGV4cG9zdXJlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpOworCisgICAgLy8gc2V0cyB0aGUgZXhwb3N1cmUgdGltZSwgZ2l2ZW4gaW4gc2Vjb25kcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSBzdGF0dXMgb2YgZmxhc2guCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSk7CisKKyAgICAvLyBzZXRzIHRoZSBGIG51bWJlci4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKTsKKworICAgIC8vIHNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGgoZmxvYXQgZm9jYWxfbGVuZ3RoKTsKKworICAgIC8vIHNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIGZvciAzNW1tIGZpbG0gdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oZmxvYXQgZm9jYWxfbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSk7CisKKyAgICAvLyBzZXRzIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKTsKKworICAgIC8vIHNldHMgdGhlIGxhdGl0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSk7CisKKyAgICAvLyBzZXRzIHRoZSBsb25naXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpOworCisgICAgLy8gc2V0cyBHUFMgcHJvY2Vzc2luZyBtZXRob2QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKTsKKworICAgIC8vIHNldHMgR1BTIGRhdGUgc3RhbXAgYW5kIHRpbWUgc3RhbXAgKGF0b21pYyBjbG9jaykuIEl0IHRha2VzIFVUQyB0aW1lLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpOworCisgICAgLy8gc2V0cyB0aGUgbGVuZ3RoIChudW1iZXIgb2Ygcm93cykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpOworCisgICAgLy8gc2V0cyB0aGUgd2lkdGggKG51bWJlciBvZiBjb2x1bWVzKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpOworCisgICAgLy8gc2V0cyB0aGUgSVNPIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKTsKKworICAgIC8vIHNldHMgdGhlIHNtYWxsZXN0IEYgbnVtYmVyIG9mIHRoZSBsZW5zLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKTsKKworICAgIC8vIHNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcyk7CisKKyAgICAvLyBzZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpOworCisgICAgLy8gc2V0cyB0aGUgc2h1dHRlciBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSBkaXN0YW5jZSB0byB0aGUgc3ViamVjdCwgZ2l2ZW4gaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycyk7CisKKyAgICAvLyBzZXRzIHRoZSBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBmb3IgdGhlIDxEYXRlVGltZT4gdGFnLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKTsKKworICAgIC8vIHNldHMgdGhlIHdoaXRlIGJhbGFuY2UgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmFsYW5jZSk7CisKKyAgICAvLyBHZW5lcmF0ZXMgQVBQMSBzZWdtZW50LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZ2VuZXJhdGluZyBBUFAxIHNlZ21lbnQgZmFpbHMuCisgICAgdmlydHVhbCBib29sIGdlbmVyYXRlQXBwMSgpOworCisgICAgLy8gR2V0cyBidWZmZXIgb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGdldEFwcDFCdWZmZXIoKTsKKworICAgIC8vIEdldHMgbGVuZ3RoIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0QXBwMUxlbmd0aCgpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBzZXRzIHRoZSB2ZXJzaW9uIG9mIHRoaXMgc3RhbmRhcmQgc3VwcG9ydGVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4aWZWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGlmX3ZlcnNpb24pOworCisgICAgLy8gUmVzZXRzIHRoZSBwb2ludGVycyBhbmQgbWVtb3JpZXMuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBBZGRzIGEgdmFyaWFibGUgbGVuZ3RoIHRhZyB0byB8ZXhpZl9kYXRhX3wuIEl0IHdpbGwgcmVtb3ZlIHRoZSBvcmlnaW5hbCBvbmUKKyAgICAvLyBpZiB0aGUgdGFnIGV4aXN0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBlbnRyeSBvZiB0aGUgdGFnLiBUaGUgcmVmZXJlbmNlIGNvdW50IG9mIHJldHVybmVkIEV4aWZFbnRyeSBpcworICAgIC8vIHR3by4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRXhpZklmZCBpZmQsCisgICAgICAgICAgICBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsIHVpbnQ2NF90IGNvbXBvbmVudHMsIHVuc2lnbmVkIGludCBzaXplKTsKKworICAgIC8vIEFkZHMgYSBlbnRyeSBvZiB8dGFnfCBpbiB8ZXhpZl9kYXRhX3wuIEl0IHdvbid0IHJlbW92ZSB0aGUgb3JpZ2luYWwgb25lIGlmCisgICAgLy8gdGhlIHRhZyBleGlzdHMuCisgICAgLy8gUmV0dXJucyB0aGUgZW50cnkgb2YgdGhlIHRhZy4gSXQgYWRkcyBvbmUgcmVmZXJlbmNlIGNvdW50IHRvIHJldHVybmVkCisgICAgLy8gRXhpZkVudHJ5LgorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gYWRkRW50cnkoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnKTsKKworICAgIC8vIEhlbHBlIGZ1bmN0aW9ucyB0byBhZGQgZXhpZiBkYXRhIHdpdGggZGlmZmVyZW50IHR5cGVzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaG9ydChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQxNl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRMb25nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFJhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICAgICAgdWludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFNSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIGludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICAgICAgaW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyaW5nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIGZsb2F0IGNvbnZlcnRUb0FwZXgoZmxvYXQgdmFsKSB7CisgICAgICAgIHJldHVybiAyLjBmICogbG9nMmYodmFsKTsKKyAgICB9CisKKyAgICAvLyBEZXN0cm95cyB0aGUgYnVmZmVyIG9mIEFQUDEgc2VnbWVudCBpZiBleGlzdHMuCisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lBcHAxKCk7CisKKyAgICAvLyBUaGUgRXhpZiBkYXRhIChBUFAxKS4gT3duZWQgYnkgdGhpcyBjbGFzcy4KKyAgICBFeGlmRGF0YSogZXhpZl9kYXRhXzsKKyAgICAvLyBUaGUgcmF3IGRhdGEgb2YgQVBQMSBzZWdtZW50LiBJdCdzIGFsbG9jYXRlZCBieSBFeGlmTWVtIGluIHxleGlmX2RhdGFffCBidXQKKyAgICAvLyBvd25lZCBieSB0aGlzIGNsYXNzLgorICAgIHVpbnQ4X3QqIGFwcDFfYnVmZmVyXzsKKyAgICAvLyBUaGUgbGVuZ3RoIG9mIHxhcHAxX2J1ZmZlcl98LgorICAgIHVuc2lnbmVkIGludCBhcHAxX2xlbmd0aF87CisKKyAgICAvLyBIb3cgcHJlY2lzZSB0aGUgZmxvYXQtdG8tcmF0aW9uYWwgY29udmVyc2lvbiBmb3IgRVhJRiB0YWdzIHdvdWxkIGJlLgorICAgIGNvbnN0IHN0YXRpYyBpbnQga1JhdGlvbmFsUHJlY2lzaW9uID0gMTAwMDA7Cit9OworCisjZGVmaW5lIFNFVF9TSE9SVChpZmQsIHRhZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0U2hvcnQoaWZkLCB0YWcsIHZhbHVlLCAjdGFnKSA9PSBmYWxzZSkgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfTE9ORyhpZmQsIHRhZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldExvbmcoaWZkLCB0YWcsIHZhbHVlLCAjdGFnKSA9PSBmYWxzZSkgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1JBVElPTkFMKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0UmF0aW9uYWwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IsICN0YWcpID09IGZhbHNlKSAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1NSQVRJT05BTChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvcikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFNSYXRpb25hbChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgI3RhZykgPT0gZmFsc2UpICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfU1RSSU5HKGlmZCwgdGFnLCBmb3JtYXQsIGJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0U3RyaW5nKGlmZCwgdGFnLCBmb3JtYXQsIGJ1ZmZlciwgI3RhZykgPT0gZmFsc2UpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisvLyBUaGlzIGNvbWVzIGZyb20gdGhlIEV4aWYgVmVyc2lvbiAyLjIgc3RhbmRhcmQgdGFibGUgNi4KK2NvbnN0IGNoYXIgZ0V4aWZBc2NpaVByZWZpeFtdID0gezB4NDEsIDB4NTMsIDB4NDMsIDB4NDksIDB4NDksIDB4MCwgMHgwLCAweDB9OworCitzdGF0aWMgdm9pZCBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YSh1bnNpZ25lZCBjaGFyKiBkYXRhLCBkb3VibGUgbnVtKSB7CisgICAgLy8gVGFrZSB0aGUgaW50ZWdlciBwYXJ0IG9mIHxudW18LgorICAgIEV4aWZMb25nIGRlZ3JlZXMgPSBzdGF0aWNfY2FzdDxFeGlmTG9uZz4obnVtKTsKKyAgICBFeGlmTG9uZyBtaW51dGVzID0gc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KDYwICogKG51bSAtIGRlZ3JlZXMpKTsKKyAgICBFeGlmTG9uZyBtaWNyb3NlY29uZHMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KDM2MDAwMDAwMDB1ICogKG51bSAtIGRlZ3JlZXMgLSBtaW51dGVzIC8gNjAuMCkpOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge2RlZ3JlZXMsIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhICsgc2l6ZW9mKEV4aWZSYXRpb25hbCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge21pbnV0ZXMsIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhICsgMiAqIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7bWljcm9zZWNvbmRzLCAxMDAwMDAwfSk7Cit9CisKK0V4aWZVdGlscyAqRXhpZlV0aWxzOjpjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBFeGlmVXRpbHNJbXBsKCk7Cit9CisKK0V4aWZVdGlsczo6fkV4aWZVdGlscygpIHsKK30KKworRXhpZlV0aWxzSW1wbDo6RXhpZlV0aWxzSW1wbCgpCisgICAgICAgIDogZXhpZl9kYXRhXyhudWxscHRyKSwgYXBwMV9idWZmZXJfKG51bGxwdHIpLCBhcHAxX2xlbmd0aF8oMCkge30KKworRXhpZlV0aWxzSW1wbDo6fkV4aWZVdGlsc0ltcGwoKSB7CisgICAgcmVzZXQoKTsKK30KKworCitib29sIEV4aWZVdGlsc0ltcGw6OmluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpIHsKKyAgICByZXNldCgpOworICAgIGV4aWZfZGF0YV8gPSBleGlmX2RhdGFfbmV3X2Zyb21fZGF0YShhcHAxU2VnbWVudCwgYXBwMVNlZ21lbnRTaXplKTsKKyAgICBpZiAoZXhpZl9kYXRhXyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogYWxsb2NhdGUgbWVtb3J5IGZvciBleGlmX2RhdGFfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2V0IHRoZSBpbWFnZSBvcHRpb25zLgorICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmX2RhdGFfLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworCisgICAgLy8gc2V0IGV4aWYgdmVyc2lvbiB0byAyLjIuCisgICAgaWYgKCFzZXRFeGlmVmVyc2lvbigiMDIyMCIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjppbml0aWFsaXplRW1wdHkoKSB7CisgICAgcmVzZXQoKTsKKyAgICBleGlmX2RhdGFfID0gZXhpZl9kYXRhX25ldygpOworICAgIGlmIChleGlmX2RhdGFfID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWZfZGF0YV8gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzZXQgdGhlIGltYWdlIG9wdGlvbnMuCisgICAgZXhpZl9kYXRhX3NldF9vcHRpb24oZXhpZl9kYXRhXywgRVhJRl9EQVRBX09QVElPTl9GT0xMT1dfU1BFQ0lGSUNBVElPTik7CisgICAgZXhpZl9kYXRhX3NldF9kYXRhX3R5cGUoZXhpZl9kYXRhXywgRVhJRl9EQVRBX1RZUEVfQ09NUFJFU1NFRCk7CisgICAgZXhpZl9kYXRhX3NldF9ieXRlX29yZGVyKGV4aWZfZGF0YV8sIEVYSUZfQllURV9PUkRFUl9JTlRFTCk7CisKKyAgICAvLyBzZXQgZXhpZiB2ZXJzaW9uIHRvIDIuMi4KKyAgICBpZiAoIXNldEV4aWZWZXJzaW9uKCIwMjIwIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSB7CisgICAgZmxvYXQgYXBleFZhbHVlID0gY29udmVydFRvQXBleChhcGVydHVyZSk7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0FQRVJUVVJFX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoYXBleFZhbHVlICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfQ09MT1JfU1BBQ0UsIGNvbG9yX3NwYWNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpIHsKKyAgICAvLyBUaGUgbGVuZ3RoIGlzIDIwIGJ5dGVzIGluY2x1ZGluZyBOVUxMIGZvciB0ZXJtaW5hdGlvbiBpbiBFeGlmIHN0YW5kYXJkLgorICAgIGNoYXIgc3RyWzIwXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiUwNGk6JTAyaTolMDJpICUwMmk6JTAyaTolMDJpIiwKKyAgICAgICAgICAgIHQudG1feWVhciArIDE5MDAsIHQudG1fbW9uICsgMSwgdC50bV9tZGF5LCB0LnRtX2hvdXIsIHQudG1fbWluLCB0LnRtX3NlYyk7CisgICAgaWYgKHJlc3VsdCAhPSBzaXplb2Yoc3RyKSAtIDEpIHsKKyAgICAgICAgQUxPR1coIiVzOiBJbnB1dCB0aW1lIGlzIGludmFsaWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihzdHIpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfREFURV9USU1FLCBFWElGX0ZPUk1BVF9BU0NJSSwgYnVmZmVyKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0RBVEVfVElNRV9PUklHSU5BTCwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19EQVRFX1RJTUVfRElHSVRJWkVELCBFWElGX0ZPUk1BVF9BU0NJSSwgYnVmZmVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXREaWdpdGFsWm9vbVJhdGlvKAorICAgICAgICB1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KSB7CisgICAgZmxvYXQgem9vbVJhdGlvWCA9IChjcm9wX3dpZHRoID09IDApID8gMS4wIDogMS4wICogc2Vuc29yX3dpZHRoIC8gY3JvcF93aWR0aDsKKyAgICBmbG9hdCB6b29tUmF0aW9ZID0gKGNyb3BfaGVpZ2h0ID09IDApID8gMS4wIDogMS4wICogc2Vuc29yX2hlaWdodCAvIGNyb3BfaGVpZ2h0OworICAgIGZsb2F0IHpvb21SYXRpbyA9IHN0ZDo6bWF4KHpvb21SYXRpb1gsIHpvb21SYXRpb1kpOworICAgIGNvbnN0IHN0YXRpYyBmbG9hdCBub1pvb21UaHJlc2hvbGQgPSAxLjAyZjsKKworICAgIGlmICh6b29tUmF0aW8gPD0gbm9ab29tVGhyZXNob2xkKSB7CisgICAgICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19ESUdJVEFMX1pPT01fUkFUSU8sIDAsIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19ESUdJVEFMX1pPT01fUkFUSU8sCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoem9vbVJhdGlvICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVNb2RlKHVpbnQ4X3QgZXhwb3N1cmVfbW9kZSkgeworICAgIHVpbnQxNl90IGV4cG9zdXJlTW9kZSA9IChleHBvc3VyZV9tb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRikgPyAxIDogMDsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfTU9ERSwgZXhwb3N1cmVNb2RlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSkgeworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWFBPU1VSRV9USU1FLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZXhwb3N1cmVfdGltZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGbGFzaCh1aW50OF90IGZsYXNoX2F2YWlsYWJsZSwgdWludDhfdCBmbGFzaF9zdGF0ZSwgdWludDhfdCBhZV9tb2RlKSB7CisgICAgLy8gRVhJRl9UQUdfRkxBU0ggYml0cyBsYXlvdXQgcGVyIEVYSUYgc3RhbmRhcmQ6CisgICAgLy8gQml0IDA6ICAgIDAgLSBkaWQgbm90IGZpcmUKKyAgICAvLyAgICAgICAgICAgMSAtIGZpcmVkCisgICAgLy8gQml0IDEtMjogIHN0YXR1cyBvZiByZXR1cm4gbGlnaHQKKyAgICAvLyBCaXQgMy00OiAgMCAtIHVua25vd24KKyAgICAvLyAgICAgICAgICAgMSAtIGNvbXB1bHNvcnkgZmxhc2ggZmlyaW5nCisgICAgLy8gICAgICAgICAgIDIgLSBjb21wdWxzb3J5IGZsYXNoIHN1cHByZXNzaW9uCisgICAgLy8gICAgICAgICAgIDMgLSBhdXRvIG1vZGUKKyAgICAvLyBCaXQgNTogICAgMCAtIGZsYXNoIGZ1bmN0aW9uIHByZXNlbnQKKyAgICAvLyAgICAgICAgICAgMSAtIG5vIGZsYXNoIGZ1bmN0aW9uCisgICAgLy8gQml0IDY6ICAgIDAgLSBubyByZWQtZXllIHJlZHVjdGlvbiBtb2RlIG9yIHVua25vd24KKyAgICAvLyAgICAgICAgICAgMSAtIHJlZC1leWUgcmVkdWN0aW9uIHN1cHBvcnRlZAorICAgIHVpbnQxNl90IGZsYXNoID0gMHgyMDsKKworICAgIGlmIChmbGFzaF9hdmFpbGFibGUgPT0gQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRV9UUlVFKSB7CisgICAgICAgIGZsYXNoID0gMHgwMDsKKworICAgICAgICBpZiAoZmxhc2hfc3RhdGUgPT0gQU5EUk9JRF9GTEFTSF9TVEFURV9GSVJFRCkgeworICAgICAgICAgICAgZmxhc2ggfD0gMHgxOworICAgICAgICB9CisgICAgICAgIGlmIChhZV9tb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0hfUkVERVlFKSB7CisgICAgICAgICAgICBmbGFzaCB8PSAweDQwOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZmxhc2hNb2RlID0gMDsKKyAgICAgICAgc3dpdGNoIChhZV9tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0g6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0hfUkVERVlFOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMzsgLy8gQVVUTworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FMV0FZU19GTEFTSDoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fRVhURVJOQUxfRkxBU0g6CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAxOyAvLyBPTgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT046CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAyOyAvLyBPRkYKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDA7IC8vIFVOS05PV04KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYXNoIHw9IChmbGFzaE1vZGUgPDwgMyk7CisgICAgfQorICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GTEFTSCwgZmxhc2gpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZOdW1iZXIoZmxvYXQgZl9udW1iZXIpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk5VTUJFUiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZfbnVtYmVyICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCkgeworICAgIHVpbnQzMl90IG51bWVyYXRvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZvY2FsX2xlbmd0aCAqIGtSYXRpb25hbFByZWNpc2lvbikpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GT0NBTF9MRU5HVEgsIG51bWVyYXRvciwga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oCisgICAgICAgIGZsb2F0IGZvY2FsX2xlbmd0aCwgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBmaWxtRGlhZ29uYWwgPSA0My4yNzsgLy8gZGlhZ29uYWwgb2YgMzVtbSBmaWxtCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pblNlbnNvckRpYWdvbmFsID0gMC4wMTsKKyAgICBmbG9hdCBzZW5zb3JEaWFnb25hbCA9IHN0ZDo6c3FydCgKKyAgICAgICAgICAgIHNlbnNvcl9zaXplX3ggKiBzZW5zb3Jfc2l6ZV94ICsgc2Vuc29yX3NpemVfeSAqIHNlbnNvcl9zaXplX3kpOworICAgIHNlbnNvckRpYWdvbmFsID0gc3RkOjptYXgoc2Vuc29yRGlhZ29uYWwsIG1pblNlbnNvckRpYWdvbmFsKTsKKyAgICBmbG9hdCBmb2NhbExlbmd0aDM1bW1GaWxtID0gc3RkOjpyb3VuZChmb2NhbF9sZW5ndGggKiBmaWxtRGlhZ29uYWwgLyBzZW5zb3JEaWFnb25hbCk7CisgICAgZm9jYWxMZW5ndGgzNW1tRmlsbSA9IHN0ZDo6bWluKDEuMGYgKiA2NTUzNSwgZm9jYWxMZW5ndGgzNW1tRmlsbSk7CisKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk9DQUxfTEVOR1RIX0lOXzM1TU1fRklMTSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihmb2NhbExlbmd0aDM1bW1GaWxtKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKSB7CisgICAgRXhpZlRhZyByZWZUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfQUxUSVRVREVfUkVGKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiByZWZFbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgcmVmVGFnLCBFWElGX0ZPUk1BVF9CWVRFLCAxLCAxKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0FsdGl0dWRlUmVmIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYWx0aXR1ZGUgPj0gMCkgeworICAgICAgICAqcmVmRW50cnktPmRhdGEgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWZFbnRyeS0+ZGF0YSA9IDE7CisgICAgICAgIGFsdGl0dWRlICo9IC0xOworICAgIH0KKworICAgIEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0FMVElUVURFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoCisgICAgICAgICAgICBFWElGX0lGRF9HUFMsIHRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDEsIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTQWx0aXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KGFsdGl0dWRlICogMTAwMCksIDEwMDB9KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSkgeworICAgIGNvbnN0IEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xBVElUVURFX1JFRik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gcmVmRW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHJlZlRhZywgRVhJRl9GT1JNQVRfQVNDSUksIDIsIDIpOworICAgIGlmICghcmVmRW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTGF0aXR1ZGVSZWYgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsYXRpdHVkZSA+PSAwKSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIk4iLCBzaXplb2YoIk4iKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiUyIsIHNpemVvZigiUyIpKTsKKyAgICAgICAgbGF0aXR1ZGUgKj0gLTE7CisgICAgfQorCisgICAgY29uc3QgRXhpZlRhZyB0YWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfTEFUSVRVREUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeSgKKyAgICAgICAgICAgIEVYSUZfSUZEX0dQUywgdGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywgMyAqIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTGF0aXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNldExhdGl0dWRlT3JMb25naXR1ZGVEYXRhKGVudHJ5LT5kYXRhLCBsYXRpdHVkZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNMb25naXR1ZGUoZG91YmxlIGxvbmdpdHVkZSkgeworICAgIEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xPTkdJVFVERV9SRUYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IHJlZkVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCByZWZUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCAyLCAyKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xvbmdpdHVkZVJlZiBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxvbmdpdHVkZSA+PSAwKSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIkUiLCBzaXplb2YoIkUiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiVyIsIHNpemVvZigiVyIpKTsKKyAgICAgICAgbG9uZ2l0dWRlICo9IC0xOworICAgIH0KKworICAgIEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xPTkdJVFVERSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KAorICAgICAgICAgICAgRVhJRl9JRkRfR1BTLCB0YWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAzLCAzICogc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbRVhJRl9JRkRfR1BTXSwgcmVmRW50cnkuZ2V0KCkpOworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMb25naXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNldExhdGl0dWRlT3JMb25naXR1ZGVEYXRhKGVudHJ5LT5kYXRhLCBsb25naXR1ZGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKSB7CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGdFeGlmQXNjaWlQcmVmaXgsIHNpemVvZihnRXhpZkFzY2lpUHJlZml4KSkgKyBtZXRob2Q7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9HUFMsIHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19QUk9DRVNTSU5HX01FVEhPRCksCisgICAgICAgICAgICBFWElGX0ZPUk1BVF9VTkRFRklORUQsIGJ1ZmZlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCkgeworICAgIGNvbnN0IEV4aWZUYWcgZGF0ZVRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19EQVRFX1NUQU1QKTsKKyAgICBjb25zdCBzaXplX3Qga0dwc0RhdGVTdGFtcFNpemUgPSAxMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLAorICAgICAgICAgICAgZGF0ZVRhZywgRVhJRl9GT1JNQVRfQVNDSUksIGtHcHNEYXRlU3RhbXBTaXplLCBrR3BzRGF0ZVN0YW1wU2l6ZSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNEYXRlU3RhbXAgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihyZWludGVycHJldF9jYXN0PGNoYXIqPihlbnRyeS0+ZGF0YSksIGtHcHNEYXRlU3RhbXBTaXplLAorICAgICAgICAgICAgIiUwNGk6JTAyaTolMDJpIiwgdC50bV95ZWFyICsgMTkwMCwgdC50bV9tb24gKyAxLCB0LnRtX21kYXkpOworICAgIGlmIChyZXN1bHQgIT0ga0dwc0RhdGVTdGFtcFNpemUgLSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogSW5wdXQgdGltZSBpcyBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEV4aWZUYWcgdGltZVRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19USU1FX1NUQU1QKTsKKyAgICBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCB0aW1lVGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywKKyAgICAgICAgICAgIDMgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNUaW1lU3RhbXAgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1faG91ciksIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSArIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1fbWluKSwgMX0pOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhICsgMiAqIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1fc2VjKSwgMX0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKSB7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfSU1BR0VfTEVOR1RILCBsZW5ndGgpOworICAgIFNFVF9MT05HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1BJWEVMX1lfRElNRU5TSU9OLCBsZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpIHsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF8wLCBFWElGX1RBR19JTUFHRV9XSURUSCwgd2lkdGgpOworICAgIFNFVF9MT05HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1BJWEVMX1hfRElNRU5TSU9OLCB3aWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfSVNPX1NQRUVEX1JBVElOR1MsIGlzb19zcGVlZF9yYXRpbmdzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgeworICAgIGZsb2F0IG1heEFwZXJ0dXJlID0gY29udmVydFRvQXBleChhcGVydHVyZSk7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX01BWF9BUEVSVFVSRV9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKG1heEFwZXJ0dXJlICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4cG9zdXJlQmlhcyhpbnQzMl90IGV2LAorICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcikgeworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWFBPU1VSRV9CSUFTX1ZBTFVFLAorICAgICAgICAgICAgZXYgKiBldl9zdGVwX251bWVyYXRvciwgZXZfc3RlcF9kZW5vbWluYXRvcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcykgeworICAgIEV4aWZPcmllbnRhdGlvbiB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIHN3aXRjaCAoZGVncmVlcykgeworICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc2V0T3JpZW50YXRpb25WYWx1ZSh2YWx1ZSk7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSkgeworICAgIFNFVF9TSE9SVChFWElGX0lGRF8wLCBFWElGX1RBR19PUklFTlRBVElPTiwgb3JpZW50YXRpb25WYWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpIHsKKyAgICBmbG9hdCBzaHV0dGVyU3BlZWQgPSAtbG9nMmYoZXhwb3N1cmVfdGltZSk7CisgICAgU0VUX1NSQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TSFVUVEVSX1NQRUVEX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNodXR0ZXJTcGVlZCAqIGtSYXRpb25hbFByZWNpc2lvbiksIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3ViamVjdERpc3RhbmNlKGZsb2F0IGRpb3B0ZXJzKSB7CisgICAgY29uc3Qgc3RhdGljIGZsb2F0IGtJbmZpbml0eURpb3B0ZXJzID0gMS4wZS02OworICAgIHVpbnQzMl90IG51bWVyYXRvciwgZGVub21pbmF0b3I7CisgICAgdWludDE2X3QgZGlzdGFuY2VSYW5nZTsKKyAgICBpZiAoZGlvcHRlcnMgPiBrSW5maW5pdHlEaW9wdGVycykgeworICAgICAgICBmbG9hdCBmb2N1c0Rpc3RhbmNlID0gMS4wZiAvIGRpb3B0ZXJzOworICAgICAgICBudW1lcmF0b3IgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmb2N1c0Rpc3RhbmNlICoga1JhdGlvbmFsUHJlY2lzaW9uKSk7CisgICAgICAgIGRlbm9taW5hdG9yID0ga1JhdGlvbmFsUHJlY2lzaW9uOworCisgICAgICAgIGlmIChmb2N1c0Rpc3RhbmNlIDwgMS4wZikgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDE7IC8vIE1hY3JvCisgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNEaXN0YW5jZSA8IDMuMGYpIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAyOyAvLyBDbG9zZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDM7IC8vIERpc3RhbnQKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG51bWVyYXRvciA9IDB4RkZGRkZGRkY7CisgICAgICAgIGRlbm9taW5hdG9yID0gMTsKKyAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDM7IC8vIERpc3RhbnQKKyAgICB9CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQkpFQ1RfRElTVEFOQ0UsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJKRUNUX0RJU1RBTkNFX1JBTkdFLCBkaXN0YW5jZVJhbmdlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSkgeworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FLCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FX09SSUdJTkFMLCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FX0RJR0lUSVpFRCwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRXaGl0ZUJhbGFuY2UodWludDhfdCB3aGl0ZV9iYWxhbmNlKSB7CisgICAgdWludDE2X3Qgd2hpdGVCYWxhbmNlID0gKHdoaXRlX2JhbGFuY2UgPT0gQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFX0FVVE8pID8gMCA6IDE7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1dISVRFX0JBTEFOQ0UsIHdoaXRlQmFsYW5jZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6Z2VuZXJhdGVBcHAxKCkgeworICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgLy8gU2F2ZSB0aGUgcmVzdWx0IGludG8gfGFwcDFfYnVmZmVyX3wuCisgICAgZXhpZl9kYXRhX3NhdmVfZGF0YShleGlmX2RhdGFfLCAmYXBwMV9idWZmZXJfLCAmYXBwMV9sZW5ndGhfKTsKKyAgICBpZiAoIWFwcDFfbGVuZ3RoXykgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYXBwMV9idWZmZXJfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBUaGUgSlBFRyBzZWdtZW50IHNpemUgaXMgMTYgYml0cyBpbiBzcGVjLiBUaGUgc2l6ZSBvZiBBUFAxIHNlZ21lbnQgc2hvdWxkCisgICAgICogYmUgc21hbGxlciB0aGFuIDY1NTMzIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBieXRlcyBmb3Igc2VnbWVudCBzaXplIGZpZWxkLgorICAgICAqLworICAgIGlmIChhcHAxX2xlbmd0aF8gPiA2NTUzMykgeworICAgICAgICBkZXN0cm95QXBwMSgpOworICAgICAgICBBTE9HRSgiJXM6IFRoZSBzaXplIG9mIEFQUDEgc2VnbWVudCBpcyB0b28gbGFyZ2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitjb25zdCB1aW50OF90KiBFeGlmVXRpbHNJbXBsOjpnZXRBcHAxQnVmZmVyKCkgeworICAgIHJldHVybiBhcHAxX2J1ZmZlcl87Cit9CisKK3Vuc2lnbmVkIGludCBFeGlmVXRpbHNJbXBsOjpnZXRBcHAxTGVuZ3RoKCkgeworICAgIHJldHVybiBhcHAxX2xlbmd0aF87Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhpZlZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV4aWZfdmVyc2lvbikgeworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhJRl9WRVJTSU9OLCBFWElGX0ZPUk1BVF9VTkRFRklORUQsIGV4aWZfdmVyc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXhpZlV0aWxzSW1wbDo6cmVzZXQoKSB7CisgICAgZGVzdHJveUFwcDEoKTsKKyAgICBpZiAoZXhpZl9kYXRhXykgeworICAgICAgICAvKgorICAgICAgICAgKiBTaW5jZSB3ZSBkZWNpZGVkIHRvIGlnbm9yZSB0aGUgb3JpZ2luYWwgQVBQMSwgd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcworICAgICAgICAgKiBubyB0aHVtYm5haWwgYWxsb2NhdGVkIGJ5IGxpYmV4aWYuIHxleGlmX2RhdGFfLT5kYXRhfCBpcyBhY3R1YWxseQorICAgICAgICAgKiBhbGxvY2F0ZWQgYnkgSnBlZ0NvbXByZXNzb3IuIHNldHMgfGV4aWZfZGF0YV8tPmRhdGF8IHRvIG51bGxwdHIgdG8KKyAgICAgICAgICogcHJldmVudCBleGlmX2RhdGFfdW5yZWYoKSBkZXN0cm95IGl0IGluY29ycmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZXhpZl9kYXRhXy0+ZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGV4aWZfZGF0YV8tPnNpemUgPSAwOworICAgICAgICBleGlmX2RhdGFfdW5yZWYoZXhpZl9kYXRhXyk7CisgICAgICAgIGV4aWZfZGF0YV8gPSBudWxscHRyOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gRXhpZlV0aWxzSW1wbDo6YWRkVmFyaWFibGVMZW5ndGhFbnRyeShFeGlmSWZkIGlmZCwKKyAgICAgICAgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LCB1aW50NjRfdCBjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgc2l6ZSkgeworICAgIC8vIFJlbW92ZSBvbGQgZW50cnkgaWYgZXhpc3RzLgorICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sCisgICAgICAgICAgICBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCB0YWcpKTsKKyAgICBFeGlmTWVtKiBtZW0gPSBleGlmX21lbV9uZXdfZGVmYXVsdCgpOworICAgIGlmICghbWVtKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeShleGlmX2VudHJ5X25ld19tZW0obWVtKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX21lbV91bnJlZihtZW0pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgdm9pZCogdG1wQnVmZmVyID0gZXhpZl9tZW1fYWxsb2MobWVtLCBzaXplKTsKKyAgICBpZiAoIXRtcEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX21lbV91bnJlZihtZW0pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBlbnRyeS0+ZGF0YSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPih0bXBCdWZmZXIpOworICAgIGVudHJ5LT50YWcgPSB0YWc7CisgICAgZW50cnktPmZvcm1hdCA9IGZvcm1hdDsKKyAgICBlbnRyeS0+Y29tcG9uZW50cyA9IGNvbXBvbmVudHM7CisgICAgZW50cnktPnNpemUgPSBzaXplOworCisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgZW50cnkuZ2V0KCkpOworICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IEV4aWZVdGlsc0ltcGw6OmFkZEVudHJ5KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5KGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIHRhZykpOworICAgIGlmIChlbnRyeSkgeworICAgICAgICAvLyBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KCkgd29uJ3QgcmVmIHRoZSBlbnRyeSwgc28gd2UgcmVmIGhlcmUuCisgICAgICAgIGV4aWZfZW50cnlfcmVmKGVudHJ5LmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKyAgICBlbnRyeS5yZXNldChleGlmX2VudHJ5X25ldygpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBlbnRyeS0+dGFnID0gdGFnOworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIGVudHJ5LmdldCgpKTsKKyAgICBleGlmX2VudHJ5X2luaXRpYWxpemUoZW50cnkuZ2V0KCksIHRhZyk7CisgICAgcmV0dXJuIGVudHJ5OworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNob3J0KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDE2X3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfc2hvcnQoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldExvbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9sb25nKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgdWludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge251bWVyYXRvciwgZGVub21pbmF0b3J9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTUmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgaW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9zcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge251bWVyYXRvciwgZGVub21pbmF0b3J9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdHJpbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHNpemVfdCBlbnRyeV9zaXplID0gYnVmZmVyLmxlbmd0aCgpOworICAgIC8vIFNpbmNlIHRoZSBleGlmIGZvcm1hdCBpcyB1bmRlZmluZWQsIE5VTEwgdGVybWluYXRpb24gaXMgbm90IG5lY2Vzc2FyeS4KKyAgICBpZiAoZm9ybWF0ID09IEVYSUZfRk9STUFUX0FTQ0lJKSB7CisgICAgICAgIGVudHJ5X3NpemUrKzsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShpZmQsIHRhZywgZm9ybWF0LCBlbnRyeV9zaXplLCBlbnRyeV9zaXplKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KGVudHJ5LT5kYXRhLCBidWZmZXIuY19zdHIoKSwgZW50cnlfc2l6ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXhpZlV0aWxzSW1wbDo6ZGVzdHJveUFwcDEoKSB7CisgICAgLyoKKyAgICAgKiBTaW5jZSB0aGVyZSBpcyBubyBBUEkgdG8gYWNjZXNzIEV4aWZNZW0gaW4gRXhpZkRhdGEtPnByaXYsIHdlIHVzZSBmcmVlCisgICAgICogaGVyZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZnJlZSBmdW5jdGlvbiBpbiBsaWJleGlmLiBTZWUKKyAgICAgKiBleGlmX2RhdGFfc2F2ZV9kYXRhKCkgZm9yIGRldGFpbC4KKyAgICAgKi8KKyAgICBmcmVlKGFwcDFfYnVmZmVyXyk7CisgICAgYXBwMV9idWZmZXJfID0gbnVsbHB0cjsKKyAgICBhcHAxX2xlbmd0aF8gPSAwOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VXaWR0aCwgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KSB7CisgICAgaWYgKCFzZXRJbWFnZVdpZHRoKGltYWdlV2lkdGgpIHx8CisgICAgICAgICAgICAhc2V0SW1hZ2VIZWlnaHQoaW1hZ2VIZWlnaHQpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBpbWFnZSByZXNvbHV0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IHRpbWVzcGVjIHRwOworICAgIHN0cnVjdCB0bSB0aW1lX2luZm87CisgICAgYm9vbCB0aW1lX2F2YWlsYWJsZSA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cCkgIT0gLTE7CisgICAgbG9jYWx0aW1lX3IoJnRwLnR2X3NlYywgJnRpbWVfaW5mbyk7CisgICAgaWYgKCFzZXREYXRlVGltZSh0aW1lX2luZm8pKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBkYXRhIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmbG9hdCBmb2NhbF9sZW5ndGg7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfRk9DQUxfTEVOR1RIKTsKKyAgICBpZiAoZW50cnkuY291bnQpIHsKKyAgICAgICAgZm9jYWxfbGVuZ3RoID0gZW50cnkuZGF0YS5mWzBdOworCisgICAgICAgIGlmICghc2V0Rm9jYWxMZW5ndGgoZm9jYWxfbGVuZ3RoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZvY2FsIGxlbmd0aCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzZW5zb3JTaXplRW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUpOworICAgICAgICBpZiAoc2Vuc29yU2l6ZUVudHJ5LmNvdW50ID09IDIpIHsKKyAgICAgICAgICAgIGlmICghc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKAorICAgICAgICAgICAgICAgICAgICBmb2NhbF9sZW5ndGgsIHNlbnNvclNpemVFbnRyeS5kYXRhLmZbMF0sIHNlbnNvclNpemVFbnRyeS5kYXRhLmZbMV0pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZvY2FsIGxlbmd0aCBpbiAzNW1tIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCIlczogQ2Fubm90IGZpbmQgZm9jYWwgbGVuZ3RoIGluIG1ldGFkYXRhLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTikgJiYKKyAgICAgICAgICAgIHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhY3RpdmVBcnJheUVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CisKKyAgICAgICAgaWYgKCFzZXREaWdpdGFsWm9vbVJhdGlvKGVudHJ5LmRhdGEuaTMyWzJdLCBlbnRyeS5kYXRhLmkzMlszXSwKKyAgICAgICAgICAgICAgICBhY3RpdmVBcnJheUVudHJ5LmRhdGEuaTMyWzJdLCBhY3RpdmVBcnJheUVudHJ5LmRhdGEuaTMyWzNdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGRpZ2l0YWwgem9vbSByYXRpbyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUykpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPCAzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEdwcyBjb29yZGluYXRlcyBpbiBtZXRhZGF0YSBpcyBub3QgY29tcGxldGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0xhdGl0dWRlKGVudHJ5LmRhdGEuZFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgbGF0aXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNMb25naXR1ZGUoZW50cnkuZGF0YS5kWzFdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBsb25naXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNBbHRpdHVkZShlbnRyeS5kYXRhLmRbMl0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGFsdGl0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9zdHIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZW50cnkuZGF0YS51OCkpOworICAgICAgICBpZiAoIXNldEdwc1Byb2Nlc3NpbmdNZXRob2QobWV0aG9kX3N0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgcHJvY2Vzc2luZyBtZXRob2QgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZV9hdmFpbGFibGUgJiYgbWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfVElNRVNUQU1QKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVApOworICAgICAgICB0aW1lX3QgdGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8dGltZV90PihlbnRyeS5kYXRhLmk2NFswXSk7CisgICAgICAgIGlmIChnbXRpbWVfcigmdGltZXN0YW1wLCAmdGltZV9pbmZvKSkgeworICAgICAgICAgICAgaWYgKCFzZXRHcHNUaW1lc3RhbXAodGltZV9pbmZvKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgdGltZXN0YW1wIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVGltZSB0cmFuZm9ybWF0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fU1RFUCkgJiYKKyAgICAgICAgICAgIG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdGVwRW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX0NPTlRST0xfQUVfQ09NUEVOU0FUSU9OX1NURVApOworICAgICAgICBpZiAoIXNldEV4cG9zdXJlQmlhcyhlbnRyeS5kYXRhLmkzMlswXSwgc3RlcEVudHJ5LmRhdGEuclswXS5udW1lcmF0b3IsCisgICAgICAgICAgICAgICAgc3RlcEVudHJ5LmRhdGEuclswXS5kZW5vbWluYXRvcikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSBiaWFzIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgICAgICBpZiAoIXNldE9yaWVudGF0aW9uKGVudHJ5LmRhdGEuaTMyWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIG9yaWVudGF0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSk7CisgICAgICAgIGZsb2F0IGV4cG9zdXJlX3RpbWUgPSAxLjBmICogZW50cnkuZGF0YS5pNjRbMF0gLyAxZTk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVUaW1lKGV4cG9zdXJlX3RpbWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2V0U2h1dHRlclNwZWVkKGV4cG9zdXJlX3RpbWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc2h1dHRlciBzcGVlZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFKTsKKyAgICAgICAgaWYgKCFzZXRTdWJqZWN0RGlzdGFuY2UoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHN1YmplY3QgZGlzdGFuY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpOworICAgICAgICBpbnQzMl90IGlzbyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgcG9zdFJhd1NlbnNFbnRyeSA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QpOworICAgICAgICBpZiAocG9zdFJhd1NlbnNFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlzbyA9IGlzbyAqIHBvc3RSYXdTZW5zRW50cnkuZGF0YS5pMzJbMF0gLyAxMDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldElzb1NwZWVkUmF0aW5nKHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc28pKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGlzbyByYXRpbmcgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfTEVOU19BUEVSVFVSRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19BUEVSVFVSRSk7CisgICAgICAgIGlmICghc2V0Rk51bWJlcihlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgRiBudW1iZXIgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRBcGVydHVyZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgYXBlcnR1cmUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3Qga1NSR0JDb2xvclNwYWNlID0gMTsKKyAgICBpZiAoIXNldENvbG9yU3BhY2Uoa1NSR0JDb2xvclNwYWNlKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgY29sb3Igc3BhY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0FQRVJUVVJFUykpIHsKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0FQRVJUVVJFUyk7CisgICAgICAgIGlmICghc2V0TWF4QXBlcnR1cmUoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIG1heCBhcGVydHVyZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKSkgeworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGZsYXNoU3RhdGVFbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9GTEFTSF9TVEFURSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhZU1vZGVFbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpOworICAgICAgICB1aW50OF90IGZsYXNoU3RhdGUgPSBmbGFzaFN0YXRlRW50cnkuY291bnQgPiAwID8KKyAgICAgICAgICAgICAgICBmbGFzaFN0YXRlRW50cnkuZGF0YS51OFswXSA6IEFORFJPSURfRkxBU0hfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgICAgIHVpbnQ4X3QgYWVNb2RlID0gYWVNb2RlRW50cnkuY291bnQgPiAwID8KKyAgICAgICAgICAgICAgICBhZU1vZGVFbnRyeS5kYXRhLnU4WzBdIDogQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOworCisgICAgICAgIGlmICghc2V0Rmxhc2goZW50cnkuZGF0YS51OFswXSwgZmxhc2hTdGF0ZSwgYWVNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZsYXNoIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQVdCX01PREUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQVdCX01PREUpOworICAgICAgICBpZiAoIXNldFdoaXRlQmFsYW5jZShlbnRyeS5kYXRhLnU4WzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHdoaXRlIGJhbGFuY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpOworICAgICAgICBpZiAoIXNldEV4cG9zdXJlTW9kZShlbnRyeS5kYXRhLnU4WzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIG1vZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRpbWVfYXZhaWxhYmxlKSB7CisgICAgICAgIGNoYXIgc3RyWzRdOworICAgICAgICBpZiAoc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiUwM2xkIiwgdHAudHZfbnNlYyAvIDEwMDAwMDApIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdWJzZWMgaXMgaW52YWxpZDogJWxkIiwgX19GVU5DVElPTl9fLCB0cC50dl9uc2VjKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldFN1YnNlY1RpbWUoc3RkOjpzdHJpbmcoc3RyKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzdWJzZWMgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDAyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKKworI2luY2x1ZGUgIkNhbWVyYU1ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoKKyAqIE9yaWVudGF0aW9uIHZhbHVlOgorICogIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgICAgIDYgICAgICAgICAgNyAgICAgICAgICA4CisgKgorICogIDg4ODg4OCA4ODg4ODggICAgIDg4IDg4ICAgICA4ODg4ODg4ODg4IDg4ICAgICAgICAgICAgICAgICA4OCA4ODg4ODg4ODg4CisgKiAgODggICAgICAgICA4OCAgICAgODggODggICAgIDg4ICA4OCAgICAgODggIDg4ICAgICAgICAgODggIDg4ICAgICA4OCAgODgKKyAqICA4ODg4ICAgICA4ODg4ICAgODg4OCA4ODg4ICAgODggICAgICAgICA4ODg4ODg4ODg4IDg4ODg4ODg4ODggICAgICAgICA4OAorICogIDg4ICAgICAgICAgODggICAgIDg4IDg4CisgKiAgODggICAgICAgICA4OCA4ODg4ODggODg4ODg4CisgKi8KK2VudW0gRXhpZk9yaWVudGF0aW9uIDogdWludDE2X3QgeworICAgIE9SSUVOVEFUSU9OX1VOREVGSU5FRCAgID0gMHgwLAorICAgIE9SSUVOVEFUSU9OXzBfREVHUkVFUyAgID0gMHgxLAorICAgIE9SSUVOVEFUSU9OXzkwX0RFR1JFRVMgID0gMHg2LAorICAgIE9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTID0gMHgzLAorICAgIE9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTID0gMHg4LAorfTsKKworLy8gVGhpcyBpcyBiYXNlZCBvbiB0aGUgY2FtZXJhIEhJREwgc2hpbSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2FzIGluIHR1cm5lZAorLy8gYmFzZWQgb24gb3JpZ2luYWwgQ2hyb21lT1MgQVJDIGltcGxlbWVudGF0aW9uIG9mIGEgVjRMMiBIQUwKKworLy8gRXhpZlV0aWxzIGNhbiBvdmVycmlkZSBBUFAxIHNlZ21lbnQgd2l0aCB0YWdzIHdoaWNoIGNhbGxlciBzZXQuIEV4aWZVdGlscyBjYW4KKy8vIGFsc28gYWRkIGEgdGh1bWJuYWlsIGluIHRoZSBBUFAxIHNlZ21lbnQgaWYgdGh1bWJuYWlsIHNpemUgaXMgc3BlY2lmaWVkLgorLy8gRXhpZlV0aWxzIGNhbiBiZSByZXVzZWQgd2l0aCBkaWZmZXJlbnQgaW1hZ2VzIGJ5IGNhbGxpbmcgaW5pdGlhbGl6ZSgpLgorLy8KKy8vIEV4YW1wbGUgb2YgdXNpbmcgdGhpcyBjbGFzcyA6CisvLyAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpDcmVhdGUoKSk7CisvLyAgdXRpbHMtPmluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciogYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpOworLy8gIC4uLgorLy8gIC8vIENhbGwgRXhpZlV0aWxzIGZ1bmN0aW9ucyB0byBzZXQgRXhpZiB0YWdzLgorLy8gIC4uLgorLy8gIHV0aWxzLT5HZW5lcmF0ZUFwcDEoKTsKKy8vICB1bnNpZ25lZCBpbnQgYXBwMUxlbmd0aCA9IHV0aWxzLT5HZXRBcHAxTGVuZ3RoKCk7CisvLyAgdWludDhfdCogYXBwMUJ1ZmZlciA9IG5ldyB1aW50OF90W2FwcDFMZW5ndGhdOworLy8gIG1lbWNweShhcHAxQnVmZmVyLCB1dGlscy0+R2V0QXBwMUJ1ZmZlcigpLCBhcHAxTGVuZ3RoKTsKK2NsYXNzIEV4aWZVdGlscyB7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5FeGlmVXRpbHMoKTsKKworICAgIHN0YXRpYyBFeGlmVXRpbHMqIGNyZWF0ZSgpOworCisgICAgLy8gSW5pdGlhbGl6ZSgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZSBzZXR0aW5nIG9mIEV4aWYgdGFncyB3aWxsIGJlCisgICAgLy8gY2xlYXJlZC4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyICphcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplRW1wdHkoKSA9IDA7CisKKyAgICAvLyBTZXQgYWxsIGtub3duIGZpZWxkcyBmcm9tIGEgbWV0YWRhdGEgc3RydWN0dXJlCisgICAgdmlydHVhbCBib29sIHNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLCBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxlbiBhcGVydHVyZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgPSAwOworCisgICAgLy8gc2V0cyB0aGUgY29sb3Igc3BhY2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZSh1aW50MTZfdCBjb2xvcl9zcGFjZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGF0ZSBhbmQgdGltZSBvZiBpbWFnZSBsYXN0IG1vZGlmaWVkLiBJdCB0YWtlcyBsb2NhbCB0aW1lLiBUaGUKKyAgICAvLyBuYW1lIG9mIHRoZSB0YWcgaXMgRGF0ZVRpbWUgaW4gSUZEMC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRpZ2l0YWwgem9vbSByYXRpby4gSWYgdGhlIG51bWVyYXRvciBpcyAwLCBpdCBtZWFucyBkaWdpdGFsIHpvb20KKyAgICAvLyB3YXMgbm90IHVzZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGlnaXRhbFpvb21SYXRpbyh1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgYmlhcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSB0aW1lLCBnaXZlbiBpbiBzZWNvbmRzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlVGltZShmbG9hdCBleHBvc3VyZV90aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzdGF0dXMgb2YgZmxhc2guCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgRiBudW1iZXIuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rk51bWJlcihmbG9hdCBmX251bWJlcikgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIGZvciAzNW1tIGZpbG0gdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oZmxvYXQgZm9jYWxfbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbGF0aXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTGF0aXR1ZGUoZG91YmxlIGxhdGl0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsb25naXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgR1BTIHByb2Nlc3NpbmcgbWV0aG9kLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgPSAwOworCisgICAgLy8gU2V0cyBHUFMgZGF0ZSBzdGFtcCBhbmQgdGltZSBzdGFtcCAoYXRvbWljIGNsb2NrKS4gSXQgdGFrZXMgVVRDIHRpbWUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgaGVpZ2h0IChudW1iZXIgb2Ygcm93cykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdpZHRoIChudW1iZXIgb2YgY29sdW1ucykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBJU08gc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHNtYWxsZXN0IEYgbnVtYmVyIG9mIHRoZSBsZW5zLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSA9IDA7CisKKyAgICAvLyBTZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpID0gMDsKKworICAgIC8vIFNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc2h1dHRlciBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIHN1YmplY3QsIGdpdmVuIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGZvciB0aGUgPERhdGVUaW1lPiB0YWcuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdoaXRlIGJhbGFuY2UgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmxhbmFjZSkgPSAwOworCisgICAgLy8gR2VuZXJhdGVzIEFQUDEgc2VnbWVudC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGdlbmVyYXRpbmcgQVBQMSBzZWdtZW50IGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUFwcDEoKSA9IDA7CisKKyAgICAvLyBHZXRzIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXBwMUJ1ZmZlcigpID0gMDsKKworICAgIC8vIEdldHMgbGVuZ3RoIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0QXBwMUxlbmd0aCgpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBjMGEzNTNmLi5mNGM0OWVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtNDksNyArNDksOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwogCiAgICAgLy8gRXhwYW5kIHNob3J0aGFuZHMKLSAgICBpZiAoc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpICE9IC0xKSB7CisgICAgc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpOworICAgIGlmIChpZHggIT0gLTEpIHsKICAgICAgICAgc3NpemVfdCBlbmQgPSB0YWdOYW1lcy5maW5kKCIsIiwgaWR4KTsKICAgICAgICAgY2hhciogc3RhcnQgPSB0YWdOYW1lcy5sb2NrQnVmZmVyKHRhZ05hbWVzLnNpemUoKSk7CiAgICAgICAgIHN0YXJ0W2lkeF0gPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uNGYzYWMxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTAsNyArNTEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTgwLDExICs4MCwxOCBAQAogICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjb250ZW50OjpwbTsKIAogLy8gaW5kaXZpZHVhbCByZWNvcmRzIGtlcHQgaW4gbWVtb3J5OiBhZ2Ugb3IgY291bnQKLS8vIGFnZTogPD0gMzYgaG91cnMgKDEuNSBkYXlzKQorLy8gYWdlOiA8PSAyOCBob3VycyAoMSAxLzYgZGF5cykKIC8vIGNvdW50OiBoYXJkIGxpbWl0IG9mICMgcmVjb3JkcwogLy8gKDAgZm9yIGVpdGhlciBvZiB0aGVzZSBkaXNhYmxlcyB0aGF0IHRocmVzaG9sZCkKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAzNiAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKy8vCitzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDI4ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKworLy8gbWF4IHdlIGV4cGlyZSBpbiBhIHNpbmdsZSBjYWxsLCB0byBjb25zdHJhaW4gaG93IGxvbmcgd2UgaG9sZCB0aGUKKy8vIG11dGV4LCB3aGljaCBhbHNvIGNvbnN0cmFpbnMgaG93IGxvbmcgYSBjbGllbnQgbWlnaHQgd2FpdC4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhFeHBpcmVkQXRPbmNlID0gNTA7CisKKy8vIFRPRE86IG5lZWQgdG8gbG9vayBhdCB0dW5pbmcga01heFJlY29yZHMgYW5kIGZyaWVuZHMgZm9yIGxvdy1tZW1vcnkgZGV2aWNlcwogCiBzdGF0aWMgY29uc3QgY2hhciAqa1NlcnZpY2VOYW1lID0gIm1lZGlhLm1ldHJpY3MiOwogCkBAIC05Niw2ICsxMDMsNyBAQAogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpNZWRpYUFuYWx5dGljc1NlcnZpY2UoKQogICAgICAgICA6IG1NYXhSZWNvcmRzKGtNYXhSZWNvcmRzKSwKICAgICAgICAgICBtTWF4UmVjb3JkQWdlTnMoa01heFJlY29yZEFnZU5zKSwKKyAgICAgICAgICBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2Uoa01heEV4cGlyZWRBdE9uY2UpLAogICAgICAgICAgIG1EdW1wUHJvdG8oTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSksCiAgICAgICAgICAgbUR1bXBQcm90b0RlZmF1bHQoTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSkgewogCkBAIC00MzIsMjMgKzQ0MCwyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NzAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0ODUsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IGIzYzkwMmEuLjYzMmM2OTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KKwogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNiArNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKIAorICAgIGJvb2wgcHJvY2Vzc0V4cGlyYXRpb25zKCk7CisKICBwcml2YXRlOgogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgZ2VuZXJhdGVVbmlxdWVTZXNzaW9uSUQoKTsKIApAQCAtNjUsNiArNjksOCBAQAogICAgIGludDMyX3QgbU1heFJlY29yZHM7CiAgICAgLy8gYnkgdGltZSAobm9uZSBvbGRlciB0aGFuIHRoaXMgbG9uZyBhZ2FuCiAgICAgbnNlY3NfdCBtTWF4UmVjb3JkQWdlTnM7CisgICAgLy8gbWF4IHRvIGV4cGlyZSBwZXIgZXhwaXJhdGlvbnNfbCgpIGludm9jYXRpb24KKyAgICBpbnQzMl90IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZTsKICAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwpAQCAtNzksNiArODUsOSBAQAogICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKICAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAorICAgIGJvb2wgZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gbUV4cGlyZUZ1dHVyZTsKKwogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87CiAgICAgaW50IG1EdW1wUHJvdG9EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGRiNWYwZmYuLmY3OGM2NzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTYzLDYgKzYzLDcwIEBACiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNlcnZpY2UgZXhlY3V0YWJsZQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KK2lmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhc3djb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFzd2NvZGVjLnBvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFzd2NvZGVjLnBvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODZfNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFzd2NvZGVjLnBvbGljeQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBtYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwIFwKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkc3VmZml4IC5zbyxcCisgICQoQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVUJTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVFNBTl9SVU5USU1FX0xJQlJBUlkpIFwKKyAgJCgyTkRfQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoMk5EX1VCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKDJORF9UU0FOX1JVTlRJTUVfTElCUkFSWSkpKQorCisjICQoaW5mbyBTYW5pdGl6ZXI6ICAkKHNhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcykpCisKK2xsbmRrX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKExMTkRLX0xJQlJBUklFUykpKQorCisjICQoaW5mbyBMTE5ESzogICQobGxuZGtfbGlicmFyaWVzKSkKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETElOS0VEX0xJQlJBUklFUz0nIiQoc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzKTokKGxsbmRrX2xpYnJhcmllcykiJworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsIFwKKyAgICBsaWJiYXNlIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGlkbHRyYW5zcG9ydCBcCisgICAgbGliaHdiaW5kZXIgXAorICAgIGxpYmxvZyBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJ6aXBhcmNoaXZlIFwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGlibmF0aXZlbG9hZGVyLWR1bW15LWhlYWRlcnMgXAorCitMT0NBTF9NT0RVTEUgOj0gbWVkaWFzd2NvZGVjCitMT0NBTF9JTklUX1JDIDo9IG1lZGlhc3djb2RlYy5yYworTE9DQUxfU0FOSVRJWkUgOj0gc2N1ZG8KK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2XzY0IGFybTY0KSkKKyAgTE9DQUxfTVVMVElMSUIgOj0gYm90aAorICBMT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSAkKExPQ0FMX01PRFVMRSkzMgorICBMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSkKK2VuZGlmCisKK3Nhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyA6PQorbGxuZGtfbGlicmFyaWVzIDo9CisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiAjIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCkBAIC04Myw0ICsxNDcsMTYgQEAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIGVuZGlmCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgc3cgc2VydmljZSBzZWNjb21wIHBvbGljeQoraWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBtZWRpYXN3Y29kZWMucG9saWN5CitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKK2VuZGlmCisKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsICQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2NiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8bWVkaWEvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5oPgorI2luY2x1ZGUgPG5hdGl2ZWxvYWRlci9kbGV4dF9uYW1lc3BhY2VzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIGxvYWRGcm9tQXBleChjb25zdCBjaGFyICpsaWJEaXJQYXRoKSB7CisgICAgQUxPR1YoImxvYWRGcm9tQXBleDogcGF0aD0lcyIsIGxpYkRpclBhdGgpOworCisgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyI7CisKKyAgICBhbmRyb2lkX25hbWVzcGFjZV90ICpjb2RlY05zID0gYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKCJjb2RlY3MiLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxkX2xpYnJhcnlfcGF0aAorICAgICAgICAgICAgbGliRGlyUGF0aCwKKyAgICAgICAgICAgIEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQsCisgICAgICAgICAgICBudWxscHRyLCAgLy8gcGVybWl0dGVkX3doZW5faXNvbGF0ZWRfcGF0aAorICAgICAgICAgICAgbnVsbHB0cik7IC8vIHBhcmVudAorCisgICAgaWYgKGNvZGVjTnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBuYW1lc3BhY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZzggbGlua2VkX2xpYnJhcmllcyhMSU5LRURfTElCUkFSSUVTKTsKKyAgICBpZiAoIWFuZHJvaWRfbGlua19uYW1lc3BhY2VzKGNvZGVjTnMsIG51bGxwdHIsIGxpbmtlZF9saWJyYXJpZXMuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsaW5rIG5hbWVzcGFjZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8gZGxleHRpbmZvID0geworICAgICAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAgICAgLmxpYnJhcnlfbmFtZXNwYWNlID0gY29kZWNOcywKKyAgICB9OworCisgICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwsICZkbGV4dGluZm8pOworCisgICAgaWYgKHJlZ2lzdHJhbnRMaWIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvYWQgbGliIGZyb20gYXJjaGl2ZTogJXMiLCBkbGVycm9yKCkpOworICAgIH0KKworICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCisgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworCisgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgY29kZWMgc2VydmljZXMgLS0gY29ycnVwdGVkIGxpYnJhcnkuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkNmRiZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfQ09ERUNfVVBEQVRFX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0NPREVDX1VQREFURV9TRVJWSUNFX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIGxvYWRGcm9tQXBleChjb25zdCBjaGFyICpsaWJEaXJQYXRoKTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9DT0RFQ19VUERBVEVfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCmluZGV4IDUxNjE5ZjYuLjZkNDdiZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCkBAIC00OCwzNyArNDgsMjEgQEAKIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKIAotICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBjdXN0b21pemVkIGNvZGVjIHNlcnZpY2VzCi0gICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IGRsb3BlbigKLSAgICAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIiwKLSAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgaWYgKHJlZ2lzdHJhbnRMaWIpIHsKLSAgICAgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYyByZWdpc3RlckNvZGVjU2VydmljZXMgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCi0gICAgICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKLSAgICAgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcykgewotICAgICAgICAgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWdpc3RlciBhZGRpdGlvbmFsIHNlcnZpY2VzICIKLSAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7Ci0gICAgICAgIH0KKyAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKKyAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOworICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOworICAgIH0KKyAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwotICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CiAgICAgfQogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKKyNpbmNsdWRlICJtaW5pamFpbC5oIgorCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCisjaW5jbHVkZSAiTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy5wb2xpY3kiOworc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLnBvbGljeSI7CisKKy8vIERpc2FibGUgU2N1ZG8ncyBtaXNtYXRjaCBhbGxvY2F0aW9uIGNoZWNrLCBhcyBpdCBpcyBiZWluZyB0cmlnZ2VyZWQKKy8vIGJ5IHNvbWUgdGhpcmQgcGFydHkgY29kZS4KK2V4dGVybiAiQyIgY29uc3QgY2hhciAqX19zY3Vkb19kZWZhdWx0X29wdGlvbnMoKSB7CisgIHJldHVybiAiRGVhbGxvY2F0aW9uVHlwZU1pc21hdGNoPWZhbHNlIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiAvKmFyZ3YqLykKK3sKKyAgICBMT0coSU5GTykgPDwgIm1lZGlhIHN3Y29kZWMgc2VydmljZSBzdGFydGluZyI7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOworCisjaWZkZWYgX19MUDY0X18KKyAgICBsb2FkRnJvbUFwZXgoIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvbGliNjQiKTsKKyNlbHNlCisgICAgbG9hZEZyb21BcGV4KCIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2xpYiIpOworI2VuZGlmCisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ5NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICB1cGRhdGFibGUKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MGRlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTUgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgLy8gQ29kZWNzCisgICAgcnVudGltZV9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oZXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2MWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIF0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKworZXh0ZXJuICJDIiB2b2lkIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgc29mdHdhcmUgQ29kZWMyIHNlcnZpY2UuLi4iOworICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmUgPQorICAgICAgICBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgic29mdHdhcmUiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwKKyAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQppbmRleCBiNGY1ZWU5Li44NDVmODRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQpAQCAtMTgsMTQgKzE4LDIwIEBACiBvcGVuYXQ6IDEKIG9wZW46IDEKIGdldHVpZDMyOiAxCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQogd3JpdGV2OiAxCiBpb2N0bDogMQogY2xvc2U6IDEKIG1tYXAyOiAxCittbWFwOiAxCiBmc3RhdDY0OiAxCitmc3RhdDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCituZXdmc3RhdGF0OiAxCiBmdXRleDogMQogbXVubWFwOiAxCiBmYWNjZXNzYXQ6IDEKQEAgLTQyLDYgKzQ4LDcgQEAKIHJlYWRsaW5rYXQ6IDEKIF9sbHNlZWs6IDEKIGZzdGF0ZnM2NDogMQorZnN0YXRmczogMQogcHJlYWQ2NDogMQogbXJlbWFwOiAxCiBkdXA6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2VkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Z1dGV4OiAxCisjIGlvY3RsIGNhbGxzIGFyZSBmaWx0ZXJlZCB2aWEgdGhlIHNlbGludXggcG9saWN5LgoraW9jdGw6IDEKK3NjaGVkX3lpZWxkOiAxCitjbG9zZTogMQorZHVwOiAxCitwcG9sbDogMQorbXByb3RlY3Q6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCittbWFwMjogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCitwcmN0bDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQorZnN0YXQ2NDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZnN0YXRmczY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitleGl0X2dyb3VwOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK3J0X3NpZ3JldHVybjogMQorZ2V0cmFuZG9tOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlY2FmNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQpAQCAtMCwwICsxLDY0IEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK2dldHVpZDogMQorZ2V0cmxpbWl0OiAxCitmc3RhdDogMQorbmV3ZnN0YXRhdDogMQorZnN0YXRmczogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKK2Z0cnVuY2F0ZTY0OiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK3ByY3RsOiAxCit3cml0ZXY6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorZXhpdDogMQorbHNlZWs6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitvcGVuYXQ6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NldHByaW9yaXR5OiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3JlYWQ6IDEKK3ByZWFkNjQ6IDEKK2dldHRpbWVvZmRheTogMQorZmFjY2Vzc2F0OiAxCitleGl0X2dyb3VwOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK3J0X3NpZ3JldHVybjogMQorZ2V0cmFuZG9tOiAxCittYWR2aXNlOiAxCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFiMjU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5CkBAIC0wLDAgKzEgQEAKK21lZGlhY29kZWMteDg2LnBvbGljeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFiMjU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5CkBAIC0wLDAgKzEgQEAKK21lZGlhY29kZWMteDg2LnBvbGljeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCmluZGV4IGU4NzA5NjUuLjIyN2EyOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawpAQCAtMjksNyArMjksOCBAQAogICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawppbmRleCA1MzQyODk4Li42NWZjZjQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKQEAgLTQsOCArNCw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgXAotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAgXAorICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJzdGFnZWZyaWdodCBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UKQEAgLTE4LDE5ICsxNyw3IEBACiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2XzY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKQEAgLTQwLDYgKzI3LDcgQEAKIExPQ0FMX0lOSVRfUkMgOj0gbWVkaWFleHRyYWN0b3IucmMKIExPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYQogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NBTklUSVpFIDo9IHNjdWRvCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogIyBzZXJ2aWNlIHNlY2NvbXAgZmlsdGVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBmMGY0NGY1Li5kZTVjM2U0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KQEAgLTMwLDYgKzI5LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitNZWRpYUV4dHJhY3RvclNlcnZpY2U6Ok1lZGlhRXh0cmFjdG9yU2VydmljZSgpCisgICAgICAgIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKwogc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmcmVtb3RlU291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSk7CkBAIC01NSw2ICs1NywxMCBAQAogICAgIHJldHVybiBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiB9CiAKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChmZCwgYXJncykgfHwgZHVtcEV4dHJhY3RvcnMoZmQsIGFyZ3MpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA5ZGYzZWNkLi5jOWNlYmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMjcsNyArMjcsNyBAQAogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yU2VydmljZT47ICAgIC8vIGZvciBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQogcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKyAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQogCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYTY5OC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UiCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotYmluZGVyOjpTdGF0dXMgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjpsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgQUxPR1YoImxvYWRQbHVnaW5zICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRQbHVnaW5zKGFwa1BhdGgpOwotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE1ZjZkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLSAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZQotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT47Ci1wdWJsaWM6Ci0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5leHRyYWN0b3IudXBkYXRlIjsgfQotICAgIGJpbmRlcjo6U3RhdHVzIGxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggOGQzMzU5YS4uM2MxNWJmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0zMSw3ICszMSw2IEBACiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKICNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCkBAIC00Miw2ICs0MSwxMiBAQAogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIAorLy8gRGlzYWJsZSBTY3VkbydzIG1pc21hdGNoIGFsbG9jYXRpb24gY2hlY2ssIGFzIGl0IGlzIGJlaW5nIHRyaWdnZXJlZAorLy8gYnkgc29tZSB0aGlyZCBwYXJ0eSBjb2RlLgorZXh0ZXJuICJDIiBjb25zdCBjaGFyICpfX3NjdWRvX2RlZmF1bHRfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKIHsKICAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCkBAIC02NiwxMSArNzEsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAKLSAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKLSAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKLSAgICAgICAgbWVkaWE6Ok1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICB9Ci0KICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzIyOTlmMy4uNjA3YTAzZQotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTIyLDYgKzIyLDggQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdDogMQorZnN0YXRmczogMQogbmV3ZnN0YXRhdDogMQogcmVzdGFydF9zeXNjYWxsOiAxCiBleGl0OiAxCkBAIC0zMSwyOCArMzMsMjEgQEAKIHNjaGVkX3NldHNjaGVkdWxlcjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQorCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotdGdraWxsOiAxCi1zb2NrZXQ6IGFyZzAgPT0gMQotY29ubmVjdDogMQotZmNudGw6IDEKLXJ0X3NpZ3Byb2NtYXNrOiAxCi1ydF9zaWdhY3Rpb246IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkOiAxCi1nZXRnaWQ6IDEKLWdldGVnaWQ6IDEKLWdldGdyb3VwczogMQotZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi0KICMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgogZ2V0dGlkOiAxCiBzY2hlZF95aWVsZDogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAppbmRleCAyOWU2ZGZjLi5iZWU1ZDI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTEwLDcgKzEwLDcgQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMWJlNTU0NC4uOTAyYWY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsMjcgKzU0LDI4IEBACiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCB8fAorICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCB8fAogICAgICAgICAgICAgc2l6ZSA8IGtNaW5TaXplIHx8IHNpemUgPiBrTWF4U2l6ZSB8fCBuYW1lID09IE5VTEwgfHwKICAgICAgICAgICAgIHNoYXJlZC0+c2l6ZSgpIDwgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSkpOwotICAgIE5CTG9nOjpOYW1lZFJlYWRlciBuYW1lZFJlYWRlcihyZWFkZXIsIG5hbWUpOworICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gUmVhZGVyIGhhbmRsZWQgYnkgbWVyZ2VyCisgICAgc3A8TkJMb2c6OkR1bXBSZWFkZXI+IGR1bXBSZWFkZXIobmV3IE5CTG9nOjpEdW1wUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBmb3IgZHVtcHN5cwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbU5hbWVkUmVhZGVycy5hZGQobmFtZWRSZWFkZXIpOwotICAgIG1NZXJnZXIuYWRkUmVhZGVyKG5hbWVkUmVhZGVyKTsKKyAgICBtRHVtcFJlYWRlcnMuYWRkKGR1bXBSZWFkZXIpOworICAgIG1NZXJnZXIuYWRkUmVhZGVyKHJlYWRlcik7CiB9CiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDApIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5hbWVkUmVhZGVycy5zaXplKCk7ICkgewotICAgICAgICBpZiAobU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKLSAgICAgICAgICAgIG1OYW1lZFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRHVtcFJlYWRlcnMuc2l6ZSgpOyApIHsKKyAgICAgICAgaWYgKG1EdW1wUmVhZGVyc1tpXS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKKyAgICAgICAgICAgIG1EdW1wUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIFRPRE8gbU1lcmdlci5yZW1vdmVSZWFkZXJzKHNoYXJlZCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQpAQCAtOTUsMTAgKzk3LDggQEAKIAogc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9BVURJT1NFUlZFUiB8fAotICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKKyAgICBpZiAoIShpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpCisgICAgICAgICAgICB8fCBkdW1wQWxsb3dlZCgpKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggYXJnMChhcmdzWzBdKTsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJnMC5zdHJpbmcoKSwgIi1yIikpIHsKLSAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1OYW1lZFJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIE1lZGlhTG9nU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCkBAIC0xMTksMjEgKzExOSwyMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczoiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBpbnN0ZWFkIHByb2NlZWQgdG8gbU1lcmdlUmVhZGVyLmR1bXA/IGRvZXMgaXQgbmVlZCBsb2NrPwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lZFJlYWRlciA6IG1OYW1lZFJlYWRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZHVtcFJlYWRlciA6IG1EdW1wUmVhZGVycykgewogICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBSZWFkZXItPmR1bXAoZmQsIDAgLyppbmRlbnQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCwgYXJncyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAppbmRleCBjOTQ1ZDFmLi4yMWRmODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTUsNyArNTYsNyBAQAogCiAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKIAotICAgIFZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgVmVjdG9yPHNwPE5CTG9nOjpEdW1wUmVhZGVyPj4gbUR1bXBSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgLy8gRklYTUUgTmVlZCBjb21tZW50cyBvbiBhbGwgb2YgdGhlc2UsIGVzcGVjaWFsbHkgYWJvdXQgbG9ja2luZwogICAgIE5CTG9nOjpTaGFyZWQgKm1NZXJnZXJTaGFyZWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAppbmRleCAxYzYzZjY0Li5mMzMzOWEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKQEAgLTE2LDggKzE2LDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCmluZGV4IGUwZGIyNjEuLmExZmMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcApAQCAtMTQwLDkgKzE0MCw4IEBACiB9CiAKIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CiAgICAgICAgIHJldHVybiBvcGVuRXhjbHVzaXZlRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gb3BlblNoYXJlZEVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CkBAIC0xNzMsNyArMTcyLDcgQEAKIAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICBBTE9HVigib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CiAgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50TU1hcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IDE5M2JkZWUuLmJhMTc4NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC01Niw4ICs1Niw3IEBACiAgICAgICogQHJldHVybiBlbmRwb2ludCBvciBudWxsCiAgICAgICovCiAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCk7CiAKICAgICB2b2lkIGNsb3NlRW5kcG9pbnQoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBzZXJ2aWNlRW5kcG9pbnQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKaW5kZXggYjAzMTg4OC4uMWMwM2I3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcApAQCAtOTksNyArOTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHBhcnRJbmRleCsrOwogICAgIH0KLSAgICBmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKKyAgICBmaWZvLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0VORCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCAwMTgyYTI3Li4yZmJhZWI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgpAQCAtMzMsNyArMzQsNiBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTExOCwxNyArMTE4LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQKLSAgICAgICAgIHx8IChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkpIHsKKyAgICAvLyBUcnkgU0hBUkVEIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZC4KKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CiAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCk7CisgICAgfSBlbHNlIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkgeworICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgbW9kaWZpZWRSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBFWENMVVNJVkUgbW9kZSB3aXRoIFNIQVJFRC4KKyAgICAgICAgbW9kaWZpZWRSZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKG1vZGlmaWVkUmVxdWVzdCk7CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwotICAgICAgICBBTE9HRSgib3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwKLSAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgQUxPR1coIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDY5MDY4ZjUuLjRkZmI2MmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMzgsMTAgKzM4LDYgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAotQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogCkBAIC01OSw2ICs1NSw3IEBACiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRm9ybWF0OiAgICAgICAgICAgICAgICIgPDwgZ2V0Rm9ybWF0KCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBVc2FnZTogICAgICAgICAgICAgICAgIiA8PCBnZXRVc2FnZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ29udGVudFR5cGU6ICAgICAgICAgICIgPDwgZ2V0Q29udGVudFR5cGUoKSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBhMTM0YTEzLi4zNjE2ZmEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAsIHB1YmxpYyBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIHsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgbUxvY2tTdHJlYW1zOwogICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gbVJlZ2lzdGVyZWRTdHJlYW1zOwogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcDsKIAogICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICBtTW1hcENsaWVudDsgICAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBvcGVuIGFuZCBzdGFydFN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCmluZGV4IGNjOTQyZjQuLjM3ZDEwNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCkBAIC04Miw4ICs4Miw5IEBACiAKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpICYmICFjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKwogICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYnVmZmVyIHRvbyBmdWxsIHRvIHdyaXRlIGEgYnVyc3Q/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKaW5kZXggNWE0MjljOS4uNmMyODA4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKQEAgLTEwMSw4ICsxMDEsNiBAQAogICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSwKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwotICAgIEFMT0dEKCIlcyglcCkgTU1BUCBhdHRyaWJ1dGVzLnVzYWdlID0gJWQsIGNvbnRlbnRfdHlwZSA9ICVkLCBzb3VyY2UgPSAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIHRoaXMsIGF0dHJpYnV0ZXMudXNhZ2UsIGF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CiAKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CkBAIC0xMTEsMTEgKzEwOSwxMSBAQAogICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGRldmljZUlkID0gZ2V0RGV2aWNlSWQoKTsKIAogICAgIC8vIEZpbGwgaW4gY29uZmlnCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwotICAgIGlmIChhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQgfHwgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBjb25maWcuZm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgY29uZmlnLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OwogCiAgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOwogICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgewpAQCAtMTYzLDEyICsxNjEsMTIgQEAKICAgICBBTE9HRCgiJXMoKSBtTWFwQ2xpZW50LnVpZCA9ICVkLCBwaWQgPSAlZCA9PiBwb3J0SGFuZGxlID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOwogICAgIH0KICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CiAKQEAgLTIxMCw5ICsyMDgsNiBAQAogICAgICAgICB1aWRfdCBhdWRpb1NlcnZpY2VVaWQgPSBnZXR1aWQoKTsKICAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgogICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQotICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKICAgICAgICAgICAgIEFMT0dXKCIlcygpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yMzMsNyArMjI4LDcgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOwotICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCkpOworICAgIHNldEZvcm1hdChjb25maWcuZm9ybWF0KTsKICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZy5zYW1wbGVfcmF0ZSk7CiAKICAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgpAQCAtMjUzLDYgKzI0OCw5IEBACiAgICAgICAgICAgIiwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCisgICAgQUxPR0QoIiVzKCkgZm9ybWF0ID0gPXglMDh4LCBmcmFtZSBzaXplID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRGb3JtYXQoKSwgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpKTsKKwogICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBlYmJhMzJkLi4xZTFjNTUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtNDcsMTAgKzQ3LDYgQEAKICAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAotQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKQEAgLTg4LDYgKzg0LDEwIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNSZWFkID0gMDsKICAgICAgICAgICAgICAgICBib29sIGFsbG93VW5kZXJmbG93ID0gdHJ1ZTsKIAorICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRlYWQgc3RyZWFtCisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gY2xpZW50U3RyZWFtLT5nZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsbG93VW5kZXJmbG93ID0gZmFsc2U7IC8vIGp1c3QgcmVhZCB3aGF0IGlzIGFscmVhZHkgaW4gdGhlIEZJRk8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAppbmRleCBhMGEzODNjLi45ODFlNDMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCkBAIC0zOSw3ICszOSw2IEBACiBjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IGZjOWYxNTUuLjBhNDE1ZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNzgsNiArNzgsNyBAQAogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICBzZXREZXZpY2VJZChtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpOwogICAgIHNldFNlc3Npb25JZChtU3RyZWFtSW50ZXJuYWwtPmdldFNlc3Npb25JZCgpKTsKKyAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7IC8vIGZvcmNlIGZvciBtaXhlcgogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xODAsOCArMTgxLDggQEAKIC8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgcmVhbC10aW1lIHNlcnZpY2UgdGhyZWFkLCBlZy4gbWl4ZXIuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0VuZHBvaW50VGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0VuZHBvaW50VGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKaW5kZXggZDY3MTcxMC4uYmZjMTc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTUyLDggKzUyLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAqY2FsbGJhY2tMb29wKCkgPSAwOwotCisgICAgdmlydHVhbCB2b2lkICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAogcHJvdGVjdGVkOgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKaW5kZXggOWFmOGFmMy4uYjE2YjVkYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtVXBNZXNzYWdlUXVldWUobnVsbHB0cikKICAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQotICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQorICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gLTE7CkBAIC01MSw3ICs1MSw2IEBACiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7Ci0gICAgQUxPR0QoIn5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtODEsOCArODAsNyBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKQEAgLTEwOSwxMCArMTA3LDggQEAKICAgICAgICAgLy8gcmVmZXJlbmNlZCB1bnRpbCB0aGUgc2VydmljZSByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBjbGllbnQuCiAgICAgICAgIC8vIFNvIG9ubHkgb25lIHRocmVhZCBjYW4gb3BlbiBhIHN0cmVhbS4KICAgICAgICAgbVNlcnZpY2VFbmRwb2ludCA9IG1FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KG1BdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7CiAgICAgICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTE4Myw5ICsxNzksMTAgQEAKICAgICB9CiAKICAgICBzZXRGbG93aW5nKGZhbHNlKTsKKyAgICBzZXRTdXNwZW5kZWQoZmFsc2UpOwogCiAgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5jbGVhcigpOwogCiAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgcmVzdWx0ID0gc3RhcnREZXZpY2UoKTsKQEAgLTI5NCwxNiArMjkxLDIwIEBACiB9CiAKIC8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewogICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgVGltZXN0YW1wU2NoZWR1bGVyIHRpbWVzdGFtcFNjaGVkdWxlcjsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOwogICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBpbnQ2NF90IG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CiAgICAgd2hpbGUobVRocmVhZEVuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIGxvb3BDb3VudCsrOwogICAgICAgICBpZiAoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSA+PSBuZXh0VGltZSkgewogICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHRpbWVzdGFtcCB0aHJlYWQgZ290IHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CkBAIC0zMTMsNyArMzE0LDggQEAKICAgICAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwVW50aWxOYW5vVGltZShuZXh0VGltZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0QoIiVzKCkgJXMgZXhpdGluZyA8PDw8PDw8PDw8PDw8PCBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgYWZ0ZXIgJWQgbG9vcHMgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsCisgICAgICAgICAgX19mdW5jX18sIGdldFR5cGVUZXh0KCksIGxvb3BDb3VudCk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7CkBAIC0zNDksNyArMzUxLDkgQEAKICAgICB9CiAgICAgaW50MzJfdCBjb3VudCA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpLT53cml0ZShjb21tYW5kLCAxKTsKICAgICBpZiAoY291bnQgIT0gMSkgewotICAgICAgICBBTE9HRSgiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/ICVzIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgICAgICBBTE9HVygiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBzdG9wPyBTdXNwZW5kaW5nIHN0cmVhbS4gd2hhdCA9ICV1LCAlcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjb21tYW5kLT53aGF0LCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgc2V0U3VzcGVuZGVkKHRydWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCBhMTgxNWQwLi5mZmM3NjhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTIwNCw2ICsyMDQsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgZmFsc2Ugd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBub3QgbG9uZ2VyIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYSBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93LgorICAgICAqIFNldCB0cnVlIHdoZW4gc3RyZWFtIGlzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHN1c3BlbmRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3VzcGVuZGVkKGJvb2wgc3VzcGVuZGVkKSB7CisgICAgICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7CisgICAgfQorCisgICAgYm9vbCBpc1N1c3BlbmRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdXNwZW5kZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXRvbWljYWxseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCkBAIC0yODcsNyArMzAxLDcgQEAKICAgICAvLyBUT0RPIHJlbmFtZSBtQ2xpZW50SGFuZGxlIHRvIG1Qb3J0SGFuZGxlIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAotICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljU3RyZWFtVGltZXN0YW1wOwogCiAgICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmbUF1ZGlvU2VydmljZTsKIApAQCAtMzA0LDcgKzMxOCwxMiBAQAogICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOwogCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHN0cmVhbSB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQgYnkgYSBiaW5kZXIgY2FsbCBuZWVkcyB0byBjbG9zZWQuCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKKworICAgIC8vIFRoaXMgaW5kaWNhdGUgdGhhdCBhIHJ1bm5pbmcgc3RyZWFtIHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2Ugb2YgYW4gZXJyb3IsCisgICAgLy8gZm9yIGV4YW1wbGUgYSBmdWxsIG1lc3NhZ2UgcXVldWUuIE5vdGUgdGhhdCB0aGlzIGF0b21pYyBpcyB1bnJlbGF0ZWQgdG8gbUNsb3NlTmVlZGVkLgorICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1TdXNwZW5kZWR7ZmFsc2V9OwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKaW5kZXggYzg0NTMwOS4uODM3YjA4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcApAQCAtNjQsOCArNjQsMTMgQEAKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMTU3LDcgKzE2Miw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEZyZWVSdW5uaW5nUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCgqcG9zaXRpb25GcmFtZXMsICp0aW1lTmFub3MpOwotICAgICAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUpIHsKQEAgLTE3OSw4ICsxODQsOCBAQAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCAqPihlbmRwb2ludC5nZXQoKSk7CiAKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKSArIHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDA1YzU3MzUuLjE0NzQyZGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMjAsOSArMTIwLDE0IEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIHJldHVybmVkICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xMzYsMTAgKzE0MSwxMCBAQAogCiAgICAgLy8gSXMgdGhlIHJlcXVlc3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzaGFyZWQgZW5kcG9pbnQ/CiAgICAgc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKSk7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKLSAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRSgiJXMoKSBhdWRpb19mb3JtYXRfdCBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xNDgsNyArMTUzLDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVSYXRlKGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlUmF0ZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE1OCw3ICsxNjMsNyBAQAogICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTg1LDggKzE5MCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogCiAgICAgcmVzdWx0ID0gZW5kcG9pbnQtPnJlZ2lzdGVyU3RyZWFtKGtlZXApOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0yMzMsMTUgKzIzOCwxNSBAQAogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om1hcmtUcmFuc2ZlclRpbWUoVGltZXN0YW1wICZ0aW1lc3RhbXApIHsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogfQogCiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgbWl4ZXIgb3IgZGlzdHJpYnV0b3IuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewogICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNTg0YjJlZi4uM2Q1ZjE0MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCkBAIC01Myw3ICs1Myw2IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic291bmR0cmlnZ2Vyc2VydmljZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNvdW5kVHJpZ2dlckhhbEhpZGwuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYnNvdW5kdHJpZ2dlciIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYXVkaW9oYWwiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4yIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNjY2ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1pZmVxICgkKFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFKSwgMSkKLSAgICBpZm5lcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksIHRydWUpCi0gICAgICAgICQoZXJyb3IgUmVxdWlyZXMgYnVpbGRpbmcgd2l0aCBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTD10cnVlKQotICAgIGVuZGlmCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLWVuZGlmCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnNvdW5kdHJpZ2dlciBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5Ci0KLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKLWVsc2UKLSMgVHJlYmxlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGxtZW1vcnkgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgXAotICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIFwKLSAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAotZW5kaWYKLQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAppbmRleCBhZGYyNTJlLi42OGQ1NGM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCkBAIC0xNjgsMTggKzE2OCwyMyBAQAogICAgIGludCByZXQ7CiAgICAgU291bmRNb2RlbEhhbmRsZSBoYWxIYW5kbGU7CiAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzEgPSB0b1NlcnZpY2UyXzEoc291bmR0cmlnZ2VyKTsKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOwogICAgIGlmIChzb3VuZF9tb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgewotICAgICAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwotICAgICAgICAgICAgY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwotICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFBocmFzZVNvdW5kTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5sb2FkUGhyYXNlU291bmRNb2RlbF8yXzEoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwogICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0xOTMsMTggKzE5OCwzMiBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKLSAgICAgICAgICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRQaHJhc2VTb3VuZE1vZGVsKAorICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CiAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmxvYWRTb3VuZE1vZGVsXzJfMShoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwogICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0yMTcsNiArMjM2LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4MiwxNiArMzEwLDIwIEBACiAgICAgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSA9IGNvb2tpZTsKIAogICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKICAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKIAotICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgeworICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPnN0YXJ0UmVjb2duaXRpb25fMl8xKAorICAgICAgICAgICAgICAgICAgICBtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CiAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMzAxLDYgKzMzMywxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CkBAIC0zNTYsNiArMzk1LDM4IEBACiAgICAgcmV0dXJuIGhpZGxSZXR1cm47CiB9CiAKK2ludCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzcDxJU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlciA9IGdldFNlcnZpY2UoKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMiA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8U291bmRNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG1vZGVsIG5vdCBmb3VuZCBmb3IgaGFuZGxlICV1IiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+Z2V0TW9kZWxTdGF0ZShtb2RlbC0+bUhhbEhhbmRsZSk7CisgICAgfQorICAgIGlmICghaGlkbFJldHVybi5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgZXJyb3IgJXMiLCBoaWRsUmV0dXJuLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogU291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRUcmlnZ2VySGFsSGlkbChjb25zdCBjaGFyICptb2R1bGVOYW1lKQogICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1OZXh0VW5pcXVlSWQoMSkKIHsKQEAgLTM4OCw2ICs0NTksMTIgQEAKICAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzEuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMV9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMSkgOiBudWxscHRyOwogfQogCitzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gU291bmRUcmlnZ2VySGFsSGlkbDo6dG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpCit7CisgICAgYXV0byBjYXN0UmVzdWx0XzJfMiA9IFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpjYXN0RnJvbShzKTsKKyAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzIuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMl9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMikgOiBudWxscHRyOworfQorCiBzcDxTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZE1vZGVsPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKaW5kZXggMGI0NGFlMC4uZmI5ZTM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJIdy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMi9JU291bmRUcmlnZ2VySHcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KIApAQCAtNDYsNiArNDcsOCBAQAogdXNpbmcgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjayA9CiAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMTo6SVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIFYyXzJfSVNvdW5kVHJpZ2dlckh3ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8yOjpJU291bmRUcmlnZ2VySHc7CiAKIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEhpZGwgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKQEAgLTkyLDYgKzk1LDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgIC8vIElTb3VuZFRyaWdnZXJId0NhbGxiYWNrCiAgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlY29nbml0aW9uQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CkBAIC0xODIsNiArMTkzLDcgQEAKICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gZ2V0U2VydmljZSgpOwogICAgICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8xKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOworICAgICAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiByZW1vdmVNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKaW5kZXggYzA4MzE5NS4uMDE4M2VjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaApAQCAtNzEsNiArNzEsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKSA9IDA7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKwogcHJvdGVjdGVkOgogICAgICAgICBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzg4MTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi17Ci0gICAgcmV0dXJuIG5ldyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kobW9kdWxlTmFtZSk7Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6U291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi0gICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIGlmIChtTW9kdWxlTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1Nb2R1bGVOYW1lID0gInByaW1hcnkiOwotICAgIH0KLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsICZtb2QpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHNvdW5kIHRyaWdnZXIgbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJjID0gc291bmRfdHJpZ2dlcl9od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIGluICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wIHx8Ci0gICAgICAgICAgICBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID4gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgewotICAgICAgICBBTE9HRSgid3Jvbmcgc291bmQgdHJpZ2dlciBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6flNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX2Nsb3NlKG1Id0RldmljZSk7Ci0gICAgfQotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRfcHJvcGVydGllcyhtSHdEZXZpY2UsIHByb3BlcnRpZXMpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojpsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBzb3VuZF9tb2RlbCwgY2FsbGJhY2ssIGNvb2tpZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0YXJ0X3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlLCBjb25maWcsIGNhbGxiYWNrLCBjb29raWUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BBbGxSZWNvZ25pdGlvbnMoKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xICYmCi0gICAgIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucyhtSHdEZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ4OGRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLQotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFNvdW5kVHJpZ2dlckhhbExlZ2FjeSA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UKLQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKTsKLQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIExvYWQgYSBzb3VuZCBtb2RlbC4gT25jZSBsb2FkZWQsIHJlY29nbml0aW9uIG9mIHRoaXMgbW9kZWwgY2FuIGJlIHN0YXJ0ZWQgYW5kIHN0b3BwZWQuCi0gICAgICAgICAqIE9ubHkgb25lIGFjdGl2ZSByZWNvZ25pdGlvbiBwZXIgbW9kZWwgYXQgYSB0aW1lLiBUaGUgU291bmRUcmlnZ2VyIHNlcnZpY2Ugd2lsbCBoYW5kbGUKLSAgICAgICAgICogY29uY3VycmVudCByZWNvZ25pdGlvbiByZXF1ZXN0cyBieSBkaWZmZXJlbnQgdXNlcnMvYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIHVuaXF1ZSBoYW5kbGUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMgKHVubG9hZF9zb3VuZF9tb2RlbCgpLAotICAgICAgICAgKiBzdGFydF9yZWNvZ25pdGlvbigpLCBldGMuLi4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmxvYWQgYSBzb3VuZCBtb2RlbC4gQSBzb3VuZCBtb2RlbCBjYW4gYmUgdW5sb2FkZWQgdG8gbWFrZSByb29tIGZvciBhIG5ldyBvbmUgdG8gb3ZlcmNvbWUKLSAgICAgICAgICogaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RhcnQgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4gT25seSBvbmUgcmVjb2duaXRpb24gYWN0aXZlIGF0IGEgdGltZSBwZXIgbW9kZWwuCi0gICAgICAgICAqIE9uY2UgcmVjb2duaXRpb24gc3VjY2VlZHMgb2YgZmFpbHMsIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQuCi0gICAgICAgICAqIFRPRE86IGdyb3VwIHJlY29nbml0aW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIG9uZSBzdHJ1Y3QgYW5kIGFkZCBrZXkgcGhyYXNlIG9wdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSB0byBjYWxsIHRoZSBjYWxsYmFjayB3aGVuIHN0b3BwZWQgdmlhIHRoaXMgbWV0aG9kLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhbGwgbW9kZWxzLgotICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgb3IgYWJvdmUuCi0gICAgICAgICAqIElmIG5vIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLCBzdG9wX3JlY29nbml0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJ1bm5pbmcgbW9kZWwuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotCi1wcml2YXRlOgotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICAgICAgZXhwbGljaXQgU291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUgPSBOVUxMKTsKLQotICAgICAgICBjb25zdCBjaGFyICptTW9kdWxlTmFtZTsKLSAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiAgICAgICAgbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGE3ZDZlODMuLmZlMmNjZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yNywyMCArMjcsMTYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgotI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAotI2lmZGVmIFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi0jZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInN0dWIiCi0jZWxzZQogI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJwcmltYXJ5IgotI2VuZGlmCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKQEAgLTU2MiwxMCArNTU4LDcgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBtb2RlbE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImxvYWRTb3VuZE1vZGVsKCkgbW9kZWxNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICopbW9kZWxNZW1vcnktPnBvaW50ZXIoKTsKIApAQCAtNjU5LDExICs2NTIsNiBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChkYXRhTWVtb3J5ID09IDAgfHwgZGF0YU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UmVjb2duaXRpb24oKSBkYXRhTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICB9CiAKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZyA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICopZGF0YU1lbW9yeS0+cG9pbnRlcigpOwpAQCAtNzI1LDYgKzcxMywyNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJnZXRNb2RlbFN0YXRlKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtSGFsSW50ZXJmYWNlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCiB7CiAgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKQEAgLTk2Niw2ICs5NzMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KG1vZGVsTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC05OTcsNiArMTAwNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkoZGF0YU1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtMTAyMCw2ICsxMDMzLDIxIEBACiAgICAgcmV0dXJuIG1vZHVsZS0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbW9kdWxlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQogewogICAgIEFMT0dWKCJNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA3MDhmYzk4Li40MjU4ZWMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gaGFsSW50ZXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbUhhbEludGVyZmFjZTsgfQogICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQpAQCAtMTY5LDYgKzE3MCw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI1MzMyYTQuLmY1YjRiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBVTkxPQURfU09VTkRfTU9ERUwsCiAgICAgU1RBUlRfUkVDT0dOSVRJT04sCiAgICAgU1RPUF9SRUNPR05JVElPTiwKKyAgICBHRVRfTU9ERUxfU1RBVEUsCiB9OwogCiBjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+CkBAIC0xMTMsNiArMTE0LDE4IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTU9ERUxfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOwpAQCAtMTY5LDYgKzE4MiwxNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9NT0RFTF9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0TW9kZWxTdGF0ZShoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAppbmRleCAyODliN2IxLi5kMWViMzY3IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMTg4LDYgKzE4OCwxNSBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiB2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKIHsK